Diff
BOOLEAN
.
.
before
STRING
.
after
STRING
.
difference
HASH
.
{/metadocument}
*/
Function Diff($before, $after, &$difference)
{
$mode = (IsSet($difference->mode) ? $difference->mode : 'c');
switch($mode)
{
case 'c':
$lb = strlen($before);
$la = strlen($after);
break;
case 'w':
$before = $this->SplitString($before, " \t", "\r\n", $posb);
$lb = count($before);
$after = $this->SplitString($after, " \t", "\r\n", $posa);
$la = count($after);
break;
case 'l':
$before = $this->SplitString($before, "\r\n", '', $posb);
$lb = count($before);
$after = $this->SplitString($after, "\r\n", '', $posa);
$la = count($after);
break;
default:
$this->error = $mode.' is not a supported more for getting the text differences';
return false;
}
$diff = array();
for($b = $a = 0; $b < $lb && $a < $la;)
{
for($pb = $b; $a < $la && $pb < $lb && $after[$a] === $before[$pb]; ++$a, ++$pb);
if($pb !== $b)
{
$diff[] = array(
'change'=>'=',
'position'=>($mode === 'c' ? $b : $posb[$b]),
'length'=>($mode === 'c' ? $pb - $b : $posb[$pb] - $posb[$b])
);
$b = $pb;
}
if($b === $lb)
break;
for($pb = $b; $pb < $lb; ++$pb)
{
for($pa = $a ; $pa < $la && $after[$pa] !== $before[$pb]; ++$pa);
if($pa !== $la)
break;
}
if($pb !== $b)
{
$diff[] = array(
'change'=>'-',
'position'=>($mode === 'c' ? $b : $posb[$b]),
'length'=>($mode === 'c' ? $pb - $b : $posb[$pb] - $posb[$b])
);
$b = $pb;
}
if($pa !== $a)
{
$diff[] = array(
'change'=>'+',
'position'=>($mode === 'c' ? $a : $posa[$a]),
'length'=>($mode === 'c' ? $pa - $a : $posa[$pa] - $posa[$a])
);
$a = $pa;
}
}
if($a < $la)
{
$diff[] = array(
'change'=>'+',
'position'=>($mode === 'c' ? $a : $posa[$a]),
'length'=>($mode === 'c' ? $la - $a : $posa[$la] - $posa[$a])
);
}
$difference->difference = $diff;
return true;
}
/*
{metadocument}