Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
mahara
mahara
Commits
e1d3154e
Commit
e1d3154e
authored
Feb 01, 2012
by
Richard Mansfield
Committed by
Gerrit Code Review
Feb 01, 2012
Browse files
Merge "htmlpurifier: new upstream version 4.4.0 (bug #921314)"
parents
34866a4f
f817c73a
Changes
46
Hide whitespace changes
Inline
Side-by-side
htdocs/lib/htmlpurifier/HTMLPurifier.includes.php
View file @
e1d3154e
...
...
@@ -7,7 +7,7 @@
* primary concern and you are using an opcode cache. PLEASE DO NOT EDIT THIS
* FILE, changes will be overwritten the next time the script is run.
*
* @version 4.
3
.0
* @version 4.
4
.0
*
* @warning
* You must *not* include any other HTML Purifier files before this file,
...
...
@@ -73,6 +73,7 @@ require 'HTMLPurifier/UnitConverter.php';
require
'HTMLPurifier/VarParser.php'
;
require
'HTMLPurifier/VarParserException.php'
;
require
'HTMLPurifier/AttrDef/CSS.php'
;
require
'HTMLPurifier/AttrDef/Clone.php'
;
require
'HTMLPurifier/AttrDef/Enum.php'
;
require
'HTMLPurifier/AttrDef/Integer.php'
;
require
'HTMLPurifier/AttrDef/Lang.php'
;
...
...
@@ -90,6 +91,7 @@ require 'HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php';
require
'HTMLPurifier/AttrDef/CSS/Filter.php'
;
require
'HTMLPurifier/AttrDef/CSS/Font.php'
;
require
'HTMLPurifier/AttrDef/CSS/FontFamily.php'
;
require
'HTMLPurifier/AttrDef/CSS/Ident.php'
;
require
'HTMLPurifier/AttrDef/CSS/ImportantDecorator.php'
;
require
'HTMLPurifier/AttrDef/CSS/Length.php'
;
require
'HTMLPurifier/AttrDef/CSS/ListStyle.php'
;
...
...
@@ -130,10 +132,12 @@ require 'HTMLPurifier/AttrTransform/SafeEmbed.php';
require
'HTMLPurifier/AttrTransform/SafeObject.php'
;
require
'HTMLPurifier/AttrTransform/SafeParam.php'
;
require
'HTMLPurifier/AttrTransform/ScriptRequired.php'
;
require
'HTMLPurifier/AttrTransform/TargetBlank.php'
;
require
'HTMLPurifier/AttrTransform/Textarea.php'
;
require
'HTMLPurifier/ChildDef/Chameleon.php'
;
require
'HTMLPurifier/ChildDef/Custom.php'
;
require
'HTMLPurifier/ChildDef/Empty.php'
;
require
'HTMLPurifier/ChildDef/List.php'
;
require
'HTMLPurifier/ChildDef/Required.php'
;
require
'HTMLPurifier/ChildDef/Optional.php'
;
require
'HTMLPurifier/ChildDef/StrictBlockquote.php'
;
...
...
@@ -148,6 +152,7 @@ require 'HTMLPurifier/HTMLModule/CommonAttributes.php';
require
'HTMLPurifier/HTMLModule/Edit.php'
;
require
'HTMLPurifier/HTMLModule/Forms.php'
;
require
'HTMLPurifier/HTMLModule/Hypertext.php'
;
require
'HTMLPurifier/HTMLModule/Iframe.php'
;
require
'HTMLPurifier/HTMLModule/Image.php'
;
require
'HTMLPurifier/HTMLModule/Legacy.php'
;
require
'HTMLPurifier/HTMLModule/List.php'
;
...
...
@@ -164,6 +169,7 @@ require 'HTMLPurifier/HTMLModule/Scripting.php';
require
'HTMLPurifier/HTMLModule/StyleAttribute.php'
;
require
'HTMLPurifier/HTMLModule/Tables.php'
;
require
'HTMLPurifier/HTMLModule/Target.php'
;
require
'HTMLPurifier/HTMLModule/TargetBlank.php'
;
require
'HTMLPurifier/HTMLModule/Text.php'
;
require
'HTMLPurifier/HTMLModule/Tidy.php'
;
require
'HTMLPurifier/HTMLModule/XMLCommonAttributes.php'
;
...
...
@@ -202,6 +208,7 @@ require 'HTMLPurifier/URIFilter/DisableResources.php';
require
'HTMLPurifier/URIFilter/HostBlacklist.php'
;
require
'HTMLPurifier/URIFilter/MakeAbsolute.php'
;
require
'HTMLPurifier/URIFilter/Munge.php'
;
require
'HTMLPurifier/URIFilter/SafeIframe.php'
;
require
'HTMLPurifier/URIScheme/data.php'
;
require
'HTMLPurifier/URIScheme/file.php'
;
require
'HTMLPurifier/URIScheme/ftp.php'
;
...
...
htdocs/lib/htmlpurifier/HTMLPurifier.php
View file @
e1d3154e
...
...
@@ -19,7 +19,7 @@
*/
/*
HTML Purifier 4.
3
.0 - Standards Compliant HTML Filtering
HTML Purifier 4.
4
.0 - Standards Compliant HTML Filtering
Copyright (C) 2006-2008 Edward Z. Yang
This library is free software; you can redistribute it and/or
...
...
@@ -55,10 +55,10 @@ class HTMLPurifier
{
/** Version of HTML Purifier */
public
$version
=
'4.
3
.0'
;
public
$version
=
'4.
4
.0'
;
/** Constant with version of HTML Purifier */
const
VERSION
=
'4.
3
.0'
;
const
VERSION
=
'4.
4
.0'
;
/** Global configuration object */
public
$config
;
...
...
htdocs/lib/htmlpurifier/HTMLPurifier.safe-includes.php
View file @
e1d3154e
...
...
@@ -67,6 +67,7 @@ require_once $__dir . '/HTMLPurifier/UnitConverter.php';
require_once
$__dir
.
'/HTMLPurifier/VarParser.php'
;
require_once
$__dir
.
'/HTMLPurifier/VarParserException.php'
;
require_once
$__dir
.
'/HTMLPurifier/AttrDef/CSS.php'
;
require_once
$__dir
.
'/HTMLPurifier/AttrDef/Clone.php'
;
require_once
$__dir
.
'/HTMLPurifier/AttrDef/Enum.php'
;
require_once
$__dir
.
'/HTMLPurifier/AttrDef/Integer.php'
;
require_once
$__dir
.
'/HTMLPurifier/AttrDef/Lang.php'
;
...
...
@@ -84,6 +85,7 @@ require_once $__dir . '/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php';
require_once
$__dir
.
'/HTMLPurifier/AttrDef/CSS/Filter.php'
;
require_once
$__dir
.
'/HTMLPurifier/AttrDef/CSS/Font.php'
;
require_once
$__dir
.
'/HTMLPurifier/AttrDef/CSS/FontFamily.php'
;
require_once
$__dir
.
'/HTMLPurifier/AttrDef/CSS/Ident.php'
;
require_once
$__dir
.
'/HTMLPurifier/AttrDef/CSS/ImportantDecorator.php'
;
require_once
$__dir
.
'/HTMLPurifier/AttrDef/CSS/Length.php'
;
require_once
$__dir
.
'/HTMLPurifier/AttrDef/CSS/ListStyle.php'
;
...
...
@@ -124,10 +126,12 @@ require_once $__dir . '/HTMLPurifier/AttrTransform/SafeEmbed.php';
require_once
$__dir
.
'/HTMLPurifier/AttrTransform/SafeObject.php'
;
require_once
$__dir
.
'/HTMLPurifier/AttrTransform/SafeParam.php'
;
require_once
$__dir
.
'/HTMLPurifier/AttrTransform/ScriptRequired.php'
;
require_once
$__dir
.
'/HTMLPurifier/AttrTransform/TargetBlank.php'
;
require_once
$__dir
.
'/HTMLPurifier/AttrTransform/Textarea.php'
;
require_once
$__dir
.
'/HTMLPurifier/ChildDef/Chameleon.php'
;
require_once
$__dir
.
'/HTMLPurifier/ChildDef/Custom.php'
;
require_once
$__dir
.
'/HTMLPurifier/ChildDef/Empty.php'
;
require_once
$__dir
.
'/HTMLPurifier/ChildDef/List.php'
;
require_once
$__dir
.
'/HTMLPurifier/ChildDef/Required.php'
;
require_once
$__dir
.
'/HTMLPurifier/ChildDef/Optional.php'
;
require_once
$__dir
.
'/HTMLPurifier/ChildDef/StrictBlockquote.php'
;
...
...
@@ -142,6 +146,7 @@ require_once $__dir . '/HTMLPurifier/HTMLModule/CommonAttributes.php';
require_once
$__dir
.
'/HTMLPurifier/HTMLModule/Edit.php'
;
require_once
$__dir
.
'/HTMLPurifier/HTMLModule/Forms.php'
;
require_once
$__dir
.
'/HTMLPurifier/HTMLModule/Hypertext.php'
;
require_once
$__dir
.
'/HTMLPurifier/HTMLModule/Iframe.php'
;
require_once
$__dir
.
'/HTMLPurifier/HTMLModule/Image.php'
;
require_once
$__dir
.
'/HTMLPurifier/HTMLModule/Legacy.php'
;
require_once
$__dir
.
'/HTMLPurifier/HTMLModule/List.php'
;
...
...
@@ -158,6 +163,7 @@ require_once $__dir . '/HTMLPurifier/HTMLModule/Scripting.php';
require_once
$__dir
.
'/HTMLPurifier/HTMLModule/StyleAttribute.php'
;
require_once
$__dir
.
'/HTMLPurifier/HTMLModule/Tables.php'
;
require_once
$__dir
.
'/HTMLPurifier/HTMLModule/Target.php'
;
require_once
$__dir
.
'/HTMLPurifier/HTMLModule/TargetBlank.php'
;
require_once
$__dir
.
'/HTMLPurifier/HTMLModule/Text.php'
;
require_once
$__dir
.
'/HTMLPurifier/HTMLModule/Tidy.php'
;
require_once
$__dir
.
'/HTMLPurifier/HTMLModule/XMLCommonAttributes.php'
;
...
...
@@ -196,6 +202,7 @@ require_once $__dir . '/HTMLPurifier/URIFilter/DisableResources.php';
require_once
$__dir
.
'/HTMLPurifier/URIFilter/HostBlacklist.php'
;
require_once
$__dir
.
'/HTMLPurifier/URIFilter/MakeAbsolute.php'
;
require_once
$__dir
.
'/HTMLPurifier/URIFilter/Munge.php'
;
require_once
$__dir
.
'/HTMLPurifier/URIFilter/SafeIframe.php'
;
require_once
$__dir
.
'/HTMLPurifier/URIScheme/data.php'
;
require_once
$__dir
.
'/HTMLPurifier/URIScheme/file.php'
;
require_once
$__dir
.
'/HTMLPurifier/URIScheme/ftp.php'
;
...
...
htdocs/lib/htmlpurifier/HTMLPurifier/AttrDef/CSS/Ident.php
0 → 100644
View file @
e1d3154e
<?php
/**
* Validates based on {ident} CSS grammar production
*/
class
HTMLPurifier_AttrDef_CSS_Ident
extends
HTMLPurifier_AttrDef
{
public
function
validate
(
$string
,
$config
,
$context
)
{
$string
=
trim
(
$string
);
// early abort: '' and '0' (strings that convert to false) are invalid
if
(
!
$string
)
return
false
;
$pattern
=
'/^(-?[A-Za-z_][A-Za-z_\-0-9]*)$/'
;
if
(
!
preg_match
(
$pattern
,
$string
))
return
false
;
return
$string
;
}
}
// vim: et sw=4 sts=4
htdocs/lib/htmlpurifier/HTMLPurifier/AttrDef/Clone.php
0 → 100644
View file @
e1d3154e
<?php
/**
* Dummy AttrDef that mimics another AttrDef, BUT it generates clones
* with make.
*/
class
HTMLPurifier_AttrDef_Clone
extends
HTMLPurifier_AttrDef
{
/**
* What we're cloning
*/
protected
$clone
;
public
function
__construct
(
$clone
)
{
$this
->
clone
=
$clone
;
}
public
function
validate
(
$v
,
$config
,
$context
)
{
return
$this
->
clone
->
validate
(
$v
,
$config
,
$context
);
}
public
function
make
(
$string
)
{
return
clone
$this
->
clone
;
}
}
// vim: et sw=4 sts=4
htdocs/lib/htmlpurifier/HTMLPurifier/AttrDef/HTML/Color.php
View file @
e1d3154e
...
...
@@ -14,7 +14,7 @@ class HTMLPurifier_AttrDef_HTML_Color extends HTMLPurifier_AttrDef
$string
=
trim
(
$string
);
if
(
empty
(
$string
))
return
false
;
if
(
isset
(
$colors
[
$string
]))
return
$colors
[
$string
];
if
(
isset
(
$colors
[
strtolower
(
$string
)
]))
return
$colors
[
$string
];
if
(
$string
[
0
]
===
'#'
)
$hex
=
substr
(
$string
,
1
);
else
$hex
=
$string
;
...
...
htdocs/lib/htmlpurifier/HTMLPurifier/AttrDef/HTML/ID.php
View file @
e1d3154e
...
...
@@ -12,12 +12,22 @@
class
HTMLPurifier_AttrDef_HTML_ID
extends
HTMLPurifier_AttrDef
{
// ref functionality disabled, since we also have to verify
// whether or not the ID it refers to exists
// selector is NOT a valid thing to use for IDREFs, because IDREFs
// *must* target IDs that exist, whereas selector #ids do not.
/**
* Determines whether or not we're validating an ID in a CSS
* selector context.
*/
protected
$selector
;
public
function
__construct
(
$selector
=
false
)
{
$this
->
selector
=
$selector
;
}
public
function
validate
(
$id
,
$config
,
$context
)
{
if
(
!
$config
->
get
(
'Attr.EnableID'
))
return
false
;
if
(
!
$this
->
selector
&&
!
$config
->
get
(
'Attr.EnableID'
))
return
false
;
$id
=
trim
(
$id
);
// trim it first
...
...
@@ -33,10 +43,10 @@ class HTMLPurifier_AttrDef_HTML_ID extends HTMLPurifier_AttrDef
'%Attr.IDPrefix is set'
,
E_USER_WARNING
);
}
//
if (!$this->
ref
) {
if
(
!
$this
->
selector
)
{
$id_accumulator
=&
$context
->
get
(
'IDAccumulator'
);
if
(
isset
(
$id_accumulator
->
ids
[
$id
]))
return
false
;
//
}
}
// we purposely avoid using regex, hopefully this is faster
...
...
@@ -56,7 +66,7 @@ class HTMLPurifier_AttrDef_HTML_ID extends HTMLPurifier_AttrDef
return
false
;
}
if
(
/*
!$this->
ref
&&
*/
$result
)
$id_accumulator
->
add
(
$id
);
if
(
!
$this
->
selector
&&
$result
)
$id_accumulator
->
add
(
$id
);
// if no change was made to the ID, return the result
// else, return the new id if stripping whitespace made it
...
...
htdocs/lib/htmlpurifier/HTMLPurifier/AttrDef/URI.php
View file @
e1d3154e
...
...
@@ -19,7 +19,7 @@ class HTMLPurifier_AttrDef_URI extends HTMLPurifier_AttrDef
}
public
function
make
(
$string
)
{
$embeds
=
(
bool
)
$string
;
$embeds
=
(
$string
===
'embedded'
)
;
return
new
HTMLPurifier_AttrDef_URI
(
$embeds
);
}
...
...
htdocs/lib/htmlpurifier/HTMLPurifier/AttrDef/URI/Host.php
View file @
e1d3154e
...
...
@@ -44,9 +44,8 @@ class HTMLPurifier_AttrDef_URI_Host extends HTMLPurifier_AttrDef
// A regular domain name.
// This breaks I18N domain names, but we don't have proper IRI support,
// so force users to insert Punycode. If there's complaining we'll
// try to fix things into an international friendly form.
// This doesn't match I18N domain names, but we don't have proper IRI support,
// so force users to insert Punycode.
// The productions describing this are:
$a
=
'[a-z]'
;
// alpha
...
...
@@ -57,10 +56,44 @@ class HTMLPurifier_AttrDef_URI_Host extends HTMLPurifier_AttrDef
// toplabel = alpha | alpha *( alphanum | "-" ) alphanum
$toplabel
=
"
$a
(
$and
*
$an
)?"
;
// hostname = *( domainlabel "." ) toplabel [ "." ]
$match
=
preg_match
(
"/^(
$domainlabel
\.)*
$toplabel
\.?$/i"
,
$string
);
if
(
!
$match
)
return
false
;
if
(
preg_match
(
"/^(
$domainlabel
\.)*
$toplabel
\.?$/i"
,
$string
))
{
return
$string
;
}
// If we have Net_IDNA2 support, we can support IRIs by
// punycoding them. (This is the most portable thing to do,
// since otherwise we have to assume browsers support
if
(
$config
->
get
(
'Core.EnableIDNA'
))
{
$idna
=
new
Net_IDNA2
(
array
(
'encoding'
=>
'utf8'
,
'overlong'
=>
false
,
'strict'
=>
true
));
// we need to encode each period separately
$parts
=
explode
(
'.'
,
$string
);
try
{
$new_parts
=
array
();
foreach
(
$parts
as
$part
)
{
$encodable
=
false
;
for
(
$i
=
0
,
$c
=
strlen
(
$part
);
$i
<
$c
;
$i
++
)
{
if
(
ord
(
$part
[
$i
])
>
0x7a
)
{
$encodable
=
true
;
break
;
}
}
if
(
!
$encodable
)
{
$new_parts
[]
=
$part
;
}
else
{
$new_parts
[]
=
$idna
->
encode
(
$part
);
}
}
$string
=
implode
(
'.'
,
$new_parts
);
if
(
preg_match
(
"/^(
$domainlabel
\.)*
$toplabel
\.?$/i"
,
$string
))
{
return
$string
;
}
}
catch
(
Exception
$e
)
{
// XXX error reporting
}
}
return
$string
;
return
false
;
}
}
...
...
htdocs/lib/htmlpurifier/HTMLPurifier/AttrTransform/Nofollow.php
View file @
e1d3154e
...
...
@@ -24,9 +24,13 @@ class HTMLPurifier_AttrTransform_Nofollow extends HTMLPurifier_AttrTransform
$url
=
$this
->
parser
->
parse
(
$attr
[
'href'
]);
$scheme
=
$url
->
getSchemeObj
(
$config
,
$context
);
if
(
!
is_null
(
$url
->
host
)
&&
$scheme
!==
false
&&
$scheme
->
browsable
)
{
if
(
$scheme
->
browsable
&&
!
$url
->
isLocal
(
$config
,
$context
)
)
{
if
(
isset
(
$attr
[
'rel'
]))
{
$attr
[
'rel'
]
.
=
' nofollow'
;
$rels
=
explode
(
' '
,
$attr
);
if
(
!
in_array
(
'nofollow'
,
$rels
))
{
$rels
[]
=
'nofollow'
;
}
$attr
[
'rel'
]
=
implode
(
' '
,
$rels
);
}
else
{
$attr
[
'rel'
]
=
'nofollow'
;
}
...
...
htdocs/lib/htmlpurifier/HTMLPurifier/AttrTransform/TargetBlank.php
0 → 100644
View file @
e1d3154e
<?php
// must be called POST validation
/**
* Adds target="blank" to all outbound links. This transform is
* only attached if Attr.TargetBlank is TRUE. This works regardless
* of whether or not Attr.AllowedFrameTargets
*/
class
HTMLPurifier_AttrTransform_TargetBlank
extends
HTMLPurifier_AttrTransform
{
private
$parser
;
public
function
__construct
()
{
$this
->
parser
=
new
HTMLPurifier_URIParser
();
}
public
function
transform
(
$attr
,
$config
,
$context
)
{
if
(
!
isset
(
$attr
[
'href'
]))
{
return
$attr
;
}
// XXX Kind of inefficient
$url
=
$this
->
parser
->
parse
(
$attr
[
'href'
]);
$scheme
=
$url
->
getSchemeObj
(
$config
,
$context
);
if
(
$scheme
->
browsable
&&
!
$url
->
isBenign
(
$config
,
$context
))
{
$attr
[
'target'
]
=
'blank'
;
}
return
$attr
;
}
}
// vim: et sw=4 sts=4
htdocs/lib/htmlpurifier/HTMLPurifier/AttrTypes.php
View file @
e1d3154e
...
...
@@ -15,6 +15,13 @@ class HTMLPurifier_AttrTypes
* types.
*/
public
function
__construct
()
{
// XXX This is kind of poor, since we don't actually /clone/
// instances; instead, we use the supplied make() attribute. So,
// the underlying class must know how to deal with arguments.
// With the old implementation of Enum, that ignored its
// arguments when handling a make dispatch, the IAlign
// definition wouldn't work.
// pseudo-types, must be instantiated via shorthand
$this
->
info
[
'Enum'
]
=
new
HTMLPurifier_AttrDef_Enum
();
$this
->
info
[
'Bool'
]
=
new
HTMLPurifier_AttrDef_HTML_Bool
();
...
...
@@ -29,6 +36,9 @@ class HTMLPurifier_AttrTypes
$this
->
info
[
'URI'
]
=
new
HTMLPurifier_AttrDef_URI
();
$this
->
info
[
'LanguageCode'
]
=
new
HTMLPurifier_AttrDef_Lang
();
$this
->
info
[
'Color'
]
=
new
HTMLPurifier_AttrDef_HTML_Color
();
$this
->
info
[
'IAlign'
]
=
self
::
makeEnum
(
'top,middle,bottom,left,right'
);
$this
->
info
[
'LAlign'
]
=
self
::
makeEnum
(
'top,bottom,left,right'
);
$this
->
info
[
'FrameTarget'
]
=
new
HTMLPurifier_AttrDef_HTML_FrameTarget
();
// unimplemented aliases
$this
->
info
[
'ContentType'
]
=
new
HTMLPurifier_AttrDef_Text
();
...
...
@@ -44,6 +54,10 @@ class HTMLPurifier_AttrTypes
$this
->
info
[
'Number'
]
=
new
HTMLPurifier_AttrDef_Integer
(
false
,
false
,
true
);
}
private
static
function
makeEnum
(
$in
)
{
return
new
HTMLPurifier_AttrDef_Clone
(
new
HTMLPurifier_AttrDef_Enum
(
explode
(
','
,
$in
)));
}
/**
* Retrieves a type
* @param $type String type name
...
...
htdocs/lib/htmlpurifier/HTMLPurifier/ChildDef/List.php
0 → 100644
View file @
e1d3154e
<?php
/**
* Definition for list containers ul and ol.
*/
class
HTMLPurifier_ChildDef_List
extends
HTMLPurifier_ChildDef
{
public
$type
=
'list'
;
// lying a little bit, so that we can handle ul and ol ourselves
// XXX: This whole business with 'wrap' is all a bit unsatisfactory
public
$elements
=
array
(
'li'
=>
true
,
'ul'
=>
true
,
'ol'
=>
true
);
public
function
validateChildren
(
$tokens_of_children
,
$config
,
$context
)
{
// Flag for subclasses
$this
->
whitespace
=
false
;
// if there are no tokens, delete parent node
if
(
empty
(
$tokens_of_children
))
return
false
;
// the new set of children
$result
=
array
();
// current depth into the nest
$nesting
=
0
;
// a little sanity check to make sure it's not ALL whitespace
$all_whitespace
=
true
;
$seen_li
=
false
;
$need_close_li
=
false
;
foreach
(
$tokens_of_children
as
$token
)
{
if
(
!
empty
(
$token
->
is_whitespace
))
{
$result
[]
=
$token
;
continue
;
}
$all_whitespace
=
false
;
// phew, we're not talking about whitespace
if
(
$nesting
==
1
&&
$need_close_li
)
{
$result
[]
=
new
HTMLPurifier_Token_End
(
'li'
);
$nesting
--
;
$need_close_li
=
false
;
}
$is_child
=
(
$nesting
==
0
);
if
(
$token
instanceof
HTMLPurifier_Token_Start
)
{
$nesting
++
;
}
elseif
(
$token
instanceof
HTMLPurifier_Token_End
)
{
$nesting
--
;
}
if
(
$is_child
)
{
if
(
$token
->
name
===
'li'
)
{
// good
$seen_li
=
true
;
}
elseif
(
$token
->
name
===
'ul'
||
$token
->
name
===
'ol'
)
{
// we want to tuck this into the previous li
$need_close_li
=
true
;
$nesting
++
;
if
(
!
$seen_li
)
{
// create a new li element
$result
[]
=
new
HTMLPurifier_Token_Start
(
'li'
);
}
else
{
// backtrack until </li> found
while
(
true
)
{
$t
=
array_pop
(
$result
);
if
(
$t
instanceof
HTMLPurifier_Token_End
)
{
// XXX actually, these invariants could very plausibly be violated
// if we are doing silly things with modifying the set of allowed elements.
// FORTUNATELY, it doesn't make a difference, since the allowed
// elements are hard-coded here!
if
(
$t
->
name
!==
'li'
)
{
trigger_error
(
"Only li present invariant violated in List ChildDef"
,
E_USER_ERROR
);
return
false
;
}
break
;
}
elseif
(
$t
instanceof
HTMLPurifier_Token_Empty
)
{
// bleagh
if
(
$t
->
name
!==
'li'
)
{
trigger_error
(
"Only li present invariant violated in List ChildDef"
,
E_USER_ERROR
);
return
false
;
}
// XXX this should have a helper for it...
$result
[]
=
new
HTMLPurifier_Token_Start
(
'li'
,
$t
->
attr
,
$t
->
line
,
$t
->
col
,
$t
->
armor
);
break
;
}
else
{
if
(
!
$t
->
is_whitespace
)
{
trigger_error
(
"Only whitespace present invariant violated in List ChildDef"
,
E_USER_ERROR
);
return
false
;
}
}
}
}
}
else
{
// start wrapping (this doesn't precisely mimic
// browser behavior, but what browsers do is kind of
// hard to mimic in a standards compliant way
// XXX Actually, this has no impact in practice,
// because this gets handled earlier. Arguably,
// we should rip out all of that processing
$result
[]
=
new
HTMLPurifier_Token_Start
(
'li'
);
$nesting
++
;
$seen_li
=
true
;
$need_close_li
=
true
;
}
}
$result
[]
=
$token
;
}
if
(
$need_close_li
)
{
$result
[]
=
new
HTMLPurifier_Token_End
(
'li'
);
}
if
(
empty
(
$result
))
return
false
;
if
(
$all_whitespace
)
{
return
false
;
}
if
(
$tokens_of_children
==
$result
)
return
true
;
return
$result
;
}
}
// vim: et sw=4 sts=4
htdocs/lib/htmlpurifier/HTMLPurifier/ChildDef/Table.php
View file @
e1d3154e
<?php
/**
* Definition for tables
* Definition for tables. The general idea is to extract out all of the
* essential bits, and then reconstruct it later.
*
* This is a bit confusing, because the DTDs and the W3C
* validators seem to disagree on the appropriate definition. The
* DTD claims:
*
* (CAPTION?, (COL*|COLGROUP*), THEAD?, TFOOT?, TBODY+)
*
* But actually, the HTML4 spec then has this to say:
*
* The TBODY start tag is always required except when the table
* contains only one table body and no table head or foot sections.
* The TBODY end tag may always be safely omitted.
*
* So the DTD is kind of wrong. The validator is, unfortunately, kind
* of on crack.
*
* The definition changed again in XHTML1.1; and in my opinion, this
* formulation makes the most sense.
*
* caption?, ( col* | colgroup* ), (( thead?, tfoot?, tbody+ ) | ( tr+ ))
*
* Essentially, we have two modes: thead/tfoot/tbody mode, and tr mode.
* If we encounter a thead, tfoot or tbody, we are placed in the former
* mode, and we *must* wrap any stray tr segments with a tbody. But if
* we don't run into any of them, just have tr tags is OK.
*/
class
HTMLPurifier_ChildDef_Table
extends
HTMLPurifier_ChildDef
{
...
...
@@ -33,6 +59,8 @@ class HTMLPurifier_ChildDef_Table extends HTMLPurifier_ChildDef
$collection
=
array
();
// collected nodes
$tag_index
=
0
;
// the first node might be whitespace,
// so this tells us where the start tag is
$tbody_mode
=
false
;
// if true, then we need to wrap any stray
// <tr>s with a <tbody>.
foreach
(
$tokens_of_children
as
$token
)
{
$is_child
=
(
$nesting
==
0
);
...
...
@@ -51,8 +79,9 @@ class HTMLPurifier_ChildDef_Table extends HTMLPurifier_ChildDef
// okay, let's stash the tokens away
// first token tells us the type of the collection
switch
(
$collection
[
$tag_index
]
->
name
)
{
case
'tr'
:
case
'tbody'
:
$tbody_mode
=
true
;
case
'tr'
:
$content
[]
=
$collection
;
break
;
case
'caption'
:
...
...
@@ -61,13 +90,28 @@ class HTMLPurifier_ChildDef_Table extends HTMLPurifier_ChildDef
break
;
case
'thead'
:
case
'tfoot'
:
$tbody_mode
=
true
;
// XXX This breaks rendering properties with
// Firefox, which never floats a <thead> to
// the top. Ever. (Our scheme will float the
// first <thead> to the top.) So maybe
// <thead>s that are not first should be
// turned into <tbody>? Very tricky, indeed.
// access the appropriate variable, $thead or $tfoot
$var
=
$collection
[
$tag_index
]
->
name
;
if
(
$$var
===
false
)
{