git.fiddlerwoaroof.com
Raw Blame History
(in-package :fwoar.rss-reader)

(defgeneric app (obj)
  (:documentation "the ningle app that is to be run"))

(defgeneric handler (obj)
  (:documentation "the clack handler representing the currently running application"))

(defclass+ rss-reader ()
  ((%feeds :initarg :feeds :accessor feeds)
   (%app :initform (make-instance 'ningle:<app>)
         :reader app)
   (%handler :accessor handler))
  (:documentation
   "A simple wrapper that ties a ningle app to a clack handler"))

(defun redirect (target)
  (lambda (_)
    (declare (ignore _))
    `(302 (:location ,target) ())))

(defmethod araneus:routes progn ((app rss-reader))
  (araneus:defroutes (app app)
    (("/") (redirect (format nil "/f/~(~a~)"
                             (feed-key
                              (car
                               (feeds app))))))
    (("/f/:feed") (lambda (params)
                    (optima:match params
                      ((optima.extra:alist (:feed . feed))
                       (araneus:run-route (feed-page (feeds app)
                                                     (find feed (feeds app)
                                                           :key 'feed-key
                                                           :test 'string-equal))
                                          params)))))))

(defun start (app)
  (setf (handler app)
        (clack:clackup (app app)))
  app)

(defvar *app*)

(defun unboundp (symbol)
  (not (boundp symbol)))

(defgeneric feed-key (object))
(defgeneric feed-url (object))

(fw.lu:defclass+ feed-reference ()
  ((%key :initarg :key :reader feed-key)
   (%url :initarg :url :reader feed-url)))

(fw.lu:defclass+ plump-cleaner
    ((feed-reference (key url)))
  ())

(defgeneric resolve-feed-reference (reference)
  (:method ((r feed-reference))
    (alimenta.pull-feed:pull-feed (feed-url r))))

(defgeneric prepare-feed-item-description (reference item)
  (:method ((r feed-reference) (item alimenta:item))
    (alimenta:description item))
  (:method ((r plump-cleaner) (item alimenta:item))
    (let ((description (alimenta:description item)))
      (when description
        (format t "~&aaaaa~%")
        (plump:text
         (plump:parse
          description))))))

(defun main ()
  (setf *app*
        (if (not (boundp '*app*))
            (start
             (araneus:routes
              (rss-reader (list
                           (feed-reference :techcrunch      "https://techcrunch.com/feed/")
                           (plump-cleaner  :coding-horror   "http://feeds.feedburner.com/codinghorror")
                           (feed-reference :daring-fireball "https://daringfireball.net/feeds/main")))))
            *app*)))