annotate vendor/squizlabs/php_codesniffer/src/Generators/HTML.php @ 5:12f9dff5fda9 tip

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