/** * This is the recursive function which is responsible for * handling/increasing granularity. * * Incrementally increasing the granularity is key to compute the * overall diff in a very efficient way. */ private function _processGranularity($from_segment, $to_segment) { $delimiters = $this->granularityStack[$this->stackpointer++]; $has_next_stage = $this->stackpointer < count($this->granularityStack); foreach (FineDiff::doFragmentDiff($from_segment, $to_segment, $delimiters) as $fragment_edit) { // increase granularity if ($fragment_edit instanceof FineDiffReplaceOp && $has_next_stage) { $this->_processGranularity(substr($this->from_text, $this->from_offset, $fragment_edit->getFromLen()), $fragment_edit->getText()); } else { if ($fragment_edit instanceof FineDiffCopyOp && $this->last_edit instanceof FineDiffCopyOp) { $this->edits[count($this->edits) - 1]->increase($fragment_edit->getFromLen()); $this->from_offset += $fragment_edit->getFromLen(); } else { /* $fragment_edit instanceof FineDiffCopyOp */ /* $fragment_edit instanceof FineDiffDeleteOp */ /* $fragment_edit instanceof FineDiffInsertOp */ $this->edits[] = $this->last_edit = $fragment_edit; $this->from_offset += $fragment_edit->getFromLen(); } } } $this->stackpointer--; }