annotate vendor/squizlabs/php_codesniffer/src/Generators/HTML.php @ 19:fa3358dc1485 tip

Add ndrum files
author Chris Cannam
date Wed, 28 Aug 2019 13:14:47 +0100
parents 129ea1e6d783
children
rev   line source
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('&lt;em&gt;', '<em>', $content);
Chris@17 222 $content = str_replace('&lt;/em&gt;', '</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', '&lt;?php', $first);
Chris@17 243 $first = str_replace("\n", '</br>', $first);
Chris@17 244 $first = str_replace(' ', '&nbsp;', $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', '&lt;?php', $second);
Chris@17 251 $second = str_replace("\n", '</br>', $second);
Chris@17 252 $second = str_replace(' ', '&nbsp;', $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