From 161752ee1943dbb25060a1488086da1a00aeaadb Mon Sep 17 00:00:00 2001 From: Yuchen Pei Date: Mon, 10 Jul 2023 13:12:18 +1000 Subject: Implement wiki-fetch-prefer-local --- wiki-engine.el | 46 +++++++++++++++++++++++++++++++++++++--------- wiki-utils.el | 4 ++-- 2 files changed, 39 insertions(+), 11 deletions(-) diff --git a/wiki-engine.el b/wiki-engine.el index b82b9aa..fb48994 100644 --- a/wiki-engine.el +++ b/wiki-engine.el @@ -37,15 +37,20 @@ 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)) (when (string-empty-p title) (setq title "Main Page")) - (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) - ) - ))) + (unless (and wiki-fetch-prefer-local + (wiki-local-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) + ) + )))) (defun wiki-engine-oddmuse-fetch (wiki-site title) (let ((wiki-site-info (alist-get wiki-site wiki-sites))) @@ -54,6 +59,7 @@ The site name is passed as a symbol WIKI-SITE." (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) @@ -67,12 +73,34 @@ The site name is passed as a symbol WIKI-SITE." (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) + "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'." + (unless dir (setq dir default-directory)) + (let ((file-name (expand-file-name + (if extension + (file-name-extension title extension) + title) + dir))) + (when (or (file-exists-p file-name) create-if-not-exists) + (find-file file-name) + file-name))) + (defun wiki-engine-fetcher (wiki-site-info) (intern (format "wiki-engine-%s-fetch" (plist-get wiki-site-info :engine)))) diff --git a/wiki-utils.el b/wiki-utils.el index 5b66075..c2500a4 100644 --- a/wiki-utils.el +++ b/wiki-utils.el @@ -34,14 +34,14 @@ "If non-nil, visit the local file if exists when instructed for fetching.") -(defun wiki-fetch-url (url &optional callback title) +(defun wiki-fetch-url (url dir &optional callback title) "Fetch URL asynchronously. Then calls CALLBACK which is a closure taking no argument." (interactive "sURL: ") (let ((file-name (expand-file-name (or title (wiki-make-file-name-from-url url)) - wiki-download-dir)) + dir)) (cb (lambda (status file-name) (wiki-fetch-url-save-and-switch status file-name) (when callback (funcall callback))))) -- cgit v1.2.3