aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornathansmith <nathansmith@posteo.com>2025-05-12 11:33:12 -0600
committernathansmith <nathansmith@posteo.com>2025-05-12 11:33:12 -0600
commite408a73ff81c1270e96e2cffca7a56ac26413c97 (patch)
treeb39f4f60031feb1858594f0b57f22ca763b8b08b
parent448f3a743d982518163abc15f0e1ddfedb30753d (diff)
Working on guest book scheme still
-rwxr-xr-xcgi-bin/guest_book.cgi285
-rwxr-xr-xcgi-bin/guest_book.py164
-rwxr-xr-xcgi-bin/guest_book_scm.cgi104
3 files changed, 286 insertions, 267 deletions
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))
-