From 78672bd3ccd71e36cd99d57b244213a37a8bf32e Mon Sep 17 00:00:00 2001 From: Yuchen Pei Date: Mon, 24 Jul 2023 12:52:19 +1000 Subject: 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 --- wiki-engine.el | 93 +++++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 73 insertions(+), 20 deletions(-) (limited to 'wiki-engine.el') 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) -- cgit v1.2.3