src/genurl.lisp

DOWNLOAD
(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))))