mirror of
				https://github.com/imfing/hextra.git
				synced 2025-10-31 16:04:55 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			94 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			94 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
| {{- /*
 | |
|   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 }}
 | 
