diff --git a/core/lib/Drupal/Component/Diff/DiffEngine.php b/core/lib/Drupal/Component/Diff/DiffEngine.php index 07d6d943c664f86b8c9172649b420a1d8710ab71..cead529c3ad2f9896baffc25679d95156c5ce6ed 100644 --- a/core/lib/Drupal/Component/Diff/DiffEngine.php +++ b/core/lib/Drupal/Component/Diff/DiffEngine.php @@ -8,9 +8,11 @@ * You may copy this code freely under the conditions of the GPL. */ -define('USE_ASSERTS', FALSE); - use Drupal\Component\Utility\Settings; +use Drupal\Component\Utility\String; +use Drupal\Component\Utility\Unicode; + +define('USE_ASSERTS', FALSE); /** * @todo document @@ -240,7 +242,7 @@ function diff($from_lines, $to_lines) { * Returns the whole line if it's small enough, or the MD5 hash otherwise. */ function _line_hash($line) { - if (drupal_strlen($line) > $this->MAX_XREF_LENGTH()) { + if (Unicode::strlen($line) > $this->MAX_XREF_LENGTH()) { return md5($line); } else { @@ -995,7 +997,7 @@ function addWords($words, $tag = '') { } if ($word[0] == "\n") { $this->_flushLine($tag); - $word = drupal_substr($word, 1); + $word = Unicode::substr($word, 1); } assert(!strstr($word, "\n")); $this->_group .= $word; @@ -1039,7 +1041,7 @@ function _split($lines) { $words[] = "\n"; $stripped[] = "\n"; } - if ( drupal_strlen( $line ) > $this->MAX_LINE_LENGTH() ) { + if ( Unicode::strlen( $line ) > $this->MAX_LINE_LENGTH() ) { $words[] = $line; $stripped[] = $line; } @@ -1222,140 +1224,3 @@ function _changed($orig, $closing) { } } } - -/** - * Drupal inline Diff formatter. - * @private - * @subpackage DifferenceEngine - */ -class DrupalDiffInline { - var $a; - var $b; - - /** - * Constructor. - */ - function __construct($a, $b) { - $this->a = $a; - $this->b = $b; - } - - /** - * Render differences inline using HTML markup. - */ - function render() { - $a = preg_split('/(<[^>]+?>| )/', $this->a, -1, PREG_SPLIT_DELIM_CAPTURE); - $b = preg_split('/(<[^>]+?>| )/', $this->b, -1, PREG_SPLIT_DELIM_CAPTURE); - $diff = new Diff($a, $b); - $diff->edits = $this->process_edits($diff->edits); - - // Assemble highlighted output - $output = ''; - foreach ($diff->edits as $chunk) { - switch ($chunk->type) { - case 'copy': - $output .= implode('', $chunk->closing); - break; - case 'delete': - foreach ($chunk->orig as $i => $piece) { - if (strpos($piece, '<') === 0 && drupal_substr($piece, drupal_strlen($piece) - 1) === '>') { - $output .= $piece; - } - else { - $diff_inline_chunk = array( - '#theme' => 'diff_inline_chunk', - '#text' => $piece, - '#type' => $chunk->type, - ); - $output .= drupal_render($diff_inline_chunk); - } - } - break; - default: - $chunk->closing = $this->process_chunk($chunk->closing); - foreach ($chunk->closing as $i => $piece) { - if ($piece === ' ' || (strpos($piece, '<') === 0 && drupal_substr($piece, drupal_strlen($piece) - 1) === '>' && drupal_strtolower(drupal_substr($piece, 1, 3)) != 'img')) { - $output .= $piece; - } - else { - $diff_inline_chunk = array( - '#theme' => 'diff_inline_chunk', - '#text' => $piece, - '#type' => $chunk->type, - ); - $output .= drupal_render($diff_inline_chunk); - } - } - break; - } - } - return $output; - } - - /** - * Merge chunk segments between tag delimiters. - */ - function process_chunk($chunk) { - $processed = array(); - $j = 0; - foreach ($chunk as $i => $piece) { - $next = isset($chunk[$i+1]) ? $chunk[$i+1] : NULL; - if (!isset($processed[$j])) { - $processed[$j] = ''; - } - if (strpos($piece, '<') === 0 && drupal_substr($piece, drupal_strlen($piece) - 1) === '>') { - $processed[$j] = $piece; - $j++; - } - elseif (isset($next) && strpos($next, '<') === 0 && drupal_substr($next, drupal_strlen($next) - 1) === '>') { - $processed[$j] .= $piece; - $j++; - } - else { - $processed[$j] .= $piece; - } - } - return $processed; - } - - /** - * Merge copy and equivalent edits into intelligible chunks. - */ - function process_edits($edits) { - $processed = array(); - $current = array_shift($edits); - - // Make two passes -- first merge space delimiter copies back into their originals. - while ($chunk = array_shift($edits)) { - if ($chunk->type == 'copy' && $chunk->orig === array(' ')) { - $current->orig = array_merge((array) $current->orig, (array) $chunk->orig); - $current->closing = array_merge((array) $current->closing, (array) $chunk->closing); - } - else { - $processed[] = $current; - $current = $chunk; - } - } - $processed[] = $current; - - // Initial setup - $edits = $processed; - $processed = array(); - $current = array_shift($edits); - - // Second, merge equivalent chunks into each other. - while ($chunk = array_shift($edits)) { - if ($current->type == $chunk->type) { - $current->orig = array_merge((array) $current->orig, (array) $chunk->orig); - $current->closing = array_merge((array) $current->closing, (array) $chunk->closing); - } - else { - $processed[] = $current; - $current = $chunk; - } - } - $processed[] = $current; - - return $processed; - } -}