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