1<?php
2/* vim: set expandtab tabstop=4 shiftwidth=4: */
3//
4// +----------------------------------------------------------------------+
5// | PHP Version 4                                                        |
6// +----------------------------------------------------------------------+
7// | Copyright (c) 1997-2002 The PHP Group                                |
8// +----------------------------------------------------------------------+
9// | This source file is subject to version 2.02 of the PHP license,      |
10// | that is bundled with this package in the file LICENSE, and is        |
11// | available at through the world-wide-web at                           |
12// | http://www.php.net/license/3_0.txt.                                  |
13// | If you did not receive a copy of the PHP license and are unable to   |
14// | obtain it through the world-wide-web, please send a note to          |
15// | license@php.net so we can mail you a copy immediately.               |
16// +----------------------------------------------------------------------+
17// | Authors: Alexander Zhukov <alex@veresk.ru> Original port from Python |
18// | Authors: Harry Fuecks <hfuecks@phppatterns.com> Port to PEAR + more  |
19// | Authors: Many @ Sitepointforums Advanced PHP Forums                  |
20// +----------------------------------------------------------------------+
21//
22// $Id: XML_HTMLSax_Decorators.php,v 1.6 2003/12/04 23:35:20 harryf Exp $
23//
24/**
25* Decorators for dealing with parser options
26* @package XML_HTMLSax
27* @version $Id: XML_HTMLSax_Decorators.php,v 1.6 2003/12/04 23:35:20 harryf Exp $
28* @see XML_HTMLSax::set_option
29*/
30/**
31* Trims the contents of element data from whitespace at start and end
32* @package XML_HTMLSax
33* @access protected
34*/
35class XML_HTMLSax_Trim {
36    /**
37    * Original handler object
38    * @var object
39    * @access private
40    */
41    var $orig_obj;
42    /**
43    * Original handler method
44    * @var string
45    * @access private
46    */
47    var $orig_method;
48    /**
49    * Constructs XML_HTMLSax_Trim
50    * @param object handler object being decorated
51    * @param string original handler method
52    * @access protected
53    */
54    function XML_HTMLSax_Trim(&$orig_obj, $orig_method) {
55        $this->orig_obj =& $orig_obj;
56        $this->orig_method = $orig_method;
57    }
58    /**
59    * Trims the data
60    * @param XML_HTMLSax
61    * @param string element data
62    * @access protected
63    */
64    function trimData(&$parser, $data) {
65        $data = trim($data);
66        if ($data != '') {
67            $this->orig_obj->{$this->orig_method}($parser, $data);
68        }
69    }
70}
71/**
72* Coverts tag names to upper case
73* @package XML_HTMLSax
74* @access protected
75*/
76class XML_HTMLSax_CaseFolding {
77    /**
78    * Original handler object
79    * @var object
80    * @access private
81    */
82    var $orig_obj;
83    /**
84    * Original open handler method
85    * @var string
86    * @access private
87    */
88    var $orig_open_method;
89    /**
90    * Original close handler method
91    * @var string
92    * @access private
93    */
94    var $orig_close_method;
95    /**
96    * Constructs XML_HTMLSax_CaseFolding
97    * @param object handler object being decorated
98    * @param string original open handler method
99    * @param string original close handler method
100    * @access protected
101    */
102    function XML_HTMLSax_CaseFolding(&$orig_obj, $orig_open_method, $orig_close_method) {
103        $this->orig_obj =& $orig_obj;
104        $this->orig_open_method = $orig_open_method;
105        $this->orig_close_method = $orig_close_method;
106    }
107    /**
108    * Folds up open tag callbacks
109    * @param XML_HTMLSax
110    * @param string tag name
111    * @param array tag attributes
112    * @access protected
113    */
114    function foldOpen(&$parser, $tag, $attrs=array(), $empty = FALSE) {
115        $this->orig_obj->{$this->orig_open_method}($parser, strtoupper($tag), $attrs, $empty);
116    }
117    /**
118    * Folds up close tag callbacks
119    * @param XML_HTMLSax
120    * @param string tag name
121    * @access protected
122    */
123    function foldClose(&$parser, $tag, $empty = FALSE) {
124        $this->orig_obj->{$this->orig_close_method}($parser, strtoupper($tag), $empty);
125    }
126}
127/**
128* Breaks up data by linefeed characters, resulting in additional
129* calls to the data handler
130* @package XML_HTMLSax
131* @access protected
132*/
133class XML_HTMLSax_Linefeed {
134    /**
135    * Original handler object
136    * @var object
137    * @access private
138    */
139    var $orig_obj;
140    /**
141    * Original handler method
142    * @var string
143    * @access private
144    */
145    var $orig_method;
146    /**
147    * Constructs XML_HTMLSax_LineFeed
148    * @param object handler object being decorated
149    * @param string original handler method
150    * @access protected
151    */
152    function XML_HTMLSax_LineFeed(&$orig_obj, $orig_method) {
153        $this->orig_obj =& $orig_obj;
154        $this->orig_method = $orig_method;
155    }
156    /**
157    * Breaks the data up by linefeeds
158    * @param XML_HTMLSax
159    * @param string element data
160    * @access protected
161    */
162    function breakData(&$parser, $data) {
163        $data = explode("\n",$data);
164        foreach ( $data as $chunk ) {
165            $this->orig_obj->{$this->orig_method}($parser, $chunk);
166        }
167    }
168}
169/**
170* Breaks up data by tab characters, resulting in additional
171* calls to the data handler
172* @package XML_HTMLSax
173* @access protected
174*/
175class XML_HTMLSax_Tab {
176    /**
177    * Original handler object
178    * @var object
179    * @access private
180    */
181    var $orig_obj;
182    /**
183    * Original handler method
184    * @var string
185    * @access private
186    */
187    var $orig_method;
188    /**
189    * Constructs XML_HTMLSax_Tab
190    * @param object handler object being decorated
191    * @param string original handler method
192    * @access protected
193    */
194    function XML_HTMLSax_Tab(&$orig_obj, $orig_method) {
195        $this->orig_obj =& $orig_obj;
196        $this->orig_method = $orig_method;
197    }
198    /**
199    * Breaks the data up by linefeeds
200    * @param XML_HTMLSax
201    * @param string element data
202    * @access protected
203    */
204    function breakData(&$parser, $data) {
205        $data = explode("\t",$data);
206        foreach ( $data as $chunk ) {
207            $this->orig_obj->{$this->orig_method}($this, $chunk);
208        }
209    }
210}
211/**
212* Breaks up data by XML entities and parses them with html_entity_decode(),
213* resulting in additional calls to the data handler<br />
214* Requires PHP 4.3.0+
215* @package XML_HTMLSax
216* @access protected
217*/
218class XML_HTMLSax_Entities_Parsed {
219    /**
220    * Original handler object
221    * @var object
222    * @access private
223    */
224    var $orig_obj;
225    /**
226    * Original handler method
227    * @var string
228    * @access private
229    */
230    var $orig_method;
231    /**
232    * Constructs XML_HTMLSax_Entities_Parsed
233    * @param object handler object being decorated
234    * @param string original handler method
235    * @access protected
236    */
237    function XML_HTMLSax_Entities_Parsed(&$orig_obj, $orig_method) {
238        $this->orig_obj =& $orig_obj;
239        $this->orig_method = $orig_method;
240    }
241    /**
242    * Breaks the data up by XML entities
243    * @param XML_HTMLSax
244    * @param string element data
245    * @access protected
246    */
247    function breakData(&$parser, $data) {
248        $data = preg_split('/(&.+?;)/',$data,-1,PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
249        foreach ( $data as $chunk ) {
250            $chunk = html_entity_decode($chunk,ENT_NOQUOTES);
251            $this->orig_obj->{$this->orig_method}($this, $chunk);
252        }
253    }
254}
255/**
256* Compatibility with older PHP versions
257*/
258if (version_compare(phpversion(), '4.3', '<') && !function_exists('html_entity_decode') ) {
259    function html_entity_decode($str, $style=ENT_NOQUOTES) {
260        return strtr($str,
261            array_flip(get_html_translation_table(HTML_ENTITIES,$style)));
262    }
263}
264/**
265* Breaks up data by XML entities but leaves them unparsed,
266* resulting in additional calls to the data handler<br />
267* @package XML_HTMLSax
268* @access protected
269*/
270class XML_HTMLSax_Entities_Unparsed {
271    /**
272    * Original handler object
273    * @var object
274    * @access private
275    */
276    var $orig_obj;
277    /**
278    * Original handler method
279    * @var string
280    * @access private
281    */
282    var $orig_method;
283    /**
284    * Constructs XML_HTMLSax_Entities_Unparsed
285    * @param object handler object being decorated
286    * @param string original handler method
287    * @access protected
288    */
289    function XML_HTMLSax_Entities_Unparsed(&$orig_obj, $orig_method) {
290        $this->orig_obj =& $orig_obj;
291        $this->orig_method = $orig_method;
292    }
293    /**
294    * Breaks the data up by XML entities
295    * @param XML_HTMLSax
296    * @param string element data
297    * @access protected
298    */
299    function breakData(&$parser, $data) {
300        $data = preg_split('/(&.+?;)/',$data,-1,PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
301        foreach ( $data as $chunk ) {
302            $this->orig_obj->{$this->orig_method}($this, $chunk);
303        }
304    }
305}
306?>