]> git.llucax.com Git - software/bife/bife-all.git/blob - src/BIFE/Parser.php
- Added experimental phing build file.
[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             @include_once 'BIFE/' . ucfirst(strtolower($name)) . '.php';
133         }
134         if (class_exists($class)) {
135             $obj =& new $class($attrs);
136             if (!is_a($obj, 'bife_widget')) {
137                 trigger_error("Class '$class' is not a BIFE_Widget.", E_USER_WARNING);
138             }
139             $this->stack[] =& $obj;
140         } else {
141             if ($this->fallback) {
142                 $class = $this->fallback;
143                 $obj =& new $class($name, $attrs);
144                 if (!is_a($obj, 'bife_fallback')) {
145                     trigger_error("Class '$class' is not a BIFE_Fallback.", E_USER_WARNING);
146                 }
147                 $this->stack[] =& $obj;
148             } else {
149                 trigger_error("Class not found '$class'.", E_USER_ERROR);
150             }
151         }
152     }
153     // -X2C
154
155     // +X2C Operation 34
156     /**
157      * XML parser end of element handler.
158      *
159      * @param  resource $parser XML parser resource.
160      * @param  string $name XML tag name.
161      *
162      * @return void
163      * @access public
164      */
165     function endElement($parser, $name) // ~X2C
166     {
167         end($this->stack);
168         $current =& $this->stack[key($this->stack)];
169         array_pop($this->stack);
170         end($this->stack);
171         $parent =& $this->stack[key($this->stack)];
172         if ($parent) {
173             $parent->addContents($current);
174         } else {
175             $this->root =& $current;
176         }
177     }
178     // -X2C
179
180     // +X2C Operation 35
181     /**
182      * XML parser character data handler.
183      *
184      * @param  resource $parser XML parser resource.
185      * @param  string $data XML character data.
186      *
187      * @return void
188      * @access public
189      */
190     function characterData($parser, $data) // ~X2C
191     {
192         end($this->stack);
193         $current =& $this->stack[key($this->stack)];
194         $current->addContents($data);
195     }
196     // -X2C
197
198     // +X2C Operation 36
199     /**
200      * Parse a string with XML data.
201      *
202      * @param  string $data XML string to parse.
203      * @param  bool $final Indicates if is the last string to parse.
204      *
205      * @return void
206      * @access public
207      */
208     function parse($data, $final = true) // ~X2C
209     {
210         if (!xml_parse($this->parser, $data, $final)) {
211             trigger_error(
212                 sprintf('XML error: %s at line %d.',
213                     xml_error_string(xml_get_error_code($this->parser)),
214                     xml_get_current_line_number($this->parser)
215                 ),
216                 E_USER_WARNING
217             );
218         }
219     }
220     // -X2C
221
222     // +X2C Operation 37
223     /**
224      * Parse a XML file with a complete and valid XML document.
225      *
226      * @param  string $filename Filename to parse.
227      *
228      * @return &BIFE_Widget
229      * @access public
230      */
231     function &parseFile($filename) // ~X2C
232     {
233         if ($fp = @fopen($filename, "r")) {
234             while ($data = fread($fp, 4096)) {
235                 $this->parse($data, feof($fp));
236             }
237         } else {
238             trigger_error("Could not open BIFE XML input file '$filename'.",
239                 E_USER_WARNING);
240         }
241         fclose($fp);
242         return $this->root;
243     }
244     // -X2C
245
246
247     // +X2C Operation 74
248     /**
249      * Parse a XML string with a complete and valid XML document.
250      *
251      * @param  string $data XML data to parse.
252      *
253      * @return &BIFE_Widget
254      * @access public
255      */
256     function &parseString($data) // ~X2C
257     {
258         $this->parse($data, true);
259         return $this->root;
260     }
261     // -X2C
262
263 } // -X2C Class :Parser
264
265 ?>