{{- /*
Renders the glossary of terms.

When you call this shortcode using the {{% %}} notation, the glossary terms are
description term (dt) elements which means they are members of .Fragments. This
allows the link render hook to verify links to glossary terms.

Yes, the terms themselves are pages, but we don't want to link to the pages, at
least not right now. Instead, we want to link to the ids rendered by this
shortcode.

@example {{% glossary %}}
*/ -}}
{{- $path := "/quick-reference/glossary" }}
{{- with site.GetPage $path }}

  {{- /* Build and render alphabetical index. */}}
  {{- $m := dict }}
  {{- range $p := .Pages.ByTitle }}
    {{- $k := substr .Title 0 1 | strings.ToUpper }}
    {{- if index $m $k }}
      {{- continue }}
    {{- end }}
    {{- $anchor := path.BaseName .Path | anchorize }}
    {{- $m = merge $m (dict $k $anchor) }}
  {{- end }}
  {{- range $k, $v := $m }}
[{{ $k }}](#{{ $v }})&nbsp;{{/* Do not indent. */}}
  {{- end }}

  {{/* Render glossary terms. */}}
  {{- range $p := .Pages.ByTitle }}
{{ .Title }}{{/* Do not indent. */}}
: {{ .RawContent | strings.TrimSpace | safeHTML }}{{/* Do not indent. */}}
    {{ with .Params.reference }}
      {{- $destination := "" }}
      {{- with $u := urls.Parse . }}
        {{- if $u.IsAbs }}
          {{- $destination = $u.String }}
        {{- else }}
          {{- with site.GetPage $u.Path }}
            {{- if $u.Fragment }}
              {{- $destination = printf "%s#%s" .Path $u.Fragment }}
            {{ else }}
              {{- $destination = .Path  }}
            {{- end }}
          {{- else }}
            {{- errorf "The %q shortcode was unable to find the reference link %s: see %s" $.Name . $p.String }}
          {{- end }}
        {{- end }}
      {{- end }}
: See&nbsp;[details]({{ $destination }}).{{/* Do not indent. */}}
    {{- end }}
  {{ end }}

{{- else }}
  {{- errorf "The %q shortcode was unable to get %s: see %s" .Name $path .Position}}
{{- end }}
