(in-package :fwoar.rss-reader) (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) (%data))) (defgeneric refresh-data (feed-reference) (:method ((feed-reference feed-reference)) (setf (slot-value feed-reference '%data) (alimenta.pull-feed:pull-feed (feed-url feed-reference))))) (defmethod slot-unbound (_ (instance feed-reference) (slot-name (eql '%data))) (refresh-data instance)) (fw.lu:defclass+ plump-cleaner ((feed-reference (key url))) ()) (defgeneric resolve-feed-reference (reference) (:method ((r feed-reference)) (slot-value r '%data))) (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 (plump:text (plump:parse description)))))) (defun id->slug (it) (ironclad:byte-array-to-hex-string (ironclad:digest-sequence :sha256 (babel:string-to-octets it))))