diff --git a/Makefile.in b/Makefile.in index 6cf47df..e1bfcc4 100644 --- a/Makefile.in +++ b/Makefile.in @@ -67,5 +67,5 @@ check: .PHONY: clean clean: - rm -f *.so *.dylib *.dll *.dummy src/*.o + rm -f *.so *.dylib *.dll *.dummy */*.o */*/*.o diff --git a/include/hubbub/parser.h b/include/hubbub/parser.h index cd5d6b5..d0ac0cd 100644 --- a/include/hubbub/parser.h +++ b/include/hubbub/parser.h @@ -33,7 +33,8 @@ typedef enum hubbub_parser_opttype { HUBBUB_PARSER_TREE_HANDLER, HUBBUB_PARSER_DOCUMENT_NODE, HUBBUB_PARSER_ENABLE_SCRIPTING, - HUBBUB_PARSER_PAUSE + HUBBUB_PARSER_PAUSE, + HUBBUB_PARSER_ENABLE_STYLING } hubbub_parser_opttype; /** @@ -59,6 +60,7 @@ typedef union hubbub_parser_optparams { void *document_node; /**< Document node */ bool enable_scripting; /**< Whether to enable scripting */ + bool enable_styling; /**< Whether to enable styling */ bool pause_parse; /**< Pause parsing */ } hubbub_parser_optparams; diff --git a/include/hubbub/tree.h b/include/hubbub/tree.h index 48f6b5a..3c61e28 100644 --- a/include/hubbub/tree.h +++ b/include/hubbub/tree.h @@ -267,6 +267,15 @@ typedef hubbub_error (*hubbub_tree_encoding_change)(void *ctx, */ typedef hubbub_error (*hubbub_tree_complete_script)(void *ctx, void *script); +/** + * Complete style processing + * + * \param ctx Client's context + * \param style The style + * \return HUBBUB_OK on success, appropriate error otherwise. + */ +typedef hubbub_error (*hubbub_tree_complete_style)(void *ctx, void *style); + /** * Hubbub tree handler */ @@ -289,6 +298,7 @@ typedef struct hubbub_tree_handler { hubbub_tree_set_quirks_mode set_quirks_mode; /**< Set quirks mode */ hubbub_tree_encoding_change encoding_change; /**< Change encoding */ hubbub_tree_complete_script complete_script; /**< Script Complete */ + hubbub_tree_complete_style complete_style; /**< Style Complete */ void *ctx; /**< Context pointer */ } hubbub_tree_handler; diff --git a/src/parser.c b/src/parser.c index 5423922..df2d80b 100644 --- a/src/parser.c +++ b/src/parser.c @@ -204,6 +204,14 @@ hubbub_error hubbub_parser_setopt(hubbub_parser *parser, } break; + case HUBBUB_PARSER_ENABLE_STYLING: + if (parser->tb != NULL) { + result = hubbub_treebuilder_setopt(parser->tb, + HUBBUB_TREEBUILDER_ENABLE_STYLING, + (hubbub_treebuilder_optparams *) params); + } + break; + default: result = HUBBUB_INVALID; } diff --git a/src/treebuilder/generic_rcdata.c b/src/treebuilder/generic_rcdata.c index 9af9533..4d21608 100644 --- a/src/treebuilder/generic_rcdata.c +++ b/src/treebuilder/generic_rcdata.c @@ -67,6 +67,11 @@ hubbub_error handle_generic_rcdata(hubbub_treebuilder *treebuilder, err = complete_script(treebuilder); } + if ((treebuilder->context.enable_styling == true) && + (type == STYLE)) { + err = complete_style(treebuilder); + } + done = true; } break; diff --git a/src/treebuilder/internal.h b/src/treebuilder/internal.h index 503168f..ca22d91 100644 --- a/src/treebuilder/internal.h +++ b/src/treebuilder/internal.h @@ -93,6 +93,7 @@ typedef struct hubbub_treebuilder_context void *document; /**< Pointer to the document node */ bool enable_scripting; /**< Whether scripting is enabled */ + bool enable_styling; /**< Whether styling is enabled */ struct { insertion_mode mode; /**< Insertion mode to return to */ @@ -155,6 +156,7 @@ void reset_insertion_mode(hubbub_treebuilder *treebuilder); hubbub_error append_text(hubbub_treebuilder *treebuilder, const hubbub_string *string); hubbub_error complete_script(hubbub_treebuilder *treebuilder); +hubbub_error complete_style(hubbub_treebuilder *treebuilder); element_type element_type_from_name(hubbub_treebuilder *treebuilder, const hubbub_string *tag_name); diff --git a/src/treebuilder/treebuilder.c b/src/treebuilder/treebuilder.c index 10433b4..31678e0 100644 --- a/src/treebuilder/treebuilder.c +++ b/src/treebuilder/treebuilder.c @@ -258,6 +258,10 @@ hubbub_error hubbub_treebuilder_setopt(hubbub_treebuilder *treebuilder, treebuilder->context.enable_scripting = params->enable_scripting; break; + case HUBBUB_TREEBUILDER_ENABLE_STYLING: + treebuilder->context.enable_styling = + params->enable_styling; + break; } return HUBBUB_OK; @@ -940,6 +944,22 @@ hubbub_error complete_script(hubbub_treebuilder *treebuilder) return error; } +/** + * Style processing and execution + * + * \param treebuilder The treebuilder instance + * \return HUBBUB_OK on success, appropriate error otherwise + */ +hubbub_error complete_style(hubbub_treebuilder *treebuilder) +{ + hubbub_error error = HUBBUB_OK; + error = treebuilder->tree_handler->complete_style( + treebuilder->tree_handler->ctx, + treebuilder->context.element_stack[ + treebuilder->context.current_node].node); + return error; +} + /** * Append text to the current node, inserting into the last child of the * current node, iff it's a Text node. diff --git a/src/treebuilder/treebuilder.h b/src/treebuilder/treebuilder.h index 2ff1c38..a17e52a 100644 --- a/src/treebuilder/treebuilder.h +++ b/src/treebuilder/treebuilder.h @@ -27,7 +27,8 @@ typedef enum hubbub_treebuilder_opttype { HUBBUB_TREEBUILDER_ERROR_HANDLER, HUBBUB_TREEBUILDER_TREE_HANDLER, HUBBUB_TREEBUILDER_DOCUMENT_NODE, - HUBBUB_TREEBUILDER_ENABLE_SCRIPTING + HUBBUB_TREEBUILDER_ENABLE_SCRIPTING, + HUBBUB_TREEBUILDER_ENABLE_STYLING } hubbub_treebuilder_opttype; /** @@ -44,6 +45,7 @@ typedef union hubbub_treebuilder_optparams { void *document_node; /**< The document node */ bool enable_scripting; /**< Enable scripting */ + bool enable_styling; /**< Enable styling */ } hubbub_treebuilder_optparams; /* Create a hubbub treebuilder */ diff --git a/test/tree-buf.c b/test/tree-buf.c index 9814932..da447ea 100644 --- a/test/tree-buf.c +++ b/test/tree-buf.c @@ -94,6 +94,7 @@ static hubbub_error add_attributes(void *ctx, void *node, const hubbub_attribute *attributes, uint32_t n_attributes); static hubbub_error set_quirks_mode(void *ctx, hubbub_quirks_mode mode); static hubbub_error complete_script(void *ctx, void *script); +static hubbub_error complete_style(void *ctx, void *style); static void delete_node(node_t *node); static void delete_attr(attr_t *attr); @@ -117,6 +118,7 @@ static hubbub_tree_handler tree_handler = { set_quirks_mode, NULL, complete_script, + complete_style, NULL }; @@ -745,6 +747,14 @@ hubbub_error complete_script(void *ctx, void *script) return HUBBUB_OK; } +hubbub_error complete_style(void *ctx, void *style) +{ + UNUSED(ctx); + UNUSED(style); + + return HUBBUB_OK; +} + /*** Serialising bits ***/ diff --git a/test/tree.c b/test/tree.c index 85fd21a..7c95060 100644 --- a/test/tree.c +++ b/test/tree.c @@ -55,6 +55,7 @@ static hubbub_error add_attributes(void *ctx, void *node, const hubbub_attribute *attributes, uint32_t n_attributes); static hubbub_error set_quirks_mode(void *ctx, hubbub_quirks_mode mode); static hubbub_error complete_script(void *ctx, void *script); +static hubbub_error complete_style(void *ctx, void *style); static hubbub_tree_handler tree_handler = { create_comment, @@ -75,6 +76,7 @@ static hubbub_tree_handler tree_handler = { set_quirks_mode, NULL, complete_script, + complete_style, NULL }; @@ -417,3 +419,11 @@ hubbub_error complete_script(void *ctx, void *script) return HUBBUB_OK; } +hubbub_error complete_style(void *ctx, void *style) +{ + UNUSED(ctx); + UNUSED(style); + + return HUBBUB_OK; +} + diff --git a/test/tree2.c b/test/tree2.c index 15f75db..b0159ba 100644 --- a/test/tree2.c +++ b/test/tree2.c @@ -94,6 +94,7 @@ static hubbub_error add_attributes(void *ctx, void *node, const hubbub_attribute *attributes, uint32_t n_attributes); static hubbub_error set_quirks_mode(void *ctx, hubbub_quirks_mode mode); static hubbub_error complete_script(void *ctx, void *script); +static hubbub_error complete_style(void *ctx, void *style); static void delete_node(node_t *node); static void delete_attr(attr_t *attr); @@ -117,6 +118,7 @@ static hubbub_tree_handler tree_handler = { set_quirks_mode, NULL, complete_script, + complete_style, NULL }; @@ -824,6 +826,14 @@ hubbub_error complete_script(void *ctx, void *script) return HUBBUB_OK; } +hubbub_error complete_style(void *ctx, void *style) +{ + UNUSED(ctx); + UNUSED(style); + + return HUBBUB_OK; +} + /*** Serialising bits ***/