Chris@0
|
1 <?php
|
Chris@0
|
2 /**
|
Chris@0
|
3 * The base class for all PHP_CodeSniffer documentation generators.
|
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 Greg Sherwood <gsherwood@squiz.net>
|
Chris@0
|
10 * @author Marc McIntyre <mmcintyre@squiz.net>
|
Chris@0
|
11 * @copyright 2006-2014 Squiz Pty Ltd (ABN 77 084 670 600)
|
Chris@0
|
12 * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence
|
Chris@0
|
13 * @link http://pear.php.net/package/PHP_CodeSniffer
|
Chris@0
|
14 */
|
Chris@0
|
15
|
Chris@0
|
16 /**
|
Chris@0
|
17 * The base class for all PHP_CodeSniffer documentation generators.
|
Chris@0
|
18 *
|
Chris@0
|
19 * Documentation generators are used to print documentation about code sniffs
|
Chris@0
|
20 * in a standard.
|
Chris@0
|
21 *
|
Chris@0
|
22 * @category PHP
|
Chris@0
|
23 * @package PHP_CodeSniffer
|
Chris@0
|
24 * @author Greg Sherwood <gsherwood@squiz.net>
|
Chris@0
|
25 * @author Marc McIntyre <mmcintyre@squiz.net>
|
Chris@0
|
26 * @copyright 2006-2014 Squiz Pty Ltd (ABN 77 084 670 600)
|
Chris@0
|
27 * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence
|
Chris@0
|
28 * @version Release: @package_version@
|
Chris@0
|
29 * @link http://pear.php.net/package/PHP_CodeSniffer
|
Chris@0
|
30 */
|
Chris@0
|
31 abstract class PHP_CodeSniffer_DocGenerators_Generator
|
Chris@0
|
32 {
|
Chris@0
|
33
|
Chris@0
|
34 /**
|
Chris@0
|
35 * The name of the coding standard we are generating docs for.
|
Chris@0
|
36 *
|
Chris@0
|
37 * @var string
|
Chris@0
|
38 */
|
Chris@0
|
39 private $_standard = '';
|
Chris@0
|
40
|
Chris@0
|
41 /**
|
Chris@0
|
42 * An array of sniffs that we are limiting the generated docs to.
|
Chris@0
|
43 *
|
Chris@0
|
44 * If this array is empty, docs are generated for all sniffs in the
|
Chris@0
|
45 * supplied coding standard.
|
Chris@0
|
46 *
|
Chris@0
|
47 * @var string
|
Chris@0
|
48 */
|
Chris@0
|
49 private $_sniffs = array();
|
Chris@0
|
50
|
Chris@0
|
51
|
Chris@0
|
52 /**
|
Chris@0
|
53 * Constructs a PHP_CodeSniffer_DocGenerators_Generator object.
|
Chris@0
|
54 *
|
Chris@0
|
55 * @param string $standard The name of the coding standard to generate
|
Chris@0
|
56 * docs for.
|
Chris@0
|
57 * @param array $sniffs An array of sniffs that we are limiting the
|
Chris@0
|
58 * generated docs to.
|
Chris@0
|
59 *
|
Chris@0
|
60 * @see generate()
|
Chris@0
|
61 */
|
Chris@0
|
62 public function __construct($standard, array $sniffs=array())
|
Chris@0
|
63 {
|
Chris@0
|
64 $this->_standard = $standard;
|
Chris@0
|
65 $this->_sniffs = $sniffs;
|
Chris@0
|
66
|
Chris@0
|
67 }//end __construct()
|
Chris@0
|
68
|
Chris@0
|
69
|
Chris@0
|
70 /**
|
Chris@0
|
71 * Retrieves the title of the sniff from the DOMNode supplied.
|
Chris@0
|
72 *
|
Chris@0
|
73 * @param DOMNode $doc The DOMNode object for the sniff.
|
Chris@0
|
74 * It represents the "documentation" tag in the XML
|
Chris@0
|
75 * standard file.
|
Chris@0
|
76 *
|
Chris@0
|
77 * @return string
|
Chris@0
|
78 */
|
Chris@0
|
79 protected function getTitle(DOMNode $doc)
|
Chris@0
|
80 {
|
Chris@0
|
81 return $doc->getAttribute('title');
|
Chris@0
|
82
|
Chris@0
|
83 }//end getTitle()
|
Chris@0
|
84
|
Chris@0
|
85
|
Chris@0
|
86 /**
|
Chris@0
|
87 * Retrieves the name of the standard we are generating docs for.
|
Chris@0
|
88 *
|
Chris@0
|
89 * @return string
|
Chris@0
|
90 */
|
Chris@0
|
91 protected function getStandard()
|
Chris@0
|
92 {
|
Chris@0
|
93 return $this->_standard;
|
Chris@0
|
94
|
Chris@0
|
95 }//end getStandard()
|
Chris@0
|
96
|
Chris@0
|
97
|
Chris@0
|
98 /**
|
Chris@0
|
99 * Generates the documentation for a standard.
|
Chris@0
|
100 *
|
Chris@0
|
101 * It's probably wise for doc generators to override this method so they
|
Chris@0
|
102 * have control over how the docs are produced. Otherwise, the processSniff
|
Chris@0
|
103 * method should be overridden to output content for each sniff.
|
Chris@0
|
104 *
|
Chris@0
|
105 * @return void
|
Chris@0
|
106 * @see processSniff()
|
Chris@0
|
107 */
|
Chris@0
|
108 public function generate()
|
Chris@0
|
109 {
|
Chris@0
|
110 $standardFiles = $this->getStandardFiles();
|
Chris@0
|
111
|
Chris@0
|
112 foreach ($standardFiles as $standard) {
|
Chris@0
|
113 $doc = new DOMDocument();
|
Chris@0
|
114 $doc->load($standard);
|
Chris@0
|
115 $documentation = $doc->getElementsByTagName('documentation')->item(0);
|
Chris@0
|
116 $this->processSniff($documentation);
|
Chris@0
|
117 }
|
Chris@0
|
118
|
Chris@0
|
119 }//end generate()
|
Chris@0
|
120
|
Chris@0
|
121
|
Chris@0
|
122 /**
|
Chris@0
|
123 * Returns a list of paths to XML standard files for all sniffs in a standard.
|
Chris@0
|
124 *
|
Chris@0
|
125 * Any sniffs that do not have an XML standard file are obviously not included
|
Chris@0
|
126 * in the returned array. If documentation is only being generated for some
|
Chris@0
|
127 * sniffs (ie. $this->_sniffs is not empty) then all others sniffs will
|
Chris@0
|
128 * be filtered from the results as well.
|
Chris@0
|
129 *
|
Chris@0
|
130 * @return string[]
|
Chris@0
|
131 */
|
Chris@0
|
132 protected function getStandardFiles()
|
Chris@0
|
133 {
|
Chris@0
|
134 $phpcs = new PHP_CodeSniffer();
|
Chris@0
|
135 $phpcs->process(array(), $this->_standard);
|
Chris@0
|
136 $sniffs = $phpcs->getSniffs();
|
Chris@0
|
137
|
Chris@0
|
138 $standardFiles = array();
|
Chris@0
|
139 foreach ($sniffs as $className => $sniffClass) {
|
Chris@0
|
140 $object = new ReflectionObject($sniffClass);
|
Chris@0
|
141 $sniff = $object->getFilename();
|
Chris@0
|
142 if (empty($this->_sniffs) === false) {
|
Chris@0
|
143 // We are limiting the docs to certain sniffs only, so filter
|
Chris@0
|
144 // out any unwanted sniffs.
|
Chris@0
|
145 $parts = explode('_', $className);
|
Chris@0
|
146 $sniffName = $parts[0].'.'.$parts[2].'.'.substr($parts[3], 0, -5);
|
Chris@0
|
147 if (in_array($sniffName, $this->_sniffs) === false) {
|
Chris@0
|
148 continue;
|
Chris@0
|
149 }
|
Chris@0
|
150 }
|
Chris@0
|
151
|
Chris@0
|
152 $standardFile = str_replace(
|
Chris@0
|
153 DIRECTORY_SEPARATOR.'Sniffs'.DIRECTORY_SEPARATOR,
|
Chris@0
|
154 DIRECTORY_SEPARATOR.'Docs'.DIRECTORY_SEPARATOR,
|
Chris@0
|
155 $sniff
|
Chris@0
|
156 );
|
Chris@0
|
157 $standardFile = str_replace('Sniff.php', 'Standard.xml', $standardFile);
|
Chris@0
|
158
|
Chris@0
|
159 if (is_file($standardFile) === true) {
|
Chris@0
|
160 $standardFiles[] = $standardFile;
|
Chris@0
|
161 }
|
Chris@0
|
162 }//end foreach
|
Chris@0
|
163
|
Chris@0
|
164 return $standardFiles;
|
Chris@0
|
165
|
Chris@0
|
166 }//end getStandardFiles()
|
Chris@0
|
167
|
Chris@0
|
168
|
Chris@0
|
169 /**
|
Chris@0
|
170 * Process the documentation for a single sniff.
|
Chris@0
|
171 *
|
Chris@0
|
172 * Doc generators must implement this function to produce output.
|
Chris@0
|
173 *
|
Chris@0
|
174 * @param DOMNode $doc The DOMNode object for the sniff.
|
Chris@0
|
175 * It represents the "documentation" tag in the XML
|
Chris@0
|
176 * standard file.
|
Chris@0
|
177 *
|
Chris@0
|
178 * @return void
|
Chris@0
|
179 * @see generate()
|
Chris@0
|
180 */
|
Chris@0
|
181 protected abstract function processSniff(DOMNode $doc);
|
Chris@0
|
182
|
Chris@0
|
183
|
Chris@0
|
184 }//end class
|