/** * 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; } $html .= '<table class="Differences DifferencesSideBySide">'; $html .= '<thead>'; $html .= '<tr>'; $html .= '<th colspan="2">' . $this->diff->options['title_a'] . '</th>'; $html .= '<th colspan="2">' . $this->diff->options['title_b'] . '</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 switch ($change['tag']) { case '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">' . $line . ' </td>'; $html .= '<th>' . $toLine . '</th>'; $html .= '<td class="Right">' . $line . ' </td>'; $html .= '</tr>'; } break; // Added lines only on the right side // Added lines only on the right side case 'insert': 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>'; } break; // Show deleted lines only on the left side // Show deleted lines only on the left side case 'delete': 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>'; } break; // Show modified lines on both sides // Show modified lines on both sides case 'replace': 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">' . $line . ' </td>'; if (!isset($change['changed']['lines'][$no])) { $toLine = ' '; $changedLine = ' '; } else { $toLine = $change['base']['offset'] + $no + 1; $changedLine = $change['changed']['lines'][$no]; } $html .= '<th>' . $toLine . '</th>'; $html .= '<td class="Right">' . $changedLine . '</td>'; $html .= '</tr>'; } } break; default: foreach ($change['changed']['lines'] as $no => $changedLine) { if (!isset($change['base']['lines'][$no])) { $fromLine = ' '; $line = ' '; } else { $fromLine = $change['base']['offset'] + $no + 1; $line = $change['base']['lines'][$no]; } $html .= '<tr>'; $html .= '<th>' . $fromLine . '</th>'; $html .= '<td class="Left">' . $line . ' </td>'; $toLine = $change['changed']['offset'] + $no + 1; $html .= '<th>' . $toLine . '</th>'; $html .= '<td class="Right">' . $changedLine . '</td>'; $html .= '</tr>'; } break; } $html .= '</tbody>'; } } $html .= '</table>'; return $html; }
/** * 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; } $html .= '<table class="Differences DifferencesInline">'; $html .= '<thead>'; $html .= '<tr>'; $html .= '<th>Old</th>'; $html .= '<th>New</th>'; $html .= '<th>Differences</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>'; } } else { if ($change['tag'] == 'insert') { 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>'; } } else { if ($change['tag'] == 'delete') { 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>'; } } else { if ($change['tag'] == 'replace') { 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; }