[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>
This commit is contained in:
		
							
								
								
									
										73
									
								
								form.c
									
									
									
									
									
								
							
							
						
						
									
										73
									
								
								form.c
									
									
									
									
									
								
							@@ -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;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user