summaryrefslogtreecommitdiff
path: root/src/treebuilder
diff options
context:
space:
mode:
authorAndrew Sidwell <andy@entai.co.uk>2008-07-11 19:08:26 +0000
committerAndrew Sidwell <andy@entai.co.uk>2008-07-11 19:08:26 +0000
commit161270ce4a158074ca60d538a75fce71e9c91802 (patch)
tree95e1fbee16319e226556cd7ac35113d8abd2ee64 /src/treebuilder
parent8ce044444e124a8e806b3f23c5e4501fa08010dc (diff)
downloadlibhubbub-161270ce4a158074ca60d538a75fce71e9c91802.tar.gz
libhubbub-161270ce4a158074ca60d538a75fce71e9c91802.tar.bz2
Add element names to treebuilder.c, change scoping rules, and more SVG support.
svn path=/trunk/hubbub/; revision=4618
Diffstat (limited to 'src/treebuilder')
-rw-r--r--src/treebuilder/in_foreign_content.c10
-rw-r--r--src/treebuilder/internal.h5
-rw-r--r--src/treebuilder/treebuilder.c17
3 files changed, 26 insertions, 6 deletions
diff --git a/src/treebuilder/in_foreign_content.c b/src/treebuilder/in_foreign_content.c
index 5887262..5b38839 100644
--- a/src/treebuilder/in_foreign_content.c
+++ b/src/treebuilder/in_foreign_content.c
@@ -376,11 +376,17 @@ bool handle_in_foreign_content(hubbub_treebuilder *treebuilder,
&token->data.tag.name);
if (cur_node_ns == HUBBUB_NS_HTML ||
- (cur_node_ns == HUBBUB_NS_MATHML &&
+ (cur_node_ns == HUBBUB_NS_MATHML &&
(type != MGLYPH && type != MALIGNMARK) &&
(cur_node == MI || cur_node == MO ||
cur_node == MN || cur_node == MS ||
- cur_node == MTEXT))) {
+ cur_node == MTEXT)) ||
+ (type == SVG && (cur_node_ns == HUBBUB_NS_MATHML &&
+ cur_node == ANNOTATION_XML)) ||
+ (cur_node_ns == HUBBUB_NS_SVG &&
+ (cur_node == FOREIGNOBJECT ||
+ cur_node == DESC ||
+ cur_node == TITLE))) {
process_as_in_secondary(treebuilder, token);
} else if (type == B || type == BIG || type == BLOCKQUOTE ||
type == BODY || type == BR || type == CENTER ||
diff --git a/src/treebuilder/internal.h b/src/treebuilder/internal.h
index fe57b74..f0c5940 100644
--- a/src/treebuilder/internal.h
+++ b/src/treebuilder/internal.h
@@ -29,9 +29,10 @@ typedef enum
/**< \todo Enumerate phrasing elements */
CODE, LABEL, RP, RT, RUBY, SPAN, SUB, SUP, VAR, XMP,
/* MathML */
- MATH, MGLYPH, MALIGNMARK, MI, MO, MN, MS, MTEXT,
+ MATH, MGLYPH, MALIGNMARK, MI, MO, MN, MS, MTEXT, ANNOTATION_XML,
/* SVG */
- SVG,
+ SVG, FOREIGNOBJECT, /* foreignobject is scoping, but only in SVG ns */
+ DESC,
UNKNOWN,
} element_type;
diff --git a/src/treebuilder/treebuilder.c b/src/treebuilder/treebuilder.c
index 516c28e..217a3ca 100644
--- a/src/treebuilder/treebuilder.c
+++ b/src/treebuilder/treebuilder.c
@@ -64,7 +64,15 @@ static const struct {
{ "SMALL", SMALL }, { "STRIKE", STRIKE },
{ "STRONG", STRONG }, { "TT", TT },
{ "U", U }, { "XMP", XMP },
- { "MATH", MATH }, { "SVG", SVG },
+
+ { "MATH", MATH }, { "MGLYPH", MGLYPH },
+ { "MALIGNMARK", MALIGNMARK },
+ { "MI", MI }, { "MO", MO },
+ { "MN", MN }, { "MS", MS },
+ { "MTEXT", MTEXT }, { "ANNOTATION-XML", ANNOTATION_XML },
+
+ { "SVG", SVG }, { "DESC", DESC },
+ { "FOREIGNOBJECT", FOREIGNOBJECT },
};
@@ -571,6 +579,8 @@ uint32_t element_in_scope(hubbub_treebuilder *treebuilder,
assert((signed) treebuilder->context.current_node >= 0);
for (node = treebuilder->context.current_node; node > 0; node--) {
+ hubbub_ns node_ns =
+ treebuilder->context.element_stack[node].ns;
element_type node_type =
treebuilder->context.element_stack[node].type;
@@ -585,8 +595,11 @@ uint32_t element_in_scope(hubbub_treebuilder *treebuilder,
* in the previous conditional and HTML should only occur
* as the first node in the stack, which is never processed
* in this loop. */
- if (!in_table && is_scoping_element(node_type))
+ if (!in_table && (is_scoping_element(node_type) ||
+ (node_type == FOREIGNOBJECT &&
+ node_ns == HUBBUB_NS_SVG))) {
break;
+ }
}
return 0;