diff options
author | Nicholas Johnson <> | 2025-07-26 00:00:00 +0000 |
---|---|---|
committer | Nicholas Johnson <> | 2025-07-26 00:00:00 +0000 |
commit | 9bb9989fca490bfac69ea4387ccae1e9ec3ec23cf7f47a401e241ee43562f8a3 (patch) | |
tree | 887dd23c15ddd56b850a4901b3161808bb37f1b1872fa40cbd2e2de877c3d77d /layouts/single.gmi | |
parent | c1dc7133883e38b6c6ddf110df1868162862159994b2f9454999454f48417e58 (diff) | |
download | hugo-theme-journal-9bb9989fca490bfac69ea4387ccae1e9ec3ec23cf7f47a401e241ee43562f8a3.tar.gz hugo-theme-journal-9bb9989fca490bfac69ea4387ccae1e9ec3ec23cf7f47a401e241ee43562f8a3.zip |
Migrate fully to Hugo's new template system
This was the only way I could get term pages to consistently render
correctly.
Diffstat (limited to 'layouts/single.gmi')
-rw-r--r-- | layouts/single.gmi | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/layouts/single.gmi b/layouts/single.gmi new file mode 100644 index 0000000..1502830 --- /dev/null +++ b/layouts/single.gmi @@ -0,0 +1,132 @@ +{{ define "main" -}} +{{ $emoji := cond (.Page.Params.showlinkemoji | default true) (emojify ":link: ") "" -}} +=> {{ .Site.Home.RelPermalink | strings.TrimSuffix "index.gmi" }} {{ emojify ":link:" }} {{ i18n "returnHome" -}} + +{{ if (.Page.Params.pageinfo | default true) }} + +{{ partial "pageinfo.gmi" . -}} +{{ end }} + + +# {{ .Name }} + +{{ $content := chomp (.RawContent) -}} +{{ $scratch := newScratch -}} + +{{/* if content begins with a heading, add an extra newline */ -}} +{{ if (findRE `^#{1,6} ` $content 1) }} +{{ end -}} + +{{/* split text into chunks, with each chunk containing 3 parts: above, within, and below preformatted text */ -}} +{{/* the regex matching below the preformatted text matches exactly once in the entire text */ -}} +{{ $chunks := findRESubmatch `(?sm)(?:(.+?)(^\x60{3}[^\x60].*?^\x60{3}$))|(.+$)` $content -}} + +{{ $ref_index := 0 -}} + +{{ range $chunks -}} + {{ $above_pre := index . 1 -}} + {{ $pre := index . 2 -}} + {{ $below_pre := index . 3 -}} + + {{/* mux regex matches above and below preformatted text for rendering (the matches are mutually exclusive) */ -}} + {{ $rendered_text := print $above_pre $below_pre -}} + + {{ if ($.Page.Params.makerefs | default true) -}} + + {{/* find all the links within a chunk */ -}} + {{ $chunk_refs := findRESubmatch `!?\[[\t ]*(.+?)[\t ]*\]\([\t ]*(.+?)(?:[\t ]+"(.+?)")?[\t ]*\)` $rendered_text -}} + + {{ range $chunk_refs -}} + {{ $ref_index = add $ref_index 1 -}} + {{ $chunk_ref := dict + "index" $ref_index + "text" (index . 1) + "link" (index . 2) + "title" (index . 3) + -}} + + {{ $scratch.Add "refs" (slice $chunk_ref) -}} + + {{ $ref_index := $chunk_ref.index -}} + {{ $ref_text := $chunk_ref.text -}} + + {{/* create superscript of $ref_index */ -}} + {{ $superscript_map := dict + "0" "⁰" + "1" "¹" + "2" "²" + "3" "³" + "4" "⁴" + "5" "⁵" + "6" "⁶" + "7" "⁷" + "8" "⁸" + "9" "⁹" + -}} + {{ $ref_superscript := "" -}} + {{ range (split $ref_index "") -}} + {{ $ref_superscript = print $ref_superscript (index $superscript_map .) -}} + {{ end -}} + + {{/* replace Markdown links with link text and their superscripted reference numbers */ -}} + {{ $rendered_text = replace $rendered_text (index . 0) (print $ref_text $ref_superscript) 1 -}} + + {{ end -}} + + {{ else -}} + + {{/* render all links directly */ -}} + {{ $rendered_text = $rendered_text | replaceRE `(?m)^!?\[[\t ]*(.+?)[\t ]*\]\([\t ]*(.+?)(?:[\t ]+"(.+?)")?[\t ]*\)$` (print "=> $2 " $emoji "$1") -}} + + {{ end -}} + + {{/* trim extra heading symbols */ -}} + {{ $rendered_text = $rendered_text | replaceRE `(?m)^####{1,3} ` "### " -}} + + {{/* convert Markdown alternative heading syntax to gemtext heading syntax */ -}} + {{ $rendered_text = $rendered_text | replaceRE `(?m)^[\t ]*(\S.+?)[\t ]*\n\=+$` "# $1" -}} + {{ $rendered_text = $rendered_text | replaceRE `(?m)^[\t ]*(\S.+?)[\t ]*\n\-+$` "## $1" -}} + + {{/* convert Markdown alternative unordered list syntax to gemtext unordered list syntax */ -}} + {{ $rendered_text = $rendered_text | replaceRE `(?m)^[-+] ` "* " -}} + + {{/* convert Markdown ordered list items to gemtext unordered list items */ -}} + {{ $rendered_text = $rendered_text | replaceRE `(?m)^[1-9]\d*\.[\t ]+(.*?)[\t ]*$` "* $1" -}} + + {{/* remove bold and italics asterisk symbols */ -}} + {{/* note: this operation is performed in 3 steps to handle nested bold and italics */ -}} + {{/* note: this operation is performed last to avoid incorrectly rendering (un)ordered lists */ -}} + {{ $rendered_text = $rendered_text | replaceRE `\*{3}(\S(?:.*?\S)?)\*{3}` "$1" -}} + {{ $rendered_text = $rendered_text | replaceRE `\*{2}(\S(?:.*?\S)?)\*{2}` "$1" -}} + {{ $rendered_text = $rendered_text | replaceRE `\*{1}(\S(?:.*?\S)?)\*{1}` "$1" -}} + + {{ $rendered_text = $rendered_text | emojify -}} + + {{/* demux regex matches above and below preformatted text */ -}} + {{ if $above_pre -}} + {{ $rendered_text -}} + {{ $pre -}} + {{ else -}} + {{ $pre -}} + {{ $rendered_text -}} + {{ end -}} + +{{ end -}} + +{{ $refs := $scratch.Get "refs" -}} +{{ if and (.Page.Params.makerefs | default true) $refs }} + + +## {{ i18n "refs" }} +{{ range $refs -}} + {{ $ref_index := .index -}} + {{ $ref_text := .text -}} + {{ $ref_link := .link -}} + {{ $ref_title := .title -}} + + {{/* render referenced links */}} +{{ print "=> " $ref_link (emojify " :link: [") $ref_index "]: " (cond (ne (len $ref_title) 0) $ref_title $ref_text) -}} +{{ end -}} + +{{ end -}} +{{ end }} |