From 161270ce4a158074ca60d538a75fce71e9c91802 Mon Sep 17 00:00:00 2001 From: Andrew Sidwell Date: Fri, 11 Jul 2008 19:08:26 +0000 Subject: Add element names to treebuilder.c, change scoping rules, and more SVG support. svn path=/trunk/hubbub/; revision=4618 --- src/treebuilder/in_foreign_content.c | 10 ++++++++-- src/treebuilder/internal.h | 5 +++-- src/treebuilder/treebuilder.c | 17 +++++++++++++++-- 3 files changed, 26 insertions(+), 6 deletions(-) (limited to 'src') 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; -- cgit v1.2.3