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];
}
-
}
}