(in-package :kira) (defmethod parse-feed (xml (type (eql :|rss|))) (collecting (whereas ((items (rest (find-element-in-tree :|channel| xml)))) (dolist (item items) (when (eq (element-name item) :|item|) (let ((post (make-instance 'blog-entry :creation-time *now*))) (collect post) (setf-accessors-from-xml post item guid (or :|guid| :|link| :|title|) external-uri (or (:|link| uri) (:|guid| uri)) creator :|dc:creator| title :|title| body (or :|description| :|encoded|) specified-time (or (:|pubDate| rfc-822-time) (:|date| date-time))))))))) (defmethod parse-feed (xml (type (eql :|feed|))) (collecting (dolist (entry (rest xml)) (when (eq (element-name entry) :|entry|) (let ((post (make-instance 'blog-entry :creation-time *now*))) (collect post) (whereas ((author (find-element-in-tree :|author| entry))) (setf-accessors-from-xml post author creator :|name|)) (setf-accessors-from-xml post entry guid :|id| external-uri ((:|link| :|href|) uri) title :|title| body (or :|content| :|summary|) specified-time (or (:|published| date-time) (:|updated| date-time)))))))) (defmethod parse-feed (xml (type (eql :|rdf:RDF|))) (collecting (dolist (item (rest xml)) (when (eq (element-name item) :|item|) (let ((post (make-instance 'blog-entry :creation-time *now*))) (collect post) (setf-accessors-from-xml post item id ((nil :|rdf:about|)) external-uri (:|link| uri) title :|title| body :|encoded| specified-time (:|date| date-time))))))) (defhandler (feed) (:title "Feed") (with-query ((uri uri)) (html ((:standard-form :method :get) (:fieldset "Feed URL" (:p (text-field "uri" uri :size 30)) (:p (submit-button nil "Fetch"))))) (let ((odb::*touch* nil) (odb::*reify* nil)) (whereas ((xml (and uri (http-get-xml uri))) (posts (parse-feed xml (element-name xml)))) (dolist (post posts) (html ((:standard-form :action (:uri-to 'feed/post) :target "_blank") (:fieldset (render-title post) (:let ((*print-id* nil)) (:p (textarea "post" (prin1-to-string post)))) (:p (submit-button nil "Post")))))))))) (defhandler :post (feed/post) (let ((post (with-transaction () (with-query ((post t)) (prog1 post (setf (odb::dirty-objects *transaction*) (list post))))))) (realize post) (redirect post)))