Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. /*
  2.  * This file is part of Hubbub.
  3.  * Licensed under the MIT License,
  4.  *                http://www.opensource.org/licenses/mit-license.php
  5.  * Copyright 2008 John-Mark Bell <jmb@netsurf-browser.org>
  6.  */
  7.  
  8. #ifndef hubbub_treebuilder_internal_h_
  9. #define hubbub_treebuilder_internal_h_
  10.  
  11. #include "treebuilder/treebuilder.h"
  12.  
  13. typedef enum
  14. {
  15. /* Special */
  16.         ADDRESS, AREA, ARTICLE, ASIDE, BASE, BASEFONT, BGSOUND, BLOCKQUOTE,
  17.         BODY, BR, CENTER, COL, COLGROUP, COMMAND, DATAGRID, DD, DETAILS,
  18.         DIALOG, DIR, DIV, DL, DT, EMBED, FIELDSET, FIGURE, FOOTER, FORM, FRAME,
  19.         FRAMESET, H1, H2, H3, H4, H5, H6, HEAD, HEADER, HR, IFRAME, IMAGE, IMG,
  20.         INPUT, ISINDEX, LI, LINK, LISTING, MENU, META, NAV, NOEMBED, NOFRAMES,
  21.         NOSCRIPT, OL, OPTGROUP, OPTION, P, PARAM, PLAINTEXT, PRE, SCRIPT,
  22.         SECTION, SELECT, SPACER, STYLE, TBODY, TEXTAREA, TFOOT, THEAD, TITLE,
  23.         TR, UL, WBR,
  24. /* Scoping */
  25.         APPLET, BUTTON, CAPTION, HTML, MARQUEE, OBJECT, TABLE, TD, TH,
  26. /* Formatting */
  27.         A, B, BIG, CODE, EM, FONT, I, NOBR, S, SMALL, STRIKE, STRONG, TT, U,
  28. /* Phrasing */
  29.         /**< \todo Enumerate phrasing elements */
  30.         LABEL, OUTPUT, RP, RT, RUBY, SPAN, SUB, SUP, VAR, XMP,
  31. /* MathML */
  32.         MATH, MGLYPH, MALIGNMARK, MI, MO, MN, MS, MTEXT, ANNOTATION_XML,
  33. /* SVG */
  34.         SVG, FOREIGNOBJECT, /* foreignobject is scoping, but only in SVG ns */
  35.         DESC,
  36.         UNKNOWN
  37. } element_type;
  38.  
  39. /**
  40.  * Item on the element stack
  41.  */
  42. typedef struct element_context
  43. {
  44.         hubbub_ns ns;                   /**< Element namespace */
  45.         element_type type;              /**< Element type */
  46.         uint8_t *name;                  /**< Element name (interned) */
  47.  
  48.         bool tainted;                   /**< Only for tables.  "Once the
  49.                                          * current table has been tainted,
  50.                                          * whitespace characters are inserted
  51.                                          * into the foster parent element
  52.                                          * instead of the current node." */
  53.  
  54.         void *node;                     /**< Node pointer */
  55. } element_context;
  56.  
  57. /**
  58.  * Entry in a formatting list
  59.  */
  60. typedef struct formatting_list_entry
  61. {
  62.         element_context details;        /**< Entry details */
  63.  
  64.         uint32_t stack_index;           /**< Index into element stack */
  65.  
  66.         struct formatting_list_entry *prev;     /**< Previous in list */
  67.         struct formatting_list_entry *next;     /**< Next in list */
  68. } formatting_list_entry;
  69.  
  70. /**
  71.  * Context for a tree builder
  72.  */
  73. typedef struct hubbub_treebuilder_context
  74. {
  75.         insertion_mode mode;            /**< The current insertion mode */
  76.         insertion_mode second_mode;     /**< The secondary insertion mode */
  77.  
  78. #define ELEMENT_STACK_CHUNK 128
  79.         element_context *element_stack; /**< Stack of open elements */
  80.         uint32_t stack_alloc;           /**< Number of stack slots allocated */
  81.         uint32_t current_node;          /**< Index of current node in stack */
  82.  
  83.         formatting_list_entry *formatting_list; /**< List of active formatting
  84.                                                  * elements */
  85.         formatting_list_entry *formatting_list_end;     /**< End of active
  86.                                                          * formatting list */
  87.  
  88.         void *head_element;             /**< Pointer to HEAD element */
  89.  
  90.         void *form_element;             /**< Pointer to most recently
  91.                                          * opened FORM element */
  92.  
  93.         void *document;                 /**< Pointer to the document node */
  94.  
  95.         bool enable_scripting;          /**< Whether scripting is enabled */
  96.  
  97.         struct {
  98.                 insertion_mode mode;    /**< Insertion mode to return to */
  99.                 element_type type;      /**< Type of node */
  100.         } collect;                      /**< Context for character collecting */
  101.  
  102.         bool strip_leading_lr;          /**< Whether to strip a LR from the
  103.                                          * start of the next character sequence
  104.                                          * received */
  105.  
  106.         bool in_table_foster;           /**< Whether nodes that would be
  107.                                         * inserted into the current node should
  108.                                         * be foster parented */
  109.  
  110.         bool frameset_ok;               /**< Whether to process a frameset */
  111. } hubbub_treebuilder_context;
  112.  
  113. /**
  114.  * Treebuilder object
  115.  */
  116. struct hubbub_treebuilder
  117. {
  118.         hubbub_tokeniser *tokeniser;    /**< Underlying tokeniser */
  119.  
  120.         hubbub_treebuilder_context context;     /**< Our context */
  121.  
  122.         hubbub_tree_handler *tree_handler;      /**< Callback table */
  123.  
  124.         hubbub_error_handler error_handler;     /**< Error handler */
  125.         void *error_pw;                         /**< Error handler data */
  126.  
  127.         hubbub_allocator_fn alloc;      /**< Memory (de)allocation function */
  128.         void *alloc_pw;                 /**< Client private data */
  129. };
  130.  
  131. hubbub_error hubbub_treebuilder_token_handler(
  132.                 const hubbub_token *token, void *pw);
  133.  
  134. hubbub_error process_characters_expect_whitespace(
  135.                 hubbub_treebuilder *treebuilder, const hubbub_token *token,
  136.                 bool insert_into_current_node);
  137. hubbub_error process_comment_append(hubbub_treebuilder *treebuilder,
  138.                 const hubbub_token *token, void *parent);
  139. hubbub_error parse_generic_rcdata(hubbub_treebuilder *treebuilder,
  140.                 const hubbub_token *token, bool rcdata);
  141.  
  142. uint32_t element_in_scope(hubbub_treebuilder *treebuilder,
  143.                 element_type type, bool in_table);
  144. hubbub_error reconstruct_active_formatting_list(
  145.                 hubbub_treebuilder *treebuilder);
  146. void clear_active_formatting_list_to_marker(
  147.                 hubbub_treebuilder *treebuilder);
  148. hubbub_error remove_node_from_dom(hubbub_treebuilder *treebuilder,
  149.                 void *node);
  150. hubbub_error insert_element(hubbub_treebuilder *treebuilder,
  151.                 const hubbub_tag *tag_name, bool push);
  152. void close_implied_end_tags(hubbub_treebuilder *treebuilder,
  153.                 element_type except);
  154. void reset_insertion_mode(hubbub_treebuilder *treebuilder);
  155. hubbub_error append_text(hubbub_treebuilder *treebuilder,
  156.                 const hubbub_string *string);
  157. hubbub_error complete_script(hubbub_treebuilder *treebuilder);
  158.  
  159. element_type element_type_from_name(hubbub_treebuilder *treebuilder,
  160.                 const hubbub_string *tag_name);
  161.  
  162. bool is_special_element(element_type type);
  163. bool is_scoping_element(element_type type);
  164. bool is_formatting_element(element_type type);
  165. bool is_phrasing_element(element_type type);
  166.  
  167. hubbub_error element_stack_push(hubbub_treebuilder *treebuilder,
  168.                 hubbub_ns ns, element_type type, void *node);
  169. hubbub_error element_stack_pop(hubbub_treebuilder *treebuilder,
  170.                 hubbub_ns *ns, element_type *type, void **node);
  171. hubbub_error element_stack_pop_until(hubbub_treebuilder *treebuilder,
  172.                 element_type type);
  173. hubbub_error element_stack_remove(hubbub_treebuilder *treebuilder,
  174.                 uint32_t index, hubbub_ns *ns, element_type *type,
  175.                 void **removed);
  176. uint32_t current_table(hubbub_treebuilder *treebuilder);
  177. element_type current_node(hubbub_treebuilder *treebuilder);
  178. element_type prev_node(hubbub_treebuilder *treebuilder);
  179.  
  180. hubbub_error formatting_list_append(hubbub_treebuilder *treebuilder,
  181.                 hubbub_ns ns, element_type type, void *node,
  182.                 uint32_t stack_index);
  183. hubbub_error formatting_list_insert(hubbub_treebuilder *treebuilder,
  184.                 formatting_list_entry *prev, formatting_list_entry *next,
  185.                 hubbub_ns ns, element_type type, void *node,
  186.                 uint32_t stack_index);
  187. hubbub_error formatting_list_remove(hubbub_treebuilder *treebuilder,
  188.                 formatting_list_entry *entry,
  189.                 hubbub_ns *ns, element_type *type, void **node,
  190.                 uint32_t *stack_index);
  191. hubbub_error formatting_list_replace(hubbub_treebuilder *treebuilder,
  192.                 formatting_list_entry *entry,
  193.                 hubbub_ns ns, element_type type, void *node,
  194.                 uint32_t stack_index,
  195.                 hubbub_ns *ons, element_type *otype, void **onode,
  196.                 uint32_t *ostack_index);
  197.  
  198. /* in_foreign_content.c */
  199. void adjust_mathml_attributes(hubbub_treebuilder *treebuilder, hubbub_tag *tag);
  200. void adjust_svg_attributes(hubbub_treebuilder *treebuilder,
  201.                 hubbub_tag *tag);
  202. void adjust_svg_tagname(hubbub_treebuilder *treebuilder,
  203.                 hubbub_tag *tag);
  204. void adjust_foreign_attributes(hubbub_treebuilder *treebuilder,
  205.                 hubbub_tag *tag);
  206.  
  207. /* in_body.c */
  208. hubbub_error aa_insert_into_foster_parent(hubbub_treebuilder *treebuilder,
  209.                 void *node, void **inserted);
  210.  
  211. #ifndef NDEBUG
  212. #include <stdio.h>
  213.  
  214. void element_stack_dump(hubbub_treebuilder *treebuilder, FILE *fp);
  215. void formatting_list_dump(hubbub_treebuilder *treebuilder, FILE *fp);
  216.  
  217. const char *element_type_to_name(element_type type);
  218.  
  219. #endif
  220.  
  221. #endif
  222.  
  223.