Chris@0
|
1 <?php
|
Chris@0
|
2 /**
|
Chris@0
|
3 * A doc generator that outputs documentation in Markdown format.
|
Chris@0
|
4 *
|
Chris@0
|
5 * PHP version 5
|
Chris@0
|
6 *
|
Chris@0
|
7 * @category PHP
|
Chris@0
|
8 * @package PHP_CodeSniffer
|
Chris@0
|
9 * @author Stefano Kowalke <blueduck@gmx.net>
|
Chris@0
|
10 * @copyright 2014 Arroba IT
|
Chris@0
|
11 * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence
|
Chris@0
|
12 * @link http://pear.php.net/package/PHP_CodeSniffer
|
Chris@0
|
13 */
|
Chris@0
|
14
|
Chris@0
|
15 if (class_exists('PHP_CodeSniffer_DocGenerators_Generator', true) === false) {
|
Chris@0
|
16 throw new PHP_CodeSniffer_Exception('Class PHP_CodeSniffer_DocGenerators_Generator not found');
|
Chris@0
|
17 }
|
Chris@0
|
18
|
Chris@0
|
19 /**
|
Chris@0
|
20 * A doc generator that outputs documentation in Markdown format.
|
Chris@0
|
21 *
|
Chris@0
|
22 * @category PHP
|
Chris@0
|
23 * @package PHP_CodeSniffer
|
Chris@0
|
24 * @author Stefano Kowalke <blueduck@gmx.net>
|
Chris@0
|
25 * @copyright 2014 Arroba IT
|
Chris@0
|
26 * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence
|
Chris@0
|
27 * @version Release: @package_version@
|
Chris@0
|
28 * @link http://pear.php.net/package/PHP_CodeSniffer
|
Chris@0
|
29 */
|
Chris@0
|
30 class PHP_CodeSniffer_DocGenerators_Markdown extends PHP_CodeSniffer_DocGenerators_Generator
|
Chris@0
|
31 {
|
Chris@0
|
32
|
Chris@0
|
33
|
Chris@0
|
34 /**
|
Chris@0
|
35 * Generates the documentation for a standard.
|
Chris@0
|
36 *
|
Chris@0
|
37 * @return void
|
Chris@0
|
38 * @see processSniff()
|
Chris@0
|
39 */
|
Chris@0
|
40 public function generate()
|
Chris@0
|
41 {
|
Chris@0
|
42 ob_start();
|
Chris@0
|
43 $this->printHeader();
|
Chris@0
|
44
|
Chris@0
|
45 $standardFiles = $this->getStandardFiles();
|
Chris@0
|
46
|
Chris@0
|
47 foreach ($standardFiles as $standard) {
|
Chris@0
|
48 $doc = new DOMDocument();
|
Chris@0
|
49 $doc->load($standard);
|
Chris@0
|
50 $documentation = $doc->getElementsByTagName('documentation')->item(0);
|
Chris@0
|
51 $this->processSniff($documentation);
|
Chris@0
|
52 }
|
Chris@0
|
53
|
Chris@0
|
54 $this->printFooter();
|
Chris@0
|
55 $content = ob_get_contents();
|
Chris@0
|
56 ob_end_clean();
|
Chris@0
|
57
|
Chris@0
|
58 echo $content;
|
Chris@0
|
59
|
Chris@0
|
60 }//end generate()
|
Chris@0
|
61
|
Chris@0
|
62
|
Chris@0
|
63 /**
|
Chris@0
|
64 * Print the markdown header.
|
Chris@0
|
65 *
|
Chris@0
|
66 * @return void
|
Chris@0
|
67 */
|
Chris@0
|
68 protected function printHeader()
|
Chris@0
|
69 {
|
Chris@0
|
70 $standard = $this->getStandard();
|
Chris@0
|
71
|
Chris@0
|
72 echo "# $standard Coding Standard".PHP_EOL;
|
Chris@0
|
73
|
Chris@0
|
74 }//end printHeader()
|
Chris@0
|
75
|
Chris@0
|
76
|
Chris@0
|
77 /**
|
Chris@0
|
78 * Print the markdown footer.
|
Chris@0
|
79 *
|
Chris@0
|
80 * @return void
|
Chris@0
|
81 */
|
Chris@0
|
82 protected function printFooter()
|
Chris@0
|
83 {
|
Chris@0
|
84 // Turn off errors so we don't get timezone warnings if people
|
Chris@0
|
85 // don't have their timezone set.
|
Chris@0
|
86 error_reporting(0);
|
Chris@0
|
87 echo 'Documentation generated on '.date('r');
|
Chris@0
|
88 echo ' by [PHP_CodeSniffer '.PHP_CodeSniffer::VERSION.'](https://github.com/squizlabs/PHP_CodeSniffer)';
|
Chris@0
|
89
|
Chris@0
|
90 }//end printFooter()
|
Chris@0
|
91
|
Chris@0
|
92
|
Chris@0
|
93 /**
|
Chris@0
|
94 * Process the documentation for a single sniff.
|
Chris@0
|
95 *
|
Chris@0
|
96 * @param DOMNode $doc The DOMNode object for the sniff.
|
Chris@0
|
97 * It represents the "documentation" tag in the XML
|
Chris@0
|
98 * standard file.
|
Chris@0
|
99 *
|
Chris@0
|
100 * @return void
|
Chris@0
|
101 */
|
Chris@0
|
102 protected function processSniff(DOMNode $doc)
|
Chris@0
|
103 {
|
Chris@0
|
104 $title = $this->getTitle($doc);
|
Chris@0
|
105 echo "## $title".PHP_EOL;
|
Chris@0
|
106
|
Chris@0
|
107 foreach ($doc->childNodes as $node) {
|
Chris@0
|
108 if ($node->nodeName === 'standard') {
|
Chris@0
|
109 $this->printTextBlock($node);
|
Chris@0
|
110 } else if ($node->nodeName === 'code_comparison') {
|
Chris@0
|
111 $this->printCodeComparisonBlock($node);
|
Chris@0
|
112 }
|
Chris@0
|
113 }
|
Chris@0
|
114
|
Chris@0
|
115 }//end processSniff()
|
Chris@0
|
116
|
Chris@0
|
117
|
Chris@0
|
118 /**
|
Chris@0
|
119 * Print a text block found in a standard.
|
Chris@0
|
120 *
|
Chris@0
|
121 * @param DOMNode $node The DOMNode object for the text block.
|
Chris@0
|
122 *
|
Chris@0
|
123 * @return void
|
Chris@0
|
124 */
|
Chris@0
|
125 protected function printTextBlock(DOMNode $node)
|
Chris@0
|
126 {
|
Chris@0
|
127 $content = trim($node->nodeValue);
|
Chris@0
|
128 $content = htmlspecialchars($content);
|
Chris@0
|
129
|
Chris@0
|
130 $content = str_replace('<em>', '*', $content);
|
Chris@0
|
131 $content = str_replace('</em>', '*', $content);
|
Chris@0
|
132
|
Chris@0
|
133 echo $content.PHP_EOL;
|
Chris@0
|
134
|
Chris@0
|
135 }//end printTextBlock()
|
Chris@0
|
136
|
Chris@0
|
137
|
Chris@0
|
138 /**
|
Chris@0
|
139 * Print a code comparison block found in a standard.
|
Chris@0
|
140 *
|
Chris@0
|
141 * @param DOMNode $node The DOMNode object for the code comparison block.
|
Chris@0
|
142 *
|
Chris@0
|
143 * @return void
|
Chris@0
|
144 */
|
Chris@0
|
145 protected function printCodeComparisonBlock(DOMNode $node)
|
Chris@0
|
146 {
|
Chris@0
|
147 $codeBlocks = $node->getElementsByTagName('code');
|
Chris@0
|
148
|
Chris@0
|
149 $firstTitle = $codeBlocks->item(0)->getAttribute('title');
|
Chris@0
|
150 $first = trim($codeBlocks->item(0)->nodeValue);
|
Chris@0
|
151 $first = str_replace("\n", "\n ", $first);
|
Chris@0
|
152 $first = str_replace('<em>', '', $first);
|
Chris@0
|
153 $first = str_replace('</em>', '', $first);
|
Chris@0
|
154
|
Chris@0
|
155 $secondTitle = $codeBlocks->item(1)->getAttribute('title');
|
Chris@0
|
156 $second = trim($codeBlocks->item(1)->nodeValue);
|
Chris@0
|
157 $second = str_replace("\n", "\n ", $second);
|
Chris@0
|
158 $second = str_replace('<em>', '', $second);
|
Chris@0
|
159 $second = str_replace('</em>', '', $second);
|
Chris@0
|
160
|
Chris@0
|
161 echo ' <table>'.PHP_EOL;
|
Chris@0
|
162 echo ' <tr>'.PHP_EOL;
|
Chris@0
|
163 echo " <th>$firstTitle</th>".PHP_EOL;
|
Chris@0
|
164 echo " <th>$secondTitle</th>".PHP_EOL;
|
Chris@0
|
165 echo ' </tr>'.PHP_EOL;
|
Chris@0
|
166 echo ' <tr>'.PHP_EOL;
|
Chris@0
|
167 echo '<td>'.PHP_EOL.PHP_EOL;
|
Chris@0
|
168 echo " $first".PHP_EOL.PHP_EOL;
|
Chris@0
|
169 echo '</td>'.PHP_EOL;
|
Chris@0
|
170 echo '<td>'.PHP_EOL.PHP_EOL;
|
Chris@0
|
171 echo " $second".PHP_EOL.PHP_EOL;
|
Chris@0
|
172 echo '</td>'.PHP_EOL;
|
Chris@0
|
173 echo ' </tr>'.PHP_EOL;
|
Chris@0
|
174 echo ' </table>'.PHP_EOL;
|
Chris@0
|
175
|
Chris@0
|
176 }//end printCodeComparisonBlock()
|
Chris@0
|
177
|
Chris@0
|
178
|
Chris@0
|
179 }//end class
|