]>
Commit | Line | Data |
---|---|---|
d4949327 NL |
1 | <?php\r |
2 | \r | |
3 | // OUT OF DATE, NEEDS UPDATING!\r | |
4 | // USE XMLWRITER!\r | |
5 | \r | |
6 | class HTMLPurifier_Printer\r | |
7 | {\r | |
8 | \r | |
9 | /**\r | |
10 | * For HTML generation convenience funcs.\r | |
11 | * @type HTMLPurifier_Generator\r | |
12 | */\r | |
13 | protected $generator;\r | |
14 | \r | |
15 | /**\r | |
16 | * For easy access.\r | |
17 | * @type HTMLPurifier_Config\r | |
18 | */\r | |
19 | protected $config;\r | |
20 | \r | |
21 | /**\r | |
22 | * Initialize $generator.\r | |
23 | */\r | |
24 | public function __construct()\r | |
25 | {\r | |
26 | }\r | |
27 | \r | |
28 | /**\r | |
29 | * Give generator necessary configuration if possible\r | |
30 | * @param HTMLPurifier_Config $config\r | |
31 | */\r | |
32 | public function prepareGenerator($config)\r | |
33 | {\r | |
34 | $all = $config->getAll();\r | |
35 | $context = new HTMLPurifier_Context();\r | |
36 | $this->generator = new HTMLPurifier_Generator($config, $context);\r | |
37 | }\r | |
38 | \r | |
39 | /**\r | |
40 | * Main function that renders object or aspect of that object\r | |
41 | * @note Parameters vary depending on printer\r | |
42 | */\r | |
43 | // function render() {}\r | |
44 | \r | |
45 | /**\r | |
46 | * Returns a start tag\r | |
47 | * @param string $tag Tag name\r | |
48 | * @param array $attr Attribute array\r | |
49 | * @return string\r | |
50 | */\r | |
51 | protected function start($tag, $attr = array())\r | |
52 | {\r | |
53 | return $this->generator->generateFromToken(\r | |
54 | new HTMLPurifier_Token_Start($tag, $attr ? $attr : array())\r | |
55 | );\r | |
56 | }\r | |
57 | \r | |
58 | /**\r | |
59 | * Returns an end tag\r | |
60 | * @param string $tag Tag name\r | |
61 | * @return string\r | |
62 | */\r | |
63 | protected function end($tag)\r | |
64 | {\r | |
65 | return $this->generator->generateFromToken(\r | |
66 | new HTMLPurifier_Token_End($tag)\r | |
67 | );\r | |
68 | }\r | |
69 | \r | |
70 | /**\r | |
71 | * Prints a complete element with content inside\r | |
72 | * @param string $tag Tag name\r | |
73 | * @param string $contents Element contents\r | |
74 | * @param array $attr Tag attributes\r | |
75 | * @param bool $escape whether or not to escape contents\r | |
76 | * @return string\r | |
77 | */\r | |
78 | protected function element($tag, $contents, $attr = array(), $escape = true)\r | |
79 | {\r | |
80 | return $this->start($tag, $attr) .\r | |
81 | ($escape ? $this->escape($contents) : $contents) .\r | |
82 | $this->end($tag);\r | |
83 | }\r | |
84 | \r | |
85 | /**\r | |
86 | * @param string $tag\r | |
87 | * @param array $attr\r | |
88 | * @return string\r | |
89 | */\r | |
90 | protected function elementEmpty($tag, $attr = array())\r | |
91 | {\r | |
92 | return $this->generator->generateFromToken(\r | |
93 | new HTMLPurifier_Token_Empty($tag, $attr)\r | |
94 | );\r | |
95 | }\r | |
96 | \r | |
97 | /**\r | |
98 | * @param string $text\r | |
99 | * @return string\r | |
100 | */\r | |
101 | protected function text($text)\r | |
102 | {\r | |
103 | return $this->generator->generateFromToken(\r | |
104 | new HTMLPurifier_Token_Text($text)\r | |
105 | );\r | |
106 | }\r | |
107 | \r | |
108 | /**\r | |
109 | * Prints a simple key/value row in a table.\r | |
110 | * @param string $name Key\r | |
111 | * @param mixed $value Value\r | |
112 | * @return string\r | |
113 | */\r | |
114 | protected function row($name, $value)\r | |
115 | {\r | |
116 | if (is_bool($value)) {\r | |
117 | $value = $value ? 'On' : 'Off';\r | |
118 | }\r | |
119 | return\r | |
120 | $this->start('tr') . "\n" .\r | |
121 | $this->element('th', $name) . "\n" .\r | |
122 | $this->element('td', $value) . "\n" .\r | |
123 | $this->end('tr');\r | |
124 | }\r | |
125 | \r | |
126 | /**\r | |
127 | * Escapes a string for HTML output.\r | |
128 | * @param string $string String to escape\r | |
129 | * @return string\r | |
130 | */\r | |
131 | protected function escape($string)\r | |
132 | {\r | |
133 | $string = HTMLPurifier_Encoder::cleanUTF8($string);\r | |
134 | $string = htmlspecialchars($string, ENT_COMPAT, 'UTF-8');\r | |
135 | return $string;\r | |
136 | }\r | |
137 | \r | |
138 | /**\r | |
139 | * Takes a list of strings and turns them into a single list\r | |
140 | * @param string[] $array List of strings\r | |
141 | * @param bool $polite Bool whether or not to add an end before the last\r | |
142 | * @return string\r | |
143 | */\r | |
144 | protected function listify($array, $polite = false)\r | |
145 | {\r | |
146 | if (empty($array)) {\r | |
147 | return 'None';\r | |
148 | }\r | |
149 | $ret = '';\r | |
150 | $i = count($array);\r | |
151 | foreach ($array as $value) {\r | |
152 | $i--;\r | |
153 | $ret .= $value;\r | |
154 | if ($i > 0 && !($polite && $i == 1)) {\r | |
155 | $ret .= ', ';\r | |
156 | }\r | |
157 | if ($polite && $i == 1) {\r | |
158 | $ret .= 'and ';\r | |
159 | }\r | |
160 | }\r | |
161 | return $ret;\r | |
162 | }\r | |
163 | \r | |
164 | /**\r | |
165 | * Retrieves the class of an object without prefixes, as well as metadata\r | |
166 | * @param object $obj Object to determine class of\r | |
167 | * @param string $sec_prefix Further prefix to remove\r | |
168 | * @return string\r | |
169 | */\r | |
170 | protected function getClass($obj, $sec_prefix = '')\r | |
171 | {\r | |
172 | static $five = null;\r | |
173 | if ($five === null) {\r | |
174 | $five = version_compare(PHP_VERSION, '5', '>=');\r | |
175 | }\r | |
176 | $prefix = 'HTMLPurifier_' . $sec_prefix;\r | |
177 | if (!$five) {\r | |
178 | $prefix = strtolower($prefix);\r | |
179 | }\r | |
180 | $class = str_replace($prefix, '', get_class($obj));\r | |
181 | $lclass = strtolower($class);\r | |
182 | $class .= '(';\r | |
183 | switch ($lclass) {\r | |
184 | case 'enum':\r | |
185 | $values = array();\r | |
186 | foreach ($obj->valid_values as $value => $bool) {\r | |
187 | $values[] = $value;\r | |
188 | }\r | |
189 | $class .= implode(', ', $values);\r | |
190 | break;\r | |
191 | case 'css_composite':\r | |
192 | $values = array();\r | |
193 | foreach ($obj->defs as $def) {\r | |
194 | $values[] = $this->getClass($def, $sec_prefix);\r | |
195 | }\r | |
196 | $class .= implode(', ', $values);\r | |
197 | break;\r | |
198 | case 'css_multiple':\r | |
199 | $class .= $this->getClass($obj->single, $sec_prefix) . ', ';\r | |
200 | $class .= $obj->max;\r | |
201 | break;\r | |
202 | case 'css_denyelementdecorator':\r | |
203 | $class .= $this->getClass($obj->def, $sec_prefix) . ', ';\r | |
204 | $class .= $obj->element;\r | |
205 | break;\r | |
206 | case 'css_importantdecorator':\r | |
207 | $class .= $this->getClass($obj->def, $sec_prefix);\r | |
208 | if ($obj->allow) {\r | |
209 | $class .= ', !important';\r | |
210 | }\r | |
211 | break;\r | |
212 | }\r | |
213 | $class .= ')';\r | |
214 | return $class;\r | |
215 | }\r | |
216 | }\r | |
217 | \r | |
218 | // vim: et sw=4 sts=4\r |