]> git.llucax.com Git - software/bife/bife-all.git/blob - src/BIFE/Parser.php
66be14942130c7f985c6081a25faff7e72b611d2
[software/bife/bife-all.git] / src / BIFE / Parser.php
1 <?php
2 // vim: set expandtab tabstop=4 softtabstop=4 shiftwidth=4:
3 // +--------------------------------------------------------------------+
4 // |                       BIFE - Buil It FastEr                        |
5 // +--------------------------------------------------------------------+
6 // | This file is part of BIFE.                                         |
7 // |                                                                    |
8 // | BIFE is free software; you can redistribute it and/or modify it    |
9 // | under the terms of the GNU General Public License as published by  |
10 // | the Free Software Foundation; either version 2 of the License, or  |
11 // | (at your option) any later version.                                |
12 // |                                                                    |
13 // | BIFE is distributed in the hope that it will be useful, but        |
14 // | WITHOUT ANY WARRANTY; without even the implied warranty of         |
15 // | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU   |
16 // | General Public License for more details.                           |
17 // |                                                                    |
18 // | You should have received a copy of the GNU General Public License  |
19 // | along with Hooks; if not, write to the Free Software Foundation,   |
20 // | Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA      |
21 // +--------------------------------------------------------------------+
22 // | Created: Wed May 17 18:16:54 ART 2003                              |
23 // | Authors: Leandro Lucarella <luca@lugmen.org.ar>                    |
24 // +--------------------------------------------------------------------+
25 //
26 // $Id$
27 //
28
29 // +X2C Class 25 :Parser
30 /**
31  * This is the XML Parser.
32  *
33  * @access public
34  */
35 class BIFE_Parser {
36     /**
37      * Top level widget.
38      *
39      * @var    BIFE_Widget $root
40      * @access public
41      */
42     var $root;
43
44     /**
45      * XML parser resource.
46      *
47      * @var    resource $parser
48      * @access public
49      */
50     var $parser;
51
52     /**
53      * BIFE widgets stack.
54      *
55      * @var    array $stack
56      * @access public
57      */
58     var $stack;
59
60     /**
61      * @var    string $fallback
62      * @access public
63      */
64     var $fallback;
65
66     // ~X2C
67
68     // +X2C Operation 30
69     /**
70      * Constructor.
71      *
72      * @param  string $fallback Fallback class name (none if empty).
73      *
74      * @return void
75      * @access public
76      */
77     function BIFE_Parser($fallback = '') // ~X2C
78     {
79         $this->__construct($fallback);
80     }
81     // -X2C
82
83     // +X2C Operation 31
84     /**
85      * Constructor.
86      *
87      * @param  string $fallback Fallback class name (none if empty).
88      *
89      * @return void
90      * @access public
91      */
92     function __construct($fallback = '') // ~X2C
93     {
94         $this->stack    = array();
95         $this->root     = null;
96         $this->parser   = xml_parser_create();
97         $this->fallback = $fallback;
98         xml_set_object($this->parser, $this);
99         xml_set_element_handler($this->parser, 'startElement', 'endElement');
100         xml_set_character_data_handler($this->parser, 'characterData');
101     }
102     // -X2C
103
104     // +X2C Operation 32
105     /**
106      * Destructor.
107      *
108      * @return void
109      * @access public
110      */
111     function __destruct() // ~X2C
112     {
113         xml_parser_free($this->parser);
114     }
115     // -X2C
116
117     // +X2C Operation 33
118     /**
119      * XML parser start of element handler.
120      *
121      * @param  resource $parser XML parser resource.
122      * @param  string $name XML tag name.
123      * @param  array $attrs XML tag attributes.
124      *
125      * @return void
126      * @access public
127      */
128     function startElement($parser, $name, $attrs) // ~X2C
129     {
130         $class = "BIFE_$name";
131         if (class_exists($class)) {
132             $obj =& new $class($attrs);
133             if (!is_a($obj, 'bife_widget')) {
134                 trigger_error("Class '$class' is not a BIFE_Widget.", E_USER_WARNING);
135             }
136             $this->stack[] =& $obj;
137         } else {
138             if ($this->fallback) {
139                 $class = $this->fallback;
140                 $obj =& new $class($name, $attrs);
141                 if (!is_a($obj, 'bife_fallback')) {
142                     trigger_error("Class '$class' is not a BIFE_Fallback.", E_USER_WARNING);
143                 }
144                 $this->stack[] =& $obj;
145             } else {
146                 trigger_error("Class not found '$class'.", E_USER_ERROR);
147             }
148         }
149     }
150     // -X2C
151
152     // +X2C Operation 34
153     /**
154      * XML parser end of element handler.
155      *
156      * @param  resource $parser XML parser resource.
157      * @param  string $name XML tag name.
158      *
159      * @return void
160      * @access public
161      */
162     function endElement($parser, $name) // ~X2C
163     {
164         end($this->stack);
165         $current =& $this->stack[key($this->stack)];
166         array_pop($this->stack);
167         end($this->stack);
168         $parent =& $this->stack[key($this->stack)];
169         if ($parent) {
170             $parent->addContents($current);
171         } else {
172             $this->root =& $current;
173         }
174     }
175     // -X2C
176
177     // +X2C Operation 35
178     /**
179      * XML parser character data handler.
180      *
181      * @param  resource $parser XML parser resource.
182      * @param  string $data XML character data.
183      *
184      * @return void
185      * @access public
186      */
187     function characterData($parser, $data) // ~X2C
188     {
189         end($this->stack);
190         $current =& $this->stack[key($this->stack)];
191         $current->addContents($data);
192     }
193     // -X2C
194
195     // +X2C Operation 36
196     /**
197      * Parse a string with XML data.
198      *
199      * @param  string $data XML string to parse.
200      * @param  bool $final Indicates if is the last string to parse.
201      *
202      * @return void
203      * @access public
204      */
205     function parse($data, $final = true) // ~X2C
206     {
207         if (!xml_parse($this->parser, $data, $final)) {
208             trigger_error(
209                 sprintf('XML error: %s at line %d.',
210                     xml_error_string(xml_get_error_code($this->parser)),
211                     xml_get_current_line_number($this->parser)
212                 ),
213                 E_USER_WARNING
214             );
215         }
216     }
217     // -X2C
218
219     // +X2C Operation 37
220     /**
221      * Parse a XML file with a complete and valid XML document.
222      *
223      * @param  string $filename Filename to parse.
224      *
225      * @return &BIFE_Widget
226      * @access public
227      */
228     function &parseFile($filename) // ~X2C
229     {
230         if ($fp = @fopen($filename, "r")) {
231             while ($data = fread($fp, 4096)) {
232                 $this->parse($data, feof($fp));
233             }
234         } else {
235             trigger_error("Could not open BIFE XML input file '$filename'.",
236                 E_USER_WARNING);
237         }
238         fclose($fp);
239         return $this->root;
240     }
241     // -X2C
242
243
244     // +X2C Operation 74
245     /**
246      * Parse a XML string with a complete and valid XML document.
247      *
248      * @param  string $data XML data to parse.
249      *
250      * @return &BIFE_Widget
251      * @access public
252      */
253     function &parseString($data) // ~X2C
254     {
255         $this->parse($data, true);
256         return $this->root;
257     }
258     // -X2C
259
260 } // -X2C Class :Parser
261
262 ?>