1 : <?php
2 :
3 :
4 :
5 :
6 :
7 :
8 :
9 :
10 :
11 :
12 :
13 :
14 :
15 :
16 :
17 :
18 :
19 :
20 :
21 :
22 :
23 :
24 :
25 :
26 :
27 :
28 :
29 :
30 :
31 :
32 :
33 :
34 :
35 :
36 :
37 : abstract class CodeParserItem extends ParserItem {
38 : public $authors;
39 : public $since;
40 : public $tables;
41 : public $see;
42 : public $info_tags;
43 : public $linenum = 0;
44 :
45 : protected $docblock_tags;
46 :
47 :
48 :
49 :
50 :
51 : abstract protected function processSpecificDocblockTags($docblock_tags);
52 2 :
53 :
54 7 :
55 7 :
56 :
57 :
58 :
59 :
60 : public function treeWalk($function_name, ParserItem $parent_item = null)
61 100 : {
62 78 : call_user_func($function_name, $this, $parent_item);
63 78 : }
64 :
65 :
66 38 :
67 :
68 :
69 : protected function __construct()
70 : {
71 103 : parent::__construct();
72 :
73 103 : $this->docblock_tags = array();
74 103 : $this->authors = array();
75 103 : $this->since = null;
76 103 : $this->tables = array();
77 103 : $this->see = array();
78 103 : $this->info_tags = array();
79 103 : }
80 :
81 :
82 :
83 :
84 :
85 : public function applyComment($comment)
86 : {
87 46 : $this->docblock_tags = parse_doc_comment ($comment);
88 46 : }
89 :
90 1 :
91 :
92 :
93 :
94 : public function processTags()
95 : {
96 103 : $this->processGenericDocblockTags($this->docblock_tags);
97 103 : $this->processSpecificDocblockTags($this->docblock_tags);
98 103 : }
99 :
100 :
101 :
102 :
103 :
104 :
105 :
106 :
107 : public function cascadeTags($child)
108 : {
109 102 : $cascaseDocblockTags = array('@author', '@since');
110 :
111 102 : $child_tags = $child->getDocblockTags();
112 :
113 102 : foreach ($cascaseDocblockTags as $cascade_tag) {
114 102 : if (! in_array($cascade_tag, array_keys($child_tags))) {
115 102 : $child_tags[$cascade_tag] = @$this->docblock_tags[$cascade_tag];
116 102 : }
117 102 : }
118 :
119 102 : $child->setDocblockTags($child_tags);
120 102 : }
121 :
122 :
123 :
124 :
125 :
126 : public function getDocblockTags()
127 : {
128 103 : return $this->docblock_tags;
129 : }
130 :
131 :
132 :
133 :
134 :
135 :
136 :
137 : public function setDocblockTags($tags)
138 : {
139 102 : $this->docblock_tags = $tags;
140 102 : }
141 :
142 :
143 :
144 :
145 :
146 : protected function processGenericDocblockTags($docblock_tags)
147 : {
148 :
149 103 : if (@count($docblock_tags['@author']) > 0) {
150 :
151 :
152 :
153 :
154 :
155 :
156 :
157 :
158 5 : $expression = '/^((?:[a-z] ?)+)(?:\s*<([-a-z._]+@[-a-z.]+)>)?(?:\s*[,:;]?\s*(.*))?$/si';
159 :
160 5 : foreach ($docblock_tags['@author'] as $author) {
161 5 : if (preg_match($expression, $author, $matches)) {
162 5 : $author = new ParserAuthor();
163 5 : $author->name = $matches[1];
164 5 : $author->email = $matches[2];
165 5 : $author->description = $matches[3];
166 :
167 5 : $this->authors[] = $author;
168 5 : }
169 5 : }
170 5 : }
171 :
172 :
173 103 : if (@count($docblock_tags['@since']) > 0) {
174 6 : $this->since = $docblock_tags['@since'][0];
175 6 : }
176 :
177 :
178 103 : if (@count($docblock_tags['@table']) > 0) {
179 5 : $valid_actions = array('select', 'insert', 'update', 'delete');
180 :
181 5 : foreach ($docblock_tags['@table'] as $table_def) {
182 5 : if ($table_def == '') continue;
183 :
184 5 : $parts = explode(' ', $table_def, 3);
185 :
186 5 : $found_action = false;
187 5 : foreach ($valid_actions as $action) {
188 5 : if (strcasecmp($parts[0], $action) == 0) {
189 4 : $found_action = true;
190 4 : break;
191 : }
192 5 : }
193 :
194 :
195 5 : $table = new ParserTable();
196 :
197 5 : if ($found_action) {
198 4 : $table->action = strtoupper($parts[0]);
199 4 : $table->name = $parts[1];
200 4 : $table->description = $parts[2];
201 :
202 4 : } else {
203 1 : $table->name = $parts[0];
204 1 : $table->description = $parts[1] . ' ' . $parts[2];
205 : }
206 :
207 5 : $this->tables[] = $table;
208 5 : }
209 5 : }
210 :
211 :
212 103 : if (@count($docblock_tags['@see']) > 0) {
213 1 : foreach ($docblock_tags['@see'] as $see) {
214 1 : $this->see[] = $see;
215 1 : }
216 1 : }
217 :
218 :
219 103 : if (@count($docblock_tags['@tag']) > 0) {
220 3 : foreach ($docblock_tags['@tag'] as $info_tag) {
221 3 : $this->info_tags[] = $info_tag;
222 3 : }
223 3 : }
224 103 : }
225 :
226 :
227 :
228 :
229 :
230 : protected function dump()
231 : {
232 7 : echo '<br>Authors: '; foreach ($this->authors as $a) $a->dump();
233 7 : echo '<br>Tables: '; foreach ($this->tables as $a) $a->dump();
234 7 : echo '<br>Since: ', $this->since;
235 :
236 :
237 7 : }
238 :
239 :
240 : }
241 :
242 :
243 : ?>
|