summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrew Sidwell <andy@entai.co.uk>2008-07-11 16:19:02 +0000
committerAndrew Sidwell <andy@entai.co.uk>2008-07-11 16:19:02 +0000
commit633b3acab1a0640cf3c452f213c37f068283ce51 (patch)
tree245f81573f86b8d9c3c75f102bac334f1b77aec3 /src
parenta08950658b99ee28c583deb8ba2da409cada3c85 (diff)
downloadlibhubbub-633b3acab1a0640cf3c452f213c37f068283ce51.tar.gz
libhubbub-633b3acab1a0640cf3c452f213c37f068283ce51.tar.bz2
Turn on basic MathML support.
svn path=/trunk/hubbub/; revision=4606
Diffstat (limited to 'src')
-rw-r--r--src/treebuilder/in_body.c13
-rw-r--r--src/treebuilder/in_foreign_content.c26
-rw-r--r--src/treebuilder/treebuilder.c3
3 files changed, 31 insertions, 11 deletions
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 },