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