Files
hinode/layouts/shortcodes/docs.html
2023-08-31 13:34:23 +02:00

110 lines
4.8 KiB
HTML

<!--
Source: https://github.com/twbs/bootstrap/blob/main/site/layouts/shortcodes/scss-docs.html
Capture a code snippet from a `toml` or `scss` input file. The shortcode scans for named markers in a local file:
- For `.toml` files, use `# toml-docs-start` and `# toml-docs-end` followed by the snippet name
- For `.scss` files, use `// scss-docs-start` and `// scss-docs-end` followed by the snippet name
The snippet between the two markers is then rendered using syntax highlighting. The shortcode supports the
following named arguments:
"name" Name of the code snippet, used to identify the relevant section of the input file.
"file" Path of the input file. The path is relative to the `basePath` defined in the `docs` section of the
site's parameters. If the file starts with `./`, the path of the repository is used as base path instead.
"show" If unset, shows the panel with the code snippet in collapsed state. By default, the panel is
expanded.
"full" If unset, shows the filename only. By default, the full relative path is shown.
"id" Optional id of the collapse panel, defaults to "docs-collapse-n" with a sequential number n
starting at 1.
"class" Optional class argument of the tab control.
-->
{{- $name := .Get "name" | default "" -}}
{{- $basePath := .Site.Params.docs.basePath -}}
{{- $file := .Get "file" | default "" -}}
{{- if hasPrefix $file "./" -}}
{{- $file = path.Clean $file -}}
{{- else -}}
{{- $file = path.Join $basePath (path.Clean $file) -}}
{{- end -}}
{{- $extension := strings.TrimLeft "." (path.Ext $file) }}
{{- $capture_start := "" -}}
{{- $capture_end := "" -}}
{{- $id := printf "docs-collapse-%d" .Ordinal -}}
{{ with .Get "id" }}
{{ $id = . }}
{{ end }}
{{- $supportedExtensions := slice "js" "scss" "toml" -}}
{{- if in $supportedExtensions $extension -}}
{{- if eq $extension "toml" }}
{{- $capture_start = printf "# toml-docs-start %s" $name -}}
{{- $capture_end = printf "# toml-docs-end %s" $name -}}
{{- else -}}
{{- $capture_start = printf "// %s-docs-start %s" $extension $name -}}
{{- $capture_end = printf "// %s-docs-end %s" $extension $name -}}
{{- end -}}
{{- else -}}
{{- errorf "File format not supported (line %s): %s" .Position $file -}}
{{- end -}}
{{ $supportedFlags := slice "true" "false" -}}
{{ $showParam := "true" -}}
{{ $show := true -}}
{{ with .Get "show" }}{{ $showParam = . }}{{ end -}}
{{ if in $supportedFlags $showParam -}}
{{ if eq $showParam "true" }}{{ $show = true }}{{ else }}{{ $show = false }}{{ end -}}
{{ else -}}
{{ errorf "Invalid value for param 'show': %s" $showParam -}}
{{ end -}}
{{ $fullParam := "true" -}}
{{ $full := true -}}
{{ with .Get "full" }}{{ $fullParam = . }}{{ end -}}
{{ if in $supportedFlags $fullParam -}}
{{ if eq $fullParam "true" }}{{ $full = true }}{{ else }}{{ $full = false }}{{ end -}}
{{ else -}}
{{ errorf "Invalid value for param 'full': %s" $fullParam -}}
{{ end -}}
{{- $class := .Get "class" | default "" -}}
{{- /* If any parameters are missing, print an error and exit */ -}}
{{- if or (not $name) (not $file) -}}
{{- errorf "%s: %q: Missing required parameters! Got: name=%q file=%q!" .Position .Name $name $file -}}
{{- else -}}
{{- /* Force-check if the file exists */ -}}
{{ $tmp := os.Stat $file }}
{{- $regex := printf `%s((?:.|\n)*)%s` $capture_start $capture_end -}}
{{- $match := findRE $regex (readFile $file) -}}
{{- $match = index $match 0 -}}
{{- if not $match -}}
{{- errorf "%s: %q: Got no matches for name=%q in file=%q!" .Position .Name $name $file -}}
{{- end -}}
{{- $match = replace $match $capture_start "" -}}
{{- $match = replace $match $capture_end "" -}}
<ul class="nav nav-tabs{{ with $class }} {{ . }}{{ end }}">
<li class="nav-item">
<a class="nav-link active font-monospace"
href="#body-{{ $id }}"
aria-current="page"
data-bs-toggle="collapse"
data-bs-target=".multi-{{ $id }}"
aria-expanded="false"
aria-controls="body-{{ $id }} footer-{{ $id }}">
<small>{{ if $full }}{{ strings.TrimPrefix "/" (strings.TrimPrefix $basePath $file) }}{{ else }}{{ path.Base $file }}{{ end }}</small>
</a>
</li>
</ul>
<div class="border-start border-end border-bottom mb-3">
<div class="collapse multi-{{ $id }}{{ if $show }} show{{ end }} syntax-highlight" id="body-{{ $id }}">
{{- highlight (trim $match "\r\n") $extension "" -}}
</div>
<div class="collapse multi-{{ $id }}{{ if not $show }} show{{ end }} p-3" id="footer-{{ $id }}"><i>...</i></div>
</div>
{{- end -}}