sites/randogoth.com/pelicanconf.py

92 lines
3.3 KiB
Python
Raw Normal View History

AUTHOR = 'randogoth'
SITENAME = 'RANDOGOTH'
SITEURL = ''
PATH = 'content'
TIMEZONE = 'Asia/Jerusalem'
DEFAULT_LANG = 'en'
# An ANSI bulletin board. The TuiCSS theme that came over from TRL was a DOS
# *application*: grey chrome, dialogs, a menu bar. A board is a different thing,
# and the one actually wanted here. mc-pelican stays in the tree as the fallback.
THEME = 'bbs'
feat: render randogoth.com as a small-net capsule A Pelican generator that writes a capsule beside the HTML build: plain Markdown plus per-directory .itsybitsy.toml sidecars, which a protocol daemon converts per request to gemtext, XHTML-MP, WML or plain text. The obstacle was recorded in the README as "smolweb reads YAML frontmatter while Pelican uses bare Title: lines". Both halves turned out to be wrong: itsybitsy parses no frontmatter at all, by design, and metadata lives outside the document. So the transform is not a translation between dialects, it is a removal, and a protocol daemon stays ignorant of one static generator. Nothing in plugins/smolnet.py is specific to this site. Every difference is a setting and every setting has a default, so another site enables it with PLUGINS = ['smolnet']. It sits at the repo root for the same reason flux.vision reaches into tobias.raayoni-last.com for lostimages. Index entries are emitted as link-only paragraphs rather than Markdown lists, which is not a style choice: the gemtext renderer prints a bare => line for a paragraph holding nothing but links, and a bullet *and* a => line for a list item, so a list would publish every entry twice. Gemini clients number link lines themselves, so the board's dial-an-area-by-number idiom survives into the capsule without emitting a single bracket. The trade-off is in the docstring: the text renderer reflows such a run into prose, which costs nothing here because randogoth.com is not getting Nex or Gopher. Also drops a Zemanta tracking pixel that came in with a 2012 blog import and is live on the site today, firing a third-party request on every view of that article. It would have been worse in the capsule, where an image becomes a visible link line advertising a dead tracker. It was the only one across all three sites. Verified by serving the output with the real daemon: 41 articles, 2 pages, 6 area indexes and an archive, no metadata surviving, no {filename} left, trl@posteo.net revealed on Connect where the renderer would otherwise have dropped it with its enclosing HTML, images served as image/png, and the index rendering as a clean run of => lines in gemtext and as XHTML Mobile over HTTP. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-10-06 08:24:18 +03:00
PLUGIN_PATHS = ['plugins', '../plugins']
PLUGINS = ['crtimages', 'smolnet']
# The sections are message areas, numbered so they can be dialled by key the way
# a board's main menu works. No descriptions: the names are the whole listing,
# as they were on a real board, and working out what an area holds is the point.
BBS_AREAS = {
'RANDOM': 1, 'PLACE': 2, 'MINIMAL': 3,
'MACHINES': 4, 'GONZO': 5, 'ENDTIMES': 6,
}
feat: render randogoth.com as a small-net capsule A Pelican generator that writes a capsule beside the HTML build: plain Markdown plus per-directory .itsybitsy.toml sidecars, which a protocol daemon converts per request to gemtext, XHTML-MP, WML or plain text. The obstacle was recorded in the README as "smolweb reads YAML frontmatter while Pelican uses bare Title: lines". Both halves turned out to be wrong: itsybitsy parses no frontmatter at all, by design, and metadata lives outside the document. So the transform is not a translation between dialects, it is a removal, and a protocol daemon stays ignorant of one static generator. Nothing in plugins/smolnet.py is specific to this site. Every difference is a setting and every setting has a default, so another site enables it with PLUGINS = ['smolnet']. It sits at the repo root for the same reason flux.vision reaches into tobias.raayoni-last.com for lostimages. Index entries are emitted as link-only paragraphs rather than Markdown lists, which is not a style choice: the gemtext renderer prints a bare => line for a paragraph holding nothing but links, and a bullet *and* a => line for a list item, so a list would publish every entry twice. Gemini clients number link lines themselves, so the board's dial-an-area-by-number idiom survives into the capsule without emitting a single bracket. The trade-off is in the docstring: the text renderer reflows such a run into prose, which costs nothing here because randogoth.com is not getting Nex or Gopher. Also drops a Zemanta tracking pixel that came in with a 2012 blog import and is live on the site today, firing a third-party request on every view of that article. It would have been worse in the capsule, where an image becomes a visible link line advertising a dead tracker. It was the only one across all three sites. Verified by serving the output with the real daemon: 41 articles, 2 pages, 6 area indexes and an archive, no metadata surviving, no {filename} left, trl@posteo.net revealed on Connect where the renderer would otherwise have dropped it with its enclosing HTML, images served as image/png, and the index rendering as a clean run of => lines in gemtext and as XHTML Mobile over HTTP. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-10-06 08:24:18 +03:00
# The capsule mirrors the board: same areas, same order, same words. Gemini
# clients number link lines themselves, so an area is still dialled by number
# over there without the plugin writing a single bracket.
SMOLNET_SECTION_DIR = 'area'
SMOLNET_SECTION_ORDER = BBS_AREAS
SMOLNET_LABELS = {
'sections': 'Message areas', 'latest': 'Latest messages',
'archive': 'All messages', 'back': 'Main menu', 'pages': 'System',
}
# The address is rot13 in the HTML because of web crawlers. That defence needs
# JavaScript, which Gemini does not have, and the renderer drops raw HTML, so
# without this the one thing the Connect page exists to carry would vanish.
SMOLNET_ROT13_ATTR = 'data-r'
# Articles live flat in content/; assets are carved out of that.
ARTICLE_PATHS = ['']
ARTICLE_EXCLUDES = ['pages', 'library', 'images', 'files']
PAGE_PATHS = ['pages']
STATIC_PATHS = ['library', 'images', 'files']
# Flat slugs, for the reason TRL learned the hard way: sections get reworked and
# every reassignment moves a URL. The section lives in the listing, not the path.
ARTICLE_URL = '{slug}.html'
ARTICLE_SAVE_AS = '{slug}.html'
PAGE_URL = '{slug}.html'
PAGE_SAVE_AS = '{slug}.html'
CATEGORY_URL = 'section/{slug}.html'
CATEGORY_SAVE_AS = 'section/{slug}.html'
CATEGORIES_SAVE_AS = 'sections.html'
TAG_URL = 'tag/{slug}.html'
TAG_SAVE_AS = 'tag/{slug}.html'
TAGS_SAVE_AS = 'tags.html'
ARCHIVES_SAVE_AS = 'archives.html'
AUTHOR_SAVE_AS = ''
AUTHORS_SAVE_AS = ''
# Unlike the other two sites, this one is a blog, so it is paginated and it has
# feeds. People should be able to subscribe to a devlog without visiting it.
DEFAULT_PAGINATION = 15
FEED_ALL_ATOM = 'feeds/all.atom.xml'
FEED_ALL_RSS = 'feeds/all.rss.xml'
CATEGORY_FEED_ATOM = 'feeds/{slug}.atom.xml'
CATEGORY_FEED_RSS = 'feeds/{slug}.rss.xml'
TRANSLATION_FEED_ATOM = None
AUTHOR_FEED_ATOM = None
AUTHOR_FEED_RSS = None
# The eight sections are the navigation, the way a file manager shows directories.
DISPLAY_CATEGORIES_ON_MENU = True
DISPLAY_PAGES_ON_MENU = False
MENUITEMS = [
('ARCHIVES', '/archives.html'),
('TAGS', '/tags.html'),
]
# No nl2br. The recovered bodies are hard wrapped at roughly 70 characters, so it
# turns every source line into a forced break and the prose stops reflowing.
MARKDOWN = {
'extension_configs': {
'markdown.extensions.tables': {},
'markdown.extensions.footnotes': {},
'markdown.extensions.codehilite': {'css_class': 'highlight'},
'markdown.extensions.extra': {},
},
'output_format': 'html5',
}
DELETE_OUTPUT_DIRECTORY = True
CACHE_CONTENT = False