shithub: wpq

Download patch

ref: fac705ddaf2ae19afd8d1791c0c94cfc696c03e2
author: rodri <[email protected]>
date: Sat Aug 19 17:24:14 EDT 2023

now version controlled.

--- /dev/null
+++ b/mkfile
@@ -1,0 +1,18 @@
+</$objtype/mkfile
+
+BIN=$home/bin/$objtype
+TARG=wpqprompt
+OFILES=\
+	wpqprompt.$O
+
+RCBIN=$home/bin/rc
+RCSCR=\
+	wpq
+
+</sys/src/cmd/mkone
+
+install:V:	$BIN/$TARG
+	cp $RCSCR $RCBIN
+
+uninstall:V:
+	rm -f $BIN/$TARG $RCBIN/$RCSCR
--- /dev/null
+++ b/readme.md
@@ -1,0 +1,45 @@
+# Wpq
+
+_Wpq_ is the WikiPedia Query tool.  It allows you to look up a term
+and disambiguate if necessary, using Wikipedia's API to open pages
+directly in your `$browser` or show you the PDF file in **page(1)**.
+
+# Usage
+
+Let's say we've been reading PC stuff and just learned about the A20
+line.  We go ahead and ask wpq for more info about it:
+
+	% wpq a20
+
+However, _a20_ by itself is too ambiguous, so we'll get a list of
+possible subjects for us to choose manually:
+
+```
+% wpq a20
+1) A20
+2) A20 line
+3) A20 road (England)
+4) A202 road
+5) A20 autoroute
+6) A201 road
+7) A206 road
+8) A20 heavy tank
+9) A200 road
+10) A20 cells
+[1-10]: 
+```
+
+We are only interested in the A20 line, so we go ahead and type the
+index number corresponding to the entry:
+
+```
+% wpq a20
+1) A20
+2) A20 line
+…
+[1-10]: 2
+```
+
+And by default this will open up the article in **page(1)** after
+fetching it with **hget(1)**.  If instead you want to see it in your
+`$browser`, pass the `-h` flag to _wpq_, and it will plumb the URL.
--- /dev/null
+++ b/wpq
@@ -1,0 +1,33 @@
+#!/bin/rc
+rfork e
+ts=`{date -n}
+tmpfile=/tmp/wpsearch.$ts
+wanthtml=n
+
+fn sigint {
+	rm -f $tmpfile
+}
+
+fn usage {
+	echo usage: $0 [-h] query >[1=2]
+	exit usage
+}
+
+if(~ $#* 0)
+	usage
+switch($1){
+case -*h*
+	wanthtml=y
+	shift
+}
+{
+	echo -n '{"result":'
+	hget 'https://en.wikipedia.org/w/api.php?action=opensearch&format=json&search='^$"*
+	echo -n '}'
+} >$tmpfile
+targ=`{wpqprompt $tmpfile | tr ' ' '_'}
+rm -f $tmpfile
+if(~ $wanthtml y)
+	plumb 'https://en.wikipedia.org/wiki/'^$targ
+if not
+	hget 'https://en.wikipedia.org/api/rest_v1/page/pdf/'^$targ | page -w -p145
--- /dev/null
+++ b/wpqprompt.c
@@ -1,0 +1,58 @@
+#include <u.h>
+#include <libc.h>
+#include <json.h>
+
+void
+usage(void)
+{
+	fprint(2, "usage: %s wpqsearchfile\n", argv0);
+	exits("usage");
+}
+
+void
+main(int argc, char *argv[])
+{
+	JSON *obj, *res;
+	JSONEl *e;
+	char buf[8192], *targets[32];
+	int fd, n, i;
+
+	JSONfmtinstall();
+	ARGBEGIN{
+	default: usage();
+	}ARGEND;
+	if(argc != 1)
+		usage();
+	fd = open(argv[0], OREAD);
+	if((n = readn(fd, buf, sizeof(buf)-1)) <= 0)
+		sysfatal("read: %r");
+	buf[n] = 0;
+	close(fd);
+	obj = jsonparse(buf);
+	if(obj == nil || obj->t != JSONObject)
+		sysfatal("jsonparse: %r");
+	res = jsonbyname(obj, "result");
+	if(res == nil || res->t != JSONArray)
+		sysfatal("jsonbyname: %r");
+	if(res->first->next->val->first == nil)
+		sysfatal("no results");
+	for(e = res->first->next->val->first, i = 0; e != nil && i < nelem(targets); e = e->next, i++){
+		targets[i] = e->val->s;
+		fprint(2, "%d) %s\n", i+1, targets[i]);
+	}
+	if(i < 2)
+		n = i;
+	else{
+prompt:
+		fprint(2, "[1-%d]: ", i);
+		if((n = read(0, buf, sizeof(buf)-1)) <= 0)
+			sysfatal("read: %r");
+		buf[n] = 0;
+		n = strtol(buf, nil, 0);
+		if(n < 1 || n > i)
+			goto prompt;
+	}
+	print("%s\n", targets[n-1]);
+	jsonfree(obj);
+	exits(0);
+}