From e1b7e1f50709c89b7b6448bd86999a5a562f0e1b Mon Sep 17 00:00:00 2001 From: Duncan Wilkie Date: Mon, 26 Jun 2023 10:15:27 -0500 Subject: Start over cleanly --- assets/css/style.css | 115 ++++ assets/image/by-sa.svg | 74 +++ assets/image/combgeo.png | Bin 0 -> 665470 bytes assets/image/rss.png | Bin 0 -> 10214 bytes assets/pubkey.txt | 87 +++ assets/webfonts/IBMPlexMono-Bold.otf | Bin 0 -> 64980 bytes assets/webfonts/IBMPlexMono-ExtraLight.otf | Bin 0 -> 62672 bytes assets/webfonts/IBMPlexMono-ExtraLightItalic.otf | Bin 0 -> 68008 bytes assets/webfonts/IBMPlexMono-Italic.otf | Bin 0 -> 68472 bytes assets/webfonts/IBMPlexMono-Light.otf | Bin 0 -> 62708 bytes assets/webfonts/IBMPlexMono-LightItalic.otf | Bin 0 -> 69008 bytes assets/webfonts/IBMPlexMono-Medium.otf | Bin 0 -> 64364 bytes assets/webfonts/IBMPlexMono-MediumItalic.otf | Bin 0 -> 70436 bytes assets/webfonts/IBMPlexMono-Regular.otf | Bin 0 -> 62364 bytes assets/webfonts/IBMPlexMono-SemiBold.otf | Bin 0 -> 64412 bytes assets/webfonts/IBMPlexMono-SemiBoldItalic.otf | Bin 0 -> 70496 bytes assets/webfonts/IBMPlexMono-Text.otf | Bin 0 -> 63652 bytes assets/webfonts/IBMPlexMono-TextItalic.otf | Bin 0 -> 71884 bytes assets/webfonts/IBMPlexMono-Thin.otf | Bin 0 -> 61056 bytes assets/webfonts/IBMPlexMono-ThinItalic.otf | Bin 0 -> 65916 bytes assets/webfonts/IBMPlexSans-Bold.otf | Bin 0 -> 104048 bytes assets/webfonts/IBMPlexSans-BoldItalic.otf | Bin 0 -> 110620 bytes assets/webfonts/IBMPlexSans-ExtraLightItalic.otf | Bin 0 -> 111188 bytes assets/webfonts/IBMPlexSans-Italic.otf | Bin 0 -> 109708 bytes assets/webfonts/IBMPlexSans-Light.otf | Bin 0 -> 104336 bytes assets/webfonts/IBMPlexSans-LightItalic.otf | Bin 0 -> 111284 bytes assets/webfonts/IBMPlexSans-Medium.otf | Bin 0 -> 105964 bytes assets/webfonts/IBMPlexSans-MediumItalic.otf | Bin 0 -> 112452 bytes assets/webfonts/IBMPlexSans-Regular.otf | Bin 0 -> 102728 bytes assets/webfonts/IBMPlexSans-SemiBold.otf | Bin 0 -> 106020 bytes assets/webfonts/IBMPlexSans-SemiBoldItalic.otf | Bin 0 -> 113264 bytes assets/webfonts/IBMPlexSans-Text.otf | Bin 0 -> 104476 bytes assets/webfonts/IBMPlexSans-TextItalic.otf | Bin 0 -> 112408 bytes assets/webfonts/IBMPlexSans-Thin.otf | Bin 0 -> 99856 bytes assets/webfonts/IBMPlexSans-ThinItalic.otf | Bin 0 -> 105708 bytes assets/webfonts/IBMPlexSerif-Bold.otf | Bin 0 -> 110916 bytes assets/webfonts/IBMPlexSerif-BoldItalic.otf | Bin 0 -> 118840 bytes assets/webfonts/IBMPlexSerif-ExtraLight.otf | Bin 0 -> 111256 bytes assets/webfonts/IBMPlexSerif-ExtraLightItalic.otf | Bin 0 -> 117320 bytes assets/webfonts/IBMPlexSerif-Italic.otf | Bin 0 -> 118184 bytes assets/webfonts/IBMPlexSerif-Light.otf | Bin 0 -> 110820 bytes assets/webfonts/IBMPlexSerif-LightItalic.otf | Bin 0 -> 118348 bytes assets/webfonts/IBMPlexSerif-Medium.otf | Bin 0 -> 112192 bytes assets/webfonts/IBMPlexSerif-MediumItalic.otf | Bin 0 -> 121188 bytes assets/webfonts/IBMPlexSerif-Regular.otf | Bin 0 -> 109648 bytes assets/webfonts/IBMPlexSerif-SemiBold.otf | Bin 0 -> 112936 bytes assets/webfonts/IBMPlexSerif-SemiBoldItalic.otf | Bin 0 -> 121352 bytes assets/webfonts/IBMPlexSerif-Text.otf | Bin 0 -> 111588 bytes assets/webfonts/IBMPlexSerif-TextItalic.otf | Bin 0 -> 121104 bytes assets/webfonts/IBMPlexSerif-Thin.otf | Bin 0 -> 105832 bytes assets/webfonts/IBMPlexSerif-ThinItalic.otf | Bin 0 -> 110732 bytes assets/webfonts/SIL Open Font License.txt | 45 ++ assets/webfonts/iosevka-regular.ttf | Bin 0 -> 8523444 bytes assets/webfonts/iosevka-regular.woff2 | Bin 0 -> 1149164 bytes assets/webfonts/iosevka.css | 630 ++++++++++++++++++++++ dnw/static-pages.scm | 178 ++++++ dnw/tags.scm | 65 +++ dnw/theme.scm | 127 +++++ dnw/utils.scm | 37 ++ haunt.scm | 45 ++ org/test.org | 19 + posts/test.html | 42 ++ posts/test.html~ | 42 ++ 63 files changed, 1506 insertions(+) create mode 100644 assets/css/style.css create mode 100644 assets/image/by-sa.svg create mode 100644 assets/image/combgeo.png create mode 100644 assets/image/rss.png create mode 100644 assets/pubkey.txt create mode 100644 assets/webfonts/IBMPlexMono-Bold.otf create mode 100644 assets/webfonts/IBMPlexMono-ExtraLight.otf create mode 100644 assets/webfonts/IBMPlexMono-ExtraLightItalic.otf create mode 100644 assets/webfonts/IBMPlexMono-Italic.otf create mode 100644 assets/webfonts/IBMPlexMono-Light.otf create mode 100644 assets/webfonts/IBMPlexMono-LightItalic.otf create mode 100644 assets/webfonts/IBMPlexMono-Medium.otf create mode 100644 assets/webfonts/IBMPlexMono-MediumItalic.otf create mode 100644 assets/webfonts/IBMPlexMono-Regular.otf create mode 100644 assets/webfonts/IBMPlexMono-SemiBold.otf create mode 100644 assets/webfonts/IBMPlexMono-SemiBoldItalic.otf create mode 100644 assets/webfonts/IBMPlexMono-Text.otf create mode 100644 assets/webfonts/IBMPlexMono-TextItalic.otf create mode 100644 assets/webfonts/IBMPlexMono-Thin.otf create mode 100644 assets/webfonts/IBMPlexMono-ThinItalic.otf create mode 100644 assets/webfonts/IBMPlexSans-Bold.otf create mode 100644 assets/webfonts/IBMPlexSans-BoldItalic.otf create mode 100644 assets/webfonts/IBMPlexSans-ExtraLightItalic.otf create mode 100644 assets/webfonts/IBMPlexSans-Italic.otf create mode 100644 assets/webfonts/IBMPlexSans-Light.otf create mode 100644 assets/webfonts/IBMPlexSans-LightItalic.otf create mode 100644 assets/webfonts/IBMPlexSans-Medium.otf create mode 100644 assets/webfonts/IBMPlexSans-MediumItalic.otf create mode 100644 assets/webfonts/IBMPlexSans-Regular.otf create mode 100644 assets/webfonts/IBMPlexSans-SemiBold.otf create mode 100644 assets/webfonts/IBMPlexSans-SemiBoldItalic.otf create mode 100644 assets/webfonts/IBMPlexSans-Text.otf create mode 100644 assets/webfonts/IBMPlexSans-TextItalic.otf create mode 100644 assets/webfonts/IBMPlexSans-Thin.otf create mode 100644 assets/webfonts/IBMPlexSans-ThinItalic.otf create mode 100644 assets/webfonts/IBMPlexSerif-Bold.otf create mode 100644 assets/webfonts/IBMPlexSerif-BoldItalic.otf create mode 100644 assets/webfonts/IBMPlexSerif-ExtraLight.otf create mode 100644 assets/webfonts/IBMPlexSerif-ExtraLightItalic.otf create mode 100644 assets/webfonts/IBMPlexSerif-Italic.otf create mode 100644 assets/webfonts/IBMPlexSerif-Light.otf create mode 100644 assets/webfonts/IBMPlexSerif-LightItalic.otf create mode 100644 assets/webfonts/IBMPlexSerif-Medium.otf create mode 100644 assets/webfonts/IBMPlexSerif-MediumItalic.otf create mode 100644 assets/webfonts/IBMPlexSerif-Regular.otf create mode 100644 assets/webfonts/IBMPlexSerif-SemiBold.otf create mode 100644 assets/webfonts/IBMPlexSerif-SemiBoldItalic.otf create mode 100644 assets/webfonts/IBMPlexSerif-Text.otf create mode 100644 assets/webfonts/IBMPlexSerif-TextItalic.otf create mode 100644 assets/webfonts/IBMPlexSerif-Thin.otf create mode 100644 assets/webfonts/IBMPlexSerif-ThinItalic.otf create mode 100644 assets/webfonts/SIL Open Font License.txt create mode 100644 assets/webfonts/iosevka-regular.ttf create mode 100644 assets/webfonts/iosevka-regular.woff2 create mode 100644 assets/webfonts/iosevka.css create mode 100644 dnw/static-pages.scm create mode 100644 dnw/tags.scm create mode 100644 dnw/theme.scm create mode 100644 dnw/utils.scm create mode 100644 haunt.scm create mode 100644 org/test.org create mode 100644 posts/test.html create mode 100644 posts/test.html~ diff --git a/assets/css/style.css b/assets/css/style.css new file mode 100644 index 0000000..3f0accd --- /dev/null +++ b/assets/css/style.css @@ -0,0 +1,115 @@ +html { + background-color: #0f1011; +} + +pre { + font-family: Iosevka; + background-color: #292b2b; + border-radius: 0.5rem; + padding: 1rem; + overflow-x: auto; +} + +h1 { + font-size: 1.7rem; +} + +h2 { + font-size: 1.2rem; +} + +section { + padding-top: 1rem; +} + +body { + background-color: #1d1f21; + font-family: IBM Plex Sans; + color: #c5c8c6; + max-width: 54rem; + margin: 0.5rem auto; + position: relative; + padding: 1rem; + border-radius: 4px; + line-height: 150%; +} + +header { + display: flex; + align-items: center; + justify-content: space-between; + border-bottom: 5px double #292b2b; +} + +header ul { + list-style-type: none; + border-left: 5px double #292b2b; + padding-left: 1rem; +} + + +header a img { + max-width: 8rem; +} + + +footer { + margin-top: 2rem; + border-top: 5px double #292b2b; + color: #898b8a; + font-size: 80%; + line-height: 100%; +} + +footer div { + display: flex; + align-items: center; +} +footer img { + height: 1.6rem; + padding-left: 1rem; +} + + +img, +picture, +video { + max-width: 100%; +} + +a { + outline: none; +} + +a:link { + color: #81a2be; +} + +a:visited { + color: #b294bb; +} + +a:focus { + text-decoration: none; + background: #5a5b5a; + +} + +a:hover { + text-decoration: none; + background: #3f3f3f; +} + +a:active { + color: #de935f; +} + +.rss-icon { + max-width: 1.3rem; + padding-left: 0.7rem; +} + +#addressbook { + text-align: center; + border-bottom: 5px double #292b2b; +} diff --git a/assets/image/by-sa.svg b/assets/image/by-sa.svg new file mode 100644 index 0000000..60b44e3 --- /dev/null +++ b/assets/image/by-sa.svg @@ -0,0 +1,74 @@ + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/image/combgeo.png b/assets/image/combgeo.png new file mode 100644 index 0000000..091b9ef Binary files /dev/null and b/assets/image/combgeo.png differ diff --git a/assets/image/rss.png b/assets/image/rss.png new file mode 100644 index 0000000..ac88b1e Binary files /dev/null and b/assets/image/rss.png differ diff --git a/assets/pubkey.txt b/assets/pubkey.txt new file mode 100644 index 0000000..5b3c4f9 --- /dev/null +++ b/assets/pubkey.txt @@ -0,0 +1,87 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +/AmRzA== +=/EIQ +-----END PGP PUBLIC KEY BLOCK----- diff --git a/assets/webfonts/IBMPlexMono-Bold.otf b/assets/webfonts/IBMPlexMono-Bold.otf new file mode 100644 index 0000000..7e66954 Binary files /dev/null and b/assets/webfonts/IBMPlexMono-Bold.otf differ diff --git a/assets/webfonts/IBMPlexMono-ExtraLight.otf b/assets/webfonts/IBMPlexMono-ExtraLight.otf new file mode 100644 index 0000000..fbdfa03 Binary files /dev/null and b/assets/webfonts/IBMPlexMono-ExtraLight.otf differ diff --git a/assets/webfonts/IBMPlexMono-ExtraLightItalic.otf b/assets/webfonts/IBMPlexMono-ExtraLightItalic.otf new file mode 100644 index 0000000..1e6adac Binary files /dev/null and b/assets/webfonts/IBMPlexMono-ExtraLightItalic.otf differ diff --git a/assets/webfonts/IBMPlexMono-Italic.otf b/assets/webfonts/IBMPlexMono-Italic.otf new file mode 100644 index 0000000..f317f41 Binary files /dev/null and b/assets/webfonts/IBMPlexMono-Italic.otf differ diff --git a/assets/webfonts/IBMPlexMono-Light.otf b/assets/webfonts/IBMPlexMono-Light.otf new file mode 100644 index 0000000..22bacee Binary files /dev/null and b/assets/webfonts/IBMPlexMono-Light.otf differ diff --git a/assets/webfonts/IBMPlexMono-LightItalic.otf b/assets/webfonts/IBMPlexMono-LightItalic.otf new file mode 100644 index 0000000..ce0e9a3 Binary files /dev/null and b/assets/webfonts/IBMPlexMono-LightItalic.otf differ diff --git a/assets/webfonts/IBMPlexMono-Medium.otf b/assets/webfonts/IBMPlexMono-Medium.otf new file mode 100644 index 0000000..0af3d17 Binary files /dev/null and b/assets/webfonts/IBMPlexMono-Medium.otf differ diff --git a/assets/webfonts/IBMPlexMono-MediumItalic.otf b/assets/webfonts/IBMPlexMono-MediumItalic.otf new file mode 100644 index 0000000..3b57c72 Binary files /dev/null and b/assets/webfonts/IBMPlexMono-MediumItalic.otf differ diff --git a/assets/webfonts/IBMPlexMono-Regular.otf b/assets/webfonts/IBMPlexMono-Regular.otf new file mode 100644 index 0000000..588d66a Binary files /dev/null and b/assets/webfonts/IBMPlexMono-Regular.otf differ diff --git a/assets/webfonts/IBMPlexMono-SemiBold.otf b/assets/webfonts/IBMPlexMono-SemiBold.otf new file mode 100644 index 0000000..d66f44c Binary files /dev/null and b/assets/webfonts/IBMPlexMono-SemiBold.otf differ diff --git a/assets/webfonts/IBMPlexMono-SemiBoldItalic.otf b/assets/webfonts/IBMPlexMono-SemiBoldItalic.otf new file mode 100644 index 0000000..7603bac Binary files /dev/null and b/assets/webfonts/IBMPlexMono-SemiBoldItalic.otf differ diff --git a/assets/webfonts/IBMPlexMono-Text.otf b/assets/webfonts/IBMPlexMono-Text.otf new file mode 100644 index 0000000..14aa0fd Binary files /dev/null and b/assets/webfonts/IBMPlexMono-Text.otf differ diff --git a/assets/webfonts/IBMPlexMono-TextItalic.otf b/assets/webfonts/IBMPlexMono-TextItalic.otf new file mode 100644 index 0000000..d894c4e Binary files /dev/null and b/assets/webfonts/IBMPlexMono-TextItalic.otf differ diff --git a/assets/webfonts/IBMPlexMono-Thin.otf b/assets/webfonts/IBMPlexMono-Thin.otf new file mode 100644 index 0000000..5d22e93 Binary files /dev/null and b/assets/webfonts/IBMPlexMono-Thin.otf differ diff --git a/assets/webfonts/IBMPlexMono-ThinItalic.otf b/assets/webfonts/IBMPlexMono-ThinItalic.otf new file mode 100644 index 0000000..3229d91 Binary files /dev/null and b/assets/webfonts/IBMPlexMono-ThinItalic.otf differ diff --git a/assets/webfonts/IBMPlexSans-Bold.otf b/assets/webfonts/IBMPlexSans-Bold.otf new file mode 100644 index 0000000..c795df4 Binary files /dev/null and b/assets/webfonts/IBMPlexSans-Bold.otf differ diff --git a/assets/webfonts/IBMPlexSans-BoldItalic.otf b/assets/webfonts/IBMPlexSans-BoldItalic.otf new file mode 100644 index 0000000..de2a35d Binary files /dev/null and b/assets/webfonts/IBMPlexSans-BoldItalic.otf differ diff --git a/assets/webfonts/IBMPlexSans-ExtraLightItalic.otf b/assets/webfonts/IBMPlexSans-ExtraLightItalic.otf new file mode 100644 index 0000000..11548fe Binary files /dev/null and b/assets/webfonts/IBMPlexSans-ExtraLightItalic.otf differ diff --git a/assets/webfonts/IBMPlexSans-Italic.otf b/assets/webfonts/IBMPlexSans-Italic.otf new file mode 100644 index 0000000..f611fea Binary files /dev/null and b/assets/webfonts/IBMPlexSans-Italic.otf differ diff --git a/assets/webfonts/IBMPlexSans-Light.otf b/assets/webfonts/IBMPlexSans-Light.otf new file mode 100644 index 0000000..f1777dd Binary files /dev/null and b/assets/webfonts/IBMPlexSans-Light.otf differ diff --git a/assets/webfonts/IBMPlexSans-LightItalic.otf b/assets/webfonts/IBMPlexSans-LightItalic.otf new file mode 100644 index 0000000..2cf8e23 Binary files /dev/null and b/assets/webfonts/IBMPlexSans-LightItalic.otf differ diff --git a/assets/webfonts/IBMPlexSans-Medium.otf b/assets/webfonts/IBMPlexSans-Medium.otf new file mode 100644 index 0000000..98dac81 Binary files /dev/null and b/assets/webfonts/IBMPlexSans-Medium.otf differ diff --git a/assets/webfonts/IBMPlexSans-MediumItalic.otf b/assets/webfonts/IBMPlexSans-MediumItalic.otf new file mode 100644 index 0000000..6cbc4c9 Binary files /dev/null and b/assets/webfonts/IBMPlexSans-MediumItalic.otf differ diff --git a/assets/webfonts/IBMPlexSans-Regular.otf b/assets/webfonts/IBMPlexSans-Regular.otf new file mode 100644 index 0000000..3ab142d Binary files /dev/null and b/assets/webfonts/IBMPlexSans-Regular.otf differ diff --git a/assets/webfonts/IBMPlexSans-SemiBold.otf b/assets/webfonts/IBMPlexSans-SemiBold.otf new file mode 100644 index 0000000..c0a3f53 Binary files /dev/null and b/assets/webfonts/IBMPlexSans-SemiBold.otf differ diff --git a/assets/webfonts/IBMPlexSans-SemiBoldItalic.otf b/assets/webfonts/IBMPlexSans-SemiBoldItalic.otf new file mode 100644 index 0000000..8d20318 Binary files /dev/null and b/assets/webfonts/IBMPlexSans-SemiBoldItalic.otf differ diff --git a/assets/webfonts/IBMPlexSans-Text.otf b/assets/webfonts/IBMPlexSans-Text.otf new file mode 100644 index 0000000..a2c6fc1 Binary files /dev/null and b/assets/webfonts/IBMPlexSans-Text.otf differ diff --git a/assets/webfonts/IBMPlexSans-TextItalic.otf b/assets/webfonts/IBMPlexSans-TextItalic.otf new file mode 100644 index 0000000..d95c0bc Binary files /dev/null and b/assets/webfonts/IBMPlexSans-TextItalic.otf differ diff --git a/assets/webfonts/IBMPlexSans-Thin.otf b/assets/webfonts/IBMPlexSans-Thin.otf new file mode 100644 index 0000000..11c6d1a Binary files /dev/null and b/assets/webfonts/IBMPlexSans-Thin.otf differ diff --git a/assets/webfonts/IBMPlexSans-ThinItalic.otf b/assets/webfonts/IBMPlexSans-ThinItalic.otf new file mode 100644 index 0000000..f1d8564 Binary files /dev/null and b/assets/webfonts/IBMPlexSans-ThinItalic.otf differ diff --git a/assets/webfonts/IBMPlexSerif-Bold.otf b/assets/webfonts/IBMPlexSerif-Bold.otf new file mode 100644 index 0000000..57395d7 Binary files /dev/null and b/assets/webfonts/IBMPlexSerif-Bold.otf differ diff --git a/assets/webfonts/IBMPlexSerif-BoldItalic.otf b/assets/webfonts/IBMPlexSerif-BoldItalic.otf new file mode 100644 index 0000000..2d30983 Binary files /dev/null and b/assets/webfonts/IBMPlexSerif-BoldItalic.otf differ diff --git a/assets/webfonts/IBMPlexSerif-ExtraLight.otf b/assets/webfonts/IBMPlexSerif-ExtraLight.otf new file mode 100644 index 0000000..b6b6f88 Binary files /dev/null and b/assets/webfonts/IBMPlexSerif-ExtraLight.otf differ diff --git a/assets/webfonts/IBMPlexSerif-ExtraLightItalic.otf b/assets/webfonts/IBMPlexSerif-ExtraLightItalic.otf new file mode 100644 index 0000000..ba4337d Binary files /dev/null and b/assets/webfonts/IBMPlexSerif-ExtraLightItalic.otf differ diff --git a/assets/webfonts/IBMPlexSerif-Italic.otf b/assets/webfonts/IBMPlexSerif-Italic.otf new file mode 100644 index 0000000..b2fd2fe Binary files /dev/null and b/assets/webfonts/IBMPlexSerif-Italic.otf differ diff --git a/assets/webfonts/IBMPlexSerif-Light.otf b/assets/webfonts/IBMPlexSerif-Light.otf new file mode 100644 index 0000000..c54e1b6 Binary files /dev/null and b/assets/webfonts/IBMPlexSerif-Light.otf differ diff --git a/assets/webfonts/IBMPlexSerif-LightItalic.otf b/assets/webfonts/IBMPlexSerif-LightItalic.otf new file mode 100644 index 0000000..6dd3287 Binary files /dev/null and b/assets/webfonts/IBMPlexSerif-LightItalic.otf differ diff --git a/assets/webfonts/IBMPlexSerif-Medium.otf b/assets/webfonts/IBMPlexSerif-Medium.otf new file mode 100644 index 0000000..9ad590e Binary files /dev/null and b/assets/webfonts/IBMPlexSerif-Medium.otf differ diff --git a/assets/webfonts/IBMPlexSerif-MediumItalic.otf b/assets/webfonts/IBMPlexSerif-MediumItalic.otf new file mode 100644 index 0000000..59faca8 Binary files /dev/null and b/assets/webfonts/IBMPlexSerif-MediumItalic.otf differ diff --git a/assets/webfonts/IBMPlexSerif-Regular.otf b/assets/webfonts/IBMPlexSerif-Regular.otf new file mode 100644 index 0000000..bd13427 Binary files /dev/null and b/assets/webfonts/IBMPlexSerif-Regular.otf differ diff --git a/assets/webfonts/IBMPlexSerif-SemiBold.otf b/assets/webfonts/IBMPlexSerif-SemiBold.otf new file mode 100644 index 0000000..44f111e Binary files /dev/null and b/assets/webfonts/IBMPlexSerif-SemiBold.otf differ diff --git a/assets/webfonts/IBMPlexSerif-SemiBoldItalic.otf b/assets/webfonts/IBMPlexSerif-SemiBoldItalic.otf new file mode 100644 index 0000000..d306645 Binary files /dev/null and b/assets/webfonts/IBMPlexSerif-SemiBoldItalic.otf differ diff --git a/assets/webfonts/IBMPlexSerif-Text.otf b/assets/webfonts/IBMPlexSerif-Text.otf new file mode 100644 index 0000000..7cb4d5b Binary files /dev/null and b/assets/webfonts/IBMPlexSerif-Text.otf differ diff --git a/assets/webfonts/IBMPlexSerif-TextItalic.otf b/assets/webfonts/IBMPlexSerif-TextItalic.otf new file mode 100644 index 0000000..8f791a9 Binary files /dev/null and b/assets/webfonts/IBMPlexSerif-TextItalic.otf differ diff --git a/assets/webfonts/IBMPlexSerif-Thin.otf b/assets/webfonts/IBMPlexSerif-Thin.otf new file mode 100644 index 0000000..5ce4224 Binary files /dev/null and b/assets/webfonts/IBMPlexSerif-Thin.otf differ diff --git a/assets/webfonts/IBMPlexSerif-ThinItalic.otf b/assets/webfonts/IBMPlexSerif-ThinItalic.otf new file mode 100644 index 0000000..4551d7a Binary files /dev/null and b/assets/webfonts/IBMPlexSerif-ThinItalic.otf differ diff --git a/assets/webfonts/SIL Open Font License.txt b/assets/webfonts/SIL Open Font License.txt new file mode 100644 index 0000000..f6b53f4 --- /dev/null +++ b/assets/webfonts/SIL Open Font License.txt @@ -0,0 +1,45 @@ +# IBM Plex Typeface + +Copyright © 2017 IBM Corp. with Reserved Font Name "Plex" + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others. + +The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the copyright statement(s). + +"Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, or substituting -- in part or in whole -- any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment. + +"Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission. + +5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. \ No newline at end of file diff --git a/assets/webfonts/iosevka-regular.ttf b/assets/webfonts/iosevka-regular.ttf new file mode 100644 index 0000000..2cbe2ad Binary files /dev/null and b/assets/webfonts/iosevka-regular.ttf differ diff --git a/assets/webfonts/iosevka-regular.woff2 b/assets/webfonts/iosevka-regular.woff2 new file mode 100644 index 0000000..3c0ab84 Binary files /dev/null and b/assets/webfonts/iosevka-regular.woff2 differ diff --git a/assets/webfonts/iosevka.css b/assets/webfonts/iosevka.css new file mode 100644 index 0000000..c16095e --- /dev/null +++ b/assets/webfonts/iosevka.css @@ -0,0 +1,630 @@ + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 100; + font-stretch: normal; + font-style: normal; + src: url('ttf/iosevka-thin.ttf') format('truetype'), url('woff2/iosevka-thin.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 100; + font-stretch: expanded; + font-style: normal; + src: url('ttf/iosevka-extendedthin.ttf') format('truetype'), url('woff2/iosevka-extendedthin.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 100; + font-stretch: normal; + font-style: oblique; + src: url('ttf/iosevka-thinoblique.ttf') format('truetype'), url('woff2/iosevka-thinoblique.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web Oblique'; + font-display: swap; + font-weight: 100; + font-stretch: normal; + src: url('ttf/iosevka-thinoblique.ttf') format('truetype'), url('woff2/iosevka-thinoblique.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 100; + font-stretch: expanded; + font-style: oblique; + src: url('ttf/iosevka-extendedthinoblique.ttf') format('truetype'), url('woff2/iosevka-extendedthinoblique.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web Oblique'; + font-display: swap; + font-weight: 100; + font-stretch: expanded; + src: url('ttf/iosevka-extendedthinoblique.ttf') format('truetype'), url('woff2/iosevka-extendedthinoblique.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 100; + font-stretch: normal; + font-style: italic; + src: url('ttf/iosevka-thinitalic.ttf') format('truetype'), url('woff2/iosevka-thinitalic.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 100; + font-stretch: expanded; + font-style: italic; + src: url('ttf/iosevka-extendedthinitalic.ttf') format('truetype'), url('woff2/iosevka-extendedthinitalic.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 200; + font-stretch: normal; + font-style: normal; + src: url('ttf/iosevka-extralight.ttf') format('truetype'), url('woff2/iosevka-extralight.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 200; + font-stretch: expanded; + font-style: normal; + src: url('ttf/iosevka-extendedextralight.ttf') format('truetype'), url('woff2/iosevka-extendedextralight.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 200; + font-stretch: normal; + font-style: oblique; + src: url('ttf/iosevka-extralightoblique.ttf') format('truetype'), url('woff2/iosevka-extralightoblique.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web Oblique'; + font-display: swap; + font-weight: 200; + font-stretch: normal; + src: url('ttf/iosevka-extralightoblique.ttf') format('truetype'), url('woff2/iosevka-extralightoblique.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 200; + font-stretch: expanded; + font-style: oblique; + src: url('ttf/iosevka-extendedextralightoblique.ttf') format('truetype'), url('woff2/iosevka-extendedextralightoblique.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web Oblique'; + font-display: swap; + font-weight: 200; + font-stretch: expanded; + src: url('ttf/iosevka-extendedextralightoblique.ttf') format('truetype'), url('woff2/iosevka-extendedextralightoblique.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 200; + font-stretch: normal; + font-style: italic; + src: url('ttf/iosevka-extralightitalic.ttf') format('truetype'), url('woff2/iosevka-extralightitalic.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 200; + font-stretch: expanded; + font-style: italic; + src: url('ttf/iosevka-extendedextralightitalic.ttf') format('truetype'), url('woff2/iosevka-extendedextralightitalic.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 300; + font-stretch: normal; + font-style: normal; + src: url('ttf/iosevka-light.ttf') format('truetype'), url('woff2/iosevka-light.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 300; + font-stretch: expanded; + font-style: normal; + src: url('ttf/iosevka-extendedlight.ttf') format('truetype'), url('woff2/iosevka-extendedlight.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 300; + font-stretch: normal; + font-style: oblique; + src: url('ttf/iosevka-lightoblique.ttf') format('truetype'), url('woff2/iosevka-lightoblique.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web Oblique'; + font-display: swap; + font-weight: 300; + font-stretch: normal; + src: url('ttf/iosevka-lightoblique.ttf') format('truetype'), url('woff2/iosevka-lightoblique.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 300; + font-stretch: expanded; + font-style: oblique; + src: url('ttf/iosevka-extendedlightoblique.ttf') format('truetype'), url('woff2/iosevka-extendedlightoblique.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web Oblique'; + font-display: swap; + font-weight: 300; + font-stretch: expanded; + src: url('ttf/iosevka-extendedlightoblique.ttf') format('truetype'), url('woff2/iosevka-extendedlightoblique.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 300; + font-stretch: normal; + font-style: italic; + src: url('ttf/iosevka-lightitalic.ttf') format('truetype'), url('woff2/iosevka-lightitalic.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 300; + font-stretch: expanded; + font-style: italic; + src: url('ttf/iosevka-extendedlightitalic.ttf') format('truetype'), url('woff2/iosevka-extendedlightitalic.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 400; + font-stretch: normal; + font-style: normal; + src: url('ttf/iosevka-regular.ttf') format('truetype'), url('woff2/iosevka-regular.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 400; + font-stretch: expanded; + font-style: normal; + src: url('ttf/iosevka-extended.ttf') format('truetype'), url('woff2/iosevka-extended.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 400; + font-stretch: normal; + font-style: oblique; + src: url('ttf/iosevka-oblique.ttf') format('truetype'), url('woff2/iosevka-oblique.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web Oblique'; + font-display: swap; + font-weight: 400; + font-stretch: normal; + src: url('ttf/iosevka-oblique.ttf') format('truetype'), url('woff2/iosevka-oblique.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 400; + font-stretch: expanded; + font-style: oblique; + src: url('ttf/iosevka-extendedoblique.ttf') format('truetype'), url('woff2/iosevka-extendedoblique.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web Oblique'; + font-display: swap; + font-weight: 400; + font-stretch: expanded; + src: url('ttf/iosevka-extendedoblique.ttf') format('truetype'), url('woff2/iosevka-extendedoblique.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 400; + font-stretch: normal; + font-style: italic; + src: url('ttf/iosevka-italic.ttf') format('truetype'), url('woff2/iosevka-italic.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 400; + font-stretch: expanded; + font-style: italic; + src: url('ttf/iosevka-extendeditalic.ttf') format('truetype'), url('woff2/iosevka-extendeditalic.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 500; + font-stretch: normal; + font-style: normal; + src: url('ttf/iosevka-medium.ttf') format('truetype'), url('woff2/iosevka-medium.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 500; + font-stretch: expanded; + font-style: normal; + src: url('ttf/iosevka-extendedmedium.ttf') format('truetype'), url('woff2/iosevka-extendedmedium.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 500; + font-stretch: normal; + font-style: oblique; + src: url('ttf/iosevka-mediumoblique.ttf') format('truetype'), url('woff2/iosevka-mediumoblique.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web Oblique'; + font-display: swap; + font-weight: 500; + font-stretch: normal; + src: url('ttf/iosevka-mediumoblique.ttf') format('truetype'), url('woff2/iosevka-mediumoblique.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 500; + font-stretch: expanded; + font-style: oblique; + src: url('ttf/iosevka-extendedmediumoblique.ttf') format('truetype'), url('woff2/iosevka-extendedmediumoblique.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web Oblique'; + font-display: swap; + font-weight: 500; + font-stretch: expanded; + src: url('ttf/iosevka-extendedmediumoblique.ttf') format('truetype'), url('woff2/iosevka-extendedmediumoblique.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 500; + font-stretch: normal; + font-style: italic; + src: url('ttf/iosevka-mediumitalic.ttf') format('truetype'), url('woff2/iosevka-mediumitalic.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 500; + font-stretch: expanded; + font-style: italic; + src: url('ttf/iosevka-extendedmediumitalic.ttf') format('truetype'), url('woff2/iosevka-extendedmediumitalic.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 600; + font-stretch: normal; + font-style: normal; + src: url('ttf/iosevka-semibold.ttf') format('truetype'), url('woff2/iosevka-semibold.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 600; + font-stretch: expanded; + font-style: normal; + src: url('ttf/iosevka-extendedsemibold.ttf') format('truetype'), url('woff2/iosevka-extendedsemibold.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 600; + font-stretch: normal; + font-style: oblique; + src: url('ttf/iosevka-semiboldoblique.ttf') format('truetype'), url('woff2/iosevka-semiboldoblique.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web Oblique'; + font-display: swap; + font-weight: 600; + font-stretch: normal; + src: url('ttf/iosevka-semiboldoblique.ttf') format('truetype'), url('woff2/iosevka-semiboldoblique.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 600; + font-stretch: expanded; + font-style: oblique; + src: url('ttf/iosevka-extendedsemiboldoblique.ttf') format('truetype'), url('woff2/iosevka-extendedsemiboldoblique.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web Oblique'; + font-display: swap; + font-weight: 600; + font-stretch: expanded; + src: url('ttf/iosevka-extendedsemiboldoblique.ttf') format('truetype'), url('woff2/iosevka-extendedsemiboldoblique.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 600; + font-stretch: normal; + font-style: italic; + src: url('ttf/iosevka-semibolditalic.ttf') format('truetype'), url('woff2/iosevka-semibolditalic.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 600; + font-stretch: expanded; + font-style: italic; + src: url('ttf/iosevka-extendedsemibolditalic.ttf') format('truetype'), url('woff2/iosevka-extendedsemibolditalic.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 700; + font-stretch: normal; + font-style: normal; + src: url('ttf/iosevka-bold.ttf') format('truetype'), url('woff2/iosevka-bold.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 700; + font-stretch: expanded; + font-style: normal; + src: url('ttf/iosevka-extendedbold.ttf') format('truetype'), url('woff2/iosevka-extendedbold.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 700; + font-stretch: normal; + font-style: oblique; + src: url('ttf/iosevka-boldoblique.ttf') format('truetype'), url('woff2/iosevka-boldoblique.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web Oblique'; + font-display: swap; + font-weight: 700; + font-stretch: normal; + src: url('ttf/iosevka-boldoblique.ttf') format('truetype'), url('woff2/iosevka-boldoblique.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 700; + font-stretch: expanded; + font-style: oblique; + src: url('ttf/iosevka-extendedboldoblique.ttf') format('truetype'), url('woff2/iosevka-extendedboldoblique.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web Oblique'; + font-display: swap; + font-weight: 700; + font-stretch: expanded; + src: url('ttf/iosevka-extendedboldoblique.ttf') format('truetype'), url('woff2/iosevka-extendedboldoblique.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 700; + font-stretch: normal; + font-style: italic; + src: url('ttf/iosevka-bolditalic.ttf') format('truetype'), url('woff2/iosevka-bolditalic.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 700; + font-stretch: expanded; + font-style: italic; + src: url('ttf/iosevka-extendedbolditalic.ttf') format('truetype'), url('woff2/iosevka-extendedbolditalic.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 800; + font-stretch: normal; + font-style: normal; + src: url('ttf/iosevka-extrabold.ttf') format('truetype'), url('woff2/iosevka-extrabold.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 800; + font-stretch: expanded; + font-style: normal; + src: url('ttf/iosevka-extendedextrabold.ttf') format('truetype'), url('woff2/iosevka-extendedextrabold.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 800; + font-stretch: normal; + font-style: oblique; + src: url('ttf/iosevka-extraboldoblique.ttf') format('truetype'), url('woff2/iosevka-extraboldoblique.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web Oblique'; + font-display: swap; + font-weight: 800; + font-stretch: normal; + src: url('ttf/iosevka-extraboldoblique.ttf') format('truetype'), url('woff2/iosevka-extraboldoblique.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 800; + font-stretch: expanded; + font-style: oblique; + src: url('ttf/iosevka-extendedextraboldoblique.ttf') format('truetype'), url('woff2/iosevka-extendedextraboldoblique.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web Oblique'; + font-display: swap; + font-weight: 800; + font-stretch: expanded; + src: url('ttf/iosevka-extendedextraboldoblique.ttf') format('truetype'), url('woff2/iosevka-extendedextraboldoblique.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 800; + font-stretch: normal; + font-style: italic; + src: url('ttf/iosevka-extrabolditalic.ttf') format('truetype'), url('woff2/iosevka-extrabolditalic.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 800; + font-stretch: expanded; + font-style: italic; + src: url('ttf/iosevka-extendedextrabolditalic.ttf') format('truetype'), url('woff2/iosevka-extendedextrabolditalic.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 900; + font-stretch: normal; + font-style: normal; + src: url('ttf/iosevka-heavy.ttf') format('truetype'), url('woff2/iosevka-heavy.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 900; + font-stretch: expanded; + font-style: normal; + src: url('ttf/iosevka-extendedheavy.ttf') format('truetype'), url('woff2/iosevka-extendedheavy.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 900; + font-stretch: normal; + font-style: oblique; + src: url('ttf/iosevka-heavyoblique.ttf') format('truetype'), url('woff2/iosevka-heavyoblique.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web Oblique'; + font-display: swap; + font-weight: 900; + font-stretch: normal; + src: url('ttf/iosevka-heavyoblique.ttf') format('truetype'), url('woff2/iosevka-heavyoblique.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 900; + font-stretch: expanded; + font-style: oblique; + src: url('ttf/iosevka-extendedheavyoblique.ttf') format('truetype'), url('woff2/iosevka-extendedheavyoblique.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web Oblique'; + font-display: swap; + font-weight: 900; + font-stretch: expanded; + src: url('ttf/iosevka-extendedheavyoblique.ttf') format('truetype'), url('woff2/iosevka-extendedheavyoblique.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 900; + font-stretch: normal; + font-style: italic; + src: url('ttf/iosevka-heavyitalic.ttf') format('truetype'), url('woff2/iosevka-heavyitalic.woff2') format('woff2'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 900; + font-stretch: expanded; + font-style: italic; + src: url('ttf/iosevka-extendedheavyitalic.ttf') format('truetype'), url('woff2/iosevka-extendedheavyitalic.woff2') format('woff2'); +} diff --git a/dnw/static-pages.scm b/dnw/static-pages.scm new file mode 100644 index 0000000..578e009 --- /dev/null +++ b/dnw/static-pages.scm @@ -0,0 +1,178 @@ + + +(define-module (dnw static-pages) + #:use-module (ice-9 match) + #:use-module (ice-9 rdelim) + #:use-module (ice-9 popen) + #:use-module (dnw utils) + #:use-module (dnw theme) + #:use-module (dnw tags) + #:use-module (srfi srfi-1) + #:use-module (srfi srfi-19) + #:use-module (sxml simple) + #:use-module (haunt page) + #:use-module (haunt utils) + #:use-module (haunt post) + #:use-module (haunt html) + #:export (index-page + me-page + friends-page + influences-page)) + +;; TODO: tags-template +;; building index-page +(define about + `(section (@ (id "about")) + (div + (p "My name is Duncan. I live below the Mason-Dixon.") + (p "I write down thoughts I think are interesting here.")))) + +(define (recents site posts) + `(section (@ (id "recent")) + (div + (h1 "Recent Posts" + ,(hyperlink "/feed.xml" (image "rss.png" "RSS Feed Icon" "rss-icon"))) + (div (@ (class "post-listing")) + ,(map (lambda (post) + (post-header site post)) + (take-up-to 10 (posts/reverse-chronological posts)))) + ,(hyperlink "/posts" "All Posts")))) + +(define (index-content site posts) + `(,about ,(recents site posts))) + +(define (index-page site posts) + (make-page "/index.html" + (base-template site (index-content site posts) #:title "Home ") + sxml->html)) + +(define me + `((section (@ (id "addressbook")) + (ul (p "GPG: " ,(hyperlink "/assets/pubkey.txt" "A63B DBA0 B4FB 6EAB 1D1A 6665 029C EF3B A922 2674"))) + (ul (p "Email: (rot13 \"qaj@shapgbevny.klm\")") + (p "Matrix: (rot13 \"synzvajnyehf@zngevk.bet\")") + (p "IRC: (rot13 \"SynzvaJnyehf@yvoren.pung\")")) + (ul (p "Nostr: npub1a706jyq9hljs08fsr7ejzr3g4l33fpwnadxp63hmjp6tshfvlcqs6z3w29")) + (ul (p "Github: " ,(hyperlink "https://github.com/Antigravityd" "Antigravityd")))) ;; TODO: consider moving to Sourcehut. + (section (@ (id "prose")) + (h1 "About Me") + (p "My name is Duncan. I am 20, and have lived most of my life in rural Arkansas. I graduated in 2023 from LSU, cum laude, " + "with dual degrees in math and physics, and have at various times been employed as a dishwasher, maintainence guy, tutor, " + "data science intern, embedded developer, and research scientist. I am currently unemployed.") + (p "Had I my druthers, I would like to be able to make a career out of decentralized science, " + "doing physics research and teaching not dependent on the state or the university system and their insidious pollution" + "of the discipline. " + "In the interim, I'm in no way above contributing to society more directly. Hire me; I'll learn anything. I have a " + ,(hyperlink "/assets/cv.pdf" "terrible CV") " you can read.") + (h1 "Academic Interests") + (h2 "Physical Science") + (p "I've planned on studying physics since I was 5. I enjoy studing almost anything that's natural and dead, " + "and all my other interests are largely subsidiary to this. " + "I like the areas where physics intersects with math, particularly when it does so in mathematically-exciting ways. " + "I also " (emph "loved") " my classes about emergent phenomena: thermodynamic, statistical, and condensed-matter physics. " + "I spent the latter half of my time working under Jeff Chancellor's Space Radiation Transport and Applied Nuclear Physics " + "(SpaRTAN physics) research group, doing embedded design of radiation detectors and writing improvements for transport code.") + (h2 "Mathematics") + (p "I view math primarily as a tool for physical science and philosophy in general. " + "Accordingly, I want to get to the frontier of the discipline as fast as possible: I probably will need to make new tools. " + "The only domain that seems not to have borne much practical fruit, except as a " (emph "target") " for developing " + "\"real\" tools, is number theory. " + "However, I particularly like topology/geometry and algebra, and would prefer if analysis and discrete math borrowed " + "as many of its tools and methods as possible.") + (h2 "Computation") + (p "Fundamentally, computer science is a branch of mathematics, in my view. " + "I am interested in ways to compute as abstractly, efficiently, securely, and correctly as possible. " + "As such, I enjoy functional and logic programming languages, which succeed by representing computation in maximally " + "mathematical form, using the abstractions that have been most useful in a general context. " + "I like writing things in Haskell and Lisp. I have written many things in Python, C, and Fortran. " + "I didn't enjoy it (although Fortran was much better than expected—prefered to C). " + "I would like to learn Rust to replace the latter two, and also Lean for formal verification of mathematics and programs. " + "Julia as a scripting language is also intriguing, for projects consumed by people allergic to parentheses. " + "Software that is not " ,(hyperlink "https://gnu.org/philosophy" "Free") " might as well not be software at all. " + "I use GNU Emacs for almost everything.") + (h2 "Engineering") + (p "For all of the above, you have to build real, material things. " + "Physical science requires the construction of detectors, accelerators, and whatnot; " + "mathematics needs blackboards, chalk, printing presses, and a society to ignore; " + "and computation needs computers and network technology. " + "This is predominantly electrical work—designing silicon, circuits, wire protocols, radios, and so on. " + "I've done a fair bit of this. " + "However, that electrical work is predicated on things like power generation, structures to protect the electronics, etc. " + "So, I aspire to learn \"real\" CAD at some point, and understand these things too. ") + (h2 "Praxeology") + (p "There simply is not enough time in a person's life for autarkic, first-principles generation of every part of every thing " + "one's primary interests depend on. " + "It is critically important to understand and verify those steps, but it is necessary to outsource their production. " + "In order to understand the principles under which this outsourcing occurs, why it's even possible at all, " + "and how it need not be vicious, one must study the category of action. " + "Austrian economics, and more generally praxeology, does so correctly. " + "The critical error of conventional economics, as with many social- and life-science disciplines, " + "is thoughtless application of the methods of physical science, without careful consideration of whether the philosophical " + "conditions the correctness of those methods depend are present. " + "These fail spectacularly in analysis of action: the wants and desires of humans are not immutable, comparable quantities. " + "However, Austrian economists tend to thoughtlessly reject methodological precision due to superficial association " + "with these historical fallacies. " + "A mathematical, in the truest sense, grounding for the reasoning of Mises, Rothbard, and Hoppe " + "is a longstanding pet project of mine. ") + (h2 "Foundations: Philosophy and Theology") + (p "All of this again rests on some foundational definitions and propositions about the nature of reality, truth, reason, mind, " + "beauty, and morality. " + "Very recently, I've become acutely interested in these foundations, particularly the philosophy of mathematics and science. " + "I am metaphysically an ardent platonist, and believe that analysis of the problem of perception in a platonist context " + "contains parts identifiable with mathematics and science. " + "This analysis, however, carries little further: I am attracted to methodological anarchy, which holds " + "that there is no essential distinction between practice, philosophy, teaching, and history of science (and mathematics)." + "Anything and everything there is fair game—and many scientific revolutions are the result of such foundational assaults.") + (p "That the philosophical tradition which created the modern world emerged almost exclusively out of Abrahamic religion, " + "and that its sustaining manifestation is almost exclusively owed to Protestant Christians, carries tremedous weight with me." + " I see no essential difference between these theological premises and philosophy, save methodology—" + "the former implemented in story, and the latter rhetoric—and accordingly extend foundational interest to Christiandom.") + (h2 "Blind Spots") + (p "I don't know much about linguistics and aesthetics/art (save the mere verneer to which all men are exposed). " + "These are similarly foundational, as philosophy can only be communicated through language, and must be bootstrapped " + "by the beautiful (usually stories). " + "I would like to learn these things, but am not taking active measures in any capacity to do so at the moment.") + (h1 "Anti-Interests") + (p "I dislike: OOP, Javascript, the Intel Management Engine, almost all TV and movies, number theory, measure theory, " + "drugs, the War on Drugs, appeals to authority, the Federal Reserve System, occupational licensure, and collectivism.") + (h1 "Touching Grass") + (p "I listen to (.*)core, rock and metal from the 60s–80s, microtonal and avant-garde jazz and classical, and old standards. " + "I all-too-seldom go outside: when I remember I enjoy it, I resistance train, hike, (spin|fly) fish, (snow|water) ski, " + "climb, and mountaineer. " + "I read high fantasy and sci-fi obsessively for about 10 years, and occasionally go back through " + "the Tolkein, Jordan, and Sanderson novels I love. " + "I watch a lot of football and baseball; my Tigers picked up a ring in each while I was there.")))) + + +(define (me-page site posts) + (make-page "/pages/me.html" + (base-template site me #:title "Me") + sxml->html)) + +(define friends + `((h1 "Friends") + (p "Blogs/websites of people and corporations I know firsthand, as friends, colleagues, or employers. ") + (table + (tbody + (tr (td ,(hyperlink "https://atlantis-industries.com" "Atlantis Industries")) (td "Worked on retainer with them for a year.")) + (tr (td ,(hyperlink "https://spartanphysics.com/" "SpaRTAN Physics")) (td "Lab I spent half my undergrad in.")) + (tr (td ,(hyperlink "https://www.lsu.edu/physics/people/faculty/chancellor.php" "Jeff Chancellor")) + (td "My undergrad advisor, founder and CTO of Atlantis and director of SpaRTAN Physics.")))))) + +(define (friends-page site posts) + (make-page "/pages/friends.html" + (base-template site friends #:title "Friends") + sxml->html)) + +(define influences + `((h1 "Influences") + (p "Anything and everything I can think of that's affected how I think. ") + (h2 "Blogs") + (h2 "Books and Monographs") + (h2 "Scholarly Articles") + (h2 "Videos and Talks"))) + +(define (influences-page site posts) + (make-page "/pages/influences.html" + (base-template site influences #:title "Influences") + sxml->html)) diff --git a/dnw/tags.scm b/dnw/tags.scm new file mode 100644 index 0000000..0c00354 --- /dev/null +++ b/dnw/tags.scm @@ -0,0 +1,65 @@ + +(define-module (dnw tags) + #:use-module (dnw theme) + #:use-module (haunt post) + #:use-module (srfi srfi-1) + #:use-module (haunt html) + #:use-module (haunt post) + #:use-module (haunt page) + #:use-module (haunt utils) + #:use-module (ice-9 match) + #:export (group-by-tag + count-tags + tag-uri + tags->page + tag-description + desc-alist)) + +(define (group-by-tag posts) + "Given a lisp of haunt posts generate a list grouping tags with the +posts associated with it." + (let ((table (make-hash-table))) + (for-each (lambda (post) + (let ((tags (post-ref post 'tags))) + (for-each (lambda (tag) + (let ((current (hash-ref table tag))) + (if current + (hash-set! table tag (cons post current)) + (hash-set! table tag (list post))))) + tags))) + posts) + (hash-fold alist-cons '() table))) + + +(define (count-tags posts) + "Return a list of tags associated with their count in descending +order." + (sort (map (lambda (tag) + (list (car tag) (length (cdr tag)))) + (group-by-tag posts)) + (lambda (a b) (> (cadr a) (cadr b))))) + + +(define (tag-uri tag) + "Given a TAG return the page that contains only posts associated +with that TAG." + (string-append "/posts/tag/" tag ".html")) + + +(define (tags->page site posts) + (flat-map (match-lambda + ((tag . posts) + (make-page (tag-uri tag) + (base-template site (tags-template site posts #:title tag) + #:title tag) + sxml->html))) + (group-by-tag posts))) + +(define (tag-description tag descalist) + (let ((desc (assoc tag descalist))) + (if desc + `(p ,(cdr desc)) + '(p "No description.")))) + +(define desc-alist + '(("Test" . "This is a test of the tag description feature."))) diff --git a/dnw/theme.scm b/dnw/theme.scm new file mode 100644 index 0000000..69688bc --- /dev/null +++ b/dnw/theme.scm @@ -0,0 +1,127 @@ + + +(define-module (dnw theme) + #:use-module (ice-9 match) + #:use-module (srfi srfi-19) + #:use-module (haunt site) + #:use-module (haunt post) + #:use-module (haunt utils) + #:use-module (dnw utils) + #:use-module (dnw tags) + #:use-module (haunt builder blog) + #:export (dnw-haunt-theme + base-template + post-header + tags-template)) + +(define stylesheets '("style.css")) + +(define nav-bar-tabs '(("Me" "/pages/me.html") + ("Friends" "/pages/friends.html") + ("Influences" "/pages/influences.html") + ("Projects" "/posts/tag/Project.html"))) + +(define dnw-title "Through the Heart of Every Man") + +(define header + `(header + ,(hyperlink "/" (image "combgeo.png" "home")) + (h1 ,dnw-title) + (nav (ul + ,@(map (lambda (tuple) + `(li ,(apply hyperlink (reverse tuple)))) + nav-bar-tabs))))) + +(define footer + `(footer + (div + (p "© 2023 Duncan Wilkie") + ,(image "by-sa.svg" + "Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) Logo")) + (p "Unless otherwise specified, the text and images on this site are free culture works available under the " + ,(hyperlink "https://creativecommons.org/licenses/by-sa/4.0/" + "Creative Commons Attribution Share-Alike 4.0 International") + " license.") + (p "This website is built with " + ,(hyperlink "http://haunt.dthompson.us/" "Haunt") + ", a static site generator written in " + ,(hyperlink "https://gnu.org/software/guile" "Guile Scheme") + ". The source code is available " + ,(hyperlink "https://github.com/Antigravityd/functorial.xyz" "here") + "."))) + +(define* (base-template site body #:key title) + `((doctype html) + (html (@ (lang "en"))) + (head + ,(if (null? title) + `(title title) + `(title ,(string-join (list title dnw-title) " — "))) + (meta (@ (charset "utf-8"))) + (meta (@ (name "viewport") + (content "width=device-width, initial_scale=1"))) + ,@(map (lambda (file-name) (stylesheet file-name)) stylesheets) + (meta (@ (name "HandheldFriendly") (content "True"))) + (meta (@ (name "author") (content "Duncan Wilkie"))) + (meta (@ (name "subject") (content "Ravings of a Madman"))) + (meta (@ (name "medium") (content "blog"))) + (meta (@ (name "og:title") (content ,title)))) + (body (@ (class "")) + ,header + ,body + ,footer))) + +(define (post-meta post) + `(p ,(let ((tgs (post-ref post 'tags)) + (datestr (date->string (post-date post) "~e ~B ~Y"))) + (if tgs + `(,(string-append datestr " | ") + (span (@ (class "tags")) + ,(map (lambda (tag) + `(span + ,(hyperlink (tag-uri tag) tag) + " ")) + tgs))) + datestr)))) + +(define (post-header site post) + `(div (@ (id "post")) + (div (@ (class "title")) + (h2 ,(hyperlink (post-uri site post) + (post-ref post 'title)))) + (div (@ (class "subtitle")) + ,(post-meta post)))) + +(define (post-template post) + `((h1 ,(post-ref post 'title)) + ,(post-meta post) + ,(post-sxml post))) + +(define* (tags-template site posts #:key title) + `((section (@ (id "posts")) + (div (@ (class "container")) + (h1 "Tagged #" ,title) + ,(tag-description title desc-alist) + (div (@ (class "post-listing")) + ,(map (lambda (post) + (post-header site post)) + (posts/reverse-chronological posts))))))) + +(define (collection-template site title posts prefix) + `((section (@ (id "posts")) + (div (@ (class "container")) + (h1 "All Posts" + ,(hyperlink "/feed.xml" (image "rss.png" "RSS Feed Icon" "rss-icon"))) + (div (@ (class "post-listing")) + ,(map (lambda (post) (post-header site post)) + (posts/reverse-chronological posts))))))) + +(define dnw-haunt-theme + (theme #:name "Through the Heart of Every Man" + #:layout + (lambda (site title body) + (base-template + site body + #:title dnw-title)) + #:post-template post-template + #:collection-template collection-template)) diff --git a/dnw/utils.scm b/dnw/utils.scm new file mode 100644 index 0000000..e25ed97 --- /dev/null +++ b/dnw/utils.scm @@ -0,0 +1,37 @@ + +;; Shameless "borrowing" of SXML conveniences from jakob.space and bendersteed.tech. +;; A few modifications and a few additions. + +(define-module (dnw utils) + #:use-module (ice-9 match) + #:use-module (srfi srfi-1) + #:use-module (haunt site) + #:export + (hyperlink + image + stylesheet + script + post-uri)) + +(define (hyperlink target text) + `(a (@ (href ,target)) ,text)) + +(define* (image file-name #:optional description class) + (let ((src (string-append "/assets/image/" file-name))) + (if description + (if class + `(img (@ (src ,src) (alt ,description) (title ,description) (class ,class))) + `(img (@ (src ,src) (alt ,description) (title ,description)))) + (if class + `(img (@ (src ,src) (class ,class))) + `(img (@ (src ,src))))))) + +(define (stylesheet file-name) + `(link (@ (rel "stylesheet") (href ,(format #f "/assets/css/~a" file-name))))) + +(define (script file-name) + (let ((src (string-append "/assets/js/" file-name))) + `(script (@ (src ,src))))) + +(define (post-uri site post) + (string-append "/posts/" (site-post-slug site post) ".html")) diff --git a/haunt.scm b/haunt.scm new file mode 100644 index 0000000..44cfd4d --- /dev/null +++ b/haunt.scm @@ -0,0 +1,45 @@ +;; The main Haunt entry-point for my site. + +(use-modules (haunt site) + (haunt post) + (haunt asset) + (haunt reader) + (haunt builder blog) + (haunt builder atom) + (haunt builder assets) + (haunt publisher rsync) + (dnw theme) + (dnw tags) + (dnw static-pages) + (srfi srfi-19) + (srfi srfi-26)) + + +(define (org-string->date str) + "Convert STR, a string in Org format, into a SRFI-19 date object." + (catch 'misc-error + (lambda () (string->date str "<~Y-~m-~d ~a ~H:~M>")) + (lambda (key . parameters) (string->date str "<~Y-~m-~d ~a>")))) + +(register-metadata-parser! 'date org-string->date) + +(site #:title "Through the Heart of Every Man" + #:domain "functorial.xyz" + #:default-metadata + '((author . "Duncan Wilkie") + (email . "dnw@functorial.xyz")) + #:readers (list html-reader) + #:builders (list (blog + #:theme dnw-haunt-theme + #:prefix "/posts") + index-page + me-page + friends-page + influences-page + tags->page + (atom-feed #:blog-prefix "/posts") + (atom-feeds-by-tag) + (static-directory "assets")) + #:publishers (list (rsync-publisher #:destination "/var/www/functorial" + #:user "publish" + #:host "functorial.xyz"))) diff --git a/org/test.org b/org/test.org new file mode 100644 index 0000000..cc586c5 --- /dev/null +++ b/org/test.org @@ -0,0 +1,19 @@ +# -*- after-save-hook: (ox-haunt-export-to-html); -*- + +#+TITLE: Building a Site with Haunt +#+TAGS: Programming, Lisp, Web, Emacs, Org +#+DATE: <2023-06-23 Fri> + +Hello! This is my first post on this website, which I've created over the last several days with the static site generator [[https:dthompson.us/projects/haunt][Haunt]]. It's my first time really delving into Web tech; I think for pedagogical purposes it was a really effective choice: I know Scheme already from reading SICP and my use of Guix, and Haunt is sufficiently minimal, low-level, and little-used that I learn a good bit of HTML syntax and have to style things with CSS. Conversely, it does enough that it'll be really easy to maintain once up-and-running with it, much moreso than writing bare HTML. + +* An Overview of Haunt + +Haunt, fundamentally, views websites as programs (according to the manual). The actual facts on the ground are a little rockier: the documentation hasn't been updated in a /long/ time, and there are undocumented releases on the git repository with extensive, new convenience featues that seem very basic. The fundamental object is the =site=: a record containing all of the top-level information about the website. Among them are a list of "builder" procedures which synthesize individual pages of the website from input, Scheme code, and external files. The outputs of these builders are "page" objects (something which the command line tells me is deprecated in favor of "serialized-artifacts," which aren't documented anywhere), which are copied into the output directory. There are also "readers," which take as input "posts," blog posts written in a sensible markup format, and output pages representing the posts, alongside corresponding modifications to the site to present a correct aggregation of those posts. Useful, and only in the latest v0.3.0 release, is the =publisher= argument, which takes a description of how to copy all output pages to a remote. The only method currently is rsync, but that's all that's much better than nothing. + +The CLI is bare: =haunt build= to produce output pages, =haunt serve= to pop the output on localhost:8080 (with =--watch= to refresh on file changes), and =haunt publish= to run the publisher on what's been =haunt build='ed most recently. + +Styling is manual, with CSS, unless you would like to build CSS inline style propagation logic into SHTML and rewrite all the Haunt default logic to use it (good idea!). If you decide to also use Haunt, be sure to + +* What I'm Doing With This Site + +Succinctly, writing about anything and everything which takes my fancy. Some of it may not be for you; I will likely write a fair bit about libertarian politics and Christianity. But that should be orthogonal to the rest of it. Take what you like, and leave the rest. diff --git a/posts/test.html b/posts/test.html new file mode 100644 index 0000000..6304857 --- /dev/null +++ b/posts/test.html @@ -0,0 +1,42 @@ +title: Building a Site with Haunt +date: <2023-06-23 Fri> +tags: Programming, Lisp, Web, Emacs, Org +--- +
+

Table of Contents

+ +
+

+Hello! This is my first post on this website, which I've created over the last several days with the static site generator Haunt. It's my first time really delving into Web tech; I think for pedagogical purposes it was a really effective choice: I know Scheme already from reading SICP and my use of Guix, and Haunt is sufficiently minimal, low-level, and little-used that I learn a good bit of HTML syntax and have to style things with CSS. Conversely, it does enough that it'll be really easy to maintain once up-and-running with it, much moreso than writing bare HTML. +

+ +
+

1. An Overview of Haunt

+
+

+Haunt, fundamentally, views websites as programs (according to the manual). The actual facts on the ground are a little rockier: the documentation hasn't been updated in a long time, and there are undocumented releases on the git repository with extensive, new convenience featues that seem very basic. The fundamental object is the site: a record containing all of the top-level information about the website. Among them are a list of "builder" procedures which synthesize individual pages of the website from input, Scheme code, and external files. The outputs of these builders are "page" objects (something which the command line tells me is deprecated in favor of "serialized-artifacts," which aren't documented anywhere), which are copied into the output directory. There are also "readers," which take as input "posts," blog posts written in a sensible markup format, and output pages representing the posts, alongside corresponding modifications to the site to present a correct aggregation of those posts. Useful, and only in the latest v0.3.0 release, is the publisher argument, which takes a description of how to copy all output pages to a remote. The only method currently is rsync, but that's all that's much better than nothing. +

+ +

+The CLI is bare: haunt build to produce output pages, haunt serve to pop the output on localhost:8080 (with --watch to refresh on file changes), and haunt publish to run the publisher on what's been haunt build'ed most recently. +

+ +

+Styling is manual, with CSS, unless you would like to build CSS inline style propagation logic into SHTML and rewrite all the Haunt default logic to use it (good idea!). If you decide to also use Haunt, be sure to +

+
+
+ +
+

2. What I'm Doing With This Site

+
+

+Succinctly, writing about anything and everything which takes my fancy. Some of it may not be for you; I will likely write a fair bit about libertarian politics and Christianity. But that should be orthogonal to the rest of it. Take what you like, and leave the rest. +

+
+
diff --git a/posts/test.html~ b/posts/test.html~ new file mode 100644 index 0000000..c992573 --- /dev/null +++ b/posts/test.html~ @@ -0,0 +1,42 @@ +title: Building a Site with Haunt +date: <2023-06-23 Fri> +tags: Programming, Lisp, Web, Emacs, Org +--- +
+

Table of Contents

+ +
+

+Hello! This is my first post on this website, which I've created over the last several days with the static site generator Haunt. It's my first time really delving into Web tech; I think for pedagogical purposes it was a really effective choice: I know Scheme already from reading SICP and my use of Guix, and Haunt is sufficiently minimal, low-level, and little-used that I learn a good bit of HTML syntax and have to style things with CSS. Conversely, it does enough that it'll be really easy to maintain once up-and-running with it, much moreso than writing bare HTML. +

+ +
+

1. An Overview of Haunt

+
+

+Haunt, fundamentally, views websites as programs (according to the manual). The actual facts on the ground are a little rockier: the documentation hasn't been updated in a long time, and there are undocumented releases on the git repository with extensive, new convenience featues that seem very basic. The fundamental object is the site: a record containing all of the top-level information about the website. Among them are a list of "builder" procedures which synthesize individual pages of the website from input, Scheme code, and external files. The outputs of these builders are "page" objects (something which the command line tells me is deprecated in favor of "serialized-artifacts," which aren't documented anywhere), which are copied into the output directory. There are also "readers," which take as input "posts," blog posts written in a sensible markup format, and output pages representing the posts, alongside corresponding modifications to the site to present a correct aggregation of those posts. Useful, and only in the latest v0.3.0 release, is the publisher argument, which takes a description of how to copy all output pages to a remote. The only method currently is rsync, but that's all that's much better than nothing. +

+ +

+The CLI is bare: haunt build to produce output pages, haunt serve to pop the output on localhost:8080 (with --watch to refresh on file changes), and haunt publish to run the publisher on what's been haunt build'ed most recently. +

+ +

+Styling is manual, with CSS, unless you would like to build CSS inline style propagation logic into SHTML and rewrite all the Haunt default logic to use it (good idea!). +

+
+
+ +
+

2. What I'm Doing With This Site

+
+

+Succinctly, writing about anything and everything which takes my fancy. Some of it may not be for you; I will likely write a fair bit about libertarian politics and Christianity. But that should be orthogonal to the rest of it. Take what you like, and leave the rest. +

+
+
-- cgit v1.2.3