cripslock

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

commit 70077d86ad0fa8a4c9c3e3196abf66c8153d4c4c
parent ce4a3c48fb6e6b7907f97f064b1eccbb5b4d8a17
Author: Daniel Barlow <dan@telent.net>
Date:   Wed, 30 Jul 2025 23:25:32 +0100

WIP rss feed

Diffstat:
MMakefile | 2+-
Mmain.fnl | 21++++++++++++++++++++-
Arss.fnl | 40++++++++++++++++++++++++++++++++++++++++
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 }