From fe9c1a19d71ab757b9a20e0f601b80b2ac7761c6 Mon Sep 17 00:00:00 2001 From: Yuchen Pei Date: Mon, 10 Jul 2023 13:48:16 +1000 Subject: Enhance local navigation. Add `wiki-find-file' to open a local file in wiki-mode. Guess the wikisite id based on the default directory. --- wiki-engine.el | 58 ++++++++++++++++++++++++++++++++++------------------------ wiki-markup.el | 13 +++++++++++++ wiki-utils.el | 4 +++- 3 files changed, 50 insertions(+), 25 deletions(-) diff --git a/wiki-engine.el b/wiki-engine.el index fb48994..74c27e0 100644 --- a/wiki-engine.el +++ b/wiki-engine.el @@ -33,12 +33,12 @@ (defun wiki-engine-mediawiki-fetch (wiki-site title) "Fetch a mediawiki entry describing TITLE. -The site name is passed as a symbol WIKI-SITE." +The site handle 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)) (when (string-empty-p title) (setq title "Main Page")) (unless (and wiki-fetch-prefer-local - (wiki-local-find-file + (wiki-find-file title (wiki-locate-dir wiki-site))) (wiki-fetch-url @@ -55,42 +55,51 @@ The site name is passed as a symbol WIKI-SITE." (defun wiki-engine-oddmuse-fetch (wiki-site title) (let ((wiki-site-info (alist-get wiki-site wiki-sites))) (cl-assert (eq (plist-get wiki-site-info :engine) 'oddmuse)) - (wiki-fetch-url - (format "%s?action=download;id=%s" - (plist-get wiki-site-info :base-url) - title) - (wiki-locate-dir wiki-site) - (lambda () - (wiki-mode) - (setq-local wiki-site wiki-site) - ) - title))) + (unless (and wiki-fetch-prefer-local + (wiki-find-file + title + (wiki-locate-dir wiki-site))) + (wiki-fetch-url + (format "%s?action=download;id=%s" + (plist-get wiki-site-info :base-url) + title) + (wiki-locate-dir wiki-site) + (lambda () + (wiki-mode) + (setq-local wiki-site wiki-site) + ) + title)))) (defun wiki-engine-moinmoin-fetch (wiki-site title) (let ((wiki-site-info (alist-get wiki-site wiki-sites))) (cl-assert (eq (plist-get wiki-site-info :engine) 'moinmoin)) - (wiki-fetch-url - (format "%s%s?action=raw" - (plist-get wiki-site-info :base-url) - title) - (wiki-locate-dir wiki-site) - (lambda () - (wiki-mode) - (setq-local wiki-site wiki-site) - ) - title))) + (unless (and wiki-fetch-prefer-local + (wiki-find-file + title + (wiki-locate-dir wiki-site))) + (wiki-fetch-url + (format "%s%s?action=raw" + (plist-get wiki-site-info :base-url) + title) + (wiki-locate-dir wiki-site) + (lambda () + (wiki-mode) + (setq-local wiki-site wiki-site) + ) + title)))) (defun wiki-locate-dir (wiki-site) "Locate the directory for a WIKI-SITE." (expand-file-name (format "%s" wiki-site) wiki-local-dir)) -(defun wiki-local-find-file (title &optional dir create-if-not-exists - extension) +(defun wiki-find-file (title &optional dir create-if-not-exists + extension) "Find local TITLE in DIR. Returns the file-name if success, and nil otherwise. If CREATE-IF-NOT-EXISTS is non-nil, creates the file is not found. DIR defaults to `default-directory'." + (interactive (list (read-file-name "Find wiki file: "))) (unless dir (setq dir default-directory)) (let ((file-name (expand-file-name (if extension @@ -99,6 +108,7 @@ DIR defaults to `default-directory'." dir))) (when (or (file-exists-p file-name) create-if-not-exists) (find-file file-name) + (wiki-mode) file-name))) (defun wiki-engine-fetcher (wiki-site-info) diff --git a/wiki-markup.el b/wiki-markup.el index 341610a..d146c18 100644 --- a/wiki-markup.el +++ b/wiki-markup.el @@ -68,12 +68,25 @@ (defvar wiki-outline-regexp "=+.*=+\ *$") +(defvar wiki-mode-hook '(wiki-guess-site)) + (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-site-fetcher wiki-site) (alist-get 'title data))) +(defun wiki-guess-site () + "Guess the wiki-site from the default directory." + (setq-local wiki-site + (let ((guessed + (intern (file-name-base + (directory-file-name default-directory))))) + (if (alist-get guessed wiki-sites) + guessed + 'local))) + ) + (defun wiki-outline-level () (when (looking-at "\\(=+\\).*[^=]\\(=+\\)\\ *$") (min (length (match-string 1)) diff --git a/wiki-utils.el b/wiki-utils.el index c2500a4..dde7edc 100644 --- a/wiki-utils.el +++ b/wiki-utils.el @@ -132,7 +132,9 @@ 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))) + (if wiki-site + (intern (format "wiki-%s-fetch" wiki-site)) + 'wiki-find-file)) (provide 'wiki-utils) ;;; wiki-utils.el ends here -- cgit v1.2.3