You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
194 lines
5.7 KiB
194 lines
5.7 KiB
<?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
|
|
|