;;; wiki-engine.el -- client to wiki engines -*- lexical-binding: t -*- ;; Copyright (C) 2023 Free Software Foundation. ;; Author: Yuchen Pei ;; Package-Requires: ((emacs "28.2")) ;; This file is part of wiki.el. ;; wiki.el is free software: you can redistribute it and/or modify it under ;; the terms of the GNU Affero General Public License as published by ;; the Free Software Foundation, either version 3 of the License, or ;; (at your option) any later version. ;; wiki.el is distributed in the hope that it will be useful, but WITHOUT ;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General ;; Public License for more details. ;; You should have received a copy of the GNU Affero General Public ;; License along with wiki.el. If not, see . ;;; Commentary: ;; client to wiki engines, wiki server software. ;;; Code: (require 'wiki-utils) (require 'wiki-markup) (defun wiki-engine-mediawiki-fetch (wiki-site title) "Fetch a mediawiki entry describing TITLE. 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)) (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) ) title))) (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) (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) (lambda () (wiki-mode) (setq-local wiki-site wiki-site) ) title))) (defun wiki-engine-fetcher (wiki-site-info) (intern (format "wiki-engine-%s-fetch" (plist-get wiki-site-info :engine)))) (defmacro defun-wiki-fetchers () (cons 'progn (mapcar (lambda (pair) (pcase-let ((`(,id . ,info) pair)) `(defun ,(wiki-site-fetcher id) (title) (interactive ,(format "sFetch title for %s: " (plist-get info :display-name))) (,(wiki-engine-fetcher info) ',id title)))) (seq-filter #'cdr wiki-sites) ))) (defun-wiki-fetchers) (defun wiki-open-url (url) "Open the wiki corresponding to URL. If URL points to html title, open the corresponding raw title. If URL points to a raw title, open directly. If URL points to a host, assume it is mediawiki try to open main page." (interactive "sURL: ") ) (provide 'wiki-engine) ;;; wiki-engine.el ends here