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