annotate vendor/squizlabs/php_codesniffer/CodeSniffer/DocGenerators/HTML.php @ 2:92f882872392

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