diff options
author | Fumitoshi UKAI <ukai@debian.or.jp> | 2003-01-10 16:48:45 +0000 |
---|---|---|
committer | Fumitoshi UKAI <ukai@debian.or.jp> | 2003-01-10 16:48:45 +0000 |
commit | d29107a5dab66b8889d7b716006b79821b2409eb (patch) | |
tree | 587f6797066e7be9c3e64e08ff35aac633c970c5 /form.c | |
parent | [w3m-dev 03629] delete tmp file (diff) | |
download | w3m-d29107a5dab66b8889d7b716006b79821b2409eb.tar.gz w3m-d29107a5dab66b8889d7b716006b79821b2409eb.zip |
[w3m-dev 03630] improved pre_form
* form.c (pre_form): add re_url, name
(add_pre_form): add name
rewrite
(loadPreForm): add "form"
(preFormUpdateBuffer): handle re_url
From: Hironori SAKAMOTO <hsaka@mth.biglobe.ne.jp>
Diffstat (limited to '')
-rw-r--r-- | form.c | 73 |
1 files changed, 62 insertions, 11 deletions
@@ -1,4 +1,4 @@ -/* $Id: form.c,v 1.25 2002/12/03 15:35:10 ukai Exp $ */ +/* $Id: form.c,v 1.26 2003/01/10 16:48:49 ukai Exp $ */ /* * HTML forms */ @@ -7,6 +7,7 @@ #include "parsetagx.h" #include "myctype.h" #include "local.h" +#include "regex.h" #ifndef HAVE_LSTAT /* lstat is identical to stat, only the link itself is statted, not the file @@ -657,7 +658,9 @@ struct pre_form_item { }; struct pre_form { - ParsedURL url; + char *url; + Regex *re_url; + char *name; char *action; struct pre_form_item *item; struct pre_form *next; @@ -666,19 +669,32 @@ struct pre_form { static struct pre_form *PreForm = NULL; static struct pre_form * -add_pre_form(struct pre_form *prev, char *url, char *action) +add_pre_form(struct pre_form *prev, char *url, char *name, char *action) { + ParsedURL pu; struct pre_form *new; if (prev) new = prev->next = New(struct pre_form); else new = PreForm = New(struct pre_form); - parseURL2(url, &new->url, NULL); - if (action && *action) - new->action = action; - else - new->action = NULL; + if (url && *url == '/') { + int l = strlen(url); + if (l > 1 && url[l - 1] == '/') + new->url = allocStr(url + 1, l - 2); + else + new->url = url + 1; + new->re_url = newRegex(new->url, FALSE, NULL, NULL); + if (!new->re_url) + new->url = NULL; + } + else if (url) { + parseURL2(url, &pu, NULL); + new->url = parsedURL2Str(&pu)->ptr; + new->re_url = NULL; + } + new->name = (name && *name) ? name : NULL; + new->action = (action && *action) ? action : NULL; new->item = NULL; new->next = NULL; return new; @@ -710,7 +726,8 @@ add_pre_form_item(struct pre_form *pf, struct pre_form_item *prev, int type, } /* - * url <url> [<action>] + * url <url>|/<re-url>/ + * form [<name>] <action> * text <name> <value> * file <name> <value> * passwd <name> <value> @@ -760,12 +777,35 @@ loadPreForm(void) if (!arg || !*arg) continue; p = getQWord(&p); - pf = add_pre_form(pf, arg, p); + pf = add_pre_form(pf, arg, NULL, p); pi = pf->item; continue; } if (!pf) continue; + if (!strcmp(s, "form")) { + if (!arg || !*arg) + continue; + s = getQWord(&p); + p = getQWord(&p); + if (!p || !*p) { + p = s; + s = NULL; + } + if (pf->item) { + struct pre_form *prev = pf; + pf = add_pre_form(prev, "", s, p); + /* copy previous URL */ + pf->url = prev->url; + pf->re_url = prev->re_url; + } + else { + pf->name = s; + pf->action = (p && *p) ? p : NULL; + } + pi = pf->item; + continue; + } if (!strcmp(s, "text")) type = FORM_INPUT_TEXT; else if (!strcmp(s, "file")) @@ -818,12 +858,23 @@ preFormUpdateBuffer(Buffer *buf) return; for (pf = PreForm; pf; pf = pf->next) { - if (Strcmp(parsedURL2Str(&buf->currentURL), parsedURL2Str(&pf->url))) + if (pf->re_url) { + Str url = parsedURL2Str(&buf->currentURL); + if (!RegexMatch(pf->re_url, url->ptr, url->length, 1)) + continue; + } + else if (pf->url) { + if (Strcmp_charp(parsedURL2Str(&buf->currentURL), pf->url)) + continue; + } + else continue; for (i = 0; i < buf->formitem->nanchor; i++) { a = &buf->formitem->anchors[i]; fi = (FormItemList *)a->url; fl = fi->parent; + if (pf->name && (!fl->name || strcmp(fl->name, pf->name))) + continue; if (pf->action && (!fl->action || Strcmp_charp(fl->action, pf->action))) continue; |