shithub: riscv

Download patch

ref: 8cef1794d6a092e72482bcb4927fced3b7b75d2a
parent: 59d8c24f585f8460c3ca20e9d34ea0268ada993f
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sat Dec 28 16:48:53 EST 2013

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.

--- a/sys/man/1/mothra
+++ b/sys/man/1/mothra
@@ -104,6 +104,9 @@
 .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
--- 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 @@
 	"moth mode",
 	"snarf",
 	"paste",
+	"search",
 	"save hit",
 	"hit list",
 	"exit",
@@ -254,6 +256,8 @@
 }
 
 void scrollto(char *tag);
+void search(void);
+
 extern char *mtpt; /* url */
 
 void main(int argc, char *argv[]){
@@ -383,6 +387,9 @@
 			case Kend:
 				scrolltext(-text->size.y, 2);
 				break;
+			case Kack:
+				search();
+				break;
 			}
 			break;
 		case Emouse:
@@ -692,6 +699,46 @@
 	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 @@
 		paste(plkbfocus);
 		break;
 	case 4:
+		search();
+		break;
+	case 5:
 		if(!selection){
 			message("no url selected");
 			break;
@@ -1138,11 +1188,11 @@
 		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;
--