1: | <?php
|
2: |
|
3: | |
4: | |
5: |
|
6: | class HTMLPurifier_Printer_ConfigForm extends HTMLPurifier_Printer
|
7: | {
|
8: |
|
9: | |
10: | |
11: | |
12: |
|
13: | protected $fields = array();
|
14: |
|
15: | |
16: | |
17: | |
18: |
|
19: | protected $docURL;
|
20: |
|
21: | |
22: | |
23: | |
24: |
|
25: | protected $name;
|
26: |
|
27: | |
28: | |
29: | |
30: | |
31: | |
32: |
|
33: | protected $compress = false;
|
34: |
|
35: | |
36: | |
37: | |
38: | |
39: |
|
40: | public function __construct(
|
41: | $name,
|
42: | $doc_url = null,
|
43: | $compress = false
|
44: | ) {
|
45: | parent::__construct();
|
46: | $this->docURL = $doc_url;
|
47: | $this->name = $name;
|
48: | $this->compress = $compress;
|
49: |
|
50: | $this->fields[0] = new HTMLPurifier_Printer_ConfigForm_default();
|
51: | $this->fields[HTMLPurifier_VarParser::C_BOOL] = new HTMLPurifier_Printer_ConfigForm_bool();
|
52: | }
|
53: |
|
54: | |
55: | |
56: | |
57: | |
58: |
|
59: | public function setTextareaDimensions($cols = null, $rows = null)
|
60: | {
|
61: | if ($cols) {
|
62: | $this->fields['default']->cols = $cols;
|
63: | }
|
64: | if ($rows) {
|
65: | $this->fields['default']->rows = $rows;
|
66: | }
|
67: | }
|
68: |
|
69: | |
70: | |
71: |
|
72: | public static function getCSS()
|
73: | {
|
74: | return file_get_contents(HTMLPURIFIER_PREFIX . '/HTMLPurifier/Printer/ConfigForm.css');
|
75: | }
|
76: |
|
77: | |
78: | |
79: |
|
80: | public static function getJavaScript()
|
81: | {
|
82: | return file_get_contents(HTMLPURIFIER_PREFIX . '/HTMLPurifier/Printer/ConfigForm.js');
|
83: | }
|
84: |
|
85: | |
86: | |
87: | |
88: | |
89: | |
90: | |
91: | |
92: |
|
93: | public function render($config, $allowed = true, $render_controls = true)
|
94: | {
|
95: | if (is_array($config) && isset($config[0])) {
|
96: | $gen_config = $config[0];
|
97: | $config = $config[1];
|
98: | } else {
|
99: | $gen_config = $config;
|
100: | }
|
101: |
|
102: | $this->config = $config;
|
103: | $this->genConfig = $gen_config;
|
104: | $this->prepareGenerator($gen_config);
|
105: |
|
106: | $allowed = HTMLPurifier_Config::getAllowedDirectivesForForm($allowed, $config->def);
|
107: | $all = array();
|
108: | foreach ($allowed as $key) {
|
109: | list($ns, $directive) = $key;
|
110: | $all[$ns][$directive] = $config->get($ns . '.' . $directive);
|
111: | }
|
112: |
|
113: | $ret = '';
|
114: | $ret .= $this->start('table', array('class' => 'hp-config'));
|
115: | $ret .= $this->start('thead');
|
116: | $ret .= $this->start('tr');
|
117: | $ret .= $this->element('th', 'Directive', array('class' => 'hp-directive'));
|
118: | $ret .= $this->element('th', 'Value', array('class' => 'hp-value'));
|
119: | $ret .= $this->end('tr');
|
120: | $ret .= $this->end('thead');
|
121: | foreach ($all as $ns => $directives) {
|
122: | $ret .= $this->renderNamespace($ns, $directives);
|
123: | }
|
124: | if ($render_controls) {
|
125: | $ret .= $this->start('tbody');
|
126: | $ret .= $this->start('tr');
|
127: | $ret .= $this->start('td', array('colspan' => 2, 'class' => 'controls'));
|
128: | $ret .= $this->elementEmpty('input', array('type' => 'submit', 'value' => 'Submit'));
|
129: | $ret .= '[<a href="?">Reset</a>]';
|
130: | $ret .= $this->end('td');
|
131: | $ret .= $this->end('tr');
|
132: | $ret .= $this->end('tbody');
|
133: | }
|
134: | $ret .= $this->end('table');
|
135: | return $ret;
|
136: | }
|
137: |
|
138: | |
139: | |
140: | |
141: | |
142: | |
143: |
|
144: | protected function renderNamespace($ns, $directives)
|
145: | {
|
146: | $ret = '';
|
147: | $ret .= $this->start('tbody', array('class' => 'namespace'));
|
148: | $ret .= $this->start('tr');
|
149: | $ret .= $this->element('th', $ns, array('colspan' => 2));
|
150: | $ret .= $this->end('tr');
|
151: | $ret .= $this->end('tbody');
|
152: | $ret .= $this->start('tbody');
|
153: | foreach ($directives as $directive => $value) {
|
154: | $ret .= $this->start('tr');
|
155: | $ret .= $this->start('th');
|
156: | if ($this->docURL) {
|
157: | $url = str_replace('%s', urlencode("$ns.$directive"), $this->docURL);
|
158: | $ret .= $this->start('a', array('href' => $url));
|
159: | }
|
160: | $attr = array('for' => "{$this->name}:$ns.$directive");
|
161: |
|
162: |
|
163: | if (!$this->compress || (strlen($directive) < $this->compress)) {
|
164: | $directive_disp = $directive;
|
165: | } else {
|
166: | $directive_disp = substr($directive, 0, $this->compress - 2) . '...';
|
167: | $attr['title'] = $directive;
|
168: | }
|
169: |
|
170: | $ret .= $this->element(
|
171: | 'label',
|
172: | $directive_disp,
|
173: |
|
174: | $attr
|
175: | );
|
176: | if ($this->docURL) {
|
177: | $ret .= $this->end('a');
|
178: | }
|
179: | $ret .= $this->end('th');
|
180: |
|
181: | $ret .= $this->start('td');
|
182: | $def = $this->config->def->info["$ns.$directive"];
|
183: | if (is_int($def)) {
|
184: | $allow_null = $def < 0;
|
185: | $type = abs($def);
|
186: | } else {
|
187: | $type = $def->type;
|
188: | $allow_null = isset($def->allow_null);
|
189: | }
|
190: | if (!isset($this->fields[$type])) {
|
191: | $type = 0;
|
192: | }
|
193: | $type_obj = $this->fields[$type];
|
194: | if ($allow_null) {
|
195: | $type_obj = new HTMLPurifier_Printer_ConfigForm_NullDecorator($type_obj);
|
196: | }
|
197: | $ret .= $type_obj->render($ns, $directive, $value, $this->name, array($this->genConfig, $this->config));
|
198: | $ret .= $this->end('td');
|
199: | $ret .= $this->end('tr');
|
200: | }
|
201: | $ret .= $this->end('tbody');
|
202: | return $ret;
|
203: | }
|
204: |
|
205: | }
|
206: |
|
207: | |
208: | |
209: |
|
210: | class HTMLPurifier_Printer_ConfigForm_NullDecorator extends HTMLPurifier_Printer
|
211: | {
|
212: | |
213: | |
214: | |
215: |
|
216: | protected $obj;
|
217: |
|
218: | |
219: | |
220: |
|
221: | public function __construct($obj)
|
222: | {
|
223: | parent::__construct();
|
224: | $this->obj = $obj;
|
225: | }
|
226: |
|
227: | |
228: | |
229: | |
230: | |
231: | |
232: | |
233: | |
234: |
|
235: | public function render($ns, $directive, $value, $name, $config)
|
236: | {
|
237: | if (is_array($config) && isset($config[0])) {
|
238: | $gen_config = $config[0];
|
239: | $config = $config[1];
|
240: | } else {
|
241: | $gen_config = $config;
|
242: | }
|
243: | $this->prepareGenerator($gen_config);
|
244: |
|
245: | $ret = '';
|
246: | $ret .= $this->start('label', array('for' => "$name:Null_$ns.$directive"));
|
247: | $ret .= $this->element('span', "$ns.$directive:", array('class' => 'verbose'));
|
248: | $ret .= $this->text(' Null/Disabled');
|
249: | $ret .= $this->end('label');
|
250: | $attr = array(
|
251: | 'type' => 'checkbox',
|
252: | 'value' => '1',
|
253: | 'class' => 'null-toggle',
|
254: | 'name' => "$name" . "[Null_$ns.$directive]",
|
255: | 'id' => "$name:Null_$ns.$directive",
|
256: | 'onclick' => "toggleWriteability('$name:$ns.$directive',checked)"
|
257: | );
|
258: | if ($this->obj instanceof HTMLPurifier_Printer_ConfigForm_bool) {
|
259: |
|
260: | $attr['onclick'] =
|
261: | "toggleWriteability('$name:Yes_$ns.$directive',checked);" .
|
262: | "toggleWriteability('$name:No_$ns.$directive',checked)";
|
263: | }
|
264: | if ($value === null) {
|
265: | $attr['checked'] = 'checked';
|
266: | }
|
267: | $ret .= $this->elementEmpty('input', $attr);
|
268: | $ret .= $this->text(' or ');
|
269: | $ret .= $this->elementEmpty('br');
|
270: | $ret .= $this->obj->render($ns, $directive, $value, $name, array($gen_config, $config));
|
271: | return $ret;
|
272: | }
|
273: | }
|
274: |
|
275: | |
276: | |
277: |
|
278: | class HTMLPurifier_Printer_ConfigForm_default extends HTMLPurifier_Printer
|
279: | {
|
280: | |
281: | |
282: |
|
283: | public $cols = 18;
|
284: |
|
285: | |
286: | |
287: |
|
288: | public $rows = 5;
|
289: |
|
290: | |
291: | |
292: | |
293: | |
294: | |
295: | |
296: | |
297: |
|
298: | public function render($ns, $directive, $value, $name, $config)
|
299: | {
|
300: | if (is_array($config) && isset($config[0])) {
|
301: | $gen_config = $config[0];
|
302: | $config = $config[1];
|
303: | } else {
|
304: | $gen_config = $config;
|
305: | }
|
306: | $this->prepareGenerator($gen_config);
|
307: |
|
308: | $ret = '';
|
309: | $def = $config->def->info["$ns.$directive"];
|
310: | if (is_int($def)) {
|
311: | $type = abs($def);
|
312: | } else {
|
313: | $type = $def->type;
|
314: | }
|
315: | if (is_array($value)) {
|
316: | switch ($type) {
|
317: | case HTMLPurifier_VarParser::LOOKUP:
|
318: | $array = $value;
|
319: | $value = array();
|
320: | foreach ($array as $val => $b) {
|
321: | $value[] = $val;
|
322: | }
|
323: |
|
324: | case HTMLPurifier_VarParser::ALIST:
|
325: | $value = implode(PHP_EOL, $value);
|
326: | break;
|
327: | case HTMLPurifier_VarParser::HASH:
|
328: | $nvalue = '';
|
329: | foreach ($value as $i => $v) {
|
330: | if (is_array($v)) {
|
331: |
|
332: | $v = implode(";", $v);
|
333: | }
|
334: | $nvalue .= "$i:$v" . PHP_EOL;
|
335: | }
|
336: | $value = $nvalue;
|
337: | break;
|
338: | default:
|
339: | $value = '';
|
340: | }
|
341: | }
|
342: | if ($type === HTMLPurifier_VarParser::C_MIXED) {
|
343: | return 'Not supported';
|
344: | $value = serialize($value);
|
345: | }
|
346: | $attr = array(
|
347: | 'name' => "$name" . "[$ns.$directive]",
|
348: | 'id' => "$name:$ns.$directive"
|
349: | );
|
350: | if ($value === null) {
|
351: | $attr['disabled'] = 'disabled';
|
352: | }
|
353: | if (isset($def->allowed)) {
|
354: | $ret .= $this->start('select', $attr);
|
355: | foreach ($def->allowed as $val => $b) {
|
356: | $attr = array();
|
357: | if ($value == $val) {
|
358: | $attr['selected'] = 'selected';
|
359: | }
|
360: | $ret .= $this->element('option', $val, $attr);
|
361: | }
|
362: | $ret .= $this->end('select');
|
363: | } elseif ($type === HTMLPurifier_VarParser::TEXT ||
|
364: | $type === HTMLPurifier_VarParser::ITEXT ||
|
365: | $type === HTMLPurifier_VarParser::ALIST ||
|
366: | $type === HTMLPurifier_VarParser::HASH ||
|
367: | $type === HTMLPurifier_VarParser::LOOKUP) {
|
368: | $attr['cols'] = $this->cols;
|
369: | $attr['rows'] = $this->rows;
|
370: | $ret .= $this->start('textarea', $attr);
|
371: | $ret .= $this->text($value);
|
372: | $ret .= $this->end('textarea');
|
373: | } else {
|
374: | $attr['value'] = $value;
|
375: | $attr['type'] = 'text';
|
376: | $ret .= $this->elementEmpty('input', $attr);
|
377: | }
|
378: | return $ret;
|
379: | }
|
380: | }
|
381: |
|
382: | |
383: | |
384: |
|
385: | class HTMLPurifier_Printer_ConfigForm_bool extends HTMLPurifier_Printer
|
386: | {
|
387: | |
388: | |
389: | |
390: | |
391: | |
392: | |
393: | |
394: |
|
395: | public function render($ns, $directive, $value, $name, $config)
|
396: | {
|
397: | if (is_array($config) && isset($config[0])) {
|
398: | $gen_config = $config[0];
|
399: | $config = $config[1];
|
400: | } else {
|
401: | $gen_config = $config;
|
402: | }
|
403: | $this->prepareGenerator($gen_config);
|
404: | $ret = '';
|
405: | $ret .= $this->start('div', array('id' => "$name:$ns.$directive"));
|
406: |
|
407: | $ret .= $this->start('label', array('for' => "$name:Yes_$ns.$directive"));
|
408: | $ret .= $this->element('span', "$ns.$directive:", array('class' => 'verbose'));
|
409: | $ret .= $this->text(' Yes');
|
410: | $ret .= $this->end('label');
|
411: |
|
412: | $attr = array(
|
413: | 'type' => 'radio',
|
414: | 'name' => "$name" . "[$ns.$directive]",
|
415: | 'id' => "$name:Yes_$ns.$directive",
|
416: | 'value' => '1'
|
417: | );
|
418: | if ($value === true) {
|
419: | $attr['checked'] = 'checked';
|
420: | }
|
421: | if ($value === null) {
|
422: | $attr['disabled'] = 'disabled';
|
423: | }
|
424: | $ret .= $this->elementEmpty('input', $attr);
|
425: |
|
426: | $ret .= $this->start('label', array('for' => "$name:No_$ns.$directive"));
|
427: | $ret .= $this->element('span', "$ns.$directive:", array('class' => 'verbose'));
|
428: | $ret .= $this->text(' No');
|
429: | $ret .= $this->end('label');
|
430: |
|
431: | $attr = array(
|
432: | 'type' => 'radio',
|
433: | 'name' => "$name" . "[$ns.$directive]",
|
434: | 'id' => "$name:No_$ns.$directive",
|
435: | 'value' => '0'
|
436: | );
|
437: | if ($value === false) {
|
438: | $attr['checked'] = 'checked';
|
439: | }
|
440: | if ($value === null) {
|
441: | $attr['disabled'] = 'disabled';
|
442: | }
|
443: | $ret .= $this->elementEmpty('input', $attr);
|
444: |
|
445: | $ret .= $this->end('div');
|
446: |
|
447: | return $ret;
|
448: | }
|
449: | }
|
450: |
|
451: |
|
452: | |