git.fiddlerwoaroof.com
Browse code

feat: wordpress-api

Edward authored on 12/02/2021 08:47:27
Showing 1 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,68 @@
1
+(defpackage :fwoar.lisp-sandbox.wordpress-api
2
+  (:use :cl )
3
+  (:export ))
4
+(in-package :fwoar.lisp-sandbox.wordpress-api)
5
+
6
+(defun needs-encoding-p (char)
7
+  (not (digit-char-p char 36)))
8
+
9
+(defun encode-char (char)
10
+  (format nil "%~2,'0X" (char-code char)))
11
+
12
+(defun url-encode (s url _ __)
13
+  (declare (ignore _ __))
14
+  (map nil (lambda (char)
15
+             (princ (if (needs-encoding-p char)
16
+                        (encode-char char)
17
+                        (string char))
18
+                    s))
19
+       url))
20
+
21
+(defun uri (base path &key (per-page 10) (page 1) fields)
22
+  (make-instance 'puri:uri
23
+                 :scheme :https
24
+                 :host base
25
+                 :path path
26
+                 :query
27
+                 (format nil "per_page=~d&page=~d&~:[~;~:*&_fields=~{~/fwoar.lisp-sandbox.wordpress-api::url-encode/~^,~}~]"
28
+                         per-page page fields)))
29
+
30
+(defun json-get (uri &optional (caching t))
31
+  (let ((drakma:*text-content-types* (acons "application" "json"
32
+                                            drakma:*text-content-types*)))
33
+    (let ((cache (load-time-value (vector nil nil nil))))
34
+      #+(or)
35
+      (when (and caching (not (elt cache 1)) (when (elt cache 0) (not (puri:uri= uri (elt cache 0))))))
36
+      (multiple-value-bind (result _ headers) (drakma:http-request uri)
37
+        (declare (ignore _))
38
+        (let ((json (yason:parse result)))
39
+          (setf (elt cache 0) uri
40
+                (elt cache 1) json
41
+                (elt cache 2) (pairlis '(:x-wp-total :x-wp-totalpages)
42
+                                       (funcall (data-lens:• (data-lens:over 'parse-integer)
43
+                                                             (apply 'data-lens:juxt
44
+                                                                    (mapcar 'data-lens:key
45
+                                                                            '(:x-wp-total :x-wp-totalpages))))
46
+                                                headers)))))
47
+      (values (elt cache 1)
48
+              (elt cache 2)
49
+              (elt cache 0)))))
50
+
51
+(defparameter *title*
52
+  (data-lens:• (data-lens.lenses:make-hash-table-lens "title")
53
+               (data-lens.lenses:make-hash-table-lens "rendered")))
54
+
55
+(defun view-title (it)
56
+  (data-lens.lenses:view *title* it))
57
+
58
+(defvar *site*)
59
+(defun get-page-of-titles (page-number)
60
+  (let ((uri *site*
61
+             "/wp-json/wp/v2/posts"
62
+             :per-page 100
63
+             :page page-number
64
+             :fields '("title")))
65
+    (multiple-value-bind (r p) (json-get the-uri)
66
+      (values (funcall (data-lens:over 'view-title)
67
+                       r)
68
+              p))))