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 text-based documentation. Chris@0: * Chris@0: * Output is designed to be displayed in a terminal and is wrapped to 100 characters. 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_Text extends PHP_CodeSniffer_DocGenerators_Generator Chris@0: { 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: $this->printTitle($doc); 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: * Prints the title area 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: protected function printTitle(DOMNode $doc) Chris@0: { Chris@0: $title = $this->getTitle($doc); Chris@0: $standard = $this->getStandard(); Chris@0: Chris@0: echo PHP_EOL; Chris@0: echo str_repeat('-', (strlen("$standard CODING STANDARD: $title") + 4)); Chris@0: echo strtoupper(PHP_EOL."| $standard CODING STANDARD: $title |".PHP_EOL); Chris@0: echo str_repeat('-', (strlen("$standard CODING STANDARD: $title") + 4)); Chris@0: echo PHP_EOL.PHP_EOL; Chris@0: Chris@0: }//end printTitle() 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: $text = trim($node->nodeValue); Chris@0: $text = str_replace('', '*', $text); Chris@0: $text = str_replace('', '*', $text); Chris@0: Chris@0: $lines = array(); Chris@0: $tempLine = ''; Chris@0: $words = explode(' ', $text); Chris@0: Chris@0: foreach ($words as $word) { Chris@0: if (strlen($tempLine.$word) >= 99) { Chris@0: if (strlen($tempLine.$word) === 99) { Chris@0: // Adding the extra space will push us to the edge Chris@0: // so we are done. Chris@0: $lines[] = $tempLine.$word; Chris@0: $tempLine = ''; Chris@0: } else if (strlen($tempLine.$word) === 100) { Chris@0: // We are already at the edge, so we are done. Chris@0: $lines[] = $tempLine.$word; Chris@0: $tempLine = ''; Chris@0: } else { Chris@0: $lines[] = rtrim($tempLine); Chris@0: $tempLine = $word.' '; Chris@0: } Chris@0: } else { Chris@0: $tempLine .= $word.' '; Chris@0: } Chris@0: }//end foreach Chris@0: Chris@0: if ($tempLine !== '') { Chris@0: $lines[] = rtrim($tempLine); Chris@0: } Chris@0: Chris@0: echo implode(PHP_EOL, $lines).PHP_EOL.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: $first = trim($codeBlocks->item(0)->nodeValue); Chris@0: $firstTitle = $codeBlocks->item(0)->getAttribute('title'); Chris@0: Chris@0: $firstTitleLines = array(); Chris@0: $tempTitle = ''; Chris@0: $words = explode(' ', $firstTitle); Chris@0: Chris@0: foreach ($words as $word) { Chris@0: if (strlen($tempTitle.$word) >= 45) { Chris@0: if (strlen($tempTitle.$word) === 45) { Chris@0: // Adding the extra space will push us to the edge Chris@0: // so we are done. Chris@0: $firstTitleLines[] = $tempTitle.$word; Chris@0: $tempTitle = ''; Chris@0: } else if (strlen($tempTitle.$word) === 46) { Chris@0: // We are already at the edge, so we are done. Chris@0: $firstTitleLines[] = $tempTitle.$word; Chris@0: $tempTitle = ''; Chris@0: } else { Chris@0: $firstTitleLines[] = $tempTitle; Chris@0: $tempTitle = $word; Chris@0: } Chris@0: } else { Chris@0: $tempTitle .= $word.' '; Chris@0: } Chris@0: }//end foreach Chris@0: Chris@0: if ($tempTitle !== '') { Chris@0: $firstTitleLines[] = $tempTitle; Chris@0: } Chris@0: Chris@0: $first = str_replace('', '', $first); Chris@0: $first = str_replace('', '', $first); Chris@0: $firstLines = explode("\n", $first); Chris@0: Chris@0: $second = trim($codeBlocks->item(1)->nodeValue); Chris@0: $secondTitle = $codeBlocks->item(1)->getAttribute('title'); Chris@0: Chris@0: $secondTitleLines = array(); Chris@0: $tempTitle = ''; Chris@0: $words = explode(' ', $secondTitle); Chris@0: Chris@0: foreach ($words as $word) { Chris@0: if (strlen($tempTitle.$word) >= 45) { Chris@0: if (strlen($tempTitle.$word) === 45) { Chris@0: // Adding the extra space will push us to the edge Chris@0: // so we are done. Chris@0: $secondTitleLines[] = $tempTitle.$word; Chris@0: $tempTitle = ''; Chris@0: } else if (strlen($tempTitle.$word) === 46) { Chris@0: // We are already at the edge, so we are done. Chris@0: $secondTitleLines[] = $tempTitle.$word; Chris@0: $tempTitle = ''; Chris@0: } else { Chris@0: $secondTitleLines[] = $tempTitle; Chris@0: $tempTitle = $word; Chris@0: } Chris@0: } else { Chris@0: $tempTitle .= $word.' '; Chris@0: } Chris@0: }//end foreach Chris@0: Chris@0: if ($tempTitle !== '') { Chris@0: $secondTitleLines[] = $tempTitle; Chris@0: } Chris@0: Chris@0: $second = str_replace('', '', $second); Chris@0: $second = str_replace('', '', $second); Chris@0: $secondLines = explode("\n", $second); Chris@0: Chris@0: $maxCodeLines = max(count($firstLines), count($secondLines)); Chris@0: $maxTitleLines = max(count($firstTitleLines), count($secondTitleLines)); Chris@0: Chris@0: echo str_repeat('-', 41); Chris@0: echo ' CODE COMPARISON '; Chris@0: echo str_repeat('-', 42).PHP_EOL; Chris@0: Chris@0: for ($i = 0; $i < $maxTitleLines; $i++) { Chris@0: if (isset($firstTitleLines[$i]) === true) { Chris@0: $firstLineText = $firstTitleLines[$i]; Chris@0: } else { Chris@0: $firstLineText = ''; Chris@0: } Chris@0: Chris@0: if (isset($secondTitleLines[$i]) === true) { Chris@0: $secondLineText = $secondTitleLines[$i]; Chris@0: } else { Chris@0: $secondLineText = ''; Chris@0: } Chris@0: Chris@0: echo '| '; Chris@0: echo $firstLineText.str_repeat(' ', (46 - strlen($firstLineText))); Chris@0: echo ' | '; Chris@0: echo $secondLineText.str_repeat(' ', (47 - strlen($secondLineText))); Chris@0: echo ' |'.PHP_EOL; Chris@0: }//end for Chris@0: Chris@0: echo str_repeat('-', 100).PHP_EOL; Chris@0: Chris@0: for ($i = 0; $i < $maxCodeLines; $i++) { Chris@0: if (isset($firstLines[$i]) === true) { Chris@0: $firstLineText = $firstLines[$i]; Chris@0: } else { Chris@0: $firstLineText = ''; Chris@0: } Chris@0: Chris@0: if (isset($secondLines[$i]) === true) { Chris@0: $secondLineText = $secondLines[$i]; Chris@0: } else { Chris@0: $secondLineText = ''; Chris@0: } Chris@0: Chris@0: echo '| '; Chris@0: echo $firstLineText.str_repeat(' ', (47 - strlen($firstLineText))); Chris@0: echo '| '; Chris@0: echo $secondLineText.str_repeat(' ', (48 - strlen($secondLineText))); Chris@0: echo '|'.PHP_EOL; Chris@0: }//end for Chris@0: Chris@0: echo str_repeat('-', 100).PHP_EOL.PHP_EOL; Chris@0: Chris@0: }//end printCodeComparisonBlock() Chris@0: Chris@0: Chris@0: }//end class