Init
This commit is contained in:
31
themes/hextra/layouts/_partials/utils/extract-headings.html
Normal file
31
themes/hextra/layouts/_partials/utils/extract-headings.html
Normal file
@@ -0,0 +1,31 @@
|
||||
{{- /*
|
||||
Extracts all headings from a page and adds them to the scratchpad.
|
||||
|
||||
The keys can be obtained from the scratchpad by using the "keys" key.
|
||||
The titles can be obtained from the scratchpad by using the "titles" key.
|
||||
|
||||
The scratchpad must be initialized with empty slices before calling this function for the keys "keys" and "titles"
|
||||
|
||||
@param {any} target The element to extract headings from.
|
||||
@param {any} scratch The scratchpad to add the keys and titles to.
|
||||
|
||||
@example {{ partial "utils/extract-headings.html" (dict "target" $h1 "scratch" $s) }}
|
||||
*/ -}}
|
||||
|
||||
{{- range $heading := index .target.Headings -}}
|
||||
{{- if and (eq $heading.Level 0) (not $heading.Title) -}}
|
||||
{{- $.scratch.Add "keys" (slice $heading.Title) -}}
|
||||
{{- else -}}
|
||||
{{- $key := (printf "%s#%s" $heading.ID $heading.Title) -}}
|
||||
{{- $.scratch.Add "keys" (slice $key) -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- $title := (printf "<h%d>%s" $heading.Level $heading.Title) | htmlUnescape -}}
|
||||
{{- $.scratch.Add "titles" (slice $title) -}}
|
||||
|
||||
{{- partial "utils/extract-headings.html" (dict
|
||||
"target" $heading
|
||||
"scratch" $.scratch
|
||||
)
|
||||
}}
|
||||
{{- end -}}
|
||||
21
themes/hextra/layouts/_partials/utils/file-path.html
Normal file
21
themes/hextra/layouts/_partials/utils/file-path.html
Normal file
@@ -0,0 +1,21 @@
|
||||
{{/* This utility is used to get the file path from absolute, relative path or URL. */}}
|
||||
|
||||
{{- $path := .path -}}
|
||||
{{- $page := .page -}}
|
||||
|
||||
{{- $isLocal := not (urls.Parse $path).Scheme -}}
|
||||
{{- $isPage := and (eq $page.Kind "page") (not $page.BundleType) -}}
|
||||
{{- $startsWithSlash := hasPrefix $path "/" -}}
|
||||
{{- $startsWithRelative := hasPrefix $path "../" -}}
|
||||
|
||||
{{- if and $path $isLocal -}}
|
||||
{{- if $startsWithSlash -}}
|
||||
{{/* File under static directory */}}
|
||||
{{- $path = (relURL (strings.TrimPrefix "/" $path)) -}}
|
||||
{{- else if and $isPage (not $startsWithRelative) -}}
|
||||
{{/* File is a sibling to the individual page file */}}
|
||||
{{ $path = (printf "../%s" $path) }}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- return $path -}}
|
||||
3
themes/hextra/layouts/_partials/utils/format-date.html
Normal file
3
themes/hextra/layouts/_partials/utils/format-date.html
Normal file
@@ -0,0 +1,3 @@
|
||||
{{- with . -}}
|
||||
{{- . | time.Format (site.Params.dateFormat | default ":date_long") -}}
|
||||
{{- end -}}
|
||||
93
themes/hextra/layouts/_partials/utils/fragments.html
Normal file
93
themes/hextra/layouts/_partials/utils/fragments.html
Normal file
@@ -0,0 +1,93 @@
|
||||
{{- /*
|
||||
fragments.html - Split page content into searchable fragments
|
||||
|
||||
This partial processes a Hugo page and splits its content into fragments based on headings,
|
||||
creating a data structure suitable for search indexing. It supports different fragment types
|
||||
and handles hierarchical heading structures (h1, h2).
|
||||
|
||||
Parameters:
|
||||
- .context (Page): The Hugo page to process
|
||||
- .type (string): Fragment type - "content" (default), "heading", "title", or "summary"
|
||||
|
||||
Returns:
|
||||
- dict: Map of heading keys to content fragments
|
||||
|
||||
Example:
|
||||
Input page with content:
|
||||
# Introduction
|
||||
This is the intro text.
|
||||
## Setup
|
||||
Setup instructions here.
|
||||
# Configuration
|
||||
Config details here.
|
||||
|
||||
Output (type "content"):
|
||||
{
|
||||
"": "This is the intro text.",
|
||||
"intro#Introduction": "This is the intro text. Setup instructions here.",
|
||||
"setup#Setup": "Setup instructions here.",
|
||||
"config#Configuration": "Config details here."
|
||||
}
|
||||
|
||||
Fragment types:
|
||||
- "content": Splits page content by headings (default)
|
||||
- "heading": Returns heading keys with empty content
|
||||
- "title": Returns empty content (title handled elsewhere)
|
||||
- "summary": Returns page summary only
|
||||
*/ -}}
|
||||
|
||||
{{- /* Extract page context and fragment type */ -}}
|
||||
{{- $page := .context -}}
|
||||
{{- $type := .type | default "content" -}}
|
||||
|
||||
{{- /* Process all headings */ -}}
|
||||
{{- $s := newScratch -}}
|
||||
{{- $s.Set "keys" slice -}}
|
||||
{{- $s.Set "titles" slice -}}
|
||||
|
||||
{{- partial "utils/extract-headings.html" (dict "target" $page.Fragments "scratch" $s) -}}
|
||||
|
||||
{{- $headingKeys := $s.Get "keys" -}}
|
||||
{{- $headingTitles := $s.Get "titles" -}}
|
||||
|
||||
{{- $content := $page.Content | htmlUnescape -}}
|
||||
{{- $len := len $headingKeys -}}
|
||||
{{- $data := dict -}}
|
||||
|
||||
{{ if eq $type "content" }}
|
||||
{{/* Include full content of the page */}}
|
||||
{{ if eq $len 0 }}
|
||||
{{ $data = $data | merge (dict "" ($page.Plain | htmlUnescape | strings.TrimSpace)) }}
|
||||
{{ else }}
|
||||
{{/* Split the raw content from bottom to top */}}
|
||||
{{ range seq $len }}
|
||||
{{ $i := sub $len . }}
|
||||
{{ $headingKey := index $headingKeys $i }}
|
||||
{{ $headingTitle := index $headingTitles $i }}
|
||||
|
||||
{{ if eq $i 0 }}
|
||||
{{ $data = $data | merge (dict $headingKey ($content | plainify | htmlUnescape | strings.TrimSpace)) }}
|
||||
{{ else }}
|
||||
{{ $parts := split $content (printf "%s" $headingTitle) }}
|
||||
{{ $lastPart := index $parts (sub (len $parts) 1) }}
|
||||
|
||||
{{ $data = $data | merge (dict $headingKey ($lastPart | plainify | htmlUnescape | strings.TrimSpace)) }}
|
||||
{{ $content = strings.TrimSuffix $lastPart $content }}
|
||||
{{ $content = strings.TrimSuffix (printf "%s" $headingTitle) $content }}
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
{{ else if (eq $type "heading" ) }}
|
||||
{{/* Put heading keys with empty content to the data object */}}
|
||||
{{ $data = dict "" "" }}
|
||||
{{ range $headingKeys }}
|
||||
{{ $data = $data | merge (dict . "") }}
|
||||
{{ end }}
|
||||
{{ else if (eq $type "title") }}
|
||||
{{/* Use empty data object since title is included in search-data.json */}}
|
||||
{{ $data = $data | merge (dict "" "") }}
|
||||
{{ else if (eq $type "summary" ) }}
|
||||
{{ $data = $data | merge (dict "" ($page.Summary | plainify | htmlUnescape | strings.TrimSpace)) }}
|
||||
{{ end }}
|
||||
|
||||
{{ return $data }}
|
||||
14
themes/hextra/layouts/_partials/utils/icon.html
Normal file
14
themes/hextra/layouts/_partials/utils/icon.html
Normal file
@@ -0,0 +1,14 @@
|
||||
{{/* Render raw svg icon from .Site.Data */}}
|
||||
{{- $icon := index site.Data.icons .name -}}
|
||||
|
||||
{{- if not $icon -}}
|
||||
{{ errorf "icon %q not found" .name }}
|
||||
{{- end -}}
|
||||
|
||||
{{- $icon = $icon | safeHTML -}}
|
||||
|
||||
{{- if .attributes -}}
|
||||
{{- $icon = replaceRE "<svg" (printf "<svg %s" .attributes) $icon -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- return ($icon | safeHTML) -}}
|
||||
25
themes/hextra/layouts/_partials/utils/lang-link.html
Normal file
25
themes/hextra/layouts/_partials/utils/lang-link.html
Normal file
@@ -0,0 +1,25 @@
|
||||
{{/* Get relative link of a page for given language */}}
|
||||
{{/* If not found, return the homepage of the language page */}}
|
||||
|
||||
{{ $page := .context }}
|
||||
{{ $lang := .lang }}
|
||||
|
||||
{{ $link := false }}
|
||||
|
||||
{{ range $page.AllTranslations }}
|
||||
{{ if eq .Language.Lang $lang }}
|
||||
{{ $link = .RelPermalink }}
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
|
||||
{{ if not $link }}
|
||||
{{ range where $page.Sites ".Language.Lang" $lang }}
|
||||
{{ $link = .Home.RelPermalink }}
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
|
||||
{{ if not $link }}
|
||||
{{ $link = site.Home.RelPermalink }}
|
||||
{{ end }}
|
||||
|
||||
{{ return $link }}
|
||||
11
themes/hextra/layouts/_partials/utils/page-description.html
Normal file
11
themes/hextra/layouts/_partials/utils/page-description.html
Normal file
@@ -0,0 +1,11 @@
|
||||
{{ with .Description | plainify | htmlUnescape -}}
|
||||
{{ . -}}
|
||||
{{ else -}}
|
||||
{{ if .IsHome -}}
|
||||
{{ with .Site.Params.description | plainify | htmlUnescape -}}
|
||||
{{ . -}}
|
||||
{{ end -}}
|
||||
{{ else -}}
|
||||
{{ .Summary | plainify | htmlUnescape | chomp -}}
|
||||
{{ end -}}
|
||||
{{ end -}}
|
||||
@@ -0,0 +1,7 @@
|
||||
{{- with .Params.width -}}
|
||||
<style>
|
||||
:root {
|
||||
--hextra-max-page-width: {{ cond (eq . "wide") "90rem" (cond (eq . "full") "100%" "80rem") }};
|
||||
}
|
||||
</style>
|
||||
{{- end -}}
|
||||
32
themes/hextra/layouts/_partials/utils/sort-pages.html
Normal file
32
themes/hextra/layouts/_partials/utils/sort-pages.html
Normal file
@@ -0,0 +1,32 @@
|
||||
{{- $page := .page -}}
|
||||
{{- $by := .by | default "weight" -}}
|
||||
{{- $order := .order | default "asc" -}}
|
||||
|
||||
{{- $pages := slice }}
|
||||
|
||||
{{- if eq $by "weight" }}
|
||||
{{- $pages = $page.Pages.ByWeight }}
|
||||
{{- else if eq $by "date" }}
|
||||
{{- $pages = $page.Pages.ByDate }}
|
||||
{{- else if eq $by "title" }}
|
||||
{{- $pages = $page.Pages.ByTitle }}
|
||||
{{- else if eq $by "expiryDate" }}
|
||||
{{- $pages = $page.Pages.ByExpiryDate }}
|
||||
{{- else if eq $by "publishDate" }}
|
||||
{{- $pages = $page.Pages.ByPublishDate }}
|
||||
{{- else if eq $by "lastmod" }}
|
||||
{{- $pages = $page.Pages.ByLastmod }}
|
||||
{{- else if eq $by "linkTitle" }}
|
||||
{{- $pages = $page.Pages.ByLinkTitle }}
|
||||
{{- else if eq $by "length" }}
|
||||
{{- $pages = $page.Pages.ByLength }}
|
||||
{{- else }}
|
||||
{{- warnf "sort-pages: unknown sort field %q" $by -}}
|
||||
{{- $pages = $page.Pages }}
|
||||
{{ end -}}
|
||||
|
||||
{{- if eq $order "desc" }}
|
||||
{{- $pages = $pages.Reverse }}
|
||||
{{- end -}}
|
||||
|
||||
{{- return $pages -}}
|
||||
19
themes/hextra/layouts/_partials/utils/title.html
Normal file
19
themes/hextra/layouts/_partials/utils/title.html
Normal file
@@ -0,0 +1,19 @@
|
||||
{{/*
|
||||
This utility is used to retrieve the title of a page or section.
|
||||
If no title is set, it falls back to using the directory or file name.
|
||||
|
||||
Based on https://github.com/thegeeklab/hugo-geekdoc/blob/v0.44.0/layouts/partials/utils/title.html
|
||||
*/}}
|
||||
{{- $title := "" }}
|
||||
|
||||
{{ if .LinkTitle }}
|
||||
{{ $title = .LinkTitle }}
|
||||
{{ else if .Title }}
|
||||
{{ $title = .Title }}
|
||||
{{ else if and .IsSection .File }}
|
||||
{{ $title = path.Base .File.Dir | humanize | title }}
|
||||
{{ else if and .IsPage .File }}
|
||||
{{ $title = .File.BaseFileName | humanize | title }}
|
||||
{{ end }}
|
||||
|
||||
{{ return $title -}}
|
||||
Reference in New Issue
Block a user