Something went wrong. Try again.
ssg
Something went wrong. Try again.
12<!DOCTYPE HTML><html lang="en" data-theme="light"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>nde: parser</title><link rel="stylesheet" href="../styles/reset.css"><link rel="stylesheet" href="../styles/prima.css"></head><body class="node-page"><main class="main-content"><h1>node: parser</h1><div><h1><a href="../f/agora.html">Agora: SSG after eleven months' crawling</a></h1><div class="metadata"><span class="date">2026-03-11</span><span class="ndes"><a href="../n/haskell.html">haskell</a>, <a href="../n/parser.html">parser</a>, <a href="../n/SSG.html">SSG</a>, <a href="../n/2026.html">2026</a></span></div><div class="description">Agora is a personal static site generator engineered to sustain an ideal writing environment. This essay traces eleven months of architectural evolution, moving through genesis stoa markup and S-expression inspired markup iterations before settling on a final literate programming design.</div></div></main><nav class="bottom-nav"><a href="../index.html">⌂</a><a href="../feed.xml">⌗</a><a href="../license">©</a><a href="#" id="theme-toggle" title="toggle theme">◐</a></nav><script>MathJax = { loader: { load: ['ui/lazy'] }, options: { skipHtmlTags: ['script','noscript','style','textarea','pre'], lazyMargin: '300px', renderActions: { find: [10, function(doc) { for (const node of document.querySelectorAll('.math-block')) { const math = new doc.options.MathItem( node.textContent, doc.inputJax[0], true ); const text = document.createTextNode(''); node.parentNode.replaceChild(text, node); math.start = {node: text, delim: '', n: 0}; math.end = {node: text, delim: '', n: 0}; doc.math.push(math); } for (const node of document.querySelectorAll('.inlinemath')) { const math = new doc.options.MathItem( node.textContent, doc.inputJax[0], false ); const text = document.createTextNode(''); node.parentNode.replaceChild(text, node); math.start = {node: text, delim: '', n: 0}; math.end = {node: text, delim: '', n: 0}; doc.math.push(math); } }, ''] } }, tex: { inlineMath: [], displayMath: [], packages: {'[+]': ['ams', 'boldsymbol']} }, svg: { fontCache: 'global' }};</script><script src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js" defer=""></script><script>document.addEventListener('DOMContentLoaded', function() { var themeToggle = document.getElementById('theme-toggle'); var html = document.documentElement; var savedTheme = localStorage.getItem('theme') || 'light'; html.setAttribute('data-theme', savedTheme); if (!themeToggle) return; themeToggle.addEventListener('click', function(e) { e.preventDefault(); var currentTheme = html.getAttribute('data-theme'); var newTheme = currentTheme === 'light' ? 'dark' : 'light'; html.setAttribute('data-theme', newTheme); localStorage.setItem('theme', newTheme); });});</script><script>document.addEventListener('DOMContentLoaded', function() { var nav = document.querySelector('.bottom-nav'); if (!nav) return; var thr = 32; function upd() { var y = window.scrollY || document.documentElement.scrollTop; var max = document.documentElement.scrollHeight - window.innerHeight; var sht = max < thr ? y > 0 : y >= thr; nav.classList.toggle('is-visible', sht); } window.addEventListener('scroll', upd, { passive: true }); upd();});</script></body></html>