summaryrefslogtreecommitdiff
path: root/src/gizmo/wasp-wikipedia.el
diff options
context:
space:
mode:
Diffstat (limited to 'src/gizmo/wasp-wikipedia.el')
-rw-r--r--src/gizmo/wasp-wikipedia.el71
1 files changed, 71 insertions, 0 deletions
diff --git a/src/gizmo/wasp-wikipedia.el b/src/gizmo/wasp-wikipedia.el
new file mode 100644
index 00000000..aa226243
--- /dev/null
+++ b/src/gizmo/wasp-wikipedia.el
@@ -0,0 +1,71 @@
+;;; wasp-wikipedia --- Wikipedia integration -*- lexical-binding: t; -*-
+;;; Commentary:
+;;; Code:
+
+(require 'dash)
+(require 's)
+(require 'f)
+(require 'ht)
+(require 'json)
+(require 'request)
+(require 'dom)
+(require 'wasp-utils)
+(require 'wasp-chat)
+
+(defcustom w/wikipedia-query-base "https://en.wikipedia.org/w/api.php?action=query&prop=extracts&format=json&exintro=1&titles="
+ "Base URL for Wikipedia query."
+ :type '(string)
+ :group 'wasp)
+
+(defvar w/wikipedia-last-response nil)
+
+(defun w/fetch-wikipedia (page k)
+ "Retrieve PAGE from Wikipedia.
+Pass the resulting article summary to K."
+ (let ((pagename (if (s-contains? "://" page) (url-file-nondirectory page) page)))
+ (request
+ (s-concat w/wikipedia-query-base (url-encode-url pagename))
+ :type "GET"
+ :parser #'json-parse-buffer
+ :success
+ (cl-function
+ (lambda (&key data &allow-other-keys)
+
+ (setq w/wikipedia-last-response data)
+ (if-let ((pages (car (ht-values (ht-get (ht-get w/wikipedia-last-response "query") "pages"))))
+ (ext (ht-get pages "extract"))
+ (dom (with-temp-buffer (insert ext) (libxml-parse-html-region (point-min) (point-max))))
+ )
+ (funcall k (s-trim (dom-texts dom)))
+ (w/write-chat-event (format "Could not find Wikipedia page: %s" pagename))))))
+ nil))
+
+(defcustom w/wiki-buffer "*wasp-wiki*"
+ "Name of buffer used to display wiki."
+ :type '(string)
+ :group 'wasp)
+
+(define-derived-mode w/wiki-mode special-mode "Wikipedia"
+ "Major mode for displaying wiki."
+ :group 'wasp)
+
+(defun w/get-wiki-buffer ()
+ "Return the wiki buffer."
+ (unless (get-buffer w/wiki-buffer)
+ (with-current-buffer (get-buffer-create w/wiki-buffer)
+ (w/wiki-mode)))
+ (get-buffer w/wiki-buffer))
+
+(defun w/wikipedia-summary (page)
+ "Display a summary of PAGE from Wikipedia."
+ (w/fetch-wikipedia
+ page
+ (lambda (sum)
+ (with-current-buffer (w/get-wiki-buffer)
+ (let ((inhibit-read-only t))
+ (erase-buffer)
+ (w/write-line sum)))))
+ )
+
+(provide 'wasp-wikipedia)
+;;; wasp-wikipedia.el ends here