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 Andrew Sidwell <takkaria@netsurf-browser.org>
  6.  */
  7.  
  8. #include <assert.h>
  9. #include <string.h>
  10.  
  11. #include "treebuilder/modes.h"
  12. #include "treebuilder/internal.h"
  13. #include "treebuilder/treebuilder.h"
  14. #include "utils/utils.h"
  15.  
  16.  
  17. /**
  18.  * Handle tokens in "in caption" insertion mode
  19.  *
  20.  * \param treebuilder  The treebuilder instance
  21.  * \param token        The token to process
  22.  * \return True to reprocess the token, false otherwise
  23.  */
  24. hubbub_error handle_in_caption(hubbub_treebuilder *treebuilder,
  25.                 const hubbub_token *token)
  26. {
  27.         hubbub_error err = HUBBUB_OK;
  28.         bool handled = false;
  29.  
  30.         switch (token->type) {
  31.         case HUBBUB_TOKEN_START_TAG:
  32.         {
  33.                 element_type type = element_type_from_name(treebuilder,
  34.                                 &token->data.tag.name);
  35.  
  36.                 if (type == CAPTION || type == COL || type == COLGROUP ||
  37.                                 type == TBODY || type == TD || type == TFOOT ||
  38.                                 type == TH || type == THEAD || type == TR) {
  39.                         /** \todo parse error */
  40.                         err = HUBBUB_REPROCESS;
  41.                 } else {
  42.                         /* Process as if "in body" */
  43.                         err = handle_in_body(treebuilder, token);
  44.                 }
  45.         }
  46.                 break;
  47.         case HUBBUB_TOKEN_END_TAG:
  48.         {
  49.                 element_type type = element_type_from_name(treebuilder,
  50.                                 &token->data.tag.name);
  51.  
  52.                 if (type == CAPTION) {
  53.                         handled = true;
  54.                 } else if (type == TABLE) {
  55.                         /** \todo parse error if type == TABLE */
  56.                         err = HUBBUB_REPROCESS;
  57.                 } else if (type == BODY || type == COL || type == COLGROUP ||
  58.                                 type == HTML || type == TBODY || type == TD ||
  59.                                 type == TFOOT || type == TH ||
  60.                                 type == THEAD || type == TR) {
  61.                         /** \todo parse error */
  62.                 } else {
  63.                         /* Process as if "in body" */
  64.                         err = handle_in_body(treebuilder, token);
  65.                 }
  66.         }
  67.                 break;
  68.         case HUBBUB_TOKEN_CHARACTER:
  69.         case HUBBUB_TOKEN_COMMENT:
  70.         case HUBBUB_TOKEN_DOCTYPE:
  71.         case HUBBUB_TOKEN_EOF:
  72.                 /* Process as if "in body" */
  73.                 err = handle_in_body(treebuilder, token);
  74.  
  75.                 break;
  76.         }
  77.  
  78.         if (handled || err == HUBBUB_REPROCESS) {
  79.                 hubbub_ns ns;
  80.                 element_type otype = UNKNOWN;
  81.                 void *node;
  82.  
  83.                 /** \todo fragment case */
  84.  
  85.                 close_implied_end_tags(treebuilder, UNKNOWN);
  86.  
  87.                 while (otype != CAPTION) {
  88.                         /** \todo parse error */
  89.  
  90.                         element_stack_pop(treebuilder, &ns, &otype,     &node);
  91.  
  92.                         treebuilder->tree_handler->unref_node(
  93.                                         treebuilder->tree_handler->ctx,
  94.                                         node);
  95.                 }
  96.  
  97.                 clear_active_formatting_list_to_marker(treebuilder);
  98.  
  99.                 treebuilder->context.mode = IN_TABLE;
  100.         }
  101.  
  102.         return err;
  103. }
  104.  
  105.