]> git.llucax.com Git - software/bife/bife-all.git/blob - src/BIFE/Parser.php
- Added a roadmap.
[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      * Template to use to render the parsed file.
54      *
55      * @var    HTML_Template_Sigma $template
56      * @access public
57      */
58     var $template;
59
60     /**
61      * BIFE widgets stack.
62      *
63      * @var    array $stack
64      * @access public
65      */
66     var $stack;
67
68     // ~X2C
69
70     // +X2C Operation 30
71     /**
72      * Constructor.
73      *
74      * @return void
75      * @access public
76      */
77     function BIFE_Parser() // ~X2C
78     {
79         $this->__construct($template);
80     }
81     // -X2C
82
83     // +X2C Operation 31
84     /**
85      * Constructor.
86      *
87      * @return void
88      * @access public
89      */
90     function __construct() // ~X2C
91     {
92         $this->stack    = array();
93         $this->root     = null;
94         $this->parser   = xml_parser_create();
95         $this->template =& $template;
96         xml_set_object($this->parser, $this);
97         xml_set_element_handler($this->parser, 'startElement', 'endElement');
98         xml_set_character_data_handler($this->parser, 'characterData');
99     }
100     // -X2C
101
102     // +X2C Operation 32
103     /**
104      * Destructor.
105      *
106      * @return void
107      * @access public
108      */
109     function __destruct() // ~X2C
110     {
111         xml_parser_free($this->parser);
112     }
113     // -X2C
114
115     // +X2C Operation 33
116     /**
117      * XML parser start of element handler.
118      *
119      * @param  resource $parser XML parser resource.
120      * @param  string $name XML tag name.
121      * @param  array $attrs XML tag attributes.
122      *
123      * @return void
124      * @access public
125      */
126     function startElement($parser, $name, $attrs) // ~X2C
127     {
128         $class = "BIFE_$name";
129         if (!class_exists($class)) {
130             include_once 'BIFE/' . ucfirst(strtolower($name)) . '.php';
131         }
132         if (class_exists($class)) {
133             $obj =& new $class($attrs);
134             if (!is_a($obj, 'bife_widget')) {
135                 trigger_error("Class '$class' is not a BIFE_Widget.", E_USER_WARNING);
136             }
137             $this->stack[] =& $obj;
138         } else {
139             trigger_error("Class not found '$class'.", E_USER_ERROR);
140         }
141     }
142     // -X2C
143
144     // +X2C Operation 34
145     /**
146      * XML parser end of element handler.
147      *
148      * @param  resource $parser XML parser resource.
149      * @param  string $name XML tag name.
150      *
151      * @return void
152      * @access public
153      */
154     function endElement($parser, $name) // ~X2C
155     {
156         end($this->stack);
157         $current =& $this->stack[key($this->stack)];
158         array_pop($this->stack);
159         end($this->stack);
160         $parent =& $this->stack[key($this->stack)];
161         if ($parent) {
162             $parent->addContents($current);
163         } else {
164             $this->root =& $current;
165         }
166     }
167     // -X2C
168
169     // +X2C Operation 35
170     /**
171      * XML parser character data handler.
172      *
173      * @param  resource $parser XML parser resource.
174      * @param  string $data XML character data.
175      *
176      * @return void
177      * @access public
178      */
179     function characterData($parser, $data) // ~X2C
180     {
181         end($this->stack);
182         $current =& $this->stack[key($this->stack)];
183         $current->addContents($data);
184     }
185     // -X2C
186
187     // +X2C Operation 36
188     /**
189      * Parse a string with XML data.
190      *
191      * @param  string $data XML string to parse.
192      * @param  bool $final Indicates if is the last string to parse.
193      *
194      * @return void
195      * @access public
196      */
197     function parse($data, $final = true) // ~X2C
198     {
199         if (!xml_parse($this->parser, $data, $final)) {
200             trigger_error(
201                 sprintf('XML error: %s at line %d.',
202                     xml_error_string(xml_get_error_code($this->parser)),
203                     xml_get_current_line_number($this->parser)
204                 ),
205                 E_USER_WARNING
206             );
207         }
208     }
209     // -X2C
210
211     // +X2C Operation 37
212     /**
213      * Parse a XML file with a complete and valid XML document.
214      *
215      * @param  string $filename Filename to parse.
216      *
217      * @return &BIFE_Widget
218      * @access public
219      */
220     function &parseFile($filename) // ~X2C
221     {
222         if ($fp = @fopen($filename, "r")) {
223             while ($data = fread($fp, 4096)) {
224                 $this->parse($data, feof($fp));
225             }
226         } else {
227             trigger_error("Could not open BIFE XML input file '$filename'.",
228                 E_USER_WARNING);
229         }
230         fclose($fp);
231         return $this->root;
232     }
233     // -X2C
234
235
236     // +X2C Operation 74
237     /**
238      * Parse a XML string with a complete and valid XML document.
239      *
240      * @param  string $data XML data to parse.
241      *
242      * @return &BIFE_Widget
243      * @access public
244      */
245     function &parseString($data) // ~X2C
246     {
247         $this->parse($data, true);
248         return $this->root;
249     }
250     // -X2C
251
252 } // -X2C Class :Parser
253
254 ?>