summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2013-12-28 21:48:53 +0100
committercinap_lenrek <cinap_lenrek@felloff.net>2013-12-28 21:48:53 +0100
commit8cef1794d6a092e72482bcb4927fced3b7b75d2a (patch)
tree028c975c5f3c93331f08871b40f34d816b9f3055 /sys
parent59d8c24f585f8460c3ca20e9d34ea0268ada993f (diff)
mothra: add regular expression text search (thanks mischief, sl)
this works differently from mischiefs original patch. instead of overloading the address bar, we popup our own enter box. the function can be invoked from the menu or by hitting ^F.
Diffstat (limited to 'sys')
-rw-r--r--sys/man/1/mothra3
-rw-r--r--sys/src/cmd/mothra/mothra.c54
2 files changed, 55 insertions, 2 deletions
diff --git a/sys/man/1/mothra b/sys/man/1/mothra
index 99b0c4f38..f79044938 100644
--- a/sys/man/1/mothra
+++ b/sys/man/1/mothra
@@ -104,6 +104,9 @@ If nothing is selected, the current URL is copied.
.B paste
Paste the snarf buffer to the current text entry.
.TP
+.B search
+Search for a regular expression in the current page.
+.TP
.B save hit
Save the current URL to the hit list.
.TP
diff --git a/sys/src/cmd/mothra/mothra.c b/sys/src/cmd/mothra/mothra.c
index d851ecc25..537f71dd4 100644
--- a/sys/src/cmd/mothra/mothra.c
+++ b/sys/src/cmd/mothra/mothra.c
@@ -9,6 +9,7 @@
#include <plumb.h>
#include <cursor.h>
#include <panel.h>
+#include <regexp.h>
#include "mothra.h"
#include "rtext.h"
int debug=0;
@@ -91,6 +92,7 @@ char *buttons[]={
"moth mode",
"snarf",
"paste",
+ "search",
"save hit",
"hit list",
"exit",
@@ -254,6 +256,8 @@ void drawlock(int dolock){
}
void scrollto(char *tag);
+void search(void);
+
extern char *mtpt; /* url */
void main(int argc, char *argv[]){
@@ -383,6 +387,9 @@ void main(int argc, char *argv[]){
case Kend:
scrolltext(-text->size.y, 2);
break;
+ case Kack:
+ search();
+ break;
}
break;
case Emouse:
@@ -692,6 +699,46 @@ void docmd(Panel *p, char *s){
pldraw(root, screen);
}
+void search(void){
+ static char last[256];
+ char buf[256];
+ Reprog *re;
+ Rtext *tp;
+
+ for(;;){
+ if(current == nil || current->text == nil || text == nil)
+ return;
+ strncpy(buf, last, sizeof(buf)-1);
+ if(eenter("Search for", buf, sizeof(buf), &mouse) <= 0)
+ return;
+ re = regcompnl(buf);
+ if(re == nil)
+ return;
+ strncpy(last, buf, sizeof(buf)-1);
+ for(tp=current->text;tp;tp=tp->next)
+ if(tp->flags & PL_SEL)
+ break;
+ if(tp == nil)
+ tp = current->text;
+ else {
+ tp->flags &= ~PL_SEL;
+ tp = tp->next;
+ }
+ while(tp != nil){
+ tp->flags &= ~PL_SEL;
+ if(tp->text && *tp->text)
+ if(regexec(re, tp->text, nil, 0)){
+ tp->flags |= PL_SEL;
+ plsetpostextview(text, tp->topy);
+ break;
+ }
+ tp = tp->next;
+ }
+ free(re);
+ updtext(current);
+ }
+}
+
void hiturl(int buttons, char *url, int map){
switch(buttons){
case 1: geturl(url, -1, 0, map); break;
@@ -1119,6 +1166,9 @@ void hit3(int button, int item){
paste(plkbfocus);
break;
case 4:
+ search();
+ break;
+ case 5:
if(!selection){
message("no url selected");
break;
@@ -1138,11 +1188,11 @@ void hit3(int button, int item){
fprint(fd, "<p><a href=\"%s\">%s</a>\n", urlstr(selection), urlstr(selection));
close(fd);
break;
- case 5:
+ case 6:
snprint(name, sizeof(name), "file:%s/hit.html", mkhome());
geturl(name, -1, 1, 0);
break;
- case 6:
+ case 7:
if(confirm(3))
exits(0);
break;