diff --git a/library/HTMLPurifier/AttrCollection.php b/library/HTMLPurifier/AttrCollection.php index 9ec85b22..52d6820d 100644 --- a/library/HTMLPurifier/AttrCollection.php +++ b/library/HTMLPurifier/AttrCollection.php @@ -22,7 +22,7 @@ class HTMLPurifier_AttrCollection 'lang' => false, // see constructor ), 'Events' => array(), - 'Style' => array(), + 'Style' => array(), // specifically empty 'Common' => array( 0 => array('Core', 'Events', 'I18N', 'Style') ) @@ -36,25 +36,12 @@ class HTMLPurifier_AttrCollection function setup($attr_types, $modules) { $info =& $this->info; - - // replace string identifiers with actual attribute objects - foreach ($info as $collection_i => $collection) { - foreach ($collection as $attr_i => $attr) { - if ($attr_i === 0) continue; - if (!is_string($attr)) continue; - if (isset($attr_types->info[$attr])) { - $info[$collection_i][$attr_i] = $attr_types->info[$attr]; - } else { - unset($info[$collection_i][$attr_i]); - } - } - } - - // merge attribute collections that include others foreach ($info as $name => $attr) { + // merge attribute collections that include others $this->performInclusions($info[$name]); + // replace string identifiers with actual attribute objects + $this->expandStringIdentifiers($info[$name], $attr_types); } - } function performInclusions(&$attr) { @@ -75,6 +62,18 @@ class HTMLPurifier_AttrCollection unset($attr[0]); } + function expandStringIdentifiers(&$attr, $attr_types) { + foreach ($attr as $def_i => $def) { + if ($def_i === 0) continue; + if (!is_string($def)) continue; + if (isset($attr_types->info[$def])) { + $attr[$def_i] = $attr_types->info[$def]; + } else { + unset($attr[$def_i]); + } + } + } + } ?> \ No newline at end of file diff --git a/library/HTMLPurifier/AttrTypes.php b/library/HTMLPurifier/AttrTypes.php index 694b7ecf..95819776 100644 --- a/library/HTMLPurifier/AttrTypes.php +++ b/library/HTMLPurifier/AttrTypes.php @@ -3,6 +3,7 @@ require_once 'HTMLPurifier/AttrDef/Nmtokens.php'; require_once 'HTMLPurifier/AttrDef/Text.php'; require_once 'HTMLPurifier/AttrDef/ID.php'; +require_once 'HTMLPurifier/AttrDef/URI.php'; /** * Provides lookup array of attribute types to HTMLPurifier_AttrDef objects diff --git a/library/HTMLPurifier/HTMLDefinition.php b/library/HTMLPurifier/HTMLDefinition.php index d1823af6..0efa7f74 100644 --- a/library/HTMLPurifier/HTMLDefinition.php +++ b/library/HTMLPurifier/HTMLDefinition.php @@ -641,6 +641,9 @@ class HTMLPurifier_ElementDef */ var $child; + var $content_model; + var $content_model_type = 'optional'; + /** * Type of the tag: inline or block or unknown? * @public diff --git a/library/HTMLPurifier/HTMLModule.php b/library/HTMLPurifier/HTMLModule.php index a6bbb3e6..1c8647cd 100644 --- a/library/HTMLPurifier/HTMLModule.php +++ b/library/HTMLPurifier/HTMLModule.php @@ -17,11 +17,4 @@ class HTMLPurifier_HTMLModule var $content_sets = array(); } -class HTMLPurifier_HTMLModuleElement -{ - var $attr = array(); - var $content_model; - var $content_model_type = 'optional'; -} - ?> \ No newline at end of file diff --git a/library/HTMLPurifier/HTMLModule/Hypertext.php b/library/HTMLPurifier/HTMLModule/Hypertext.php new file mode 100644 index 00000000..10b05bf8 --- /dev/null +++ b/library/HTMLPurifier/HTMLModule/Hypertext.php @@ -0,0 +1,34 @@ + 'a'); + + function HTMLPurifier_HTMLModule_Hypertext() { + $this->info['a'] = new HTMLPurifier_ElementDef(); + $this->info['a']->attr = array( + 0 => array('Common'), + // 'accesskey' => 'Character', + // 'charset' => 'Charset', + 'href' => 'URI', + //'hreflang' => 'LanguageCode', + //'rel' => 'LinkTypes', + //'rev' => 'LinkTypes', + //'tabindex' => 'Number', + //'type' => 'ContentType', + ); + $this->info['a']->content_model = '#PCDATA | Inline'; + $this->info['a']->excludes = array('a' => true); + } + +} + +?> \ No newline at end of file diff --git a/library/HTMLPurifier/HTMLModule/Text.php b/library/HTMLPurifier/HTMLModule/Text.php index 98e749e1..dbbdf718 100644 --- a/library/HTMLPurifier/HTMLModule/Text.php +++ b/library/HTMLPurifier/HTMLModule/Text.php @@ -24,7 +24,7 @@ class HTMLPurifier_HTMLModule_Text extends HTMLPurifier_HTMLModule function HTMLPurifier_HTMLModule_Text() { foreach ($this->elements as $element) { - $this->info[$element] = new HTMLPurifier_HTMLModuleElement(); + $this->info[$element] = new HTMLPurifier_ElementDef(); // attributes if ($element == 'br') { $this->info[$element]->attr = array(0 => array('Core')); diff --git a/library/HTMLPurifier/XHTMLDefinition.php b/library/HTMLPurifier/XHTMLDefinition.php index 9f52d9e0..1420ccb2 100644 --- a/library/HTMLPurifier/XHTMLDefinition.php +++ b/library/HTMLPurifier/XHTMLDefinition.php @@ -6,6 +6,7 @@ require_once 'HTMLPurifier/AttrTypes.php'; require_once 'HTMLPurifier/AttrCollection.php'; require_once 'HTMLPurifier/HTMLModule.php'; require_once 'HTMLPurifier/HTMLModule/Text.php'; +require_once 'HTMLPurifier/HTMLModule/Hypertext.php'; /** * Next-generation HTML definition that will supplant HTMLPurifier_HTMLDefinition @@ -20,6 +21,7 @@ class HTMLPurifier_XHTMLDefinition extends HTMLPurifier_HTMLDefinition function initialize($config) { $this->modules['Text'] = new HTMLPurifier_HTMLModule_Text(); + $this->modules['Hypertext'] = new HTMLPurifier_HTMLModule_Hypertext(); $this->attr_types = new HTMLPurifier_AttrTypes(); $this->attr_collection = new HTMLPurifier_AttrCollection(); @@ -63,6 +65,8 @@ class HTMLPurifier_XHTMLDefinition extends HTMLPurifier_HTMLDefinition // attribute value expansions $this->attr_collection->performInclusions($element->attr); + $this->attr_collection->expandStringIdentifiers( + $element->attr, $this->attr_types); // perform content model expansions $content_model = $element->content_model; @@ -71,14 +75,14 @@ class HTMLPurifier_XHTMLDefinition extends HTMLPurifier_HTMLDefinition $content_sets_keys, $content_sets_values, $content_model); } + // get child def from content model + $element->child = $this->getChildDef($element); + // setup info - $this->info[$element_i] = new HTMLPurifier_ElementDef(); - $this->info[$element_i]->attr = $element->attr; - $this->info[$element_i]->child = $this->getChildDef($element); + $this->info[$element_i] = $element; if ($this->info_parent == $element_i) { $this->info_parent_def = $this->info[$element_i]; } - } }