Chris@17: Chris@17: * @copyright 2014 Arroba IT Chris@17: * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence Chris@17: */ Chris@17: Chris@17: namespace PHP_CodeSniffer\Generators; Chris@17: Chris@17: use PHP_CodeSniffer\Config; Chris@17: Chris@17: class Markdown extends Generator Chris@17: { Chris@17: Chris@17: Chris@17: /** Chris@17: * Generates the documentation for a standard. Chris@17: * Chris@17: * @return void Chris@17: * @see processSniff() Chris@17: */ Chris@17: public function generate() Chris@17: { Chris@17: ob_start(); Chris@17: $this->printHeader(); Chris@17: Chris@17: foreach ($this->docFiles as $file) { Chris@17: $doc = new \DOMDocument(); Chris@17: $doc->load($file); Chris@17: $documentation = $doc->getElementsByTagName('documentation')->item(0); Chris@17: $this->processSniff($documentation); Chris@17: } Chris@17: Chris@17: $this->printFooter(); Chris@17: $content = ob_get_contents(); Chris@17: ob_end_clean(); Chris@17: Chris@17: echo $content; Chris@17: Chris@17: }//end generate() Chris@17: Chris@17: Chris@17: /** Chris@17: * Print the markdown header. Chris@17: * Chris@17: * @return void Chris@17: */ Chris@17: protected function printHeader() Chris@17: { Chris@17: $standard = $this->ruleset->name; Chris@17: Chris@17: echo "# $standard Coding Standard".PHP_EOL; Chris@17: Chris@17: }//end printHeader() Chris@17: Chris@17: Chris@17: /** Chris@17: * Print the markdown footer. Chris@17: * Chris@17: * @return void Chris@17: */ Chris@17: protected function printFooter() Chris@17: { Chris@17: // Turn off errors so we don't get timezone warnings if people Chris@17: // don't have their timezone set. Chris@17: error_reporting(0); Chris@17: echo 'Documentation generated on '.date('r'); Chris@17: echo ' by [PHP_CodeSniffer '.Config::VERSION.'](https://github.com/squizlabs/PHP_CodeSniffer)'.PHP_EOL; Chris@17: Chris@17: }//end printFooter() Chris@17: Chris@17: Chris@17: /** Chris@17: * Process the documentation for a single sniff. Chris@17: * Chris@17: * @param \DOMNode $doc The DOMNode object for the sniff. Chris@17: * It represents the "documentation" tag in the XML Chris@17: * standard file. Chris@17: * Chris@17: * @return void Chris@17: */ Chris@17: protected function processSniff(\DOMNode $doc) Chris@17: { Chris@17: $title = $this->getTitle($doc); Chris@17: echo "## $title".PHP_EOL; Chris@17: Chris@17: foreach ($doc->childNodes as $node) { Chris@17: if ($node->nodeName === 'standard') { Chris@17: $this->printTextBlock($node); Chris@17: } else if ($node->nodeName === 'code_comparison') { Chris@17: $this->printCodeComparisonBlock($node); Chris@17: } Chris@17: } Chris@17: Chris@17: }//end processSniff() Chris@17: Chris@17: Chris@17: /** Chris@17: * Print a text block found in a standard. Chris@17: * Chris@17: * @param \DOMNode $node The DOMNode object for the text block. Chris@17: * Chris@17: * @return void Chris@17: */ Chris@17: protected function printTextBlock(\DOMNode $node) Chris@17: { Chris@17: $content = trim($node->nodeValue); Chris@17: $content = htmlspecialchars($content); Chris@17: Chris@17: $content = str_replace('<em>', '*', $content); Chris@17: $content = str_replace('</em>', '*', $content); Chris@17: Chris@17: echo $content.PHP_EOL; Chris@17: Chris@17: }//end printTextBlock() Chris@17: Chris@17: Chris@17: /** Chris@17: * Print a code comparison block found in a standard. Chris@17: * Chris@17: * @param \DOMNode $node The DOMNode object for the code comparison block. Chris@17: * Chris@17: * @return void Chris@17: */ Chris@17: protected function printCodeComparisonBlock(\DOMNode $node) Chris@17: { Chris@17: $codeBlocks = $node->getElementsByTagName('code'); Chris@17: Chris@17: $firstTitle = $codeBlocks->item(0)->getAttribute('title'); Chris@17: $first = trim($codeBlocks->item(0)->nodeValue); Chris@17: $first = str_replace("\n", "\n ", $first); Chris@17: $first = str_replace('', '', $first); Chris@17: $first = str_replace('', '', $first); Chris@17: Chris@17: $secondTitle = $codeBlocks->item(1)->getAttribute('title'); Chris@17: $second = trim($codeBlocks->item(1)->nodeValue); Chris@17: $second = str_replace("\n", "\n ", $second); Chris@17: $second = str_replace('', '', $second); Chris@17: $second = str_replace('', '', $second); Chris@17: Chris@17: echo '
$firstTitle | ".PHP_EOL; Chris@17: echo "$secondTitle | ".PHP_EOL; Chris@17: echo '
---|---|
'.PHP_EOL.PHP_EOL; Chris@17: echo " $first".PHP_EOL.PHP_EOL; Chris@17: echo ' | '.PHP_EOL; Chris@17: echo ''.PHP_EOL.PHP_EOL; Chris@17: echo " $second".PHP_EOL.PHP_EOL; Chris@17: echo ' | '.PHP_EOL; Chris@17: echo '