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

$standard Coding Standards

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

Table of Contents

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

$title

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

$content

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