| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 | <?php/** * XHTML 1.1 Forms module, defines all form-related elements found in HTML 4. */class HTMLPurifier_HTMLModule_Forms extends HTMLPurifier_HTMLModule{    /**     * @type string     */    public $name = 'Forms';    /**     * @type bool     */    public $safe = false;    /**     * @type array     */    public $content_sets = array(        'Block' => 'Form',        'Inline' => 'Formctrl',    );    /**     * @param HTMLPurifier_Config $config     */    public function setup($config)    {        if ($config->get('HTML.Forms')) {            $this->safe = true;        }        $form = $this->addElement(            'form',            'Form',            'Required: Heading | List | Block | fieldset',            'Common',            array(                'accept' => 'ContentTypes',                'accept-charset' => 'Charsets',                'action*' => 'URI',                'method' => 'Enum#get,post',                // really ContentType, but these two are the only ones used today                'enctype' => 'Enum#application/x-www-form-urlencoded,multipart/form-data',            )        );        $form->excludes = array('form' => true);        $input = $this->addElement(            'input',            'Formctrl',            'Empty',            'Common',            array(                'accept' => 'ContentTypes',                'accesskey' => 'Character',                'alt' => 'Text',                'checked' => 'Bool#checked',                'disabled' => 'Bool#disabled',                'maxlength' => 'Number',                'name' => 'CDATA',                'readonly' => 'Bool#readonly',                'size' => 'Number',                'src' => 'URI#embedded',                'tabindex' => 'Number',                'type' => 'Enum#text,password,checkbox,button,radio,submit,reset,file,hidden,image',                'value' => 'CDATA',            )        );        $input->attr_transform_post[] = new HTMLPurifier_AttrTransform_Input();        $this->addElement(            'select',            'Formctrl',            'Required: optgroup | option',            'Common',            array(                'disabled' => 'Bool#disabled',                'multiple' => 'Bool#multiple',                'name' => 'CDATA',                'size' => 'Number',                'tabindex' => 'Number',            )        );        $this->addElement(            'option',            false,            'Optional: #PCDATA',            'Common',            array(                'disabled' => 'Bool#disabled',                'label' => 'Text',                'selected' => 'Bool#selected',                'value' => 'CDATA',            )        );        // It's illegal for there to be more than one selected, but not        // be multiple. Also, no selected means undefined behavior. This might        // be difficult to implement; perhaps an injector, or a context variable.        $textarea = $this->addElement(            'textarea',            'Formctrl',            'Optional: #PCDATA',            'Common',            array(                'accesskey' => 'Character',                'cols*' => 'Number',                'disabled' => 'Bool#disabled',                'name' => 'CDATA',                'readonly' => 'Bool#readonly',                'rows*' => 'Number',                'tabindex' => 'Number',            )        );        $textarea->attr_transform_pre[] = new HTMLPurifier_AttrTransform_Textarea();        $button = $this->addElement(            'button',            'Formctrl',            'Optional: #PCDATA | Heading | List | Block | Inline',            'Common',            array(                'accesskey' => 'Character',                'disabled' => 'Bool#disabled',                'name' => 'CDATA',                'tabindex' => 'Number',                'type' => 'Enum#button,submit,reset',                'value' => 'CDATA',            )        );        // For exclusions, ideally we'd specify content sets, not literal elements        $button->excludes = $this->makeLookup(            'form',            'fieldset', // Form            'input',            'select',            'textarea',            'label',            'button', // Formctrl            'a', // as per HTML 4.01 spec, this is omitted by modularization            'isindex',            'iframe' // legacy items        );        // Extra exclusion: img usemap="" is not permitted within this element.        // We'll omit this for now, since we don't have any good way of        // indicating it yet.        // This is HIGHLY user-unfriendly; we need a custom child-def for this        $this->addElement('fieldset', 'Form', 'Custom: (#WS?,legend,(Flow|#PCDATA)*)', 'Common');        $label = $this->addElement(            'label',            'Formctrl',            'Optional: #PCDATA | Inline',            'Common',            array(                'accesskey' => 'Character',                // 'for' => 'IDREF', // IDREF not implemented, cannot allow            )        );        $label->excludes = array('label' => true);        $this->addElement(            'legend',            false,            'Optional: #PCDATA | Inline',            'Common',            array(                'accesskey' => 'Character',            )        );        $this->addElement(            'optgroup',            false,            'Required: option',            'Common',            array(                'disabled' => 'Bool#disabled',                'label*' => 'Text',            )        );        // Don't forget an injector for <isindex>. This one's a little complex        // because it maps to multiple elements.    }}// vim: et sw=4 sts=4
 |