From 633b3acab1a0640cf3c452f213c37f068283ce51 Mon Sep 17 00:00:00 2001 From: Andrew Sidwell Date: Fri, 11 Jul 2008 16:19:02 +0000 Subject: Turn on basic MathML support. svn path=/trunk/hubbub/; revision=4606 --- src/treebuilder/in_body.c | 13 +++++++++---- src/treebuilder/in_foreign_content.c | 26 ++++++++++++++++++++------ src/treebuilder/treebuilder.c | 3 ++- 3 files changed, 31 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/treebuilder/in_body.c b/src/treebuilder/in_body.c index f658293..2ef2cde 100644 --- a/src/treebuilder/in_body.c +++ b/src/treebuilder/in_body.c @@ -316,14 +316,19 @@ bool process_start_tag(hubbub_treebuilder *treebuilder, } else if (type == RP || type == RT) { /** \todo ruby */ } else if (type == MATH) { + hubbub_tag tag = token->data.tag; + reconstruct_active_formatting_list(treebuilder); - /** \todo adjust foreign attributes */ - /** \todo insert foreign element */ + adjust_foreign_attributes(treebuilder, &tag); + + tag.ns = HUBBUB_NS_MATHML; + if (token->data.tag.self_closing) { - /** \todo pop off the stack of open elements */ + insert_element_no_push(treebuilder, &tag); /** \todo ack sc flag */ } else { - /** \todo set to "in foreign content" */ + insert_element(treebuilder, &tag); + treebuilder->context.mode = IN_FOREIGN_CONTENT; } } else if (type == CAPTION || type == COL || type == COLGROUP || type == FRAME || type == FRAMESET || diff --git a/src/treebuilder/in_foreign_content.c b/src/treebuilder/in_foreign_content.c index ba498af..7c83b29 100644 --- a/src/treebuilder/in_foreign_content.c +++ b/src/treebuilder/in_foreign_content.c @@ -47,6 +47,13 @@ bool handle_in_foreign_content(hubbub_treebuilder *treebuilder, { bool reprocess = false; + element_type type = element_type_from_name(treebuilder, + &token->data.tag.name); + + element_type cur_node = current_node(treebuilder); + hubbub_ns cur_node_ns = current_node_ns(treebuilder); + + switch (token->type) { case HUBBUB_TOKEN_CHARACTER: append_text(treebuilder, &token->data.character); @@ -61,12 +68,6 @@ bool handle_in_foreign_content(hubbub_treebuilder *treebuilder, break; case HUBBUB_TOKEN_START_TAG: { - element_type type = element_type_from_name(treebuilder, - &token->data.tag.name); - - element_type cur_node = current_node(treebuilder); - hubbub_ns cur_node_ns = current_node_ns(treebuilder); - if (cur_node_ns == HUBBUB_NS_HTML || (cur_node_ns == HUBBUB_NS_MATHML && (type != MGLYPH && type != MALIGNMARK) && @@ -133,6 +134,19 @@ bool handle_in_foreign_content(hubbub_treebuilder *treebuilder, /** \parse error */ break; case HUBBUB_TOKEN_EOF: + while (cur_node_ns != HUBBUB_NS_HTML) { + void *node; + element_stack_pop(treebuilder, &cur_node_ns, + &cur_node, &node); + treebuilder->tree_handler->unref_node( + treebuilder->tree_handler->ctx, + node); + cur_node_ns = current_node_ns(treebuilder); + } + + treebuilder->context.mode = + treebuilder->context.second_mode; + reprocess = true; break; } diff --git a/src/treebuilder/treebuilder.c b/src/treebuilder/treebuilder.c index 1f6baef..9a9f895 100644 --- a/src/treebuilder/treebuilder.c +++ b/src/treebuilder/treebuilder.c @@ -38,7 +38,8 @@ static const struct { { "IMAGE", IMAGE }, { "IMG", IMG }, { "INPUT", INPUT }, { "ISINDEX", ISINDEX }, { "LI", LI }, { "LINK", LINK }, - { "LISTING", LISTING }, { "MENU", MENU }, + { "LISTING", LISTING }, { "MATH", MATH }, + { "MENU", MENU }, { "META", META }, { "NOEMBED", NOEMBED }, { "NOFRAMES", NOFRAMES }, { "NOSCRIPT", NOSCRIPT }, { "OL", OL }, { "OPTGROUP", OPTGROUP }, -- cgit v1.2.3