blob: aa2262432e42237d33865b450c8fdf3cf9012290 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
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
|