<?php

namespace WPForms\Vendor;

/**
 * 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'
        );
        // 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'));
        $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
