_leading_context_lines = $context_lines; $this->_trailing_context_lines = $context_lines; $this->diff = ""; $this->change = ""; } protected function _startDiff() { } protected function _endDiff() { return [$this->diff, $this->change]; } protected function _blockHeader($xbeg, $xlen, $ybeg, $ylen) { } protected function _startBlock($header) { echo $header; } protected function _endBlock() { } protected function _getChange($lines) { return str_replace("
", "↵
", join("", $lines)); } protected function _lines($lines, $prefix = '', $suffix = '', $type = '') { if ($type == 'context') { $this->diff .= join("", $lines); } elseif ($type == 'added' || $type == 'change-added') { $t = $this->_getChange($lines); if (! empty($t)) { $this->diff .= "$t"; } } elseif ($type == 'deleted' || $type == 'change-deleted') { $t = $this->_getChange($lines); if (! empty($t)) { $this->diff .= "$t"; } } elseif ($type == 'changed') { $t = $this->_getChange($lines[0]); if (! empty($t)) { $this->diff .= "$t"; } $t = $this->_getChange($lines[1]); if (! empty($t)) { $this->diff .= "$t"; } } } protected function _context($lines) { $this->_lines($lines, '', '', 'context'); } protected function _added($lines, $changemode = false) { if (! $this->change) { $this->change = "added"; } if ($this->change != "added") { $this->change = "changed"; } if ($changemode) { $this->_lines($lines, '+', '', 'change-added'); } else { $this->_lines($lines, '+', '', 'added'); } } protected function _deleted($lines, $changemode = false) { if (! $this->change) { $this->change = "deleted"; } if ($this->change != "deleted") { $this->change = "changed"; } if ($changemode) { $this->_lines($lines, '-', '', 'change-deleted'); } else { $this->_lines($lines, '-', '', 'deleted'); } } protected function _changed($orig, $final) { $this->change = 'changed'; $this->_lines([$orig, $final], '*', '', 'changed'); } }