git.fiddlerwoaroof.com
wordpress-api.lisp
7d7319ea
 (defpackage :fwoar.lisp-sandbox.wordpress-api
   (:use :cl )
   (:export ))
 (in-package :fwoar.lisp-sandbox.wordpress-api)
 
 (defun needs-encoding-p (char)
   (not (digit-char-p char 36)))
 
 (defun encode-char (char)
   (format nil "%~2,'0X" (char-code char)))
 
 (defun url-encode (s url _ __)
   (declare (ignore _ __))
   (map nil (lambda (char)
              (princ (if (needs-encoding-p char)
                         (encode-char char)
                         (string char))
                     s))
        url))
 
 (defun uri (base path &key (per-page 10) (page 1) fields)
   (make-instance 'puri:uri
                  :scheme :https
                  :host base
                  :path path
                  :query
                  (format nil "per_page=~d&page=~d&~:[~;~:*&_fields=~{~/fwoar.lisp-sandbox.wordpress-api::url-encode/~^,~}~]"
                          per-page page fields)))
 
 (defun json-get (uri &optional (caching t))
   (let ((drakma:*text-content-types* (acons "application" "json"
                                             drakma:*text-content-types*)))
     (let ((cache (load-time-value (vector nil nil nil))))
       #+(or)
       (when (and caching (not (elt cache 1)) (when (elt cache 0) (not (puri:uri= uri (elt cache 0))))))
       (multiple-value-bind (result _ headers) (drakma:http-request uri)
         (declare (ignore _))
         (let ((json (yason:parse result)))
           (setf (elt cache 0) uri
                 (elt cache 1) json
                 (elt cache 2) (pairlis '(:x-wp-total :x-wp-totalpages)
                                        (funcall (data-lens:• (data-lens:over 'parse-integer)
                                                              (apply 'data-lens:juxt
                                                                     (mapcar 'data-lens:key
                                                                             '(:x-wp-total :x-wp-totalpages))))
                                                 headers)))))
       (values (elt cache 1)
               (elt cache 2)
               (elt cache 0)))))
 
 (defparameter *title*
   (data-lens:• (data-lens.lenses:make-hash-table-lens "title")
                (data-lens.lenses:make-hash-table-lens "rendered")))
 
 (defun view-title (it)
   (data-lens.lenses:view *title* it))
 
 (defvar *site*)
 (defun get-page-of-titles (page-number)
   (let ((uri *site*
              "/wp-json/wp/v2/posts"
              :per-page 100
              :page page-number
              :fields '("title")))
     (multiple-value-bind (r p) (json-get the-uri)
       (values (funcall (data-lens:over 'view-title)
                        r)
               p))))