/** | |
* Class used internally by Diff to actually compute the diffs. | |
* | |
* This class uses the xdiff PECL package (http://pecl.php.net/package/xdiff) | |
* to compute the differences between the two input arrays. | |
* | |
* Copyright 2004-2010 The Horde Project (http://www.horde.org/) | |
* | |
* See the enclosed file COPYING for license information (LGPL). If you did | |
* not receive this file, see https://opensource.org/license/lgpl-2-1/. | |
* | |
* @author Jon Parise <jon@horde.org> | |
* @package Text_Diff | |
*/ | |
class Text_Diff_Engine_xdiff { | |
/** | |
*/ | |
function diff($from_lines, $to_lines) | |
{ | |
array_walk($from_lines, array('Text_Diff', 'trimNewlines')); | |
array_walk($to_lines, array('Text_Diff', 'trimNewlines')); | |
/* Convert the two input arrays into strings for xdiff processing. */ | |
$from_string = implode("\n", $from_lines); | |
$to_string = implode("\n", $to_lines); | |
/* Diff the two strings and convert the result to an array. */ | |
$diff = xdiff_string_diff($from_string, $to_string, count($to_lines)); | |
$diff = explode("\n", $diff); | |
/* Walk through the diff one line at a time. We build the $edits | |
* array of diff operations by reading the first character of the | |
* xdiff output (which is in the "unified diff" format). | |
* | |
* Note that we don't have enough information to detect "changed" | |
* lines using this approach, so we can't add Text_Diff_Op_changed | |
* instances to the $edits array. The result is still perfectly | |
* valid, albeit a little less descriptive and efficient. */ | |
$edits = array(); | |
foreach ($diff as $line) { | |
if (!strlen($line)) { | |
continue; | |
} | |
switch ($line[0]) { | |
case ' ': | |
$edits[] = new Text_Diff_Op_copy(array(substr($line, 1))); | |
break; | |
case '+': | |
$edits[] = new Text_Diff_Op_add(array(substr($line, 1))); | |
break; | |
case '-': | |
$edits[] = new Text_Diff_Op_delete(array(substr($line, 1))); | |
break; | |
} | |
} | |
return $edits; | |
} | |
} | |