protected function lineMode($text1, $text2, $deadline)
{
// Scan the text on a line-by-line basis first.
list($text1, $text2, $lineArray) = $this->getToolkit()->linesToChars($text1, $text2);
$diff = new Diff();
$diff->main($text1, $text2, false, $deadline);
$diffs = $diff->getChanges();
// Convert the diff back to original text.
$this->getToolkit()->charsToLines($diffs, $lineArray);
$diff->setChanges($diffs);
// Eliminate freak matches (e.g. blank lines)
$diff->cleanupSemantic();
$diffs = $diff->getChanges();
// Rediff any replacement blocks, this time character-by-character.
// Add a dummy entry at the end.
array_push($diffs, array(self::EQUAL, ''));
$pointer = 0;
$countDelete = 0;
$countInsert = 0;
$textDelete = '';
$textInsert = '';
while ($pointer < count($diffs)) {
switch ($diffs[$pointer][0]) {
case self::DELETE:
$countDelete++;
$textDelete .= $diffs[$pointer][1];
break;
case self::INSERT:
$countInsert++;
$textInsert .= $diffs[$pointer][1];
break;
case self::EQUAL:
// Upon reaching an equality, check for prior redundancies.
if ($countDelete > 0 && $countInsert > 0) {
// Delete the offending records and add the merged ones.
$subDiff = new Diff();
$subDiff->main($textDelete, $textInsert, false, $deadline);
array_splice($diffs, $pointer - $countDelete - $countInsert, $countDelete + $countInsert, $subDiff->getChanges());
$pointer = $pointer - $countDelete - $countInsert + count($subDiff->getChanges());
}
$countDelete = 0;
$countInsert = 0;
$textDelete = '';
$textInsert = '';
break;
}
$pointer++;
}
// Remove the dummy entry at the end.
array_pop($diffs);
return $diffs;
}