Browse code
feat: wordpress-api
Edward authored on 12/02/2021 08:47:27
Showing 1 changed files
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)))) |