diff options
author | Michael Drake <michael.drake@codethink.co.uk> | 2016-01-27 17:58:27 +0000 |
---|---|---|
committer | Michael Drake <michael.drake@codethink.co.uk> | 2016-01-27 17:58:27 +0000 |
commit | 9def0a44e12c1469e0e4af2881242f5f1df9b3a0 (patch) | |
tree | 1cc1a2e934354e75e609357d7627e16371a0e50c /src/html/html_document.c | |
parent | 410274173d434e34a5eb085d13228d68cd44d509 (diff) | |
parent | 5b6c1914915e4c6c1b69e4c56cd60705e40daff3 (diff) | |
download | libdom-9def0a44e12c1469e0e4af2881242f5f1df9b3a0.tar.gz libdom-9def0a44e12c1469e0e4af2881242f5f1df9b3a0.tar.bz2 |
Merge branch 'tlsa/html-element-type'
Diffstat (limited to 'src/html/html_document.c')
-rw-r--r-- | src/html/html_document.c | 573 |
1 files changed, 464 insertions, 109 deletions
diff --git a/src/html/html_document.c b/src/html/html_document.c index 096c84e..3d2a7f3 100644 --- a/src/html/html_document.c +++ b/src/html/html_document.c @@ -8,12 +8,16 @@ #include <assert.h> #include <stdlib.h> +#include <dom/html/html_elements.h> + #include "html/html_document.h" #include "html/html_element.h" #include "html/html_collection.h" #include "html/html_html_element.h" #include "html/html_head_element.h" #include "html/html_body_element.h" +#include "html/html_base_element.h" +#include "html/html_div_element.h" #include "html/html_link_element.h" #include "html/html_title_element.h" #include "html/html_meta_element.h" @@ -134,10 +138,16 @@ dom_exception _dom_html_document_initialise(dom_html_document *doc, error = DOM_NO_MEM_ERR; goto out; } + doc->elements = calloc(sizeof(dom_string *), + DOM_HTML_ELEMENT_TYPE__COUNT); + if (doc->elements == NULL) { + error = DOM_NO_MEM_ERR; + goto out; + } -#define HTML_DOCUMENT_STRINGS_ACTION(attr,str) \ +#define HTML_DOCUMENT_STRINGS_ACTION(attr,str) \ error = dom_string_create_interned((const uint8_t *) #str, \ - SLEN(#str), &doc->memoised[hds_##attr]); \ + SLEN(#str), &doc->memoised[hds_##attr]); \ if (error != DOM_NO_ERR) { \ goto out; \ } @@ -145,15 +155,38 @@ dom_exception _dom_html_document_initialise(dom_html_document *doc, #include "html_document_strings.h" #undef HTML_DOCUMENT_STRINGS_ACTION +#define DOM_HTML_ELEMENT_STRINGS_ENTRY(tag) \ + error = dom_string_create_interned((const uint8_t *) #tag, \ + SLEN(#tag), \ + &doc->elements[DOM_HTML_ELEMENT_TYPE_##tag]); \ + if (error != DOM_NO_ERR) { \ + goto out; \ + } + +#include <dom/html/html_elements.h> +#undef DOM_HTML_ELEMENT_STRINGS_ENTRY + out: - if (doc->memoised != NULL && error != DOM_NO_ERR) { - for(sidx = 0; sidx < hds_COUNT; ++sidx) { - if (doc->memoised[sidx] != NULL) { - dom_string_unref(doc->memoised[sidx]); + if (error != DOM_NO_ERR) { + if (doc->memoised != NULL) { + for(sidx = 0; sidx < hds_COUNT; ++sidx) { + if (doc->memoised[sidx] != NULL) { + dom_string_unref(doc->memoised[sidx]); + } } + free(doc->memoised); + doc->memoised = NULL; + } + if (doc->elements != NULL) { + for(sidx = 0; sidx < DOM_HTML_ELEMENT_TYPE__COUNT; + ++sidx) { + if (doc->elements[sidx] != NULL) { + dom_string_unref(doc->elements[sidx]); + } + } + free(doc->elements); + doc->elements = NULL; } - free(doc->memoised); - doc->memoised = NULL; } return error; } @@ -184,6 +217,16 @@ bool _dom_html_document_finalise(dom_html_document *doc) doc->memoised = NULL; } + if (doc->elements != NULL) { + for(sidx = 0; sidx < DOM_HTML_ELEMENT_TYPE__COUNT; ++sidx) { + if (doc->elements[sidx] != NULL) { + dom_string_unref(doc->elements[sidx]); + } + } + free(doc->elements); + doc->elements = NULL; + } + return _dom_document_finalise(&doc->base); } @@ -205,186 +248,493 @@ dom_exception _dom_html_document_copy(dom_node_internal *old, return DOM_NOT_SUPPORTED_ERR; } +/** + * Get html element type from an uppercased tag name string + * + * \param html The html document that the html element belongs to + * \param tag_name_upper Upper cased string containing tag name + */ +static inline dom_html_element_type _dom_html_document_get_element_type( + dom_html_document *html, dom_string *tag_name_upper) +{ + size_t len = dom_string_byte_length(tag_name_upper); + + switch (len) { + case 1: + if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_P])) { + return DOM_HTML_ELEMENT_TYPE_P; + } else if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_A])) { + return DOM_HTML_ELEMENT_TYPE_A; + } else if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_Q])) { + return DOM_HTML_ELEMENT_TYPE_Q; + } + break; + case 2: + if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_H1])) { + return DOM_HTML_ELEMENT_TYPE_H1; + } else if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_H2])) { + return DOM_HTML_ELEMENT_TYPE_H2; + } else if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_H3])) { + return DOM_HTML_ELEMENT_TYPE_H3; + } else if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_H4])) { + return DOM_HTML_ELEMENT_TYPE_H4; + } else if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_H5])) { + return DOM_HTML_ELEMENT_TYPE_H5; + } else if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_H6])) { + return DOM_HTML_ELEMENT_TYPE_H6; + } else if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_HR])) { + return DOM_HTML_ELEMENT_TYPE_HR; + } else if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_DL])) { + return DOM_HTML_ELEMENT_TYPE_DL; + } else if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_UL])) { + return DOM_HTML_ELEMENT_TYPE_UL; + } else if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_OL])) { + return DOM_HTML_ELEMENT_TYPE_OL; + } else if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_LI])) { + return DOM_HTML_ELEMENT_TYPE_LI; + } else if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_TD])) { + return DOM_HTML_ELEMENT_TYPE_TD; + } else if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_TH])) { + return DOM_HTML_ELEMENT_TYPE_TH; + } else if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_TR])) { + return DOM_HTML_ELEMENT_TYPE_TR; + } else if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_BR])) { + return DOM_HTML_ELEMENT_TYPE_BR; + } + break; + case 3: + if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_DIV])) { + return DOM_HTML_ELEMENT_TYPE_DIV; + } else if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_PRE])) { + return DOM_HTML_ELEMENT_TYPE_PRE; + } else if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_DEL])) { + return DOM_HTML_ELEMENT_TYPE_DEL; + } else if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_INS])) { + return DOM_HTML_ELEMENT_TYPE_INS; + } else if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_IMG])) { + return DOM_HTML_ELEMENT_TYPE_IMG; + } else if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_COL])) { + return DOM_HTML_ELEMENT_TYPE_COL; + } else if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_MAP])) { + return DOM_HTML_ELEMENT_TYPE_MAP; + } else if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_DIR])) { + return DOM_HTML_ELEMENT_TYPE_DIR; + } + break; + case 4: + if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_HTML])) { + return DOM_HTML_ELEMENT_TYPE_HTML; + } else if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_HEAD])) { + return DOM_HTML_ELEMENT_TYPE_HEAD; + } else if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_META])) { + return DOM_HTML_ELEMENT_TYPE_META; + } else if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_BASE])) { + return DOM_HTML_ELEMENT_TYPE_BASE; + } else if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_BODY])) { + return DOM_HTML_ELEMENT_TYPE_BODY; + } else if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_FORM])) { + return DOM_HTML_ELEMENT_TYPE_FORM; + } else if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_LINK])) { + return DOM_HTML_ELEMENT_TYPE_LINK; + } else if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_MENU])) { + return DOM_HTML_ELEMENT_TYPE_MENU; + } else if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_FONT])) { + return DOM_HTML_ELEMENT_TYPE_FONT; + } else if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_AREA])) { + return DOM_HTML_ELEMENT_TYPE_AREA; + } + break; + case 5: + if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_TITLE])) { + return DOM_HTML_ELEMENT_TYPE_TITLE; + } else if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_INPUT])) { + return DOM_HTML_ELEMENT_TYPE_INPUT; + } else if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_FRAME])) { + return DOM_HTML_ELEMENT_TYPE_FRAME; + } else if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_THEAD])) { + return DOM_HTML_ELEMENT_TYPE_THEAD; + } else if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_TBODY])) { + return DOM_HTML_ELEMENT_TYPE_TBODY; + } else if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_TFOOT])) { + return DOM_HTML_ELEMENT_TYPE_TFOOT; + } else if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_TABLE])) { + return DOM_HTML_ELEMENT_TYPE_TABLE; + } else if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_STYLE])) { + return DOM_HTML_ELEMENT_TYPE_STYLE; + } else if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_LABEL])) { + return DOM_HTML_ELEMENT_TYPE_LABEL; + } else if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_PARAM])) { + return DOM_HTML_ELEMENT_TYPE_PARAM; + } + break; + case 6: + if (dom_string_isequal(tag_name_upper,html->elements[ + DOM_HTML_ELEMENT_TYPE_BUTTON])) { + return DOM_HTML_ELEMENT_TYPE_BUTTON; + } else if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_OPTION])) { + return DOM_HTML_ELEMENT_TYPE_OPTION; + } else if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_SCRIPT])) { + return DOM_HTML_ELEMENT_TYPE_SCRIPT; + } else if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_IFRAME])) { + return DOM_HTML_ELEMENT_TYPE_IFRAME; + } else if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_LEGEND])) { + return DOM_HTML_ELEMENT_TYPE_LEGEND; + } else if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_SELECT])) { + return DOM_HTML_ELEMENT_TYPE_SELECT; + } else if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_OBJECT])) { + return DOM_HTML_ELEMENT_TYPE_OBJECT; + } else if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_APPLET])) { + return DOM_HTML_ELEMENT_TYPE_APPLET; + } + break; + case 7: + if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_CAPTION])) { + return DOM_HTML_ELEMENT_TYPE_CAPTION; + } else if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_ISINDEX])) { + return DOM_HTML_ELEMENT_TYPE_ISINDEX; + } + break; + case 8: + if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_TEXTAREA])) { + return DOM_HTML_ELEMENT_TYPE_TEXTAREA; + } else if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_OPTGROUP])) { + return DOM_HTML_ELEMENT_TYPE_OPTGROUP; + } else if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_BASEFONT])) { + return DOM_HTML_ELEMENT_TYPE_BASEFONT; + } else if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_FIELDSET])) { + return DOM_HTML_ELEMENT_TYPE_FIELDSET; + } else if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_COLGROUP])) { + return DOM_HTML_ELEMENT_TYPE_COLGROUP; + } else if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_FRAMESET])) { + return DOM_HTML_ELEMENT_TYPE_FRAMESET; + } + break; + case 10: + if (dom_string_isequal(tag_name_upper, html->elements[ + DOM_HTML_ELEMENT_TYPE_BLOCKQUOTE])) { + return DOM_HTML_ELEMENT_TYPE_BLOCKQUOTE; + } + break; + } + + return DOM_HTML_ELEMENT_TYPE__UNKNOWN; +} + /* Overloaded methods inherited from super class */ /** Internal method to support both kinds of create method */ static dom_exception -_dom_html_document_create_element_internal(dom_html_document *html, - dom_string *in_tag_name, - dom_string *namespace, - dom_string *prefix, - dom_html_element **result) +_dom_html_document_create_element_internal( + dom_html_document *html, + dom_string *in_tag_name, + dom_string *namespace, + dom_string *prefix, + dom_html_element **result) { dom_exception exc; dom_string *tag_name; + dom_html_element_type type; exc = dom_string_toupper(in_tag_name, true, &tag_name); if (exc != DOM_NO_ERR) return exc; - if (dom_string_caseless_isequal(tag_name, html->memoised[hds_HTML])) { + type = _dom_html_document_get_element_type(html, tag_name); + + switch(type) { + case DOM_HTML_ELEMENT_TYPE__COUNT: + assert(type != DOM_HTML_ELEMENT_TYPE__COUNT); + break; + case DOM_HTML_ELEMENT_TYPE_HTML: exc = _dom_html_html_element_create(html, namespace, prefix, (dom_html_html_element **) result); - } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_HEAD])) { + break; + case DOM_HTML_ELEMENT_TYPE_HEAD: exc = _dom_html_head_element_create(html, namespace, prefix, (dom_html_head_element **) result); - } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_TITLE])) { + break; + case DOM_HTML_ELEMENT_TYPE_META: + exc = _dom_html_meta_element_create(html, namespace, prefix, + (dom_html_meta_element **) result); + break; + case DOM_HTML_ELEMENT_TYPE_BASE: + exc = _dom_html_base_element_create(html, namespace, prefix, + (dom_html_base_element **) result); + break; + case DOM_HTML_ELEMENT_TYPE_TITLE: exc = _dom_html_title_element_create(html, namespace, prefix, (dom_html_title_element **) result); - } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_BODY])) { + break; + case DOM_HTML_ELEMENT_TYPE_BODY: exc = _dom_html_body_element_create(html, namespace, prefix, (dom_html_body_element **) result); - } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_FORM])) { + break; + case DOM_HTML_ELEMENT_TYPE_DIV: + exc = _dom_html_div_element_create(html, namespace, prefix, + (dom_html_div_element **) result); + break; + case DOM_HTML_ELEMENT_TYPE_FORM: exc = _dom_html_form_element_create(html, namespace, prefix, (dom_html_form_element **) result); - } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_LINK])) { + break; + case DOM_HTML_ELEMENT_TYPE_LINK: exc = _dom_html_link_element_create(html, namespace, prefix, (dom_html_link_element **) result); - } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_BUTTON])) { + break; + case DOM_HTML_ELEMENT_TYPE_BUTTON: exc = _dom_html_button_element_create(html, namespace, prefix, (dom_html_button_element **) result); - } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_INPUT])) { + break; + case DOM_HTML_ELEMENT_TYPE_INPUT: exc = _dom_html_input_element_create(html, namespace, prefix, (dom_html_input_element **) result); - } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_TEXTAREA])) { - exc = _dom_html_text_area_element_create(html, namespace, prefix, - (dom_html_text_area_element **) result); - } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_OPTGROUP])) { - exc = _dom_html_opt_group_element_create(html, namespace, prefix, - (dom_html_opt_group_element **) result); - } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_OPTION])) { + break; + case DOM_HTML_ELEMENT_TYPE_TEXTAREA: + exc = _dom_html_text_area_element_create(html, namespace, + prefix, (dom_html_text_area_element **) result); + break; + case DOM_HTML_ELEMENT_TYPE_OPTGROUP: + exc = _dom_html_opt_group_element_create(html, namespace, + prefix, (dom_html_opt_group_element **) result); + break; + case DOM_HTML_ELEMENT_TYPE_OPTION: exc = _dom_html_option_element_create(html, namespace, prefix, (dom_html_option_element **) result); - } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_SELECT])) { + break; + case DOM_HTML_ELEMENT_TYPE_SELECT: exc = _dom_html_select_element_create(html, namespace, prefix, (dom_html_select_element **) result); - } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_HR])) { + break; + case DOM_HTML_ELEMENT_TYPE_HR: exc = _dom_html_hr_element_create(html, namespace, prefix, (dom_html_hr_element **) result); - } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_DL])) { + break; + case DOM_HTML_ELEMENT_TYPE_DL: exc = _dom_html_dlist_element_create(html, namespace, prefix, (dom_html_dlist_element **) result); - } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_DIRECTORY])) { - exc = _dom_html_directory_element_create(html, namespace, prefix, - (dom_html_directory_element **) result); - } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_MENU])) { + break; + case DOM_HTML_ELEMENT_TYPE_DIR: + exc = _dom_html_directory_element_create(html, namespace, + prefix, (dom_html_directory_element **) result); + break; + case DOM_HTML_ELEMENT_TYPE_MENU: exc = _dom_html_menu_element_create(html, namespace, prefix, (dom_html_menu_element **) result); - } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_FIELDSET])) { - exc = _dom_html_field_set_element_create(html, namespace, prefix, - (dom_html_field_set_element **) result); - } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_LEGEND])) { + break; + case DOM_HTML_ELEMENT_TYPE_FIELDSET: + exc = _dom_html_field_set_element_create(html, namespace, + prefix, (dom_html_field_set_element **) result); + break; + case DOM_HTML_ELEMENT_TYPE_LEGEND: exc = _dom_html_legend_element_create(html, namespace, prefix, (dom_html_legend_element **) result); - } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_P])) { - exc = _dom_html_paragraph_element_create(html, namespace, prefix, - (dom_html_paragraph_element **) result); - } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_H1]) || - dom_string_caseless_isequal(tag_name, html->memoised[hds_H2]) || - dom_string_caseless_isequal(tag_name, html->memoised[hds_H3]) || - dom_string_caseless_isequal(tag_name, html->memoised[hds_H4]) || - dom_string_caseless_isequal(tag_name, html->memoised[hds_H5]) || - dom_string_caseless_isequal(tag_name, html->memoised[hds_H6]) - ) { - exc = _dom_html_heading_element_create(html, tag_name, namespace, prefix, + break; + case DOM_HTML_ELEMENT_TYPE_P: + exc = _dom_html_paragraph_element_create(html, namespace, + prefix, (dom_html_paragraph_element **) result); + break; + case DOM_HTML_ELEMENT_TYPE_H1: + case DOM_HTML_ELEMENT_TYPE_H2: + case DOM_HTML_ELEMENT_TYPE_H3: + case DOM_HTML_ELEMENT_TYPE_H4: + case DOM_HTML_ELEMENT_TYPE_H5: + case DOM_HTML_ELEMENT_TYPE_H6: + exc = _dom_html_heading_element_create(html, tag_name, + namespace, prefix, (dom_html_heading_element **) result); - } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_Q])) { + break; + case DOM_HTML_ELEMENT_TYPE_BLOCKQUOTE: + case DOM_HTML_ELEMENT_TYPE_Q: exc = _dom_html_quote_element_create(html, namespace, prefix, (dom_html_quote_element **) result); - } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_PRE])) { + break; + case DOM_HTML_ELEMENT_TYPE_PRE: exc = _dom_html_pre_element_create(html, namespace, prefix, (dom_html_pre_element **) result); - } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_BR])) { + break; + case DOM_HTML_ELEMENT_TYPE_BR: exc = _dom_html_br_element_create(html, namespace, prefix, (dom_html_br_element **) result); - } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_LABEL])) { + break; + case DOM_HTML_ELEMENT_TYPE_LABEL: exc = _dom_html_label_element_create(html, namespace, prefix, (dom_html_label_element **) result); - } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_UL])) { + break; + case DOM_HTML_ELEMENT_TYPE_UL: exc = _dom_html_u_list_element_create(html, namespace, prefix, (dom_html_u_list_element **) result); - } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_OL])) { + break; + case DOM_HTML_ELEMENT_TYPE_OL: exc = _dom_html_olist_element_create(html, namespace, prefix, (dom_html_olist_element **) result); - } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_LI])) { + break; + case DOM_HTML_ELEMENT_TYPE_LI: exc = _dom_html_li_element_create(html, namespace, prefix, (dom_html_li_element **) result); - } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_FONT])) { + break; + case DOM_HTML_ELEMENT_TYPE_FONT: exc = _dom_html_font_element_create(html, namespace, prefix, (dom_html_font_element **) result); - } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_DEL]) || - dom_string_caseless_isequal(tag_name, html->memoised[hds_INS])) { + break; + case DOM_HTML_ELEMENT_TYPE_DEL: + case DOM_HTML_ELEMENT_TYPE_INS: exc = _dom_html_mod_element_create(html, tag_name, namespace, prefix, (dom_html_mod_element **) result); - } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_A])) { + break; + case DOM_HTML_ELEMENT_TYPE_A: exc = _dom_html_anchor_element_create(html, namespace, prefix, (dom_html_anchor_element **) result); - } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_BASEFONT])) { - exc = _dom_html_base_font_element_create(html, namespace, prefix, + break; + case DOM_HTML_ELEMENT_TYPE_BASEFONT: + exc = _dom_html_base_font_element_create(html, + namespace, prefix, (dom_html_base_font_element **) result); - } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_IMG])) { + break; + case DOM_HTML_ELEMENT_TYPE_IMG: exc = _dom_html_image_element_create(html, namespace, prefix, (dom_html_image_element **) result); - } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_OBJECT])) { + break; + case DOM_HTML_ELEMENT_TYPE_OBJECT: exc = _dom_html_object_element_create(html, namespace, prefix, (dom_html_object_element **) result); - } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_PARAM])) { + break; + case DOM_HTML_ELEMENT_TYPE_PARAM: exc = _dom_html_param_element_create(html, namespace, prefix, (dom_html_param_element **) result); - } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_APPLET])) { + break; + case DOM_HTML_ELEMENT_TYPE_APPLET: exc = _dom_html_applet_element_create(html, namespace, prefix, (dom_html_applet_element **) result); - } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_MAP])) { + break; + case DOM_HTML_ELEMENT_TYPE_MAP: exc = _dom_html_map_element_create(html, namespace, prefix, (dom_html_map_element **) result); - } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_AREA])) { + break; + case DOM_HTML_ELEMENT_TYPE_AREA: exc = _dom_html_area_element_create(html, namespace, prefix, (dom_html_area_element **) result); - } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_SCRIPT])) { + break; + case DOM_HTML_ELEMENT_TYPE_SCRIPT: exc = _dom_html_script_element_create(html, namespace, prefix, (dom_html_script_element **) result); - } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_CAPTION])) { - exc = _dom_html_table_caption_element_create(html, namespace, prefix, + break; + case DOM_HTML_ELEMENT_TYPE_CAPTION: + exc = _dom_html_table_caption_element_create(html, + namespace, prefix, (dom_html_table_caption_element **) result); - } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_TD]) || - dom_string_caseless_isequal(tag_name, html->memoised[hds_TH]) - ) { - exc = _dom_html_table_cell_element_create(html, tag_name, namespace, prefix, + break; + case DOM_HTML_ELEMENT_TYPE_TD: + case DOM_HTML_ELEMENT_TYPE_TH: + exc = _dom_html_table_cell_element_create(html, tag_name, + namespace, prefix, (dom_html_table_cell_element **) result); - } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_COL])|| - dom_string_caseless_isequal(tag_name, html->memoised[hds_COLGROUP]) - ) { - exc = _dom_html_table_col_element_create(html, tag_name, namespace, prefix, + break; + case DOM_HTML_ELEMENT_TYPE_COL: + case DOM_HTML_ELEMENT_TYPE_COLGROUP: + exc = _dom_html_table_col_element_create(html, tag_name, + namespace, prefix, (dom_html_table_col_element **) result); - } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_THEAD])|| - dom_string_caseless_isequal(tag_name, html->memoised[hds_TBODY])|| - dom_string_caseless_isequal(tag_name, html->memoised[hds_TFOOT])) { - exc = _dom_html_table_section_element_create(html, tag_name, namespace, prefix, + break; + case DOM_HTML_ELEMENT_TYPE_THEAD: + case DOM_HTML_ELEMENT_TYPE_TBODY: + case DOM_HTML_ELEMENT_TYPE_TFOOT: + exc = _dom_html_table_section_element_create(html, tag_name, + namespace, prefix, (dom_html_table_section_element **) result); - } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_TABLE])) { + break; + case DOM_HTML_ELEMENT_TYPE_TABLE: exc = _dom_html_table_element_create(html, namespace, prefix, (dom_html_table_element **) result); - } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_TD])) { - exc = _dom_html_table_row_element_create(html, namespace, prefix, - (dom_html_table_row_element **) result); - } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_STYLE])) { + break; + case DOM_HTML_ELEMENT_TYPE_TR: + exc = _dom_html_table_row_element_create(html, namespace, + prefix, (dom_html_table_row_element **) result); + break; + case DOM_HTML_ELEMENT_TYPE_STYLE: exc = _dom_html_style_element_create(html, (dom_html_style_element **) result); - } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_FRAMESET])) { - exc = _dom_html_frame_set_element_create(html, namespace, prefix, - (dom_html_frame_set_element **) result); - } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_FRAME])) { + break; + case DOM_HTML_ELEMENT_TYPE_FRAMESET: + exc = _dom_html_frame_set_element_create(html, namespace, + prefix, (dom_html_frame_set_element **) result); + break; + case DOM_HTML_ELEMENT_TYPE_FRAME: exc = _dom_html_frame_element_create(html, namespace, prefix, (dom_html_frame_element **) result); - } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_IFRAME])) { + break; + case DOM_HTML_ELEMENT_TYPE_IFRAME: exc = _dom_html_iframe_element_create(html, namespace, prefix, (dom_html_iframe_element **) result); - } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_ISINDEX])) { + break; + case DOM_HTML_ELEMENT_TYPE_ISINDEX: exc = _dom_html_isindex_element_create(html, namespace, prefix, (dom_html_isindex_element **) result); - } else { + break; + case DOM_HTML_ELEMENT_TYPE__UNKNOWN: exc = _dom_html_element_create(html, tag_name, namespace, prefix, result); + break; } dom_string_unref(tag_name); @@ -576,8 +926,8 @@ dom_exception _dom_html_document_get_title(dom_html_document *doc, uint32_t len; exc = dom_document_get_elements_by_tag_name(doc, - doc->memoised[hds_TITLE], - &nodes); + doc->elements[DOM_HTML_ELEMENT_TYPE_TITLE], + &nodes); if (exc != DOM_NO_ERR) { return exc; } @@ -654,7 +1004,7 @@ dom_exception _dom_html_document_get_body(dom_html_document *doc, uint32_t len; exc = dom_document_get_elements_by_tag_name(doc, - doc->memoised[hds_BODY], + doc->elements[DOM_HTML_ELEMENT_TYPE_BODY], &nodes); if (exc != DOM_NO_ERR) { return exc; @@ -668,7 +1018,7 @@ dom_exception _dom_html_document_get_body(dom_html_document *doc, if (len == 0) { exc = dom_document_get_elements_by_tag_name(doc, - doc->memoised[hds_FRAMESET], + doc->elements[DOM_HTML_ELEMENT_TYPE_FRAMESET], &nodes); if (exc != DOM_NO_ERR) { return exc; @@ -713,9 +1063,10 @@ dom_exception _dom_html_document_set_body(dom_html_document *doc, */ bool images_callback(struct dom_node_internal *node, void *ctx) { + dom_html_document *doc = ctx; if(node->type == DOM_ELEMENT_NODE && dom_string_caseless_isequal(node->name, - ((dom_html_document *)ctx)->memoised[hds_IMG])) { + doc->elements[DOM_HTML_ELEMENT_TYPE_IMG])) { return true; } return false; @@ -736,9 +1087,10 @@ dom_exception _dom_html_document_get_images(dom_html_document *doc, bool applet_callback(struct dom_node_internal * node, void *ctx) { + dom_html_document *doc = ctx; if(node->type == DOM_ELEMENT_NODE && dom_string_caseless_isequal(node->name, - ((dom_html_document *)ctx)->memoised[hds_APPLET])) { + doc->elements[DOM_HTML_ELEMENT_TYPE_APPLET])) { return true; } return false; @@ -752,9 +1104,10 @@ bool applet_callback(struct dom_node_internal * node, void *ctx) */ bool applets_callback(struct dom_node_internal *node, void *ctx) { + dom_html_document *doc = ctx; if(node->type == DOM_ELEMENT_NODE && dom_string_caseless_isequal(node->name, - ((dom_html_document *)ctx)->memoised[hds_OBJECT])) { + doc->elements[DOM_HTML_ELEMENT_TYPE_OBJECT])) { uint32_t len = 0; dom_html_collection *applets; if (_dom_html_collection_create(ctx, node, @@ -790,17 +1143,18 @@ dom_exception _dom_html_document_get_applets(dom_html_document *doc, */ bool links_callback(struct dom_node_internal *node, void *ctx) { + dom_html_document *doc = ctx; if(node->type == DOM_ELEMENT_NODE && (dom_string_caseless_isequal(node->name, - ((dom_html_document *)ctx)->memoised[hds_A]) || + doc->elements[DOM_HTML_ELEMENT_TYPE_A]) || dom_string_caseless_isequal(node->name, - ((dom_html_document *)ctx)->memoised[hds_AREA])) + doc->elements[DOM_HTML_ELEMENT_TYPE_AREA])) ) { bool has_value = false; dom_exception err; err = dom_element_has_attribute(node, - ((dom_html_document *)ctx)->memoised[hds_href], &has_value); + doc->memoised[hds_href], &has_value); if(err !=DOM_NO_ERR) return err; @@ -831,7 +1185,7 @@ static bool __dom_html_document_node_is_form(dom_node_internal *node, UNUSED(ctx); return dom_string_caseless_isequal(node->name, - doc->memoised[hds_FORM]); + doc->elements[DOM_HTML_ELEMENT_TYPE_FORM]); } dom_exception _dom_html_document_get_forms(dom_html_document *doc, @@ -868,14 +1222,15 @@ dom_exception _dom_html_document_get_forms(dom_html_document *doc, */ bool anchors_callback(struct dom_node_internal *node, void *ctx) { + dom_html_document *doc = ctx; if(node->type == DOM_ELEMENT_NODE && dom_string_caseless_isequal(node->name, - ((dom_html_document *)ctx)->memoised[hds_A])) { + doc->elements[DOM_HTML_ELEMENT_TYPE_A])) { bool has_value = false; dom_exception err; err = dom_element_has_attribute(node, - ((dom_html_document *)ctx)->memoised[hds_name], &has_value); + doc->memoised[hds_name], &has_value); if(err !=DOM_NO_ERR) return err; |