Commit 6a032f36 authored by Tatsuya Kinoshita's avatar Tatsuya Kinoshita

Support the button element as defined in HTML 4.01

Patch from upstream, [w3m-dev 04411] on 2010-09-17, to support the
button element.  It is discussed upstream and incomplete, but enough
to login Launchpad.
parent 5397d09e
......@@ -2469,6 +2469,7 @@ set_breakpoint(struct readbuffer *obuf, int tag_length)
bcopy((void *)&obuf->anchor, (void *)&obuf->bp.anchor,
sizeof(obuf->anchor));
obuf->bp.img_alt = obuf->img_alt;
obuf->bp.input_alt = obuf->input_alt;
obuf->bp.in_bold = obuf->in_bold;
obuf->bp.in_italic = obuf->in_italic;
obuf->bp.in_under = obuf->in_under;
......@@ -2486,6 +2487,7 @@ back_to_breakpoint(struct readbuffer *obuf)
bcopy((void *)&obuf->bp.anchor, (void *)&obuf->anchor,
sizeof(obuf->anchor));
obuf->img_alt = obuf->bp.img_alt;
obuf->input_alt = obuf->bp.input_alt;
obuf->in_bold = obuf->bp.in_bold;
obuf->in_italic = obuf->bp.in_italic;
obuf->in_under = obuf->bp.in_under;
......@@ -2729,7 +2731,7 @@ flushline(struct html_feed_environ *h_env, struct readbuffer *obuf, int indent,
Str line = obuf->line, pass = NULL;
char *hidden_anchor = NULL, *hidden_img = NULL, *hidden_bold = NULL,
*hidden_under = NULL, *hidden_italic = NULL, *hidden_strike = NULL,
*hidden_ins = NULL, *hidden = NULL;
*hidden_ins = NULL, *hidden_input, *hidden = NULL;
#ifdef DEBUG
if (w3m_debug) {
......@@ -2761,6 +2763,12 @@ flushline(struct html_feed_environ *h_env, struct readbuffer *obuf, int indent,
hidden = hidden_img;
}
}
if (obuf->input_alt.in) {
if ((hidden_input = has_hidden_link(obuf, HTML_INPUT_ALT)) != NULL) {
if (!hidden || hidden_input < hidden)
hidden = hidden_input;
}
}
if (obuf->in_bold) {
if ((hidden_bold = has_hidden_link(obuf, HTML_B)) != NULL) {
if (!hidden || hidden_bold < hidden)
......@@ -2812,6 +2820,8 @@ flushline(struct html_feed_environ *h_env, struct readbuffer *obuf, int indent,
Strcat_charp(line, "</a>");
if (obuf->img_alt && !hidden_img)
Strcat_charp(line, "</img_alt>");
if (obuf->input_alt.in && !hidden_input)
Strcat_charp(line, "</input_alt>");
if (obuf->in_bold && !hidden_bold)
Strcat_charp(line, "</b>");
if (obuf->in_italic && !hidden_italic)
......@@ -3022,6 +3032,18 @@ flushline(struct html_feed_environ *h_env, struct readbuffer *obuf, int indent,
Strcat_charp(tmp, "\">");
push_tag(obuf, tmp->ptr, HTML_IMG_ALT);
}
if (!hidden_input && obuf->input_alt.in) {
Str tmp;
if (obuf->input_alt.hseq > 0)
obuf->input_alt.hseq = - obuf->input_alt.hseq;
tmp = Sprintf("<INPUT_ALT hseq=\"%d\" fid=\"%d\" name=\"%s\" type=\"%s\" value=\"%s\">",
obuf->input_alt.hseq,
obuf->input_alt.fid,
obuf->input_alt.name->ptr,
obuf->input_alt.type->ptr,
obuf->input_alt.value->ptr);
push_tag(obuf, tmp->ptr, HTML_INPUT_ALT);
}
if (!hidden_bold && obuf->in_bold)
push_tag(obuf, "<B>", HTML_B);
if (!hidden_italic && obuf->in_italic)
......@@ -3731,6 +3753,63 @@ process_input(struct parsed_tag *tag)
return tmp;
}
Str
process_button(struct parsed_tag *tag)
{
Str tmp = NULL;
char *p, *q, *r, *qq = NULL;
int qlen, v;
if (cur_form_id < 0) {
char *s = "<form_int method=internal action=none>";
tmp = process_form(parse_tag(&s, TRUE));
}
if (tmp == NULL)
tmp = Strnew();
p = "submit";
parsedtag_get_value(tag, ATTR_TYPE, &p);
q = NULL;
parsedtag_get_value(tag, ATTR_VALUE, &q);
r = "";
parsedtag_get_value(tag, ATTR_NAME, &r);
v = formtype(p);
if (v == FORM_UNKNOWN)
return NULL;
if (!q) {
switch (v) {
case FORM_INPUT_SUBMIT:
case FORM_INPUT_BUTTON:
q = "SUBMIT";
break;
case FORM_INPUT_RESET:
q = "RESET";
break;
}
}
if (q) {
qq = html_quote(q);
qlen = strlen(q);
}
// Strcat_charp(tmp, "<pre_int>");
Strcat(tmp, Sprintf("<input_alt hseq=\"%d\" fid=\"%d\" type=%s "
"name=\"%s\" value=\"%s\">",
cur_hseq++, cur_form_id, p, html_quote(r), qq));
return tmp;
}
Str
process_n_button(void)
{
Str tmp = Strnew();
Strcat_charp(tmp, "</input_alt>");
// Strcat_charp(tmp, "</pre_int>");
return tmp;
}
Str
process_select(struct parsed_tag *tag)
{
......@@ -4861,7 +4940,35 @@ HTMLtagproc1(struct parsed_tag *tag, struct html_feed_environ *h_env)
if (i > obuf->bottom_margin)
obuf->bottom_margin = i;
}
if (parsedtag_get_value(tag, ATTR_HSEQ, &hseq)) {
obuf->input_alt.hseq = hseq;
}
if (parsedtag_get_value(tag, ATTR_FID, &i)) {
obuf->input_alt.fid = i;
}
if (parsedtag_get_value(tag, ATTR_TYPE, &p)) {
obuf->input_alt.type = Strnew_charp(p);
}
if (parsedtag_get_value(tag, ATTR_VALUE, &p)) {
obuf->input_alt.value = Strnew_charp(p);
}
if (parsedtag_get_value(tag, ATTR_NAME, &p)) {
obuf->input_alt.name = Strnew_charp(p);
}
obuf->input_alt.in = 1;
return 0;
case HTML_N_INPUT_ALT:
if (obuf->input_alt.in) {
if (!close_effect0(obuf, HTML_INPUT_ALT))
push_tag(obuf, "</input_alt>", HTML_N_INPUT_ALT);
obuf->input_alt.hseq = 0;
obuf->input_alt.fid = -1;
obuf->input_alt.in = 0;
obuf->input_alt.type = NULL;
obuf->input_alt.name = NULL;
obuf->input_alt.value = NULL;
}
return 1;
case HTML_TABLE:
close_anchor(h_env, obuf);
obuf->table_level++;
......@@ -4970,6 +5077,16 @@ HTMLtagproc1(struct parsed_tag *tag, struct html_feed_environ *h_env)
case HTML_INPUT:
close_anchor(h_env, obuf);
tmp = process_input(tag);
if (tmp)
HTMLlineproc1(tmp->ptr, h_env);
return 1;
case HTML_BUTTON:
tmp = process_button(tag);
if (tmp)
HTMLlineproc1(tmp->ptr, h_env);
return 1;
case HTML_N_BUTTON:
tmp = process_n_button();
if (tmp)
HTMLlineproc1(tmp->ptr, h_env);
return 1;
......@@ -5682,6 +5799,21 @@ HTMLlineproc2body(Buffer *buf, Str (*feed) (), int llimit)
putHmarker(buf->hmarklist, currentLn(buf),
hpos, hseq - 1);
}
else if (hseq < 0) {
int h = -hseq - 1;
int hpos = pos;
if (*str == '[')
hpos++;
if (buf->hmarklist &&
h < buf->hmarklist->nmark &&
buf->hmarklist->marks[h].invalid) {
buf->hmarklist->marks[h].pos = hpos;
buf->hmarklist->marks[h].line = currentLn(buf);
buf->hmarklist->marks[h].invalid = 0;
hseq = -hseq;
}
}
if (!form->target)
form->target = buf->baseTarget;
if (a_textarea &&
......@@ -6749,6 +6881,12 @@ init_henv(struct html_feed_environ *h_env, struct readbuffer *obuf,
obuf->nobr_level = 0;
bzero((void *)&obuf->anchor, sizeof(obuf->anchor));
obuf->img_alt = 0;
obuf->input_alt.hseq = 0;
obuf->input_alt.fid = -1;
obuf->input_alt.in = 0;
obuf->input_alt.type = NULL;
obuf->input_alt.name = NULL;
obuf->input_alt.value = NULL;
obuf->in_bold = 0;
obuf->in_italic = 0;
obuf->in_under = 0;
......@@ -6784,6 +6922,15 @@ completeHTMLstream(struct html_feed_environ *h_env, struct readbuffer *obuf)
push_tag(obuf, "</img_alt>", HTML_N_IMG_ALT);
obuf->img_alt = NULL;
}
if (obuf->input_alt.in) {
push_tag(obuf, "</input_alt>", HTML_N_INPUT_ALT);
obuf->input_alt.hseq = 0;
obuf->input_alt.fid = -1;
obuf->input_alt.in = 0;
obuf->input_alt.type = NULL;
obuf->input_alt.name = NULL;
obuf->input_alt.value = NULL;
}
if (obuf->in_bold) {
push_tag(obuf, "</b>", HTML_N_B);
obuf->in_bold = 0;
......
......@@ -562,6 +562,13 @@ typedef struct _DownloadList {
#define INIT_BUFFER_WIDTH ((_INIT_BUFFER_WIDTH > 0) ? _INIT_BUFFER_WIDTH : 0)
#define FOLD_BUFFER_WIDTH (FoldLine ? (INIT_BUFFER_WIDTH + 1) : -1)
struct input_alt_attr {
int hseq;
int fid;
int in;
Str type, name, value;
};
typedef struct {
int pos;
int len;
......@@ -569,6 +576,7 @@ typedef struct {
long flag;
Anchor anchor;
Str img_alt;
struct input_alt_attr input_alt;
char fontstat[FONTSTAT_SIZE];
short nobr_level;
Lineprop prev_ctype;
......@@ -591,6 +599,7 @@ struct readbuffer {
short nobr_level;
Anchor anchor;
Str img_alt;
struct input_alt_attr input_alt;
char fontstat[FONTSTAT_SIZE];
char fontstat_stack[FONT_STACK_SIZE][FONTSTAT_SIZE];
int fontstat_sp;
......
......@@ -56,6 +56,9 @@ unsigned char ALST_INPUT[] =
ATTR_CORE
};
#define MAXA_INPUT MAXA_CORE + 12
unsigned char ALST_BUTTON[] =
{ ATTR_TYPE, ATTR_VALUE, ATTR_NAME, ATTR_CORE };
#define MAXA_BUTTON MAXA_CORE + 3
unsigned char ALST_TEXTAREA[] =
{ ATTR_COLS, ATTR_ROWS, ATTR_NAME, ATTR_READONLY, ATTR_CORE };
#define MAXA_TEXTAREA MAXA_CORE + 4
......@@ -247,24 +250,24 @@ TagInfo TagMAP[MAX_HTMLTAG] = {
{"/bdo", NULL, 0, TFLG_END}, /* 121 HTML_N_BDO */
{"big", ALST_NOP, MAXA_NOP, 0}, /* 122 HTML_BIG */
{"/big", NULL, 0, TFLG_END}, /* 123 HTML_N_BIG */
{"button", ALST_NOP, MAXA_NOP, 0}, /* 124 HTML_BUTTON */
{"fieldset", ALST_NOP, MAXA_NOP, 0}, /* 125 HTML_FIELDSET */
{"/fieldset", NULL, 0, TFLG_END}, /* 126 HTML_N_FIELDSET */
{"iframe", ALST_NOP, MAXA_NOP, 0}, /* 127 HTML_IFRAME */
{"label", ALST_NOP, MAXA_NOP, 0}, /* 128 HTML_LABEL */
{"/label", NULL, 0, TFLG_END}, /* 129 HTML_N_LABEL */
{"legend", ALST_NOP, MAXA_NOP, 0}, /* 130 HTML_LEGEND */
{"/legend", NULL, 0, TFLG_END}, /* 131 HTML_N_LEGEND */
{"noscript", ALST_NOP, MAXA_NOP, 0}, /* 132 HTML_NOSCRIPT */
{"/noscript", NULL, 0, TFLG_END}, /* 133 HTML_N_NOSCRIPT */
{"object", ALST_NOP, MAXA_NOP, 0}, /* 134 HTML_OBJECT */
{"optgroup", ALST_NOP, MAXA_NOP, 0}, /* 135 HTML_OPTGROUP */
{"/optgroup", NULL, 0, TFLG_END}, /* 136 HTML_N_OPTGROUP */
{"param", ALST_NOP, MAXA_NOP, 0}, /* 137 HTML_PARAM */
{"small", ALST_NOP, MAXA_NOP, 0}, /* 138 HTML_SMALL */
{"/small", NULL, 0, TFLG_END}, /* 139 HTML_N_SMALL */
{"button", ALST_BUTTON, MAXA_BUTTON, 0}, /* 124 HTML_BUTTON */
{"/button", NULL, 0, TFLG_END}, /* 125 HTML_N_BUTTON */
{"fieldset", ALST_NOP, MAXA_NOP, 0}, /* 126 HTML_FIELDSET */
{"/fieldset", NULL, 0, TFLG_END}, /* 127 HTML_N_FIELDSET */
{"iframe", ALST_NOP, MAXA_NOP, 0}, /* 128 HTML_IFRAME */
{"label", ALST_NOP, MAXA_NOP, 0}, /* 129 HTML_LABEL */
{"/label", NULL, 0, TFLG_END}, /* 130 HTML_N_LABEL */
{"legend", ALST_NOP, MAXA_NOP, 0}, /* 131 HTML_LEGEND */
{"/legend", NULL, 0, TFLG_END}, /* 132 HTML_N_LEGEND */
{"noscript", ALST_NOP, MAXA_NOP, 0}, /* 133 HTML_NOSCRIPT */
{"/noscript", NULL, 0, TFLG_END}, /* 134 HTML_N_NOSCRIPT */
{"object", ALST_NOP, MAXA_NOP, 0}, /* 135 HTML_OBJECT */
{"optgroup", ALST_NOP, MAXA_NOP, 0}, /* 136 HTML_OPTGROUP */
{"/optgroup", NULL, 0, TFLG_END}, /* 137 HTML_N_OPTGROUP */
{"param", ALST_NOP, MAXA_NOP, 0}, /* 138 HTML_PARAM */
{"small", ALST_NOP, MAXA_NOP, 0}, /* 139 HTML_SMALL */
{"/small", NULL, 0, TFLG_END}, /* 140 HTML_N_SMALL */
{NULL, NULL, 0, 0}, /* 140 Undefined */
{NULL, NULL, 0, 0}, /* 141 Undefined */
{NULL, NULL, 0, 0}, /* 142 Undefined */
{NULL, NULL, 0, 0}, /* 143 Undefined */
......
......@@ -214,21 +214,22 @@ typedef struct {
#define HTML_BIG 122
#define HTML_N_BIG 123
#define HTML_BUTTON 124
#define HTML_FIELDSET 125
#define HTML_N_FIELDSET 126
#define HTML_IFRAME 127
#define HTML_LABEL 128
#define HTML_N_LABEL 129
#define HTML_LEGEND 130
#define HTML_N_LEGEND 131
#define HTML_NOSCRIPT 132
#define HTML_N_NOSCRIPT 133
#define HTML_OBJECT 134
#define HTML_OPTGROUP 135
#define HTML_N_OPTGROUP 136
#define HTML_PARAM 137
#define HTML_SMALL 138
#define HTML_N_SMALL 139
#define HTML_N_BUTTON 125
#define HTML_FIELDSET 126
#define HTML_N_FIELDSET 127
#define HTML_IFRAME 128
#define HTML_LABEL 129
#define HTML_N_LABEL 130
#define HTML_LEGEND 131
#define HTML_N_LEGEND 132
#define HTML_NOSCRIPT 133
#define HTML_N_NOSCRIPT 134
#define HTML_OBJECT 135
#define HTML_OPTGROUP 136
#define HTML_N_OPTGROUP 137
#define HTML_PARAM 138
#define HTML_SMALL 139
#define HTML_N_SMALL 140
/* pseudo tag */
#define HTML_SELECT_INT 160
......
......@@ -207,6 +207,8 @@ extern int getImageSize(ImageCache * cache);
extern Str process_img(struct parsed_tag *tag, int width);
extern Str process_anchor(struct parsed_tag *tag, char *tagbuf);
extern Str process_input(struct parsed_tag *tag);
extern Str process_button(struct parsed_tag *tag);
extern Str process_n_button(void);
extern Str process_select(struct parsed_tag *tag);
extern Str process_n_select(void);
extern void feed_select(char *str);
......
......@@ -2878,6 +2878,14 @@ feed_table_tag(struct table *tbl, char *line, struct table_mode *mode,
tmp = process_input(tag);
feed_table1(tbl, tmp, mode, width);
break;
case HTML_BUTTON:
tmp = process_button(tag);
feed_table1(tbl, tmp, mode, width);
break;
case HTML_N_BUTTON:
tmp = process_n_button();
feed_table1(tbl, tmp, mode, width);
break;
case HTML_SELECT:
tmp = process_select(tag);
if (tmp)
......
......@@ -176,6 +176,7 @@ bdo HTML_BDO
big HTML_BIG
/big HTML_N_BIG
button HTML_BUTTON
/button HTML_N_BUTTON
fieldset HTML_FIELDSET
/fieldset HTML_N_FIELDSET
iframe HTML_IFRAME
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment