Chris@17
|
1 <?php
|
Chris@17
|
2 /**
|
Chris@17
|
3 * A doc generator that outputs documentation in one big HTML file.
|
Chris@17
|
4 *
|
Chris@17
|
5 * Output is in one large HTML file and is designed for you to style with
|
Chris@17
|
6 * your own stylesheet. It contains a table of contents at the top with anchors
|
Chris@17
|
7 * to each sniff.
|
Chris@17
|
8 *
|
Chris@17
|
9 * @author Greg Sherwood <gsherwood@squiz.net>
|
Chris@17
|
10 * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600)
|
Chris@17
|
11 * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence
|
Chris@17
|
12 */
|
Chris@17
|
13
|
Chris@17
|
14 namespace PHP_CodeSniffer\Generators;
|
Chris@17
|
15
|
Chris@17
|
16 use PHP_CodeSniffer\Config;
|
Chris@17
|
17
|
Chris@17
|
18 class HTML extends Generator
|
Chris@17
|
19 {
|
Chris@17
|
20
|
Chris@17
|
21
|
Chris@17
|
22 /**
|
Chris@17
|
23 * Generates the documentation for a standard.
|
Chris@17
|
24 *
|
Chris@17
|
25 * @return void
|
Chris@17
|
26 * @see processSniff()
|
Chris@17
|
27 */
|
Chris@17
|
28 public function generate()
|
Chris@17
|
29 {
|
Chris@17
|
30 ob_start();
|
Chris@17
|
31 $this->printHeader();
|
Chris@17
|
32 $this->printToc();
|
Chris@17
|
33
|
Chris@17
|
34 foreach ($this->docFiles as $file) {
|
Chris@17
|
35 $doc = new \DOMDocument();
|
Chris@17
|
36 $doc->load($file);
|
Chris@17
|
37 $documentation = $doc->getElementsByTagName('documentation')->item(0);
|
Chris@17
|
38 $this->processSniff($documentation);
|
Chris@17
|
39 }
|
Chris@17
|
40
|
Chris@17
|
41 $this->printFooter();
|
Chris@17
|
42
|
Chris@17
|
43 $content = ob_get_contents();
|
Chris@17
|
44 ob_end_clean();
|
Chris@17
|
45
|
Chris@17
|
46 echo $content;
|
Chris@17
|
47
|
Chris@17
|
48 }//end generate()
|
Chris@17
|
49
|
Chris@17
|
50
|
Chris@17
|
51 /**
|
Chris@17
|
52 * Print the header of the HTML page.
|
Chris@17
|
53 *
|
Chris@17
|
54 * @return void
|
Chris@17
|
55 */
|
Chris@17
|
56 protected function printHeader()
|
Chris@17
|
57 {
|
Chris@17
|
58 $standard = $this->ruleset->name;
|
Chris@17
|
59 echo '<html>'.PHP_EOL;
|
Chris@17
|
60 echo ' <head>'.PHP_EOL;
|
Chris@17
|
61 echo " <title>$standard Coding Standards</title>".PHP_EOL;
|
Chris@17
|
62 echo ' <style>
|
Chris@17
|
63 body {
|
Chris@17
|
64 background-color: #FFFFFF;
|
Chris@17
|
65 font-size: 14px;
|
Chris@17
|
66 font-family: Arial, Helvetica, sans-serif;
|
Chris@17
|
67 color: #000000;
|
Chris@17
|
68 }
|
Chris@17
|
69
|
Chris@17
|
70 h1 {
|
Chris@17
|
71 color: #666666;
|
Chris@17
|
72 font-size: 20px;
|
Chris@17
|
73 font-weight: bold;
|
Chris@17
|
74 margin-top: 0px;
|
Chris@17
|
75 background-color: #E6E7E8;
|
Chris@17
|
76 padding: 20px;
|
Chris@17
|
77 border: 1px solid #BBBBBB;
|
Chris@17
|
78 }
|
Chris@17
|
79
|
Chris@17
|
80 h2 {
|
Chris@17
|
81 color: #00A5E3;
|
Chris@17
|
82 font-size: 16px;
|
Chris@17
|
83 font-weight: normal;
|
Chris@17
|
84 margin-top: 50px;
|
Chris@17
|
85 }
|
Chris@17
|
86
|
Chris@17
|
87 .code-comparison {
|
Chris@17
|
88 width: 100%;
|
Chris@17
|
89 }
|
Chris@17
|
90
|
Chris@17
|
91 .code-comparison td {
|
Chris@17
|
92 border: 1px solid #CCCCCC;
|
Chris@17
|
93 }
|
Chris@17
|
94
|
Chris@17
|
95 .code-comparison-title, .code-comparison-code {
|
Chris@17
|
96 font-family: Arial, Helvetica, sans-serif;
|
Chris@17
|
97 font-size: 12px;
|
Chris@17
|
98 color: #000000;
|
Chris@17
|
99 vertical-align: top;
|
Chris@17
|
100 padding: 4px;
|
Chris@17
|
101 width: 50%;
|
Chris@17
|
102 background-color: #F1F1F1;
|
Chris@17
|
103 line-height: 15px;
|
Chris@17
|
104 }
|
Chris@17
|
105
|
Chris@17
|
106 .code-comparison-code {
|
Chris@17
|
107 font-family: Courier;
|
Chris@17
|
108 background-color: #F9F9F9;
|
Chris@17
|
109 }
|
Chris@17
|
110
|
Chris@17
|
111 .code-comparison-highlight {
|
Chris@17
|
112 background-color: #DDF1F7;
|
Chris@17
|
113 border: 1px solid #00A5E3;
|
Chris@17
|
114 line-height: 15px;
|
Chris@17
|
115 }
|
Chris@17
|
116
|
Chris@17
|
117 .tag-line {
|
Chris@17
|
118 text-align: center;
|
Chris@17
|
119 width: 100%;
|
Chris@17
|
120 margin-top: 30px;
|
Chris@17
|
121 font-size: 12px;
|
Chris@17
|
122 }
|
Chris@17
|
123
|
Chris@17
|
124 .tag-line a {
|
Chris@17
|
125 color: #000000;
|
Chris@17
|
126 }
|
Chris@17
|
127 </style>'.PHP_EOL;
|
Chris@17
|
128 echo ' </head>'.PHP_EOL;
|
Chris@17
|
129 echo ' <body>'.PHP_EOL;
|
Chris@17
|
130 echo " <h1>$standard Coding Standards</h1>".PHP_EOL;
|
Chris@17
|
131
|
Chris@17
|
132 }//end printHeader()
|
Chris@17
|
133
|
Chris@17
|
134
|
Chris@17
|
135 /**
|
Chris@17
|
136 * Print the table of contents for the standard.
|
Chris@17
|
137 *
|
Chris@17
|
138 * The TOC is just an unordered list of bookmarks to sniffs on the page.
|
Chris@17
|
139 *
|
Chris@17
|
140 * @return void
|
Chris@17
|
141 */
|
Chris@17
|
142 protected function printToc()
|
Chris@17
|
143 {
|
Chris@17
|
144 echo ' <h2>Table of Contents</h2>'.PHP_EOL;
|
Chris@17
|
145 echo ' <ul class="toc">'.PHP_EOL;
|
Chris@17
|
146
|
Chris@17
|
147 foreach ($this->docFiles as $file) {
|
Chris@17
|
148 $doc = new \DOMDocument();
|
Chris@17
|
149 $doc->load($file);
|
Chris@17
|
150 $documentation = $doc->getElementsByTagName('documentation')->item(0);
|
Chris@17
|
151 $title = $this->getTitle($documentation);
|
Chris@17
|
152 echo ' <li><a href="#'.str_replace(' ', '-', $title)."\">$title</a></li>".PHP_EOL;
|
Chris@17
|
153 }
|
Chris@17
|
154
|
Chris@17
|
155 echo ' </ul>'.PHP_EOL;
|
Chris@17
|
156
|
Chris@17
|
157 }//end printToc()
|
Chris@17
|
158
|
Chris@17
|
159
|
Chris@17
|
160 /**
|
Chris@17
|
161 * Print the footer of the HTML page.
|
Chris@17
|
162 *
|
Chris@17
|
163 * @return void
|
Chris@17
|
164 */
|
Chris@17
|
165 protected function printFooter()
|
Chris@17
|
166 {
|
Chris@17
|
167 // Turn off errors so we don't get timezone warnings if people
|
Chris@17
|
168 // don't have their timezone set.
|
Chris@17
|
169 $errorLevel = error_reporting(0);
|
Chris@17
|
170 echo ' <div class="tag-line">';
|
Chris@17
|
171 echo 'Documentation generated on '.date('r');
|
Chris@17
|
172 echo ' by <a href="https://github.com/squizlabs/PHP_CodeSniffer">PHP_CodeSniffer '.Config::VERSION.'</a>';
|
Chris@17
|
173 echo '</div>'.PHP_EOL;
|
Chris@17
|
174 error_reporting($errorLevel);
|
Chris@17
|
175
|
Chris@17
|
176 echo ' </body>'.PHP_EOL;
|
Chris@17
|
177 echo '</html>'.PHP_EOL;
|
Chris@17
|
178
|
Chris@17
|
179 }//end printFooter()
|
Chris@17
|
180
|
Chris@17
|
181
|
Chris@17
|
182 /**
|
Chris@17
|
183 * Process the documentation for a single sniff.
|
Chris@17
|
184 *
|
Chris@17
|
185 * @param \DOMNode $doc The DOMNode object for the sniff.
|
Chris@17
|
186 * It represents the "documentation" tag in the XML
|
Chris@17
|
187 * standard file.
|
Chris@17
|
188 *
|
Chris@17
|
189 * @return void
|
Chris@17
|
190 */
|
Chris@17
|
191 public function processSniff(\DOMNode $doc)
|
Chris@17
|
192 {
|
Chris@17
|
193 $title = $this->getTitle($doc);
|
Chris@17
|
194 echo ' <a name="'.str_replace(' ', '-', $title).'" />'.PHP_EOL;
|
Chris@17
|
195 echo " <h2>$title</h2>".PHP_EOL;
|
Chris@17
|
196
|
Chris@17
|
197 foreach ($doc->childNodes as $node) {
|
Chris@17
|
198 if ($node->nodeName === 'standard') {
|
Chris@17
|
199 $this->printTextBlock($node);
|
Chris@17
|
200 } else if ($node->nodeName === 'code_comparison') {
|
Chris@17
|
201 $this->printCodeComparisonBlock($node);
|
Chris@17
|
202 }
|
Chris@17
|
203 }
|
Chris@17
|
204
|
Chris@17
|
205 }//end processSniff()
|
Chris@17
|
206
|
Chris@17
|
207
|
Chris@17
|
208 /**
|
Chris@17
|
209 * Print a text block found in a standard.
|
Chris@17
|
210 *
|
Chris@17
|
211 * @param \DOMNode $node The DOMNode object for the text block.
|
Chris@17
|
212 *
|
Chris@17
|
213 * @return void
|
Chris@17
|
214 */
|
Chris@17
|
215 protected function printTextBlock(\DOMNode $node)
|
Chris@17
|
216 {
|
Chris@17
|
217 $content = trim($node->nodeValue);
|
Chris@17
|
218 $content = htmlspecialchars($content);
|
Chris@17
|
219
|
Chris@17
|
220 // Allow em tags only.
|
Chris@17
|
221 $content = str_replace('<em>', '<em>', $content);
|
Chris@17
|
222 $content = str_replace('</em>', '</em>', $content);
|
Chris@17
|
223
|
Chris@17
|
224 echo " <p class=\"text\">$content</p>".PHP_EOL;
|
Chris@17
|
225
|
Chris@17
|
226 }//end printTextBlock()
|
Chris@17
|
227
|
Chris@17
|
228
|
Chris@17
|
229 /**
|
Chris@17
|
230 * Print a code comparison block found in a standard.
|
Chris@17
|
231 *
|
Chris@17
|
232 * @param \DOMNode $node The DOMNode object for the code comparison block.
|
Chris@17
|
233 *
|
Chris@17
|
234 * @return void
|
Chris@17
|
235 */
|
Chris@17
|
236 protected function printCodeComparisonBlock(\DOMNode $node)
|
Chris@17
|
237 {
|
Chris@17
|
238 $codeBlocks = $node->getElementsByTagName('code');
|
Chris@17
|
239
|
Chris@17
|
240 $firstTitle = $codeBlocks->item(0)->getAttribute('title');
|
Chris@17
|
241 $first = trim($codeBlocks->item(0)->nodeValue);
|
Chris@17
|
242 $first = str_replace('<?php', '<?php', $first);
|
Chris@17
|
243 $first = str_replace("\n", '</br>', $first);
|
Chris@17
|
244 $first = str_replace(' ', ' ', $first);
|
Chris@17
|
245 $first = str_replace('<em>', '<span class="code-comparison-highlight">', $first);
|
Chris@17
|
246 $first = str_replace('</em>', '</span>', $first);
|
Chris@17
|
247
|
Chris@17
|
248 $secondTitle = $codeBlocks->item(1)->getAttribute('title');
|
Chris@17
|
249 $second = trim($codeBlocks->item(1)->nodeValue);
|
Chris@17
|
250 $second = str_replace('<?php', '<?php', $second);
|
Chris@17
|
251 $second = str_replace("\n", '</br>', $second);
|
Chris@17
|
252 $second = str_replace(' ', ' ', $second);
|
Chris@17
|
253 $second = str_replace('<em>', '<span class="code-comparison-highlight">', $second);
|
Chris@17
|
254 $second = str_replace('</em>', '</span>', $second);
|
Chris@17
|
255
|
Chris@17
|
256 echo ' <table class="code-comparison">'.PHP_EOL;
|
Chris@17
|
257 echo ' <tr>'.PHP_EOL;
|
Chris@17
|
258 echo " <td class=\"code-comparison-title\">$firstTitle</td>".PHP_EOL;
|
Chris@17
|
259 echo " <td class=\"code-comparison-title\">$secondTitle</td>".PHP_EOL;
|
Chris@17
|
260 echo ' </tr>'.PHP_EOL;
|
Chris@17
|
261 echo ' <tr>'.PHP_EOL;
|
Chris@17
|
262 echo " <td class=\"code-comparison-code\">$first</td>".PHP_EOL;
|
Chris@17
|
263 echo " <td class=\"code-comparison-code\">$second</td>".PHP_EOL;
|
Chris@17
|
264 echo ' </tr>'.PHP_EOL;
|
Chris@17
|
265 echo ' </table>'.PHP_EOL;
|
Chris@17
|
266
|
Chris@17
|
267 }//end printCodeComparisonBlock()
|
Chris@17
|
268
|
Chris@17
|
269
|
Chris@17
|
270 }//end class
|