summaryrefslogtreecommitdiff
path: root/layouts
Commit message (Collapse)AuthorAge
* End generated capsule pages with a newlineNicholas Johnson11 hours
| | | | | | | | | | | | | | | | | The templates gained a final newline, but the gemtext pages they build did not: the base template trimmed its own away, so every .gmi file ended mid-line and was not a POSIX text file either. The web pages and the feeds already ended with one. Stop trimming the newline after the footer partial in the gemtext base template. The footer partial keeps its own trim marker, so that the newline is emitted once rather than twice. Every generated file in the example site, gemtext and web alike, now ends with exactly one newline, and the capsule pages are otherwise byte-identical. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
* End every template file with a newlineNicholas Johnson11 hours
| | | | | | | | | | | | | | | | | | | | | Fifteen templates ended without a final newline, so they were not text files by the POSIX definition: tools that read whole lines, including sed, wc -l, read and shells' command substitution, drop or mangle the last line, and diffs of them carry a "\ No newline at end of file" marker that hides which side changed. Add the newline. The gemtext output may not change, so the four templates whose last action is emitted verbatim into a capsule page trim it away again with "-}}". The templates that end by closing a define block need no marker, since the newline then falls outside the block and is never executed, as section.gmi and single.gmi already showed. The capsule builds byte-identical gemtext and the feeds are unchanged. Web pages gain the trailing newline their templates now have, which ends the generated HTML with an EOL too. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
* Drop whitespace trimming from HTML and XML templatesNicholas Johnson11 hours
| | | | | | | | | | | | | | | | | | | | | | | | | Whitespace has no effect on the HTML and Atom output, so the trim markers on nearly every action in those templates bought nothing and made them harder to read and to edit: a maintainer had to carry the markers along with the change. The markers are load-bearing in the gemtext templates alone, where output whitespace is the formatting. Remove them from the HTML and Atom templates. The audio partial keeps its markers, since the gemtext single template uses it too. The two markup render hooks keep theirs as well, because their output is spliced inline into prose, where the newlines an untrimmed hook emits render as a space before the punctuation that follows a link. The Atom templates compute their author and entry variables before emitting anything, so untrimmed they put blank lines ahead of the XML declaration and left every feed malformed. Emit the declaration first instead; whitespace is allowed after it but not before it. The example site builds byte-identical gemtext and content-identical feeds, and its HTML differs only by a space after a "p" start tag that the whitespace processing model drops. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
* Add section templatesNicholas Johnson11 hours
| | | | | | | | | | | | Every build logged "found no layout file for html for kind section", and the section URL that Hugo generates for the entry directory was rendered as an empty page in both output formats. The warning was left for each site using the theme to work around. List the section's pages the way the term templates do, and link the section feed when the site configures one. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
* Handle missing optional site files gracefullyNicholas Johnson12 hours
| | | | | | | | | | | | | | Two site files the theme reads were assumed to exist. A site without templates/logo.txt got an empty preformatted block at the top of every page in both output formats, styled with the logo's margins, rather than no logo at all. A typo in params.custom_css produced a nil pointer error naming only the template line, since the result of resources.Get was used without checking it. Skip the header entirely when there is no logo, and report a missing stylesheet by name. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
* Ignore blank lines between front matter and entry bodyNicholas Johnson12 hours
| | | | | | | | | | | | | | .RawContent keeps the newline that follows the closing front matter delimiter, and only trailing whitespace was being chomped. An entry written with a blank line there, which is what the entry archetype produces, got one more blank line under its pageinfo line in the gemtext than an entry written without one. The same leading newline also hid a heading on the first line from the check that decides whether to add a separating newline, since that pattern is anchored to the start of the content. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
* Drop scripting URL schemes from links and imagesNicholas Johnson14 hours
| | | | | | | | | | | | | | | | | Both render hooks passed the destination through safeURL, which bypasses the sanitising that html/template would otherwise apply, so a javascript: or data:text/html destination in Markdown became a live scripting URL in the page. That matters for any site built from content its author did not write. safeURL cannot simply be dropped: it is what allows gemini:// and other schemes html/template does not recognise to survive, which this theme depends on. Reject the scripting schemes explicitly instead, render the link text on its own, and warn during the build so the author can see what was dropped. data: is still allowed for images, where it is a legitimate way to inline one. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
* Choose the best audio version of an entryNicholas Johnson14 hours
| | | | | | | | | | | | | | | | | | | | | | | | | Both templates took element 0 of the entry's audio resources, so an entry carrying more than one encoding used whichever filename sorted first, with no way to express a preference. An entry with a careful encoding and an mp3 beside it would commonly have offered the mp3. Order the resources by how they sound instead. Public listening tests put Opus ahead of the field at the bitrates spoken word uses, with Vorbis and AAC close behind it and MP3 last; the lossless formats come after the lossy ones rather than before, since a browser that can play FLAC would otherwise fetch several times the bytes for no audible gain. Formats the theme does not rank keep Hugo's own order at the end. The capsule links the first of them, since a Gemini client cannot choose between sources and a reader wants one file to fetch. The website offers them all as the alternative sources that the audio element exists to choose between, best first, so a browser plays the best encoding it understands. Hugo reports .opus, .oga and .ogg alike as audio/ogg, so the ordering keys off the file extension rather than the media type. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
* Include the site title in page titlesNicholas Johnson14 hours
| | | | | | | | | | | Entry and taxonomy pages set the document title to the page title on its own, so a bookmark, a browser tab or a search result gave no indication of which site the page belonged to. Append the site title everywhere except the homepage, where the two are already the same. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
* Fix entry heading anchors on page bundlesNicholas Johnson14 hours
| | | | | | | | | | | | | | The heading id came from .File.TranslationBaseName, which is "index" for every leaf bundle. Since audio versions require an entry to be a bundle, every entry with audio got the same meaningless anchor, and pages built by a content adapter would have taken the name of the directory holding the adapter. Derive the id from the page's own URL instead. Single file entries keep the anchors they already had, and bundles, adapter built pages and custom slugs now each get their own. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
* Advertise Atom feeds to browsers and readersNicholas Johnson14 hours
| | | | | | | | | | | | The feeds were only reachable by following the visible link on a taxonomy or term page, and the homepage did not link to its feed at all. Without a rel="alternate" element in the document head, feed readers and browser extensions cannot discover a feed from the page it belongs to. Emit the link on any page that has an Atom output format, so each page advertises its own feed rather than a hardcoded site-wide one. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
* Fix empty entry heading on sites without journal entriesNicholas Johnson14 hours
| | | | | | | | | | | | The "Journal Entries" heading was guarded by .Site.RegularPages while the list below it was filtered to the "entry" section. A site with pages but no entries rendered the heading with nothing under it. Guard on the filtered collection instead. This also drops the .ByTitle sort, which was immediately discarded by the .ByPublishDate.Reverse that followed it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
* Order feeds by publish date rather than dateNicholas Johnson14 hours
| | | | | | | | | | Every listing in the theme is built from .PublishDate, but the feeds timestamped entries with .Date and left them in Hugo's default order. An entry that set both front matter keys was therefore advertised to readers with a different date, and potentially in a different order, than it appeared in on the site. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
* Limit home feeds to journal entriesNicholas Johnson14 hours
| | | | | | | | | | | | The homepage lists only pages in the "entry" section, but its feeds ranged over every regular page. Standalone pages such as an about page were therefore published to subscribers while never appearing on the homepage itself. Apply the same section filter the homepage templates use, so the feed and the page it describes agree on what an entry is. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
* Error on generating Atom feeds without an authorNicholas Johnson14 hours
| | | | | | | | | RFC 4287 requires every feed to carry an atom:author unless all of its entries carry one. Entries here never do, and the feed-level author was emitted only when params.author was set, so any site that did not set it published feeds that no conforming validator accepts. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
* Fix preformatted text opening an entry being treated as proseNicholas Johnson2 days
| | | | | | | | | | | | | | | The chunking regex required at least one character before a preformatted block, so a block starting on the first line of an entry could never match the preformatted branch and fell through to the prose branch. Its contents were then run through the prose substitutions: asterisks were stripped, ordered list items were rewritten as unordered ones and links were turned into references, inside text that must be reproduced verbatim. Allow the leading segment to be empty. Blocks elsewhere in an entry, multiple blocks and reference numbering are unaffected. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
* Fix build failure when RSS limit is unsetNicholas Johnson2 days
| | | | | | | | | | | | | Hugo's default for services.rss.limit is -1 (unlimited), and passing a negative length to "first" aborts the build with "sequence length must be non-negative". Every feed template did this unconditionally, so any site that did not explicitly set services.rss.limit failed to build at all, rather than degrading to an unlimited feed. Only apply "first" when a positive limit is configured, which is the same guard Hugo's own internal RSS template uses. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
* Add audio support for entries on capsuleNicholas Johnson2026-09-06
|
* Move pageinfo below heading for capsuleNicholas Johnson2026-09-06
|
* Add audio support for entries on websiteNicholas Johnson2026-09-06
|
* Move pageinfo below heading for websiteNicholas Johnson2026-09-06
|
* Minify and fingerprint CSS stylesheetNicholas Johnson2026-09-06
| | | | This improves page performance and load times.
* Replace ".Name" with ".Title" for entry headingsNicholas Johnson2026-09-06
| | | | | I'm not sure if this change makes a difference, but .Title seems to be the canonical option in this context.
* Replace visual dividers w/space for entry metadataNicholas Johnson2026-09-06
| | | | Less visual clutter, improves readability.
* Remove extra space created by Flexbox usageNicholas Johnson2025-07-27
|
* Make footer stick to bottom of pageNicholas Johnson2025-07-27
|
* Remove support for deprecated key "site.Author"Nicholas Johnson2025-07-27
| | | | | This Hugo theme no longer supports the Hugo versions that can utilize the key "site.Author", so this code never executes.
* Migrate fully to Hugo's new template systemNicholas Johnson2025-07-26
| | | | | This was the only way I could get term pages to consistently render correctly.
* Move taxonomy and term layouts to layouts/_defaultNicholas Johnson2025-07-24
| | | | | | | | | | | | | | | | | | | Hugo's template system was reimplemented in Hugo version 0.146.0. "We [the Hugo developers] have aimed to maintain as much backward compatibility as possible by mapping "old to new," but some reported breakages have occurred." Reference: https://gohugo.io/templates/new-templatesystem-overview/ The "mapping "old to new,"" is not yet documented, but moving the taxonomy and term layouts to layouts/_default seems to be sufficient to properly generate this theme on Hugo versions later than 0.146.0. To retain backward compatibility with older Hugo versions, the other recommended changes to the layouts directory are not made. Reference: https://gohugo.io/templates/new-templatesystem-overview/#changes-to-the-layouts-folder
* Add non-breaking spaces within entry tag namesNicholas Johnson2025-02-06
| | | | | | The spaces in tag names must be non-breaking because tag names split across multiple lines are visually indistinguishable from distinct tags.
* Remove commas from pageinfo tags list in htmlNicholas Johnson2025-02-06
| | | | | | Spaces are more aesthetically pleasing. The Gemtext output format cannot remove the commas because then there would be no way to distinguish tags containing spaces from distinct tags.
* Move emojis outside link text, where they belongNicholas Johnson2025-02-06
|
* Add non-breaking spaces to improve text flowNicholas Johnson2025-02-06
| | | | | | | | | The spaces directly following emojis must be non-breaking because having emojis alone on their own line is ugly and visually confusing. The spaces within pageinfo "segments" must be non-breaking because splitting dates and read times across multiple lines is ugly and visually confusing.
* Move /style.css to /static/css/style.cssNicholas Johnson2024-11-25
| | | | | It's good practice to keep static website assets isolated to their own subdirectory.
* Map ref numbers to their superscripts using dictNicholas Johnson2024-11-22
| | | | | This removes the extra iterations over reference numbers caused by using the replace function.
* Change CSS styling for external linksNicholas Johnson2024-11-08
|
* Add "external" to rel attribute for external linksNicholas Johnson2024-11-08
|
* Remove unnecessary safeHTML calls for readabilityNicholas Johnson2024-11-08
|
* Remove incorrect safeHTML callNicholas Johnson2024-11-08
|
* Stop safeHTML overuse in emojis for readabilityNicholas Johnson2024-11-08
|
* Replace replaceRE with TrimSuffix for readabilityNicholas Johnson2024-11-08
|
* Set Gemini protocolNicholas Johnson2024-11-08
| | | | | This avoids littering the gemtext templates with regex to change the protocol.
* Disable HTML renderer for Gemini output formatNicholas Johnson2024-11-07
| | | | This avoids littering the gemtext templates with "safeHTML".
* Remove timestamp obfuscation privacy featureNicholas Johnson2024-11-07
| | | | | | | Timestamp obfuscation is a niche privacy feature which contradicts how users expect Hugo to work. If the user desires such a feature, they can override the theme with their own custom timestamp-obfuscating archetypes.
* Don't convert time to UTC in Atom feedsNicholas Johnson2024-11-07
| | | | | | | The entry archetype already wipes the time of day of entries and converts their dates to UTC, for the sake of user privacy. If the user overrides this behavior and purposely includes times and/or time zones, the theme should not interfere.
* Convert remaining tabs to spacesNicholas Johnson2024-11-07
|
* Add time element to HTML entry metadataNicholas Johnson2024-11-07
|
* Remove extra safeURL calls in id elementsNicholas Johnson2024-08-17
|
* Combine two replaceRE ops into oneNicholas Johnson2024-08-17
|
* Remove extraneous multi-line regex flagsNicholas Johnson2024-08-16
|