git.fiddlerwoaroof.com
view.lisp
ef3b7ddb
 (in-package :fwoar.rss-reader)
 
aa626761
 (defmethod spinneret:html ((object plump:node))
   (plump:serialize object spinneret:*html*))
 
ef3b7ddb
 (defclass rss-reader-route ()
6131cd63
   ((%feed-list :initarg :feed-list :reader feed-list)))
 
46f06681
 (defun nav (route)
   (spinneret:with-html
     (loop for feed in (feed-list route)
           for idx from 0
           collect (:a :data-ic-get-from (format nil "/f/~a" (string-downcase (feed-key feed)))
                       :class (if (string= (feed-key feed)
                                           (feed-key (feed route)))
                                  "active" "")
                       (feed-key feed)))))
 
ef3b7ddb
 (defmethod araneus:view :around ((route rss-reader-route) model)
   "basic html and javascript for our app, as well as an invocation of
 the hook that pulls in CSS"
 
6131cd63
   (etypecase model
720f9410
     (fwoar.intercooler:full-request
31d2d52b
      (spinneret:with-html-string
        (:doctype)
        (:html
         (:head
6131cd63
          (:script :src "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js")
31d2d52b
          (:script :src
46f06681
                   "https://cdnjs.cloudflare.com/ajax/libs/intercooler-js/1.2.3/intercooler.min.js"
31d2d52b
                   :defer "defer")
6131cd63
          (:script :defer "defer"
                   (:raw (fwoar.rss-reader.ui:intercooler-debugger)))
31d2d52b
          (:meta :name "intercoolerjs:use-data-prefix"
                 :content "true"/)
          (:style
20ae3d55
           (:raw (apply 'lass:compile-and-write
                        (araneus:styles route)))))
31d2d52b
         (:body
          (call-next-method)))))
720f9410
     (fwoar.intercooler:partial-request
31d2d52b
      (spinneret:with-html-string
        (call-next-method)))))
ef3b7ddb
 
 (defmethod araneus:styles append ((route rss-reader-route))
   "CSS Reset"
 
   '((*
      :margin 0
      :padding 0
      :font-family "\"Lato\", sans"
720f9410
      :box-sizing border-box)
ef3b7ddb
     ((:or pre code)
      :font-family "\"Source Code Pro\", monospace")
     (body
      :font-size 12pt)
     ((:or h1 h2 h3 h4 h5 h6)
      :font-size 1.6rem)
     ((:or ul ol)
46f06681
      :padding-left 2rem)
     (.active
      :background "#888")))
ef3b7ddb
 
6131cd63
 (defmacro with-layout ((render-type layout) &body content)
   `(let ((content (lambda ()
                     (spinneret:with-html
                       (:main
                        ,@content)))))
      (ecase ,render-type
        (:full (spinneret:with-html
                 (,layout content)))
        (:partial (funcall content)))))
 
720f9410
 
 (defclass+ feed-page ((rss-reader-route (feed-list))
                       fwoar.intercooler:intercooler-route
                       fwoar.default-layout:default-layout)
aa626761
   ((%feed :initarg :feed :reader feed)))
 
 (defmethod araneus:controller ((route feed-page) params &key)
720f9410
   (resolve-feed-reference (feed route)))
aa626761
 
720f9410
 (defmethod araneus:view ((route feed-page) (model fwoar.intercooler:intercooler-request))
6131cd63
   (spinneret:with-html
46f06681
     (spinneret:html
720f9410
      (alimenta:render (fwoar.intercooler:request model)
20ae3d55
                       (feed route)))))
aa626761
 
720f9410
 (defmethod araneus:view ((route feed-page) (model fwoar.intercooler:full-request))
6131cd63
   (spinneret:with-html
     (:h1 "Hello, World!")
     (:div.main
      (:nav
       :data-ic-push-url "true"
46f06681
       :data-ic-target "#content"
       :data-ic-switch-class "active"
       (nav route))
6131cd63
      (:main#content
46f06681
       :data-ic-target "#content"
720f9410
       (alimenta:render (fwoar.intercooler:request model)
aa626761
                        (feed route))))))
ef3b7ddb
 
46f06681
 (defclass+ feed-item-page ((rss-reader-route (feed-list))
                            fwoar.intercooler:intercooler-route
                            fwoar.default-layout:default-layout)
   ((%feed :initarg :feed :reader feed)
    (%item :initarg :item :reader item)))
 
 (defmethod araneus:controller ((route feed-item-page) params &key)
   (find (item route)
         (resolve-feed-reference (feed route))
         :key (alexandria:compose 'id->slug 'alimenta:id)
         :test 'string-equal))
 
 (defmethod araneus:view ((route feed-item-page) (model fwoar.intercooler:intercooler-request))
   (spinneret:with-html
     (:raw
      (alimenta:content (fwoar.intercooler:request model)))))
 
 (defmethod araneus:view ((route feed-item-page) (model fwoar.intercooler:full-request))
   (spinneret:with-html
     (:h1 "Hello, World!")
     (:div.main
      (:nav
       :data-ic-push-url "true"
       :data-ic-target "#content"
       #+(or)(:data-ic-replace-target "true")
       :data-ic-switch-class "active"
       (nav route))
      (:main#content
       :data-ic-target "#content"
       (:raw
        (alimenta:content (fwoar.intercooler:request model)))))))
 
ef3b7ddb
 (defmethod fwoar.default-layout:border-color ((layout rss-reader-route))
   "#BDE0F3")
aa626761
 (defmethod fwoar.default-layout:background-color ((layout rss-reader-route))
   "#3f3f3f")
 (defmethod fwoar.default-layout:text-color ((layout rss-reader-route))
   "#DCDCCC")
 (defmethod fwoar.default-layout:link-color ((layout rss-reader-route))
   "#F5F5D6")