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. #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 "generic rcdata" 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_generic_rcdata(hubbub_treebuilder *treebuilder,
  25.                 const hubbub_token *token)
  26. {
  27.         hubbub_error err = HUBBUB_OK;
  28.         bool done = false;
  29.  
  30.         if (treebuilder->context.strip_leading_lr &&
  31.                         token->type != HUBBUB_TOKEN_CHARACTER) {
  32.                 /* Reset the LR stripping flag */
  33.                 treebuilder->context.strip_leading_lr = false;
  34.         }
  35.  
  36.         switch (token->type) {
  37.         case HUBBUB_TOKEN_CHARACTER:
  38.         {
  39.                 hubbub_string chars = token->data.character;
  40.  
  41.                 if (treebuilder->context.strip_leading_lr) {
  42.                         if (chars.ptr[0] == '\n') {
  43.                                 chars.ptr++;
  44.                                 chars.len--;
  45.                         }
  46.  
  47.                         treebuilder->context.strip_leading_lr = false;
  48.                 }
  49.  
  50.                 if (chars.len == 0)
  51.                         break;
  52.  
  53.                 err = append_text(treebuilder, &chars);
  54.         }
  55.                 break;
  56.         case HUBBUB_TOKEN_END_TAG:
  57.         {
  58.                 element_type type = element_type_from_name(treebuilder,
  59.                                 &token->data.tag.name);
  60.  
  61.                 if (type != treebuilder->context.collect.type) {
  62.                         /** \todo parse error */
  63.                 }
  64.  
  65.                 if ((treebuilder->context.enable_scripting == true) &&
  66.                     (type == SCRIPT)) {
  67.                         err = complete_script(treebuilder);
  68.                 }
  69.  
  70.                 done = true;
  71.         }
  72.                 break;
  73.         case HUBBUB_TOKEN_EOF:
  74.                 /** \todo if the current node's a script,
  75.                  * mark it as already executed */
  76.                 /** \todo parse error */
  77.                 done = true;
  78.                 err = HUBBUB_REPROCESS;
  79.                 break;
  80.         case HUBBUB_TOKEN_COMMENT:
  81.         case HUBBUB_TOKEN_DOCTYPE:
  82.         case HUBBUB_TOKEN_START_TAG:
  83.                 /* Should never happen */
  84.                 assert(0);
  85.                 break;
  86.         }
  87.  
  88.         if (done) {
  89.                 hubbub_ns ns;
  90.                 element_type otype;
  91.                 void *node;
  92.  
  93.                 /* Pop the current node from the stack */
  94.                 element_stack_pop(treebuilder, &ns, &otype, &node);
  95.  
  96.                 treebuilder->tree_handler->unref_node(
  97.                                 treebuilder->tree_handler->ctx,
  98.                                 node);
  99.  
  100.                 /* Return to previous insertion mode */
  101.                 treebuilder->context.mode = treebuilder->context.collect.mode;
  102.         }
  103.  
  104.         return err;
  105. }
  106.  
  107.