Commit ac235ef8 authored by catch's avatar catch

Issue #2043757 by dawehner, Alan D.: Remove drupal_(string) methods out of diffengine.

parent c49e5c80
......@@ -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;
}
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment