1<?php
2
3/**
4 * Performs miscellaneous cross attribute validation and filtering for
5 * input elements. This is meant to be a post-transform.
6 */
7class HTMLPurifier_AttrTransform_Input extends HTMLPurifier_AttrTransform
8{
9    /**
10     * @type HTMLPurifier_AttrDef_HTML_Pixels
11     */
12    protected $pixels;
13
14    public function __construct()
15    {
16        $this->pixels = new HTMLPurifier_AttrDef_HTML_Pixels();
17    }
18
19    /**
20     * @param array $attr
21     * @param HTMLPurifier_Config $config
22     * @param HTMLPurifier_Context $context
23     * @return array
24     */
25    public function transform($attr, $config, $context)
26    {
27        if (!isset($attr['type'])) {
28            $t = 'text';
29        } else {
30            $t = strtolower($attr['type']);
31        }
32        if (isset($attr['checked']) && $t !== 'radio' && $t !== 'checkbox') {
33            unset($attr['checked']);
34        }
35        if (isset($attr['maxlength']) && $t !== 'text' && $t !== 'password') {
36            unset($attr['maxlength']);
37        }
38        if (isset($attr['size']) && $t !== 'text' && $t !== 'password') {
39            $result = $this->pixels->validate($attr['size'], $config, $context);
40            if ($result === false) {
41                unset($attr['size']);
42            } else {
43                $attr['size'] = $result;
44            }
45        }
46        if (isset($attr['src']) && $t !== 'image') {
47            unset($attr['src']);
48        }
49        if (!isset($attr['value']) && ($t === 'radio' || $t === 'checkbox')) {
50            $attr['value'] = '';
51        }
52        return $attr;
53    }
54}
55
56// vim: et sw=4 sts=4
57