aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYuchen Pei <id@ypei.org>2023-07-24 12:52:19 +1000
committerYuchen Pei <id@ypei.org>2023-07-24 12:52:19 +1000
commit78672bd3ccd71e36cd99d57b244213a37a8bf32e (patch)
tree489f1d7672c09b07d17600d89d9a280fad368135
parentb2416995f4c1c29a3caf192c01193ae012857431 (diff)
Adding more defaults in wiki site info.
- add mandatory host, and base-url is by default computed from host - add api-base-url for api base url, only applicable to mediawiki now - compute display name from site id by default
-rw-r--r--wiki-engine.el93
-rw-r--r--wiki-utils.el64
2 files changed, 103 insertions, 54 deletions
diff --git a/wiki-engine.el b/wiki-engine.el
index dd72ce4..242c6d4 100644
--- a/wiki-engine.el
+++ b/wiki-engine.el
@@ -35,7 +35,8 @@
(defun wiki-engine-html-url (site title)
"Return the url of the html webpage of TITLE on SITE."
- (format "%s%s" (plist-get (alist-get site wiki-sites) :base-url)
+ (format "%s/%s" (wiki-engine-compute-base-url
+ (alist-get site wiki-sites))
title))
(defun wiki-current-html-url ()
@@ -53,6 +54,9 @@ A non-nil TITLE overrides title inferred from the url."
(let ((cb (lambda (status)
(wiki-save-fetched-and-switch status title dir)
(when callback (funcall callback)))))
+ (with-current-buffer (get-buffer-create wiki-client-buffer-name)
+ (goto-char (point-max))
+ (insert "[" (current-time-string) "] Request: " url "\n"))
(url-retrieve url cb))
)
@@ -71,6 +75,12 @@ A non-nil TITLE overrides title inferred from the url."
"If STATUS is ok, insert response payload to TITLE under DIR.
And switch to the corresponding buffer."
+ (with-current-buffer wiki-client-buffer-name
+ (insert "[" (current-time-string) "] Response: "
+ (if (plist-get status :error)
+ (format "%s" (car (last (plist-get status :error))))
+ "200")
+ "\n"))
(when (plist-get status :error)
(error "Wiki fetch failed: %s" (plist-get status :error)))
(wiki-delete-http-header)
@@ -78,18 +88,48 @@ And switch to the corresponding buffer."
(_ (kill-buffer)))
(wiki-save-string-and-switch to-insert title dir)))
-(defun wiki-compute-engine (site-info)
+(defun wiki-engine-compute-engine (site-info)
"Return :engine of SITE-INFO, or the default engine."
(or (plist-get site-info :engine) wiki-default-engine))
+(defun wiki-engine-compute-display-name (site-id site-info)
+ "Return :display-name of SITE-INFO, or the default from SITE-ID."
+ (or (plist-get site-info :display-name)
+ (let ((name
+ (replace-regexp-in-string
+ "-" " " (capitalize (format "%s" site-id)))))
+ (if (string-suffix-p " Wiki" name)
+ name
+ (format "%s Wiki" name)))))
+
+(defun wiki-engine-compute-base-url (site-info)
+ "Return :base-url of SITE-INFO, or engine-specific default."
+ (or (plist-get site-info :base-url)
+ (let ((host (plist-get site-info :host)))
+ (pcase (wiki-engine-compute-engine site-info)
+ ('mediawiki (format "%s/wiki" host))
+ ('moinmoin host)
+ ('oddmuse (format "%s/wiki" host))
+ (_ (error "Unknown engine: %s" engine))))))
+
+(defun wiki-engine-compute-api-base-url (site-info)
+ "Return :api-base-url of SITE-INFO, or engine-specific default."
+ (or (plist-get site-info :api-base-url)
+ (let ((host (plist-get site-info :host)))
+ (pcase (wiki-engine-compute-engine site-info)
+ ('mediawiki (format "%s/w" host))
+ ('moinmoin (error "API not supported for engine: %s" engine))
+ ('oddmuse (error "API not supported for engine: %s" engine))
+ (_ (error "Unknown engine: %s" engine))))))
+
(defun wiki-engine-wiki-url (site title)
"Construct the url to fetch wiki of TITLE from SITE."
(let* ((site-info (alist-get site wiki-sites))
- (engine (wiki-compute-engine site-info))
- (base-url (plist-get site-info :base-url)))
+ (engine (wiki-engine-compute-engine site-info))
+ (base-url (wiki-engine-compute-base-url site-info)))
(pcase engine
- ('mediawiki (format "%s%s?action=raw" base-url title))
- ('moinmoin (format "%s%s?action=raw" base-url title))
+ ('mediawiki (format "%s/%s?action=raw" base-url title))
+ ('moinmoin (format "%s/%s?action=raw" base-url title))
('oddmuse (format "%s?action=download;id=%s" base-url title))
(_ (error "Unknown engine: %s" engine)))))
@@ -100,7 +140,7 @@ If the site has a `local' engine, \"fetch\" locally. Otherwise,
if `wiki-fetch-prefer-local' is non-nil, try fetching locally,
and if the title cannot be found locally, fetch remotely."
(when (string-empty-p title) (setq title "Main Page"))
- (let* ((engine (wiki-compute-engine (alist-get site-id wiki-sites)))
+ (let* ((engine (wiki-engine-compute-engine (alist-get site-id wiki-sites)))
(found-local
(when (or wiki-fetch-prefer-local (eq engine 'local))
(wiki-find-file title (wiki-locate-dir site-id)
@@ -116,17 +156,28 @@ and if the title cannot be found locally, fetch remotely."
(setq-local wiki-site site-id
wiki-title title))))))
-(defun wiki-engine-mediawiki-api-wiki (base-url title)
+(defun wiki-engine-mediawiki-api-wiki (api-base-url title)
+ "Fetch the wikitext of TITLE using json api.
+
+API-BASE-URL is the base url for the api request."
+ (wiki-url-fetch-json
+ (format
+ "%s/api.php?action=query&format=json&titles=%s&prop=revisions&rvprop=content&rvslots=main"
+ api-base-url title)))
+
+(defun wiki-engine-mediawiki-api-search (api-base-url query)
(wiki-url-fetch-json
(format
- "%sapi.php?action=query&format=json&titles=%s&prop=revisions&rvprop=content&rvslots=main"
- base-url title)))
+ "%s/api.php?action=query&format=json&list=search&srsearch=%s"
+ api-base-url query)))
(defun wiki-engine-mediawiki-api-fetch (site-id title)
"Fetch TITLE from site with SITE-ID using mediawiki api."
(when (string-empty-p title) (setq title "Main Page"))
- (let* ((engine (wiki-compute-engine (alist-get site-id wiki-sites)))
- (base-url (plist-get (alist-get site-id wiki-sites) :base-url))
+ (let* ((engine (wiki-engine-compute-engine
+ (alist-get site-id wiki-sites)))
+ (api-base-url (wiki-engine-compute-api-base-url
+ (alist-get site-id wiki-sites)))
(found-local
(when (or wiki-fetch-prefer-local (eq engine 'local))
(wiki-find-file title (wiki-locate-dir site-id)
@@ -145,10 +196,8 @@ and if the title cannot be found locally, fetch remotely."
(alist-get
'pages (alist-get
'query
- (wiki-url-fetch-json
- (wiki-engine-mediawiki-api-wiki
- base-url title)
- ))))))
+ (wiki-engine-mediawiki-api-wiki
+ api-base-url title))))))
0))))
title
(wiki-locate-dir site-id))
@@ -189,7 +238,8 @@ DIR defaults to `default-directory'."
'wiki-engine-simple-fetch)))
`(defun ,(wiki-site-fetcher id) (title)
(interactive ,(format "sFetch title for %s: "
- (plist-get info :display-name)))
+ (wiki-engine-compute-display-name
+ id info)))
(,engine-fetcher ',id title)))))
(seq-filter #'cdr wiki-sites)
)))
@@ -205,12 +255,15 @@ If URL points to html title, open the corresponding raw title."
((found-site
(seq-find
(lambda (site-pair)
- (when-let ((base-url (plist-get (cdr site-pair) :base-url)))
- (string-prefix-p base-url url)))
+ (when-let ((base-url (wiki-engine-compute-base-url
+ (cdr site-pair))))
+ (string-prefix-p (format "%s/" base-url) url)))
wiki-sites)))
(pcase-let ((`(,site-id . ,site-info) found-site))
(funcall (wiki-site-fetcher site-id)
- (string-remove-prefix (plist-get site-info :base-url) url))))
+ (string-remove-prefix
+ (format "%s/" (wiki-engine-compute-base-url site-info))
+ url))))
)
(provide 'wiki-engine)
diff --git a/wiki-utils.el b/wiki-utils.el
index 8408a4c..fd5a0bc 100644
--- a/wiki-utils.el
+++ b/wiki-utils.el
@@ -59,56 +59,52 @@ Assuming the current buffer to be a `url-retrieve' response buffer."
(re-search-forward "\r?\n\r?\n"))
;; TODO: generalise fandom
-;; TODO: default engine to mediawiki
+;; mandatory fields: id and host
(defvar wiki-sites
'((local)
- (archwiki :base-url "https://wiki.archlinux.org/title/"
+ (archwiki :host "https://wiki.archlinux.org"
+ :base-url "https://wiki.archlinux.org/title"
:display-name "ArchWiki")
- (debian-wiki :base-url "https://wiki.debian.org/"
- :engine moinmoin
- :display-name "Debian Wiki")
- (emacswiki :base-url "https://www.emacswiki.org/emacs/"
+ (debian-wiki :host "https://wiki.debian.org"
+ :engine moinmoin)
+ (emacswiki :host "https://www.emacswiki.org"
+ :base-url "https://www.emacswiki.org/emacs"
:engine oddmuse
:display-name "EmacsWiki")
- (esp :base-url "https://wiki.endsoftwarepatents.org/wiki/"
+ (esp :host "https://wiki.endsoftwarepatents.org"
:display-name "ESP Wiki")
- (fandom-recipes :base-url "https://recipes.fandom.com/wiki/"
- :display-name "Fandom Recipes Wiki")
- (fsd :base-url "https://directory.fsf.org/wiki/"
+ (fandom-recipes :host "https://recipes.fandom.com")
+ (fsd :host "https://directory.fsf.org"
:display-name "Free Software Directory")
- (haskell-wiki :base-url "https://wiki.haskell.org/"
- :display-name "Haskell Wiki")
- (libreplanet :base-url "https://libreplanet.org/wiki/"
- :display-name "Libreplanet Wiki")
- (oddmuse :base-url "https://oddmuse.org/wiki/"
+ (haskell-wiki :host "https://wiki.haskell.org")
+ (libreplanet :host "https://libreplanet.org")
+ (oddmuse :host "https://oddmuse.org"
:engine oddmuse
:display-name "Oddmuse")
- (parabolawiki :base-url "https://wiki.parabola.nu/"
+ (parabolawiki :host "https://wiki.parabola.nu"
:display-name "ParabolaWiki")
- (python-wiki :base-url "https://wiki.python.org/moin/"
- :engine moinmoin
- :display-name "Python Wiki")
- (termux-wiki :base-url "https://wiki.termux.com/wiki/"
- :display-name "Termux Wiki")
- (ubuntu-wiki :base-url "https://wiki.ubuntu.com/"
- :engine moinmoin
- :display-name "Ubuntu Wiki")
- (ubuntu-community-help-wiki
- :base-url "https://help.ubuntu.com/community/"
- :engine moinmoin
- :display-name "Ubuntu Community Help Wiki")
- (wikihow :base-url "https://www.wikihow.com/"
+ (python-wiki :host "https://wiki.python.org"
+ :base-url "https://wiki.python.org/moin"
+ :engine moinmoin)
+ (termux-wiki :host "https://wiki.termux.com")
+ (ubuntu-wiki :host "https://wiki.ubuntu.com"
+ :engine moinmoin)
+ (ubuntu-community-help-wiki :host "https://help.ubuntu.com/community"
+ :engine moinmoin)
+ (wikihow :host "https://www.wikihow.com"
+ :api-base-url "https://www.wikihow.com"
:display-name "wikiHow"
:fetcher wiki-engine-mediawiki-api-fetch)
- (wikiindex :base-url "https://wikiindex.org/"
+ (wikiindex :host "https://wikiindex.org"
+ :base-url "https://wikiindex.org"
:display-name "WikiIndex")
- (wikipedia-en :base-url "https://en.wikipedia.org/wiki/"
+ (wikipedia-en :host "https://en.wikipedia.org"
:display-name "Wikipedia EN")
- (wikipedia-zh :base-url "https://zh.wikipedia.org/wiki/"
+ (wikipedia-zh :host "https://zh.wikipedia.org"
:display-name "Wikipedia ZH")
- (wikivoyage-en :base-url "https://en.wikivoyage.org/wiki/"
+ (wikivoyage-en :host "https://en.wikivoyage.org"
:display-name "Wikivoyage EN")
- (wiktionary-en :base-url "https://en.wiktionary.org/wiki/"
+ (wiktionary-en :host "https://en.wiktionary.org"
:display-name "Wiktionary EN")
)
"Alist of wiki sites.