summaryrefslogtreecommitdiff
path: root/src/treebuilder/in_body.c
diff options
context:
space:
mode:
authorRupinder Singh Khokhar <rsk1coder99@gmail.com>2014-07-02 03:49:22 +0530
committerRupinder Singh Khokhar <rsk1coder99@gmail.com>2014-08-01 21:44:30 +0530
commit751b5c694e39f8c9c271061fbb4d518e27cee928 (patch)
tree864c5b6bb7c7e59a6378c4035d7c3b24ed9860e2 /src/treebuilder/in_body.c
parent46802b46290a965d5828bb2a3402bba2393b178f (diff)
downloadlibhubbub-751b5c694e39f8c9c271061fbb4d518e27cee928.tar.gz
libhubbub-751b5c694e39f8c9c271061fbb4d518e27cee928.tar.bz2
Fixed The adoption agency & related things
Diffstat (limited to 'src/treebuilder/in_body.c')
-rw-r--r--src/treebuilder/in_body.c95
1 files changed, 63 insertions, 32 deletions
diff --git a/src/treebuilder/in_body.c b/src/treebuilder/in_body.c
index e685e0e..3e8650d 100644
--- a/src/treebuilder/in_body.c
+++ b/src/treebuilder/in_body.c
@@ -23,6 +23,7 @@ typedef struct bookmark {
formatting_list_entry *next; /**< Next entry */
} bookmark;
+static hubbub_error close_p_in_body(hubbub_treebuilder *treebuilder);
static hubbub_error process_character(hubbub_treebuilder *treebuilder,
const hubbub_token *token);
static hubbub_error process_start_tag(hubbub_treebuilder *treebuilder,
@@ -564,8 +565,8 @@ hubbub_error process_container_in_body(hubbub_treebuilder *treebuilder,
{
hubbub_error err;
- if (element_in_scope(treebuilder, P, false)) {
- err = process_0p_in_body(treebuilder);
+ if (element_in_scope(treebuilder, P, false, true)) {
+ err = close_p_in_body(treebuilder);
if (err != HUBBUB_OK)
return err;
}
@@ -585,7 +586,7 @@ hubbub_error process_hN_in_body(hubbub_treebuilder *treebuilder,
hubbub_error err;
element_type type;
- if (element_in_scope(treebuilder, P, false)) {
+ if (element_in_scope(treebuilder, P, false, false)) {
err = process_0p_in_body(treebuilder);
if (err != HUBBUB_OK)
return err;
@@ -627,7 +628,7 @@ hubbub_error process_form_in_body(hubbub_treebuilder *treebuilder,
if (treebuilder->context.form_element != NULL) {
/** \todo parse error */
} else {
- if (element_in_scope(treebuilder, P, false)) {
+ if (element_in_scope(treebuilder, P, false, false)) {
err = process_0p_in_body(treebuilder);
if (err != HUBBUB_OK)
return err;
@@ -668,7 +669,7 @@ hubbub_error process_dd_dt_li_in_body(hubbub_treebuilder *treebuilder,
treebuilder->context.frameset_ok = false;
- if (element_in_scope(treebuilder, P, false)) {
+ if (element_in_scope(treebuilder, P, false, false)) {
err = process_0p_in_body(treebuilder);
if (err != HUBBUB_OK)
return err;
@@ -731,7 +732,7 @@ hubbub_error process_plaintext_in_body(hubbub_treebuilder *treebuilder,
hubbub_error err;
hubbub_tokeniser_optparams params;
- if (element_in_scope(treebuilder, P, false)) {
+ if (element_in_scope(treebuilder, P, false, false)) {
err = process_0p_in_body(treebuilder);
if (err != HUBBUB_OK)
return err;
@@ -919,7 +920,7 @@ hubbub_error process_nobr_in_body(hubbub_treebuilder *treebuilder,
if (err != HUBBUB_OK)
return err;
- if (element_in_scope(treebuilder, NOBR, false)) {
+ if (element_in_scope(treebuilder, NOBR, false, false)) {
/** \todo parse error */
/* Act as if </nobr> were seen */
@@ -981,7 +982,7 @@ hubbub_error process_button_in_body(hubbub_treebuilder *treebuilder,
{
hubbub_error err;
- if (element_in_scope(treebuilder, BUTTON, false)) {
+ if (element_in_scope(treebuilder, BUTTON, false, false)) {
/** \todo parse error */
/* Act as if </button> has been seen */
@@ -1070,7 +1071,7 @@ hubbub_error process_hr_in_body(hubbub_treebuilder *treebuilder,
{
hubbub_error err;
- if (element_in_scope(treebuilder, P, false)) {
+ if (element_in_scope(treebuilder, P, false, false)) {
err = process_0p_in_body(treebuilder);
if (err != HUBBUB_OK)
return err;
@@ -1332,7 +1333,7 @@ hubbub_error process_opt_in_body(hubbub_treebuilder *treebuilder,
{
hubbub_error err;
- if (element_in_scope(treebuilder, OPTION, false)) {
+ if (element_in_scope(treebuilder, OPTION, false, false)) {
err = process_0generic_in_body(treebuilder, OPTION);
/* Cannot fail */
assert(err == HUBBUB_OK);
@@ -1373,7 +1374,7 @@ hubbub_error process_0body_in_body(hubbub_treebuilder *treebuilder)
{
hubbub_error err = HUBBUB_OK;
- if (!element_in_scope(treebuilder, BODY, false)) {
+ if (!element_in_scope(treebuilder, BODY, false, false)) {
/** \todo parse error */
} else {
element_context *stack = treebuilder->context.element_stack;
@@ -1412,7 +1413,7 @@ hubbub_error process_0body_in_body(hubbub_treebuilder *treebuilder)
hubbub_error process_0container_in_body(hubbub_treebuilder *treebuilder,
element_type type)
{
- if (!element_in_scope(treebuilder, type, false)) {
+ if (!element_in_scope(treebuilder, type, false, false)) {
/** \todo parse error */
} else {
uint32_t popped = 0;
@@ -1457,7 +1458,7 @@ hubbub_error process_0form_in_body(hubbub_treebuilder *treebuilder)
treebuilder->context.form_element);
treebuilder->context.form_element = NULL;
- idx = element_in_scope(treebuilder, FORM, false);
+ idx = element_in_scope(treebuilder, FORM, false, false);
if (idx == 0 || node == NULL ||
treebuilder->context.element_stack[idx].node != node) {
@@ -1486,25 +1487,27 @@ hubbub_error process_0form_in_body(hubbub_treebuilder *treebuilder)
return HUBBUB_OK;
}
-
/**
- * Process a p end tag as if in "in body"
- *
+ * Close a p Element by repeated popping
* \param treebuilder The treebuilder instance
*/
-hubbub_error process_0p_in_body(hubbub_treebuilder *treebuilder)
+hubbub_error close_p_in_body(hubbub_treebuilder *treebuilder)
{
hubbub_error err = HUBBUB_OK;
uint32_t popped = 0;
- if (treebuilder->context.element_stack[
+ close_implied_end_tags(treebuilder, P);
+
+ if(treebuilder->context.element_stack[
treebuilder->context.current_node].type != P) {
- /** \todo parse error */
+ /* todo parse error */
+
}
- while (element_in_scope(treebuilder, P, false)) {
+ element_type type;
+
+ do {
hubbub_ns ns;
- element_type type;
void *node;
err = element_stack_pop(treebuilder, &ns, &type, &node);
@@ -1514,7 +1517,7 @@ hubbub_error process_0p_in_body(hubbub_treebuilder *treebuilder)
treebuilder->tree_handler->ctx, node);
popped++;
- }
+ } while (type != P);
if (popped == 0) {
hubbub_token dummy;
@@ -1536,11 +1539,39 @@ hubbub_error process_0p_in_body(hubbub_treebuilder *treebuilder)
/* Cannot fail */
assert(err == HUBBUB_OK);
}
-
return err;
}
/**
+ * Process a p end tag as if in "in body"
+ *
+ * \param treebuilder The treebuilder instance
+ */
+hubbub_error process_0p_in_body(hubbub_treebuilder *treebuilder)
+{
+
+ if (!element_in_scope(treebuilder, P, false, true)) {
+ /** \todo parse error */
+
+ hubbub_tag tag;
+ hubbub_error err;
+
+ tag.ns = HUBBUB_NS_HTML;
+ tag.name.ptr = (const uint8_t *) "p";
+ tag.name.len = SLEN("p");
+ tag.n_attributes = 0;
+ tag.attributes = NULL;
+
+ err = insert_element(treebuilder, &tag, true);
+ if(err != HUBBUB_OK)
+ return err;
+
+ }
+
+ return close_p_in_body(treebuilder);
+}
+
+/**
* Process a dd, dt, or li end tag as if in "in body"
*
* \param treebuilder The treebuilder instance
@@ -1549,7 +1580,7 @@ hubbub_error process_0p_in_body(hubbub_treebuilder *treebuilder)
hubbub_error process_0dd_dt_li_in_body(hubbub_treebuilder *treebuilder,
element_type type)
{
- if (!element_in_scope(treebuilder, type, false)) {
+ if (!element_in_scope(treebuilder, type, false, false)) {
/** \todo parse error */
} else {
uint32_t popped = 0;
@@ -1591,12 +1622,12 @@ hubbub_error process_0h_in_body(hubbub_treebuilder *treebuilder,
UNUSED(type);
/** \todo optimise this */
- if (element_in_scope(treebuilder, H1, false) ||
- element_in_scope(treebuilder, H2, false) ||
- element_in_scope(treebuilder, H3, false) ||
- element_in_scope(treebuilder, H4, false) ||
- element_in_scope(treebuilder, H5, false) ||
- element_in_scope(treebuilder, H6, false)) {
+ if (element_in_scope(treebuilder, H1, false, false) ||
+ element_in_scope(treebuilder, H2, false, false) ||
+ element_in_scope(treebuilder, H3, false, false) ||
+ element_in_scope(treebuilder, H4, false, false) ||
+ element_in_scope(treebuilder, H5, false, false) ||
+ element_in_scope(treebuilder, H6, false, false)) {
uint32_t popped = 0;
element_type otype;
@@ -1839,7 +1870,7 @@ hubbub_error aa_find_and_validate_formatting_element(
if (entry->stack_index != 0 &&
element_in_scope(treebuilder, entry->details.type,
- false) != entry->stack_index) {
+ false, false) != entry->stack_index) {
/** \todo parse error */
return HUBBUB_OK;
}
@@ -2291,7 +2322,7 @@ hubbub_error aa_insert_into_foster_parent(hubbub_treebuilder *treebuilder,
hubbub_error process_0applet_button_marquee_object_in_body(
hubbub_treebuilder *treebuilder, element_type type)
{
- if (!element_in_scope(treebuilder, type, false)) {
+ if (!element_in_scope(treebuilder, type, false, false)) {
/** \todo parse error */
} else {
uint32_t popped = 0;