1 diff.inc | DiffEngine::diff($from_lines, $to_lines) |
Parameters
$from_lines:
$to_lines:
Return value
array:
File
- core/
includes/ diff.inc, line 164 - A PHP diff engine for phpwiki. (Taken from phpwiki-1.3.3)
Class
- DiffEngine
- Class used internally by Diff to actually compute the diffs.
Code
function diff($from_lines, $to_lines) {
// Diff and store locally
$this->diffLocal($from_lines, $to_lines);
// Merge edits when possible
$this->shiftBoundaries($from_lines, $this->xchanged, $this->ychanged);
$this->shiftBoundaries($to_lines, $this->ychanged, $this->xchanged);
// Compute the edit operations.
$n_from = count($from_lines);
$n_to = count($to_lines);
$edits = array();
$xi = $yi = 0;
while ($xi < $n_from || $yi < $n_to) {
assert($yi < $n_to || $this->xchanged[$xi]);
assert($xi < $n_from || $this->ychanged[$yi]);
// Skip matching "snake".
$copy = array();
while ($xi < $n_from && $yi < $n_to
&& !$this->xchanged[$xi] && !$this->ychanged[$yi]
) {
$copy[] = $from_lines[$xi++];
++$yi;
}
if ($copy) {
$edits[] = new DiffOpCopy($copy);
}
// Find deletes & adds.
$delete = array();
while ($xi < $n_from && $this->xchanged[$xi]) {
$delete[] = $from_lines[$xi++];
}
$add = array();
while ($yi < $n_to && $this->ychanged[$yi]) {
$add[] = $to_lines[$yi++];
}
if ($delete && $add) {
$edits[] = new DiffOpChange($delete, $add);
}
elseif ($delete) {
$edits[] = new DiffOpDelete($delete);
}
elseif ($add) {
$edits[] = new DiffOpAdd($add);
}
}
return $edits;
}