#! /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)))))
(define (format-article-filename file)
  (let ((file-length (string-length file)))
    (string-append (substring file
                              0
                              (- file-length 4))
                   ".xhtml")))
;; Make a link for the article.
(define (make-article-list-link article)
  (let ((title (cadr (list-ref article 0)))
        (file (format-article-filename (cadr (list-ref article 6)))))
    (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)))
(define (generate-article-xhtml article template)
  (letrec ((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)))
           (article-file (format-article-filename file))
           (article-xhtml (get-raw-article file)))
    (call-with-output-file article-file
      (lambda (fp)
        (format fp template title title pub-date article-xhtml)))))
        
;; Generates a xhtml blog index and articles from xml.
(define (generate-xhtml)
  (let ((index-template (read-entire-file "blog-index-template.xhtml"))
        (article-template (read-entire-file "article-template.xhtml"))
        (article-list "\n")
        (articles (call-with-input-file "articles.xml"
                    (lambda (fp)
                      (xml->sxml fp)))))
    (for-each (lambda (article)
                (when (list? article)
                  ;; Create article file.
                  (generate-article-xhtml (cddr article) article-template)
                  
                  ;; Add a article link.
                  (set! article-list
                        (string-append article-list
                                       (make-article-list-link
                                        (cddr article))))))
              (cdr (cadr articles)))
    (set! article-list (string-append article-list "      
"))
    ;; Create blog index.
    (call-with-output-file "index.xhtml"
      (lambda (fp)
        (format fp index-template article-list)))))
(define (main args)
  (generate-xhtml))