aboutsummaryrefslogtreecommitdiff
path: root/cgi-bin/guest_book_scm.cgi
diff options
context:
space:
mode:
Diffstat (limited to 'cgi-bin/guest_book_scm.cgi')
-rwxr-xr-xcgi-bin/guest_book_scm.cgi104
1 files changed, 104 insertions, 0 deletions
diff --git a/cgi-bin/guest_book_scm.cgi b/cgi-bin/guest_book_scm.cgi
new file mode 100755
index 0000000..3963b25
--- /dev/null
+++ b/cgi-bin/guest_book_scm.cgi
@@ -0,0 +1,104 @@
+#! /usr/bin/guile \
+-e main -s
+!#
+
+(use-modules (ice-9 exceptions))
+(use-modules (json))
+
+(define guest-book-json-file "cgi-bin/guest_book.json")
+
+;; Display a guest in the guest book
+(define (display-guest guest)
+ (let ((date (cdr (list-ref guest 0)))
+ (message (cdr (list-ref guest 1)))
+ (url (cdr (list-ref guest 2)))
+ (name (cdr (list-ref guest 3))))
+ (format #t " <table border=\"1\" width=\"60%\">\n\
+ <tr><td>\n\
+ <b>~a</b> <a href=\"~a\" target=\"_blank\">~a</a> --- signed ~a\n\
+ </td></tr>\n\
+ <tr><td>\n\
+ <p>~a</p>\n\
+ </table>\n\n" name url url date message)))
+
+;; Display pretty much everything
+(define (display-guest-book)
+ (display "Content-Type: text/html\n\n\
+<!DOCTYPE html>\n\
+<html>\n\
+<head>\n\
+ <title>Guest Book</title>\n\
+ <style>\n\
+body {\n\
+ color: black;\n\
+ background-image: url('../images/guest_book_background.png');\n\
+}\n\
+\n\
+table {\n\
+ color: black;\n\
+ background-color: #bebebe;\n\
+ margin-top: 10px;\n\
+ margin-bottom: 10px;\n\
+ margin-left: 10px;\n\
+ margin-right: 10px;\n\
+}\n\
+</style>\n\
+</head>\n\
+<body>\n\
+ <a href=\"../index.html\"><img src=\"../images/back_home.png\"\n\
+ alt=\"Back to home page\"/></a>\n\
+ <center>\n\
+ <table border=\"1\" width=\"60%\">\n\
+ <tr>\n\
+ <td>\n\
+ <h3>Sign my fucking guest book</h3>\n\
+ <form action = \"guest_book.cgi\" method = \"get\">\n\
+ <lable for = \"name\" maxlength=\"100\">Name</lable>\n\
+ <input type = \"text\" name = \"name\"/>\n\
+ <br/>\n\
+ <lable for = \"url\" maxlength=\"256\">Website (Optional)\n\
+ </lable>\n\
+ <input type = \"text\" name = \"url\"/>\n\
+ <br/><br/>\n\
+ <lable for = \"message\">Write a little silly something</lable>\n\
+ <br/>\n\
+ <textarea type = \"text\" name = \"message\" rows = \"4\"\n\
+ cols = \"40\" maxlength=\"512\"></textarea>\n\
+ <br/>\n\
+ <input type = \"submit\" value = \"Fucking submit\">\n\
+ <b>You can't delete/edit it afterwards</b>\n\
+ </form>\n\
+ <p>\n\
+ <b>Be nice! Dont be a fucking ass.</b>\n\
+ </p>\n\
+ </td>\n\
+ </tr>\n\
+ </table>\n\n")
+
+ ;; Try to read the guest book json
+ (with-exception-handler
+ (lambda (error)
+ (display " <table border=\"1\" width=\"60%\">\n\
+ <tr><td>\n\
+ <p>No guest have been added ): But you can be the first!</p>\n\
+ </td></tr>\n\
+ </table>\n"))
+ (lambda ()
+ (call-with-input-file guest-book-json-file
+ (lambda (fp)
+ (letrec ((guest-book (json->scm fp))
+ (guest-loop
+ (lambda (index)
+ (display-guest (vector-ref guest-book index))
+ (if (< index (- (vector-length guest-book) 1))
+ (guest-loop (+ index 1))))))
+ (guest-loop 0)))))
+ #:unwind? #t)
+
+ (display " </center>\n\
+</body>\n\
+</html>\n"))
+
+(define (main args)
+ (display-guest-book))
+