2025-04-23 Oddμ templates
I've been working on a rewrite of the Oddmu upload template. My problem is that Oddmu, like Oddmuse before it, derives filenames from the URL path. Thus, a page like this one uses `2025-04-23-oddmu-templates` as the filename. Which is fine. If I want to link to this page, I'll use something like `[templates](https://alexschroeder.ch/edit/?id=2025-04-23-oddmu-templates)`. This is also fine.
Oddμ allows people to upload files, including Markdown files, and it allows people to edit the data files directly, using a regular editor (if they have access to the data directory). That means any UNIX filename can be used. This includes filenames containing reserved characters in URLs such as `?` and `#`.
When using HTML templates in Go, I take filenames and use them as local URLs. The HTML template library uses appropriate percent encoding. Sadly, it wants to handle URLs such as `https://example.org/foo?bar#baz` and therefore doesn't percent-encode characters such `?` and `#`.
The Go library takes context into account when deciding on the escaping required. If an attribute is used as a link, percent-encoding is used. If the same attribute is used as regular text, HTML escaping is used. This is why there is no good solution for me. If I unconditionally percent-escape characters such `?` and `#`, they don't show up correctly where plain HTML is expected. If I don't percent-escape the characters, the links don't work.
This is why the old templates didn't work for certain filenames:
{{.Name}}
I now provide a special `.Path` attribute. It has the same value as the `.Name` attribute, with a few important characters escaped. Use it where you need a link:
{{.Name}}