1
0
mirror of https://github.com/rkd77/elinks.git synced 2024-12-04 14:46:47 -05:00

[xhtml] code is compilable, but likely non-functional

This commit is contained in:
Witold Filipczyk 2021-06-20 22:38:17 +02:00
parent e3852637ff
commit ba3af06b40
16 changed files with 1168 additions and 664 deletions

View File

@ -83,6 +83,10 @@ struct html_context {
unsigned int has_link_lines:1;
unsigned int was_body:1; /* For META refresh inside <body>. */
unsigned int was_body_background:1; /* For <HTML> with style. */
unsigned int skip_html:1;
unsigned int skip_select:1;
unsigned int support_css:1;
unsigned int skip_textarea:1;
/* For html/parser.c, html/renderer.c */
int margin;
@ -90,6 +94,8 @@ struct html_context {
/* For parser/forms.c: */
char *startf;
int ff;
/* For:
* html/parser/parse.c
* html/parser.c
@ -131,13 +137,13 @@ struct html_context {
#define html_top ((struct html_element *) html_context->stack.next)
#define html_bottom ((struct html_element *) html_context->stack.prev)
#define format (html_top->attr)
#define par_format (html_top->parattr)
#define elformat (html_top->attr)
#define par_elformat (html_top->parattr)
#define html_is_preformatted() (format.style.attr & AT_PREFORMATTED)
#define html_is_preformatted() (elformat.style.attr & AT_PREFORMATTED)
#define get_html_max_width() \
int_max(par_format.width - (par_format.leftmargin + par_format.rightmargin), 0)
int_max(par_elformat.width - (par_elformat.leftmargin + par_elformat.rightmargin), 0)
/* For parser/link.c: */

View File

@ -77,6 +77,19 @@ get_color(struct html_context *html_context, char *a,
return extract_color(html_context, a, attribute, rgb);
}
int
get_color2(struct html_context *html_context, unsigned char *value_value, color_T *rgb)
{
if (!use_document_fg_colors(html_context->options))
return -1;
if (!value_value)
return -1;
return decode_color(value_value, strlen(value_value), rgb);
}
int
get_bgcolor(struct html_context *html_context, char *a, color_T *rgb)
{
@ -244,8 +257,8 @@ html_focusable(struct html_context *html_context, char *a)
int cp;
int tabindex;
format.accesskey = 0;
format.tabindex = 0x80000000;
elformat.accesskey = 0;
elformat.tabindex = 0x80000000;
if (!a) return;
@ -253,22 +266,22 @@ html_focusable(struct html_context *html_context, char *a)
accesskey = get_attr_val(a, "accesskey", cp);
if (accesskey) {
format.accesskey = accesskey_string_to_unicode(accesskey);
elformat.accesskey = accesskey_string_to_unicode(accesskey);
mem_free(accesskey);
}
tabindex = get_num(a, "tabindex", cp);
if (0 < tabindex && tabindex < 32767) {
format.tabindex = (tabindex & 0x7fff) << 16;
elformat.tabindex = (tabindex & 0x7fff) << 16;
}
mem_free_set(&format.onclick, get_attr_val(a, "onclick", cp));
mem_free_set(&format.ondblclick, get_attr_val(a, "ondblclick", cp));
mem_free_set(&format.onmouseover, get_attr_val(a, "onmouseover", cp));
mem_free_set(&format.onhover, get_attr_val(a, "onhover", cp));
mem_free_set(&format.onfocus, get_attr_val(a, "onfocus", cp));
mem_free_set(&format.onmouseout, get_attr_val(a, "onmouseout", cp));
mem_free_set(&format.onblur, get_attr_val(a, "onblur", cp));
mem_free_set(&elformat.onclick, get_attr_val(a, "onclick", cp));
mem_free_set(&elformat.ondblclick, get_attr_val(a, "ondblclick", cp));
mem_free_set(&elformat.onmouseover, get_attr_val(a, "onmouseover", cp));
mem_free_set(&elformat.onhover, get_attr_val(a, "onhover", cp));
mem_free_set(&elformat.onfocus, get_attr_val(a, "onfocus", cp));
mem_free_set(&elformat.onmouseout, get_attr_val(a, "onmouseout", cp));
mem_free_set(&elformat.onblur, get_attr_val(a, "onblur", cp));
}
void
@ -692,15 +705,15 @@ init_html_parser_state(struct html_context *html_context,
{
html_stack_dup(html_context, type);
par_format.align = align;
par_elformat.align = align;
if (type <= ELEMENT_IMMORTAL) {
par_format.leftmargin = margin;
par_format.rightmargin = margin;
par_format.width = width;
par_format.list_level = 0;
par_format.list_number = 0;
par_format.dd_margin = 0;
par_elformat.leftmargin = margin;
par_elformat.rightmargin = margin;
par_elformat.width = width;
par_elformat.list_level = 0;
par_elformat.list_number = 0;
par_elformat.dd_margin = 0;
html_top->namelen = 0;
}
@ -783,34 +796,34 @@ init_html_parser(struct uri *uri, struct document_options *options,
if (!e) return NULL;
add_to_list(html_context->stack, e);
format.style.attr = 0;
format.fontsize = 3;
format.link = format.target = format.image = NULL;
format.onclick = format.ondblclick = format.onmouseover = format.onhover
= format.onfocus = format.onmouseout = format.onblur = NULL;
format.select = NULL;
format.form = NULL;
format.title = NULL;
elformat.style.attr = 0;
elformat.fontsize = 3;
elformat.link = elformat.target = elformat.image = NULL;
elformat.onclick = elformat.ondblclick = elformat.onmouseover = elformat.onhover
= elformat.onfocus = elformat.onmouseout = elformat.onblur = NULL;
elformat.select = NULL;
elformat.form = NULL;
elformat.title = NULL;
format.style = options->default_style;
format.color.clink = options->default_color.link;
format.color.vlink = options->default_color.vlink;
elformat.style = options->default_style;
elformat.color.clink = options->default_color.link;
elformat.color.vlink = options->default_color.vlink;
#ifdef CONFIG_BOOKMARKS
format.color.bookmark_link = options->default_color.bookmark_link;
elformat.color.bookmark_link = options->default_color.bookmark_link;
#endif
format.color.image_link = options->default_color.image_link;
format.color.link_number = options->default_color.link_number;
elformat.color.image_link = options->default_color.image_link;
elformat.color.link_number = options->default_color.link_number;
par_format.align = ALIGN_LEFT;
par_format.leftmargin = options->margin;
par_format.rightmargin = options->margin;
par_elformat.align = ALIGN_LEFT;
par_elformat.leftmargin = options->margin;
par_elformat.rightmargin = options->margin;
par_format.width = options->document_width;
par_format.list_level = par_format.list_number = 0;
par_format.dd_margin = options->margin;
par_format.flags = P_DISC;
par_elformat.width = options->document_width;
par_elformat.list_level = par_elformat.list_number = 0;
par_elformat.dd_margin = options->margin;
par_elformat.flags = P_DISC;
par_format.color.background = options->default_style.color.background;
par_elformat.color.background = options->default_style.color.background;
html_top->invisible = 0;
html_top->name = NULL;

View File

@ -211,6 +211,8 @@ void ln_break(struct html_context *html_context, int n);
int get_color(struct html_context *html_context, char *a, char *c, color_T *rgb);
int get_color2(struct html_context *html_context, unsigned char *value_value, color_T *rgb);
#ifdef __cplusplus
}
#endif

View File

@ -183,8 +183,8 @@ no_type_attr:
fc->default_value = stracpy("");
html_context->special_f(html_context, SP_CONTROL, fc);
format.form = fc;
format.style.attr |= AT_BOLD;
elformat.form = fc;
elformat.style.attr |= AT_BOLD;
}
static void
@ -194,9 +194,9 @@ html_input_format(struct html_context *html_context, char *a,
put_chrs(html_context, " ", 1);
html_stack_dup(html_context, ELEMENT_KILLABLE);
html_focusable(html_context, a);
format.form = fc;
mem_free_if(format.title);
format.title = get_attr_val(a, "title", html_context->doc_cp);
elformat.form = fc;
mem_free_if(elformat.title);
elformat.title = get_attr_val(a, "title", html_context->doc_cp);
switch (fc->type) {
case FC_TEXT:
case FC_PASSWORD:
@ -204,42 +204,42 @@ html_input_format(struct html_context *html_context, char *a,
{
int i;
format.style.attr |= AT_BOLD;
elformat.style.attr |= AT_BOLD;
for (i = 0; i < fc->size; i++)
put_chrs(html_context, "_", 1);
break;
}
case FC_CHECKBOX:
format.style.attr |= AT_BOLD;
elformat.style.attr |= AT_BOLD;
put_chrs(html_context, "[&nbsp;]", 8);
break;
case FC_RADIO:
format.style.attr |= AT_BOLD;
elformat.style.attr |= AT_BOLD;
put_chrs(html_context, "(&nbsp;)", 8);
break;
case FC_IMAGE:
{
char *al;
mem_free_set(&format.image, NULL);
mem_free_set(&elformat.image, NULL);
al = get_url_val(a, "src", html_context->doc_cp);
if (!al)
al = get_url_val(a, "dynsrc",
html_context->doc_cp);
if (al) {
format.image = join_urls(html_context->base_href, al);
elformat.image = join_urls(html_context->base_href, al);
mem_free(al);
}
format.style.attr |= AT_BOLD;
elformat.style.attr |= AT_BOLD;
put_chrs(html_context, "[&nbsp;", 7);
format.style.attr |= AT_NO_ENTITIES;
elformat.style.attr |= AT_NO_ENTITIES;
if (fc->alt)
put_chrs(html_context, fc->alt, strlen(fc->alt));
else if (fc->name)
put_chrs(html_context, fc->name, strlen(fc->name));
else
put_chrs(html_context, "Submit", 6);
format.style.attr &= ~AT_NO_ENTITIES;
elformat.style.attr &= ~AT_NO_ENTITIES;
put_chrs(html_context, "&nbsp;]", 7);
break;
@ -247,12 +247,12 @@ html_input_format(struct html_context *html_context, char *a,
case FC_SUBMIT:
case FC_RESET:
case FC_BUTTON:
format.style.attr |= AT_BOLD;
elformat.style.attr |= AT_BOLD;
put_chrs(html_context, "[&nbsp;", 7);
if (fc->default_value) {
format.style.attr |= AT_NO_ENTITIES;
elformat.style.attr |= AT_NO_ENTITIES;
put_chrs(html_context, fc->default_value, strlen(fc->default_value));
format.style.attr &= ~AT_NO_ENTITIES;
elformat.style.attr &= ~AT_NO_ENTITIES;
}
put_chrs(html_context, "&nbsp;]", 7);
break;
@ -495,8 +495,8 @@ end_parse:
menu_labels(fc->menu, "", labels);
html_stack_dup(html_context, ELEMENT_KILLABLE);
format.form = fc;
format.style.attr |= AT_BOLD;
elformat.form = fc;
elformat.style.attr |= AT_BOLD;
put_chrs(html_context, "[&nbsp;", 7);
max_width = 0;
@ -530,8 +530,8 @@ do_html_select_multiple(struct html_context *html_context, char *a,
if (!al) return;
html_focusable(html_context, a);
html_top->type = ELEMENT_DONT_KILL;
mem_free_set(&format.select, al);
format.select_disabled = has_attr(a, "disabled", html_context->doc_cp)
mem_free_set(&elformat.select, al);
elformat.select_disabled = has_attr(a, "disabled", html_context->doc_cp)
? FORM_MODE_DISABLED
: FORM_MODE_NORMAL;
}
@ -554,7 +554,7 @@ html_option(struct html_context *html_context, char *a,
struct el_form_control *fc;
char *val;
if (!format.select) return;
if (!elformat.select) return;
val = get_attr_val(a, "value", html_context->doc_cp);
if (!val) {
@ -608,17 +608,17 @@ end_parse:
}
fc->id = get_attr_val(a, "id", html_context->doc_cp);
fc->name = null_or_stracpy(format.select);
fc->name = null_or_stracpy(elformat.select);
fc->default_value = val;
fc->default_state = has_attr(a, "selected", html_context->doc_cp);
fc->mode = has_attr(a, "disabled", html_context->doc_cp)
? FORM_MODE_DISABLED
: format.select_disabled;
: elformat.select_disabled;
put_chrs(html_context, " ", 1);
html_stack_dup(html_context, ELEMENT_KILLABLE);
format.form = fc;
format.style.attr |= AT_BOLD;
elformat.form = fc;
elformat.style.attr |= AT_BOLD;
put_chrs(html_context, "[ ]", 3);
pop_html_element(html_context);
put_chrs(html_context, " ", 1);
@ -717,8 +717,8 @@ pp:
else put_chrs(html_context, " ", 1);
html_stack_dup(html_context, ELEMENT_KILLABLE);
format.form = fc;
format.style.attr |= AT_BOLD;
elformat.form = fc;
elformat.style.attr |= AT_BOLD;
for (i = 0; i < rows; i++) {
int j;

View File

@ -52,28 +52,28 @@ void
html_bold(struct html_context *html_context, char *a,
char *xxx3, char *xxx4, char **xxx5)
{
format.style.attr |= AT_BOLD;
elformat.style.attr |= AT_BOLD;
}
void
html_italic(struct html_context *html_context, char *a,
char *xxx3, char *xxx4, char **xxx5)
{
format.style.attr |= AT_ITALIC;
elformat.style.attr |= AT_ITALIC;
}
void
html_underline(struct html_context *html_context, char *a,
char *xxx3, char *xxx4, char **xxx5)
{
format.style.attr |= AT_UNDERLINE;
elformat.style.attr |= AT_UNDERLINE;
}
void
html_fixed(struct html_context *html_context, char *a,
char *xxx3, char *xxx4, char **xxx5)
{
format.style.attr |= AT_FIXED;
elformat.style.attr |= AT_FIXED;
}
void
@ -152,25 +152,25 @@ html_font(struct html_context *html_context, char *a,
s = strtoul(nn, (char **) &end, 10);
if (!errno && *nn && !*end) {
if (s > 7) s = 7;
if (!p) format.fontsize = s;
else format.fontsize += p * s;
if (format.fontsize < 1) format.fontsize = 1;
else if (format.fontsize > 7) format.fontsize = 7;
if (!p) elformat.fontsize = s;
else elformat.fontsize += p * s;
if (elformat.fontsize < 1) elformat.fontsize = 1;
else if (elformat.fontsize > 7) elformat.fontsize = 7;
}
mem_free(al);
}
get_color(html_context, a, "color", &format.style.color.foreground);
get_color(html_context, a, "color", &elformat.style.color.foreground);
}
void
html_body(struct html_context *html_context, char *a,
char *xxx3, char *xxx4, char **xxx5)
{
get_color(html_context, a, "text", &format.style.color.foreground);
get_color(html_context, a, "link", &format.color.clink);
get_color(html_context, a, "vlink", &format.color.vlink);
get_color(html_context, a, "text", &elformat.style.color.foreground);
get_color(html_context, a, "link", &elformat.color.clink);
get_color(html_context, a, "vlink", &elformat.color.vlink);
if (get_bgcolor(html_context, a, &format.style.color.background) != -1)
if (get_bgcolor(html_context, a, &elformat.style.color.background) != -1)
html_context->was_body_background = 1;
html_context->was_body = 1; /* this will be used by "meta inside body" */
@ -188,17 +188,17 @@ html_apply_canvas_bgcolor(struct html_context *html_context)
&html_context->stack);
#endif
if (par_format.color.background != format.style.color.background) {
if (par_elformat.color.background != elformat.style.color.background) {
/* Modify the root HTML element - format_html_part() will take
* this from there. */
struct html_element *e = html_bottom;
html_context->was_body_background = 1;
e->parattr.color.background = e->attr.style.color.background = par_format.color.background = format.style.color.background;
e->parattr.color.background = e->attr.style.color.background = par_elformat.color.background = elformat.style.color.background;
}
if (html_context->has_link_lines
&& par_format.color.background != html_context->options->default_style.color.background
&& par_elformat.color.background != html_context->options->default_style.color.background
&& !search_html_stack(html_context, "BODY")) {
html_context->special_f(html_context, SP_COLOR_LINK_LINES);
}
@ -417,8 +417,8 @@ html_html(struct html_context *html_context, char *a,
* this from there. */
struct html_element *e = html_bottom;
if (par_format.color.background != format.style.color.background)
e->parattr.color.background = e->attr.style.color.background = par_format.color.background = format.style.color.background;
if (par_elformat.color.background != elformat.style.color.background)
e->parattr.color.background = e->attr.style.color.background = par_elformat.color.background = elformat.style.color.background;
}
void
@ -473,9 +473,9 @@ void
html_center(struct html_context *html_context, char *a,
char *xxx3, char *xxx4, char **xxx5)
{
par_format.align = ALIGN_CENTER;
par_elformat.align = ALIGN_CENTER;
if (!html_context->table_level)
par_format.leftmargin = par_format.rightmargin = 0;
par_elformat.leftmargin = par_elformat.rightmargin = 0;
}
void
@ -485,13 +485,13 @@ html_linebrk(struct html_context *html_context, char *a,
char *al = get_attr_val(a, "align", html_context->doc_cp);
if (al) {
if (!c_strcasecmp(al, "left")) par_format.align = ALIGN_LEFT;
else if (!c_strcasecmp(al, "right")) par_format.align = ALIGN_RIGHT;
if (!c_strcasecmp(al, "left")) par_elformat.align = ALIGN_LEFT;
else if (!c_strcasecmp(al, "right")) par_elformat.align = ALIGN_RIGHT;
else if (!c_strcasecmp(al, "center")) {
par_format.align = ALIGN_CENTER;
par_elformat.align = ALIGN_CENTER;
if (!html_context->table_level)
par_format.leftmargin = par_format.rightmargin = 0;
} else if (!c_strcasecmp(al, "justify")) par_format.align = ALIGN_JUSTIFY;
par_elformat.leftmargin = par_elformat.rightmargin = 0;
} else if (!c_strcasecmp(al, "justify")) par_elformat.align = ALIGN_JUSTIFY;
mem_free(al);
}
}
@ -511,9 +511,9 @@ void
html_p(struct html_context *html_context, char *a,
char *html, char *eof, char **end)
{
int_lower_bound(&par_format.leftmargin, html_context->margin);
int_lower_bound(&par_format.rightmargin, html_context->margin);
/*par_format.align = ALIGN_LEFT;*/
int_lower_bound(&par_elformat.leftmargin, html_context->margin);
int_lower_bound(&par_elformat.rightmargin, html_context->margin);
/*par_elformat.align = ALIGN_LEFT;*/
html_linebrk(html_context, a, html, eof, end);
}
@ -521,28 +521,28 @@ void
html_address(struct html_context *html_context, char *a,
char *xxx3, char *xxx4, char **xxx5)
{
par_format.leftmargin++;
par_format.align = ALIGN_LEFT;
par_elformat.leftmargin++;
par_elformat.align = ALIGN_LEFT;
}
void
html_blockquote(struct html_context *html_context, char *a,
char *xxx3, char *xxx4, char **xxx5)
{
par_format.align = ALIGN_LEFT;
if (par_format.blockquote_level == 0) {
par_format.orig_leftmargin = par_format.leftmargin;
par_format.blockquote_level++;
par_elformat.align = ALIGN_LEFT;
if (par_elformat.blockquote_level == 0) {
par_elformat.orig_leftmargin = par_elformat.leftmargin;
par_elformat.blockquote_level++;
}
par_format.blockquote_level++;
par_elformat.blockquote_level++;
}
void
html_blockquote_close(struct html_context *html_context, char *a,
char *xxx3, char *xxx4, char **xxx5)
{
if (par_format.blockquote_level == 2) par_format.blockquote_level--;
if (par_format.blockquote_level > 0) par_format.blockquote_level--;
if (par_elformat.blockquote_level == 2) par_elformat.blockquote_level--;
if (par_elformat.blockquote_level > 0) par_elformat.blockquote_level--;
}
void
@ -550,26 +550,26 @@ html_h(int h, char *a,
enum format_align default_align, struct html_context *html_context,
char *html, char *eof, char **end)
{
if (!par_format.align) par_format.align = default_align;
if (!par_elformat.align) par_elformat.align = default_align;
html_linebrk(html_context, a, html, eof, end);
h -= 2;
if (h < 0) h = 0;
switch (par_format.align) {
switch (par_elformat.align) {
case ALIGN_LEFT:
par_format.leftmargin = h * 2;
par_format.rightmargin = 0;
par_elformat.leftmargin = h * 2;
par_elformat.rightmargin = 0;
break;
case ALIGN_RIGHT:
par_format.leftmargin = 0;
par_format.rightmargin = h * 2;
par_elformat.leftmargin = 0;
par_elformat.rightmargin = h * 2;
break;
case ALIGN_CENTER:
par_format.leftmargin = par_format.rightmargin = 0;
par_elformat.leftmargin = par_elformat.rightmargin = 0;
break;
case ALIGN_JUSTIFY:
par_format.leftmargin = par_format.rightmargin = h * 2;
par_elformat.leftmargin = par_elformat.rightmargin = h * 2;
break;
}
}
@ -578,7 +578,7 @@ void
html_h1(struct html_context *html_context, char *a,
char *html, char *eof, char **end)
{
format.style.attr |= AT_BOLD;
elformat.style.attr |= AT_BOLD;
html_h(1, a, ALIGN_CENTER, html_context, html, eof, end);
}
@ -621,9 +621,9 @@ void
html_pre(struct html_context *html_context, char *a,
char *xxx3, char *xxx4, char **xxx5)
{
format.style.attr |= AT_PREFORMATTED;
par_format.leftmargin = (par_format.leftmargin > 1);
par_format.rightmargin = 0;
elformat.style.attr |= AT_PREFORMATTED;
par_elformat.leftmargin = (par_elformat.leftmargin > 1);
par_elformat.rightmargin = 0;
}
void
@ -645,22 +645,22 @@ void
html_hr(struct html_context *html_context, char *a,
char *html, char *eof, char **end)
{
int i/* = par_format.width - 10*/;
int i/* = par_elformat.width - 10*/;
char r = BORDER_DHLINE;
int q = get_num(a, "size", html_context->doc_cp);
if (q >= 0 && q < 2) r = BORDER_SHLINE;
html_stack_dup(html_context, ELEMENT_KILLABLE);
par_format.align = ALIGN_CENTER;
mem_free_set(&format.link, NULL);
format.form = NULL;
par_elformat.align = ALIGN_CENTER;
mem_free_set(&elformat.link, NULL);
elformat.form = NULL;
html_linebrk(html_context, a, html, eof, end);
if (par_format.align == ALIGN_JUSTIFY) par_format.align = ALIGN_CENTER;
par_format.leftmargin = par_format.rightmargin = html_context->margin;
if (par_elformat.align == ALIGN_JUSTIFY) par_elformat.align = ALIGN_CENTER;
par_elformat.leftmargin = par_elformat.rightmargin = html_context->margin;
i = get_width(a, "width", 1, html_context);
if (i == -1) i = get_html_max_width();
format.style.attr = AT_GRAPHICS;
elformat.style.attr = AT_GRAPHICS;
html_context->special_f(html_context, SP_NOWRAP, 1);
while (i-- > 0) {
put_chrs(html_context, &r, 1);
@ -682,10 +682,10 @@ html_table(struct html_context *html_context, char *attr,
return;
}
par_format.leftmargin = par_format.rightmargin = html_context->margin;
par_format.align = ALIGN_LEFT;
par_elformat.leftmargin = par_elformat.rightmargin = html_context->margin;
par_elformat.align = ALIGN_LEFT;
html_linebrk(html_context, attr, html, eof, end);
format.style.attr = 0;
elformat.style.attr = 0;
}
void
@ -708,7 +708,7 @@ html_th(struct html_context *html_context, char *a,
/*html_linebrk(html_context, a, html, eof, end);*/
kill_html_stack_until(html_context, 1,
"TD", "TH", "", "TR", "TABLE", NULL);
format.style.attr |= AT_BOLD;
elformat.style.attr |= AT_BOLD;
put_chrs(html_context, " ", 1);
}
@ -719,7 +719,7 @@ html_td(struct html_context *html_context, char *a,
/*html_linebrk(html_context, a, html, eof, end);*/
kill_html_stack_until(html_context, 1,
"TD", "TH", "", "TR", "TABLE", NULL);
format.style.attr &= ~AT_BOLD;
elformat.style.attr &= ~AT_BOLD;
put_chrs(html_context, " ", 1);
}
@ -754,25 +754,25 @@ html_ul(struct html_context *html_context, char *a,
char *al;
/* dump_html_stack(html_context); */
par_format.list_level++;
par_format.list_number = 0;
par_format.flags = P_DISC;
par_elformat.list_level++;
par_elformat.list_number = 0;
par_elformat.flags = P_DISC;
al = get_attr_val(a, "type", html_context->doc_cp);
if (al) {
if (!c_strcasecmp(al, "disc"))
par_format.flags = P_DISC;
par_elformat.flags = P_DISC;
else if (!c_strcasecmp(al, "circle"))
par_format.flags = P_O;
par_elformat.flags = P_O;
else if (!c_strcasecmp(al, "square"))
par_format.flags = P_SQUARE;
par_elformat.flags = P_SQUARE;
mem_free(al);
}
par_format.leftmargin += 2 + (par_format.list_level > 1);
par_elformat.leftmargin += 2 + (par_elformat.list_level > 1);
if (!html_context->table_level)
int_upper_bound(&par_format.leftmargin, par_format.width / 2);
int_upper_bound(&par_elformat.leftmargin, par_elformat.width / 2);
par_format.align = ALIGN_LEFT;
par_elformat.align = ALIGN_LEFT;
html_top->type = ELEMENT_DONT_KILL;
}
@ -783,31 +783,31 @@ html_ol(struct html_context *html_context, char *a,
char *al;
int st;
par_format.list_level++;
par_elformat.list_level++;
st = get_num(a, "start", html_context->doc_cp);
if (st == -1) st = 1;
par_format.list_number = st;
par_format.flags = P_NUMBER;
par_elformat.list_number = st;
par_elformat.flags = P_NUMBER;
al = get_attr_val(a, "type", html_context->doc_cp);
if (al) {
if (*al && !al[1]) {
if (*al == '1') par_format.flags = P_NUMBER;
else if (*al == 'a') par_format.flags = P_alpha;
else if (*al == 'A') par_format.flags = P_ALPHA;
else if (*al == 'r') par_format.flags = P_roman;
else if (*al == 'R') par_format.flags = P_ROMAN;
else if (*al == 'i') par_format.flags = P_roman;
else if (*al == 'I') par_format.flags = P_ROMAN;
if (*al == '1') par_elformat.flags = P_NUMBER;
else if (*al == 'a') par_elformat.flags = P_alpha;
else if (*al == 'A') par_elformat.flags = P_ALPHA;
else if (*al == 'r') par_elformat.flags = P_roman;
else if (*al == 'R') par_elformat.flags = P_ROMAN;
else if (*al == 'i') par_elformat.flags = P_roman;
else if (*al == 'I') par_elformat.flags = P_ROMAN;
}
mem_free(al);
}
par_format.leftmargin += (par_format.list_level > 1);
par_elformat.leftmargin += (par_elformat.list_level > 1);
if (!html_context->table_level)
int_upper_bound(&par_format.leftmargin, par_format.width / 2);
int_upper_bound(&par_elformat.leftmargin, par_elformat.width / 2);
par_format.align = ALIGN_LEFT;
par_elformat.align = ALIGN_LEFT;
html_top->type = ELEMENT_DONT_KILL;
}
@ -866,7 +866,7 @@ void
html_li(struct html_context *html_context, char *a,
char *xxx3, char *xxx4, char **xxx5)
{
int t = par_format.flags & P_LISTMASK;
int t = par_elformat.flags & P_LISTMASK;
/* When handling the code <li><li> @was_li will be 1 and it means we
* have to insert a line break since no list item content has done it
@ -880,7 +880,7 @@ html_li(struct html_context *html_context, char *a,
"", "UL", "OL", NULL);*/
if (t == P_NO_BULLET) {
/* Print nothing. */
} else if (!par_format.list_number) {
} else if (!par_elformat.list_number) {
if (t == P_O) /* Print U+25E6 WHITE BULLET. */
put_chrs(html_context, "&#9702;", 7);
else if (t == P_SQUARE) /* Print U+25AA BLACK SMALL SQUARE. */
@ -888,33 +888,33 @@ html_li(struct html_context *html_context, char *a,
else /* Print U+2022 BULLET. */
put_chrs(html_context, "&#8226;", 7);
put_chrs(html_context, "&nbsp;", 6);
par_format.leftmargin += 2;
par_format.align = ALIGN_LEFT;
par_elformat.leftmargin += 2;
par_elformat.align = ALIGN_LEFT;
} else {
unsigned char c = 0;
int nlen;
int t = par_format.flags & P_LISTMASK;
int t = par_elformat.flags & P_LISTMASK;
int s = get_num(a, "value", html_context->doc_cp);
struct string n;
if (!init_string(&n)) return;
if (s != -1) par_format.list_number = s;
if (s != -1) par_elformat.list_number = s;
if (t == P_ALPHA || t == P_alpha) {
unsigned char n0;
put_chrs(html_context, "&nbsp;", 6);
c = 1;
n0 = par_format.list_number
? (par_format.list_number - 1) % 26
n0 = par_elformat.list_number
? (par_elformat.list_number - 1) % 26
+ (t == P_ALPHA ? 'A' : 'a')
: 0;
if (n0) add_char_to_string(&n, n0);
} else if (t == P_ROMAN || t == P_roman) {
roman(&n, par_format.list_number);
roman(&n, par_elformat.list_number);
if (t == P_ROMAN) {
char *x;
@ -923,20 +923,20 @@ html_li(struct html_context *html_context, char *a,
} else {
char n0[64];
if (par_format.list_number < 10) {
if (par_elformat.list_number < 10) {
put_chrs(html_context, "&nbsp;", 6);
c = 1;
}
ulongcat(n0, NULL, par_format.list_number, (sizeof(n) - 1), 0);
ulongcat(n0, NULL, par_elformat.list_number, (sizeof(n) - 1), 0);
add_to_string(&n, n0);
}
nlen = n.length;
put_chrs(html_context, n.source, nlen);
put_chrs(html_context, ".&nbsp;", 7);
par_format.leftmargin += nlen + c + 2;
par_format.align = ALIGN_LEFT;
par_elformat.leftmargin += nlen + c + 2;
par_elformat.align = ALIGN_LEFT;
done_string(&n);
{
@ -944,10 +944,10 @@ html_li(struct html_context *html_context, char *a,
element = search_html_stack(html_context, "ol");
if (element)
element->parattr.list_number = par_format.list_number + 1;
element->parattr.list_number = par_elformat.list_number + 1;
}
par_format.list_number = 0;
par_elformat.list_number = 0;
}
html_context->putsp = HTML_SPACE_SUPPRESS;
@ -959,16 +959,16 @@ void
html_dl(struct html_context *html_context, char *a,
char *xxx3, char *xxx4, char **xxx5)
{
par_format.flags &= ~P_COMPACT;
par_elformat.flags &= ~P_COMPACT;
if (has_attr(a, "compact", html_context->doc_cp))
par_format.flags |= P_COMPACT;
if (par_format.list_level) par_format.leftmargin += 5;
par_format.list_level++;
par_format.list_number = 0;
par_format.align = ALIGN_LEFT;
par_format.dd_margin = par_format.leftmargin;
par_elformat.flags |= P_COMPACT;
if (par_elformat.list_level) par_elformat.leftmargin += 5;
par_elformat.list_level++;
par_elformat.list_number = 0;
par_elformat.align = ALIGN_LEFT;
par_elformat.dd_margin = par_elformat.leftmargin;
html_top->type = ELEMENT_DONT_KILL;
if (!(par_format.flags & P_COMPACT)) {
if (!(par_elformat.flags & P_COMPACT)) {
ln_break(html_context, 2);
html_top->linebreak = 2;
}
@ -979,9 +979,9 @@ html_dt(struct html_context *html_context, char *a,
char *xxx3, char *xxx4, char **xxx5)
{
kill_html_stack_until(html_context, 0, "", "DL", NULL);
par_format.align = ALIGN_LEFT;
par_format.leftmargin = par_format.dd_margin;
if (!(par_format.flags & P_COMPACT)
par_elformat.align = ALIGN_LEFT;
par_elformat.leftmargin = par_elformat.dd_margin;
if (!(par_elformat.flags & P_COMPACT)
&& !has_attr(a, "compact", html_context->doc_cp))
ln_break(html_context, 2);
}
@ -992,13 +992,13 @@ html_dd(struct html_context *html_context, char *a,
{
kill_html_stack_until(html_context, 0, "", "DL", NULL);
par_format.leftmargin = par_format.dd_margin + 3;
par_elformat.leftmargin = par_elformat.dd_margin + 3;
if (!html_context->table_level) {
par_format.leftmargin += 5;
int_upper_bound(&par_format.leftmargin, par_format.width / 2);
par_elformat.leftmargin += 5;
int_upper_bound(&par_elformat.leftmargin, par_elformat.width / 2);
}
par_format.align = ALIGN_LEFT;
par_elformat.align = ALIGN_LEFT;
}

View File

@ -51,7 +51,7 @@ html_a(struct html_context *html_context, char *a,
if (href) {
char *target;
mem_free_set(&format.link,
mem_free_set(&elformat.link,
join_urls(html_context->base_href,
trim_chars(href, ' ', 0)));
@ -59,33 +59,33 @@ html_a(struct html_context *html_context, char *a,
target = get_target(html_context->options, a);
if (target) {
mem_free_set(&format.target, target);
mem_free_set(&elformat.target, target);
} else {
mem_free_set(&format.target, stracpy(html_context->base_target));
mem_free_set(&elformat.target, stracpy(html_context->base_target));
}
if (0) {
; /* Shut up compiler */
#ifdef CONFIG_GLOBHIST
} else if (get_global_history_item(format.link)) {
format.style.color.foreground = format.color.vlink;
} else if (get_global_history_item(elformat.link)) {
elformat.style.color.foreground = elformat.color.vlink;
html_top->pseudo_class &= ~ELEMENT_LINK;
html_top->pseudo_class |= ELEMENT_VISITED;
#endif
#ifdef CONFIG_BOOKMARKS
} else if (get_bookmark(format.link)) {
format.style.color.foreground = format.color.bookmark_link;
} else if (get_bookmark(elformat.link)) {
elformat.style.color.foreground = elformat.color.bookmark_link;
html_top->pseudo_class &= ~ELEMENT_VISITED;
/* XXX: Really set ELEMENT_LINK? --pasky */
html_top->pseudo_class |= ELEMENT_LINK;
#endif
} else {
format.style.color.foreground = format.color.clink;
elformat.style.color.foreground = elformat.color.clink;
html_top->pseudo_class &= ~ELEMENT_VISITED;
html_top->pseudo_class |= ELEMENT_LINK;
}
mem_free_set(&format.title,
mem_free_set(&elformat.title,
get_attr_val(a, "title", html_context->doc_cp));
html_focusable(html_context, a);
@ -201,13 +201,13 @@ put_image_label(char *a, char *label,
* extension to the standard. After all, it makes sense. */
html_focusable(html_context, a);
saved_foreground = format.style.color.foreground;
saved_attr = format.style.attr;
format.style.color.foreground = format.color.image_link;
format.style.attr |= AT_NO_ENTITIES;
saved_foreground = elformat.style.color.foreground;
saved_attr = elformat.style.attr;
elformat.style.color.foreground = elformat.color.image_link;
elformat.style.attr |= AT_NO_ENTITIES;
put_chrs(html_context, label, strlen(label));
format.style.color.foreground = saved_foreground;
format.style.attr = saved_attr;
elformat.style.color.foreground = saved_foreground;
elformat.style.attr = saved_attr;
}
static void
@ -242,13 +242,13 @@ html_img_do(char *a, char *object_src,
if (!map_url) return;
html_stack_dup(html_context, ELEMENT_KILLABLE);
mem_free_set(&format.link, map_url);
format.form = NULL;
format.style.attr |= AT_BOLD;
mem_free_set(&elformat.link, map_url);
elformat.form = NULL;
elformat.style.attr |= AT_BOLD;
usemap = 1;
}
ismap = format.link
ismap = elformat.link
&& has_attr(a, "ismap", html_context->doc_cp)
&& !usemap;
@ -274,7 +274,7 @@ html_img_do(char *a, char *object_src,
/* Do we want to display images with no alt/title and with no
* link on them ?
* If not, just exit now. */
if (!options->images && !format.link) {
if (!options->images && !elformat.link) {
mem_free_if(src);
if (usemap) pop_html_element(html_context);
return;
@ -304,8 +304,8 @@ html_img_do(char *a, char *object_src,
mem_free_set(&label, stracpy("IMG"));
}
mem_free_set(&format.image, NULL);
mem_free_set(&format.title, NULL);
mem_free_set(&elformat.image, NULL);
mem_free_set(&elformat.title, NULL);
if (label) {
int img_link_tag = options->image_link.tagging;
@ -323,25 +323,25 @@ html_img_do(char *a, char *object_src,
} else {
if (src) {
format.image = join_urls(html_context->base_href, src);
elformat.image = join_urls(html_context->base_href, src);
}
format.title = get_attr_val(a, "title", html_context->doc_cp);
elformat.title = get_attr_val(a, "title", html_context->doc_cp);
if (ismap) {
char *new_link;
html_stack_dup(html_context, ELEMENT_KILLABLE);
new_link = straconcat(format.link, "?0,0", (char *) NULL);
new_link = straconcat(elformat.link, "?0,0", (char *) NULL);
if (new_link)
mem_free_set(&format.link, new_link);
mem_free_set(&elformat.link, new_link);
}
put_image_label(a, label, html_context);
if (ismap) pop_html_element(html_context);
mem_free_set(&format.image, NULL);
mem_free_set(&format.title, NULL);
mem_free_set(&elformat.image, NULL);
mem_free_set(&elformat.title, NULL);
}
mem_free(label);
@ -399,18 +399,18 @@ put_link_line(char *prefix, char *linkname,
html_context->has_link_lines = 1;
html_stack_dup(html_context, ELEMENT_KILLABLE);
ln_break(html_context, 1);
mem_free_set(&format.link, NULL);
mem_free_set(&format.target, NULL);
mem_free_set(&format.title, NULL);
format.form = NULL;
mem_free_set(&elformat.link, NULL);
mem_free_set(&elformat.target, NULL);
mem_free_set(&elformat.title, NULL);
elformat.form = NULL;
put_chrs(html_context, prefix, strlen(prefix));
format.link = join_urls(html_context->base_href, link);
format.target = stracpy(target);
format.style.color.foreground = format.color.clink;
elformat.link = join_urls(html_context->base_href, link);
elformat.target = stracpy(target);
elformat.style.color.foreground = elformat.color.clink;
/* linkname typically comes from get_attr_val, which
* has already expanded character entity references.
* Tell put_chrs not to expand them again. */
format.style.attr |= AT_NO_ENTITIES;
elformat.style.attr |= AT_NO_ENTITIES;
put_chrs(html_context, linkname, strlen(linkname));
ln_break(html_context, 1);
pop_html_element(html_context);

View File

@ -255,6 +255,28 @@ get_num(char *a, char *name, int cp)
char *al = get_attr_val(a, name, cp);
int result = -1;
if (al) {
result = get_num2(al);
// char *end;
// long num;
// errno = 0;
// num = strtol(al, (char **) &end, 10);
// if (!errno && *al && !*end && num >= 0 && num <= INT_MAX)
// result = (int) num;
mem_free(al);
}
return result;
}
int
get_num2(char *al)
{
int result = -1;
if (al) {
char *end;
long num;
@ -263,8 +285,6 @@ get_num(char *a, char *name, int cp)
num = strtol(al, (char **) &end, 10);
if (!errno && *al && !*end && num >= 0 && num <= INT_MAX)
result = (int) num;
mem_free(al);
}
return result;
@ -279,6 +299,15 @@ get_width(char *a, char *name, int limited,
struct html_context *html_context)
{
char *value = get_attr_val(a, name, html_context->doc_cp);
int ret = get_width2(value, limited, html_context);
mem_free_if(value);
return ret;
}
int
get_width2(char *value, int limited, struct html_context *html_context)
{
char *str = value;
char *end;
int percentage = 0;
@ -295,14 +324,14 @@ get_width(char *a, char *name, int limited,
/* Go back, and skip spaces after width if any. */
while (len && isspace(str[len - 1])) len--;
if (!len) { mem_free(value); return -1; } /* Nothing to parse. */
if (!len) { return -1; } /* Nothing to parse. */
/* Is this a percentage ? */
if (str[len - 1] == '%') len--, percentage = 1;
/* Skip spaces between width number and percentage if any. */
while (len && isspace(str[len - 1])) len--;
if (!len) { mem_free(value); return -1; } /* Nothing to parse. */
if (!len) { return -1; } /* Nothing to parse. */
/* Shorten the string a bit, so strtoul() will work on useful
* part of it. */
@ -317,12 +346,9 @@ get_width(char *a, char *name, int limited,
/* We will accept floats but ceil() them. */
if (errno || (*end && *end != '.') || width >= INT_MAX) {
/* Not a valid number. */
mem_free(value);
return -1;
}
mem_free(value);
#define WIDTH_PIXELS2CHARS(width) ((width) + (HTML_CHAR_WIDTH - 1) / 2) / HTML_CHAR_WIDTH;
if (limited) {
@ -356,8 +382,8 @@ get_width(char *a, char *name, int limited,
width = 0;
return width;
}
}
char *
skip_comment(char *html, char *eof)
@ -580,7 +606,7 @@ static char *process_element(char *name, int namelen, int endingtag,
* This function currently requires a semicolon at the end of any
* entity reference, and does not support U+2028 LINE SEPARATOR and
* U+2029 PARAGRAPH SEPARATOR. */
static const char *
const char *
count_newline_entities(const char *html, const char *eof,
int *newlines_out)
{
@ -858,7 +884,7 @@ start_element(struct element_info *ei,
/* Store formatting information for the currently top element on the
* stack before processing the new element. */
restore_format = html_is_preformatted();
old_format = par_format;
old_format = par_elformat;
/* Check for <meta refresh="..."> and <meta> cache-control directives
* inside <body> (see bug 700). */
@ -936,12 +962,12 @@ start_element(struct element_info *ei,
* clickable. */
#ifdef CONFIG_ECMASCRIPT
if (has_attr(attr, "onClick", html_context->doc_cp)) {
/* XXX: Put something better to format.link. --pasky */
mem_free_set(&format.link, stracpy("javascript:void(0);"));
mem_free_set(&format.target, stracpy(html_context->base_target));
format.style.color.foreground = format.color.clink;
/* XXX: Put something better to elformat.link. --pasky */
mem_free_set(&elformat.link, stracpy("javascript:void(0);"));
mem_free_set(&elformat.target, stracpy(html_context->base_target));
elformat.style.color.foreground = elformat.color.clink;
html_top->pseudo_class = ELEMENT_LINK;
mem_free_set(&format.title, stracpy("onClick placeholder"));
mem_free_set(&elformat.title, stracpy("onClick placeholder"));
/* Er. I know. Well, double html_focusable()s shouldn't
* really hurt. */
html_focusable(html_context, attr);
@ -1015,7 +1041,7 @@ start_element(struct element_info *ei,
/* If we are rendering preformatted text (see above), restore the
* formatting attributes that were in effect before processing this
* element. */
if (restore_format) par_format = old_format;
if (restore_format) par_elformat = old_format;
return html;
#undef ELEMENT_RENDER_PROLOGUE

View File

@ -65,7 +65,10 @@ typedef void (element_handler_T)(struct html_context *, char *attr,
int parse_element(char *, char *, char **, int *, char **, char **);
int get_num(char *, char *, int);
int get_num2(char *);
int get_width(char *, char *, int, struct html_context *);
int get_width2(char *, int , struct html_context *);
char *skip_comment(char *, char *);
@ -80,6 +83,8 @@ int supports_html_media_attr(const char *media);
void free_tags_lookup(void);
void init_tags_lookup(void);
const char *count_newline_entities(const char *html, const char *eof, int *newlines_out);
#ifdef __cplusplus
}
#endif

View File

@ -242,10 +242,10 @@ parse_table_attributes(struct table *table, char *attr, int real,
set_table_rules(html_context, table, attr);
table->align = par_format.align;
table->align = par_elformat.align;
get_align(html_context, attr, &table->align);
table->color.background = par_format.color.background;
table->color.background = par_elformat.color.background;
get_bgcolor(html_context, attr, &table->color.background);
}

View File

@ -93,7 +93,6 @@ struct table_cache_entry {
static int table_cache_entries;
static struct hash *table_cache;
struct renderer_context {
int last_link_to_move;
struct tag *last_tag_to_move;
@ -123,11 +122,9 @@ struct renderer_context {
unsigned int nowrap:1; /* Activated/deactivated by SP_NOWRAP. */
};
static struct renderer_context renderer_context;
struct renderer_context renderer_context;
/* Prototypes */
static void line_break(struct html_context *);
static void put_chars(struct html_context *, char *, int);
#define X(x_) (part->box.x + (x_))
@ -174,7 +171,7 @@ realloc_line(struct html_context *html_context, struct document *document,
end = &line->chars[length];
end->data = ' ';
end->attr = 0;
set_screen_char_color(end, par_format.color.background, 0x0,
set_screen_char_color(end, par_elformat.color.background, 0x0,
COLOR_ENSURE_CONTRAST, /* for bug 461 */
document->options.color_mode);
@ -288,9 +285,9 @@ get_format_screen_char(struct html_context *html_context,
static struct text_style ta_cache = INIT_TEXT_STYLE(-1, 0x0, 0x0);
static struct screen_char schar_cache;
if (memcmp(&ta_cache, &format.style, sizeof(ta_cache))) {
copy_struct(&ta_cache, &format.style);
struct text_style final_style = format.style;
if (memcmp(&ta_cache, &elformat.style, sizeof(ta_cache))) {
copy_struct(&ta_cache, &elformat.style);
struct text_style final_style = elformat.style;
get_screen_char_template(&schar_cache, html_context->options, final_style);
}
@ -300,7 +297,7 @@ get_format_screen_char(struct html_context *html_context,
schar_cache.attr ^= SCREEN_ATTR_UNSEARCHABLE;
}
if (link_state != LINK_STATE_NONE
&& !format.form
&& !elformat.form
&& html_context->options->underline_links) {
schar_cache.attr |= SCREEN_ATTR_UNDERLINE;
}
@ -326,7 +323,7 @@ draw_frame_hchars(struct part *part, int x, int y, int width,
copy_screen_chars(&POS(x, y), template_, 1);
}
if (par_format.blockquote_level) {
if (par_elformat.blockquote_level) {
draw_blockquote_chars(part, y, html_context);
}
}
@ -335,15 +332,15 @@ void
draw_blockquote_chars(struct part *part, int y, struct html_context *html_context)
{
int i;
int x = par_format.orig_leftmargin;
int x = par_elformat.orig_leftmargin;
struct screen_char *const schar = get_format_screen_char(html_context, 0);
if (LEN(y) + par_format.blockquote_level <= x) {
if (LEN(y) + par_elformat.blockquote_level <= x) {
return;
}
schar->data = '>';
for (i = 1; i < par_format.blockquote_level; i++) {
for (i = 1; i < par_elformat.blockquote_level; i++) {
copy_screen_chars(&POS(x, y), schar, 1);
if (part->char_width) part->char_width[x] = 1;
x++;
@ -382,10 +379,10 @@ expand_lines(struct html_context *html_context, struct part *part,
assert(part && part->document);
if_assert_failed return;
if (!use_document_bg_colors(&part->document->options) && !par_format.blockquote_level)
if (!use_document_bg_colors(&part->document->options) && !par_elformat.blockquote_level)
return;
par_format.color.background = bgcolor;
par_elformat.color.background = bgcolor;
if (x < 0) {
x = 0;
@ -394,7 +391,7 @@ expand_lines(struct html_context *html_context, struct part *part,
for (line = 0; line < lines; line++) {
if (realloc_line(html_context, part->document, Y(y + line), X(x))) return;
if (par_format.blockquote_level) {
if (par_elformat.blockquote_level) {
draw_blockquote_chars(part, y + line, html_context);
}
}
@ -568,7 +565,7 @@ set_hline(struct html_context *html_context, char *chars, int charslen,
return 0;
if (part->begin) {
if (par_format.blockquote_level && !html_context->table_level) {
if (par_elformat.blockquote_level && !html_context->table_level) {
draw_blockquote_chars(part, y, html_context);
}
part->begin = 0;
@ -809,7 +806,7 @@ set_hline(struct html_context *html_context, char *chars, int charslen,
return;
if (part->begin) {
if (par_format.blockquote_level && !html_context->table_level) {
if (par_elformat.blockquote_level && !html_context->table_level) {
draw_blockquote_chars(part, y, html_context);
}
part->begin = 0;
@ -997,7 +994,7 @@ move_chars(struct html_context *html_context, int x, int y, int nx, int ny)
if_assert_failed discard_comb_x_y(part->document);
move_links(html_context, x, y, nx, ny);
if (par_format.blockquote_level && !html_context->table_level) {
if (par_elformat.blockquote_level && !html_context->table_level) {
draw_blockquote_chars(part, ny, html_context);
}
}
@ -1077,7 +1074,7 @@ split_line_at(struct html_context *html_context, int width)
{
struct part *part;
int tmp;
int new_width = width + par_format.rightmargin;
int new_width = width + par_elformat.rightmargin;
assert(html_context);
if_assert_failed return 0;
@ -1097,14 +1094,14 @@ split_line_at(struct html_context *html_context, int width)
#ifdef CONFIG_UTF8
if (html_context->options->utf8
&& width < part->spaces_len && part->char_width[width] == 2) {
move_chars(html_context, width, part->cy, par_format.leftmargin + par_format.blockquote_level * (html_context->table_level == 0), part->cy + 1);
move_chars(html_context, width, part->cy, par_elformat.leftmargin + par_elformat.blockquote_level * (html_context->table_level == 0), part->cy + 1);
del_chars(html_context, width, part->cy);
} else
#endif
{
assertm(POS(width, part->cy).data == ' ',
"bad split: %c", POS(width, part->cy).data);
move_chars(html_context, width + 1, part->cy, par_format.leftmargin + par_format.blockquote_level * (html_context->table_level == 0), part->cy + 1);
move_chars(html_context, width + 1, part->cy, par_elformat.leftmargin + par_elformat.blockquote_level * (html_context->table_level == 0), part->cy + 1);
del_chars(html_context, width, part->cy);
}
}
@ -1132,13 +1129,13 @@ split_line_at(struct html_context *html_context, int width)
memset(part->char_width + tmp, 0, width);
#endif
if (par_format.leftmargin + par_format.blockquote_level * (html_context->table_level == 0) > 0) {
tmp = part->spaces_len - (par_format.leftmargin + par_format.blockquote_level * (html_context->table_level == 0));
assertm(tmp > 0, "part->spaces_len - par_format.leftmargin == %d", tmp);
if (par_elformat.leftmargin + par_elformat.blockquote_level * (html_context->table_level == 0) > 0) {
tmp = part->spaces_len - (par_elformat.leftmargin + par_elformat.blockquote_level * (html_context->table_level == 0));
assertm(tmp > 0, "part->spaces_len - par_elformat.leftmargin == %d", tmp);
/* So tmp is zero, memmove() should survive that. Don't recover. */
memmove(part->spaces + par_format.leftmargin + par_format.blockquote_level * (html_context->table_level == 0), part->spaces, tmp);
memmove(part->spaces + par_elformat.leftmargin + par_elformat.blockquote_level * (html_context->table_level == 0), part->spaces, tmp);
#ifdef CONFIG_UTF8
memmove(part->char_width + par_format.leftmargin + par_format.blockquote_level * (html_context->table_level == 0), part->char_width, tmp);
memmove(part->char_width + par_elformat.leftmargin + par_elformat.blockquote_level * (html_context->table_level == 0), part->char_width, tmp);
#endif
}
@ -1149,7 +1146,7 @@ split_line_at(struct html_context *html_context, int width)
int_lower_bound(&part->box.height, part->cy);
return 2;
} else {
part->cx -= width - (par_format.leftmargin + par_format.blockquote_level * (html_context->table_level == 0));
part->cx -= width - (par_elformat.leftmargin + par_elformat.blockquote_level * (html_context->table_level == 0));
int_lower_bound(&part->box.height, part->cy + 1);
return 1;
}
@ -1179,40 +1176,40 @@ split_line(struct html_context *html_context)
#ifdef CONFIG_UTF8
if (html_context->options->utf8) {
for (x = overlap(par_format); x >= (par_format.leftmargin + par_format.blockquote_level * (html_context->table_level == 0)); x--) {
for (x = overlap(par_elformat); x >= (par_elformat.leftmargin + par_elformat.blockquote_level * (html_context->table_level == 0)); x--) {
if (x < part->spaces_len && (part->spaces[x]
|| (part->char_width[x] == 2
/* Ugly hack. If we haven't place for
* double-width characters we print two
* double-width characters. */
&& x != (par_format.leftmargin + par_format.blockquote_level * (html_context->table_level == 0)))))
&& x != (par_elformat.leftmargin + par_elformat.blockquote_level * (html_context->table_level == 0)))))
return split_line_at(html_context, x);
}
for (x = par_format.leftmargin + par_format.blockquote_level * (html_context->table_level == 0); x < part->cx ; x++) {
for (x = par_elformat.leftmargin + par_elformat.blockquote_level * (html_context->table_level == 0); x < part->cx ; x++) {
if (x < part->spaces_len && (part->spaces[x]
|| (part->char_width[x] == 2
/* We want to break line after _second_
* double-width character. */
&& x > (par_format.leftmargin + par_format.blockquote_level * (html_context->table_level == 0)))))
&& x > (par_elformat.leftmargin + par_elformat.blockquote_level * (html_context->table_level == 0)))))
return split_line_at(html_context, x);
}
} else
#endif
{
for (x = overlap(par_format); x >= (par_format.leftmargin + par_format.blockquote_level * (html_context->table_level == 0)); x--)
for (x = overlap(par_elformat); x >= (par_elformat.leftmargin + par_elformat.blockquote_level * (html_context->table_level == 0)); x--)
if (x < part->spaces_len && part->spaces[x])
return split_line_at(html_context, x);
for (x = par_format.leftmargin + par_format.blockquote_level * (html_context->table_level == 0); x < part->cx ; x++)
for (x = par_elformat.leftmargin + par_elformat.blockquote_level * (html_context->table_level == 0); x < part->cx ; x++)
if (x < part->spaces_len && part->spaces[x])
return split_line_at(html_context, x);
}
/* Make sure that we count the right margin to the total
* actual box width. */
int_lower_bound(&part->box.width, part->cx + par_format.rightmargin);
int_lower_bound(&part->box.width, part->cx + par_elformat.rightmargin);
return 0;
}
@ -1318,10 +1315,10 @@ justify_line(struct html_context *html_context, int y)
/* Diff is the difference between the width of the paragraph
* and the current length of the line. */
diff = overlap(par_format) - len;
diff = overlap(par_elformat) - len;
/* We check diff > 0 because diff can be negative (i.e., we have
* an unbroken line of length > overlap(par_format))
* an unbroken line of length > overlap(par_elformat))
* even when spaces > 1 if the line has only non-breaking spaces. */
if (spaces > 1 && diff > 0) {
int prev_end = 0;
@ -1332,7 +1329,7 @@ justify_line(struct html_context *html_context, int y)
* line unchanged, rather than halfway there. The
* following loop assumes the allocation succeeded. */
if (!realloc_line(html_context, html_context->part->document,
Y(y), X(overlap(par_format))))
Y(y), X(overlap(par_elformat))))
goto out_of_memory;
for (word = 0; word < spaces; word++) {
@ -1418,17 +1415,17 @@ align_line(struct html_context *html_context, int y, int last)
len = LEN(y);
if (!len || par_format.align == ALIGN_LEFT)
if (!len || par_elformat.align == ALIGN_LEFT)
return;
if (par_format.align == ALIGN_JUSTIFY) {
if (par_elformat.align == ALIGN_JUSTIFY) {
if (!last)
justify_line(html_context, y);
return;
}
shift = overlap(par_format) - len;
if (par_format.align == ALIGN_CENTER)
shift = overlap(par_elformat) - len;
if (par_elformat.align == ALIGN_CENTER)
shift /= 2;
if (shift > 0)
shift_chars(html_context, y, shift);
@ -1455,13 +1452,13 @@ init_link_event_hooks(struct html_context *html_context, struct link *link)
} while (0)
init_list(*link->event_hooks);
add_evhook(link->event_hooks, SEVHOOK_ONCLICK, format.onclick);
add_evhook(link->event_hooks, SEVHOOK_ONDBLCLICK, format.ondblclick);
add_evhook(link->event_hooks, SEVHOOK_ONMOUSEOVER, format.onmouseover);
add_evhook(link->event_hooks, SEVHOOK_ONHOVER, format.onhover);
add_evhook(link->event_hooks, SEVHOOK_ONFOCUS, format.onfocus);
add_evhook(link->event_hooks, SEVHOOK_ONMOUSEOUT, format.onmouseout);
add_evhook(link->event_hooks, SEVHOOK_ONBLUR, format.onblur);
add_evhook(link->event_hooks, SEVHOOK_ONCLICK, elformat.onclick);
add_evhook(link->event_hooks, SEVHOOK_ONDBLCLICK, elformat.ondblclick);
add_evhook(link->event_hooks, SEVHOOK_ONMOUSEOVER, elformat.onmouseover);
add_evhook(link->event_hooks, SEVHOOK_ONHOVER, elformat.onhover);
add_evhook(link->event_hooks, SEVHOOK_ONFOCUS, elformat.onfocus);
add_evhook(link->event_hooks, SEVHOOK_ONMOUSEOUT, elformat.onmouseout);
add_evhook(link->event_hooks, SEVHOOK_ONBLUR, elformat.onblur);
#undef add_evhook
}
@ -1494,30 +1491,30 @@ new_link(struct html_context *html_context, char *name, int namelen)
link = &document->links[document->nlinks++];
link->number = link_number - 1;
if (document->options.use_tabindex) link->number += format.tabindex;
link->accesskey = format.accesskey;
link->title = null_or_stracpy(format.title);
link->where_img = null_or_stracpy(format.image);
if (document->options.use_tabindex) link->number += elformat.tabindex;
link->accesskey = elformat.accesskey;
link->title = null_or_stracpy(elformat.title);
link->where_img = null_or_stracpy(elformat.image);
if (!format.form) {
link->target = null_or_stracpy(format.target);
if (!elformat.form) {
link->target = null_or_stracpy(elformat.target);
link->data.name = memacpy(name, namelen);
/* if (strlen(url) > 4 && !c_strncasecmp(url, "MAP@", 4)) { */
if (format.link
&& ((format.link[0]|32) == 'm')
&& ((format.link[1]|32) == 'a')
&& ((format.link[2]|32) == 'p')
&& (format.link[3] == '@')
&& format.link[4]) {
if (elformat.link
&& ((elformat.link[0]|32) == 'm')
&& ((elformat.link[1]|32) == 'a')
&& ((elformat.link[2]|32) == 'p')
&& (elformat.link[3] == '@')
&& elformat.link[4]) {
link->type = LINK_MAP;
link->where = stracpy(format.link + 4);
link->where = stracpy(elformat.link + 4);
} else {
link->type = LINK_HYPERTEXT;
link->where = null_or_stracpy(format.link);
link->where = null_or_stracpy(elformat.link);
}
} else {
struct el_form_control *fc = format.form;
struct el_form_control *fc = elformat.form;
struct form *form;
switch (fc->type) {
@ -1544,7 +1541,7 @@ new_link(struct html_context *html_context, char *name, int namelen)
link->type = LINK_BUTTON;
}
link->data.form_control = fc;
/* At this point, format.form might already be set but
/* At this point, elformat.form might already be set but
* the form_control not registered through SP_CONTROL
* yet, therefore without fc->form set. It is always
* after the "good" last form was already processed,
@ -1555,10 +1552,10 @@ new_link(struct html_context *html_context, char *name, int namelen)
link->target = null_or_stracpy(form ? form->target : NULL);
}
link->color.background = format.style.color.background;
link->color.background = elformat.style.color.background;
link->color.foreground = link_is_textinput(link)
? format.style.color.foreground
: format.color.clink;
? elformat.style.color.foreground
: elformat.color.clink;
init_link_event_hooks(html_context, link);
@ -1589,7 +1586,7 @@ html_special_tag(struct document *document, char *t, int x, int y)
}
static void
void
put_chars_conv(struct html_context *html_context,
char *chars, int charslen)
{
@ -1599,14 +1596,14 @@ put_chars_conv(struct html_context *html_context,
assert(html_context->part && chars && charslen);
if_assert_failed return;
if (format.style.attr & AT_GRAPHICS) {
if (elformat.style.attr & AT_GRAPHICS) {
put_chars(html_context, chars, charslen);
return;
}
convert_string(renderer_context.convert_table, chars, charslen,
html_context->options->cp,
(format.style.attr & AT_NO_ENTITIES) ? CSM_NONE : CSM_DEFAULT,
(elformat.style.attr & AT_NO_ENTITIES) ? CSM_NONE : CSM_DEFAULT,
NULL, (void (*)(void *, char *, int)) put_chars, html_context);
}
@ -1658,19 +1655,19 @@ put_link_number(struct html_context *html_context)
char *symkey = get_opt_str("document.browse.links.label_key", NULL);
struct part *part = html_context->part;
char s[64];
char *fl = format.link;
char *ft = format.target;
char *fi = format.image;
struct text_style old_style = format.style;
struct el_form_control *ff = format.form;
char *fl = elformat.link;
char *ft = elformat.target;
char *fi = elformat.image;
struct text_style old_style = elformat.style;
struct el_form_control *ff = elformat.form;
int slen = 0;
int base = strlen(symkey);
format.link = format.target = format.image = NULL;
format.form = NULL;
elformat.link = elformat.target = elformat.image = NULL;
elformat.form = NULL;
if (html_context->options->use_link_number_color) {
format.style.attr &= ~AT_BOLD;
format.style.color.foreground = format.color.link_number;
elformat.style.attr &= ~AT_BOLD;
elformat.style.color.foreground = elformat.color.link_number;
}
s[slen++] = '[';
@ -1687,15 +1684,15 @@ put_link_number(struct html_context *html_context)
/* We might have ended up on a new line after the line breaking
* or putting the link number chars. */
if (part->cx == -1) {
part->cx = par_format.leftmargin + par_format.blockquote_level * (html_context->table_level == 0);
part->cx = par_elformat.leftmargin + par_elformat.blockquote_level * (html_context->table_level == 0);
part->begin = 1;
}
format.link = fl;
format.target = ft;
format.image = fi;
format.form = ff;
format.style = old_style;
elformat.link = fl;
elformat.target = ft;
elformat.image = fi;
elformat.form = ff;
elformat.style = old_style;
}
#define assert_link_variable(old, new) \
@ -1775,8 +1772,8 @@ process_link(struct html_context *html_context, enum link_state link_state,
case LINK_STATE_NEW:
part->link_num++;
init_link_state_info(format.link, format.target,
format.image, format.form);
init_link_state_info(elformat.link, elformat.target,
elformat.image, elformat.form);
if (!part->document) return;
/* Trim leading space from the link text */
@ -1834,16 +1831,16 @@ get_link_state(struct html_context *html_context)
{
enum link_state state;
if (!(format.link || format.image || format.form)) {
if (!(elformat.link || elformat.image || elformat.form)) {
state = LINK_STATE_NONE;
} else if ((renderer_context.link_state_info.link
|| renderer_context.link_state_info.image
|| renderer_context.link_state_info.form)
&& !xstrcmp(format.link, renderer_context.link_state_info.link)
&& !xstrcmp(format.target, renderer_context.link_state_info.target)
&& !xstrcmp(format.image, renderer_context.link_state_info.image)
&& format.form == renderer_context.link_state_info.form) {
&& !xstrcmp(elformat.link, renderer_context.link_state_info.link)
&& !xstrcmp(elformat.target, renderer_context.link_state_info.target)
&& !xstrcmp(elformat.image, renderer_context.link_state_info.image)
&& elformat.form == renderer_context.link_state_info.form) {
return LINK_STATE_SAME;
@ -1902,7 +1899,7 @@ put_chars(struct html_context *html_context, char *chars, int charslen)
if (charslen < 1) return;
}
part->cx = par_format.leftmargin + (par_format.blockquote_level * (html_context->table_level == 0));
part->cx = par_elformat.leftmargin + (par_elformat.blockquote_level * (html_context->table_level == 0));
part->begin = 1;
}
@ -1951,13 +1948,13 @@ put_chars(struct html_context *html_context, char *chars, int charslen)
#ifdef CONFIG_UTF8
if (renderer_context.nowrap
&& part->cx + cells > overlap(par_format))
&& part->cx + cells > overlap(par_elformat))
return;
part->cx += cells;
#else
if (renderer_context.nowrap
&& part->cx + charslen > overlap(par_format))
&& part->cx + charslen > overlap(par_elformat))
return;
part->cx += charslen;
@ -1966,8 +1963,8 @@ put_chars(struct html_context *html_context, char *chars, int charslen)
renderer_context.nobreak = 0;
if (html_context->options->wrap || !html_is_preformatted()) {
while (part->cx > overlap(par_format)
&& part->cx > (par_format.leftmargin + par_format.blockquote_level * (html_context->table_level == 0))) {
while (part->cx > overlap(par_elformat)
&& part->cx > (par_elformat.leftmargin + par_elformat.blockquote_level * (html_context->table_level == 0))) {
int x = split_line(html_context);
if (!x) break;
@ -1984,14 +1981,14 @@ put_chars(struct html_context *html_context, char *chars, int charslen)
part->xa += charslen;
#endif /* CONFIG_UTF8 */
int_lower_bound(&part->max_width, part->xa
+ par_format.leftmargin + par_format.blockquote_level * (html_context->table_level == 0) + par_format.rightmargin
+ par_elformat.leftmargin + par_elformat.blockquote_level * (html_context->table_level == 0) + par_elformat.rightmargin
- (chars[charslen - 1] == ' '
&& (html_context->options->wrap || !html_is_preformatted())));
}
#undef overlap
static void
void
line_break(struct html_context *html_context)
{
struct part *part;
@ -2005,7 +2002,7 @@ line_break(struct html_context *html_context)
assert(part);
if_assert_failed return;
int_lower_bound(&part->box.width, part->cx + par_format.rightmargin);
int_lower_bound(&part->box.width, part->cx + par_elformat.rightmargin);
if (renderer_context.nobreak) {
renderer_context.nobreak = 0;
@ -2019,7 +2016,7 @@ line_break(struct html_context *html_context)
if (!realloc_lines(part->document, part->box.height + part->cy + 1))
return;
if (part->cx > (par_format.leftmargin + par_format.blockquote_level * (html_context->table_level == 0)) && LEN(part->cy) > part->cx - 1
if (part->cx > (par_elformat.leftmargin + par_elformat.blockquote_level * (html_context->table_level == 0)) && LEN(part->cy) > part->cx - 1
&& POS(part->cx - 1, part->cy).data == ' ') {
del_chars(html_context, part->cx - 1, part->cy);
part->cx--;
@ -2243,7 +2240,7 @@ static inline void
color_link_lines(struct html_context *html_context)
{
struct document *document = html_context->part->document;
struct color_pair colors = INIT_COLOR_PAIR(par_format.color.background, 0x0);
struct color_pair colors = INIT_COLOR_PAIR(par_elformat.color.background, 0x0);
enum color_mode color_mode = document->options.color_mode;
enum color_flags color_flags = document->options.color_flags;
int y;
@ -2259,14 +2256,14 @@ color_link_lines(struct html_context *html_context)
/* XXX: Entering hack zone! Change to clink color after
* link text has been recolored. */
if (schar->data == ':' && colors.foreground == 0x0)
colors.foreground = format.color.clink;
colors.foreground = elformat.color.clink;
}
colors.foreground = 0x0;
}
}
static void *
void *
html_special(struct html_context *html_context, enum html_special_type c, ...)
{
va_list l;
@ -2613,8 +2610,8 @@ render_html_document(struct cache_entry *cached, struct document *document,
}
done_string(&title);
part = format_html_part(html_context, start, end, par_format.align,
par_format.leftmargin + par_format.blockquote_level * (html_context->table_level == 0),
part = format_html_part(html_context, start, end, par_elformat.align,
par_elformat.leftmargin + par_elformat.blockquote_level * (html_context->table_level == 0),
document->options.document_width, document,
0, 0, head.source, 1);
@ -2642,7 +2639,7 @@ render_html_document(struct cache_entry *cached, struct document *document,
>= document->options.width));
#endif
document->color.background = par_format.color.background;
document->color.background = par_elformat.color.background;
done_html_parser(html_context);

View File

@ -77,6 +77,12 @@ struct part *format_html_part(struct html_context *html_context, char *, char *,
int dec2qwerty(int num, char *link_sym, const char *key, int base);
int qwerty2dec(const char *link_sym, const char *key, int base);
void put_chars_conv(struct html_context *html_context, char *chars, int charslen);
void line_break(struct html_context *html_context);
void *html_special(struct html_context *html_context, enum html_special_type c, ...);
#ifdef __cplusplus
}
#endif

View File

@ -52,22 +52,22 @@ get_table_frames(struct table *table, struct table_frames *result)
static int
get_table_indent(struct html_context *html_context, struct table *table)
{
int width = par_format.width - table->real_width;
int width = par_elformat.width - table->real_width;
int indent;
switch (table->align) {
case ALIGN_CENTER:
indent = /*par_format.blockquote_level +*/ (width + par_format.leftmargin - par_format.rightmargin) / 2;
indent = /*par_elformat.blockquote_level +*/ (width + par_elformat.leftmargin - par_elformat.rightmargin) / 2;
break;
case ALIGN_RIGHT:
indent = width - par_format.rightmargin;
indent = width - par_elformat.rightmargin;
break;
case ALIGN_LEFT:
case ALIGN_JUSTIFY:
default:
indent = par_format.leftmargin + par_format.blockquote_level;
indent = par_elformat.leftmargin + par_elformat.blockquote_level;
}
/* Don't use int_bounds(&x, 0, width) here,
@ -538,7 +538,7 @@ get_table_cellpadding(struct html_context *html_context, struct table *table)
{
struct part *part = table->part;
int cpd_pass = 0, cpd_width = 0, cpd_last = table->cellpadding;
int margins = /*par_format.blockquote_level +*/ par_format.leftmargin + par_format.rightmargin;
int margins = /*par_elformat.blockquote_level +*/ par_elformat.leftmargin + par_elformat.rightmargin;
again:
get_cell_widths(html_context, table);
@ -870,10 +870,10 @@ draw_table_cell(struct table *table, int col, int row, int x, int y,
state = init_html_parser_state(html_context, ELEMENT_DONT_KILL,
cell->align, 0, 0);
if (cell->is_header) format.style.attr |= AT_BOLD;
if (cell->is_header) elformat.style.attr |= AT_BOLD;
format.style.color.background = cell->bgcolor;
par_format.color.background = cell->bgcolor;
elformat.style.color.background = cell->bgcolor;
par_elformat.color.background = cell->bgcolor;
if (cell->valign == VALIGN_MIDDLE)
tmpy += (height - cell->height) / 2;
@ -908,7 +908,7 @@ draw_table_cells(struct table *table, int x, int y,
{
int col, row;
int xp;
color_T bgcolor = par_format.color.background;
color_T bgcolor = par_elformat.color.background;
struct table_frames table_frames;
get_table_frames(table, &table_frames);
@ -1033,7 +1033,7 @@ draw_frame_point(struct table *table, signed char *frame[2], int x, int y,
+ 27 * int_max(bottom, 0);
draw_frame_hchars(table->part, x, y, 1, border_chars[pos],
par_format.color.background, table->color.border,
par_elformat.color.background, table->color.border,
html_context);
}
@ -1050,7 +1050,7 @@ draw_frame_hline(struct table *table, signed char *frame[2], int x, int y,
if (pos < 0 || table->cols_widths[col] <= 0) return;
draw_frame_hchars(table->part, x, y, table->cols_widths[col], hltable[pos],
par_format.color.background, table->color.border, html_context);
par_elformat.color.background, table->color.border, html_context);
}
static inline void
@ -1066,7 +1066,7 @@ draw_frame_vline(struct table *table, signed char *frame[2], int x, int y,
if (pos < 0 || table->rows_heights[row] <= 0) return;
draw_frame_vchars(table->part, x, y, table->rows_heights[row], vltable[pos],
par_format.color.background, table->color.border, html_context);
par_elformat.color.background, table->color.border, html_context);
}
static inline int
@ -1226,7 +1226,7 @@ draw_table_caption(struct html_context *html_context, struct table *table,
if (!part) return;
if (par_format.blockquote_level) {
if (par_elformat.blockquote_level) {
int yy;
for (yy = 0; yy < part->box.height; yy++) {
@ -1304,7 +1304,7 @@ format_table(char *attr, char *html, char *eof,
state = init_html_parser_state(html_context, ELEMENT_DONT_KILL,
ALIGN_LEFT, 0, 0);
margins = /*par_format.blockquote_level + */par_format.leftmargin + par_format.rightmargin;
margins = /*par_elformat.blockquote_level + */par_elformat.leftmargin + par_elformat.rightmargin;
if (get_table_cellpadding(html_context, table)) goto ret2;
distribute_table_widths(table);
@ -1312,7 +1312,7 @@ format_table(char *attr, char *html, char *eof,
if (!part->document && part->box.x == 1) {
int total_width = table->real_width + margins;
int_bounds(&total_width, table->real_width, par_format.width);
int_bounds(&total_width, table->real_width, par_elformat.width);
int_lower_bound(&part->box.width, total_width);
part->cy += table->real_height;

View File

@ -21,6 +21,7 @@
#include "document/plain/renderer.h"
#ifdef CONFIG_XML
#include "document/xml/renderer.h"
#include "document/xml/renderer2.h"
#endif
#include "document/renderer.h"
#include "document/view.h"
@ -280,7 +281,12 @@ render_encoded_document(struct cache_entry *cached, struct document *document)
render_dom_document(cached, document, &buffer);
else
#endif
render_html_document(cached, document, &buffer);
#ifdef CONFIG_XML
if (document->dom)
render_xhtml_document(cached, document, &buffer);
else
#endif
render_html_document(cached, document, &buffer);
}
if (encoding != ENCODING_NONE) {

View File

@ -0,0 +1,364 @@
/* Plain text document renderer */
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include "elinks.h"
#include "bookmarks/bookmarks.h"
#include "cache/cache.h"
#include "config/options.h"
#include "document/docdata.h"
#include "document/document.h"
#include "document/format.h"
#include "document/options.h"
#include "document/html/internal.h"
#include "document/html/parser.h"
#include "document/html/parser/parse.h"
#include "document/plain/renderer.h"
#include "document/renderer.h"
#include "document/xml/renderer2.h"
#include "document/xml/tags.h"
#include "globhist/globhist.h"
#include "intl/charsets.h"
#include "protocol/protocol.h"
#include "protocol/uri.h"
#include "terminal/color.h"
#include "terminal/draw.h"
#include "util/color.h"
#include "util/error.h"
#include "util/memory.h"
#include "util/string.h"
#include <libxml++/libxml++.h>
static void
dump_text(struct source_renderer *renderer, unsigned char *html, int length)
{
struct html_context *html_context = renderer->html_context;
unsigned char *eof = html + length;
unsigned char *base_pos = html;
if (length > 0 && (eof[-1] == '\n')) {
length--;
eof--;
}
#ifdef CONFIG_CSS
if (html_context->was_style) {
/// css_parse_stylesheet(&html_context->css_styles, html_context->base_href, html, eof);
return;
}
#endif
//fprintf(stderr, "html='%s'\n", html);
if (length <= 0) {
return;
}
int noupdate = 0;
main_loop:
if (!html_is_preformatted()) {
unsigned char *buffer = fmem_alloc(length+1);
unsigned char *dst;
html_context->part = renderer->part;
html_context->eoff = eof;
if (!buffer) {
return;
}
dst = buffer;
*dst = *html;
for (html++; html <= eof; html++) {
if (isspace(*html)) {
if (*dst != ' ') {
*(++dst) = ' ';
}
} else {
*(++dst) = *html;
}
}
if (dst - buffer > 1) {
if (*buffer == ' ') {
html_context->putsp = HTML_SPACE_ADD;
}
}
put_chrs(html_context, buffer, dst - buffer);
fmem_free(buffer);
}
while (html < eof) {
int dotcounter = 0;
if (!noupdate) {
html_context->part = renderer->part;
html_context->eoff = eof;
base_pos = html;
} else {
noupdate = 0;
}
if (html_is_preformatted()) {
html_context->putsp = HTML_SPACE_NORMAL;
if (*html == ASCII_TAB) {
put_chrs(html_context, base_pos, html - base_pos);
put_chrs(html_context, " ",
8 - (html_context->position % 8));
html++;
continue;
} else if (*html == ASCII_CR || *html == ASCII_LF) {
put_chrs(html_context, base_pos, html - base_pos);
if (html - base_pos == 0 && html_context->line_breax > 0) {
html_context->line_breax--;
}
next_break:
if (*html == ASCII_CR && html < eof - 1 && html[1] == ASCII_LF) {
html++;
}
ln_break(html_context, 1);
html++;
if (*html == ASCII_CR || *html == ASCII_LF) {
html_context->line_breax = 0;
goto next_break;
}
continue;
} else if (html + 5 < eof && *html == '&') {
/* Really nasty hack to make &#13; handling in
* <pre>-tags lynx-compatible. It works around
* the entity handling done in the renderer,
* since checking #13 value there would require
* something along the lines of NBSP_CHAR or
* checking for '\n's in AT_PREFORMATTED text. */
/* See bug 52 and 387 for more info. */
int length = html - base_pos;
int newlines;
html = (unsigned char *) count_newline_entities(html, eof, &newlines);
if (newlines) {
put_chrs(html_context, base_pos, length);
ln_break(html_context, newlines);
continue;
}
}
}
while (*html < ' ') {
if (html - base_pos) {
put_chrs(html_context, base_pos, html - base_pos);
}
dotcounter++;
base_pos = ++html;
if (*html >= ' ' || isspace(*html) || html >= eof) {
unsigned char *dots = fmem_alloc(dotcounter);
if (dots) {
memset(dots, '.', dotcounter);
put_chrs(html_context, dots, dotcounter);
fmem_free(dots);
}
goto main_loop;
}
}
}
}
#define HTML_MAX_DOM_STRUCTURE_DEPTH 1024
static bool
dump_dom_structure(struct source_renderer *renderer, xmlpp::Node *node, int depth)
{
if (depth >= HTML_MAX_DOM_STRUCTURE_DEPTH) {
return false;
}
std::string tag_name = node->get_name();
struct element_info2 *ei = get_tag_value(tag_name.c_str(), tag_name.size());
/* Print this node's entry */
if (ei) {
ei->open(renderer, node, NULL, NULL, NULL, NULL);
}
/* Get the node's first child */
auto children = node->get_children();
auto it = children.begin();
auto end = children.end();
for (;it != end; ++it) {
xmlpp::Element *el = dynamic_cast<xmlpp::Element *>(*it);
if (el) {
dump_dom_structure(renderer, el, depth + 1);
} else {
xmlpp::TextNode *text = dynamic_cast<xmlpp::TextNode *>(*it);
if (text) {
std::string v = text->get_content();
dump_text(renderer, v.c_str(), v.size());
}
}
}
if (ei && ei->close) {
ei->close(renderer, node, NULL, NULL, NULL, NULL);
}
return true;
}
void
render_xhtml_document(struct cache_entry *cached, struct document *document, struct string *buffer)
{
struct html_context *html_context;
struct part *part = NULL;
char *start;
char *end;
struct string title;
struct string head;
struct source_renderer renderer;
assert(cached && document);
if_assert_failed return;
if (!init_string(&head)) return;
if (cached->head) add_to_string(&head, cached->head);
start = buffer->source;
end = buffer->source + buffer->length;
html_context = init_html_parser(cached->uri, &document->options,
start, end, &head, &title,
put_chars_conv, line_break,
html_special);
if (!html_context) return;
/// renderer_context.g_ctrl_num = 0;
/// renderer_context.cached = cached;
/// renderer_context.convert_table = get_convert_table(head.source,
/// document->options.cp,
/// document->options.assume_cp,
/// &document->cp,
/// &document->cp_status,
/// document->options.hard_assume);
struct conv_table *convert_table = get_convert_table(head.source,
document->options.cp,
document->options.assume_cp,
&document->cp,
&document->cp_status,
document->options.hard_assume);;
#ifdef CONFIG_UTF8
html_context->options->utf8 = is_cp_utf8(document->options.cp);
#endif /* CONFIG_UTF8 */
html_context->doc_cp = document->cp;
if (title.length) {
/* CSM_DEFAULT because init_html_parser() did not
* decode entities in the title. */
document->title = convert_string(convert_table,
title.source, title.length,
document->options.cp,
CSM_DEFAULT, NULL, NULL, NULL);
}
done_string(&title);
xmlpp::Document *doc = document->dom;
xmlpp::Element *root = doc->get_root_node();
renderer.html_context = html_context;
html_context->putsp = HTML_SPACE_SUPPRESS;
html_context->line_breax = html_context->table_level ? 2 : 1;
html_context->position = 0;
html_context->was_br = 0;
html_context->was_li = 0;
html_context->was_body = 0;
/* html_context->was_body_background = 0; */
renderer.part = html_context->part = part;
/// html_context->eoff = eof;
dump_dom_structure(&renderer, root, 0);
/// part = format_html_part(html_context, start, end, par_format.align,
/// par_format.leftmargin + par_format.blockquote_level * (html_context->table_level == 0),
/// document->options.document_width, document,
/// 0, 0, head.source, 1);
/* Drop empty allocated lines at end of document if any
* and adjust document height. */
while (document->height && !document->data[document->height - 1].length)
mem_free_if(document->data[--document->height].chars);
/* Calculate document width. */
{
int i;
document->width = 0;
for (i = 0; i < document->height; i++)
int_lower_bound(&document->width, document->data[i].length);
}
#if 1
document->options.needs_width = 1;
#else
/* FIXME: This needs more tuning since if we are centering stuff it
* does not work. */
document->options.needs_width =
(document->width + (document->options.margin
>= document->options.width));
#endif
document->color.background = par_elformat.color.background;
done_html_parser(html_context);
/* Drop forms which has been serving as a placeholder for form items
* added in the wrong order due to the ordering of table rendering. */
{
struct form *form;
foreach (form, document->forms) {
if (form->form_num)
continue;
if (list_empty(form->items))
done_form(form);
break;
}
}
/* @part was residing in html_context so it has to stay alive until
* done_html_parser(). */
done_string(&head);
mem_free_if(part);
#if 0 /* debug purpose */
{
FILE *f = fopen("forms", "ab");
struct el_form_control *form;
char *qq;
fprintf(f,"FORM:\n");
foreach (form, document->forms) {
fprintf(f, "g=%d f=%d c=%d t:%d\n",
form->g_ctrl_num, form->form_num,
form->ctrl_num, form->type);
}
fprintf(f,"fragment: \n");
for (qq = start; qq < end; qq++) fprintf(f, "%c", *qq);
fprintf(f,"----------\n\n");
fclose(f);
}
#endif
}

View File

@ -0,0 +1,19 @@
#ifndef EL__DOCUMENT_XML_RENDERER2_H
#define EL__DOCUMENT_XML_RENDERER2_H
#ifdef __cplusplus
extern "C" {
#endif
struct cache_entry;
struct document;
struct string;
void render_xhtml_document(struct cache_entry *cached, struct document *document, struct string *buffer);
#ifdef __cplusplus
}
#endif
#endif

File diff suppressed because it is too large Load Diff