/** * Render a and return diff with changes between the two sequences * displayed inline (under each other) * * @return string The generated inline diff. */ public function render() { $changes = parent::render(); $html = ''; if (empty($changes)) { return $html; } if (isset($this->options['oldTitle'])) { $this->oldTitle = $this->options['oldTitle']; } if (isset($this->options['newTitle'])) { $this->newTitle = $this->options['newTitle']; } if (isset($this->options['diffTitle'])) { $this->diffTitle = $this->options['diffTitle']; } $html .= '<table class="Differences DifferencesInline">'; $html .= '<thead>'; $html .= '<tr>'; $html .= '<th>' . htmlspecialchars($this->oldTitle) . '</th>'; $html .= '<th>' . htmlspecialchars($this->newTitle) . '</th>'; $html .= '<th>' . htmlspecialchars($this->diffTitle) . '</th>'; $html .= '</tr>'; $html .= '</thead>'; foreach ($changes as $i => $blocks) { // If this is a separate block, we're condensing code so output ..., // indicating a significant portion of the code has been collapsed as // it is the same if ($i > 0) { $html .= '<tbody class="Skipped">'; $html .= '<th>…</th>'; $html .= '<th>…</th>'; $html .= '<td> </td>'; $html .= '</tbody>'; } foreach ($blocks as $change) { $html .= '<tbody class="Change' . ucfirst($change['tag']) . '">'; // Equal changes should be shown on both sides of the diff if ($change['tag'] == 'equal') { foreach ($change['base']['lines'] as $no => $line) { $fromLine = $change['base']['offset'] + $no + 1; $toLine = $change['changed']['offset'] + $no + 1; $html .= '<tr>'; $html .= '<th>' . $fromLine . '</th>'; $html .= '<th>' . $toLine . '</th>'; $html .= '<td class="Left">' . $line . '</td>'; $html .= '</tr>'; } } elseif ($change['tag'] == 'insert') { // Added lines only on the right side foreach ($change['changed']['lines'] as $no => $line) { $toLine = $change['changed']['offset'] + $no + 1; $html .= '<tr>'; $html .= '<th> </th>'; $html .= '<th>' . $toLine . '</th>'; $html .= '<td class="Right"><ins>' . $line . '</ins> </td>'; $html .= '</tr>'; } } elseif ($change['tag'] == 'delete') { // Show deleted lines only on the left side foreach ($change['base']['lines'] as $no => $line) { $fromLine = $change['base']['offset'] + $no + 1; $html .= '<tr>'; $html .= '<th>' . $fromLine . '</th>'; $html .= '<th> </th>'; $html .= '<td class="Left"><del>' . $line . '</del> </td>'; $html .= '</tr>'; } } elseif ($change['tag'] == 'replace') { // Show modified lines on both sides foreach ($change['base']['lines'] as $no => $line) { $fromLine = $change['base']['offset'] + $no + 1; $html .= '<tr>'; $html .= '<th>' . $fromLine . '</th>'; $html .= '<th> </th>'; $html .= '<td class="Left"><span>' . $line . '</span></td>'; $html .= '</tr>'; } foreach ($change['changed']['lines'] as $no => $line) { $toLine = $change['changed']['offset'] + $no + 1; $html .= '<tr>'; $html .= '<th> </th>'; $html .= '<th>' . $toLine . '</th>'; $html .= '<td class="Right"><span>' . $line . '</span></td>'; $html .= '</tr>'; } } $html .= '</tbody>'; } } $html .= '</table>'; return $html; }
/** * Render a and return diff with changes between the two sequences * displayed side by side. * * @return string The generated side by side diff. */ public function render() { $changes = parent::render(); $html = ''; if (empty($changes)) { return $html; } if (isset($this->options['oldTitle'])) { $this->oldTitle = $this->options['oldTitle']; } if (isset($this->options['newTitle'])) { $this->newTitle = $this->options['newTitle']; } $html .= '<table class="Differences DifferencesSideBySide">'; $html .= '<thead>'; $html .= '<tr>'; $html .= '<th colspan="2">' . htmlspecialchars($this->oldTitle) . '</th>'; $html .= '<th colspan="2">' . htmlspecialchars($this->newTitle) . '</th>'; $html .= '</tr>'; $html .= '</thead>'; foreach ($changes as $i => $blocks) { if ($i > 0) { $html .= '<tbody class="Skipped">'; $html .= '<th>…</th><td> </td>'; $html .= '<th>…</th><td> </td>'; $html .= '</tbody>'; } foreach ($blocks as $change) { $html .= '<tbody class="Change' . ucfirst($change['tag']) . '">'; // Equal changes should be shown on both sides of the diff if ($change['tag'] == 'equal') { foreach ($change['base']['lines'] as $no => $line) { $fromLine = $change['base']['offset'] + $no + 1; $toLine = $change['changed']['offset'] + $no + 1; $html .= '<tr>'; $html .= '<th>' . $fromLine . '</th>'; $html .= '<td class="Left"><span>' . $line . '</span> </td>'; $html .= '<th>' . $toLine . '</th>'; $html .= '<td class="Right"><span>' . $line . '</span> </td>'; $html .= '</tr>'; } } elseif ($change['tag'] == 'insert') { // Added lines only on the right side foreach ($change['changed']['lines'] as $no => $line) { $toLine = $change['changed']['offset'] + $no + 1; $html .= '<tr>'; $html .= '<th> </th>'; $html .= '<td class="Left"> </td>'; $html .= '<th>' . $toLine . '</th>'; $html .= '<td class="Right"><ins>' . $line . '</ins> </td>'; $html .= '</tr>'; } } elseif ($change['tag'] == 'delete') { // Show deleted lines only on the left side foreach ($change['base']['lines'] as $no => $line) { $fromLine = $change['base']['offset'] + $no + 1; $html .= '<tr>'; $html .= '<th>' . $fromLine . '</th>'; $html .= '<td class="Left"><del>' . $line . '</del> </td>'; $html .= '<th> </th>'; $html .= '<td class="Right"> </td>'; $html .= '</tr>'; } } elseif ($change['tag'] == 'replace') { // Show modified lines on both sides if (count($change['base']['lines']) >= count($change['changed']['lines'])) { foreach ($change['base']['lines'] as $no => $line) { $fromLine = $change['base']['offset'] + $no + 1; $html .= '<tr>'; $html .= '<th>' . $fromLine . '</th>'; $html .= '<td class="Left"><span>' . $line . '</span> </td>'; if (!isset($change['changed']['lines'][$no])) { $toLine = ' '; $changedLine = ' '; } else { $toLine = $change['base']['offset'] + $no + 1; $changedLine = '<span>' . $change['changed']['lines'][$no] . '</span>'; } $html .= '<th>' . $toLine . '</th>'; $html .= '<td class="Right">' . $changedLine . '</td>'; $html .= '</tr>'; } } else { foreach ($change['changed']['lines'] as $no => $changedLine) { if (!isset($change['base']['lines'][$no])) { $fromLine = ' '; $line = ' '; } else { $fromLine = $change['base']['offset'] + $no + 1; $line = '<span>' . $change['base']['lines'][$no] . '</span>'; } $html .= '<tr>'; $html .= '<th>' . $fromLine . '</th>'; $html .= '<td class="Left"><span>' . $line . '</span> </td>'; $toLine = $change['changed']['offset'] + $no + 1; $html .= '<th>' . $toLine . '</th>'; $html .= '<td class="Right">' . $changedLine . '</td>'; $html .= '</tr>'; } } } $html .= '</tbody>'; } } $html .= '</table>'; return $html; }