aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohannes Hofmann <Johannes.Hofmann@gmx.de>2012-01-21 22:48:51 +0100
committerJohannes Hofmann <Johannes.Hofmann@gmx.de>2012-01-21 22:48:51 +0100
commit951fde7f55e2c74f58af69c71126c48e30425581 (patch)
treeb8d26fe91c89c99859b3feb5b11fe6165998b979
parentf016830aea4fdf4afbda03cd29d87568b3711d1c (diff)
add support for the CSS display: property
-rw-r--r--src/form.cc39
-rw-r--r--src/form.hh1
-rw-r--r--src/html.cc414
-rw-r--r--src/html_common.hh9
-rw-r--r--src/table.cc85
-rw-r--r--src/table.hh4
6 files changed, 330 insertions, 222 deletions
diff --git a/src/form.cc b/src/form.cc
index 8781d815..2e1bde7d 100644
--- a/src/form.cc
+++ b/src/form.cc
@@ -279,8 +279,7 @@ static DilloHtmlInput *Html_get_radio_input(DilloHtml *html, const char *name)
}
/*
- * Get the current input.
- * Note that this _assumes_ that there _is_ a current input.
+ * Get the current input if available.
*/
static DilloHtmlInput *Html_get_current_input(DilloHtml *html)
{
@@ -291,7 +290,8 @@ static DilloHtmlInput *Html_get_current_input(DilloHtml *html)
else
inputs = html->inputs_outside_form;
- return inputs->get (inputs->size() - 1);
+ return (inputs && inputs->size() > 0) ?
+ inputs->get (inputs->size() - 1) : NULL;
}
/*
@@ -607,17 +607,8 @@ void Html_tag_open_isindex(DilloHtml *html, const char *tag, int tagsize)
html->InFlags &= ~IN_FORM;
}
-/*
- * The textarea tag
- */
void Html_tag_open_textarea(DilloHtml *html, const char *tag, int tagsize)
{
- const int MAX_COLS=1024, MAX_ROWS=10000;
-
- char *name;
- const char *attrbuf;
- int cols, rows;
-
if (html->InFlags & IN_TEXTAREA) {
BUG_MSG("nested <textarea>\n");
html->ReqTagClose = TRUE;
@@ -629,6 +620,19 @@ void Html_tag_open_textarea(DilloHtml *html, const char *tag, int tagsize)
}
html->InFlags |= IN_TEXTAREA;
+}
+
+/*
+ * The textarea tag
+ */
+void Html_tag_content_textarea(DilloHtml *html, const char *tag, int tagsize)
+{
+ const int MAX_COLS=1024, MAX_ROWS=10000;
+
+ char *name;
+ const char *attrbuf;
+ int cols, rows;
+
a_Html_stash_init(html);
S_TOP(html)->parse_mode = DILLO_HTML_PARSE_MODE_VERBATIM;
@@ -682,7 +686,7 @@ void Html_tag_close_textarea(DilloHtml *html, int TagIdx)
DilloHtmlInput *input;
int i;
- if (html->InFlags & IN_TEXTAREA) {
+ if (html->InFlags & IN_TEXTAREA && !S_TOP(html)->display_none) {
/* Remove the line ending that follows the opening tag */
if (html->Stash->str[0] == '\r')
dStr_erase(html->Stash, 0, 1);
@@ -703,8 +707,10 @@ void Html_tag_close_textarea(DilloHtml *html, int TagIdx)
/* The HTML3.2 spec says it can have "text and character entities". */
str = a_Html_parse_entities(html, html->Stash->str, html->Stash->len);
input = Html_get_current_input(html);
- input->init_str = str;
- ((MultiLineTextResource *)input->embed->getResource ())->setText(str);
+ if (input) {
+ input->init_str = str;
+ ((MultiLineTextResource *)input->embed->getResource ())->setText(str);
+ }
html->InFlags &= ~IN_TEXTAREA;
}
@@ -1913,7 +1919,8 @@ static Embed *Html_input_image(DilloHtml *html, const char *tag, int tagsize)
html->styleEngine->setPseudoLink ();
/* create new image and add it to the button */
- if ((Image = a_Html_image_new(html, tag, tagsize, url))) {
+ a_Html_image_new(html, tag, tagsize);
+ if ((Image = a_Html_image_add(html, url))) {
IM2DW(Image)->setStyle (html->styleEngine->backgroundStyle ());
ResourceFactory *factory = HT2LT(html)->getResourceFactory();
ComplexButtonResource *complex_b_r =
diff --git a/src/form.hh b/src/form.hh
index a54cde56..cd04543f 100644
--- a/src/form.hh
+++ b/src/form.hh
@@ -52,6 +52,7 @@ void Html_tag_close_form(DilloHtml *html, int TagIdx);
void Html_tag_open_input(DilloHtml *html, const char *tag, int tagsize);
void Html_tag_open_isindex(DilloHtml *html, const char *tag, int tagsize);
void Html_tag_open_textarea(DilloHtml *html, const char *tag, int tagsize);
+void Html_tag_content_textarea(DilloHtml *html, const char *tag, int tagsize);
void Html_tag_close_textarea(DilloHtml *html, int TagIdx);
void Html_tag_open_select(DilloHtml *html, const char *tag, int tagsize);
void Html_tag_close_select(DilloHtml *html, int TagIdx);
diff --git a/src/html.cc b/src/html.cc
index f740a77e..6622d1d0 100644
--- a/src/html.cc
+++ b/src/html.cc
@@ -119,6 +119,7 @@ typedef struct {
char EndTag; /* Is it Required, Optional or Forbidden */
uchar_t TagLevel; /* Used to heuristically parse bad HTML */
TagOpenFunct open; /* Open function */
+ TagOpenFunct content; /* Content function */
TagCloseFunct close; /* Close function */
} TagInfo;
extern const TagInfo Tags[];
@@ -284,23 +285,6 @@ static int Html_set_new_link(DilloHtml *html, DilloUrl **url)
}
/*
- * Add a new image to our list.
- * image is NULL if dillo will try to load the image immediately.
- */
-static void Html_add_new_htmlimage(DilloHtml *html,
- DilloUrl **url, DilloImage *image)
-{
- DilloHtmlImage *hi = dNew(DilloHtmlImage, 1);
- hi->url = *url;
- hi->image = image;
- a_Image_ref(image);
-
- int n = html->images->size();
- html->images->increase();
- html->images->set(n, hi);
-}
-
-/*
* Evaluates the ALIGN attribute (left|center|right|justify) and
* sets the style at the top of the stack.
*/
@@ -430,6 +414,7 @@ DilloHtml::DilloHtml(BrowserWindow *p_bw, const DilloUrl *url,
stack->getRef(0)->table_mode = DILLO_HTML_TABLE_MODE_NONE;
stack->getRef(0)->table_border_mode = DILLO_HTML_TABLE_BORDER_SEPARATE;
stack->getRef(0)->cell_text_align_set = false;
+ stack->getRef(0)->display_none = false;
stack->getRef(0)->list_type = HTML_LIST_NONE;
stack->getRef(0)->list_number = 0;
stack->getRef(0)->tag_idx = -1; /* MUST not be used */
@@ -1058,7 +1043,9 @@ static void Html_process_space(DilloHtml *html, const char *space,
int i, offset;
DilloHtmlParseMode parse_mode = S_TOP(html)->parse_mode;
- if (parse_mode == DILLO_HTML_PARSE_MODE_STASH) {
+ if (S_TOP(html)->display_none) {
+ /* do nothing */
+ } else if (parse_mode == DILLO_HTML_PARSE_MODE_STASH) {
html->StashSpace = (html->Stash->len > 0);
} else if (parse_mode == DILLO_HTML_PARSE_MODE_VERBATIM) {
@@ -1143,6 +1130,9 @@ static void Html_process_word(DilloHtml *html, const char *word, int size)
char *Pword;
DilloHtmlParseMode parse_mode = S_TOP(html)->parse_mode;
+ if (S_TOP(html)->display_none)
+ return;
+
if (parse_mode == DILLO_HTML_PARSE_MODE_STASH ||
parse_mode == DILLO_HTML_PARSE_MODE_STASH_AND_BODY) {
if (html->StashSpace) {
@@ -1314,7 +1304,8 @@ static void Html_tag_cleanup_to_idx(DilloHtml *html, int idx)
if (s_sz > idx + 1 && toptag.EndTag != 'O')
BUG_MSG(" - forcing close of open tag: <%s>\n", toptag.name);
_MSG("Close: %*s%s\n", size," ", toptag.name);
- toptag.close(html, toptag_idx);
+ if (toptag.close)
+ toptag.close(html, toptag_idx);
Html_real_pop_tag(html);
}
}
@@ -1815,8 +1806,6 @@ static void Html_tag_open_p(DilloHtml *html, const char *tag, int tagsize)
CssPropertyList props;
a_Html_tag_set_align_attr (html, tag, tagsize);
- html->styleEngine->inheritBackgroundColor ();
- HT2TB(html)->addParbreak (9, html->styleEngine->wordStyle ());
}
/*
@@ -1827,22 +1816,15 @@ static void Html_tag_open_p(DilloHtml *html, const char *tag, int tagsize)
static void Html_tag_open_frame (DilloHtml *html, const char *tag, int tagsize)
{
const char *attrbuf;
- char *src;
DilloUrl *url;
- Textblock *textblock;
- Widget *bullet;
CssPropertyList props;
- textblock = HT2TB(html);
-
if (!(attrbuf = a_Html_get_attr(html, tag, tagsize, "src")))
return;
if (!(url = a_Html_url_new(html, attrbuf, NULL, 0)))
return;
- src = dStrdup(attrbuf);
-
if (a_Capi_get_flags_with_redirection(url) & CAPI_IsCached) {
/* visited frame */
html->styleEngine->setPseudoVisited ();
@@ -1853,6 +1835,21 @@ static void Html_tag_open_frame (DilloHtml *html, const char *tag, int tagsize)
html->styleEngine->setNonCssHint (PROPERTY_X_LINK, CSS_TYPE_INTEGER,
Html_set_new_link(html,&url));
+}
+
+static void Html_tag_content_frame (DilloHtml *html, const char *tag, int tagsize)
+{
+ const char *attrbuf;
+ char *src;
+ Textblock *textblock;
+ Widget *bullet;
+
+ textblock = HT2TB(html);
+
+ if (!(attrbuf = a_Html_get_attr(html, tag, tagsize, "src")))
+ return;
+
+ src = dStrdup(attrbuf);
textblock->addParbreak (5, html->styleEngine->wordStyle ());
@@ -1885,7 +1882,7 @@ static void Html_tag_open_frame (DilloHtml *html, const char *tag, int tagsize)
* TODO: This is just a temporary fix while real frame support
* isn't finished. Imitates lynx/w3m's frames.
*/
-static void Html_tag_open_frameset (DilloHtml *html,
+static void Html_tag_content_frameset (DilloHtml *html,
const char *tag, int tagsize)
{
HT2TB(html)->addParbreak (9, html->styleEngine->wordStyle ());
@@ -1898,11 +1895,8 @@ static void Html_tag_open_frameset (DilloHtml *html,
*/
static void Html_tag_open_h(DilloHtml *html, const char *tag, int tagsize)
{
- html->styleEngine->inheritBackgroundColor ();
a_Html_tag_set_align_attr (html, tag, tagsize);
- HT2TB(html)->addParbreak (9, html->styleEngine->wordStyle ());
-
a_Html_stash_init(html);
S_TOP(html)->parse_mode =
DILLO_HTML_PARSE_MODE_STASH_AND_BODY;
@@ -1911,7 +1905,7 @@ static void Html_tag_open_h(DilloHtml *html, const char *tag, int tagsize)
/*
* <BR>
*/
-static void Html_tag_open_br(DilloHtml *html, const char *tag, int tagsize)
+static void Html_tag_content_br(DilloHtml *html, const char *tag, int tagsize)
{
HT2TB(html)->addLinebreak (html->styleEngine->wordStyle ());
}
@@ -1964,37 +1958,11 @@ static void Html_tag_open_abbr(DilloHtml *html, const char *tag, int tagsize)
}
/*
- * <CENTER>
- */
-static void Html_tag_open_center(DilloHtml *html, const char *tag, int tagsize)
-{
html->styleEngine->inheritBackgroundColor ();
- HT2TB(html)->addParbreak (0, html->styleEngine->wordStyle ());
-}
-
-/*
- * </CENTER>, also used for </TABLE>
- */
-static void Html_tag_close_center(DilloHtml *html, int TagIdx)
-{
- HT2TB(html)->addParbreak (0, html->styleEngine->wordStyle ());
-}
-
-/*
- * <ADDRESS>
- */
-static void Html_tag_open_address(DilloHtml *html,
- const char *tag, int tagsize)
-{
html->styleEngine->inheritBackgroundColor ();
- HT2TB(html)->addParbreak (9, html->styleEngine->wordStyle ());
-}
-
-/*
* Read image-associated tag attributes and create new image.
*/
-DilloImage *a_Html_image_new(DilloHtml *html, const char *tag,
- int tagsize, DilloUrl *url)
+void a_Html_image_new(DilloHtml *html, const char *tag, int tagsize)
{
DilloImage *Image;
char *width_ptr, *height_ptr, *alt_ptr;
@@ -2002,7 +1970,6 @@ DilloImage *a_Html_image_new(DilloHtml *html, const char *tag,
CssLength l_w = CSS_CREATE_LENGTH(0.0, CSS_LENGTH_TYPE_AUTO);
CssLength l_h = CSS_CREATE_LENGTH(0.0, CSS_LENGTH_TYPE_AUTO);
int space, border, w = 0, h = 0;
- bool load_now;
if (prefs.show_tooltip &&
(attrbuf = a_Html_get_attr(html, tag, tagsize, "title"))) {
@@ -2114,23 +2081,41 @@ DilloImage *a_Html_image_new(DilloHtml *html, const char *tag,
html->styleEngine->setNonCssHint (PROPERTY_X_IMG, CSS_TYPE_INTEGER,
html->images->size());
- /* Add a new image widget to this page */
Image = a_Image_new(alt_ptr, 0);
if (HT2TB(html)->getBgColor())
Image->bg_color = HT2TB(html)->getBgColor()->getColor();
- load_now = prefs.load_images ||
- !dStrAsciiCasecmp(URL_SCHEME(url), "data") ||
- (a_Capi_get_flags_with_redirection(url) & CAPI_IsCached);
- bool loading = false;
- if (load_now)
- loading = Html_load_image(html->bw, url, html->page_url, Image);
- Html_add_new_htmlimage(html, &url, loading ? NULL : Image);
+ DilloHtmlImage *hi = dNew(DilloHtmlImage, 1);
+ hi->url = NULL;
+ hi->image = Image;
+ a_Image_ref(Image);
+
+ int n = html->images->size();
+ html->images->increase();
+ html->images->set(n, hi);
dFree(width_ptr);
dFree(height_ptr);
dFree(alt_ptr);
- return Image;
+}
+
+DilloImage *a_Html_image_add(DilloHtml *html, DilloUrl *url)
+{
+ bool load_now;
+ int image_index = html->styleEngine->style()->x_img;
+ DilloHtmlImage *hi = html->images->get(image_index);
+ DilloImage *image = hi->image;
+
+ hi->url = url;
+
+ load_now = prefs.load_images ||
+ !dStrAsciiCasecmp(URL_SCHEME(url), "data") ||
+ (a_Capi_get_flags_with_redirection(url) & CAPI_IsCached);
+
+ if (load_now && Html_load_image(html->bw, url, html->page_url, image))
+ hi->image = NULL;
+
+ return image;
}
/*
@@ -2154,12 +2139,17 @@ static bool Html_load_image(BrowserWindow *bw, DilloUrl *url,
return ClientKey != 0;
}
+static void Html_tag_open_img(DilloHtml *html, const char *tag, int tagsize)
+{
+ a_Html_image_new(html, tag, tagsize);
+}
+
/*
* Create a new Image struct and request the image-url to the cache
* (If it either hits or misses, is not relevant here; that's up to the
* cache functions)
*/
-static void Html_tag_open_img(DilloHtml *html, const char *tag, int tagsize)
+static void Html_tag_content_img(DilloHtml *html, const char *tag, int tagsize)
{
DilloImage *Image;
DilloUrl *url, *usemap_url;
@@ -2178,7 +2168,8 @@ static void Html_tag_open_img(DilloHtml *html, const char *tag, int tagsize)
/* TODO: usemap URLs outside of the document are not used. */
usemap_url = a_Html_url_new(html, attrbuf, NULL, 0);
- Image = a_Html_image_new(html, tag, tagsize, url);
+ Image = a_Html_image_add(html, url);
+
HT2TB(html)->addWidget((Widget*)Image->dw, html->styleEngine->style());
/* Image maps */
@@ -2202,7 +2193,7 @@ static void Html_tag_open_img(DilloHtml *html, const char *tag, int tagsize)
/*
* <map>
*/
-static void Html_tag_open_map(DilloHtml *html, const char *tag, int tagsize)
+static void Html_tag_content_map(DilloHtml *html, const char *tag, int tagsize)
{
char *hash_name;
const char *attrbuf;
@@ -2276,7 +2267,7 @@ misc::SimpleVector<int> *Html_read_coords(DilloHtml *html, const char *str)
/*
* <AREA>
*/
-static void Html_tag_open_area(DilloHtml *html, const char *tag, int tagsize)
+static void Html_tag_content_area(DilloHtml *html, const char *tag, int tagsize)
{
enum types {UNKNOWN, RECTANGLE, CIRCLE, POLYGON, BACKGROUND};
types type;
@@ -2436,7 +2427,7 @@ static void Html_tag_open_a(DilloHtml *html, const char *tag, int tagsize)
/* TODO: add support for MAP with A HREF */
if (html->InFlags & IN_MAP)
- Html_tag_open_area(html, tag, tagsize);
+ Html_tag_content_area(html, tag, tagsize);
if ((attrbuf = a_Html_get_attr(html, tag, tagsize, "href"))) {
/* if it's a javascript link, extract the reference. */
@@ -2562,8 +2553,6 @@ static void Html_tag_open_ul(DilloHtml *html, const char *tag, int tagsize)
CSS_TYPE_ENUM, list_style_type);
}
- Html_add_textblock(html, 9);
-
S_TOP(html)->list_type = HTML_LIST_UNORDERED;
S_TOP(html)->list_number = 0;
S_TOP(html)->ref_list_item = NULL;
@@ -2620,8 +2609,6 @@ static void Html_tag_open_ol(DilloHtml *html, const char *tag, int tagsize)
CSS_TYPE_ENUM, listStyleType);
}
- Html_add_textblock(html, 9);
-
S_TOP(html)->list_type = HTML_LIST_ORDERED;
if ((attrbuf = a_Html_get_attr(html, tag, tagsize, "start")) &&
@@ -2639,12 +2626,8 @@ static void Html_tag_open_ol(DilloHtml *html, const char *tag, int tagsize)
static void Html_tag_open_li(DilloHtml *html, const char *tag, int tagsize)
{
Style *style = html->styleEngine->style ();
- Style *wordStyle = html->styleEngine->wordStyle ();
- Widget **ref_list_item;
- ListItem *list_item;
int *list_number;
const char *attrbuf;
- char buf[16];
if (S_TOP(html)->list_type == HTML_LIST_NONE)
BUG_MSG("<li> outside <ul> or <ol>\n");
@@ -2653,30 +2636,14 @@ static void Html_tag_open_li(DilloHtml *html, const char *tag, int tagsize)
/* Get our parent tag's variables (used as state storage) */
list_number = &html->stack->getRef(html->stack->size()-2)->list_number;
- ref_list_item = &html->stack->getRef(html->stack->size()-2)->ref_list_item;
-
- HT2TB(html)->addParbreak (0, wordStyle);
-
- list_item = new ListItem ((ListItem*)*ref_list_item,prefs.limit_text_width);
- HT2TB(html)->addWidget (list_item, style);
- HT2TB(html)->addParbreak (0, wordStyle);
- *ref_list_item = list_item;
- S_TOP(html)->textblock = html->dw = list_item;
- if (style->listStyleType == LIST_STYLE_TYPE_NONE) {
- // none
- } else if (style->listStyleType >= LIST_STYLE_TYPE_DECIMAL) {
+ if (style->listStyleType >= LIST_STYLE_TYPE_DECIMAL) {
// ordered
if ((attrbuf = a_Html_get_attr(html, tag, tagsize, "value")) &&
(*list_number = strtol(attrbuf, NULL, 10)) < 0) {
BUG_MSG("illegal negative LIST VALUE attribute; Starting from 0\n");
*list_number = 0;
}
- numtostr((*list_number)++, buf, 16, style->listStyleType);
- list_item->initWithText (buf, wordStyle);
- } else {
- // unordered
- list_item->initWithWidget (new Bullet(), wordStyle);
}
}
@@ -2694,7 +2661,6 @@ static void Html_tag_close_li(DilloHtml *html, int TagIdx)
*/
static void Html_tag_open_hr(DilloHtml *html, const char *tag, int tagsize)
{
- Widget *hruler;
char *width_ptr;
const char *attrbuf;
int32_t size = 0;
@@ -2742,6 +2708,11 @@ static void Html_tag_open_hr(DilloHtml *html, const char *tag, int tagsize)
size_bottom);
}
+}
+
+static void Html_tag_content_hr(DilloHtml *html, const char *tag, int tagsize)
+{
+ Widget *hruler;
HT2TB(html)->addParbreak (5, html->styleEngine->wordStyle ());
hruler = new Ruler();
@@ -2794,7 +2765,6 @@ static void Html_tag_open_pre(DilloHtml *html, const char *tag, int tagsize)
static void Html_tag_close_pre(DilloHtml *html, int TagIdx)
{
html->InFlags &= ~IN_PRE;
- HT2TB(html)->addParbreak (9, html->styleEngine->wordStyle ());
}
/*
@@ -3084,14 +3054,6 @@ static void Html_tag_open_default(DilloHtml *html,const char *tag,int tagsize)
static void Html_tag_open_div(DilloHtml *html, const char *tag, int tagsize)
{
a_Html_tag_set_align_attr (html, tag, tagsize);
- Html_add_textblock(html, 0);
-}
-
-/*
- * Default close for most tags.
- */
-static void Html_tag_close_default(DilloHtml *html, int TagIdx)
-{
}
/*
@@ -3104,8 +3066,13 @@ static void Html_tag_close_par(DilloHtml *html, int TagIdx)
/*
- * Function index for the open and close functions for each tag
- * (Alphabetically sorted for a binary search)
+ * Function index for the open, content, and close functions for each tag
+ * (Alphabetically sorted for a binary search).
+ * The open and close functions are always called. They are used for style
+ * handling and HTML bug reporting.
+ * Content creation (e.g. adding new widgets or text) is done in the content
+ * function, which is not called in the display:none case.
+ * Note, that many tags don't need a content function (e.g. <div>, <span>, ...).
*
* Explanation for the 'Flags' field:
*
@@ -3122,102 +3089,115 @@ static void Html_tag_close_par(DilloHtml *html, int TagIdx)
* - Empty elements have both inline and block container clear.
* (flow have both set)
*/
+ TagOpenFunct content;
const TagInfo Tags[] = {
- {"a", B8(010101),'R',2, Html_tag_open_a, Html_tag_close_a},
- {"abbr", B8(010101),'R',2, Html_tag_open_abbr, Html_tag_close_default},
+ {"a", B8(010101),'R',2, Html_tag_open_a, NULL, Html_tag_close_a},
+ {"abbr", B8(010101),'R',2, Html_tag_open_abbr, NULL, NULL},
/* acronym 010101 */
- {"address", B8(010110),'R',2, Html_tag_open_address, Html_tag_close_par},
- {"area", B8(010001),'F',0, Html_tag_open_area, Html_tag_close_default},
- {"b", B8(010101),'R',2, Html_tag_open_default, Html_tag_close_default},
- {"base", B8(100001),'F',0, Html_tag_open_base, Html_tag_close_default},
+ {"address", B8(010110),'R',2, Html_tag_open_default, NULL, Html_tag_close_par},
+ {"area", B8(010001),'F',0, Html_tag_open_default, Html_tag_content_area,
+ NULL},
+ {"b", B8(010101),'R',2, Html_tag_open_default, NULL, NULL},
+ {"base", B8(100001),'F',0, Html_tag_open_base, NULL, NULL},
/* basefont 010001 */
/* bdo 010101 */
- {"big", B8(010101),'R',2, Html_tag_open_default, Html_tag_close_default},
- {"blockquote", B8(011110),'R',2, Html_tag_open_blockquote,
- Html_tag_close_default},
- {"body", B8(011110),'O',1, Html_tag_open_body, Html_tag_close_body},
- {"br", B8(010001),'F',0, Html_tag_open_br, Html_tag_close_default},
- {"button", B8(011101),'R',2, Html_tag_open_button, Html_tag_close_button},
+ {"big", B8(010101),'R',2, Html_tag_open_default, NULL, NULL},
+ {"blockquote", B8(011110),'R',2, Html_tag_open_blockquote, NULL,
+ NULL},
+ {"body", B8(011110),'O',1, Html_tag_open_body, NULL, Html_tag_close_body},
+ {"br", B8(010001),'F',0, Html_tag_open_default, Html_tag_content_br,
+ NULL},
+ {"button", B8(011101),'R',2, Html_tag_open_button, NULL, Html_tag_close_button},
/* caption */
- {"center", B8(011110),'R',2, Html_tag_open_center, Html_tag_close_center},
- {"cite", B8(010101),'R',2, Html_tag_open_default, Html_tag_close_default},
- {"code", B8(010101),'R',2, Html_tag_open_default, Html_tag_close_default},
+ {"center", B8(011110),'R',2, Html_tag_open_default, NULL, NULL},
+ {"cite", B8(010101),'R',2, Html_tag_open_default, NULL, NULL},
+ {"code", B8(010101),'R',2, Html_tag_open_default, NULL, NULL},
/* col 010010 'F' */
/* colgroup */
- {"dd", B8(011110),'O',1, Html_tag_open_dd, Html_tag_close_default},
- {"del", B8(011101),'R',2, Html_tag_open_default, Html_tag_close_default},
- {"dfn", B8(010101),'R',2, Html_tag_open_default, Html_tag_close_default},
- {"dir", B8(011010),'R',2, Html_tag_open_dir, Html_tag_close_par},
+ {"dd", B8(011110),'O',1, Html_tag_open_dd, NULL, NULL},
+ {"del", B8(011101),'R',2, Html_tag_open_default, NULL, NULL},
+ {"dfn", B8(010101),'R',2, Html_tag_open_default, NULL, NULL},
+ {"dir", B8(011010),'R',2, Html_tag_open_dir, NULL, Html_tag_close_par},
/* TODO: complete <div> support! */
- {"div", B8(011110),'R',2, Html_tag_open_div, Html_tag_close_default},
- {"dl", B8(011010),'R',2, Html_tag_open_dl, Html_tag_close_par},
- {"dt", B8(010110),'O',1, Html_tag_open_dt, Html_tag_close_par},
- {"em", B8(010101),'R',2, Html_tag_open_default, Html_tag_close_default},
+ {"div", B8(011110),'R',2, Html_tag_open_div, NULL, NULL},
+ {"dl", B8(011010),'R',2, Html_tag_open_dl, NULL, Html_tag_close_par},
+ {"dt", B8(010110),'O',1, Html_tag_open_dt, NULL, Html_tag_close_par},
+ {"em", B8(010101),'R',2, Html_tag_open_default, NULL, NULL},
/* fieldset */
- {"font", B8(010101),'R',2, Html_tag_open_font, Html_tag_close_default},
- {"form", B8(011110),'R',2, Html_tag_open_form, Html_tag_close_form},
- {"frame", B8(010010),'F',0, Html_tag_open_frame, Html_tag_close_default},
- {"frameset", B8(011110),'R',2,Html_tag_open_frameset, Html_tag_close_default},
- {"h1", B8(010110),'R',2, Html_tag_open_h, Html_tag_close_par},
- {"h2", B8(010110),'R',2, Html_tag_open_h, Html_tag_close_par},
- {"h3", B8(010110),'R',2, Html_tag_open_h, Html_tag_close_par},
- {"h4", B8(010110),'R',2, Html_tag_open_h, Html_tag_close_par},
- {"h5", B8(010110),'R',2, Html_tag_open_h, Html_tag_close_par},
- {"h6", B8(010110),'R',2, Html_tag_open_h, Html_tag_close_par},
- {"head", B8(101101),'O',1, Html_tag_open_head, Html_tag_close_head},
- {"hr", B8(010010),'F',0, Html_tag_open_hr, Html_tag_close_default},
- {"html", B8(001110),'O',1, Html_tag_open_html, Html_tag_close_html},
- {"i", B8(010101),'R',2, Html_tag_open_default, Html_tag_close_default},
- {"iframe", B8(011110),'R',2, Html_tag_open_frame, Html_tag_close_default},
- {"img", B8(010001),'F',0, Html_tag_open_img, Html_tag_close_default},
- {"input", B8(010001),'F',0, Html_tag_open_input, Html_tag_close_default},
+ {"font", B8(010101),'R',2, Html_tag_open_font, NULL, NULL},
+ {"form", B8(011110),'R',2, Html_tag_open_form, NULL, Html_tag_close_form},
+ {"frame", B8(010010),'F',0, Html_tag_open_frame, Html_tag_content_frame,
+ NULL},
+ {"frameset", B8(011110),'R',2, Html_tag_open_default, Html_tag_content_frameset,
+ NULL},
+ {"h1", B8(010110),'R',2, Html_tag_open_h, NULL, NULL},
+ {"h2", B8(010110),'R',2, Html_tag_open_h, NULL, NULL},
+ {"h3", B8(010110),'R',2, Html_tag_open_h, NULL, NULL},
+ {"h4", B8(010110),'R',2, Html_tag_open_h, NULL, NULL},
+ {"h5", B8(010110),'R',2, Html_tag_open_h, NULL, NULL},
+ {"h6", B8(010110),'R',2, Html_tag_open_h, NULL, NULL},
+ {"head", B8(101101),'O',1, Html_tag_open_head, NULL, Html_tag_close_head},
+ {"hr", B8(010010),'F',0, Html_tag_open_hr, Html_tag_content_hr,
+ NULL},
+ {"html", B8(001110),'O',1, Html_tag_open_html, NULL, Html_tag_close_html},
+ {"i", B8(010101),'R',2, Html_tag_open_default, NULL, NULL},
+ {"iframe", B8(011110),'R',2, Html_tag_open_frame, NULL, NULL},
+ {"img", B8(010001),'F',0, Html_tag_open_img, Html_tag_content_img,
+ NULL},
+ {"input", B8(010001),'F',0, Html_tag_open_input, NULL, NULL},
/* ins */
- {"isindex", B8(110001),'F',0, Html_tag_open_isindex, Html_tag_close_default},
- {"kbd", B8(010101),'R',2, Html_tag_open_default, Html_tag_close_default},
+ {"isindex", B8(110001),'F',0, Html_tag_open_isindex, NULL, NULL},
+ {"kbd", B8(010101),'R',2, Html_tag_open_default, NULL, NULL},
/* label 010101 */
/* legend 01?? */
- {"li", B8(011110),'O',1, Html_tag_open_li, Html_tag_close_li},
- {"link", B8(100001),'F',0, Html_tag_open_link, Html_tag_close_default},
- {"map", B8(011001),'R',2, Html_tag_open_map, Html_tag_close_map},
+ {"li", B8(011110),'O',1, Html_tag_open_li, NULL, Html_tag_close_li},
+ {"link", B8(100001),'F',0, Html_tag_open_link, NULL, NULL},
+ {"map", B8(011001),'R',2, Html_tag_open_default, Html_tag_content_map,
+ Html_tag_close_map},
/* menu 1010 -- TODO: not exactly 1010, it can contain LI and inline */
- {"menu", B8(011010),'R',2, Html_tag_open_menu, Html_tag_close_par},
- {"meta", B8(100001),'F',0, Html_tag_open_meta, Html_tag_close_default},
+ {"menu", B8(011010),'R',2, Html_tag_open_menu, NULL, Html_tag_close_par},
+ {"meta", B8(100001),'F',0, Html_tag_open_meta, NULL, NULL},
/* noframes 1011 */
/* noscript 1011 */
- {"object", B8(111101),'R',2, Html_tag_open_object, Html_tag_close_default},
- {"ol", B8(011010),'R',2, Html_tag_open_ol, Html_tag_close_default},
+ {"object", B8(111101),'R',2, Html_tag_open_object, NULL, NULL},
+ {"ol", B8(011010),'R',2, Html_tag_open_ol, NULL, NULL},
/* optgroup */
- {"option", B8(010001),'O',1, Html_tag_open_option, Html_tag_close_default},
- {"p", B8(010110),'O',1, Html_tag_open_p, Html_tag_close_par},
+ {"option", B8(010001),'O',1, Html_tag_open_option, NULL, NULL},
+ {"p", B8(010110),'O',1, Html_tag_open_p, NULL, NULL},
/* param 010001 'F' */
- {"pre", B8(010110),'R',2, Html_tag_open_pre, Html_tag_close_pre},
- {"q", B8(010101),'R',2, Html_tag_open_q, Html_tag_close_q},
- {"s", B8(010101),'R',2, Html_tag_open_default, Html_tag_close_default},
- {"samp", B8(010101),'R',2, Html_tag_open_default, Html_tag_close_default},
- {"script", B8(111001),'R',2, Html_tag_open_script, Html_tag_close_script},
- {"select", B8(010101),'R',2, Html_tag_open_select, Html_tag_close_select},
- {"small", B8(010101),'R',2, Html_tag_open_default, Html_tag_close_default},
- {"span", B8(010101),'R',2, Html_tag_open_default, Html_tag_close_default},
- {"strike", B8(010101),'R',2, Html_tag_open_default, Html_tag_close_default},
- {"strong", B8(010101),'R',2, Html_tag_open_default, Html_tag_close_default},
- {"style", B8(100101),'R',2, Html_tag_open_style, Html_tag_close_style},
- {"sub", B8(010101),'R',2, Html_tag_open_default, Html_tag_close_default},
- {"sup", B8(010101),'R',2, Html_tag_open_default, Html_tag_close_default},
- {"table", B8(011010),'R',5, Html_tag_open_table, Html_tag_close_center},
+ {"pre", B8(010110),'R',2, Html_tag_open_pre, NULL, Html_tag_close_pre},
+ {"q", B8(010101),'R',2, Html_tag_open_q, NULL, Html_tag_close_q},
+ {"s", B8(010101),'R',2, Html_tag_open_default, NULL, NULL},
+ {"samp", B8(010101),'R',2, Html_tag_open_default, NULL, NULL},
+ {"script", B8(111001),'R',2, Html_tag_open_script, NULL, Html_tag_close_script},
+ {"select", B8(010101),'R',2, Html_tag_open_select, NULL, Html_tag_close_select},
+ {"small", B8(010101),'R',2, Html_tag_open_default, NULL, NULL},
+ {"span", B8(010101),'R',2, Html_tag_open_default, NULL, NULL},
+ {"strike", B8(010101),'R',2, Html_tag_open_default, NULL, NULL},
+ {"strong", B8(010101),'R',2, Html_tag_open_default, NULL, NULL},
+ {"style", B8(100101),'R',2, Html_tag_open_style, NULL, Html_tag_close_style},
+ {"sub", B8(010101),'R',2, Html_tag_open_default, NULL, NULL},
+ {"sup", B8(010101),'R',2, Html_tag_open_default, NULL, NULL},
+ {"table", B8(011010),'R',5, Html_tag_open_table, Html_tag_content_table,
+ NULL},
/* tbody */
- {"td", B8(011110),'O',3, Html_tag_open_td, Html_tag_close_default},
- {"textarea", B8(010101),'R',2,Html_tag_open_textarea,Html_tag_close_textarea},
+ {"td", B8(011110),'O',3, Html_tag_open_td, Html_tag_content_td,
+ NULL},
+ {"textarea", B8(010101),'R',2,Html_tag_open_textarea, Html_tag_content_textarea,
+ Html_tag_close_textarea},
/* tfoot */
- {"th", B8(011110),'O',1, Html_tag_open_th, Html_tag_close_default},
+ {"th", B8(011110),'O',1, Html_tag_open_th, Html_tag_content_th,
+ NULL},
/* thead */
- {"title", B8(100101),'R',2, Html_tag_open_title, Html_tag_close_title},
- {"tr", B8(011010),'O',4, Html_tag_open_tr, Html_tag_close_default},
- {"tt", B8(010101),'R',2, Html_tag_open_default, Html_tag_close_default},
- {"u", B8(010101),'R',2, Html_tag_open_default, Html_tag_close_default},
- {"ul", B8(011010),'R',2, Html_tag_open_ul, Html_tag_close_default},
- {"var", B8(010101),'R',2, Html_tag_open_default, Html_tag_close_default}
+ {"title", B8(100101),'R',2, Html_tag_open_title, NULL, Html_tag_close_title},
+ {"tr", B8(011010),'O',4, Html_tag_open_tr, Html_tag_content_tr,
+ NULL},
+ {"tt", B8(010101),'R',2, Html_tag_open_default, NULL, NULL},
+ {"u", B8(010101),'R',2, Html_tag_open_default, NULL, NULL},
+ {"ul", B8(011010),'R',2, Html_tag_open_ul, NULL, NULL},
+ {"var", B8(010101),'R',2, Html_tag_open_default, NULL, NULL}
};
#define NTAGS (sizeof(Tags)/sizeof(Tags[0]))
@@ -3457,6 +3437,45 @@ static void Html_parse_common_attrs(DilloHtml *html, char *tag, int tagsize)
}
+static void Html_display_block(DilloHtml *html)
+{
+ //HT2TB(html)->addParbreak (5, html->styleEngine->wordStyle ());
+ Html_add_textblock(html, 0);
+}
+
+static void Html_display_listitem(DilloHtml *html)
+{
+ Style *style = html->styleEngine->style ();
+ Style *wordStyle = html->styleEngine->wordStyle ();
+ Widget **ref_list_item;
+ ListItem *list_item;
+ int *list_number;
+ char buf[16];
+
+ /* Get our parent tag's variables (used as state storage) */
+ list_number = &html->stack->getRef(html->stack->size()-2)->list_number;
+ ref_list_item = &html->stack->getRef(html->stack->size()-2)->ref_list_item;
+
+ HT2TB(html)->addParbreak (0, wordStyle);
+
+ list_item = new ListItem ((ListItem*)*ref_list_item,prefs.limit_text_width);
+ HT2TB(html)->addWidget (list_item, style);
+ HT2TB(html)->addParbreak (0, wordStyle);
+ *ref_list_item = list_item;
+ S_TOP(html)->textblock = html->dw = list_item;
+
+ if (style->listStyleType == LIST_STYLE_TYPE_NONE) {
+ // none
+ } else if (style->listStyleType >= LIST_STYLE_TYPE_DECIMAL) {
+ // ordered
+ numtostr((*list_number)++, buf, 16, style->listStyleType);
+ list_item->initWithText (buf, wordStyle);
+ } else {
+ // unordered
+ list_item->initWithWidget (new Bullet(), wordStyle);
+ }
+}
+
/*
* Process a tag, given as 'tag' and 'tagsize'. -- tagsize is [1 based]
* ('tag' must include the enclosing angle brackets)
@@ -3513,6 +3532,29 @@ static void Html_process_tag(DilloHtml *html, char *tag, int tagsize)
/* Call the open function for this tag */
_MSG("Open : %s\n", Tags[ni].name);
Tags[ni].open (html, tag, tagsize);
+
+ if (! S_TOP(html)->display_none) {
+ switch (html->styleEngine->style ()->display) {
+ case DISPLAY_BLOCK:
+ Html_display_block(html);
+ break;
+ case DISPLAY_LIST_ITEM:
+ Html_display_listitem(html);
+ break;
+ case DISPLAY_NONE:
+ S_TOP(html)->display_none = true;
+ break;
+ case DISPLAY_INLINE:
+ case DISPLAY_INLINE_BLOCK: // TODO: implement inline-block
+ default:
+ break;
+ }
+
+ if (Tags[ni].content && ! S_TOP(html)->display_none) {
+ Tags[ni].content (html, tag, tagsize);
+ }
+ }
+
if (html->stop_parser)
break;
diff --git a/src/html_common.hh b/src/html_common.hh
index cf5c8114..8eed11f3 100644
--- a/src/html_common.hh
+++ b/src/html_common.hh
@@ -34,6 +34,9 @@
html->bugMessage(__VA_ARGS__); \
} D_STMT_END
+
+extern bool tagIsDisplayEnabled;
+
/*
* Typedefs
*/
@@ -103,7 +106,7 @@ struct _DilloHtmlState {
DilloHtmlTableMode table_mode;
DilloHtmlTableBorderMode table_border_mode;
bool cell_text_align_set;
-
+ bool display_none;
DilloHtmlListMode list_type;
int list_number;
@@ -238,8 +241,8 @@ DilloUrl *a_Html_url_new(DilloHtml *html,
const char *url_str, const char *base_url,
int use_base_url);
-DilloImage *a_Html_image_new(DilloHtml *html, const char *tag,
- int tagsize, DilloUrl *url);
+void a_Html_image_new(DilloHtml *html, const char *tag, int tagsize);
+DilloImage *a_Html_image_add(DilloHtml *html, DilloUrl *url);
char *a_Html_parse_entities(DilloHtml *html, const char *token, int toksize);
void a_Html_pop_tag(DilloHtml *html, int TagIdx);
diff --git a/src/table.cc b/src/table.cc
index 622868ca..d66b32b0 100644
--- a/src/table.cc
+++ b/src/table.cc
@@ -30,14 +30,15 @@ using namespace dw::core::style;
static void Html_tag_open_table_cell(DilloHtml *html,
const char *tag, int tagsize,
- dw::core::style::TextAlignType text_align);
+ dw::core::style::TextAlignType text_align);
+static void Html_tag_content_table_cell(DilloHtml *html,
+ const char *tag, int tagsize);
/*
* <TABLE>
*/
void Html_tag_open_table(DilloHtml *html, const char *tag, int tagsize)
{
- dw::core::Widget *table;
const char *attrbuf;
int32_t border = -1, cellspacing = -1, cellpadding = -1, bgcolor = -1;
CssLength cssLength;
@@ -99,7 +100,7 @@ void Html_tag_open_table(DilloHtml *html, const char *tag, int tagsize)
CSS_TYPE_COLOR, bgcolor);
}
- HT2TB(html)->addParbreak (0, html->styleEngine->wordStyle ());
+ html->styleEngine->style (); // evaluate now, so we can build non-css hints for the cells
/* The style for the cells */
html->styleEngine->clearNonCssHints ();
@@ -135,13 +136,21 @@ void Html_tag_open_table(DilloHtml *html, const char *tag, int tagsize)
CSS_TYPE_LENGTH_PERCENTAGE, cssLength);
}
+}
+void Html_tag_content_table(DilloHtml *html, const char *tag, int tagsize)
+{
+ dw::core::Widget *table;
+
+ HT2TB(html)->addParbreak (0, html->styleEngine->wordStyle ());
table = new dw::Table(prefs.limit_text_width);
HT2TB(html)->addWidget (table, html->styleEngine->style ());
+ HT2TB(html)->addParbreak (0, html->styleEngine->wordStyle ());
S_TOP(html)->table_mode = DILLO_HTML_TABLE_MODE_TOP;
S_TOP(html)->table_border_mode = DILLO_HTML_TABLE_BORDER_SEPARATE;
S_TOP(html)->cell_text_align_set = FALSE;
S_TOP(html)->table = table;
+
}
/*
@@ -177,8 +186,6 @@ void Html_tag_open_tr(DilloHtml *html, const char *tag, int tagsize)
html->styleEngine->inheritBackgroundColor ();
- ((dw::Table*)S_TOP(html)->table)->addRow (html->styleEngine->style ());
-
if (bgcolor != -1) {
html->styleEngine->setNonCssHint(CSS_PROPERTY_BACKGROUND_COLOR,
CSS_TYPE_COLOR, bgcolor);
@@ -188,6 +195,20 @@ void Html_tag_open_tr(DilloHtml *html, const char *tag, int tagsize)
default:
break;
}
+}
+
+void Html_tag_content_tr(DilloHtml *html, const char *tag, int tagsize)
+{
+ switch (S_TOP(html)->table_mode) {
+ case DILLO_HTML_TABLE_MODE_NONE:
+ return;
+ case DILLO_HTML_TABLE_MODE_TOP:
+ case DILLO_HTML_TABLE_MODE_TR:
+ case DILLO_HTML_TABLE_MODE_TD:
+ ((dw::Table*)S_TOP(html)->table)->addRow (html->styleEngine->style ());
+ default:
+ break;
+ }
S_TOP(html)->table_mode = DILLO_HTML_TABLE_MODE_TR;
}
@@ -201,6 +222,11 @@ void Html_tag_open_td(DilloHtml *html, const char *tag, int tagsize)
dw::core::style::TEXT_ALIGN_LEFT);
}
+void Html_tag_content_td(DilloHtml *html, const char *tag, int tagsize)
+{
+ Html_tag_content_table_cell (html, tag, tagsize);
+}
+
/*
* <TH>
*/
@@ -210,6 +236,11 @@ void Html_tag_open_th(DilloHtml *html, const char *tag, int tagsize)
dw::core::style::TEXT_ALIGN_CENTER);
}
+void Html_tag_content_th(DilloHtml *html, const char *tag, int tagsize)
+{
+ Html_tag_content_table_cell (html, tag, tagsize);
+}
+
/*
* Utilities
*/
@@ -311,8 +342,6 @@ static void Html_tag_open_table_cell(DilloHtml *html,
const char *tag, int tagsize,
dw::core::style::TextAlignType text_align)
{
- Widget *col_tb;
- int colspan = 1, rowspan = 1;
const char *attrbuf;
int32_t bgcolor;
@@ -329,16 +358,6 @@ static void Html_tag_open_table_cell(DilloHtml *html,
/* continues */
case DILLO_HTML_TABLE_MODE_TR:
case DILLO_HTML_TABLE_MODE_TD:
- if ((attrbuf = a_Html_get_attr(html, tag, tagsize, "colspan"))) {
- char *invalid;
- colspan = strtol(attrbuf, &invalid, 10);
- if ((colspan < 0) || (attrbuf == invalid))
- colspan = 1;
- }
- /* TODO: check errors? */
- if ((attrbuf = a_Html_get_attr(html, tag, tagsize, "rowspan")))
- rowspan = MAX(1, strtol (attrbuf, NULL, 10));
-
/* text style */
if (!S_TOP(html)->cell_text_align_set) {
html->styleEngine->setNonCssHint (CSS_PROPERTY_TEXT_ALIGN,
@@ -365,6 +384,38 @@ static void Html_tag_open_table_cell(DilloHtml *html,
CSS_TYPE_COLOR, bgcolor);
}
+ default:
+ /* compiler happiness */
+ break;
+ }
+}
+
+static void Html_tag_content_table_cell(DilloHtml *html,
+ const char *tag, int tagsize)
+{
+ int colspan = 1, rowspan = 1;
+ const char *attrbuf;
+ Widget *col_tb;
+
+ switch (S_TOP(html)->table_mode) {
+ case DILLO_HTML_TABLE_MODE_NONE:
+ return;
+
+ case DILLO_HTML_TABLE_MODE_TOP:
+ BUG_MSG("<td> or <th> outside <tr>\n");
+ /* a_Dw_table_add_cell takes care that dillo does not crash. */
+ /* continues */
+ case DILLO_HTML_TABLE_MODE_TR:
+ case DILLO_HTML_TABLE_MODE_TD:
+ if ((attrbuf = a_Html_get_attr(html, tag, tagsize, "colspan"))) {
+ char *invalid;
+ colspan = strtol(attrbuf, &invalid, 10);
+ if ((colspan < 0) || (attrbuf == invalid))
+ colspan = 1;
+ }
+ /* TODO: check errors? */
+ if ((attrbuf = a_Html_get_attr(html, tag, tagsize, "rowspan")))
+ rowspan = MAX(1, strtol (attrbuf, NULL, 10));
if (html->styleEngine->style ()->textAlign
== TEXT_ALIGN_STRING)
col_tb = new dw::TableCell (
diff --git a/src/table.hh b/src/table.hh
index aca717ba..5417f681 100644
--- a/src/table.hh
+++ b/src/table.hh
@@ -12,8 +12,12 @@ class DilloHtml;
*/
void Html_tag_open_table(DilloHtml *html, const char *tag, int tagsize);
+void Html_tag_content_table(DilloHtml *html, const char *tag, int tagsize);
void Html_tag_open_tr(DilloHtml *html, const char *tag, int tagsize);
+void Html_tag_content_tr(DilloHtml *html, const char *tag, int tagsize);
void Html_tag_open_td(DilloHtml *html, const char *tag, int tagsize);
+void Html_tag_content_td(DilloHtml *html, const char *tag, int tagsize);
void Html_tag_open_th(DilloHtml *html, const char *tag, int tagsize);
+void Html_tag_content_th(DilloHtml *html, const char *tag, int tagsize);
#endif /* __TABLE_HH__ */