int mothmode;
void docmd(Panel *, char *);
void doprev(Panel *, int, int);
+char *urlstr(Url *);
void selurl(char *);
void setcurrent(int, char *);
char *genwww(Panel *, int);
esetcursor(current->alldone ? 0 : &readingcurs);
}
+void scrollto(char *tag);
+
void main(int argc, char *argv[]){
Event e;
enum { Eplumb = 128 };
if(mouse.buttons==0 && current){
if(current->finished){
updtext(current);
+ if(current->url->tag[0])
+ scrollto(current->url->tag);
current->finished=0;
current->changed=0;
current->alldone=1;
plinitlabel(curttl, PACKE|EXPAND, "---");
plinitlabel(cururl, PACKE|EXPAND, "---");
plpack(root, r);
+ plpack(alt, r);
if(current){
plinitlabel(curttl, PACKE|EXPAND, current->title);
plinitlabel(cururl, PACKE|EXPAND, current->url->fullname);
return buf;
}
+void scrollto(char *tag){
+ Rtext *tp;
+ Action *ap;
+ if(current == nil || text == nil)
+ return;
+ if(tag && tag[0]){
+ for(tp=current->text;tp;tp=tp->next){
+ ap=tp->user;
+ if(ap && ap->name && strcmp(ap->name, tag)==0){
+ current->yoffs=tp->topy;
+ break;
+ }
+ }
+ }
+ plsetpostextview(text, current->yoffs);
+ flushimage(display, 1);
+}
+
/*
* selected text should be a url.
- * get the document, scroll to the given tag
*/
void setcurrent(int index, char *tag){
Www *new;
- Rtext *tp;
- Action *ap;
int i;
new=www(index);
if(new==current && (tag==0 || tag[0]==0)) return;
plinitlabel(cururl, PACKE|EXPAND, current->url->fullname);
if(defdisplay) pldraw(cururl, screen);
plinittextview(text, PACKE|EXPAND, Pt(0, 0), current->text, dolink);
- if(tag && tag[0]){
- for(tp=current->text;tp;tp=tp->next){
- ap=tp->user;
- if(ap && ap->name && strcmp(ap->name, tag)==0){
- current->yoffs=tp->topy;
- break;
- }
- }
- }
- plsetpostextview(text, current->yoffs);
+ scrollto(tag);
donecurs();
- flushimage(display, 1);
}
char *arg(char *s){
do ++s; while(*s==' ' || *s=='\t');
char *name, *slash;
if(url == nil)
return nil;
- if(url->fullname[0])
- name = url->fullname;
- else if(url->reltext[0])
- name = url->reltext;
+ if(url->fullname[0] || url->reltext[0])
+ name = urlstr(url);
else
name = "/";
if(slash = strrchr(name, '/'))
case 'g':
s = arg(s);
if(*s=='\0'){
+ case 'r':
if(selection)
- geturl(selection->fullname, GET, 0, 0, 0);
+ s = urlstr(selection);
else
message("no url selected");
}
- else geturl(s, GET, 0, 0, 0);
+ geturl(s, GET, 0, 0, 0);
break;
case 'j':
s = arg(s);
else
message("Usage: j index");
break;
- case 'r':
- s = arg(s);
- if(*s=='\0' && selection)
- geturl(selection->fullname, GET, 0, 0, 0);
- break;
case 'W':
s = arg(s);
if(s=='\0'){
break;
case 's':
s = arg(s);
- if(selection){
- if(s==0 || *s=='\0')
- s = urltofile(selection);
- if(s==0 || *s=='\0'){
- message("Usage: s file");
- break;
- }
- save(urlopen(selection, GET, 0), s);
+ if(!selection){
+ message("no url selected");
+ break;
+ }
+ if(s==0 || *s=='\0')
+ s = urltofile(selection);
+ if(s==0 || *s=='\0'){
+ message("Usage: s file");
+ break;
}
+ save(urlopen(selection, GET, 0), s);
break;
case 'q':
draw(screen, screen->r, display->white, 0, ZP);
Point coord;
int yoffs;
Action *a;
- Url u;
a=word->user;
if(a == nil || a->image == nil && a->link == nil)
switch(rfork(RFFDG|RFPROC|RFNOWAIT|RFMEM)){
case -1:
message("Can't fork, please wait");
- if(type==HTML)
- plrdhtml(w->url->fullname, fd, w);
- else
- plrdplain(w->url->fullname, fd, w);
break;
case 0:
if(type==HTML)
plrtfree(tt);
}
-int readstr(char *buf, int nbuf, char *base, char *name)
-{
- char path[128];
- int n, fd;
-
- snprint(path, sizeof path, "%s/%s", base, name);
- if((fd = open(path, OREAD)) < 0){
- ErrOut:
- memset(buf, 0, nbuf);
- return 0;
- }
- n = read(fd, buf, nbuf-1);
- close(fd);
- if(n <= 0){
- close(fd);
- goto ErrOut;
- }
- buf[n] = 0;
- return n;
-}
-
int fileurlopen(Url *url){
char *rel, *base, *x;
int fd;
return fd;
}
+int readstr(char *buf, int nbuf, char *base, char *name){
+ char path[128];
+ int n, fd;
+
+ n = 0;
+ snprint(path, sizeof path, "%s/%s", base, name);
+ if((fd = open(path, OREAD)) >= 0){
+ if((n = read(fd, buf, nbuf-1)) < 0)
+ n = 0;
+ close(fd);
+ }
+ buf[n] = 0;
+ return n;
+}
+
int urlopen(Url *url, int method, char *body){
int conn, ctlfd, fd, n;
char buf[1024+1], *p;
if(method == GET)
if((fd = fileurlopen(url)) >= 0)
return fd;
-
snprint(buf, sizeof buf, "%s/clone", mtpt);
if((ctlfd = open(buf, ORDWR)) < 0)
return -1;
}
buf[n] = 0;
conn = atoi(buf);
-
if(url->basename[0]){
n = snprint(buf, sizeof buf, "baseurl %s", url->basename);
write(ctlfd, buf, n);
close(ctlfd);
return -1;
}
-
if(method == POST && body){
snprint(buf, sizeof buf, "%s/%d/postbody", mtpt, conn);
if((fd = open(buf, OWRITE)) < 0)
}
close(fd);
}
-
snprint(buf, sizeof buf, "%s/%d/body", mtpt, conn);
if((fd = open(buf, OREAD)) < 0)
goto ErrOut;
-
snprint(buf, sizeof buf, "%s/%d/parsed", mtpt, conn);
readstr(url->fullname, sizeof(url->fullname), buf, "url");
readstr(url->tag, sizeof(url->tag), buf, "fragment");
return pfd[1];
}
-/*
- * select the file at the given url
- */
+char*
+urlstr(Url *url){
+ if(url->fullname[0])
+ return url->fullname;
+ if(url->reltext[0])
+ return url->reltext;
+ return nil;
+}
void selurl(char *urlname){
static Url url;
seturl(&url, urlname, current?
current->url->fullname :
defurl.fullname);
selection=&url;
- message("selected: %s", selection->fullname[0] ? selection->fullname : selection->reltext);
+ message("selected: %s", urlstr(selection));
}
void seturl(Url *url, char *urlname, char *base){
strncpy(url->reltext, urlname, sizeof(url->reltext));
int pfd[2];
Www *w;
+ if(*urlname == '#'){
+ scrollto(urlname+1);
+ return;
+ }
+
selurl(urlname);
selection->map=map;
int fd;
fd=create("/dev/snarf", OWRITE, 0666);
if(fd>=0){
- fprint(fd, "%s", selection->fullname[0] ? selection->fullname : selection->reltext);
+ fprint(fd, "%s", urlstr(selection));
close(fd);
}
}
fprint(fd, "<body><h1>Hit list</h1>\n");
}
seek(fd, 0, 2);
- fprint(fd, "<p><a href=\"%s\">%s</a>\n",
- selection->fullname, selection->fullname);
+ fprint(fd, "<p><a href=\"%s\">%s</a>\n", urlstr(selection), urlstr(selection));
close(fd);
break;
case 5: