0
0
mirror of https://github.com/ezyang/htmlpurifier.git synced 2024-09-18 18:25:18 +00:00

[1.7.0] Complete Legacy element and attribute native support.

git-svn-id: http://htmlpurifier.org/svnroot/htmlpurifier/trunk@1115 48356398-32a2-884e-a903-53898d9a118a
This commit is contained in:
Edward Z. Yang 2007-05-29 16:51:32 +00:00
parent 9c5f01a0cf
commit 426fbd1f97
8 changed files with 159 additions and 35 deletions

1
NEWS
View File

@ -28,6 +28,7 @@ NEWS ( CHANGELOG and HISTORY ) HTMLPurifier
! Configuration directives that accept hashes now allow new string
format: key1:value1,key2:value2
! ConfigDoc now factored into OOP design
! All deprecated elements now natively supported
- Deprecated and removed EnableRedundantUTF8Cleaning. It didn't even work!
. Unit test for ElementDef created, ElementDef behavior modified to
be more flexible

7
TODO
View File

@ -15,10 +15,6 @@ TODO List
- Get all AttrTypes into string form
# Clean up HTMLDefinition caching, need easy cache invalidation,
versioning of caches, etc.
# Implement all deprecated tags and attributes
# Create parsing/standards compliance smoketest
# Reorganize Unit Tests
- Refactor loop tests (esp. AttrDef_URI)
- Parse TinyMCE-style whitelist into our %HTML.Allow* whitelists
1.8 release [Refactor, refactor!]
@ -86,6 +82,9 @@ Ongoing
- WordPress (mostly written, needs beta-testing)
- eFiction
- more! (look for ones that use WYSIWYGs)
- Complete basic smoketests
- Reorganize Unit Tests
- Refactor loop tests (esp. AttrDef_URI)
Unknown release (on a scratch-an-itch basis)
? Semi-lossy dumb alternate character encoding transfor

View File

@ -47,11 +47,18 @@ class HTMLPurifier_AttrDef_Enum extends HTMLPurifier_AttrDef
/**
* @param $string In form of comma-delimited list of case-insensitive
* valid values. Example: "foo,bar,baz"
* valid values. Example: "foo,bar,baz". Prepend "s:" to make
* case sensitive
*/
function make($string) {
if (strlen($string) > 2 && $string[0] == 's' && $string[1] == ':') {
$string = substr($string, 2);
$sensitive = true;
} else {
$sensitive = false;
}
$values = explode(',', $string);
return new HTMLPurifier_AttrDef_Enum($values);
return new HTMLPurifier_AttrDef_Enum($values, $sensitive);
}
}

View File

@ -139,9 +139,13 @@ class HTMLPurifier_HTMLModule
* @return Reference to created element
*/
function &addBlankElement($element) {
$this->elements[] = $element;
$this->info[$element] = new HTMLPurifier_ElementDef();
$this->info[$element]->standalone = false;
if (!isset($this->info[$element])) {
$this->elements[] = $element;
$this->info[$element] = new HTMLPurifier_ElementDef();
$this->info[$element]->standalone = false;
} else {
trigger_error("Definition for $element already exists in module, cannot redefine");
}
return $this->info[$element];
}

View File

@ -51,12 +51,6 @@ class HTMLPurifier_HTMLModule_Legacy extends HTMLPurifier_HTMLModule
// setup modifications to old elements
$li =& $this->addBlankElement('li');
$li->attr['value'] = new HTMLPurifier_AttrDef_Integer();
$ol =& $this->addBlankElement('ol');
$ol->attr['start'] = new HTMLPurifier_AttrDef_Integer();
$align = 'Enum#left,right,center,justify';
$address =& $this->addBlankElement('address');
@ -86,7 +80,59 @@ class HTMLPurifier_HTMLModule_Legacy extends HTMLPurifier_HTMLModule
$h->attr['align'] = $align;
}
// to be continued...
$hr =& $this->addBlankElement('hr');
$hr->attr['align'] = $align;
$hr->attr['noshade'] = 'Bool#noshade';
$hr->attr['size'] = 'Pixels';
$hr->attr['width'] = 'Length';
$img =& $this->addBlankElement('img');
$img->attr['align'] = 'Enum#top,middle,bottom,left,right';
$img->attr['border'] = 'Pixels';
$img->attr['hspace'] = 'Pixels';
$img->attr['vspace'] = 'Pixels';
// figure out this integer business
$li =& $this->addBlankElement('li');
$li->attr['value'] = new HTMLPurifier_AttrDef_Integer();
$li->attr['type'] = 'Enum#s:1,i,I,a,A,disc,square,circle';
$ol =& $this->addBlankElement('ol');
$ol->attr['compact'] = 'Bool#compact';
$ol->attr['start'] = new HTMLPurifier_AttrDef_Integer();
$ol->attr['type'] = 'Enum#s:1,i,I,a,A';
$p =& $this->addBlankElement('p');
$p->attr['align'] = $align;
$pre =& $this->addBlankElement('pre');
$pre->attr['width'] = 'Number';
// script omitted
$table =& $this->addBlankElement('table');
$table->attr['align'] = 'Enum#left,center,right';
$table->attr['bgcolor'] = 'Color';
$tr =& $this->addBlankElement('tr');
$tr->attr['bgcolor'] = 'Color';
$th =& $this->addBlankElement('th');
$th->attr['bgcolor'] = 'Color';
$th->attr['height'] = 'Length';
$th->attr['nowrap'] = 'Bool#nowrap';
$th->attr['width'] = 'Length';
$td =& $this->addBlankElement('td');
$td->attr['bgcolor'] = 'Color';
$td->attr['height'] = 'Length';
$td->attr['nowrap'] = 'Bool#nowrap';
$td->attr['width'] = 'Length';
$ul =& $this->addBlankElement('ul');
$ul->attr['compact'] = 'Bool#compact';
$ul->attr['type'] = 'Enum#square,disc,circle';
}

View File

@ -23,10 +23,49 @@ hr[noshade='noshade'],
hr[width='50'],
hr[size='50'],
img[align='right'],
img[border='3'],
img[hspace='5'],
img[vspace='5'],
input[align='right'],
legend[align='center'],
li[type='A'],
li[value='5'],
ol[compact='compact'],
ol[start='3'],
ol[type='I'],
p[align='right'],
pre[width='50'],
table[align='right'],
table[bgcolor='#0000FF'],
tr[bgcolor='#0000FF'],
td[bgcolor='#0000FF'],
td[height='50'],
td[nowrap='nowrap'],
td[width='200'],
th[bgcolor='#0000FF'],
th[height='50'],
th[nowrap='nowrap'],
th[width='200'],
ul[compact='compact'],
ul[type='square'],
.insert-declarations-above
{background:#008000; color:#FFF; font-weight:bold;}
font {background:#BFB;}
u {border:1px solid #000;}
hr {height:1em;}
hr[size='50'] {height:50px;}
hr[size='50'] {height:50px;}
img[border='3'] {border: 3px solid #000;}
li[type='a'], li[value='5'] {color:#DDD;}

View File

@ -76,26 +76,49 @@ hr@width
hr@size
<hr size="50" />
<img src="" alt="img@align" align="right" /> |
<img src="" alt="img@border" border="3" /> |
<img src="" alt="img@hspace" hspace="5" /> |
<img src="" alt="img@vspace" vspace="5" />
<!-- needs context -->
<input align="right" />
<legend align="center">Legend</legend>
<ol>
<li type="A">li@type (ensure that it's a capital A)</li>
<li value="5">li@value</li>
</ol>
<ol compact="compact"><li>ol@compact</li></ol>
<ol start="3"><li>ol@start</li></ol>
<ol type="I"><li>ol@type</li></ol>
<p align="right">p@align</p>
<pre width="50">pre@width</pre>
<script language="JavaScript">document.writeln('script');</script>
<table align="right"><tr><td>table@align</td></tr></table>
<table bgcolor="#0000FF"><tr><td>table@bgcolor</td></tr></table>
<table><tr bgcolor="#0000FF"><td>tr@bgcolor</td></tr></table>
<table><tr><td bgcolor="#0000FF">td@bgcolor</td></tr></table>
<table><tr><td height="50">td@height</td></tr></table>
<table><tr><td nowrap="nowrap">td@nowrap</td></tr></table>
<table><tr><td width="200">td@width</td></tr></table>
<table><tr><th bgcolor="#0000FF">th@bgcolor</th></tr></table>
<table><tr><th height="50">th@height</th></tr></table>
<table><tr><th nowrap="nowrap">th@nowrap</th></tr></table>
<table><tr><th width="200">th@width</th></tr></table>
<ul compact="compact"><li>ul@compact</li></ul>
<ul type="square"><li>ul@square</li></ul>
</div>
<!--
img& align ("top" | "middle" | "bottom" | "left" | "right"), border (Pixels), hspace (Pixels), vspace (Pixels)
input& align ("top" | "middle" | "bottom" | "left" | "right") When the Basic Forms or Forms Module is selected.
legend& align ("left" | "center" | "right" | "justify") When the Forms Module is selected.
li& type (CDATA), value (Number)
ol& compact ("compact"), start (Number), type (CDATA)
p& align ("left" | "center" | "right", "justify")
pre& width (Number)
script& language (CDATA) When the Scripting module is selected.
table& align ("left" | "center" | "right"), bgcolor (Color) When the Tables module is selected.
tr& bgcolor (Color) When the Tables module is selected.
th& bgcolor (Color), height (Length) nowrap ("nowrap"), width (Length) When the Tables module is selected.
td& bgcolor (Color), height (Length) nowrap ("nowrap"), width (Length) When the Tables module is selected.
ul& compact ("compact"), type (CDATA)
-->
</body>
</html>

View File

@ -25,9 +25,14 @@ class HTMLPurifier_AttrDef_EnumTest extends HTMLPurifier_AttrDefHarness
function test_make() {
$factory = new HTMLPurifier_AttrDef_Enum();
$def = $factory->make('foo,bar');
$def2 = new HTMLPurifier_AttrDef_Enum(array('foo', 'bar'));
$this->assertIdentical($def, $def2);
$def = $factory->make('s:foo,BAR');
$def2 = new HTMLPurifier_AttrDef_Enum(array('foo', 'BAR'), true);
$this->assertIdentical($def, $def2);
}
}