aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYuchen Pei <id@ypei.org>2023-07-09 22:37:52 +1000
committerYuchen Pei <id@ypei.org>2023-07-09 22:37:52 +1000
commitfe1374efae651f914636fd0575f877837136f0d5 (patch)
tree4da4658a6ecbbdf1a0f71c6a1025c8c28f2a3a44
parente4c70093406cf2140782683717dab78093c387ac (diff)
Browsing and navigating with various wiki engines
-rw-r--r--wiki-engine.el49
-rw-r--r--wiki-markup.el12
-rw-r--r--wiki-utils.el23
3 files changed, 66 insertions, 18 deletions
diff --git a/wiki-engine.el b/wiki-engine.el
index a9f65d5..f878c30 100644
--- a/wiki-engine.el
+++ b/wiki-engine.el
@@ -26,22 +26,41 @@
;;; Code:
(require 'wiki-utils)
+(require 'wiki-markup)
-(defun wiki-make-wikilink-url (title))
-
-(defun wiki-engine-mediawiki-fetch (base-url title fetcher)
- "Fetch a mediawiki entry describing TITLE."
- (wiki-fetch-url
- (format "%s%s?action=raw" base-url title)
- (lambda ()
- (wiki-mode)
- (setq-local wiki-fetcher fetcher)
- )))
-
-(defun wiki-wikipedia-fetch (title)
- (interactive "sFetch wiki title: ")
- (wiki-engine-mediawiki-fetch "https://en.wikipedia.org/wiki/" title
- 'wiki-wikipedia-fetch))
+(defun wiki-engine-mediawiki-fetch (wiki-site title)
+ "Fetch a mediawiki entry describing TITLE.
+
+The site name is passed as a symbol WIKI-SITE."
+ (let ((wiki-site-info (alist-get wiki-site wiki-sites)))
+ (cl-assert (eq (plist-get wiki-site-info :engine) 'mediawiki))
+ (wiki-fetch-url
+ (format "%s%s?action=raw"
+ (plist-get wiki-site-info :base-url)
+ title)
+ (lambda ()
+ (wiki-mode)
+ (setq-local wiki-site wiki-site)
+ ))))
+
+(defun wiki-engine-fetcher (wiki-site-info)
+ (intern (format "wiki-engine-%s-fetch"
+ (plist-get wiki-site-info :engine))))
+
+(defmacro defun-wiki-fetchers ()
+ (cons 'progn
+ (mapcar
+ (lambda (pair)
+ (pcase-let ((`(,id . ,info) pair))
+ `(defun ,(wiki-site-fetcher id) (title)
+ (interactive ,(format "sFetch title for %s: "
+ (plist-get info :display-name)))
+ (,(wiki-engine-fetcher info) ',id title))))
+ (seq-filter #'cdr
+ wiki-sites)
+ )))
+
+(defun-wiki-fetchers)
(provide 'wiki-engine)
;;; wiki-engine.el ends here
diff --git a/wiki-markup.el b/wiki-markup.el
index 23888d3..d9cc2c9 100644
--- a/wiki-markup.el
+++ b/wiki-markup.el
@@ -68,11 +68,11 @@
(defvar wiki-outline-regexp "=+.*=+\ *$")
-(defvar-local wiki-fetcher nil
- "Buffer-local function to fetch a wiki title")
+(defvar-local wiki-site nil
+ "The identifier of the wiki site")
(defun wiki-follow-wikilink-action (data)
"Button action to follow a wikilink"
- (funcall wiki-fetcher (alist-get 'title data)))
+ (funcall (wiki-site-fetcher wiki-site) (alist-get 'title data)))
(defun wiki-outline-level ()
(when (looking-at "\\(=+\\).*[^=]\\(=+\\)\\ *$")
@@ -127,5 +127,11 @@
(setq-local outline-level 'wiki-outline-level)
)
+(defun set-wiki-site (wiki-site)
+ (interactive (list
+ (completing-read "Set wiki site: "
+ (mapcar 'car wiki-sites))))
+ (setq-local wiki-site (intern wiki-site)))
+
(provide 'wiki-markup)
;;; wiki-markup.el ends here
diff --git a/wiki-utils.el b/wiki-utils.el
index 53b7bd0..26e25b7 100644
--- a/wiki-utils.el
+++ b/wiki-utils.el
@@ -64,5 +64,28 @@ Then calls CALLBACK which is a closure taking no argument."
(car (url-path-and-query (url-generic-parse-url
(url-unhex-string url)))))))
+(defvar wiki-sites
+ '((local)
+ (wikipedia-en :base-url "https://en.wikipedia.org/wiki/"
+ :engine mediawiki
+ :display-name "Wikipedia EN")
+ (wiktionary-en :base-url "https://en.wiktionary.org/wiki/"
+ :engine mediawiki
+ :display-name "Wiktionary EN")
+ (emacswiki :base-url "https://www.emacswiki.org/emacs/"
+ :engine oddmuse
+ :display-name "EmacsWiki")
+ (debianwiki :base-url "https://wiki.debian.org/"
+ :engine moinmoin
+ :display-name "Debian Wiki"))
+ "Alist of wiki sites.
+
+Each item is in the form of (identifier . properties), where
+identifier is a symbol, and properties is a plist of the site.
+One of the sites is (local), meaning a local filesystem.")
+
+(defun wiki-site-fetcher (wiki-site)
+ (intern (format "wiki-%s-fetch" wiki-site)))
+
(provide 'wiki-utils)
;;; wiki-utils.el ends here