From fe1374efae651f914636fd0575f877837136f0d5 Mon Sep 17 00:00:00 2001 From: Yuchen Pei Date: Sun, 9 Jul 2023 22:37:52 +1000 Subject: Browsing and navigating with various wiki engines --- wiki-engine.el | 49 ++++++++++++++++++++++++++++++++++--------------- wiki-markup.el | 12 +++++++++--- wiki-utils.el | 23 +++++++++++++++++++++++ 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 -- cgit v1.2.3