w3m

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

commit 68fe0a3d3b96a5936793641fc72e8831909d35cc
parent ec07a9d1656be38973d1d9ec749d5182815c5c77
Author: ukai <ukai>
Date:   Mon,  9 Dec 2002 15:51:08 +0000

[w3m-dev 03549] link list
* anchor.c (addMultirowsImg): add a->slave
	(getAnchorText): arg AnchorList *al
	(link_list_panel): added
* funcname.tab (LIST): added
	(LIST_MENU): added
	(MOVE_LIST_MENU): added
* main.c (anchorMn): added
	(accessKey): use anchorMn()
	(listMn): added
	(movlistMn): added
	(linkLst): added
* map.c (searchMapList): not static
* menu.c (accesskey_menu): pass AnchorList to getAnchorText()
	(lmKeys): added
	(lmKeys2): added
	(nlmKeys): added
	(nlmKeys2): added
	(lmGoto): added
	(lmSelect): added
	(list_menu): added
* proto.h (linkLst): added
	(listMn): added
	(movlistMn): added
	(list_menu): added
	(searchMapList): added
	(getAnchorText): arg AnchorList *al
	(link_list_panel): added
* doc/README.func (LIST): added
	(LIST_MENU): added
	(MOVE_LIST_MENU): added
* doc-jp/README.func (LINK_MENU): fix message
	(LIST): added
	(LIST_MENU): added
	(MOVE_LIST_MENU): added
* scripts/w3mhelp.cgi.in (Page/Cursor motion): add movlistMn
	(Hyperlink operation): add linkLst linkMn
From: Hironori SAKAMOTO <hsaka@mth.biglobe.ne.jp>

Diffstat:
MChangeLog | 40++++++++++++++++++++++++++++++++++++++++
Manchor.c | 114+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----
Mdoc-jp/README.func | 5++++-
Mdoc/README.func | 3+++
Mfuncname.tab | 3+++
Mmain.c | 49+++++++++++++++++++++++++++++++++++++++++++------
Mmap.c | 2+-
Mmenu.c | 116++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
Mproto.h | 11++++++++++-
Mscripts/w3mhelp.cgi.in | 4++--
10 files changed, 330 insertions(+), 17 deletions(-)

diff --git a/ChangeLog b/ChangeLog @@ -1,5 +1,45 @@ 2002-12-10 Hironori SAKAMOTO <hsaka@mth.biglobe.ne.jp> + * [w3m-dev 03549] link list + * anchor.c (addMultirowsImg): add a->slave + (getAnchorText): arg AnchorList *al + (link_list_panel): added + * funcname.tab (LIST): added + (LIST_MENU): added + (MOVE_LIST_MENU): added + * main.c (anchorMn): added + (accessKey): use anchorMn() + (listMn): added + (movlistMn): added + (linkLst): added + * map.c (searchMapList): not static + * menu.c (accesskey_menu): pass AnchorList to getAnchorText() + (lmKeys): added + (lmKeys2): added + (nlmKeys): added + (nlmKeys2): added + (lmGoto): added + (lmSelect): added + (list_menu): added + * proto.h (linkLst): added + (listMn): added + (movlistMn): added + (list_menu): added + (searchMapList): added + (getAnchorText): arg AnchorList *al + (link_list_panel): added + * doc/README.func (LIST): added + (LIST_MENU): added + (MOVE_LIST_MENU): added + * doc-jp/README.func (LINK_MENU): fix message + (LIST): added + (LIST_MENU): added + (MOVE_LIST_MENU): added + * scripts/w3mhelp.cgi.in (Page/Cursor motion): add movlistMn + (Hyperlink operation): add linkLst linkMn + +2002-12-10 Hironori SAKAMOTO <hsaka@mth.biglobe.ne.jp> + * [w3m-dev 03548] close anchor before <img align=...> * file.c (process_img): use div_int (process_hr): use div_int diff --git a/anchor.c b/anchor.c @@ -480,6 +480,7 @@ addMultirowsImg(Buffer *buf, AnchorList *al) pos = columnPos(l, col); a = registerImg(buf, a_img.url, a_img.title, l->linenumber, pos); a->hseq = -a_img.hseq; + a->slave = TRUE; a->image = img; a->end.pos = pos + ecol - col; for (k = pos; k < a->end.pos; k++) @@ -565,12 +566,12 @@ addMultirowsForm(Buffer *buf, AnchorList *al) } char * -getAnchorText(Buffer *buf, Anchor *a) +getAnchorText(Buffer *buf, AnchorList *al, Anchor *a) { - AnchorList *al = buf->href; int hseq, i; Line *l; Str tmp = NULL; + char *p, *ep; if (!a || a->hseq < 0) return NULL; @@ -586,12 +587,115 @@ getAnchorText(Buffer *buf, Anchor *a) } if (!l) break; + p = l->lineBuf + a->start.pos; + ep = l->lineBuf + a->end.pos; + for (; p < ep && IS_SPACE(*p); p++) ; + if (p == ep) + continue; if (!tmp) - tmp = Strnew_size(a->end.pos - a->start.pos); + tmp = Strnew_size(ep - p); else Strcat_char(tmp, ' '); - Strcat_charp_n(tmp, &l->lineBuf[a->start.pos], - a->end.pos - a->start.pos); + Strcat_charp_n(tmp, p, ep - p); } return tmp ? tmp->ptr : NULL; } + +Buffer * +link_list_panel(Buffer *buf) +{ + LinkList *l; + AnchorList *al; + Anchor *a; + FormItemList *fi; + int i; + char *t, *u; + ParsedURL pu; + Str tmp = Strnew_charp("<title>Link List</title>\ +<h1 align=center>Link List</h1>\n"); + + if (buf->linklist) { + Strcat_charp(tmp, "<hr><h2>Links</h2>\n<ol>\n"); + for (l = buf->linklist; l; l = l->next) { + if (l->url) { + parseURL2(l->url, &pu, baseURL(buf)); + u = html_quote(parsedURL2Str(&pu)->ptr); + } + else + u = ""; + if (l->type == LINK_TYPE_REL) + t = " [Rel]"; + else if (l->type == LINK_TYPE_REV) + t = " [Rev]"; + else + t = ""; + t = Sprintf("%s%s\n", l->title ? l->title : "", t)->ptr; + t = html_quote(t); + Strcat_m_charp(tmp, "<li><a href=\"", u, "\">", t, "</a><br>", u, + "\n", NULL); + } + Strcat_charp(tmp, "</ol>\n"); + } + + if (buf->href) { + Strcat_charp(tmp, "<hr><h2>Anchors</h2>\n<ol>\n"); + al = buf->href; + for (i = 0; i < al->nanchor; i++) { + a = &al->anchors[i]; + if (a->slave) + continue; + parseURL2(a->url, &pu, baseURL(buf)); + u = html_quote(parsedURL2Str(&pu)->ptr); + t = getAnchorText(buf, al, a); + t = t ? html_quote(t) : ""; + Strcat_m_charp(tmp, "<li><a href=\"", u, "\">", t, "</a><br>", u, + "\n", NULL); + } + Strcat_charp(tmp, "</ol>\n"); + } + + if (buf->img) { + Strcat_charp(tmp, "<hr><h2>Images</h2>\n<ol>\n"); + al = buf->img; + for (i = 0; i < al->nanchor; i++) { + a = &al->anchors[i]; + if (a->slave) + continue; + parseURL2(a->url, &pu, baseURL(buf)); + u = html_quote(parsedURL2Str(&pu)->ptr); + t = (a->title && *a->title) ? html_quote(a->title) : + html_quote(a->url); + Strcat_m_charp(tmp, "<li><a href=\"", u, "\">", t, "</a><br>", u, + "\n", NULL); + a = retrieveAnchor(buf->formitem, a->start.line, a->start.pos); + if (!a) + continue; + fi = (FormItemList *)a->url; + fi = fi->parent->item; + if (fi->parent->method == FORM_METHOD_INTERNAL && + !Strcmp_charp(fi->parent->action, "map") && fi->value) { + MapList *ml = searchMapList(buf, fi->value->ptr); + ListItem *mi; + MapArea *m; + if (!ml) + continue; + Strcat_charp(tmp, "<br>\n<b>Image map</b>\n<ol>\n"); + for (mi = ml->area->first; mi != NULL; mi = mi->next) { + m = (MapArea *) mi->ptr; + if (!m) + continue; + parseURL2(m->url, &pu, baseURL(buf)); + u = html_quote(parsedURL2Str(&pu)->ptr); + t = (m->alt && *m->alt) ? html_quote(m->alt) : + html_quote(m->url); + Strcat_m_charp(tmp, "<li><a href=\"", u, "\">", t, + "</a><br>", u, "\n", NULL); + } + Strcat_charp(tmp, "</ol>\n"); + } + } + Strcat_charp(tmp, "</ol>\n"); + } + + return loadHTMLString(tmp); +} diff --git a/doc-jp/README.func b/doc-jp/README.func @@ -44,7 +44,9 @@ LINE_END LINE_INFO ページ中での現在位置を表示します LINK_BEGIN 最初のリンクに移動します LINK_END 最後のリンクに移動します -LINK_MENU Link メニューを立ち上げます +LINK_MENU Link 要素一覧のメニューを立ち上げます +LIST リンクと画像の一覧を表示します +LIST_MENU リンク先一覧のメニューを立ち上げ、リンク先の文書を読みこみます LOAD ローカルファイルを指定して開きます MAIN_MENU メニューを立ち上げます MARK マークを設定/解除します @@ -58,6 +60,7 @@ MOVE_DOWN MOVE_DOWN1 カーソルを下に移動します(改ページ時には1行スクロール) MOVE_LEFT カーソルを左に移動します(左端の場合には半画面分シフト) MOVE_LEFT1 カーソルを左に移動します(左端の場合には1文字分シフト) +MOVE_LIST_MENU リンク先一覧のメニューを立ち上げ、カーソルを移動します MOVE_MOUSE カーソルをマウスカーソルの位置に移動します(マウス操作用) MOVE_RIGHT カーソルを右に移動します(右端の場合には半画面分シフト) MOVE_RIGHT1 カーソルを右に移動します(右端の場合には1文字分シフト) diff --git a/doc/README.func b/doc/README.func @@ -45,6 +45,8 @@ LINE_INFO Show current line number LINK_BEGIN Go to the first link LINK_END Go to the last link LINK_MENU Popup link element menu +LIST Show all links and images +LIST_MENU Popup link list menu and go to selected link LOAD Load local file MAIN_MENU Popup menu MARK Set/unset mark @@ -58,6 +60,7 @@ MOVE_DOWN Move cursor down (a half screen scroll at the end of screen) MOVE_DOWN1 Move cursor down (1 line scroll at the end of screen) MOVE_LEFT Move cursor left (a half screen shift at the left edge) MOVE_LEFT1 Move cursor left (1 columns shift at the left edge) +MOVE_LIST_MENU Popup link list menu and move cursor to selected link MOVE_MOUSE Move cursor to mouse cursor (for mouse action) MOVE_RIGHT Move cursor right (a half screen shift at the right edge) MOVE_RIGHT1 Move cursor right (1 columns shift at the right edge) diff --git a/funcname.tab b/funcname.tab @@ -50,6 +50,8 @@ LINE_INFO curlno LINK_BEGIN topA LINK_END lastA LINK_MENU linkMn +LIST linkLst +LIST_MENU listMn LOAD ldfile MAIN_MENU mainMn MARK _mark @@ -64,6 +66,7 @@ MOVE_DOWN movD MOVE_DOWN1 movD1 MOVE_LEFT movL MOVE_LEFT1 movL1 +MOVE_LIST_MENU movlistMn MOVE_MOUSE movMs MOVE_RIGHT movR MOVE_RIGHT1 movR1 diff --git a/main.c b/main.c @@ -4177,27 +4177,64 @@ linkMn(void) parsedURL2Str(&Currentbuf->currentURL)->ptr); } -/* accesskey */ -void -accessKey(void) +static void +anchorMn(Anchor * (*menu_func) (Buffer *), int go) { Anchor *a; BufferPoint *po; if (!Currentbuf->href || !Currentbuf->hmarklist) return; - a = accesskey_menu(Currentbuf); + a = menu_func(Currentbuf); if (!a || a->hseq < 0) return; po = &Currentbuf->hmarklist->marks[a->hseq]; gotoLine(Currentbuf, po->line); Currentbuf->pos = po->pos; arrangeCursor(Currentbuf); - onA(); - followA(); + displayBuffer(Currentbuf, B_NORMAL); + if (go) { + onA(); + followA(); + } +} + +/* accesskey */ +void +accessKey(void) +{ + anchorMn(accesskey_menu, TRUE); +} + +/* list menu */ +void +listMn(void) +{ + anchorMn(list_menu, TRUE); +} + +void +movlistMn(void) +{ + anchorMn(list_menu, FALSE); } #endif +/* link,anchor,image list */ +void +linkLst(void) +{ + Buffer *buf; + + buf = link_list_panel(Currentbuf); + if (buf != NULL) { +#ifdef JP_CHARSET + buf->document_code = Currentbuf->document_code; +#endif /* JP_CHARSET */ + cmd_loadBuffer(buf, BP_NORMAL, LB_NOLINK); + } +} + #ifdef USE_COOKIE /* cookie list */ void diff --git a/map.c b/map.c @@ -5,7 +5,7 @@ #include "fm.h" #include <math.h> -static MapList * +MapList * searchMapList(Buffer *buf, char *name) { MapList *ml; diff --git a/menu.c b/menu.c @@ -1898,7 +1898,7 @@ accesskey_menu(Buffer *buf) for (i = 0, n = 0; i < al->nanchor; i++) { a = &al->anchors[i]; if (!a->slave && a->accesskey && IS_ASCII(a->accesskey)) { - t = getAnchorText(buf, a); + t = getAnchorText(buf, al, a); label[n] = Sprintf("%c: %s", a->accesskey, t ? t : "")->ptr; ap[n] = a; n++; @@ -1947,4 +1947,118 @@ accesskey_menu(Buffer *buf) return (key >= 0) ? ap[key] : NULL; } +static char lmKeys[] = "abcdefgimopqrstuvwxyz"; +static char lmKeys2[] = "1234567890ABCDEFGHILMOPQRSTUVWXYZ"; +#define nlmKeys (sizeof(lmKeys) - 1) +#define nlmKeys2 (sizeof(lmKeys2) - 1) + +static int +lmGoto(char c) +{ + if (IS_ASCII(c) && CurrentMenu->keyselect[(int)c] >= 0) { + goto_menu(CurrentMenu, CurrentMenu->nitem - 1, -1); + goto_menu(CurrentMenu, CurrentMenu->keyselect[(int)c] * nlmKeys, 1); + } + return (MENU_NOTHING); +} + +static int +lmSelect(char c) +{ + if (IS_ASCII(c)) + return select_menu(CurrentMenu, (CurrentMenu->select / nlmKeys) * + nlmKeys + CurrentMenu->keyselect[(int)c]); + else + return (MENU_NOTHING); +} + +Anchor * +list_menu(Buffer *buf) +{ + Menu menu; + AnchorList *al = buf->href; + Anchor *a; + Anchor **ap; + int i, n, nitem = 0, key = -1, two = FALSE; + char **label; + char *t; + unsigned char c; + + if (!al) + return NULL; + for (i = 0; i < al->nanchor; i++) { + a = &al->anchors[i]; + if (!a->slave) + nitem++; + } + if (!nitem) + return NULL; + + if (nitem >= nlmKeys) + two = TRUE; + label = New_N(char *, nitem + 1); + ap = New_N(Anchor *, nitem); + for (i = 0, n = 0; i < al->nanchor; i++) { + a = &al->anchors[i]; + if (!a->slave) { + t = getAnchorText(buf, al, a); + if (!t) + t = ""; + if (two && n >= nlmKeys2 * nlmKeys) + label[n] = Sprintf(" : %s", t)->ptr; + else if (two) + label[n] = Sprintf("%c%c: %s", lmKeys2[n / nlmKeys], + lmKeys[n % nlmKeys], t)->ptr; + else + label[n] = Sprintf("%c: %s", lmKeys[n], t)->ptr; + ap[n] = a; + n++; + } + } + label[nitem] = NULL; + + new_option_menu(&menu, label, &key, NULL); + + menu.initial = 0; + menu.cursorX = buf->cursorX + buf->rootX; + menu.cursorY = buf->cursorY + buf->rootY; + menu.x = menu.cursorX + FRAME_WIDTH + 1; + menu.y = menu.cursorY + 2; + for (i = 0; i < 128; i++) + menu.keyselect[i] = -1; + if (two) { + for (i = 0; i < nlmKeys2; i++) { + c = lmKeys2[i]; + menu.keymap[(int)c] = lmGoto; + menu.keyselect[(int)c] = i; + } + for (i = 0; i < nlmKeys; i++) { + c = lmKeys[i]; + menu.keymap[(int)c] = lmSelect; + menu.keyselect[(int)c] = i; + } + } + else { + for (i = 0; i < nitem; i++) { + c = lmKeys[i]; + menu.keymap[(int)c] = mSelect; + menu.keyselect[(int)c] = i; + } + } + + a = retrieveCurrentAnchor(buf); + if (a) { + for (i = 0; i < nitem; i++) { + if (a == ap[i]) { + menu.initial = i; + break; + } + } + } + + popup_menu(NULL, &menu); + + return (key >= 0) ? ap[key] : NULL; +} + #endif /* USE_MENU */ diff --git a/proto.h b/proto.h @@ -131,14 +131,20 @@ extern void tabrURL(void); extern void tabR(void); extern void tabL(void); extern void ldDL(void); +extern void linkLst(void); #ifdef USE_MENU extern void linkMn(void); extern LinkList *link_menu(Buffer *buf); extern void accessKey(void); extern Anchor *accesskey_menu(Buffer *buf); +extern void listMn(void); +extern void movlistMn(void); +extern Anchor *list_menu(Buffer *buf); #else #define linkMn nulcmd #define accessKey nulcmd +#define listMn nulcmd +#define movlistMn nulcmd #endif extern int currentLn(Buffer *buf); @@ -373,6 +379,7 @@ extern void do_internal(char *action, char *data); extern void form_write_data(FILE * f, char *boundary, char *name, char *value); extern void form_write_from_file(FILE * f, char *boundary, char *name, char *filename, char *file); +extern MapList *searchMapList(Buffer *buf, char *name); extern void follow_map(struct parsed_tagarg *arg); extern MapArea *follow_map_menu(Buffer *buf, char *name, Anchor *a_img, int x, int y); @@ -539,7 +546,9 @@ extern Anchor *closest_prev_anchor(AnchorList *a, Anchor *an, int x, int y); void addMultirowsImg(Buffer *buf, AnchorList *al); #endif extern HmarkerList *putHmarker(HmarkerList *ml, int line, int pos, int seq); -extern char *getAnchorText(Buffer *buf, Anchor *a); +extern char *getAnchorText(Buffer *buf, AnchorList *al, Anchor *a); +extern Buffer *link_list_panel(Buffer *buf); + extern Str decodeB(char **ww); extern Str decodeQ(char **ww); extern Str decodeQP(char **ww); diff --git a/scripts/w3mhelp.cgi.in b/scripts/w3mhelp.cgi.in @@ -134,13 +134,13 @@ for $otherlang (@docdirs) { movR1 movL1 movD1 movU1 ldown1 lup1 shiftl shiftr col1L col1R linbeg linend ctrCsrH ctrCsrV goLine goLineF goLineL movRW movLW - topA lastA nextA prevA + topA lastA nextA prevA movlistMn nextR nextL nextD nextU nextRD nextLU")); &show_keymap("Hyperlink operation", split(" ", "followA tabA svA followI svI submitForm curURL peekURL peekIMG pginfo curlno chkURL chkWORD chkNMID - rFrame extbrz linkbrz linkMn accessKey")); + rFrame extbrz linkbrz linkLst listMn linkMn accessKey")); &show_keymap("File/Stream operation", split(" ", "goURL gorURL tabURL tabrURL ldfile readsh pipesh