diff --git a/render/box.c b/render/box.c index 5ceb0376c..65c15fba3 100644 --- a/render/box.c +++ b/render/box.c @@ -67,6 +67,7 @@ struct box * box_create(struct css_style *style, box->length = 0; box->space = 0; box->clone = 0; + box->strip_leading_newline = 0; box->href = href; box->target = target; box->title = title; diff --git a/render/box.h b/render/box.h index 3c62ecffe..5a82830db 100644 --- a/render/box.h +++ b/render/box.h @@ -163,6 +163,10 @@ struct box { /** This box is a continuation of the previous box (eg from line * breaking). */ unsigned int clone : 1; + /** This box represents a
tag which has not yet had its white + * space stripped if possible + */ + unsigned int strip_leading_newline : 1; char *href; /**< Link, or 0. */ const char *target; /**< Link target, or 0. */ diff --git a/render/box_construct.c b/render/box_construct.c index b3e5e879d..1cb0ffb19 100644 --- a/render/box_construct.c +++ b/render/box_construct.c @@ -115,6 +115,7 @@ static bool box_frameset(BOX_SPECIAL_PARAMS); static bool box_select_add_option(struct form_control *control, xmlNode *n); static bool box_object(BOX_SPECIAL_PARAMS); static bool box_embed(BOX_SPECIAL_PARAMS); +static bool box_pre(BOX_SPECIAL_PARAMS); /*static bool box_applet(BOX_SPECIAL_PARAMS);*/ static bool box_iframe(BOX_SPECIAL_PARAMS); static bool box_get_attribute(xmlNode *n, const char *attribute, @@ -141,6 +142,7 @@ static const struct element_entry element_table[] = { {"img", box_image}, {"input", box_input}, {"object", box_object}, + {"pre", box_pre}, {"select", box_select}, {"textarea", box_textarea} }; @@ -293,7 +295,13 @@ bool box_construct_element(xmlNode *n, struct content *content, assert(inline_container); gui_multitask(); - + + /* In case the parent is a pre block, we clear the + * strip_leading_newline flag since it is not used if we + * follow the pre with a tag + */ + parent->strip_leading_newline = 0; + style = box_get_style(content, parent_style, n); if (!style) return false; @@ -627,13 +635,16 @@ bool box_construct_text(xmlNode *n, struct content *content, current = text; /* swallow a single leading new line */ - switch (*current) { - case '\n': - current++; break; - case '\r': - current++; - if (*current == '\n') current++; - break; + if (parent->strip_leading_newline) { + switch (*current) { + case '\n': + current++; break; + case '\r': + current++; + if (*current == '\n') current++; + break; + } + parent->strip_leading_newline = 0; } do { @@ -1150,6 +1161,15 @@ bool box_br(BOX_SPECIAL_PARAMS) return true; } +/** + * Preformatted text [9.3.4]. + */ + +bool box_pre(BOX_SPECIAL_PARAMS) +{ + box->strip_leading_newline = 1; + return true; +} /** * Anchor [12.2].