From e408a73ff81c1270e96e2cffca7a56ac26413c97 Mon Sep 17 00:00:00 2001
From: nathansmith <nathansmith@posteo.com>
Date: Mon, 12 May 2025 11:33:12 -0600
Subject: Working on guest book scheme still

---
 cgi-bin/guest_book.cgi     | 285 +++++++++++++++++++--------------------------
 cgi-bin/guest_book.py      | 164 ++++++++++++++++++++++++++
 cgi-bin/guest_book_scm.cgi | 104 -----------------
 3 files changed, 286 insertions(+), 267 deletions(-)
 create mode 100755 cgi-bin/guest_book.py
 delete mode 100755 cgi-bin/guest_book_scm.cgi

diff --git a/cgi-bin/guest_book.cgi b/cgi-bin/guest_book.cgi
index 97a7403..b2baf4f 100755
--- a/cgi-bin/guest_book.cgi
+++ b/cgi-bin/guest_book.cgi
@@ -1,164 +1,123 @@
-#! /usr/bin/env python3
-
-import cgi
-import json
-import datetime
-import html
-
-def handle_fields():
-    form = cgi.FieldStorage()
-
-    name = form.getvalue("name")
-    url = form.getvalue("url")
-    message = form.getvalue("message")
-
-    # Nothign was submitted.
-    if name is None and url is None and message is None:
-        return ""
-
-    if name is None:
-        return "<p>name is required</p>"
-    elif message is None:
-        return "<p>please write a silly something (:</p>"
-
-    url = "" if url is None else url
-
-    # Make the names safe.
-    name = html.escape(name)
-    url = html.escape(url)
-    message = html.escape(message)
-
-    guest_book = []
-
-    # Open data if already there.
-    try:
-        with open("guest_book.json", "r")  as fp:
-            guest_book = json.load(fp)
-    except FileNotFoundError:
-        pass
-
-    # Already in list.
-    for guest in guest_book:
-        if guest["name"] == name and guest["url"] == url and guest["message"] == message:
-            return "<p>You already been added</p>"
-
-    date = datetime.datetime.now()
-    guest_entry = {"name": name, "url": url, "message": message, "date": date.strftime("%B, %d %Y")}
-
-    # Dump guest to file.
-    with open("guest_book.json", "w") as fp:
-        guest_book.append(guest_entry)
-        json.dump(guest_book, fp, indent=4)
-
-    return "<p>You been added to the guest book yippe (:</p><img src=\"../images/yippee.gif\" alt=\"yippee!\"/>"
-
-def get_guest_html_from_list():
-    guest_html = ""
-
-    try:
-        with open("guest_book.json", "r")  as fp:
-            for guest in json.load(fp)[::-1]:
-                guest_table = """
-                    <table border="1" width="60%">
-                        <tr>
-                            <td>
-                                <b>{name}</b> <a href="{url}" target="_blank">{url}</a> --- signed {date}
-                            </td> 
-                        </tr>
-
-                        <tr>
-                            <td><p>{message}</p></td>
-                        </tr>
-                    </table>
-                """
-
-                guest_table = guest_table.format(name=guest["name"], url=guest["url"],
-                    date=guest["date"], message=guest["message"])
-                guest_html += guest_table
-    except FileNotFoundError:
-        guest_html =  """
-            <table border="1" width="60%">
-                <tr>
-                    <td>
-                        <p>No guest have been added ): But you can be the first!</p>
-                    </td>
-                </tr>
-            </table>
-        """
-
-    return guest_html
-
-def display_html(fields_reponse):
-    print("Content-Type: text/html")
-    
-    html_text = """
-        <!DOCTYPE html>
-        <html>
-        
-        <head>
-            <title>Guest Book</title>
-
-        <style>
-            
-        body {{
-            color: black;
-            background-image: url('../images/guest_book_background.png');
-        }}
-
-        table {{
-            color: black;
-            background-color: #bebebe;
-            margin-top: 10px;
-            margin-bottom: 10px;
-            margin-left: 10px;
-            margin-right: 10px;
-        }}
-
-        </style>
-        </head>
-
-        <body>
-            <a href="../index.html"><img src="../images/back_home.png" alt="Back to home page"/></a>
-            
-            <center>
-                <table border="1" width="60%">
-                    <tr>
-                        <td>
-                            <h3>Sign my fucking guest book</h3>
-                            <form action = "guest_book.cgi" method = "get">
-                                <lable for = "name" maxlength="100">Name</lable>
-                                <input type = "text" name = "name"/>
-                                <br/>
-                                <lable for = "url" maxlength="256">Website (Optional)</lable>
-                                <input type = "text" name = "url"/>
-                                <br/><br/>
-                                <lable for = "message">Write a little silly something</lable>
-                                <br/>
-                                <textarea type = "text" name = "message" rows = "4" cols = "40" maxlength="512"></textarea>
-                                <br/>
-                                <input type = "submit" value = "Fucking submit"> <b>You can't delete/edit it afterwards</b>
-                            </form>
-                            <p>
-                                <b>Be nice! Dont be a fucking ass.</b>
-                            </p>
-                            {fields_reponse}
-                        </td>
-                    </tr>
-                </table>
-
-            {guest_html}
-            </center>
-        </body>
-        </html>
-    """
-    
-    html_text = html_text.format(
-        fields_reponse=fields_reponse,
-        guest_html=get_guest_html_from_list()
-    )
-
-    print(html_text)
-
-fields_reponse = handle_fields()
-display_html(fields_reponse)
+#! /usr/bin/guile \
+-e main -s
+!#
+
+(use-modules (ice-9 exceptions))
+(use-modules (json))
+
+(define guest-book-json-file "cgi-bin/guest_book.json")
+
+;; Progress form data
+(define (get-form)
+  (let ((query (getenv "QUERY_STRING"))
+        (form '()))
+    (cond ((= (string-length query) 0) #f)
+          (else
+           (set! form (string-split query #\&))
+           (for-each
+            (lambda (item)
+              (set! item (string-split item #\=)))
+            form)
+           form))))
+           
+(define (handle-fields)
+  (let ((form (get-form)))
+    (if form
+        (display form))))
+
+;; 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")
+  (handle-fields)
+  (display "        </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))
 
diff --git a/cgi-bin/guest_book.py b/cgi-bin/guest_book.py
new file mode 100755
index 0000000..97a7403
--- /dev/null
+++ b/cgi-bin/guest_book.py
@@ -0,0 +1,164 @@
+#! /usr/bin/env python3
+
+import cgi
+import json
+import datetime
+import html
+
+def handle_fields():
+    form = cgi.FieldStorage()
+
+    name = form.getvalue("name")
+    url = form.getvalue("url")
+    message = form.getvalue("message")
+
+    # Nothign was submitted.
+    if name is None and url is None and message is None:
+        return ""
+
+    if name is None:
+        return "<p>name is required</p>"
+    elif message is None:
+        return "<p>please write a silly something (:</p>"
+
+    url = "" if url is None else url
+
+    # Make the names safe.
+    name = html.escape(name)
+    url = html.escape(url)
+    message = html.escape(message)
+
+    guest_book = []
+
+    # Open data if already there.
+    try:
+        with open("guest_book.json", "r")  as fp:
+            guest_book = json.load(fp)
+    except FileNotFoundError:
+        pass
+
+    # Already in list.
+    for guest in guest_book:
+        if guest["name"] == name and guest["url"] == url and guest["message"] == message:
+            return "<p>You already been added</p>"
+
+    date = datetime.datetime.now()
+    guest_entry = {"name": name, "url": url, "message": message, "date": date.strftime("%B, %d %Y")}
+
+    # Dump guest to file.
+    with open("guest_book.json", "w") as fp:
+        guest_book.append(guest_entry)
+        json.dump(guest_book, fp, indent=4)
+
+    return "<p>You been added to the guest book yippe (:</p><img src=\"../images/yippee.gif\" alt=\"yippee!\"/>"
+
+def get_guest_html_from_list():
+    guest_html = ""
+
+    try:
+        with open("guest_book.json", "r")  as fp:
+            for guest in json.load(fp)[::-1]:
+                guest_table = """
+                    <table border="1" width="60%">
+                        <tr>
+                            <td>
+                                <b>{name}</b> <a href="{url}" target="_blank">{url}</a> --- signed {date}
+                            </td> 
+                        </tr>
+
+                        <tr>
+                            <td><p>{message}</p></td>
+                        </tr>
+                    </table>
+                """
+
+                guest_table = guest_table.format(name=guest["name"], url=guest["url"],
+                    date=guest["date"], message=guest["message"])
+                guest_html += guest_table
+    except FileNotFoundError:
+        guest_html =  """
+            <table border="1" width="60%">
+                <tr>
+                    <td>
+                        <p>No guest have been added ): But you can be the first!</p>
+                    </td>
+                </tr>
+            </table>
+        """
+
+    return guest_html
+
+def display_html(fields_reponse):
+    print("Content-Type: text/html")
+    
+    html_text = """
+        <!DOCTYPE html>
+        <html>
+        
+        <head>
+            <title>Guest Book</title>
+
+        <style>
+            
+        body {{
+            color: black;
+            background-image: url('../images/guest_book_background.png');
+        }}
+
+        table {{
+            color: black;
+            background-color: #bebebe;
+            margin-top: 10px;
+            margin-bottom: 10px;
+            margin-left: 10px;
+            margin-right: 10px;
+        }}
+
+        </style>
+        </head>
+
+        <body>
+            <a href="../index.html"><img src="../images/back_home.png" alt="Back to home page"/></a>
+            
+            <center>
+                <table border="1" width="60%">
+                    <tr>
+                        <td>
+                            <h3>Sign my fucking guest book</h3>
+                            <form action = "guest_book.cgi" method = "get">
+                                <lable for = "name" maxlength="100">Name</lable>
+                                <input type = "text" name = "name"/>
+                                <br/>
+                                <lable for = "url" maxlength="256">Website (Optional)</lable>
+                                <input type = "text" name = "url"/>
+                                <br/><br/>
+                                <lable for = "message">Write a little silly something</lable>
+                                <br/>
+                                <textarea type = "text" name = "message" rows = "4" cols = "40" maxlength="512"></textarea>
+                                <br/>
+                                <input type = "submit" value = "Fucking submit"> <b>You can't delete/edit it afterwards</b>
+                            </form>
+                            <p>
+                                <b>Be nice! Dont be a fucking ass.</b>
+                            </p>
+                            {fields_reponse}
+                        </td>
+                    </tr>
+                </table>
+
+            {guest_html}
+            </center>
+        </body>
+        </html>
+    """
+    
+    html_text = html_text.format(
+        fields_reponse=fields_reponse,
+        guest_html=get_guest_html_from_list()
+    )
+
+    print(html_text)
+
+fields_reponse = handle_fields()
+display_html(fields_reponse)
+
diff --git a/cgi-bin/guest_book_scm.cgi b/cgi-bin/guest_book_scm.cgi
deleted file mode 100755
index 3963b25..0000000
--- a/cgi-bin/guest_book_scm.cgi
+++ /dev/null
@@ -1,104 +0,0 @@
-#! /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))
-
-- 
cgit v1.2.3