public addContext ( |
||
$patch | The patch to grow. | |
$text | string | Source text. |
public function addContext(PatchObject $patch, $text)
{
if (!mb_strlen($text)) {
return;
}
$padding = 0;
$pattern = mb_substr($text, $patch->getStart1(), $patch->getLength1());
// Look for the first and last matches of pattern in text.
// If two different matches are found, increase the pattern length.
$match = $this->getMatch();
while ((!$pattern || mb_strpos($text, $pattern) !== mb_strrpos($text, $pattern)) && ($match->getMaxBits() == 0 || mb_strlen($pattern) < $match->getMaxBits() - 2 * $this->getMargin())) {
$padding += $this->getMargin();
$pattern = mb_substr($text, max(0, $patch->getStart2() - $padding), $patch->getStart2() + $patch->getLength1() + $padding - max(0, $patch->getStart2() - $padding));
}
// Add one chunk for good luck.
$padding += $this->getMargin();
// Add the prefix.
$prefix = mb_substr($text, max(0, $patch->getStart2() - $padding), min($patch->getStart2(), $padding));
if ($prefix != '') {
$patch->prependChanges(array(Diff::EQUAL, $prefix));
}
// Add the suffix.
$suffix = mb_substr($text, $patch->getStart2() + $patch->getLength1(), $padding);
if ($suffix != '') {
$patch->appendChanges(array(Diff::EQUAL, $suffix));
}
// Roll back the start points.
$prefixLen = mb_strlen($prefix);
$patch->setStart1($patch->getStart1() - $prefixLen);
$patch->setStart2($patch->getStart2() - $prefixLen);
// Extend lengths.
$suffixLen = mb_strlen($suffix);
$patch->setLength1($patch->getLength1() + $prefixLen + $suffixLen);
$patch->setLength2($patch->getLength2() + $prefixLen + $suffixLen);
}