#! /usr/bin/guile \
-e main -s
!#
(use-modules (sxml simple))
;; Loads an entire text file into a string
(define (read-entire-file file)
(call-with-input-file file
(lambda (fp)
(letrec ((read-characters
(lambda (fp)
(let ((character (read-char fp)))
(if (eof-object? character)
""
(string-append (string character)
(read-characters fp)))))))
(read-characters fp)))))
;; Make a link for the article
(define (make-article-list-link article)
(let ((title (cadr (list-ref article 0)))
(name (cadr (list-ref article 2))))
(string-append "
" title "\n")))
;; Reads the article file and formats some stuff out
(define (get-raw-article file)
(letrec ((article (read-entire-file file))
(article-open (string-contains article ""))
(article-close (string-contains article "")))
(substring article (+ article-open 9) article-close)))
;; Makes a card for the article
(define (make-article-card 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))))
(string-append
"
\n"
"
\n"
"\n"
"
\n"
"
" title "
--- " pub-date "\n"
" \n"
(get-raw-article file) "\n"
"
\n")))
;; Generates a html blog from xml data
(define (generate-html)
(let ((template (read-entire-file "template.xhtml"))
(article-list "\n")
(article-cards "")
(articles (call-with-input-file "articles.xml"
(lambda (fp)
(xml->sxml fp)))))
(for-each (lambda (article)
(when (list? article)
;; Add a article link
(set! article-list
(string-append article-list
(make-article-list-link
(cddr article))))
;; Add article card
(set! article-cards
(string-append article-cards
(make-article-card
(cddr article))))))
(cdr (cadr articles)))
(set! article-list (string-append article-list "
\n"))
(format #t template article-list article-cards)))
(define (main args)
(generate-html))