aboutsummaryrefslogtreecommitdiff
path: root/org/blog/generate-html.scm
blob: 11da0a5437a453c82e2480a69b057fb73d319f1d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#! /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)))
                    (cond
                     ((eof-object? character) "")
                     (else (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 "    <li><a href=\"#" name "\">" title "</a></li>\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>"))
        (article-close (string-contains article "</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
     "<br />\n"
     "<div class=\"container\">\n"
     "  <div class=\"article-header\">\n"
     "    <h2 id=\"" name "\">" title "</h2>--- " pub-date "\n"
     "  </div>\n"
     (get-raw-article file) "\n"
     "</div>\n")))

;; Generates a html blog from xml data
(define (generate-html)
  (let ((template (read-entire-file "template.xhtml"))
        (article-list "<ul>\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 "</ul>\n"))
    (format #t template article-list article-cards)))

(define (main args)
  (generate-html))