diff options
Diffstat (limited to 'map.c')
-rw-r--r-- | map.c | 222 |
1 files changed, 222 insertions, 0 deletions
@@ -0,0 +1,222 @@ +/* + * client-side image maps + */ +#include "fm.h" + +#ifdef MENU_MAP +char * +follow_map_menu(Buffer * buf, struct parsed_tagarg *arg, int x, int y) +{ + MapList *ml; + char *name; + TextListItem *t, *s; + int i, n, selected = -1; + char **label; + + name = tag_get_value(arg, "link"); + if (name == NULL) + return NULL; + + for (ml = buf->maplist; ml != NULL; ml = ml->next) { + if (!Strcmp_charp(ml->name, name)) + break; + } + if (ml == NULL) + return NULL; + + for (n = 0, t = ml->urls->first; t != NULL; n++, t = t->next); + if (n == 0) + return NULL; + label = New_N(char *, n + 1); + for (i = 0, t = ml->urls->first, s = ml->alts->first; t != NULL; + i++, t = t->next, s = s->next) + label[i] = *s->ptr ? s->ptr : t->ptr; + label[n] = NULL; + + optionMenu(x, y, label, &selected, 0, NULL); + + if (selected >= 0) { + for (i = 0, t = ml->urls->first; t != NULL; i++, t = t->next) + if (i == selected) + return t->ptr; + } + return NULL; +} + +#else +char *map1 = "<HTML><HEAD><TITLE>Image map links</TITLE></HEAD>\ +<BODY><H1>Image map links</H1>"; + +Buffer * +follow_map_panel(Buffer * buf, struct parsed_tagarg *arg) +{ + Str mappage; + MapList *ml; + char *name; + TextListItem *t, *s; + ParsedURL pu; + + name = tag_get_value(arg, "link"); + if (name == NULL) + return NULL; + + for (ml = buf->maplist; ml != NULL; ml = ml->next) { + if (!Strcmp_charp(ml->name, name)) + break; + } + if (ml == NULL) + return NULL; + + mappage = Strnew_charp(map1); + for (t = ml->urls->first, s = ml->alts->first; t != NULL; + t = t->next, s = s->next) { + parseURL2(t->ptr, &pu, baseURL(buf)); + Strcat_charp(mappage, "<a href=\""); + Strcat_charp(mappage, htmlquote_str(parsedURL2Str(&pu)->ptr)); + Strcat_charp(mappage, "\">"); + Strcat_charp(mappage, htmlquote_str(s->ptr)); + Strcat_charp(mappage, " "); + Strcat_charp(mappage, htmlquote_str(t->ptr)); + Strcat_charp(mappage, "</a><br>\n"); + } + Strcat_charp(mappage, "</body></html>"); + + return loadHTMLString(mappage); +} +#endif + +/* append frame URL */ +static void +append_frame_info(Str html, struct frameset *set, int level) +{ + char *q; + int i, j; + + if (!set) + return; + + for (i = 0; i < set->col * set->row; i++) { + union frameset_element frame = set->frame[i]; + if (frame.element != NULL) { + switch (frame.element->attr) { + case F_UNLOADED: + case F_BODY: + if (frame.body->url == NULL) + break; + for (j = 0; j < level; j++) + Strcat_charp(html, " "); + q = htmlquote_str(frame.body->url); + Strcat_charp(html, "<a href=\""); + Strcat_charp(html, q); + Strcat_charp(html, "\">"); + Strcat_charp(html, htmlquote_str(frame.body->name)); + Strcat_charp(html, " "); + Strcat_charp(html, q); + Strcat_charp(html, "</a>\n"); + break; + case F_FRAMESET: + append_frame_info(html, frame.set, level + 1); + break; + } + } + } +} + +/* + * information of current page and link + */ +Buffer * +page_info_panel(Buffer * buf) +{ + Str tmp = Strnew_size(1024); + Anchor *a; + Str s; + ParsedURL pu; + TextListItem *ti; + struct frameset *f_set = NULL; + int all; + + Strcat_charp(tmp, "<html><head><title>Information about current page</title></head><body>"); + Strcat_charp(tmp, "<h1>Information about current page</h1><table cellpadding=0>"); + if (buf == NULL) + goto end; + Strcat_charp(tmp, "<tr><td nowrap>Title<td>"); + Strcat_charp(tmp, htmlquote_str(buf->buffername)); + Strcat_charp(tmp, "<tr><td nowrap>Current URL<td>"); + Strcat_charp(tmp, htmlquote_str(parsedURL2Str(&buf->currentURL)->ptr)); + Strcat_charp(tmp, "<tr><td nowrap>Document Type<td>"); + if (buf->real_type) + Strcat_charp(tmp, buf->real_type); + else + Strcat_charp(tmp, "unknown"); + Strcat_charp(tmp, "<tr><td nowrap>Last Modified<td>"); + Strcat_charp(tmp, htmlquote_str(last_modified(buf))); +#ifdef JP_CHARSET + Strcat_charp(tmp, "<tr><td nowrap>Document Code<td>"); + Strcat_charp(tmp, code_to_str(buf->document_code)); +#endif /* JP_CHARSET */ + Strcat_charp(tmp, "<tr><td nowrap>Number of line<td>"); + all = buf->allLine; + if (all == 0 && buf->lastLine) + all = buf->lastLine->linenumber; + Strcat(tmp, Sprintf("%d", all)); + Strcat_charp(tmp, "<tr><td nowrap>Transferred byte<td>"); + Strcat(tmp, Sprintf("%d", buf->trbyte)); + + a = retrieveCurrentAnchor(buf); + if (a != NULL) { + parseURL2(a->url, &pu, baseURL(buf)); + s = parsedURL2Str(&pu); + Strcat_charp(tmp, "<tr><td nowrap>URL of current anchor<td>"); + Strcat_charp(tmp, htmlquote_str(s->ptr)); + } + a = retrieveCurrentImg(buf); + if (a != NULL) { + parseURL2(a->url, &pu, baseURL(buf)); + s = parsedURL2Str(&pu); + Strcat_charp(tmp, "<tr><td nowrap>URL of current image<td>"); + Strcat_charp(tmp, "<a href=\""); + Strcat_charp(tmp, htmlquote_str(s->ptr)); + Strcat_charp(tmp, "\">"); + Strcat_charp(tmp, htmlquote_str(s->ptr)); + Strcat_charp(tmp, "</a>"); + } + a = retrieveCurrentForm(buf); + if (a != NULL) { + s = Strnew_charp(form2str((FormItemList *) a->url)); + Strcat_charp(tmp, "<tr><td nowrap>Method/type of current form<td>"); + Strcat_charp(tmp, htmlquote_str(s->ptr)); + } + Strcat_charp(tmp, "</table>\n"); + if (buf->document_header != NULL) { + Strcat_charp(tmp, "<hr width=50%>\n"); + Strcat_charp(tmp, "<h1>Header information</h1>\n"); + for (ti = buf->document_header->first; ti != NULL; ti = ti->next) { + Strcat_charp(tmp, htmlquote_str(ti->ptr)); + Strcat_charp(tmp, "<br>"); + } + } + if (buf->frameset != NULL) + f_set = buf->frameset; + else if (buf->bufferprop & BP_FRAME && + buf->nextBuffer != NULL && + buf->nextBuffer->frameset != NULL) + f_set = buf->nextBuffer->frameset; + + if (f_set) { + Strcat_charp(tmp, "<hr width=50%><h1>Frame information</h1><pre>"); + append_frame_info(tmp, f_set, 0); + Strcat_charp(tmp, "</pre>"); + } +#ifdef USE_SSL + if (buf->ssl_certificate == NULL) + goto end; + Strcat_charp(tmp, "<h1>SSL certificate</h1>\n"); + Strcat_charp(tmp, "<pre>\n"); + Strcat_charp(tmp, buf->ssl_certificate); + Strcat_charp(tmp, "</pre>\n"); +#endif + end: + Strcat_charp(tmp, "</body></html>"); + return loadHTMLString(tmp); +} |