begin work on porting to haunt
authorAmin Bandali <bandali@gnu.org>
Fri, 29 Nov 2019 04:49:11 +0000 (23:49 -0500)
committerAmin Bandali <bandali@gnu.org>
Fri, 29 Nov 2019 04:49:11 +0000 (23:49 -0500)
https://dthompson.us/projects/haunt.html

haunt.scm [new file with mode: 0644]
static/reset.css [new file with mode: 0644]
static/style.css [new file with mode: 0644]
style.css [deleted file]

diff --git a/haunt.scm b/haunt.scm
new file mode 100644 (file)
index 0000000..be470cd
--- /dev/null
+++ b/haunt.scm
@@ -0,0 +1,234 @@
+(use-modules (haunt asset)
+             (haunt builder blog)
+             (haunt builder atom)
+             (haunt builder assets)
+             (haunt html)
+             (haunt page)
+             (haunt post)
+             (haunt reader commonmark)
+             (haunt site)
+             (haunt utils)
+             (ice-9 match)
+             (srfi srfi-19))
+
+(define (stylesheet name)
+  `(link (@ (rel "stylesheet")
+            (href ,(string-append "/" name ".css")))))
+
+(define* (base-layout site body #:key title)
+  `((doctype "html")
+    (html
+     (head
+      (meta (@ (charset "utf-8")))
+      (title ,(if title (string-append title " — " (site-title site))
+                  "Amin Bandali’s Personal Site"))
+      ,(stylesheet "reset")
+      ,(stylesheet "style"))
+     (body
+      (main ,body)
+      (footer
+       (p
+        "Copyright 2016–2019 Amin Bandali.  See "
+        (a (@ (href "license.html")) "license.html")
+        " for license conditions. Please copy and share."))))))
+
+(define (bandali-post-template post)
+  `((header
+     (h1 ,(post-ref post 'title))
+     (address "By "
+              (a (@ (href "/"))
+                 ,(post-ref post 'author))
+              " <" ,(post-ref post 'email) ">")
+     (p (@ (class "date"))
+        ,(date->string (post-date post) "~B ~d, ~Y")))
+    ,(post-sxml post)))
+
+(define (bandali-collection-template site title posts prefix)
+  (define (post-uri post)
+    (string-append (or prefix "") "/"
+                   (site-post-slug site post) ".html"))
+
+  `((h3 ,title)
+    (ul
+     ,@(map (lambda (post)
+              `(li
+                (a (@ (href ,(post-uri post)))
+                   ,(post-ref post 'title))
+                " — " ,(date->string (post-date post) "~B ~d, ~Y")))
+            posts))))
+
+(define bandali-theme
+  (theme #:name "bandali"
+         #:layout
+         (lambda (site title body)
+           (base-layout site body
+                        #:title title))
+         #:post-template bandali-post-template
+         #:collection-template bandali-collection-template))
+
+(define (index-material site posts)
+  `(div
+    (h1 (@ (style "font-size: 0;"))
+        "Amin Bandali")
+    (p (@ (style "margin-top: 0;"))
+       "Hi, I’m "
+       (a (@ (href "images/bandali-with-rms.jpg")
+             (title ,(string-append
+                      "photo of bandali with rms wearing a "
+                      "“pay cash don’t be tracked” pin")))
+          "Amin Bandali")
+       ".  I’m a graduate student at "
+       (a (@ (href "https://watform.uwaterloo.ca"))
+          "WatForm")
+       " at University of Waterloo, supervised by "
+       (a (@ (href "https://cs.uwaterloo.ca/~nday/"))
+          "Dr. Nancy Day")
+       ".  The main goal of my research is improving "
+       (strong "software and systems reliability")
+       " through application of " (em "formal methods") ".")
+    (p "My research at WatForm focuses on formal logic, model "
+       "checking, and verification.  I’m also interested in "
+       "programming languages, theorem provers, and their "
+       "type systems.  You may wish to view my academic "
+       (a (@ (href "bandali-cv.html")) "curriculum vitae") ".")
+    (p (@ (class "notice"))
+       (strong "SE 212 students: ")
+       "see " (a (@ (href "se212-f19/")) "here") " for slides and "
+       "other material from the tutorials.")
+    (p "On the side, I dabble in "
+       (a (@ (href "https://leanprover.github.io")) "Lean")
+       " and enjoy "
+       (a (@ (href "https://stallman.org/articles/on-hacking.html"))
+          "hacking")
+       " on "
+       (a (@ (href "https://www.gnu.org/software/emacs/manual/elisp.html"))
+          "Elisp")
+       ".  I’m a "
+       (a (@ (href "https://www.gnu.org/philosophy/free-sw.html"))
+          "Free Software")
+       " activist and FSF "
+       (a (@ (href "https://www.fsf.org/associate/")) "supporter")
+       ", and a GNU "
+       (a (@ (href "https://www.gnu.org/people/#bandali"))
+          "maintainer")
+       " and "
+       (a (@ (href "https://www.gnu.org/people/webmeisters.html#bandali"))
+          "webmaster")
+       ".  I co-host the "
+       (a (@ (href "https://emacsel.com")) "Emacs.el")
+       " podcast with "
+       (a (@ (href "https://www.pygopar.com"))
+          "Daniel Gopar") ", and organize "
+       (a (@ (href "https://emacsconf.org")) "EmacsConf") " with help"
+       " from many wonderful people.  I am also a member of the"
+       " Systems Committee for the "
+       (a (@ (href "https://csclub.uwaterloo.ca")
+             (title ,(string-append
+                      "Computer Science Club of the "
+                      "University of Waterloo"))) "CSC")
+       ".")
+    (p "See my " (a (@ (href "contact.html")) "contact") " page for "
+       "how to best reach me.")
+    (h2 (@ (id "papers")) "Papers")
+    (dl
+     (dt "A Comparison of the Declarative Modelling Languages B, DASH,
+          and TLA" (sup "+")
+          (span (@ (class "plinks"))
+                " [ "
+                (a (@ (href "papers/modre2018-declarative.pdf"))
+                   "pdf")
+                " | "
+                (a (@ (href "papers/modre2018-declarative.bib"))
+                   "bib")
+                " ]"))
+     (dd "Ali Abbassi, "
+         (a (@ (href "https://bandali.eu.org")) "Amin Bandali") ", "
+         (a (@ (href "https://cs.uwaterloo.ca/~nday/"))
+            "Nancy A. Day")
+         ", and Jose Serna"
+         (br)
+         (em "2018 IEEE 8th International Model-Driven Requirements"
+             " Engineering Workshop (MoDRE)")
+         (br)
+         "Copyright © 2018 IEEE.  All Rights Reserved.  Sadly."))
+    (h2 (@ (id "talks")) "Talks")
+    (dl
+     (dt
+      "The Magic of Specifications and Type Systems"
+      (span (@ (class "plinks"))
+            " [ "
+            (a (@ (href "talks/cucsc-2017-slides.pdf")
+                  (title ,(string-append
+                           "presented at the Canadian Undergraduate"
+                           " Computer Science Conference 2017,\n"
+                           "University of Toronto, Canada,"
+                           "June 15–17, 2017")))
+                  "slides")
+               " | "
+               (a (@ (href "talks/eecs4080-poster.pdf")
+                     (title ,(string-append
+                           "presented at the Lassonde Undergraduate"
+                           " Summer Student Research Conference,\n"
+                           "York University, Toronto, Canada,"
+                           "August 15, 2017")))
+                  "poster")
+               " ]"))
+     (dd (a (@ (href "https://bandali.eu.org")) "Amin Bandali") ", "
+         (a (@ (href "https://github.com/cipher1024"))
+            "Simon Hudon")
+         ", "
+         (a (@ (href "http://www.cse.yorku.ca/~jonathan/"))
+            "Jonathan S. Ostroff")))
+    (h2 (@ (id "projects")) "Projects")
+    (p "Below are a number of free software projects I have worked "
+       "on:")
+    (dl
+     (dt (a (@ (href "https://git.sr.ht/~bandali/george-mode"))
+            "george-mode"))
+     (dd "Emacs major mode for editing George files")
+     (dt (a (@ (href "https://git.uwaterloo.ca/bandali/alloy-catalyst"))
+            "alloy-catalyst"))
+     (dd "Framework for performance analysis of Alloy models")
+     (dt (a (@ (href "https://github.com/unitb/unitb-web"))
+            "unitb-web"))
+     (dd "Web interface for Unit-B")
+     (dt (a (@ (href "https://github.com/unitb/tex2png-hs"))
+            "tex2png-hs"))
+     (dd "Library and CLI for converting TeX and LaTeX to PNG "
+         "images"))
+    (h2 (@ (id "notes")) "Notes")
+    (ul
+     ,@(map
+        (lambda (post)
+          (define (post-uri post)
+            (string-append "/"
+                           (site-post-slug site post) ".html"))
+          `(li
+            (a (@ (href ,(post-uri post)))
+               ,(post-ref post 'title))
+            " — " ,(date->string (post-date post) "~B ~d, ~Y")))
+        (take-up-to 10 (posts/reverse-chronological posts))))))
+
+(define (index-page site posts)
+  (make-page
+   "index.html"
+   (base-layout site (index-material site posts))
+   sxml->html))
+
+(define my-domain "bandali.eu.org")
+
+(site #:title "Amin Bandali"
+      #:domain my-domain
+      #:default-metadata
+      '((author . "Amin Bandali")
+        (email  . "bandali@gnu.org")
+        (domain . my-domain))
+      #:readers (list commonmark-reader)
+      #:builders (list (blog #:theme bandali-theme
+                             #:collections
+                             `(("Notes" "notes.html"
+                                ,posts/reverse-chronological)))
+                       index-page
+                       (atom-feed)
+                       (atom-feeds-by-tag)
+                       (static-directory "static" "")))
diff --git a/static/reset.css b/static/reset.css
new file mode 100644 (file)
index 0000000..ed11813
--- /dev/null
@@ -0,0 +1,48 @@
+/* http://meyerweb.com/eric/tools/css/reset/
+   v2.0 | 20110126
+   License: none (public domain)
+*/
+
+html, body, div, span, applet, object, iframe,
+h1, h2, h3, h4, h5, h6, p, blockquote, pre,
+a, abbr, acronym, address, big, cite, code,
+del, dfn, em, img, ins, kbd, q, s, samp,
+small, strike, strong, sub, sup, tt, var,
+b, u, i, center,
+dl, dt, dd, ol, ul, li,
+fieldset, form, label, legend,
+table, caption, tbody, tfoot, thead, tr, th, td,
+article, aside, canvas, details, embed,
+figure, figcaption, footer, header, hgroup,
+menu, nav, output, ruby, section, summary,
+time, mark, audio, video {
+       margin: 0;
+       padding: 0;
+       border: 0;
+       font-size: 100%;
+       font: inherit;
+       vertical-align: baseline;
+}
+/* HTML5 display-role reset for older browsers */
+article, aside, details, figcaption, figure,
+footer, header, hgroup, menu, nav, section {
+       display: block;
+}
+body {
+       line-height: 1;
+}
+ol, ul {
+       list-style: none;
+}
+blockquote, q {
+       quotes: none;
+}
+blockquote:before, blockquote:after,
+q:before, q:after {
+       content: '';
+       content: none;
+}
+table {
+       border-collapse: collapse;
+       border-spacing: 0;
+}
diff --git a/static/style.css b/static/style.css
new file mode 100644 (file)
index 0000000..ea05296
--- /dev/null
@@ -0,0 +1,157 @@
+body {
+  font-family: sans-serif;
+  line-height: 1.6;
+  padding: 2em;
+}
+
+nav, main, footer {
+  margin: auto;
+  max-width: 38rem;
+}
+
+nav {
+  font-size: 0.84em;
+}
+main {
+  margin-bottom: 2em;
+}
+p {
+  margin: 1em 0;
+}
+header {
+  font-size: 0.875em;
+  margin-bottom: 1.5em;
+}
+footer {
+  border-top: 1px solid #bbb;
+  font-size: 0.84em;
+  padding-top: 1em;
+}
+footer p {
+  margin: 0;
+}
+
+h1 {
+  font-size: 1.5em;
+}
+h1 + address {
+  margin-top: 0.75em;
+}
+address + p {
+  margin: 0;
+}
+
+h2 {
+  font-size: 1.25em;
+}
+h3 {
+  font-size: 1.125em;
+}
+
+a {
+  color: #295bad;
+  text-decoration: none;
+}
+a:hover, a:focus {
+  transition-property: background;
+  transition-duration: 0.1s;
+  background: #f2f8fa;
+  padding: 0.25em 0;
+  color: #0745ad;
+}
+a:active {
+  color: #a10029;
+}
+/*
+a:active {
+  color: #06d;
+  box-shadow: 0 1px 1px #ddd;
+}
+*/
+
+h4 {
+  margin: 0.75em auto;
+}
+
+article h3 {
+  font-weight: normal;
+  color: #777;
+}
+
+.notice {
+  background-color: #efefef;
+  text-align: center;
+  position: relative;
+}
+.notice::before {
+  content: "↪";
+  position: absolute;
+  left: 0.5em;
+  bottom: 0.05em;
+}
+.notice::after {
+  content: "↩";
+  position: absolute;
+  right: 0.5em;
+  bottom: 0.05em;
+}
+
+code {
+  font: 1.15em monospace;
+  text-transform: none;
+}
+strong {
+  font-weight: bold;
+}
+em {
+  font-style: italic;
+}
+
+table td {
+  padding: 0 0.3em;
+}
+table td:first-child {
+  padding-left: 0;
+}
+table td:last-child {
+  padding-right: 0
+}
+
+dt {
+  margin-bottom: 0.15em;
+}
+dd {
+  font-size: 0.9em;
+  margin-left: 1.5em;
+  margin-bottom: 0.75em;
+}
+dd:last-child {
+  margin-bottom: 1em;
+}
+.plinks {
+  font-size: 0.9em;
+}
+
+ul, ol {
+  list-style: none;
+  padding-left: 1.5em;
+  position: relative;
+}
+
+li {
+  margin-bottom: 0.25em;
+}
+
+ul > li::before {
+  content: '•';
+  position: absolute;
+  left: 0.5em;
+}
+
+h2 + ul, h3 + ul, h2 + dl, h3 + dl {
+  margin-top: 1em;
+}
+
+sup, sub { font-size: 0.85em; }
+sup { vertical-align: super; }
+sub { vertical-align: sub; }
diff --git a/style.css b/style.css
deleted file mode 100644 (file)
index c460723..0000000
--- a/style.css
+++ /dev/null
@@ -1,155 +0,0 @@
-/* for old browsers */
-article, aside, footer, header, nav, section {
-  display: block;
-}
-
-body {
-  font-family: sans-serif;
-  line-height: 1.6;
-  padding: 1em;
-}
-
-nav, main, footer {
-  margin: auto;
-  max-width: 38rem;
-}
-
-nav {
-  font-size: 0.84em;
-}
-main {
-  /* margin-top: 1em; */
-  margin-bottom: 3em;
-  /* margin-top: 2%; */
-}
-footer {
-  border-top: 1px solid #bbb;
-  padding-top: 1em;
-}
-footer p {
-  margin: 0;
-  font-size: 0.84em;
-}
-
-#hiddentitle {
-  font-size: 0;
-}
-h1 {
-  font-size: 1.5em;
-}
-#subtitle {
-  display: inline;
-  font-weight: normal;
-  font-size: 1.2em;
-  color: #444;
-}
-
-a {
-  color: #295bad;
-  text-decoration: none;
-}
-a:hover, a:focus {
-  transition-property: background;
-  transition-duration: 0.1s;
-  background: #f2f8fa;
-  padding: 0.25em 0;
-  color: #0745ad;
-}
-a:active {
-  color: #a10029;
-}
-/*
-a:active {
-  color: #06d;
-  box-shadow: 0 1px 1px #ddd;
-}
-*/
-
-h4 {
-  margin: 0.75em auto;
-}
-
-article h3 {
-  font-weight: normal;
-  color: #777;
-}
-
-.notice {
-  background-color: #efefef;
-  text-align: center;
-  position: relative;
-}
-.notice::before {
-  content: "↪";
-  position: absolute;
-  left: 0.5em;
-  bottom: 0.05em;
-}
-.notice::after {
-  content: "↩";
-  position: absolute;
-  right: 0.5em;
-  bottom: 0.05em;
-}
-
-code {
-  font-size: 1.15em;
-  text-transform: none;
-}
-
-table td {
-  padding: 0 0.3em;
-}
-table td:first-child {
-  padding-left: 0;
-}
-table td:last-child {
-  padding-right: 0
-}
-
-dl {
-  margin: 0 0 0.5em 0;
-}
-dl:last-child {
-  margin: 0;
-}
-dt {
-  margin-bottom: 0.15em;
-}
-dd {
-  font-size: 0.9em;
-  margin-left: 1.5em;
-  margin-bottom: 0.75em;
-}
-.plinks {
-  font-size: 0.9em;
-}
-
-ul, ol {
-  list-style: none;
-  padding-left: 1.5em;
-  position: relative;
-}
-
-li {
-  margin-bottom: 0.25em;
-}
-
-ul > li::before {
-  content: '•';
-  position: absolute;
-  left: 0.5em;
-}
-
-/*
-ol {
-  margin: 0;
-  padding: 0;
-}
-ol li {
-  margin-top: 0.5em;
-}
-ol li:first-child {
-  margin-top: 0;
-}
-*/