aboutsummaryrefslogtreecommitdiff
path: root/layouts/_default/single.gmi
blob: 8dc150b374290c8c23f3504706233598726be9dc4b85548c854447e3e565b33d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
{{ define "main" -}}
{{ $emoji := cond (.Page.Params.showlinkemoji | default true) (emojify ":link: ") "" -}}
=> {{ .Site.Home.RelPermalink | replaceRE `(?m)index.gmi$` "" }} {{ emojify ":link:" | safeHTML }} {{ i18n "returnHome" -}}

{{ if (.Page.Params.pageinfo | default true) }}

{{ partial "pageinfo.gmi" . -}}
{{ end }}


# {{ .Name | safeHTML }}

{{ $content := chomp (.RawContent) -}}
{{ $scratch := newScratch -}}

{{/* if content begins with a heading, add an extra space */ -}}
{{ if (findRE `(?)^#{1,3}` $content) }}
{{ 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 `!?\[\s*(.+?)\s*\]\(\s*(.+?)(?:\s+"(.+?)")?\s*\)` $rendered_text -}}

		{{ $scratch.Add "refs" $chunk_refs -}}
		{{ range $chunk_refs -}}
			{{ $ref_index = add $ref_index 1 -}}
			{{ $ref_text := index . 1 -}}

			{{/*- replace link with reference numbers enclosed in brackets */ -}}
			{{ $rendered_text = replace $rendered_text (index . 0) (print $ref_text "[" $ref_index "]") 1 -}}

		{{ end -}}

	{{ else -}}

		{{/* render all links directly */ -}}
		{{ $rendered_text = $rendered_text | replaceRE `(?m)^!?\[\s*(.+?)\s*\]\(\s*(.+?)(?:\s+"(.+?)")?\s*\)$` (print "=> $2 " $emoji "$1") -}}

	{{ end -}}

	{{/* trim extra heading symbols */ -}}
	{{ $rendered_text = $rendered_text | replaceRE `(?m)^####{1,3}` "###" -}}

	{{/* remove bold and italics asterisk symbols */ -}}
	{{ $rendered_text = $rendered_text | replaceRE `\*{3}(\S|\S.*?\S)\*{3}` "$1" -}}
	{{ $rendered_text = $rendered_text | replaceRE `\*{2}(\S|\S.*?\S)\*{2}` "$1" -}}
	{{ $rendered_text = $rendered_text | replaceRE `\*{1}(\S|\S.*?\S)\*{1}` "$1" -}}

	{{/* convert alternative unordered lists symbols to asterisks */ -}}
	{{ $rendered_text = $rendered_text | replaceRE `(?m)^[-+] ` "* " -}}

	{{ $rendered_text = $rendered_text | emojify -}}

	{{/* demux regex matches above and below preformatted text */ -}}
	{{ if $above_pre -}}
		{{ $rendered_text | safeHTML -}}
		{{ $pre | safeHTML -}}
	{{ else -}}
		{{ $pre | safeHTML -}}
		{{ $rendered_text | safeHTML -}}
	{{ end -}}

{{ end -}}

{{ $refs := $scratch.Get "refs" -}}
{{ if and (.Page.Params.makerefs | default true) $refs -}}
{{ $ref_index := 0 }}


## {{ i18n "refs" }}
{{ range $refs -}}
	{{ $ref_index  = add $ref_index 1 -}}
	{{ $ref_text  := index . 1 -}}
	{{ $ref_link  := index . 2 -}}
	{{ $ref_title := index . 3 -}}

	{{/* render referenced links */}}
{{ print "=> " $ref_link (emojify " :link: ") $ref_index ": " (cond (ne (len $ref_title) 0) $ref_title $ref_text) | safeHTML -}}
{{ end -}}

{{ end -}}
{{ end }}