aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYuchen Pei <id@ypei.org>2023-07-10 13:48:16 +1000
committerYuchen Pei <id@ypei.org>2023-07-10 13:48:16 +1000
commitfe9c1a19d71ab757b9a20e0f601b80b2ac7761c6 (patch)
treeeafd38a336645d0131c1b4634402401839bf4f29
parent161752ee1943dbb25060a1488086da1a00aeaadb (diff)
Enhance local navigation.
Add `wiki-find-file' to open a local file in wiki-mode. Guess the wikisite id based on the default directory.
-rw-r--r--wiki-engine.el58
-rw-r--r--wiki-markup.el13
-rw-r--r--wiki-utils.el4
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