mirror of
https://github.com/ezyang/htmlpurifier.git
synced 2024-12-23 00:41:52 +00:00
Implement Tables Module.
- Fix HTMLDefinition rendering of table children git-svn-id: http://htmlpurifier.org/svnroot/htmlpurifier/trunk@714 48356398-32a2-884e-a903-53898d9a118a
This commit is contained in:
parent
315c55eeb1
commit
a122243a89
@ -47,7 +47,7 @@ class HTMLPurifier_AttrCollection
|
||||
// merge attribute collections that include others
|
||||
$this->performInclusions($info[$name]);
|
||||
// replace string identifiers with actual attribute objects
|
||||
$this->expandStringIdentifiers($info[$name], $attr_types);
|
||||
$this->expandIdentifiers($info[$name], $attr_types);
|
||||
}
|
||||
}
|
||||
|
||||
@ -69,7 +69,7 @@ class HTMLPurifier_AttrCollection
|
||||
unset($attr[0]);
|
||||
}
|
||||
|
||||
function expandStringIdentifiers(&$attr, $attr_types) {
|
||||
function expandIdentifiers(&$attr, $attr_types) {
|
||||
foreach ($attr as $def_i => $def) {
|
||||
if ($def_i === 0) continue;
|
||||
if (!is_string($def)) continue;
|
||||
|
@ -14,8 +14,11 @@ class HTMLPurifier_AttrTypes
|
||||
function HTMLPurifier_AttrTypes() {
|
||||
$this->info['NMTOKENS'] = new HTMLPurifier_AttrDef_Nmtokens();
|
||||
$this->info['CDATA'] = new HTMLPurifier_AttrDef_Text();
|
||||
$this->info['Text'] = new HTMLPurifier_AttrDef_Text();
|
||||
$this->info['ID'] = new HTMLPurifier_AttrDef_ID();
|
||||
$this->info['URI'] = new HTMLPurifier_AttrDef_URI();
|
||||
$this->info['Pixels'] = new HTMLPurifier_AttrDef_Pixels();
|
||||
$this->info['Length'] = new HTMLPurifier_AttrDef_Length();
|
||||
}
|
||||
}
|
||||
|
||||
|
76
library/HTMLPurifier/HTMLModule/Tables.php
Normal file
76
library/HTMLPurifier/HTMLModule/Tables.php
Normal file
@ -0,0 +1,76 @@
|
||||
<?php
|
||||
|
||||
require_once 'HTMLPurifier/HTMLModule.php';
|
||||
|
||||
/**
|
||||
* XHTML 1.1 Tables Module, fully defines accessible table elements.
|
||||
*/
|
||||
class HTMLPurifier_HTMLModule_Tables extends HTMLPurifier_HTMLModule
|
||||
{
|
||||
|
||||
var $elements = array('caption', 'table', 'td', 'th', 'tr', 'col',
|
||||
'colgroup', 'tbody', 'thead', 'tfoot');
|
||||
var $info = array();
|
||||
var $content_sets = array('Block' => 'table');
|
||||
|
||||
function HTMLPurifier_HTMLModule_Tables() {
|
||||
foreach ($this->elements as $e) {
|
||||
$this->info[$e] = new HTMLPurifier_ElementDef();
|
||||
$this->info[$e]->attr = array(0 => array('Common'));
|
||||
$attr =& $this->info[$e]->attr;
|
||||
if ($e == 'caption') continue;
|
||||
if ($e == 'table'){
|
||||
$attr['border'] = 'Pixels';
|
||||
$attr['cellpadding'] = 'Length';
|
||||
$attr['cellspacing'] = 'Length';
|
||||
$attr['frame'] = new HTMLPurifier_AttrDef_Enum(array(
|
||||
'void', 'above', 'below', 'hsides', 'lhs', 'rhs',
|
||||
'vsides', 'box', 'border'
|
||||
), false);
|
||||
$attr['rules'] = new HTMLPurifier_AttrDef_Enum(array(
|
||||
'none', 'groups', 'rows', 'cols', 'all'
|
||||
), false);
|
||||
$attr['summary'] = 'Text';
|
||||
$attr['width'] = 'Length';
|
||||
continue;
|
||||
}
|
||||
if ($e == 'td' || $e == 'th') $attr['abbr'] = 'Text';
|
||||
$attr['align'] = new HTMLPurifier_AttrDef_Enum(array(
|
||||
'left', 'center', 'right', 'justify', 'char'
|
||||
), false);
|
||||
$attr['valign'] = new HTMLPurifier_AttrDef_Enum(array(
|
||||
'top', 'middle', 'bottom', 'baseline'
|
||||
), false);
|
||||
$attr['charoff'] = 'Length';
|
||||
}
|
||||
$this->info['caption']->content_model = '#PCDATA | Inline';
|
||||
$this->info['caption']->content_model_type = 'optional';
|
||||
|
||||
$this->info['table']->content_model = 'caption?, ( col* | colgroup* ), (( thead?, tfoot?, tbody+ ) | ( tr+ ))';
|
||||
$this->info['table']->content_model_type = 'table';
|
||||
|
||||
$this->info['td']->content_model =
|
||||
$this->info['th']->content_model = '#PCDATA | Flow';
|
||||
$this->info['td']->content_model_type =
|
||||
$this->info['th']->content_model_type = 'optional';
|
||||
|
||||
$this->info['tr']->content_model = 'td | th';
|
||||
$this->info['tr']->content_model_type = 'required';
|
||||
|
||||
$this->info['col']->content_model_type = 'empty';
|
||||
|
||||
$this->info['colgroup']->content_model = 'col';
|
||||
$this->info['colgroup']->content_model_type = 'optional';
|
||||
|
||||
$this->info['tbody']->content_model =
|
||||
$this->info['thead']->content_model =
|
||||
$this->info['tfoot']->content_model = 'tr';
|
||||
$this->info['tbody']->content_model_type =
|
||||
$this->info['thead']->content_model_type =
|
||||
$this->info['tfoot']->content_model_type = 'required';
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
@ -143,8 +143,8 @@ class HTMLPurifier_Printer_HTMLDefinition extends HTMLPurifier_Printer
|
||||
} elseif ($def->type == 'empty') {
|
||||
$elements = array();
|
||||
} elseif ($def->type == 'table') {
|
||||
$elements = array('col', 'caption', 'colgroup', 'thead',
|
||||
'tfoot', 'tbody', 'tr');
|
||||
$elements = array_flip(array('col', 'caption', 'colgroup', 'thead',
|
||||
'tfoot', 'tbody', 'tr'));
|
||||
}
|
||||
$ret .= $this->element('th', 'Allowed children', $attr);
|
||||
|
||||
|
@ -12,6 +12,7 @@ require_once 'HTMLPurifier/HTMLModule/List.php';
|
||||
require_once 'HTMLPurifier/HTMLModule/Presentation.php';
|
||||
require_once 'HTMLPurifier/HTMLModule/Edit.php';
|
||||
require_once 'HTMLPurifier/HTMLModule/Bdo.php';
|
||||
require_once 'HTMLPurifier/HTMLModule/Tables.php';
|
||||
|
||||
/**
|
||||
* Next-generation HTML definition that will supplant HTMLPurifier_HTMLDefinition
|
||||
@ -32,6 +33,7 @@ class HTMLPurifier_XHTMLDefinition extends HTMLPurifier_HTMLDefinition
|
||||
$this->modules['Presentation'] = new HTMLPurifier_HTMLModule_Presentation();
|
||||
$this->modules['Edit'] = new HTMLPurifier_HTMLModule_Edit();
|
||||
$this->modules['Bdo'] = new HTMLPurifier_HTMLModule_Bdo();
|
||||
$this->modules['Tables'] = new HTMLPurifier_HTMLModule_Tables();
|
||||
|
||||
$this->attr_types = new HTMLPurifier_AttrTypes();
|
||||
$this->attr_collection = new HTMLPurifier_AttrCollection();
|
||||
@ -80,7 +82,7 @@ class HTMLPurifier_XHTMLDefinition extends HTMLPurifier_HTMLDefinition
|
||||
|
||||
// attribute value expansions
|
||||
$this->attr_collection->performInclusions($def->attr);
|
||||
$this->attr_collection->expandStringIdentifiers(
|
||||
$this->attr_collection->expandIdentifiers(
|
||||
$def->attr, $this->attr_types);
|
||||
|
||||
// perform content model expansions
|
||||
@ -156,7 +158,7 @@ class HTMLPurifier_XHTMLDefinition extends HTMLPurifier_HTMLDefinition
|
||||
return new HTMLPurifier_ChildDef_Custom($value);
|
||||
}
|
||||
if ($value) return new HTMLPurifier_ChildDef_Optional($value);
|
||||
return HTMLPurifier_ChildDef_Empty();
|
||||
return new HTMLPurifier_ChildDef_Empty();
|
||||
}
|
||||
|
||||
function convertToLookup($string) {
|
||||
|
Loading…
Reference in New Issue
Block a user