summaryrefslogtreecommitdiff
path: root/lisp/servall-wikipedia.el
blob: 84385fad4ea04efc8969dd26f61e5db8e4fd492b (plain) (blame)
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
;; -*- lexical-binding: t; -*-
(require 'servall-client)
(require 'servall-results)

;; wikipedia results
(define-derived-mode servall-wikipedia-results-mode servall-results-mode
  "servall-wikipedia-results"
  "Mode for showing and selecting wikipedia results"
  (setq-local servall-wikipedia-results-query nil))

(defun servall-wikipedia-results-highlight ()
  (save-excursion
    (goto-char (point-min))
    (while (re-search-forward "<span class=\"searchmatch\">\\(.*?\\)</span>" nil t)
      (replace-match
       (propertize (match-string 1) 'font-lock-face 'match)))))

(defun servall-wikipedia-results-update ()
  (let* ((resp (servall-api-wikipedia-search servall-wikipedia-results-query))
         (results (alist-get 'search
                             (alist-get 'query resp)))
         (inhibit-read-only t))
    (erase-buffer)
    (mapc
     (lambda (result)
       (let ((title (alist-get 'title result)))
         (insert
          (propertize
           (concat "* " title "\n")
           'title title))
         (insert (alist-get 'snippet result) "\n\n")))
     results)
    (servall-wikipedia-results-highlight)
    (goto-char (point-min))))

(defun servall-wikipedia-search (query)
  (interactive "sWikipedia Query: ")
  (with-current-buffer (get-buffer-create servall-results-buffer)
    (servall-wikipedia-results-mode)
    (setq servall-wikipedia-results-query query
          servall-results-update-function 'servall-wikipedia-results-update
          servall-results-re-search-function 'servall-wikipedia-search
          servall-results-open-function 'servall-wikipedia-results-open)
    (servall-results-update))
  (switch-to-buffer servall-results-buffer))

(defun servall-wikipedia-results-open ()
  (when-let ((title (get-text-property (point) 'title)))
    (switch-to-buffer-other-window (servall-wikipedia-load title))))

(defun servall-wikipedia-to-name (title)
  (replace-regexp-in-string " " "_" title))

;; wikipedia view
(defvar servall-wikipedia-view-mode-map
  (let ((map (make-sparse-keymap)))
    (setq map (copy-keymap special-mode-map))
    (define-key map "g" 'servall-wikipedia-reload)
    (define-key map "n" 'org-next-visible-heading)
    (define-key map "p" 'org-previous-visible-heading)
    map))
(defun servall-wikipedia-view-buffer (title)
  (format "*wikipedia %s*" title))

(define-derived-mode servall-wikipedia-view-mode org-mode
  "servall-wikipedia-view"
  "Mode for viewing wikipedia entries."
  (setq-local buffer-read-only t
              servall-wikipedia-title nil))

(defun servall-wikipedia-reload ()
  (interactive)
  (servall-wikipedia-load servall-wikipedia-title t))

(defun servall-wikipedia-load (title &optional force)
  (let* ((buffer-name (servall-wikipedia-view-buffer title))
         (buffer (get-buffer buffer-name)))
    (unless (and buffer (not force))
      (setq buffer (get-buffer-create buffer-name))
      (with-current-buffer buffer
        (servall-wikipedia-view-mode)
        (setq servall-wikipedia-title title)
        (let ((inhibit-read-only t))
          (erase-buffer)
          (insert "* " title "\n")
          (insert (servall-api-wikipedia-org title)))
        (goto-char (point-min))))
    buffer))

(provide 'servall-wikipedia)