mirror of
https://github.com/gosticks/wordpress-develop.git
synced 2026-06-28 14:20:15 +00:00
Code is Poetry.
WordPress' code just... wasn't. This is now dealt with. Props jrf, pento, netweb, GaryJ, jdgrimes, westonruter, Greg Sherwood from PHPCS, and everyone who's ever contributed to WPCS and PHPCS. Fixes #41057. git-svn-id: https://develop.svn.wordpress.org/trunk@42343 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
@@ -20,7 +20,7 @@ class WP_Text_Diff_Renderer_Table extends Text_Diff_Renderer {
|
||||
* @var int
|
||||
* @since 2.6.0
|
||||
*/
|
||||
public $_leading_context_lines = 10000;
|
||||
public $_leading_context_lines = 10000;
|
||||
|
||||
/**
|
||||
* @see Text_Diff_Renderer::_trailing_context_lines
|
||||
@@ -66,8 +66,9 @@ class WP_Text_Diff_Renderer_Table extends Text_Diff_Renderer {
|
||||
*/
|
||||
public function __construct( $params = array() ) {
|
||||
parent::__construct( $params );
|
||||
if ( isset( $params[ 'show_split_view' ] ) )
|
||||
$this->_show_split_view = $params[ 'show_split_view' ];
|
||||
if ( isset( $params['show_split_view'] ) ) {
|
||||
$this->_show_split_view = $params['show_split_view'];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -86,7 +87,7 @@ class WP_Text_Diff_Renderer_Table extends Text_Diff_Renderer {
|
||||
* @param array $lines
|
||||
* @param string $prefix
|
||||
*/
|
||||
public function _lines( $lines, $prefix=' ' ) {
|
||||
public function _lines( $lines, $prefix = ' ' ) {
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -138,7 +139,7 @@ class WP_Text_Diff_Renderer_Table extends Text_Diff_Renderer {
|
||||
*/
|
||||
public function _added( $lines, $encode = true ) {
|
||||
$r = '';
|
||||
foreach ($lines as $line) {
|
||||
foreach ( $lines as $line ) {
|
||||
if ( $encode ) {
|
||||
$processed_line = htmlspecialchars( $line );
|
||||
|
||||
@@ -153,7 +154,7 @@ class WP_Text_Diff_Renderer_Table extends Text_Diff_Renderer {
|
||||
*
|
||||
* @param String $processed_line The processed diffed line.
|
||||
* @param String $line The unprocessed diffed line.
|
||||
* @param string null The line context. Values are 'added', 'deleted' or 'unchanged'.
|
||||
* @param string null The line context. Values are 'added', 'deleted' or 'unchanged'.
|
||||
*/
|
||||
$line = apply_filters( 'process_text_diff_html', $processed_line, $line, 'added' );
|
||||
}
|
||||
@@ -176,7 +177,7 @@ class WP_Text_Diff_Renderer_Table extends Text_Diff_Renderer {
|
||||
*/
|
||||
public function _deleted( $lines, $encode = true ) {
|
||||
$r = '';
|
||||
foreach ($lines as $line) {
|
||||
foreach ( $lines as $line ) {
|
||||
if ( $encode ) {
|
||||
$processed_line = htmlspecialchars( $line );
|
||||
|
||||
@@ -188,7 +189,6 @@ class WP_Text_Diff_Renderer_Table extends Text_Diff_Renderer {
|
||||
} else {
|
||||
$r .= '<tr>' . $this->deletedLine( $line ) . "</tr>\n";
|
||||
}
|
||||
|
||||
}
|
||||
return $r;
|
||||
}
|
||||
@@ -202,15 +202,15 @@ class WP_Text_Diff_Renderer_Table extends Text_Diff_Renderer {
|
||||
*/
|
||||
public function _context( $lines, $encode = true ) {
|
||||
$r = '';
|
||||
foreach ($lines as $line) {
|
||||
foreach ( $lines as $line ) {
|
||||
if ( $encode ) {
|
||||
$processed_line = htmlspecialchars( $line );
|
||||
|
||||
/** This filter is documented in wp-includes/wp-diff.php */
|
||||
$line = apply_filters( 'process_text_diff_html', $processed_line, $line, 'unchanged' );
|
||||
}
|
||||
if ( $this->_show_split_view ) {
|
||||
$r .= '<tr>' . $this->contextLine( $line ) . $this->emptyLine() . $this->contextLine( $line ) . "</tr>\n";
|
||||
if ( $this->_show_split_view ) {
|
||||
$r .= '<tr>' . $this->contextLine( $line ) . $this->emptyLine() . $this->contextLine( $line ) . "</tr>\n";
|
||||
} else {
|
||||
$r .= '<tr>' . $this->contextLine( $line ) . "</tr>\n";
|
||||
}
|
||||
@@ -248,58 +248,62 @@ class WP_Text_Diff_Renderer_Table extends Text_Diff_Renderer {
|
||||
|
||||
// Compute word diffs for each matched pair using the inline diff
|
||||
foreach ( $orig_matches as $o => $f ) {
|
||||
if ( is_numeric($o) && is_numeric($f) ) {
|
||||
$text_diff = new Text_Diff( 'auto', array( array($orig[$o]), array($final[$f]) ) );
|
||||
$renderer = new $this->inline_diff_renderer;
|
||||
$diff = $renderer->render( $text_diff );
|
||||
if ( is_numeric( $o ) && is_numeric( $f ) ) {
|
||||
$text_diff = new Text_Diff( 'auto', array( array( $orig[ $o ] ), array( $final[ $f ] ) ) );
|
||||
$renderer = new $this->inline_diff_renderer;
|
||||
$diff = $renderer->render( $text_diff );
|
||||
|
||||
// If they're too different, don't include any <ins> or <dels>
|
||||
if ( preg_match_all( '!(<ins>.*?</ins>|<del>.*?</del>)!', $diff, $diff_matches ) ) {
|
||||
// length of all text between <ins> or <del>
|
||||
$stripped_matches = strlen(strip_tags( join(' ', $diff_matches[0]) ));
|
||||
$stripped_matches = strlen( strip_tags( join( ' ', $diff_matches[0] ) ) );
|
||||
// since we count lengith of text between <ins> or <del> (instead of picking just one),
|
||||
// we double the length of chars not in those tags.
|
||||
$stripped_diff = strlen(strip_tags( $diff )) * 2 - $stripped_matches;
|
||||
$diff_ratio = $stripped_matches / $stripped_diff;
|
||||
if ( $diff_ratio > $this->_diff_threshold )
|
||||
$stripped_diff = strlen( strip_tags( $diff ) ) * 2 - $stripped_matches;
|
||||
$diff_ratio = $stripped_matches / $stripped_diff;
|
||||
if ( $diff_ratio > $this->_diff_threshold ) {
|
||||
continue; // Too different. Don't save diffs.
|
||||
}
|
||||
}
|
||||
|
||||
// Un-inline the diffs by removing del or ins
|
||||
$orig_diffs[$o] = preg_replace( '|<ins>.*?</ins>|', '', $diff );
|
||||
$final_diffs[$f] = preg_replace( '|<del>.*?</del>|', '', $diff );
|
||||
$orig_diffs[ $o ] = preg_replace( '|<ins>.*?</ins>|', '', $diff );
|
||||
$final_diffs[ $f ] = preg_replace( '|<del>.*?</del>|', '', $diff );
|
||||
}
|
||||
}
|
||||
|
||||
foreach ( array_keys($orig_rows) as $row ) {
|
||||
foreach ( array_keys( $orig_rows ) as $row ) {
|
||||
// Both columns have blanks. Ignore them.
|
||||
if ( $orig_rows[$row] < 0 && $final_rows[$row] < 0 )
|
||||
if ( $orig_rows[ $row ] < 0 && $final_rows[ $row ] < 0 ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// If we have a word based diff, use it. Otherwise, use the normal line.
|
||||
if ( isset( $orig_diffs[$orig_rows[$row]] ) )
|
||||
$orig_line = $orig_diffs[$orig_rows[$row]];
|
||||
elseif ( isset( $orig[$orig_rows[$row]] ) )
|
||||
$orig_line = htmlspecialchars($orig[$orig_rows[$row]]);
|
||||
else
|
||||
if ( isset( $orig_diffs[ $orig_rows[ $row ] ] ) ) {
|
||||
$orig_line = $orig_diffs[ $orig_rows[ $row ] ];
|
||||
} elseif ( isset( $orig[ $orig_rows[ $row ] ] ) ) {
|
||||
$orig_line = htmlspecialchars( $orig[ $orig_rows[ $row ] ] );
|
||||
} else {
|
||||
$orig_line = '';
|
||||
}
|
||||
|
||||
if ( isset( $final_diffs[$final_rows[$row]] ) )
|
||||
$final_line = $final_diffs[$final_rows[$row]];
|
||||
elseif ( isset( $final[$final_rows[$row]] ) )
|
||||
$final_line = htmlspecialchars($final[$final_rows[$row]]);
|
||||
else
|
||||
if ( isset( $final_diffs[ $final_rows[ $row ] ] ) ) {
|
||||
$final_line = $final_diffs[ $final_rows[ $row ] ];
|
||||
} elseif ( isset( $final[ $final_rows[ $row ] ] ) ) {
|
||||
$final_line = htmlspecialchars( $final[ $final_rows[ $row ] ] );
|
||||
} else {
|
||||
$final_line = '';
|
||||
}
|
||||
|
||||
if ( $orig_rows[$row] < 0 ) { // Orig is blank. This is really an added row.
|
||||
$r .= $this->_added( array($final_line), false );
|
||||
} elseif ( $final_rows[$row] < 0 ) { // Final is blank. This is really a deleted row.
|
||||
$r .= $this->_deleted( array($orig_line), false );
|
||||
if ( $orig_rows[ $row ] < 0 ) { // Orig is blank. This is really an added row.
|
||||
$r .= $this->_added( array( $final_line ), false );
|
||||
} elseif ( $final_rows[ $row ] < 0 ) { // Final is blank. This is really a deleted row.
|
||||
$r .= $this->_deleted( array( $orig_line ), false );
|
||||
} else { // A true changed row.
|
||||
if ( $this->_show_split_view ) {
|
||||
$r .= '<tr>' . $this->deletedLine( $orig_line ) . $this->emptyLine() . $this->addedLine( $final_line ) . "</tr>\n";
|
||||
} else {
|
||||
$r .= '<tr>' . $this->deletedLine( $orig_line ) . "</tr><tr>" . $this->addedLine( $final_line ) . "</tr>\n";
|
||||
$r .= '<tr>' . $this->deletedLine( $orig_line ) . '</tr><tr>' . $this->addedLine( $final_line ) . "</tr>\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -339,80 +343,85 @@ class WP_Text_Diff_Renderer_Table extends Text_Diff_Renderer {
|
||||
|
||||
// Contains all pairwise string comparisons. Keys are such that this need only be a one dimensional array.
|
||||
$matches = array();
|
||||
foreach ( array_keys($orig) as $o ) {
|
||||
foreach ( array_keys($final) as $f ) {
|
||||
$matches["$o,$f"] = $this->compute_string_distance( $orig[$o], $final[$f] );
|
||||
foreach ( array_keys( $orig ) as $o ) {
|
||||
foreach ( array_keys( $final ) as $f ) {
|
||||
$matches[ "$o,$f" ] = $this->compute_string_distance( $orig[ $o ], $final[ $f ] );
|
||||
}
|
||||
}
|
||||
asort($matches); // Order by string distance.
|
||||
asort( $matches ); // Order by string distance.
|
||||
|
||||
$orig_matches = array();
|
||||
$final_matches = array();
|
||||
|
||||
foreach ( $matches as $keys => $difference ) {
|
||||
list($o, $f) = explode(',', $keys);
|
||||
$o = (int) $o;
|
||||
$f = (int) $f;
|
||||
list($o, $f) = explode( ',', $keys );
|
||||
$o = (int) $o;
|
||||
$f = (int) $f;
|
||||
|
||||
// Already have better matches for these guys
|
||||
if ( isset($orig_matches[$o]) && isset($final_matches[$f]) )
|
||||
if ( isset( $orig_matches[ $o ] ) && isset( $final_matches[ $f ] ) ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// First match for these guys. Must be best match
|
||||
if ( !isset($orig_matches[$o]) && !isset($final_matches[$f]) ) {
|
||||
$orig_matches[$o] = $f;
|
||||
$final_matches[$f] = $o;
|
||||
if ( ! isset( $orig_matches[ $o ] ) && ! isset( $final_matches[ $f ] ) ) {
|
||||
$orig_matches[ $o ] = $f;
|
||||
$final_matches[ $f ] = $o;
|
||||
continue;
|
||||
}
|
||||
|
||||
// Best match of this final is already taken? Must mean this final is a new row.
|
||||
if ( isset($orig_matches[$o]) )
|
||||
$final_matches[$f] = 'x';
|
||||
|
||||
// Best match of this orig is already taken? Must mean this orig is a deleted row.
|
||||
elseif ( isset($final_matches[$f]) )
|
||||
$orig_matches[$o] = 'x';
|
||||
if ( isset( $orig_matches[ $o ] ) ) {
|
||||
$final_matches[ $f ] = 'x';
|
||||
} // Best match of this orig is already taken? Must mean this orig is a deleted row.
|
||||
elseif ( isset( $final_matches[ $f ] ) ) {
|
||||
$orig_matches[ $o ] = 'x';
|
||||
}
|
||||
}
|
||||
|
||||
// We read the text in this order
|
||||
ksort($orig_matches);
|
||||
ksort($final_matches);
|
||||
ksort( $orig_matches );
|
||||
ksort( $final_matches );
|
||||
|
||||
// Stores rows and blanks for each column.
|
||||
$orig_rows = $orig_rows_copy = array_keys($orig_matches);
|
||||
$final_rows = array_keys($final_matches);
|
||||
$orig_rows = $orig_rows_copy = array_keys( $orig_matches );
|
||||
$final_rows = array_keys( $final_matches );
|
||||
|
||||
// Interleaves rows with blanks to keep matches aligned.
|
||||
// We may end up with some extraneous blank rows, but we'll just ignore them later.
|
||||
foreach ( $orig_rows_copy as $orig_row ) {
|
||||
$final_pos = array_search($orig_matches[$orig_row], $final_rows, true);
|
||||
$orig_pos = (int) array_search($orig_row, $orig_rows, true);
|
||||
$final_pos = array_search( $orig_matches[ $orig_row ], $final_rows, true );
|
||||
$orig_pos = (int) array_search( $orig_row, $orig_rows, true );
|
||||
|
||||
if ( false === $final_pos ) { // This orig is paired with a blank final.
|
||||
array_splice( $final_rows, $orig_pos, 0, -1 );
|
||||
} elseif ( $final_pos < $orig_pos ) { // This orig's match is up a ways. Pad final with blank rows.
|
||||
$diff_pos = $final_pos - $orig_pos;
|
||||
while ( $diff_pos < 0 )
|
||||
while ( $diff_pos < 0 ) {
|
||||
array_splice( $final_rows, $orig_pos, 0, $diff_pos++ );
|
||||
}
|
||||
} elseif ( $final_pos > $orig_pos ) { // This orig's match is down a ways. Pad orig with blank rows.
|
||||
$diff_pos = $orig_pos - $final_pos;
|
||||
while ( $diff_pos < 0 )
|
||||
while ( $diff_pos < 0 ) {
|
||||
array_splice( $orig_rows, $orig_pos, 0, $diff_pos++ );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Pad the ends with blank rows if the columns aren't the same length
|
||||
$diff_count = count($orig_rows) - count($final_rows);
|
||||
$diff_count = count( $orig_rows ) - count( $final_rows );
|
||||
if ( $diff_count < 0 ) {
|
||||
while ( $diff_count < 0 )
|
||||
array_push($orig_rows, $diff_count++);
|
||||
while ( $diff_count < 0 ) {
|
||||
array_push( $orig_rows, $diff_count++ );
|
||||
}
|
||||
} elseif ( $diff_count > 0 ) {
|
||||
$diff_count = -1 * $diff_count;
|
||||
while ( $diff_count < 0 )
|
||||
array_push($final_rows, $diff_count++);
|
||||
while ( $diff_count < 0 ) {
|
||||
array_push( $final_rows, $diff_count++ );
|
||||
}
|
||||
}
|
||||
|
||||
return array($orig_matches, $final_matches, $orig_rows, $final_rows);
|
||||
return array( $orig_matches, $final_matches, $orig_rows, $final_rows );
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -426,18 +435,19 @@ class WP_Text_Diff_Renderer_Table extends Text_Diff_Renderer {
|
||||
*/
|
||||
public function compute_string_distance( $string1, $string2 ) {
|
||||
// Vectors containing character frequency for all chars in each string
|
||||
$chars1 = count_chars($string1);
|
||||
$chars2 = count_chars($string2);
|
||||
$chars1 = count_chars( $string1 );
|
||||
$chars2 = count_chars( $string2 );
|
||||
|
||||
// L1-norm of difference vector.
|
||||
$difference = array_sum( array_map( array($this, 'difference'), $chars1, $chars2 ) );
|
||||
$difference = array_sum( array_map( array( $this, 'difference' ), $chars1, $chars2 ) );
|
||||
|
||||
// $string1 has zero length? Odd. Give huge penalty by not dividing.
|
||||
if ( !$string1 )
|
||||
if ( ! $string1 ) {
|
||||
return $difference;
|
||||
}
|
||||
|
||||
// Return distance per character (of string1).
|
||||
return $difference / strlen($string1);
|
||||
return $difference / strlen( $string1 );
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user