Line 17 | Line 17 |
---|
}
/**
|
}
/**
|
* Code from pear.php.net, Text_Diff-0.2.1 (beta) package * http://pear.php.net/package/Text_Diff/
| * Code from pear.php.net, Text_Diff-1.1.0 package * http://pear.php.net/package/Text_Diff/ (native engine)
|
* * Modified by phpBB Group to meet our coding standards * and being able to integrate into phpBB *
|
* * Modified by phpBB Group to meet our coding standards * and being able to integrate into phpBB *
|
* Class used internally by Diff to actually compute the diffs. This class is * implemented using native PHP code.
| * Class used internally by Text_Diff to actually compute the diffs. This * class is implemented using native PHP code.
|
* * The algorithm used here is mostly lifted from the perl module * Algorithm::Diff (version 1.06) by Ned Konz, which is available at: * http://www.perl.com/CPAN/authors/id/N/NE/NEDKONZ/Algorithm-Diff-1.06.zip *
|
* * The algorithm used here is mostly lifted from the perl module * Algorithm::Diff (version 1.06) by Ned Konz, which is available at: * http://www.perl.com/CPAN/authors/id/N/NE/NEDKONZ/Algorithm-Diff-1.06.zip *
|
* More ideas are taken from: * http://www.ics.uci.edu/~eppstein/161/960229.html
| * More ideas are taken from: http://www.ics.uci.edu/~eppstein/161/960229.html
|
* * Some ideas (and a bit of code) are taken from analyze.c, of GNU * diffutils-2.7, which can be found at:
| * * Some ideas (and a bit of code) are taken from analyze.c, of GNU * diffutils-2.7, which can be found at:
|
Line 40 | Line 39 |
---|
* Some ideas (subdivision by NCHUNKS > 2, and some optimizations) are from * Geoffrey T. Dairiki <[email protected]>. The original PHP version of this * code was written by him, and is used/adapted with his permission.
|
* Some ideas (subdivision by NCHUNKS > 2, and some optimizations) are from * Geoffrey T. Dairiki <[email protected]>. The original PHP version of this * code was written by him, and is used/adapted with his permission.
|
| * * Copyright 2004-2008 The Horde Project (http://www.horde.org/)
|
* * @author Geoffrey T. Dairiki <[email protected]> * @package diff
| * * @author Geoffrey T. Dairiki <[email protected]> * @package diff
|
Line 48 | Line 49 |
---|
*/ class diff_engine {
|
*/ class diff_engine {
|
| /** * If set to true we trim all lines before we compare them. This ensures that sole space/tab changes do not trigger diffs. */ var $skip_whitespace_changes = true;
|
function diff(&$from_lines, &$to_lines, $preserve_cr = true) { // Remove empty lines...
| function diff(&$from_lines, &$to_lines, $preserve_cr = true) { // Remove empty lines...
|
Line 84 | Line 90 |
---|
// Skip leading common lines. for ($skip = 0; $skip < $n_from && $skip < $n_to; $skip++) {
|
// Skip leading common lines. for ($skip = 0; $skip < $n_from && $skip < $n_to; $skip++) {
|
if ($from_lines[$skip] !== $to_lines[$skip])
| if (trim($from_lines[$skip]) !== trim($to_lines[$skip]))
|
{ break; }
| { break; }
|
Line 97 | Line 103 |
---|
for ($endskip = 0; --$xi > $skip && --$yi > $skip; $endskip++) {
|
for ($endskip = 0; --$xi > $skip && --$yi > $skip; $endskip++) {
|
if ($from_lines[$xi] !== $to_lines[$yi])
| if (trim($from_lines[$xi]) !== trim($to_lines[$yi]))
|
{ break; }
| { break; }
|
Line 107 | Line 113 |
---|
// Ignore lines which do not exist in both files. for ($xi = $skip; $xi < $n_from - $endskip; $xi++) {
|
// Ignore lines which do not exist in both files. for ($xi = $skip; $xi < $n_from - $endskip; $xi++) {
|
$xhash[$from_lines[$xi]] = 1;
| if ($this->skip_whitespace_changes) $xhash[trim($from_lines[$xi])] = 1; else $xhash[$from_lines[$xi]] = 1;
|
}
for ($yi = $skip; $yi < $n_to - $endskip; $yi++) {
|
}
for ($yi = $skip; $yi < $n_to - $endskip; $yi++) {
|
$line = $to_lines[$yi];
| $line = ($this->skip_whitespace_changes) ? trim($to_lines[$yi]) : $to_lines[$yi];
|
if (($this->ychanged[$yi] = empty($xhash[$line]))) {
| if (($this->ychanged[$yi] = empty($xhash[$line]))) {
|
Line 125 | Line 131 |
---|
for ($xi = $skip; $xi < $n_from - $endskip; $xi++) {
|
for ($xi = $skip; $xi < $n_from - $endskip; $xi++) {
|
$line = $from_lines[$xi];
| $line = ($this->skip_whitespace_changes) ? trim($from_lines[$xi]) : $from_lines[$xi];
|
if (($this->xchanged[$xi] = empty($yhash[$line]))) {
| if (($this->xchanged[$xi] = empty($yhash[$line]))) {
|
Line 139 | Line 145 |
---|
$this->_compareseq(0, sizeof($this->xv), 0, sizeof($this->yv));
// Merge edits when possible.
|
$this->_compareseq(0, sizeof($this->xv), 0, sizeof($this->yv));
// Merge edits when possible.
|
| if ($this->skip_whitespace_changes) { $from_lines_clean = array_map('trim', $from_lines); $to_lines_clean = array_map('trim', $to_lines);
$this->_shift_boundaries($from_lines_clean, $this->xchanged, $this->ychanged); $this->_shift_boundaries($to_lines_clean, $this->ychanged, $this->xchanged);
unset($from_lines_clean, $to_lines_clean); } else {
|
$this->_shift_boundaries($from_lines, $this->xchanged, $this->ychanged); $this->_shift_boundaries($to_lines, $this->ychanged, $this->xchanged);
|
$this->_shift_boundaries($from_lines, $this->xchanged, $this->ychanged); $this->_shift_boundaries($to_lines, $this->ychanged, $this->xchanged);
|
| }
|
// Compute the edit operations. $edits = array();
| // Compute the edit operations. $edits = array();
|
Line 159 | Line 178 |
---|
if ($copy) {
|
if ($copy) {
|
$edits[] = &new diff_op_copy($copy);
| $edits[] = new diff_op_copy($copy);
|
}
// Find deletes & adds.
| }
// Find deletes & adds.
|
Line 177 | Line 196 |
---|
if ($delete && $add) {
|
if ($delete && $add) {
|
$edits[] = &new diff_op_change($delete, $add);
| $edits[] = new diff_op_change($delete, $add);
|
} else if ($delete) {
|
} else if ($delete) {
|
$edits[] = &new diff_op_delete($delete);
| $edits[] = new diff_op_delete($delete);
|
} else if ($add) {
|
} else if ($add) {
|
$edits[] = &new diff_op_add($add);
| $edits[] = new diff_op_add($add);
|
} }
| } }
|
Line 251 | Line 270 |
---|
} }
|
} }
|
$x1 = $xoff + (int)(($numer + ($xlim-$xoff)*$chunk) / $nchunks);
| $x1 = $xoff + (int)(($numer + ($xlim - $xoff) * $chunk) / $nchunks);
|
for (; $x < $x1; $x++) {
| for (; $x < $x1; $x++) {
|
Line 262 | Line 281 |
---|
} $matches = $ymatches[$line];
|
} $matches = $ymatches[$line];
|
foreach ($matches as $y)
| reset($matches); while (list(, $y) = each($matches))
|
{ if (empty($this->in_seq[$y])) {
| { if (empty($this->in_seq[$y])) {
|
Line 273 | Line 293 |
---|
}
// no reset() here
|
}
// no reset() here
|
while (list($junk, $y) = each($matches))
| while (list(, $y) = each($matches))
|
{ if ($y > $this->seq[$k - 1]) {
| { if ($y > $this->seq[$k - 1]) {
|