Exemplo n.º 1
0
 /**
  * Increase the context until it is unique, but don't let the pattern expand beyond Match->maxBits.
  *
  * @param PatchObject $patch The patch to grow.
  * @param string      $text 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);
 }