@@ -4,15 +4,16 @@ ; This file is licensed under the Blue Oak Model License 1.0.0. ;; Generates an Atom feed from the SQLite cache (require txexpr + deta racket/match racket/file racket/date racket/string - db/base + racket/sequence "dust.rkt" "cache.rkt") (provide main) @@ -43,49 +44,27 @@ (date->string now #t))) (string-append timestamp "Z")) ;; Get the data out of the SQLite cache as vectors (define (fetch-rows) - (define fields '(pagenode title_plain published updated author doc_html)) - (define select #<<--- - SELECT `path`, `title`, `published`, `updated`, `author`, `entry_contents` FROM - (SELECT `page` AS `path`, - `title_plain` AS `title`, - `published`, - `updated`, - `author`, - `doc_html` AS `entry_contents` - FROM `articles` WHERE (NOT (`conceal` LIKE "%all%")) AND (NOT (`conceal` LIKE "%feed%")) - UNION - SELECT `page` || '#' || `html_anchor` AS `path`, - `title_plain` AS `title`, - `published`, - "" AS `updated`, - `author`, - `content_html` as `entry_contents` - FROM `notes` WHERE (NOT (`conceal` LIKE "%all%")) AND (NOT (`conceal` LIKE "%feed%"))) - ORDER BY `published` DESC LIMIT ~a ---- - ) - (query-rows (cache-conn) (format select feed-item-limit))) - -(define (vector->rss-item vec) - (match-define - (vector path title published updated author contents) vec) - (define entry-url (string-append feed-site-url web-root path)) - (define update-ts - (cond [(non-empty-string? updated) updated] - [else published])) - - `(entry (author (name ,author)) - (published ,(ymd->rfc3339 published)) - (updated ,(ymd->rfc3339 update-ts)) - (title ,title) - (link [[rel "alternate"] [href ,entry-url]]) - (id ,entry-url) - (summary [[type "html"]] - ,(as-cdata contents)))) + (sequence->list + (in-entities (cache-conn) + (articles+notes 'content #:series #f #:limit feed-item-limit)))) + +(define (listing->rss-item lst) + (match-define (listing _ path title author published updated html) lst) + (define entry-url (string-append feed-site-url web-root path)) + (define updated-ts (if (non-empty-string? updated) updated published)) + + `(entry (author (name ,author)) + (published ,(ymd->rfc3339 published)) + (updated ,(ymd->rfc3339 updated-ts)) + (title ,title) + (link [[rel "alternate"] [href ,entry-url]]) + (id ,entry-url) + (summary [[type "html"]] + ,(as-cdata html)))) (define (rss-feed) (define feed-xpr `(feed [[xml:lang "en-us"] [xmlns "http://www.w3.org/2005/Atom"]] (title ,feed-title) @@ -94,11 +73,11 @@ (id ,(string-append feed-site-url web-root)) (updated ,(current-rfc3339)) (author (name ,feed-author) (email ,@(email-encode feed-author-email))) - ,@(map vector->rss-item (fetch-rows)))) + ,@(map listing->rss-item (fetch-rows)))) (string-append "\n" (xexpr->string feed-xpr))) (define (main) (display-to-file (rss-feed) "feed.xml" #:mode 'text #:exists 'replace))