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