summaryrefslogtreecommitdiff
path: root/src/treebuilder/in_foreign_content.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/treebuilder/in_foreign_content.c')
-rw-r--r--src/treebuilder/in_foreign_content.c26
1 files changed, 20 insertions, 6 deletions
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;
}