aboutsummaryrefslogtreecommitdiff
path: root/blog/generate_feed.scm
diff options
context:
space:
mode:
authornathansmith <nathansmith@posteo.com>2025-05-07 07:52:20 -0600
committernathansmith <nathansmith@posteo.com>2025-05-07 07:52:20 -0600
commitad77b98eb20b1abec23940a14512e07255b222ef (patch)
tree09dc1a085860259a7fea29fe1f6ccddad11874eb /blog/generate_feed.scm
parentdcaff06b3c7470e1ec3cf878d9322e589703cbd5 (diff)
Switching over to guile
Diffstat (limited to 'blog/generate_feed.scm')
-rwxr-xr-xblog/generate_feed.scm64
1 files changed, 64 insertions, 0 deletions
diff --git a/blog/generate_feed.scm b/blog/generate_feed.scm
new file mode 100755
index 0000000..0084dc9
--- /dev/null
+++ b/blog/generate_feed.scm
@@ -0,0 +1,64 @@
+#! /usr/bin/guile \
+-e main -s
+!#
+
+(use-modules (sxml simple))
+
+;; Generate description from article file
+(define (get-description file)
+ (call-with-input-file file
+ (lambda (fp)
+ (letrec ((read-characters
+ (lambda (fp)
+ (let ((character (read-char fp)))
+ (unless (eof-object? character)
+ (display character)
+ (read-characters fp))))))
+ (display "<![CDATA[\n")
+ (read-characters fp)
+ (display "]]>\n")))))
+
+;; Generate rss item
+(define (make-item article)
+ (let ((title (cadr (list-ref article 0)))
+ (name (cadr (list-ref article 2)))
+ (pub-date (cadr (list-ref article 4)))
+ (file (cadr (list-ref article 6))))
+ (format #t "\n <item>\n\
+ <title>~a</title>\n\
+ <link>http://nathansmith117.beevomit.org/blog#~a</link>\n\
+ <pubDate>~a</pubDate>\n\
+ <description>\n" title name pub-date)
+ (get-description file)
+ (display " </description>\n")
+ (display " </item>\n")))
+
+;; Generate rss feed
+(define (generate-feed)
+ ;; Display the rss header
+ (display "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n\
+<rss version=\"2.0\">\n\
+ <channel>\n\
+ <title>Nathan's shitty blog</title>\n\
+ <description>The coffee powered blog of chaos</description>\n\
+ <link>http://nathansmith117.beevomit.org/blog</link>\n\
+ <image>\n\
+ <url>http://nathansmith117.beevomit.org/images/icon.png</url>\n\
+ <title>Nathan's shitty blog</title>\n\
+ <link>http://nathansmith117.beevomit.org/blog</link>\n\
+ </image>\n")
+
+ (call-with-input-file "articles.xml"
+ (lambda (fp)
+ (let ((articles (xml->sxml fp)))
+ (for-each (lambda (article)
+ (if (list? article)
+ (make-item (cddr article))))
+ (cdr (cadr articles))))))
+
+ (display " </channel>\n")
+ (display "</rss>\n"))
+
+(define (main args)
+ (generate-feed))
+