w3m

Unnamed repository; edit this file to name it for gitweb.
git clone https://logand.com/git/w3m.git/
Log | Files | Refs | README

w3mbookmark.c (6610B)


      1 /* $Id$ */
      2 #include <stdlib.h>
      3 #include <stdio.h>
      4 #include "config.h"
      5 #include "Str.h"
      6 #include "indep.h"
      7 #include "textlist.h"
      8 #include "parsetag.h"
      9 
     10 #if LANG == JA
     11 /* FIXME: gettextize here */
     12 #define BKMARK_TITLE "ブックマークの登録"
     13 #define BKMARK_ADD "登録"
     14 #define DEFAULT_SECTION "未分類"
     15 #else
     16 #define BKMARK_TITLE "Register to my bookmark"
     17 #define BKMARK_ADD "ADD"
     18 #define DEFAULT_SECTION "Miscellaneous"
     19 #endif
     20 
     21 static char *bkmark_src1 =
     22     "<html>\n\
     23 <head>\n\
     24 <title>" BKMARK_TITLE "</title>\n\
     25 </head>\n\
     26 <body>\n\
     27 <h1>" BKMARK_TITLE "</h1>\n\
     28 <form method=post action=\"file:///$LIB/" W3MBOOKMARK_CMDNAME "\">\n\
     29 <input type=hidden name=mode value=register>\n\
     30 <input type=hidden name=bmark value=\"%s\">\n\
     31 <input type=hidden name=cookie value=\"%s\">\n\
     32 <table cellpadding=0>\n";
     33 
     34 static char *bkmark_src2 =
     35     "<tr><td>New&nbsp;Section:<td><input type=text name=newsection size=60>\n\
     36 <tr><td>URL:<td><input type=text name=url value=\"%s\" size=60>\n\
     37 <tr><td>Title:<td><input type=text name=title value=\"%s\" size=60>\n\
     38 <tr><td><input type=submit value=\"" BKMARK_ADD "\">\n\
     39 </table>\n\
     40 </form>\n\
     41 </body>\n\
     42 </html>\n";
     43 
     44 #undef FALSE
     45 #define FALSE 0
     46 #undef TRUE
     47 #define TRUE 1
     48 
     49 static char end_section[] =
     50     "<!--End of section (do not delete this comment)-->\n";
     51 
     52 static char *Local_cookie = NULL;
     53 
     54 void
     55 print_bookmark_panel(char *bmark, char *url, char *title, char *charset)
     56 {
     57     Str tmp, tmp2;
     58     FILE *f;
     59     char *p;
     60 
     61     if (charset == NULL) {
     62 	printf("Content-Type: text/html\n\n");
     63     }
     64     else {
     65 	printf("Content-Type: text/html; charset=%s\n\n", charset);
     66     }
     67     printf(bkmark_src1, html_quote(bmark), html_quote(Local_cookie));
     68     if ((f = fopen(bmark, "r")) != NULL) {
     69 	printf("<tr><td>Section:<td><select name=\"section\">\n");
     70 	while (tmp = Strfgets(f), tmp->length > 0) {
     71 	    Strremovefirstspaces(tmp);
     72 	    if (Strncasecmp_charp(tmp, "<h2>", 4) == 0) {
     73 		p = tmp->ptr + 4;
     74 		tmp2 = Strnew();
     75 		while (*p && *p != '<')
     76 		    Strcat_char(tmp2, *p++);
     77 		printf("<option value=\"%s\">%s\n", tmp2->ptr,
     78 		       tmp2->ptr);
     79 	    }
     80 	}
     81 	printf("</select>\n");
     82     }
     83     printf(bkmark_src2, html_quote(url), html_quote(title));
     84 }
     85 
     86 /* create new bookmark */
     87 static int
     88 create_new_bookmark(char *bmark, char *section, char *title, char *url,
     89 		    char *mode)
     90 {
     91     FILE *f;
     92     f = fopen(bmark, mode);
     93     if (f == NULL) {
     94 	printf("\nCan't open bookmark %s\n", bmark);
     95 	return FALSE;
     96     }
     97     else {
     98 	fprintf(f, "<html><head><title>Bookmarks</title></head>\n");
     99 	fprintf(f, "<body>\n<h1>Bookmarks</h1>\n");
    100 	fprintf(f, "<h2>%s</h2>\n<ul>\n", section);
    101 	fprintf(f, "<li><a href=\"%s\">%s</a>\n", url, title);
    102 	fprintf(f, end_section);
    103 	fprintf(f, "</ul>\n</body>\n</html>\n");
    104 	fclose(f);
    105     }
    106     return TRUE;
    107 }
    108 
    109 int
    110 insert_bookmark(char *bmark, struct parsed_tagarg *data)
    111 {
    112     char *url, *title, *section;
    113     FILE *f;
    114     TextList *tl = newTextList();
    115     int section_found = 0;
    116     int bmark_added = 0;
    117     Str tmp, section_tmp;
    118 
    119     url = tag_get_value(data, "url");
    120     title = tag_get_value(data, "title");
    121     section = tag_get_value(data, "newsection");
    122     if (section == NULL || *section == '\0')
    123 	section = tag_get_value(data, "section");
    124     if (section == NULL || *section == '\0')
    125 	section = DEFAULT_SECTION;
    126 
    127     if (url == NULL || *url == '\0' || title == NULL || *title == '\0') {
    128 	/* Bookmark not added */
    129 	return FALSE;
    130     }
    131     url = html_quote(url);
    132     title = html_quote(title);
    133     section = html_quote(section);
    134 
    135     f = fopen(bmark, "r");
    136     if (f == NULL)
    137 	return create_new_bookmark(bmark, section, title, url, "w");
    138 
    139     section_tmp = Sprintf("<h2>%s</h2>\n", section);
    140     for (;;) {
    141 	tmp = Strfgets(f);
    142 	if (tmp->length == 0)
    143 	    break;
    144 	if (Strcasecmp(tmp, section_tmp) == 0)
    145 	    section_found = 1;
    146 	if (section_found && !bmark_added) {
    147 	    Strremovefirstspaces(tmp);
    148 	    if (Strcmp_charp(tmp, end_section) == 0) {
    149 		pushText(tl,
    150 			 Sprintf("<li><a href=\"%s\">%s</a>\n", url,
    151 				 title)->ptr);
    152 		bmark_added = 1;
    153 	    }
    154 	}
    155 	if (!bmark_added && Strcasecmp_charp(tmp, "</body>\n") == 0) {
    156 	    pushText(tl, Sprintf("<h2>%s</h2>\n<ul>\n", section)->ptr);
    157 	    pushText(tl,
    158 		     Sprintf("<li><a href=\"%s\">%s</a>\n", url, title)->ptr);
    159 	    pushText(tl, end_section);
    160 	    pushText(tl, "</ul>\n");
    161 	    bmark_added = 1;
    162 	}
    163 	pushText(tl, tmp->ptr);
    164     }
    165     fclose(f);
    166     if (!bmark_added) {
    167 	/* Bookmark not added; perhaps the bookmark file is ill-formed */
    168 	/* In this case, a new bookmark is appeneded after the bookmark file */
    169 	return create_new_bookmark(bmark, section, title, url, "a");
    170     }
    171     f = fopen(bmark, "w");
    172     while (tl->nitem) {
    173 	fputs(popText(tl), f);
    174     }
    175     fclose(f);
    176     return TRUE;
    177 }
    178 
    179 int
    180 main(int argc, char *argv[], char **envp)
    181 {
    182     extern char *getenv();
    183     char *p;
    184     int length;
    185     Str qs = NULL;
    186     struct parsed_tagarg *cgiarg;
    187     char *mode;
    188     char *bmark;
    189     char *url;
    190     char *title;
    191     char *charset;
    192     char *sent_cookie;
    193 
    194     GC_INIT();
    195     p = getenv("REQUEST_METHOD");
    196     if (p == NULL || strcasecmp(p, "post"))
    197 	goto request_err;
    198     p = getenv("CONTENT_LENGTH");
    199     if (p == NULL || (length = atoi(p)) <= 0)
    200 	goto request_err;
    201 
    202     qs = Strfgets(stdin);
    203     Strchop(qs);
    204     if (qs->length != length)
    205 	goto request_err;
    206     cgiarg = cgistr2tagarg(qs->ptr);
    207 
    208     p = getenv("LOCAL_COOKIE_FILE");
    209     if (p) {
    210 	FILE *f = fopen(p, "r");
    211 	if (f) {
    212 	    Local_cookie = Strfgets(f)->ptr;
    213 	    fclose(f);
    214 	}
    215     }
    216     sent_cookie = tag_get_value(cgiarg, "cookie");
    217     if (sent_cookie == NULL || Local_cookie == NULL ||
    218 	strcmp(sent_cookie, Local_cookie) != 0) {
    219 	/* local cookie doesn't match: It may be an illegal invocation */
    220 	printf("Content-Type: text/plain\n\n");
    221 	printf("Local cookie doesn't match: It may be an illegal invocation\n");
    222 	exit(1);
    223     }
    224 
    225     mode = tag_get_value(cgiarg, "mode");
    226     bmark = expandPath(tag_get_value(cgiarg, "bmark"));
    227     url = tag_get_value(cgiarg, "url");
    228     title = tag_get_value(cgiarg, "title");
    229     charset = tag_get_value(cgiarg, "charset");
    230     if (bmark == NULL || url == NULL)
    231 	goto request_err;
    232     if (mode && !strcmp(mode, "panel")) {
    233 	if (title == NULL)
    234 	    title = "";
    235 	print_bookmark_panel(bmark, url, title, charset);
    236     }
    237     else if (mode && !strcmp(mode, "register")) {
    238 	printf("Content-Type: text/plain\n");
    239 	if (insert_bookmark(bmark, cgiarg)) {
    240 	    printf("w3m-control: BACK\n");
    241 	    printf("w3m-control: BACK\n");
    242 	}
    243 	printf("\n");
    244     }
    245     return 0;
    246 
    247   request_err:
    248     printf("Content-Type: text/plain\n\n");
    249     printf("Incomplete Request: %s\n", qs ? qs->ptr : "(null)");
    250     exit(1);
    251 }