emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/kiwix 792215ed10 07/15: Support new upgraded kiwix-serv


From: ELPA Syncer
Subject: [elpa] externals/kiwix 792215ed10 07/15: Support new upgraded kiwix-serve index API
Date: Wed, 7 Dec 2022 19:58:02 -0500 (EST)

branch: externals/kiwix
commit 792215ed10bb9e5bf1713926f046adc08b14c018
Author: stardiviner <numbchild@gmail.com>
Commit: stardiviner <numbchild@gmail.com>

    Support new upgraded kiwix-serve index API
    
    The kiwix-serve version 3.2.0 changed kiwix libraries retrieve method.
---
 kiwix.el | 97 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 91 insertions(+), 6 deletions(-)

diff --git a/kiwix.el b/kiwix.el
index 67b232a726..2cd9f6f4da 100644
--- a/kiwix.el
+++ b/kiwix.el
@@ -93,6 +93,13 @@
           (const :tag "Local Docker Service" docker-local)
           (const :tag "Local kiwix-serve Service" kiwix-serve-local)))
 
+(defcustom kiwix-server-api-version "v2"
+  "The kiwix-serve homepage API version.
+- 3.1.0 :: v1
+- 3.2.0 :: v2"
+  :type 'string
+  :safe #'stringp)
+
 (defcustom kiwix-server-url "http://127.0.0.1";
   "Specify Kiwix server URL."
   :type 'string
@@ -150,8 +157,72 @@ Set it to ‘t’ will use Emacs built-in ‘completing-read’."
 (defun kiwix-get-libraries ()
   "Check out all available Kiwix libraries."
   (cond
+   ((and (eq kiwix-server-type 'docker-remote) (string-equal 
kiwix-server-api-version "v2"))
+    (let ((url (format "%s:%s/catalog/search" kiwix-server-url 
kiwix-server-port)))
+      (request url
+        :type "GET"
+        :sync t
+        :parser (lambda ()
+                  (if (libxml-available-p)
+                      (let ((xml-data (libxml-parse-xml-region (point-min) 
(point-max))))
+                        (setq kiwix-libraries
+                              (remove-if 'null
+                                         (mapcar
+                                          (lambda (cons)
+                                            (when (and (listp cons) (eq (car 
cons) 'entry))
+                                              (let* ((entry-xml cons)
+                                                     (title (caddr (assq 
'title entry-xml))) ; "title"
+                                                     (link_thumbnail (assq 
'href (cadr (assq 'link entry-xml))))
+                                                     (link_url_path (cdr
+                                                                     (assq 
'href
+                                                                           
(cadr
+                                                                            
(seq-find
+                                                                             
(lambda (element)
+                                                                               
(if (and (listp element) (eq (car element) 'link))
+                                                                               
    (if (string-equal (cdr (assq 'type (cadr element))) "text/html")
+                                                                               
        element)))
+                                                                             
entry-xml))))))
+                                                (string-trim-left 
link_url_path "/"))))
+                                          xml-data))))))
+        :error (cl-function
+                (lambda (&rest args &key error-thrown &allow-other-keys)
+                  (message "Function kiwix-get-libraries error.")))
+        :success (cl-function
+                  (lambda (&key _data &allow-other-keys)
+                    _data))
+        :status-code '((404 . (lambda (&rest _) (message (format "Endpoint %s 
does not exist." url))))
+                       (500 . (lambda (&rest _) (message (format "Error from 
%s." url))))))))
+   
+   ((and (eq kiwix-server-type 'docker-remote) (string-equal 
kiwix-server-api-version "v2"))
+    (let ((url (format "%s:%s/catalog/v2/categories" kiwix-server-url 
kiwix-server-port)))
+      (request url
+        :type "GET"
+        :sync t
+        :parser (lambda ()
+                  (if (libxml-available-p)
+                      (let ((xml-data (libxml-parse-xml-region (point-min) 
(point-max))))
+                        (setq kiwix-libraries
+                              (remove-if 'null
+                                         (mapcar
+                                          (lambda (cons)
+                                            (when (and (listp cons) (eq (car 
cons) 'entry))
+                                              (let* ((entry cons)
+                                                     (title (caddr (assq 
'title entry))) ; "title"
+                                                     (link (assq 'href (cadr 
(assq 'link cons)))) ; "/catalog/v2/entries?category=stack_exchange"
+                                                     )
+                                                title)))
+                                          xml-data))))))
+        :error (cl-function
+                (lambda (&rest args &key error-thrown &allow-other-keys)
+                  (message "Function kiwix-get-libraries error.")))
+        :success (cl-function
+                  (lambda (&key _data &allow-other-keys)
+                    _data))
+        :status-code '((404 . (lambda (&rest _) (message (format "Endpoint %s 
does not exist." url))))
+                       (500 . (lambda (&rest _) (message (format "Error from 
%s." url))))))))
+   
    ;; ZIM library files on remote Docker server, parse index HTML page.
-   ((eq kiwix-server-type 'docker-remote)
+   ((and (eq kiwix-server-type 'docker-remote) (string-equal 
kiwix-server-api-version "v1"))
     (let ((url (format "%s:%s" kiwix-server-url kiwix-server-port)))
       (request url
         :type "GET"
@@ -262,11 +333,25 @@ Set it to ‘t’ will use Emacs built-in ‘completing-read’."
 
 (defun kiwix-query (query &optional selected-library)
   "Search `QUERY' in `LIBRARY' with Kiwix."
-  (let* ((library (or selected-library (kiwix--get-library-name 
selected-library)))
-         (url (concat (format "%s:%s" kiwix-server-url kiwix-server-port)
-                      "/search?content=" library "&pattern=" 
(url-hexify-string query)))
-         (browse-url-browser-function kiwix-default-browser-function))
-    (browse-url url)))
+  (cond
+   ((and (eq kiwix-server-type 'docker-remote) (string-equal 
kiwix-server-api-version "v2"))
+    (let* ((library (or selected-library (kiwix--get-library-name 
selected-library)))
+           (url (concat (format "%s:%s" kiwix-server-url kiwix-server-port)
+                        "/" library "/A/" (url-hexify-string query)))
+           (browse-url-browser-function kiwix-default-browser-function))
+      (browse-url url)))
+   ((and (eq kiwix-server-type 'docker-remote) (string-equal 
kiwix-server-api-version "v1"))
+    (let* ((library (or selected-library (kiwix--get-library-name 
selected-library)))
+           (url (concat (format "%s:%s" kiwix-server-url kiwix-server-port)
+                        "/search?content=" library "&pattern=" 
(url-hexify-string query)))
+           (browse-url-browser-function kiwix-default-browser-function))
+      (browse-url url)))
+   (t
+    (let* ((library (or selected-library (kiwix--get-library-name 
selected-library)))
+           (url (concat (format "%s:%s" kiwix-server-url kiwix-server-port)
+                        "/search?content=" library "&pattern=" 
(url-hexify-string query)))
+           (browse-url-browser-function kiwix-default-browser-function))
+      (browse-url url)))))
 
 (defun kiwix-docker-check ()
   "Make sure Docker image 'kiwix/kiwix-server' is available."



reply via email to

[Prev in Thread] Current Thread [Next in Thread]