diff options
author | Andrew Sidwell <andy@entai.co.uk> | 2008-07-11 19:08:26 +0000 |
---|---|---|
committer | Andrew Sidwell <andy@entai.co.uk> | 2008-07-11 19:08:26 +0000 |
commit | 161270ce4a158074ca60d538a75fce71e9c91802 (patch) | |
tree | 95e1fbee16319e226556cd7ac35113d8abd2ee64 | |
parent | 8ce044444e124a8e806b3f23c5e4501fa08010dc (diff) | |
download | libhubbub-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
-rw-r--r-- | src/treebuilder/in_foreign_content.c | 10 | ||||
-rw-r--r-- | src/treebuilder/internal.h | 5 | ||||
-rw-r--r-- | src/treebuilder/treebuilder.c | 17 |
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; |