From: Amin Bandali Date: Fri, 29 Nov 2019 04:49:11 +0000 (-0500) Subject: begin work on porting to haunt X-Git-Url: https://git.shemshak.org/~bandali/bndl.org/commitdiff_plain/85314da0ba587c12c25c8d0fb9ca2708adb487ca?ds=sidebyside begin work on porting to haunt https://dthompson.us/projects/haunt.html --- diff --git a/haunt.scm b/haunt.scm new file mode 100644 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 index 0000000..ed11813 --- /dev/null +++ b/static/reset.css @@ -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 index 0000000..ea05296 --- /dev/null +++ b/static/style.css @@ -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 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; -} -*/