From 7534c5a616261ef9944ff847a1000fca38ee9dbe Mon Sep 17 00:00:00 2001 From: Andrew Sidwell Date: Tue, 24 Jun 2008 23:42:13 +0000 Subject: Add "in caption" insertion mode. svn path=/trunk/hubbub/; revision=4436 --- src/treebuilder/Makefile | 1 + src/treebuilder/in_caption.c | 100 +++++++++++++++++++++++++++++++++++++++++++ src/treebuilder/modes.h | 2 + 3 files changed, 103 insertions(+) create mode 100644 src/treebuilder/in_caption.c (limited to 'src') diff --git a/src/treebuilder/Makefile b/src/treebuilder/Makefile index f73f774..3bbe3a2 100644 --- a/src/treebuilder/Makefile +++ b/src/treebuilder/Makefile @@ -35,6 +35,7 @@ d := $(DIR) SRCS_$(d) := treebuilder.c \ initial.c before_html.c before_head.c in_head.c \ in_head_noscript.c after_head.c in_body.c \ + in_caption.c \ generic_rcdata.c script_collect.c # Append to sources for component diff --git a/src/treebuilder/in_caption.c b/src/treebuilder/in_caption.c new file mode 100644 index 0000000..123ba76 --- /dev/null +++ b/src/treebuilder/in_caption.c @@ -0,0 +1,100 @@ +/* + * This file is part of Hubbub. + * Licensed under the MIT License, + * http://www.opensource.org/licenses/mit-license.php + * Copyright 2008 Andrew Sidwell + */ + +#include +#include + +#include "treebuilder/modes.h" +#include "treebuilder/internal.h" +#include "treebuilder/treebuilder.h" +#include "utils/utils.h" + + +/** + * Handle tokens in "in caption" insertion mode + * + * \param treebuilder The treebuilder instance + * \param token The token to process + * \return True to reprocess the token, false otherwise + */ +bool handle_in_caption(hubbub_treebuilder *treebuilder, + const hubbub_token *token) +{ + bool reprocess = false; + bool handled = false; + + switch (token->type) { + case HUBBUB_TOKEN_START_TAG: + { + element_type type = element_type_from_name(treebuilder, + &token->data.tag.name); + + if (type == CAPTION || type == COL || type == COLGROUP || + type == TBODY || type == TD || type == TFOOT || + type == TH || type == THEAD || type == TR) { + /** \todo parse error */ + handled = true; + } else { + /* Process as if "in body" */ + process_tag_in_body(treebuilder, token); + } + } + break; + case HUBBUB_TOKEN_END_TAG: + { + element_type type = element_type_from_name(treebuilder, + &token->data.tag.name); + + if (type == CAPTION || type == TABLE) { + /** \todo parse error if type == TABLE */ + handled = true; + } else if (type == BODY || type == COL || type == COLGROUP || + type == HTML || type == TBODY || type == TD || + type == TFOOT || type == TH || + type == THEAD || type == TR) { + /** \todo parse error */ + } else { + /* Process as if "in body" */ + process_tag_in_body(treebuilder, token); + } + } + break; + case HUBBUB_TOKEN_CHARACTER: + case HUBBUB_TOKEN_COMMENT: + case HUBBUB_TOKEN_DOCTYPE: + case HUBBUB_TOKEN_EOF: + /* Process as if "in body" */ + process_tag_in_body(treebuilder, token); + + break; + } + + if (handled || reprocess) { + element_type otype = UNKNOWN; + void *node; + + /** \todo fragment case */ + + close_implied_end_tags(treebuilder, UNKNOWN); + + + while (otype != CAPTION) { + /** \todo parse error */ + + if (!element_stack_pop(treebuilder, &otype, &node)) { + /** \todo errors */ + } + } + + clear_active_formatting_list_to_marker(treebuilder); + + treebuilder->context.mode = IN_TABLE; + } + + return reprocess; +} + diff --git a/src/treebuilder/modes.h b/src/treebuilder/modes.h index 44a4b9c..8082e5f 100644 --- a/src/treebuilder/modes.h +++ b/src/treebuilder/modes.h @@ -55,6 +55,8 @@ bool handle_after_head(hubbub_treebuilder *treebuilder, const hubbub_token *token); bool handle_in_body(hubbub_treebuilder *treebuilder, const hubbub_token *token); +bool handle_in_caption(hubbub_treebuilder *treebuilder, + const hubbub_token *token); bool handle_generic_rcdata(hubbub_treebuilder *treebuilder, const hubbub_token *token); bool handle_script_collect_characters(hubbub_treebuilder *treebuilder, -- cgit v1.2.3