diff --git a/library/HTMLPurifier/HTMLDefinition.php b/library/HTMLPurifier/HTMLDefinition.php index 0efa7f74..00bcface 100644 --- a/library/HTMLPurifier/HTMLDefinition.php +++ b/library/HTMLPurifier/HTMLDefinition.php @@ -357,6 +357,11 @@ class HTMLPurifier_HTMLDefinition ////////////////////////////////////////////////////////////////////// // info[]->type : defines the type of the element (block or inline) + // unknown until proven inline/block + foreach ($this->info as $i => $x) { + $this->info[$i]->type = 'unknown'; + } + // reuses $e_Inline and $e_Block foreach ($e_Inline->elements as $name => $bool) { if ($name == '#PCDATA') continue; @@ -642,13 +647,13 @@ class HTMLPurifier_ElementDef var $child; var $content_model; - var $content_model_type = 'optional'; + var $content_model_type; /** * Type of the tag: inline or block or unknown? * @public */ - var $type = 'unknown'; + var $type; /** * Lookup table of tags excluded from all descendants of this tag. @@ -658,4 +663,4 @@ class HTMLPurifier_ElementDef } -?> +?> \ No newline at end of file diff --git a/library/HTMLPurifier/HTMLModule/Hypertext.php b/library/HTMLPurifier/HTMLModule/Hypertext.php index 10b05bf8..37e29653 100644 --- a/library/HTMLPurifier/HTMLModule/Hypertext.php +++ b/library/HTMLPurifier/HTMLModule/Hypertext.php @@ -26,6 +26,7 @@ class HTMLPurifier_HTMLModule_Hypertext extends HTMLPurifier_HTMLModule //'type' => 'ContentType', ); $this->info['a']->content_model = '#PCDATA | Inline'; + $this->info['a']->content_model_type = 'optional'; $this->info['a']->excludes = array('a' => true); } diff --git a/library/HTMLPurifier/HTMLModule/List.php b/library/HTMLPurifier/HTMLModule/List.php new file mode 100644 index 00000000..fa32029e --- /dev/null +++ b/library/HTMLPurifier/HTMLModule/List.php @@ -0,0 +1,40 @@ + 'dl | ol | ul', 'Flow' => 'List'); + + function HTMLPurifier_HTMLModule_List() { + foreach ($this->elements as $element) { + $this->info[$element] = new HTMLPurifier_ElementDef(); + $this->info[$element]->attr = array(0 => array('Common')); + if ($element == 'li' || $element == 'dd') { + $this->info[$element]->content_model = '#PCDATA | Flow'; + $this->info[$element]->content_model_type = 'optional'; + } elseif ($element == 'ol' || $element == 'ul') { + $this->info[$element]->content_model = 'li'; + $this->info[$element]->content_model_type = 'required'; + } + } + $this->info['dt']->content_model = '#PCDATA | Inline'; + $this->info['dt']->content_model_type = 'optional'; + $this->info['dl']->content_model = 'dt | dd'; + $this->info['dl']->content_model_type = 'required'; + } + +} + +?> \ No newline at end of file diff --git a/library/HTMLPurifier/HTMLModule/Text.php b/library/HTMLPurifier/HTMLModule/Text.php index dbbdf718..12c91072 100644 --- a/library/HTMLPurifier/HTMLModule/Text.php +++ b/library/HTMLPurifier/HTMLModule/Text.php @@ -40,8 +40,10 @@ class HTMLPurifier_HTMLModule_Text extends HTMLPurifier_HTMLModule $this->info[$element]->content_model_type = 'strictblockquote'; } elseif ($element == 'div') { $this->info[$element]->content_model = '#PCDATA | Flow'; + $this->info[$element]->content_model_type = 'optional'; } else { $this->info[$element]->content_model = '#PCDATA | Inline'; + $this->info[$element]->content_model_type = 'optional'; } } } diff --git a/library/HTMLPurifier/Printer/HTMLDefinition.php b/library/HTMLPurifier/Printer/HTMLDefinition.php index e0c6bf29..20671912 100644 --- a/library/HTMLPurifier/Printer/HTMLDefinition.php +++ b/library/HTMLPurifier/Printer/HTMLDefinition.php @@ -29,6 +29,7 @@ class HTMLPurifier_Printer_HTMLDefinition extends HTMLPurifier_Printer $ret .= $this->element('caption', 'Environment'); $ret .= $this->row('Parent of fragment', $def->info_parent); + $ret .= $this->renderChildren($def->info_parent_def->child); $ret .= $this->row('Strict mode', $def->strict); if ($def->strict) $ret .= $this->row('Block wrap name', $def->info_block_wrapper); @@ -37,8 +38,6 @@ class HTMLPurifier_Printer_HTMLDefinition extends HTMLPurifier_Printer $ret .= $this->element('td', $this->listifyAttr($def->info_global_attr),0,0); $ret .= $this->end('tr'); - $ret .= $this->renderChildren($def->info_parent_def->child); - $ret .= $this->start('tr'); $ret .= $this->element('th', 'Tag transforms'); $list = array(); diff --git a/library/HTMLPurifier/XHTMLDefinition.php b/library/HTMLPurifier/XHTMLDefinition.php index 1420ccb2..bc35bf0e 100644 --- a/library/HTMLPurifier/XHTMLDefinition.php +++ b/library/HTMLPurifier/XHTMLDefinition.php @@ -4,9 +4,11 @@ require_once 'HTMLPurifier/HTMLDefinition.php'; 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'; +require_once 'HTMLPurifier/HTMLModule/List.php'; /** * Next-generation HTML definition that will supplant HTMLPurifier_HTMLDefinition @@ -22,6 +24,7 @@ class HTMLPurifier_XHTMLDefinition extends HTMLPurifier_HTMLDefinition $this->modules['Text'] = new HTMLPurifier_HTMLModule_Text(); $this->modules['Hypertext'] = new HTMLPurifier_HTMLModule_Hypertext(); + $this->modules['List'] = new HTMLPurifier_HTMLModule_List(); $this->attr_types = new HTMLPurifier_AttrTypes(); $this->attr_collection = new HTMLPurifier_AttrCollection(); @@ -107,6 +110,7 @@ class HTMLPurifier_XHTMLDefinition extends HTMLPurifier_HTMLDefinition case 'custom': return new HTMLPurifier_ChildDef_Custom($value); } + if ($value) return new HTMLPurifier_ChildDef_Optional($value); return HTMLPurifier_ChildDef_Empty(); }