diff options
Diffstat (limited to 'lisp/servall-wikipedia.el')
-rw-r--r-- | lisp/servall-wikipedia.el | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/lisp/servall-wikipedia.el b/lisp/servall-wikipedia.el new file mode 100644 index 0000000..978e902 --- /dev/null +++ b/lisp/servall-wikipedia.el @@ -0,0 +1,102 @@ +;; -*- lexical-binding: t; -*- + +(defvar servall-results-mode-map special-mode-map) +(defvar servall-results-buffer "*servall-results*") + +(define-derived-mode servall-results-mode org-mode "servall-results" + "Mode for showing and selecting results" + (setq-local buffer-read-only t + servall-results-update-function nil + servall-results-re-search-function nil + servall-results-open-function nil)) + +(defun servall-results-update () + (interactive) + (funcall servall-results-update-function)) + +(defun servall-results-re-search () + (interactive) + (call-interactively servall-results-re-search-function)) + +(defun servall-results-open () + (interactive) + (funcall servall-results-open-function)) + +(define-key servall-results-mode-map "n" 'org-next-visible-heading) +(define-key servall-results-mode-map "g" 'servall-results-update) +(define-key servall-results-mode-map "\r" 'servall-results-open) +(define-key servall-results-mode-map "p" 'org-previous-visible-heading) +(define-key servall-results-mode-map "s" 'servall-results-re-search) + +(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)) + +(defvar servall-wikipedia-view-mode-map special-mode-map) +(defun servall-wikipedia-view-buffer (title) + (format "*wikipedia %s*" title)) + +(defvar servall-wikipedia-view-mode-map special-mode-map) + +(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-load (title) + (let ((buffer (get-buffer-create (servall-wikipedia-view-buffer title)))) + (with-current-buffer buffer + (servall-wikipedia-view-mode) + (setq servall-wikipedia-title title) + (let ((inhibit-read-only t)) + (erase-buffer) + (insert (servall-api-wikipedia-org title))) + (goto-char (point-min))) + buffer)) + +(provide 'servall-wikipedia) |