summaryrefslogtreecommitdiff
path: root/src/gizmo/wasp-wikipedia.el
blob: 8f9f1580fbb27e4c054c510dae3a414eeb4e6a95 (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
72
73
74
;;; 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* ( ((ht-p w/wikipedia-last-response))
                     (query (ht-get w/wikipedia-last-response "query"))
                     (prepages (ht-get query "pages"))
                     (pages (car (ht-values prepages)))
                     (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/chat-write-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