{{ with .Params.definedTermSet }} {{ $page := $ }} {{ $glossary := . }} {{ $set := printf "%s#glossary" $page.Permalink }} {{ $terms := slice }} {{ range $glossary.items }} {{/* The term and whatever it nests, so both go through the same code. */}} {{ $entries := slice . }} {{ with .items }}{{ $entries = $entries | append . }}{{ end }} {{ range $entries }} {{ $url := printf "%s#%s" $page.Permalink (or .anchor (anchorize .term)) }} {{ $term := dict "@type" "DefinedTerm" "@id" $url "name" .term "url" $url "inDefinedTermSet" $set }} {{ with .description }} {{/* htmlUnescape because plainify removes tags but leaves entities, so an ampersand would otherwise be published as the literal &. */}} {{ $text := $page.RenderString . | plainify | htmlUnescape | replaceRE `\s+` " " | strings.TrimSpace }} {{ with $text }}{{ $term = merge $term (dict "description" .) }}{{ end }} {{ end }} {{ with .alternateName }}{{ $term = merge $term (dict "alternateName" .) }}{{ end }} {{ with .sameAs }}{{ $term = merge $term (dict "sameAs" .) }}{{ end }} {{ with .termCode }}{{ $term = merge $term (dict "termCode" .) }}{{ end }} {{ $terms = $terms | append $term }} {{ end }} {{ end }} {{/* No terms, no set. A `definedTermSet` block carrying only a title is a glossary someone started and has not filled in, and an empty hasDefinedTerm states that the set is known to have no members. */}} {{ with $terms }} {{/* The page's own language, like head/schema-article.html, so a translated glossary is not read as the site's default one. `.Language.Locale` and not `.LanguageCode`: Hugo deprecated the `languageCode` config key in v0.158.0 in favour of `locale`. */}} {{ $d := dict "@context" "https://schema.org" "@type" "DefinedTermSet" "@id" $set "name" ($glossary.title | default $page.Title) "url" $page.Permalink "inLanguage" ($page.Language.Locale | default $page.Site.Language.Lang) "hasDefinedTerm" . }} {{ with $glossary.description | default $page.Description }} {{ $d = merge $d (dict "description" .) }} {{ end }} {{ end }} {{ end }}