diff options
-rw-r--r-- | lisp/servall-wikipedia.el | 73 |
1 files changed, 66 insertions, 7 deletions
diff --git a/lisp/servall-wikipedia.el b/lisp/servall-wikipedia.el index 84385fa..060e10d 100644 --- a/lisp/servall-wikipedia.el +++ b/lisp/servall-wikipedia.el @@ -2,6 +2,10 @@ (require 'servall-client) (require 'servall-results) +(defvar servall-wikipedia-save-dir "/tmp/servall-wikipedia") +(defcustom servall-wikipedia-auto-save t + "If nonnil, auto-save wikipedia entry to `servall-wikipedia-save-dir'") + ;; wikipedia results (define-derived-mode servall-wikipedia-results-mode servall-results-mode "servall-wikipedia-results" @@ -45,6 +49,7 @@ (switch-to-buffer servall-results-buffer)) (defun servall-wikipedia-results-open () + (interactive) (when-let ((title (get-text-property (point) 'title))) (switch-to-buffer-other-window (servall-wikipedia-load title)))) @@ -52,39 +57,93 @@ (replace-regexp-in-string " " "_" title)) ;; wikipedia view +(org-link-set-parameters "wiki" + :follow #'servall-wikipedia-open-wikilink + :store #'servall-wikipedia-store-link) + +(defun servall-wikipedia-open-wikilink (title) + (let ((prev)) + (when (eq major-mode 'servall-wikipedia-view-mode) + (setq servall-wikipedia-history-next title + prev servall-wikipedia-title)) + (switch-to-buffer (servall-wikipedia-load title nil prev)))) + +(defun servall-wikipedia-store-link () + (when (eq major-mode 'servall-wikipedia-view-mode) + (let ((link (concat "wiki:" servall-wikipedia-title))) + (org-link-add-props :link link :description servall-wikipedia-title) + link))) + (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 "l" 'servall-wikipedia-history-back) (define-key map "n" 'org-next-visible-heading) (define-key map "p" 'org-previous-visible-heading) + (define-key map "r" 'servall-wikipedia-history-forward) map)) (defun servall-wikipedia-view-buffer (title) (format "*wikipedia %s*" title)) +(defun servall-wikipedia-history-back () + (interactive) + (if servall-wikipedia-history-prev + (switch-to-buffer + (servall-wikipedia-load servall-wikipedia-history-prev)) + (message "No previous entry."))) + +(defun servall-wikipedia-history-forward () + (interactive) + (if servall-wikipedia-history-next + (switch-to-buffer + (servall-wikipedia-load servall-wikipedia-history-next)) + (message "No next entry."))) + (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)) + servall-wikipedia-title nil + servall-wikipedia-history-prev nil + servall-wikipedia-history-next nil)) (defun servall-wikipedia-reload () (interactive) - (servall-wikipedia-load servall-wikipedia-title t)) + (let ((prev servall-wikipedia-history-prev) + (next servall-wikipedia-history-next)) + (servall-wikipedia-load servall-wikipedia-title t) + (setq servall-wikipedia-history-prev prev + servall-wikipedia-history-next next))) -(defun servall-wikipedia-load (title &optional force) +(defun servall-wikipedia-load (title &optional force prev) (let* ((buffer-name (servall-wikipedia-view-buffer title)) - (buffer (get-buffer buffer-name))) + (buffer (get-buffer buffer-name)) + (filename (format "%s/%s.org" servall-wikipedia-save-dir title))) (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) + (setq servall-wikipedia-title title + servall-wikipedia-history-prev prev) (let ((inhibit-read-only t)) (erase-buffer) - (insert "* " title "\n") - (insert (servall-api-wikipedia-org title))) + (if (and (file-exists-p filename) (not force)) + (insert-file-contents filename) + (insert "* " title "\n") + (insert (servall-api-wikipedia-org title)) + (servall-wikipedia-fix-tables) + (when servall-wikipedia-auto-save + (write-region (point-min) (point-max) filename)))) (goto-char (point-min)))) buffer)) +(defun servall-wikipedia-fix-tables () + (let ((inhibit-read-only t)) + (save-excursion + (goto-char (point-min)) + (while (re-search-forward org-table-any-line-regexp nil t) + (org-cycle) + (re-search-forward org-table-border-regexp))))) + (provide 'servall-wikipedia) |