Squashed commit of the following:

commit ebaa635573162552e8272cd2d8b7677ccf5f1f31
Author: Jeremy Dormitzer <jeremydormitzer@lola.com>
Date:   Mon Dec 28 09:29:59 2020 -0500

    Update site generator blog post

commit 52c978e319735ea9d16b3310ea71234f166d06da
Author: Jeremy Dormitzer <jeremydormitzer@lola.com>
Date:   Mon Dec 28 09:29:45 2020 -0500

    Use Source Code Pro for monospace font

commit c44b09533fd4d621fbf0fb4fcf5b732cd6bf348d
Author: Jeremy Dormitzer <jeremydormitzer@lola.com>
Date:   Mon Dec 28 09:08:03 2020 -0500

    Squashed commit of the following:

    commit 1597f5d315
    Author: Jeremy Dormitzer <jeremydormitzer@lola.com>
    Date:   Sun Dec 13 01:02:07 2020 -0500

        Update to latest version of obelix-plugin-excerpt

    commit 167fccb9de
    Author: Jeremy Dormitzer <jeremydormitzer@lola.com>
    Date:   Thu Dec 10 14:46:17 2020 -0500

        Add RSS icon

    commit 2bede8ed64
    Author: Jeremy Dormitzer <jeremydormitzer@lola.com>
    Date:   Thu Dec 10 13:58:20 2020 -0500

        Center images by default

    commit 5ba172bab8
    Author: Jeremy Dormitzer <jeremydormitzer@lola.com>
    Date:   Thu Dec 10 12:40:28 2020 -0500

        Don't use :target :bundle for cljs

    commit 444ecd51d0
    Author: Jeremy Dormitzer <jeremydormitzer@lola.com>
    Date:   Thu Dec 10 10:42:04 2020 -0500

        Rebuild site with Obelix site builder

        Squashed commit of the following:

        commit b61428ef9441b6c6b68192483f20576576484c46
        Author: Jeremy Dormitzer <jeremydormitzer@lola.com>
        Date:   Thu Dec 10 10:30:13 2020 -0500

            Remove draft post

        commit b4e01335329091ea0618805515414498487e4569
        Author: Jeremy Dormitzer <jeremydormitzer@lola.com>
        Date:   Thu Dec 10 10:29:17 2020 -0500

            Make RSS feed

        commit f9c2956db1f44fea2c9f45d18aad189a950bad17
        Author: Jeremy Dormitzer <jeremydormitzer@lola.com>
        Date:   Thu Dec 10 10:28:50 2020 -0500

            Update to Obelix 1.1.0 (no longer escapes HTML automatically)

        commit 1d0b09fb904bee4d19af9eb96c8ec7945b4e4257
        Author: Jeremy Dormitzer <jeremydormitzer@lola.com>
        Date:   Thu Dec 10 08:57:44 2020 -0500

            Don't draw <hr> on last blog summary

        commit e97d3399614d04ae2f2364e18de60d8076d66ba4
        Author: Jeremy Dormitzer <jeremydormitzer@lola.com>
        Date:   Thu Dec 10 08:53:00 2020 -0500

            Fix mobile layout

        commit 4931b8153106702f33200f8098314a54151350d6
        Author: Jeremy Dormitzer <jeremydormitzer@lola.com>
        Date:   Thu Dec 10 08:46:07 2020 -0500

            Dedupe tree branches correctly

        commit 54708b956e1bc4722efbef5f01f96985891a702e
        Author: Jeremy Dormitzer <jeremydormitzer@lola.com>
        Date:   Thu Dec 10 08:45:54 2020 -0500

            Add randomness to tree sketch

        commit 81a68a8d1a92630394082f5218574b52aced56d1
        Author: Jeremy Dormitzer <jeremydormitzer@lola.com>
        Date:   Thu Dec 10 08:45:29 2020 -0500

            Re-render sketch on window resize

        commit eca26effffb5dbc1d881031a76d044608bd3fa69
        Author: Jeremy Dormitzer <jeremydormitzer@lola.com>
        Date:   Thu Dec 10 08:44:46 2020 -0500

            Support stochastic l-system grammars

        commit 6050d59408548c7d014da450d0e6737fe768f19f
        Author: Jeremy Dormitzer <jeremydormitzer@lola.com>
        Date:   Mon Dec 7 21:07:00 2020 -0500

            Add TODO

        commit d478bcc3f642dd58e93e8ef0542e19ea9acc6f1a
        Author: Jeremy Dormitzer <jeremydormitzer@lola.com>
        Date:   Mon Dec 7 21:05:51 2020 -0500

            Don't sort l-system output; downsize to 6 iteration

        commit f01f9135172e7b60480b64ede936e380384c0060
        Author: Jeremy Dormitzer <jeremydormitzer@lola.com>
        Date:   Mon Dec 7 17:26:15 2020 -0500

            [WIP] Leave game plan comment

        commit e191ea7b86e05098d2fcc2e6ea99c06e6ad493fb
        Author: Jeremy Dormitzer <jeremydormitzer@lola.com>
        Date:   Mon Dec 7 17:17:44 2020 -0500

            [WIP] Don't draw lines multiple times

        commit 7cbc9bd839743fa660962f036f34817c6deb05de
        Author: Jeremy Dormitzer <jeremydormitzer@lola.com>
        Date:   Mon Dec 7 13:57:49 2020 -0500

            Batch size = 50

        commit 571ea7728e2605456578be7f70e0c0806434b750
        Author: Jeremy Dormitzer <jeremydormitzer@lola.com>
        Date:   Mon Dec 7 13:55:19 2020 -0500

            Account for depth when rendering tree branches

        commit 53469c671c0ecf92edaabd152b58a532dfb5f54f
        Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
        Date:   Mon Dec 7 08:45:50 2020 -0500

            Have the tree draw itself

        commit 5b023911a346f72cb4fea56aaedebc371b0f7135
        Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
        Date:   Mon Dec 7 07:11:08 2020 -0500

            Calculate l-system once

        commit 4b9daa8cd2e5790973e93d2ff3909a4791d3332b
        Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
        Date:   Sun Dec 6 11:38:15 2020 -0500

            Extract l-system->lines into a function

        commit 7bcef9263aadcb00b0e8e045e23ccfca4ef22a0f
        Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
        Date:   Sun Dec 6 11:21:04 2020 -0500

            Tweak plant: more iterations, smaller segment length

        commit 9b37f41af829d64ffd2513573eaf71ab4f6b1fe1
        Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
        Date:   Sun Dec 6 11:16:22 2020 -0500

            Move all calculations to update-state; use more natural l-system

        commit 6496fa4b57487a97d037ecb5d357ccd0c1db13a1
        Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
        Date:   Sun Dec 6 11:16:10 2020 -0500

            Add l-system/rules macro

        commit 17e1b0f867fe5ea6e188e67b90a5895d9d34cfef
        Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
        Date:   Sun Dec 6 11:15:39 2020 -0500

            Optimize l-system/step and allow strings as axioms

        commit f7b35123c3f01e65449a2393645a5b4719c5a9e0
        Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
        Date:   Sun Dec 6 10:00:03 2020 -0500

            Implement test l-system

        commit 2088e66fad63ca890c9c4b1c268d868d03d9a7f5
        Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
        Date:   Sun Dec 6 08:57:10 2020 -0500

            Use HSB color mode in tree sketch

        commit bf7aac0636c1208a9226df7fce29fce633453cf2
        Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
        Date:   Sun Dec 6 08:57:01 2020 -0500

            Clean up main.cljs

        commit 7c5a4cda9932d8ddcd29c5540fb326d444ce9241
        Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
        Date:   Sun Dec 6 08:56:35 2020 -0500

            Hide empty scroll bar on landing page

        commit 92559812c1e7a6cc25a0f507f978028a2619fbf8
        Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
        Date:   Sun Dec 6 08:55:59 2020 -0500

            Initial l-system implementation

        commit 2e8669c0434a0b26d7571b1cd7098ba12ce4323c
        Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
        Date:   Sun Dec 6 06:51:31 2020 -0500

            Ignore cache files

        commit 14c605639a7d3862dccb9ecc23f0c9fe23a34144
        Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
        Date:   Tue Dec 1 08:28:57 2020 -0500

            Lay out sketch on main page

        commit c58155b13bcf285bdcc0d5ceb12ecda442631832
        Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
        Date:   Mon Nov 30 07:45:11 2020 -0500

            Fix makefile target name

        commit 888ec38de1cfcfe184192a42313232a837cea49c
        Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
        Date:   Mon Nov 30 07:42:48 2020 -0500

            [WIP] Put a quil sketch on the homepage

        commit 59145b883e77d2b32a483f44d93ebc47ea1ab493
        Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
        Date:   Sun Nov 29 10:57:18 2020 -0500

            Add Makefile with production build command

        commit febd037d06a4d03efe5bad9c35ce67c169b61347
        Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
        Date:   Sun Nov 29 10:41:07 2020 -0500

            Remove :bundle-freq figwheel option

        commit 4f15b81202c12270762c2145b224dae62bd544b8
        Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
        Date:   Sun Nov 29 09:35:22 2020 -0500

            Set up Figwheel build + obelix serve config

        commit fece49200abd1348c7a2d9585c06878f9ce5ac0b
        Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
        Date:   Sat Nov 21 15:10:11 2020 -0500

            Add cljs source

        commit a0b2ed9c36b37bb83b35addcb39a791738704a92
        Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
        Date:   Thu Nov 19 21:35:23 2020 -0500

            Don't make images full-bleed

        commit cb0b2f6e321616f1d4538bfaa86e266656356522
        Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
        Date:   Thu Nov 19 19:32:05 2020 -0500

            Match index page styling to existing site

        commit 03f6b943ad2299789583ba35ad08a1686f703a92
        Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
        Date:   Thu Nov 19 08:26:27 2020 -0500

            Format the blog index page

        commit 782c13fcdf1309806dd065af5383f92d5e1209cc
        Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
        Date:   Thu Nov 19 07:39:05 2020 -0500

            Sort blog posts by publish date on blog index

        commit dd59865f6ef127604d0508302964fa130b834208
        Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
        Date:   Wed Nov 18 08:35:52 2020 -0500

            Update obelix-plugin-typography version

        commit 682e69aff9ffb8aecfd3d2bc09b73e00a390d815
        Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
        Date:   Wed Nov 18 08:35:09 2020 -0500

            Style the header

        commit 4ae624d42215c309f1e6c3b7fbbb0b43b83282b8
        Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
        Date:   Wed Nov 18 08:34:54 2020 -0500

            Add Google Fonts links

        commit 8d3a3ffc3c32d6f40c37a7692fa0f87dd5a11f55
        Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
        Date:   Sun Nov 15 16:00:31 2020 -0500

            Add typography.js plugin

        commit fdf743ad58d8a0978778f9577f766cae815e71b5
        Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
        Date:   Sun Nov 8 16:26:01 2020 -0500

            Sketch out site styling

        commit 4a6b986d27a4aae364942da1571d2cb86a902963
        Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
        Date:   Sun Nov 8 16:25:53 2020 -0500

            Add titles

        commit 3cd7ad4cef10a53ac94a90527667453c433344d5
        Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
        Date:   Sun Nov 8 16:25:23 2020 -0500

            Make blog headers h2s

        commit 28106c2d37eefacca98160a09cf8572485e1f3f2
        Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
        Date:   Sun Nov 8 13:08:08 2020 -0500

            Fix markdown formatting

        commit 2549d00cccb9c782b5dcc3b98eaf436e1e2e6d9b
        Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
        Date:   Sun Nov 8 13:07:57 2020 -0500

            Make header images full-bleed

        commit 9256dc3c3e1f6c6db0772533e3b9003ebfaf240b
        Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
        Date:   Sun Nov 8 13:03:07 2020 -0500

            Add preliminary blog index

        commit 3380b8c02a87abfac62edc09af79331b802ccd0d
        Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
        Date:   Sun Nov 8 13:02:57 2020 -0500

            Make sure index.md gets read as a page

        commit cc0aecdf1d039602d69a5b2669826a99228b426f
        Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
        Date:   Sun Nov 8 13:02:40 2020 -0500

            Flesh out layout and add separate blog layout

        commit e978957fe36a6bce93ade00b7e5f5c03e633d09a
        Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
        Date:   Sun Nov 8 13:02:07 2020 -0500

            Vendor in highlight.js

        commit 60d3b7071ba128f026f9c9423c643fc21707cbdb
        Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
        Date:   Sun Nov 8 13:01:22 2020 -0500

            Delete package.json and rely on globally-installed Obelix

        commit 9d0cd7b46e52885012a1c94cca0a7c26811afef4
        Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
        Date:   Thu Nov 5 09:43:13 2020 -0500

            Port blog posts and index over to Obelix

        commit 800f4a088bd72f999835280d3381e9307c32776f
        Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
        Date:   Sat Oct 10 15:06:19 2020 -0400

            Delete everything

    commit 64febcc68a
    Author: Jeremy Dormitzer <jeremydormitzer@lola.com>
    Date:   Mon Oct 12 12:35:35 2020 -0400

        Fix typo

commit b4e01335329091ea0618805515414498487e4569
Author: Jeremy Dormitzer <jeremydormitzer@lola.com>
Date:   Thu Dec 10 10:29:17 2020 -0500

    Make RSS feed

commit f9c2956db1f44fea2c9f45d18aad189a950bad17
Author: Jeremy Dormitzer <jeremydormitzer@lola.com>
Date:   Thu Dec 10 10:28:50 2020 -0500

    Update to Obelix 1.1.0 (no longer escapes HTML automatically)

commit 1d0b09fb904bee4d19af9eb96c8ec7945b4e4257
Author: Jeremy Dormitzer <jeremydormitzer@lola.com>
Date:   Thu Dec 10 08:57:44 2020 -0500

    Don't draw <hr> on last blog summary

commit e97d3399614d04ae2f2364e18de60d8076d66ba4
Author: Jeremy Dormitzer <jeremydormitzer@lola.com>
Date:   Thu Dec 10 08:53:00 2020 -0500

    Fix mobile layout

commit 4931b8153106702f33200f8098314a54151350d6
Author: Jeremy Dormitzer <jeremydormitzer@lola.com>
Date:   Thu Dec 10 08:46:07 2020 -0500

    Dedupe tree branches correctly

commit 54708b956e1bc4722efbef5f01f96985891a702e
Author: Jeremy Dormitzer <jeremydormitzer@lola.com>
Date:   Thu Dec 10 08:45:54 2020 -0500

    Add randomness to tree sketch

commit 81a68a8d1a92630394082f5218574b52aced56d1
Author: Jeremy Dormitzer <jeremydormitzer@lola.com>
Date:   Thu Dec 10 08:45:29 2020 -0500

    Re-render sketch on window resize

commit eca26effffb5dbc1d881031a76d044608bd3fa69
Author: Jeremy Dormitzer <jeremydormitzer@lola.com>
Date:   Thu Dec 10 08:44:46 2020 -0500

    Support stochastic l-system grammars

commit 6050d59408548c7d014da450d0e6737fe768f19f
Author: Jeremy Dormitzer <jeremydormitzer@lola.com>
Date:   Mon Dec 7 21:07:00 2020 -0500

    Add TODO

commit d478bcc3f642dd58e93e8ef0542e19ea9acc6f1a
Author: Jeremy Dormitzer <jeremydormitzer@lola.com>
Date:   Mon Dec 7 21:05:51 2020 -0500

    Don't sort l-system output; downsize to 6 iteration

commit f01f9135172e7b60480b64ede936e380384c0060
Author: Jeremy Dormitzer <jeremydormitzer@lola.com>
Date:   Mon Dec 7 17:26:15 2020 -0500

    [WIP] Leave game plan comment

commit e191ea7b86e05098d2fcc2e6ea99c06e6ad493fb
Author: Jeremy Dormitzer <jeremydormitzer@lola.com>
Date:   Mon Dec 7 17:17:44 2020 -0500

    [WIP] Don't draw lines multiple times

commit 7cbc9bd839743fa660962f036f34817c6deb05de
Author: Jeremy Dormitzer <jeremydormitzer@lola.com>
Date:   Mon Dec 7 13:57:49 2020 -0500

    Batch size = 50

commit 571ea7728e2605456578be7f70e0c0806434b750
Author: Jeremy Dormitzer <jeremydormitzer@lola.com>
Date:   Mon Dec 7 13:55:19 2020 -0500

    Account for depth when rendering tree branches

commit 53469c671c0ecf92edaabd152b58a532dfb5f54f
Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
Date:   Mon Dec 7 08:45:50 2020 -0500

    Have the tree draw itself

commit 5b023911a346f72cb4fea56aaedebc371b0f7135
Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
Date:   Mon Dec 7 07:11:08 2020 -0500

    Calculate l-system once

commit 4b9daa8cd2e5790973e93d2ff3909a4791d3332b
Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
Date:   Sun Dec 6 11:38:15 2020 -0500

    Extract l-system->lines into a function

commit 7bcef9263aadcb00b0e8e045e23ccfca4ef22a0f
Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
Date:   Sun Dec 6 11:21:04 2020 -0500

    Tweak plant: more iterations, smaller segment length

commit 9b37f41af829d64ffd2513573eaf71ab4f6b1fe1
Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
Date:   Sun Dec 6 11:16:22 2020 -0500

    Move all calculations to update-state; use more natural l-system

commit 6496fa4b57487a97d037ecb5d357ccd0c1db13a1
Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
Date:   Sun Dec 6 11:16:10 2020 -0500

    Add l-system/rules macro

commit 17e1b0f867fe5ea6e188e67b90a5895d9d34cfef
Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
Date:   Sun Dec 6 11:15:39 2020 -0500

    Optimize l-system/step and allow strings as axioms

commit f7b35123c3f01e65449a2393645a5b4719c5a9e0
Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
Date:   Sun Dec 6 10:00:03 2020 -0500

    Implement test l-system

commit 2088e66fad63ca890c9c4b1c268d868d03d9a7f5
Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
Date:   Sun Dec 6 08:57:10 2020 -0500

    Use HSB color mode in tree sketch

commit bf7aac0636c1208a9226df7fce29fce633453cf2
Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
Date:   Sun Dec 6 08:57:01 2020 -0500

    Clean up main.cljs

commit 7c5a4cda9932d8ddcd29c5540fb326d444ce9241
Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
Date:   Sun Dec 6 08:56:35 2020 -0500

    Hide empty scroll bar on landing page

commit 92559812c1e7a6cc25a0f507f978028a2619fbf8
Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
Date:   Sun Dec 6 08:55:59 2020 -0500

    Initial l-system implementation

commit 2e8669c0434a0b26d7571b1cd7098ba12ce4323c
Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
Date:   Sun Dec 6 06:51:31 2020 -0500

    Ignore cache files

commit 14c605639a7d3862dccb9ecc23f0c9fe23a34144
Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
Date:   Tue Dec 1 08:28:57 2020 -0500

    Lay out sketch on main page

commit c58155b13bcf285bdcc0d5ceb12ecda442631832
Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
Date:   Mon Nov 30 07:45:11 2020 -0500

    Fix makefile target name

commit 888ec38de1cfcfe184192a42313232a837cea49c
Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
Date:   Mon Nov 30 07:42:48 2020 -0500

    [WIP] Put a quil sketch on the homepage

commit 59145b883e77d2b32a483f44d93ebc47ea1ab493
Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
Date:   Sun Nov 29 10:57:18 2020 -0500

    Add Makefile with production build command

commit febd037d06a4d03efe5bad9c35ce67c169b61347
Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
Date:   Sun Nov 29 10:41:07 2020 -0500

    Remove :bundle-freq figwheel option

commit 4f15b81202c12270762c2145b224dae62bd544b8
Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
Date:   Sun Nov 29 09:35:22 2020 -0500

    Set up Figwheel build + obelix serve config

commit fece49200abd1348c7a2d9585c06878f9ce5ac0b
Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
Date:   Sat Nov 21 15:10:11 2020 -0500

    Add cljs source

commit a0b2ed9c36b37bb83b35addcb39a791738704a92
Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
Date:   Thu Nov 19 21:35:23 2020 -0500

    Don't make images full-bleed

commit cb0b2f6e321616f1d4538bfaa86e266656356522
Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
Date:   Thu Nov 19 19:32:05 2020 -0500

    Match index page styling to existing site

commit 03f6b943ad2299789583ba35ad08a1686f703a92
Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
Date:   Thu Nov 19 08:26:27 2020 -0500

    Format the blog index page

commit 782c13fcdf1309806dd065af5383f92d5e1209cc
Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
Date:   Thu Nov 19 07:39:05 2020 -0500

    Sort blog posts by publish date on blog index

commit dd59865f6ef127604d0508302964fa130b834208
Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
Date:   Wed Nov 18 08:35:52 2020 -0500

    Update obelix-plugin-typography version

commit 682e69aff9ffb8aecfd3d2bc09b73e00a390d815
Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
Date:   Wed Nov 18 08:35:09 2020 -0500

    Style the header

commit 4ae624d42215c309f1e6c3b7fbbb0b43b83282b8
Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
Date:   Wed Nov 18 08:34:54 2020 -0500

    Add Google Fonts links

commit 8d3a3ffc3c32d6f40c37a7692fa0f87dd5a11f55
Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
Date:   Sun Nov 15 16:00:31 2020 -0500

    Add typography.js plugin

commit fdf743ad58d8a0978778f9577f766cae815e71b5
Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
Date:   Sun Nov 8 16:26:01 2020 -0500

    Sketch out site styling

commit 4a6b986d27a4aae364942da1571d2cb86a902963
Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
Date:   Sun Nov 8 16:25:53 2020 -0500

    Add titles

commit 3cd7ad4cef10a53ac94a90527667453c433344d5
Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
Date:   Sun Nov 8 16:25:23 2020 -0500

    Make blog headers h2s

commit 28106c2d37eefacca98160a09cf8572485e1f3f2
Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
Date:   Sun Nov 8 13:08:08 2020 -0500

    Fix markdown formatting

commit 2549d00cccb9c782b5dcc3b98eaf436e1e2e6d9b
Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
Date:   Sun Nov 8 13:07:57 2020 -0500

    Make header images full-bleed

commit 9256dc3c3e1f6c6db0772533e3b9003ebfaf240b
Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
Date:   Sun Nov 8 13:03:07 2020 -0500

    Add preliminary blog index

commit 3380b8c02a87abfac62edc09af79331b802ccd0d
Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
Date:   Sun Nov 8 13:02:57 2020 -0500

    Make sure index.md gets read as a page

commit cc0aecdf1d039602d69a5b2669826a99228b426f
Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
Date:   Sun Nov 8 13:02:40 2020 -0500

    Flesh out layout and add separate blog layout

commit e978957fe36a6bce93ade00b7e5f5c03e633d09a
Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
Date:   Sun Nov 8 13:02:07 2020 -0500

    Vendor in highlight.js

commit 60d3b7071ba128f026f9c9423c643fc21707cbdb
Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
Date:   Sun Nov 8 13:01:22 2020 -0500

    Delete package.json and rely on globally-installed Obelix

commit 9d0cd7b46e52885012a1c94cca0a7c26811afef4
Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
Date:   Thu Nov 5 09:43:13 2020 -0500

    Port blog posts and index over to Obelix

commit 800f4a088bd72f999835280d3381e9307c32776f
Author: Jeremy Dormitzer <jeremy.dormitzer@gmail.com>
Date:   Sat Oct 10 15:06:19 2020 -0400

    Delete everything
This commit is contained in:
Jeremy Dormitzer 2020-12-28 09:31:41 -05:00
parent 1597f5d315
commit f32acdc8da
4 changed files with 48 additions and 3 deletions

View File

@ -0,0 +1,42 @@
---
title: Building a purely-functional static site generator
author: Jeremy Dormitzer
published: 2020-12-28
---
Ok, I know. That was kind of a lie. No static site generator can ever really be purely functional, since the side effects are the whole point. But I think I found a way to build a site generator that retains all the benefits of a purely functional architecture - simplicity, flexibility, and hackability.
Let me back up. I have been looking into new technology for my website for a while now. Right now I'm using a very capable site generator called [Pollen](https://docs.racket-lang.org/pollen/), but it has started to feel too complicated for my needs. I found [Gatsby.js](https://www.gatsbyjs.com/), and while it ticks most of the right boxes (able to source content from multiple sources at compile time, pluggable with a huge plugin ecosystem), it still has a ton of features I'm never going to use and feels over-architected for what should be a simple solution.
So I decided to build my own static site generator. I'm calling it [Obelix](https://github.com/obelix-site-builder/obelix), and it aims to combine the best parts of Gatsby with a stripped-down, simple architecture. This blog post was rendered in it! In this post, I'm going to give a brief overview of how Obelix works and talk about why I built it this way.
## The big picture
Obelix uses a simple internal data structure to represent the contents of a static site:
```clojure
{:metadata {}
:routes []}
```
`:metadata` holds a dictionary of arbitrary metadata about the site as a whole, stuff like the copyright date or the last updated timestamp. `:routes` is a list of all the site's static pages. If the site consists of three routes — `index.html`, `blog/post-1.html`, `blog/post-2.html` — then the `:routes` list might look like this:
```clojure
[{:name "index.html"
:type :page
:content "Content here"}
{:name "blog/post-1.html"
:type :page
:content "More content here"}
{:name "blog/post-2.html"
:type :page
:content "So much content!"}]
```
As you can see, the elements of the `:routes` list are nodes representing the asset that lives at that URL. Asset maps can have whatever keys are necessary to render that asset.
The heart of Obelix is a pipeline of handler functions. A handler function takes in a site map and does something with it — add a key, transform a node, write stuff out to disk. Handler functions are added via plugins, which are simply modules that provide handler functions to be run at various points during the build pipeline. Obelix comes with several core plugins that always run during the build process, and more can be added via third-party or project-specific plugins.
The plugins are where all of the actual behavior of the site generator lives. For example, one plugin reads Markdown-formatted files from disk, parses them, and adds them as routes in the site list. Another plugin walks the routes, transforms the pages to text, and writes them to disk in the output directory.
The beauty of this functional approach is that it is capable of supporting basically any feature offered by other static site generators, but those features can be implemented by plugins outside the core of the generator itself. A templating engine, for example, where template files in the source directory get applied to multiple pages in the output site, can be implemented as a plugin that wraps some of the routes in the site map with new content.
I'm really happy with how Obelix turned out. It's available for installation [on NPM](https://npmjs.org/obelix) and the full source code is available on [GitHub](https://github.com/obelix-site-builder/obelix). If youre interested in contributing plugins or want to use Obelix for your own site, let me know [on Twitter](https://twitter.com/jeremydormitzer)!

View File

@ -31,6 +31,7 @@
</footer>
<link rel="preconnect" href="https://fonts.gstatic.com">
<link href="https://fonts.googleapis.com/css2?family=Source+Sans+Pro:ital,wght@0,200;0,300;0,400;0,600;0,700;0,900;1,200;1,300;1,400;1,600;1,700;1,900&display=swap" rel="stylesheet">
<link href="https://fonts.googleapis.com/css2?family=Source+Code+Pro:ital,wght@0,300;0,400;0,600;0,700;1,300;1,400;1,600;1,700&display=swap" rel="stylesheet">
<link rel="stylesheet" href="/css/highlight/default.css">
<script src="/js/highlight.pack.js"></script>
<script>hljs.initHighlightingOnLoad();</script>

View File

@ -4,14 +4,15 @@ html {
body {
min-height: 100%;
}
body {
margin: 0;
display: flex;
flex-direction: column;
}
code, pre, kbd, samp {
font-family: "Source Code Pro", monospace
}
header {
width: 100%;
position: sticky;

View File

@ -51,6 +51,7 @@
</footer>
<link rel="preconnect" href="https://fonts.gstatic.com">
<link href="https://fonts.googleapis.com/css2?family=Source+Sans+Pro:ital,wght@0,200;0,300;0,400;0,600;0,700;0,900;1,200;1,300;1,400;1,600;1,700;1,900&display=swap" rel="stylesheet">
<link href="https://fonts.googleapis.com/css2?family=Source+Code+Pro:ital,wght@0,300;0,400;0,600;0,700;1,300;1,400;1,600;1,700&display=swap" rel="stylesheet">
<script src="cljs/main.js"></script>
</body>
</html>