ref: fac705ddaf2ae19afd8d1791c0c94cfc696c03e2
author: rodri <rgl@antares-labs.eu>
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);
+}