{{- $description := partial "utils/description.html" . -}} {{- $keywords := partialCached "utils/keywords.html" . . -}} {{- /* Build TechArticle schema for content pages */ -}} {{- $schema := dict "@context" "https://schema.org" "@type" "TechArticle" "headline" (truncate 110 .LinkTitle) "description" $description "url" .Permalink -}} {{- /* Add dates (from Git via enableGitInfo) */ -}} {{- with .PublishDate -}} {{- $schema = merge $schema (dict "datePublished" (time.Format "2006-01-02T15:04:05Z07:00" .)) -}} {{- end -}} {{- with .Lastmod -}} {{- $schema = merge $schema (dict "dateModified" (time.Format "2006-01-02T15:04:05Z07:00" .)) -}} {{- end -}} {{- /* Add mainEntityOfPage and language */ -}} {{- $schema = merge $schema (dict "mainEntityOfPage" (dict "@type" "WebPage" "@id" .Permalink) "inLanguage" site.Language.Lang ) -}} {{- /* Add author and publisher */ -}} {{- $logoUrl := printf "%sassets/images/docker-logo.png" (strings.TrimSuffix "/" site.BaseURL | printf "%s/") -}} {{- $org := dict "@type" "Organization" "name" "Docker Inc" "url" "https://www.docker.com" -}} {{- $schema = merge $schema (dict "author" $org "publisher" (merge $org (dict "logo" (dict "@type" "ImageObject" "url" $logoUrl)))) -}} {{- /* Add article section (from Hugo section) */ -}} {{- with .Section -}} {{- $schema = merge $schema (dict "articleSection" .) -}} {{- end -}} {{- /* Add keywords if present */ -}} {{- with $keywords -}} {{- $schema = merge $schema (dict "keywords" .) -}} {{- end -}} {{- /* Add proficiency level if specified in frontmatter */ -}} {{- with .Params.proficiencyLevel -}} {{- $schema = merge $schema (dict "proficiencyLevel" .) -}} {{- end -}} {{- /* Add prerequisites if specified in frontmatter */ -}} {{- with .Params.prerequisites -}} {{- $schema = merge $schema (dict "dependencies" .) -}} {{- end -}} {{- /* Add time required if specified in frontmatter */ -}} {{- with .Params.time -}} {{- /* Convert "20 minutes" to ISO 8601 duration "PT20M" */ -}} {{- $duration := . -}} {{- $isoDuration := "" -}} {{- if findRE `(\d+)\s*minutes?` $duration -}} {{- $mins := index (findRE `\d+` $duration) 0 -}} {{- $isoDuration = printf "PT%sM" $mins -}} {{- else if findRE `(\d+)\s*hours?` $duration -}} {{- $hours := index (findRE `\d+` $duration) 0 -}} {{- $isoDuration = printf "PT%sH" $hours -}} {{- end -}} {{- with $isoDuration -}} {{- $schema = merge $schema (dict "timeRequired" .) -}} {{- end -}} {{- end -}} {{- /* Add isPartOf relationship to parent section */ -}} {{- with .Parent -}} {{- if and (not .IsHome) .Permalink -}} {{- $isPartOf := dict "@type" "WebPage" "@id" .Permalink "name" (truncate 110 .LinkTitle) -}} {{- $schema = merge $schema (dict "isPartOf" $isPartOf) -}} {{- end -}} {{- end -}} {{- /* Output the schema as JSON-LD */ -}} {{- /* Add BreadcrumbList schema */ -}} {{- $breadcrumbs := slice -}} {{- $position := 1 -}} {{- range .Ancestors.Reverse -}} {{- if and (not .IsHome) .Permalink -}} {{- $item := dict "@type" "ListItem" "position" $position "item" (dict "@id" .Permalink "name" (truncate 110 .LinkTitle) ) -}} {{- $breadcrumbs = $breadcrumbs | append $item -}} {{- $position = add $position 1 -}} {{- end -}} {{- end -}} {{- /* Add current page to breadcrumbs */ -}} {{- $currentItem := dict "@type" "ListItem" "position" $position "item" (dict "@id" .Permalink "name" (truncate 110 .LinkTitle) ) -}} {{- $breadcrumbs = $breadcrumbs | append $currentItem -}} {{- /* Only output breadcrumbs if there's more than just the current page */ -}} {{- if gt (len $breadcrumbs) 1 -}} {{- end -}}