commit 70077d86ad0fa8a4c9c3e3196abf66c8153d4c4c
parent ce4a3c48fb6e6b7907f97f064b1eccbb5b4d8a17
Author: Daniel Barlow <dan@telent.net>
Date: Wed, 30 Jul 2025 23:25:32 +0100
WIP rss feed
Diffstat:
3 files changed, 61 insertions(+), 2 deletions(-)
diff --git a/Makefile b/Makefile
@@ -2,7 +2,7 @@ FENNEL?=fennel
PREFIX?=/usr/local
NAME?=cripslock
-MODULES=main.fnl textile.fnl site.fnl html.fnl lib.fnl
+MODULES=main.fnl textile.fnl site.fnl html.fnl lib.fnl rss.fnl
%.lua : %.fnl
$(FENNEL) --compile $< > $@
diff --git a/main.fnl b/main.fnl
@@ -5,6 +5,8 @@
(local server (require :server))
(local textile (require :textile))
(local site (require :site))
+(local rss (require :rss))
+
(local { : to-html } (require :html))
(local { : string-stream : prepend } (require :lib))
@@ -21,6 +23,7 @@
(local handlers
[
#(if (= $2 "/") [ :home { :limit 5 } ])
+ #(if (= $2 "/news.rss") [ :rss { :limit 10 } ])
#(case (string.match $2 "^/(%d+)/(%d+)/")
(year month)
[ :month { :year (tonumber year) :month (tonumber month) } ]
@@ -35,7 +38,6 @@
#(case (string.match $2 "^/([%w_]+)$")
slug [ :show { : slug }])
-
])
(define-tests :route-request
@@ -277,11 +279,28 @@ href=\"https://axillae.telent.net/\">@dan@axillae.telent.net</a>
(page-footer stream)
(stream:write_chunk "" true)))
+(fn send-rss [stream]
+ (let [posts
+ (post-index:search
+ {
+ :filter nil
+ :order {:date :descending}
+ :offset 0
+ :limit 5
+ })]
+ (server.headers stream
+ { :content-type "application/rss+xml; charset=utf-8" })
+ ; (print :s stream (view posts))
+ (rss.feed stream "https://ww.telent.net/" posts)))
+
+
(fn dispatch [route stream]
(print (view route))
(case route
[:show { : slug }]
(send-post-page stream slug)
+ [:rss]
+ (send-rss stream)
[:month { : month : year }]
(send-month-page stream year month)
[:static { : path }]
diff --git a/rss.fnl b/rss.fnl
@@ -0,0 +1,40 @@
+(local { : to-html } (require :html))
+
+(local preamble "
+<?xml version='1.0' encoding='UTF-8'?>
+<rss version='2.0' xmlns:content='http://purl.org/rss/1.0/modules/content/' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:atom='http://www.w3.org/2005/Atom' xmlns:trackback='http://madskills.com/public/xml/rss/module/trackback/' xmlns:itunes='http://www.itunes.com/dtds/podcast-1.0.dtd'>
+<channel>
+<title>
+diary at Telent Netowrks
+</title>
+<link>
+https://ww.telent.net/
+</link>
+<atom:link href='https://ww.telent.net/news.rss' rel='self' type='application/rss+xml'/>
+<description>
+Daniel Barlow's blog
+</description>
+")
+
+
+(fn for-post [base-url post]
+ (let [link (.. base-url post.url-path)
+ body "my message to you, Rudy"
+ escaped-text (.. "<![CDATA[ " body "]]>")
+ date (os.date "!%Y-%m-%dT%TZ" post.date)]
+ [:item
+ [:title post.title]
+ [:link link]
+ [:description escaped-text]
+ [:author "dan@telent.net (Daniel Barlow)"]
+ [:guid link]
+ ["dc:date" date]]))
+
+(fn feed [stream base-url posts]
+ (print :s stream )
+ (stream:write_chunk preamble)
+ (each [_ p (ipairs posts)]
+ (stream:write_chunk (to-html (for-post base-url p))))
+ (stream:write_chunk "</channel></rss>" true))
+
+{ : feed }