1
|
|
|
<?php |
2
|
|
|
/** |
3
|
|
|
* A doc generator that outputs text-based documentation. |
4
|
|
|
* |
5
|
|
|
* Output is designed to be displayed in a terminal and is wrapped to 100 characters. |
6
|
|
|
* |
7
|
|
|
* @author Greg Sherwood <[email protected]> |
8
|
|
|
* @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) |
9
|
|
|
* @license https://github.com/squizlabs/Symplify\PHP7_CodeSniffer/blob/master/licence.txt BSD Licence |
10
|
|
|
*/ |
11
|
|
|
|
12
|
|
|
namespace Symplify\PHP7_CodeSniffer\Generators; |
13
|
|
|
|
14
|
|
|
class Text extends Generator |
15
|
|
|
{ |
16
|
|
|
|
17
|
|
|
|
18
|
|
|
/** |
19
|
|
|
* Process the documentation for a single sniff. |
20
|
|
|
* |
21
|
|
|
* @param \DOMNode $doc The DOMNode object for the sniff. |
22
|
|
|
* It represents the "documentation" tag in the XML |
23
|
|
|
* standard file. |
24
|
|
|
* |
25
|
|
|
* @return void |
26
|
|
|
*/ |
27
|
|
|
public function processSniff(\DOMNode $doc) |
28
|
|
|
{ |
29
|
|
|
$this->printTitle($doc); |
30
|
|
|
|
31
|
|
View Code Duplication |
foreach ($doc->childNodes as $node) { |
|
|
|
|
32
|
|
|
if ($node->nodeName === 'standard') { |
33
|
|
|
$this->printTextBlock($node); |
34
|
|
|
} else if ($node->nodeName === 'code_comparison') { |
35
|
|
|
$this->printCodeComparisonBlock($node); |
36
|
|
|
} |
37
|
|
|
} |
38
|
|
|
|
39
|
|
|
}//end processSniff() |
40
|
|
|
|
41
|
|
|
|
42
|
|
|
/** |
43
|
|
|
* Prints the title area for a single sniff. |
44
|
|
|
* |
45
|
|
|
* @param \DOMNode $doc The DOMNode object for the sniff. |
46
|
|
|
* It represents the "documentation" tag in the XML |
47
|
|
|
* standard file. |
48
|
|
|
* |
49
|
|
|
* @return void |
50
|
|
|
*/ |
51
|
|
|
protected function printTitle(\DOMNode $doc) |
52
|
|
|
{ |
53
|
|
|
$title = $this->getTitle($doc); |
54
|
|
|
$standard = $this->ruleset->name; |
55
|
|
|
|
56
|
|
|
echo PHP_EOL; |
57
|
|
|
echo str_repeat('-', (strlen("$standard CODING STANDARD: $title") + 4)); |
58
|
|
|
echo strtoupper(PHP_EOL."| $standard CODING STANDARD: $title |".PHP_EOL); |
59
|
|
|
echo str_repeat('-', (strlen("$standard CODING STANDARD: $title") + 4)); |
60
|
|
|
echo PHP_EOL.PHP_EOL; |
61
|
|
|
|
62
|
|
|
}//end printTitle() |
63
|
|
|
|
64
|
|
|
|
65
|
|
|
/** |
66
|
|
|
* Print a text block found in a standard. |
67
|
|
|
* |
68
|
|
|
* @param \DOMNode $node The DOMNode object for the text block. |
69
|
|
|
* |
70
|
|
|
* @return void |
71
|
|
|
*/ |
72
|
|
|
protected function printTextBlock(\DOMNode $node) |
73
|
|
|
{ |
74
|
|
|
$text = trim($node->nodeValue); |
75
|
|
|
$text = str_replace('<em>', '*', $text); |
76
|
|
|
$text = str_replace('</em>', '*', $text); |
77
|
|
|
|
78
|
|
|
$lines = array(); |
79
|
|
|
$tempLine = ''; |
80
|
|
|
$words = explode(' ', $text); |
81
|
|
|
|
82
|
|
View Code Duplication |
foreach ($words as $word) { |
|
|
|
|
83
|
|
|
if (strlen($tempLine.$word) >= 99) { |
84
|
|
|
if (strlen($tempLine.$word) === 99) { |
85
|
|
|
// Adding the extra space will push us to the edge |
86
|
|
|
// so we are done. |
87
|
|
|
$lines[] = $tempLine.$word; |
88
|
|
|
$tempLine = ''; |
89
|
|
|
} else if (strlen($tempLine.$word) === 100) { |
90
|
|
|
// We are already at the edge, so we are done. |
91
|
|
|
$lines[] = $tempLine.$word; |
92
|
|
|
$tempLine = ''; |
93
|
|
|
} else { |
94
|
|
|
$lines[] = rtrim($tempLine); |
95
|
|
|
$tempLine = $word.' '; |
96
|
|
|
} |
97
|
|
|
} else { |
98
|
|
|
$tempLine .= $word.' '; |
99
|
|
|
} |
100
|
|
|
}//end foreach |
101
|
|
|
|
102
|
|
|
if ($tempLine !== '') { |
103
|
|
|
$lines[] = rtrim($tempLine); |
104
|
|
|
} |
105
|
|
|
|
106
|
|
|
echo implode(PHP_EOL, $lines).PHP_EOL.PHP_EOL; |
107
|
|
|
|
108
|
|
|
}//end printTextBlock() |
109
|
|
|
|
110
|
|
|
|
111
|
|
|
/** |
112
|
|
|
* Print a code comparison block found in a standard. |
113
|
|
|
* |
114
|
|
|
* @param \DOMNode $node The DOMNode object for the code comparison block. |
115
|
|
|
* |
116
|
|
|
* @return void |
117
|
|
|
*/ |
118
|
|
|
protected function printCodeComparisonBlock(\DOMNode $node) |
119
|
|
|
{ |
120
|
|
|
$codeBlocks = $node->getElementsByTagName('code'); |
121
|
|
|
$first = trim($codeBlocks->item(0)->nodeValue); |
122
|
|
|
$firstTitle = $codeBlocks->item(0)->getAttribute('title'); |
123
|
|
|
|
124
|
|
|
$firstTitleLines = array(); |
125
|
|
|
$tempTitle = ''; |
126
|
|
|
$words = explode(' ', $firstTitle); |
127
|
|
|
|
128
|
|
View Code Duplication |
foreach ($words as $word) { |
|
|
|
|
129
|
|
|
if (strlen($tempTitle.$word) >= 45) { |
130
|
|
|
if (strlen($tempTitle.$word) === 45) { |
131
|
|
|
// Adding the extra space will push us to the edge |
132
|
|
|
// so we are done. |
133
|
|
|
$firstTitleLines[] = $tempTitle.$word; |
134
|
|
|
$tempTitle = ''; |
135
|
|
|
} else if (strlen($tempTitle.$word) === 46) { |
136
|
|
|
// We are already at the edge, so we are done. |
137
|
|
|
$firstTitleLines[] = $tempTitle.$word; |
138
|
|
|
$tempTitle = ''; |
139
|
|
|
} else { |
140
|
|
|
$firstTitleLines[] = $tempTitle; |
141
|
|
|
$tempTitle = $word; |
142
|
|
|
} |
143
|
|
|
} else { |
144
|
|
|
$tempTitle .= $word.' '; |
145
|
|
|
} |
146
|
|
|
}//end foreach |
147
|
|
|
|
148
|
|
|
if ($tempTitle !== '') { |
149
|
|
|
$firstTitleLines[] = $tempTitle; |
150
|
|
|
} |
151
|
|
|
|
152
|
|
|
$first = str_replace('<em>', '', $first); |
153
|
|
|
$first = str_replace('</em>', '', $first); |
154
|
|
|
$firstLines = explode("\n", $first); |
155
|
|
|
|
156
|
|
|
$second = trim($codeBlocks->item(1)->nodeValue); |
157
|
|
|
$secondTitle = $codeBlocks->item(1)->getAttribute('title'); |
158
|
|
|
|
159
|
|
|
$secondTitleLines = array(); |
160
|
|
|
$tempTitle = ''; |
161
|
|
|
$words = explode(' ', $secondTitle); |
162
|
|
|
|
163
|
|
View Code Duplication |
foreach ($words as $word) { |
|
|
|
|
164
|
|
|
if (strlen($tempTitle.$word) >= 45) { |
165
|
|
|
if (strlen($tempTitle.$word) === 45) { |
166
|
|
|
// Adding the extra space will push us to the edge |
167
|
|
|
// so we are done. |
168
|
|
|
$secondTitleLines[] = $tempTitle.$word; |
169
|
|
|
$tempTitle = ''; |
170
|
|
|
} else if (strlen($tempTitle.$word) === 46) { |
171
|
|
|
// We are already at the edge, so we are done. |
172
|
|
|
$secondTitleLines[] = $tempTitle.$word; |
173
|
|
|
$tempTitle = ''; |
174
|
|
|
} else { |
175
|
|
|
$secondTitleLines[] = $tempTitle; |
176
|
|
|
$tempTitle = $word; |
177
|
|
|
} |
178
|
|
|
} else { |
179
|
|
|
$tempTitle .= $word.' '; |
180
|
|
|
} |
181
|
|
|
}//end foreach |
182
|
|
|
|
183
|
|
|
if ($tempTitle !== '') { |
184
|
|
|
$secondTitleLines[] = $tempTitle; |
185
|
|
|
} |
186
|
|
|
|
187
|
|
|
$second = str_replace('<em>', '', $second); |
188
|
|
|
$second = str_replace('</em>', '', $second); |
189
|
|
|
$secondLines = explode("\n", $second); |
190
|
|
|
|
191
|
|
|
$maxCodeLines = max(count($firstLines), count($secondLines)); |
192
|
|
|
$maxTitleLines = max(count($firstTitleLines), count($secondTitleLines)); |
193
|
|
|
|
194
|
|
|
echo str_repeat('-', 41); |
195
|
|
|
echo ' CODE COMPARISON '; |
196
|
|
|
echo str_repeat('-', 42).PHP_EOL; |
197
|
|
|
|
198
|
|
View Code Duplication |
for ($i = 0; $i < $maxTitleLines; $i++) { |
|
|
|
|
199
|
|
|
if (isset($firstTitleLines[$i]) === true) { |
200
|
|
|
$firstLineText = $firstTitleLines[$i]; |
201
|
|
|
} else { |
202
|
|
|
$firstLineText = ''; |
203
|
|
|
} |
204
|
|
|
|
205
|
|
|
if (isset($secondTitleLines[$i]) === true) { |
206
|
|
|
$secondLineText = $secondTitleLines[$i]; |
207
|
|
|
} else { |
208
|
|
|
$secondLineText = ''; |
209
|
|
|
} |
210
|
|
|
|
211
|
|
|
echo '| '; |
212
|
|
|
echo $firstLineText.str_repeat(' ', (46 - strlen($firstLineText))); |
213
|
|
|
echo ' | '; |
214
|
|
|
echo $secondLineText.str_repeat(' ', (47 - strlen($secondLineText))); |
215
|
|
|
echo ' |'.PHP_EOL; |
216
|
|
|
}//end for |
217
|
|
|
|
218
|
|
|
echo str_repeat('-', 100).PHP_EOL; |
219
|
|
|
|
220
|
|
View Code Duplication |
for ($i = 0; $i < $maxCodeLines; $i++) { |
|
|
|
|
221
|
|
|
if (isset($firstLines[$i]) === true) { |
222
|
|
|
$firstLineText = $firstLines[$i]; |
223
|
|
|
} else { |
224
|
|
|
$firstLineText = ''; |
225
|
|
|
} |
226
|
|
|
|
227
|
|
|
if (isset($secondLines[$i]) === true) { |
228
|
|
|
$secondLineText = $secondLines[$i]; |
229
|
|
|
} else { |
230
|
|
|
$secondLineText = ''; |
231
|
|
|
} |
232
|
|
|
|
233
|
|
|
echo '| '; |
234
|
|
|
echo $firstLineText.str_repeat(' ', (47 - strlen($firstLineText))); |
235
|
|
|
echo '| '; |
236
|
|
|
echo $secondLineText.str_repeat(' ', (48 - strlen($secondLineText))); |
237
|
|
|
echo '|'.PHP_EOL; |
238
|
|
|
}//end for |
239
|
|
|
|
240
|
|
|
echo str_repeat('-', 100).PHP_EOL.PHP_EOL; |
241
|
|
|
|
242
|
|
|
}//end printCodeComparisonBlock() |
243
|
|
|
|
244
|
|
|
|
245
|
|
|
}//end class |
246
|
|
|
|
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.
You can also find more detailed suggestions in the “Code” section of your repository.