aboutsummaryrefslogtreecommitdiff
path: root/layouts/_default/single.gmi
blob: a2f517dd3a74abd3dada394b89ffe6f2b4b28bb01e25fb9151fb13748bdf047c (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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
{{ 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 */ -}}
      {{ $ref_index := replace $ref_index "0" "⁰" -}}
      {{ $ref_index =  replace $ref_index "1" "¹" -}}
      {{ $ref_index =  replace $ref_index "2" "²" -}}
      {{ $ref_index =  replace $ref_index "3" "³" -}}
      {{ $ref_index =  replace $ref_index "4" "⁴" -}}
      {{ $ref_index =  replace $ref_index "5" "⁵" -}}
      {{ $ref_index =  replace $ref_index "6" "⁶" -}}
      {{ $ref_index =  replace $ref_index "7" "⁷" -}}
      {{ $ref_index =  replace $ref_index "8" "⁸" -}}
      {{ $ref_index =  replace $ref_index "9" "⁹" -}}

      {{/* replace Markdown links with link text and their superscripted reference numbers */ -}}
      {{ $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)^!?\[[\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 }}