* @author Marc McIntyre * @copyright 2006-2014 Squiz Pty Ltd (ABN 77 084 670 600) * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence * @link http://pear.php.net/package/PHP_CodeSniffer */ if (class_exists('PHP_CodeSniffer_DocGenerators_Generator', true) === false) { throw new PHP_CodeSniffer_Exception('Class PHP_CodeSniffer_DocGenerators_Generator not found'); } /** * A doc generator that outputs documentation in one big HTML file. * * Output is in one large HTML file and is designed for you to style with * your own stylesheet. It contains a table of contents at the top with anchors * to each sniff. * * @category PHP * @package PHP_CodeSniffer * @author Greg Sherwood * @author Marc McIntyre * @copyright 2006-2014 Squiz Pty Ltd (ABN 77 084 670 600) * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence * @version Release: @package_version@ * @link http://pear.php.net/package/PHP_CodeSniffer */ class PHP_CodeSniffer_DocGenerators_HTML extends PHP_CodeSniffer_DocGenerators_Generator { /** * Generates the documentation for a standard. * * @return void * @see processSniff() */ public function generate() { ob_start(); $this->printHeader(); $standardFiles = $this->getStandardFiles(); $this->printToc($standardFiles); foreach ($standardFiles as $standard) { $doc = new DOMDocument(); $doc->load($standard); $documentation = $doc->getElementsByTagName('documentation')->item(0); $this->processSniff($documentation); } $this->printFooter(); $content = ob_get_contents(); ob_end_clean(); echo $content; }//end generate() /** * Print the header of the HTML page. * * @return void */ protected function printHeader() { $standard = $this->getStandard(); echo ''.PHP_EOL; echo ' '.PHP_EOL; echo " $standard Coding Standards".PHP_EOL; echo ' '.PHP_EOL; echo ' '.PHP_EOL; echo ' '.PHP_EOL; echo "

$standard Coding Standards

".PHP_EOL; }//end printHeader() /** * Print the table of contents for the standard. * * The TOC is just an unordered list of bookmarks to sniffs on the page. * * @param array $standardFiles An array of paths to the XML standard files. * * @return void */ protected function printToc($standardFiles) { echo '

Table of Contents

'.PHP_EOL; echo '
    '.PHP_EOL; foreach ($standardFiles as $standard) { $doc = new DOMDocument(); $doc->load($standard); $documentation = $doc->getElementsByTagName('documentation')->item(0); $title = $this->getTitle($documentation); echo '
  • $title
  • ".PHP_EOL; } echo '
'.PHP_EOL; }//end printToc() /** * Print the footer of the HTML page. * * @return void */ protected function printFooter() { // Turn off errors so we don't get timezone warnings if people // don't have their timezone set. $errorLevel = error_reporting(0); echo '
'; echo 'Documentation generated on '.date('r'); echo ' by PHP_CodeSniffer '.PHP_CodeSniffer::VERSION.''; echo '
'.PHP_EOL; error_reporting($errorLevel); echo ' '.PHP_EOL; echo ''.PHP_EOL; }//end printFooter() /** * Process the documentation for a single sniff. * * @param DOMNode $doc The DOMNode object for the sniff. * It represents the "documentation" tag in the XML * standard file. * * @return void */ public function processSniff(DOMNode $doc) { $title = $this->getTitle($doc); echo ' '.PHP_EOL; echo "

$title

".PHP_EOL; foreach ($doc->childNodes as $node) { if ($node->nodeName === 'standard') { $this->printTextBlock($node); } else if ($node->nodeName === 'code_comparison') { $this->printCodeComparisonBlock($node); } } }//end processSniff() /** * Print a text block found in a standard. * * @param DOMNode $node The DOMNode object for the text block. * * @return void */ protected function printTextBlock($node) { $content = trim($node->nodeValue); $content = htmlspecialchars($content); // Allow em tags only. $content = str_replace('<em>', '', $content); $content = str_replace('</em>', '', $content); echo "

$content

".PHP_EOL; }//end printTextBlock() /** * Print a code comparison block found in a standard. * * @param DOMNode $node The DOMNode object for the code comparison block. * * @return void */ protected function printCodeComparisonBlock($node) { $codeBlocks = $node->getElementsByTagName('code'); $firstTitle = $codeBlocks->item(0)->getAttribute('title'); $first = trim($codeBlocks->item(0)->nodeValue); $first = str_replace('', $first); $first = str_replace(' ', ' ', $first); $first = str_replace('', '', $first); $first = str_replace('', '', $first); $secondTitle = $codeBlocks->item(1)->getAttribute('title'); $second = trim($codeBlocks->item(1)->nodeValue); $second = str_replace('', $second); $second = str_replace(' ', ' ', $second); $second = str_replace('', '', $second); $second = str_replace('', '', $second); echo ' '.PHP_EOL; echo ' '.PHP_EOL; echo " ".PHP_EOL; echo " ".PHP_EOL; echo ' '.PHP_EOL; echo ' '.PHP_EOL; echo " ".PHP_EOL; echo " ".PHP_EOL; echo ' '.PHP_EOL; echo '
$firstTitle$secondTitle
$first$second
'.PHP_EOL; }//end printCodeComparisonBlock() }//end class