1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
<?php
/**
* @link http://www.yiiframework.com/
* @copyright Copyright (c) 2008 Yii Software LLC
* @license http://www.yiiframework.com/license/
*/
namespace yii\gii\components;
/**
* Renders diff to HTML. Output adjusted to be copy-paste friendly.
*
* @author Alexander Makarov <sam@rmcreative.ru>
* @since 2.0
*/
class DiffRendererHtmlInline extends \Diff_Renderer_Html_Array
{
/**
* 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 .= <<<HTML
<table class="Differences DifferencesInline">
<thead>
<tr>
<th>Old</th>
<th>New</th>
<th>Differences</th>
</tr>
</thead>
HTML;
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 .= <<<HTML
<tbody class="Skipped">
<th data-line-number="…"></th>
<th data-line-number="…"></th>
<td> </td>
</tbody>
HTML;
}
foreach ($blocks as $change) {
$tag = ucfirst($change['tag']);
$html .= <<<HTML
<tbody class="Change{$tag}">
HTML;
// 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 .= <<<HTML
<tr>
<th data-line-number="{$fromLine}"></th>
<th data-line-number="{$toLine}"></th>
<td class="Left">{$line}</td>
</tr>
HTML;
}
}
// Added lines only on the right side
elseif ($change['tag'] === 'insert') {
foreach ($change['changed']['lines'] as $no => $line) {
$toLine = $change['changed']['offset'] + $no + 1;
$html .= <<<HTML
<tr>
<th data-line-number=" "></th>
<th data-line-number="{$toLine}"></th>
<td class="Right"><ins>{$line}</ins> </td>
</tr>
HTML;
}
}
// Show deleted lines only on the left side
elseif ($change['tag'] === 'delete') {
foreach ($change['base']['lines'] as $no => $line) {
$fromLine = $change['base']['offset'] + $no + 1;
$html .= <<<HTML
<tr>
<th data-line-number="{$fromLine}"></th>
<th data-line-number=" "></th>
<td class="Left"><del>{$line}</del> </td>
</tr>
HTML;
}
}
// Show modified lines on both sides
elseif ($change['tag'] === 'replace') {
foreach ($change['base']['lines'] as $no => $line) {
$fromLine = $change['base']['offset'] + $no + 1;
$html .= <<<HTML
<tr>
<th data-line-number="{$fromLine}"></th>
<th data-line-number=" "></th>
<td class="Left"><span>{$line}</span></td>
</tr>
HTML;
}
foreach ($change['changed']['lines'] as $no => $line) {
$toLine = $change['changed']['offset'] + $no + 1;
$html .= <<<HTML
<tr>
<th data-line-number="{$toLine}"></th>
<th data-line-number=" "></th>
<td class="Right"><span>{$line}</span></td>
</tr>
HTML;
}
}
$html .= <<<HTML
</tbody>
HTML;
}
}
$html .= <<<HTML
</table>
HTML;
return $html;
}
}