src/genurl.lisp
(in-package :murja.genurl)
(defun add-prefix (url)
(format nil "~a~a" (settings:prefix) url))
(defun route->url (symbol &rest params)
"A server side route->url transformer. Symbol and params are passed on into #'easy-routes:genurl, refer to its documentation or murja's genurl-tests.lisp for usage"
(format nil "~a~a"
(settings:prefix)
(apply #'easy-routes:genurl symbol params)))
(defun route->url-ps (symbol &rest params)
"route->url for the frontend code.
usage: (ps ....
(lisp (route>url-ps 'murja.view.rss::rss-single-item
:feed-id 'feedy-id :item-id 'ps-symboli))),
where feedy-id and ps-symboli are expected to be found in the containing ps scope.
THIS FUNCTION RETURNS LISTS TO PASS INTO (ps:lisp)"
(let* ((params-map (alexandria:plist-hash-table params))
(js-placeholders (make-hash-table :test 'equal)))
(maphash (lambda (k v)
(setf (gethash k js-placeholders) (format nil "SPLIT_FOR_~a" v)))
params-map)
(let* ((url (apply #'easy-routes:genurl symbol (alexandria:hash-table-plist js-placeholders)))
(body (alexandria:flatten
`(+ ,(settings:prefix)
,@(map 'list (lambda (part)
(if (str:starts-with-p "SPLIT_FOR_" part)
(list
(read-from-string (str:replace-all "SPLIT_FOR_" "" part)) "/")
(format nil "~a/"
part)))
(str:split "/" url))))))
(if (equalp (alexandria:last-elt body) "/")
(butlast body)
body))))