{{ 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 }}