From e3e3f9ae17395220e2c13ddc8afa7000a5a7e21e Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Thu, 10 Apr 2025 16:59:48 +0000 Subject: [PATCH 001/129] releaser: Prepare repository for 0.147.0-DEV [ci skip] --- common/hugo/version_current.go | 6 +++--- hugoreleaser.env | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/common/hugo/version_current.go b/common/hugo/version_current.go index 993fad5a2..141b88d57 100644 --- a/common/hugo/version_current.go +++ b/common/hugo/version_current.go @@ -17,7 +17,7 @@ package hugo // This should be the only one. var CurrentVersion = Version{ Major: 0, - Minor: 146, - PatchLevel: 1, - Suffix: "", + Minor: 147, + PatchLevel: 0, + Suffix: "-DEV", } diff --git a/hugoreleaser.env b/hugoreleaser.env index c88ba3e46..f1db59417 100644 --- a/hugoreleaser.env +++ b/hugoreleaser.env @@ -1,7 +1,8 @@ # Release env. # These will be replaced by script before release. -HUGORELEASER_TAG=v0.146.0 -HUGORELEASER_COMMITISH=5d1b9d39858bb0b2e505af9f649bfb55295ecca1 +HUGORELEASER_TAG=v0.146.1 +HUGORELEASER_COMMITISH=acc4fe24be4c3fb8a5b12443878bfa47379b8a9e + From 9221cbca496752fb1d06d664871e3d4532f473f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Fri, 11 Apr 2025 10:16:28 +0200 Subject: [PATCH 002/129] tpl: Fix some baseof lookup issues We were mistakingly using the templates (e.g. list.html) descriptor to resolve the base template and not the page, which worked fine in most cases, but not all. Fixes #13583 --- tpl/templates/templates_integration_test.go | 28 +++++++++++++++++++++ tpl/tplimpl/templatestore.go | 10 ++++---- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/tpl/templates/templates_integration_test.go b/tpl/templates/templates_integration_test.go index a0dcf0348..752709593 100644 --- a/tpl/templates/templates_integration_test.go +++ b/tpl/templates/templates_integration_test.go @@ -166,3 +166,31 @@ p3.current.Ancestors.Reverse: {{ with templates.Current }}{{ range .Ancestors.Re "p2.current.Ancestors: _partials/p1.html|all.html", ) } + +func TestBaseOfIssue13583(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +-- content/_index.md -- +--- +title: "Home" +outputs: ["html", "amp"] +--- +title: "Home" +-- layouts/baseof.html -- +layouts/baseof.html +{{ block "main" . }}{{ end }} +-- layouts/baseof.amp.html -- +layouts/baseof.amp.html +{{ block "main" . }}{{ end }} +-- layouts/home.html -- +{{ define "main" }} +Home. +{{ end }} + +` + b := hugolib.Test(t, files) + b.AssertFileContent("public/index.html", "layouts/baseof.html") + b.AssertFileContent("public/amp/index.html", "layouts/baseof.amp.html") +} diff --git a/tpl/tplimpl/templatestore.go b/tpl/tplimpl/templatestore.go index eee962053..3c8c4abf2 100644 --- a/tpl/tplimpl/templatestore.go +++ b/tpl/tplimpl/templatestore.go @@ -301,7 +301,7 @@ func (ti *TemplInfo) String() string { return ti.PathInfo.String() } -func (ti *TemplInfo) findBestMatchBaseof(s *TemplateStore, k1 string, slashCountK1 int, best *bestMatch) { +func (ti *TemplInfo) findBestMatchBaseof(s *TemplateStore, d1 TemplateDescriptor, k1 string, slashCountK1 int, best *bestMatch) { if ti.baseVariants == nil { return } @@ -310,11 +310,11 @@ func (ti *TemplInfo) findBestMatchBaseof(s *TemplateStore, k1 string, slashCount slashCountK2 := strings.Count(k2, "/") distance := slashCountK1 - slashCountK2 - for d, vv := range v { - weight := s.dh.compareDescriptors(CategoryBaseof, ti.D, d) + for d2, vv := range v { + weight := s.dh.compareDescriptors(CategoryBaseof, d1, d2) weight.distance = distance if best.isBetter(weight, vv.Template) { - best.updateValues(weight, k2, d, vv.Template) + best.updateValues(weight, k2, d2, vv.Template) } } return false, nil @@ -538,7 +538,7 @@ func (s *TemplateStore) LookupPagesLayout(q TemplateQuery) *TemplInfo { return m } best1.reset() - m.findBestMatchBaseof(s, key, slashCountKey, best1) + m.findBestMatchBaseof(s, q.Desc, key, slashCountKey, best1) if best1.w.w1 <= 0 { return nil } From c19f1f2363fe96cfa8b6e4a5b9e5d75886bcff8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Fri, 11 Apr 2025 10:54:19 +0200 Subject: [PATCH 003/129] tpl: Resolve layouts/all.html for all html output formats Fixes #13587 --- tpl/templates/templates_integration_test.go | 20 ++++++++++++++++++++ tpl/tplimpl/templatedescriptor.go | 4 +++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/tpl/templates/templates_integration_test.go b/tpl/templates/templates_integration_test.go index 752709593..4150ec367 100644 --- a/tpl/templates/templates_integration_test.go +++ b/tpl/templates/templates_integration_test.go @@ -194,3 +194,23 @@ Home. b.AssertFileContent("public/index.html", "layouts/baseof.html") b.AssertFileContent("public/amp/index.html", "layouts/baseof.amp.html") } + +func TestAllVsAmp(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +-- content/_index.md -- +--- +title: "Home" +outputs: ["html", "amp"] +--- +title: "Home" +-- layouts/all.html -- +All. + +` + b := hugolib.Test(t, files) + b.AssertFileContent("public/index.html", "All.") + b.AssertFileContent("public/amp/index.html", "All.") +} diff --git a/tpl/tplimpl/templatedescriptor.go b/tpl/tplimpl/templatedescriptor.go index 21649b032..fc757126f 100644 --- a/tpl/tplimpl/templatedescriptor.go +++ b/tpl/tplimpl/templatedescriptor.go @@ -92,6 +92,7 @@ func (this TemplateDescriptor) doCompare(category Category, other TemplateDescri if other.Kind != "" && other.Kind != this.Kind { return w } + if other.Layout != "" && other.Layout != layoutAll && other.Layout != this.Layout { if isLayoutCustom(this.Layout) { if this.Kind == "" { @@ -108,6 +109,7 @@ func (this TemplateDescriptor) doCompare(category Category, other TemplateDescri return w } } + if other.Lang != "" && other.Lang != this.Lang { return w } @@ -120,7 +122,7 @@ func (this TemplateDescriptor) doCompare(category Category, other TemplateDescri // We want e.g. home page in amp output format (media type text/html) to // find a template even if one isn't specified for that output format, // when one exist for the html output format (same media type). - if category != CategoryBaseof && (this.Kind == "" || (this.Kind != other.Kind && this.Layout != other.Layout)) { + if category != CategoryBaseof && (this.Kind == "" || (this.Kind != other.Kind && (this.Layout != other.Layout && other.Layout != layoutAll))) { return w } From 1074e011520a82a17524d2e68082e5a04e291c2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Fri, 11 Apr 2025 11:20:03 +0200 Subject: [PATCH 004/129] tpl: Fix legacy section mappings Fixes #13584 --- tpl/templates/templates_integration_test.go | 15 ++++ tpl/tplimpl/templates.go | 15 ++-- tpl/tplimpl/templatestore.go | 85 +++++++++++++++---- tpl/tplimpl/templatestore_integration_test.go | 7 +- 4 files changed, 97 insertions(+), 25 deletions(-) diff --git a/tpl/templates/templates_integration_test.go b/tpl/templates/templates_integration_test.go index 4150ec367..93922b4c4 100644 --- a/tpl/templates/templates_integration_test.go +++ b/tpl/templates/templates_integration_test.go @@ -214,3 +214,18 @@ All. b.AssertFileContent("public/index.html", "All.") b.AssertFileContent("public/amp/index.html", "All.") } + +// Issue #13584. +func TestLegacySectionSection(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +-- content/mysection/_index.md -- +-- layouts/section/section.html -- +layouts/section/section.html + +` + b := hugolib.Test(t, files) + b.AssertFileContent("public/mysection/index.html", "layouts/section/section.html") +} diff --git a/tpl/tplimpl/templates.go b/tpl/tplimpl/templates.go index 1f911b9a5..4c3ad3be1 100644 --- a/tpl/tplimpl/templates.go +++ b/tpl/tplimpl/templates.go @@ -3,7 +3,9 @@ package tplimpl import ( "io" "regexp" + "strconv" "strings" + "sync/atomic" "unicode" "unicode/utf8" @@ -49,11 +51,6 @@ func (t *templateNamespace) parseTemplate(ti *TemplInfo) error { } pi := ti.PathInfo name := pi.PathNoLeadingSlash() - if ti.isLegacyMapped { - // When mapping the old taxonomy structure to the new one, we may map the same path to multiple templates per kind. - // Append the kind here to make the name unique. - name += ("-" + ti.D.Kind) - } var ( templ tpl.Template @@ -62,12 +59,18 @@ func (t *templateNamespace) parseTemplate(ti *TemplInfo) error { if ti.D.IsPlainText { prototype := t.parseText + if prototype.Lookup(name) != nil { + name += "-" + strconv.FormatUint(t.nameCounter.Add(1), 10) + } templ, err = prototype.New(name).Parse(ti.content) if err != nil { return err } } else { prototype := t.parseHTML + if prototype.Lookup(name) != nil { + name += "-" + strconv.FormatUint(t.nameCounter.Add(1), 10) + } templ, err = prototype.New(name).Parse(ti.content) if err != nil { return err @@ -296,6 +299,8 @@ type templateNamespace struct { prototypeText *texttemplate.Template prototypeHTML *htmltemplate.Template + nameCounter atomic.Uint64 + standaloneText *texttemplate.Template baseofTextClones []*texttemplate.Template diff --git a/tpl/tplimpl/templatestore.go b/tpl/tplimpl/templatestore.go index 3c8c4abf2..8fe89586d 100644 --- a/tpl/tplimpl/templatestore.go +++ b/tpl/tplimpl/templatestore.go @@ -690,7 +690,7 @@ func (t *TemplateStore) UnusedTemplates() []*TemplInfo { var unused []*TemplInfo for vv := range t.templates() { - if vv.subCategory != SubCategoryMain { + if vv.subCategory != SubCategoryMain || vv.isLegacyMapped { // Skip inline partials and internal templates. continue } @@ -1169,8 +1169,8 @@ func (s *TemplateStore) insertTemplates(include func(fi hugofs.FileMetaInfo) boo case containerPartials, containerShortcodes, containerMarkup: // OK. default: - applyLegacyMapping = true pi = fromLegacyPath(pi) + applyLegacyMapping = strings.Count(pi.Path(), "/") <= 2 } if applyLegacyMapping { @@ -1183,6 +1183,7 @@ func (s *TemplateStore) insertTemplates(include func(fi hugofs.FileMetaInfo) boo ext: pi.Ext(), outputFormat: pi.OutputFormat(), } + if m2, ok := legacyOrdinalMappings[key]; ok { if m1.ordinal < m2.m.ordinal { // Higher up == better match. @@ -1208,26 +1209,74 @@ func (s *TemplateStore) insertTemplates(include func(fi hugofs.FileMetaInfo) boo base := piOrig.PathBeforeLangAndOutputFormatAndExt() identifiers := pi.IdentifiersUnknown() - - // Tokens on e.g. form /SECTIONKIND/THESECTION - insertSectionTokens := func(section string, kindOnly bool) string { - s := base - if !kindOnly { - s = strings.Replace(s, section, sectionToken, 1) - } - s = strings.Replace(s, kinds.KindSection, sectionKindToken, 1) - return s + if pi.Kind() != "" { + identifiers = append(identifiers, pi.Kind()) } - for _, section := range identifiers { - if section == baseNameBaseof { + shouldIncludeSection := func(section string) bool { + switch section { + case containerShortcodes, containerPartials, containerMarkup: + return false + case "taxonomy", "": + return false + default: + for k, v := range s.opts.TaxonomySingularPlural { + if k == section || v == section { + return false + } + } + return true + } + } + if shouldIncludeSection(pi.Section()) { + identifiers = append(identifiers, pi.Section()) + } + + identifiers = helpers.UniqueStrings(identifiers) + + // Tokens on e.g. form /SECTIONKIND/THESECTION + insertSectionTokens := func(section string) []string { + kindOnly := isLayoutStandard(section) + var ss []string + s1 := base + if !kindOnly { + s1 = strings.ReplaceAll(s1, section, sectionToken) + } + s1 = strings.ReplaceAll(s1, kinds.KindSection, sectionKindToken) + if s1 != base { + ss = append(ss, s1) + } + s1 = strings.ReplaceAll(base, kinds.KindSection, sectionKindToken) + if !kindOnly { + s1 = strings.ReplaceAll(s1, section, sectionToken) + } + if s1 != base { + ss = append(ss, s1) + } + + helpers.UniqueStringsReuse(ss) + + return ss + } + + for _, id := range identifiers { + if id == "" { continue } - kindOnly := isLayoutStandard(section) - p := insertSectionTokens(section, kindOnly) - if m1, ok := s.opts.legacyMappingSection[p]; ok { - m1.mapping.targetPath = strings.Replace(m1.mapping.targetPath, sectionToken, section, 1) - handleMapping(m1) + + p := insertSectionTokens(id) + for _, ss := range p { + if m1, ok := s.opts.legacyMappingSection[ss]; ok { + targetPath := m1.mapping.targetPath + + if targetPath != "" { + targetPath = strings.ReplaceAll(targetPath, sectionToken, id) + targetPath = strings.ReplaceAll(targetPath, sectionKindToken, id) + targetPath = strings.ReplaceAll(targetPath, "//", "/") + } + m1.mapping.targetPath = targetPath + handleMapping(m1) + } } } diff --git a/tpl/tplimpl/templatestore_integration_test.go b/tpl/tplimpl/templatestore_integration_test.go index 4f76626ad..74abe58d0 100644 --- a/tpl/tplimpl/templatestore_integration_test.go +++ b/tpl/tplimpl/templatestore_integration_test.go @@ -441,7 +441,7 @@ title: "P1" {{ define "main" }}FOO{{ end }} -- layouts/_default/single.json -- -- layouts/_default/single.html -- -{{ define "main" }}MAIN{{ end }} +{{ define "main" }}MAIN /_default/single.html{{ end }} -- layouts/post/single.html -- {{ define "main" }}MAIN{{ end }} -- layouts/_partials/usedpartial.html -- @@ -461,6 +461,8 @@ title: "P1" ) b.Build() + b.AssertFileContent("public/p1/index.html", "MAIN /_default/single.html") + unused := b.H.GetTemplateStore().UnusedTemplates() var names []string for _, tmpl := range unused { @@ -468,8 +470,9 @@ title: "P1" names = append(names, fi.Meta().PathInfo.PathNoLeadingSlash()) } } - b.Assert(len(unused), qt.Equals, 5, qt.Commentf("%#v", names)) + b.Assert(names, qt.DeepEquals, []string{"_partials/unusedpartial.html", "shortcodes/unusedshortcode.html", "baseof.json", "post/single.html", "_default/single.json"}) + b.Assert(len(unused), qt.Equals, 5, qt.Commentf("%#v", names)) } func TestCreateManyTemplateStores(t *testing.T) { From d1c394442be0858b12fb1dbb42a98237e95c6d75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Fri, 11 Apr 2025 18:37:25 +0200 Subject: [PATCH 005/129] tpl: Fix codeblock hook resolve issue Fixes #13593 --- tpl/tplimpl/templatedescriptor.go | 19 +++++++++----- tpl/tplimpl/templatedescriptor_test.go | 8 +++--- tpl/tplimpl/templatestore.go | 10 ++++---- tpl/tplimpl/templatestore_integration_test.go | 25 +++++++++++++++++++ 4 files changed, 47 insertions(+), 15 deletions(-) diff --git a/tpl/tplimpl/templatedescriptor.go b/tpl/tplimpl/templatedescriptor.go index fc757126f..f8cf02870 100644 --- a/tpl/tplimpl/templatedescriptor.go +++ b/tpl/tplimpl/templatedescriptor.go @@ -60,12 +60,13 @@ type descriptorHandler struct { // Note that this in this setup is usually a descriptor constructed from a page, // so we want to find the best match for that page. -func (s descriptorHandler) compareDescriptors(category Category, this, other TemplateDescriptor) weight { +func (s descriptorHandler) compareDescriptors(category Category, isEmbedded bool, this, other TemplateDescriptor) weight { if this.LayoutMustMatch && this.Layout != other.Layout { return weightNoMatch } - w := this.doCompare(category, other) + w := this.doCompare(category, isEmbedded, other) + if w.w1 <= 0 { if category == CategoryMarkup && (this.Variant1 == other.Variant1) && (this.Variant2 == other.Variant2 || this.Variant2 != "" && other.Variant2 == "") { // See issue 13242. @@ -82,7 +83,7 @@ func (s descriptorHandler) compareDescriptors(category Category, this, other Tem } //lint:ignore ST1006 this vs other makes it easier to reason about. -func (this TemplateDescriptor) doCompare(category Category, other TemplateDescriptor) weight { +func (this TemplateDescriptor) doCompare(category Category, isEmbedded bool, other TemplateDescriptor) weight { w := weightNoMatch // HTML in plain text is OK, but not the other way around. @@ -135,9 +136,15 @@ func (this TemplateDescriptor) doCompare(category Category, other TemplateDescri return w } - // If both are set and different, no match. - if other.Variant2 != "" && this.Variant2 != "" && other.Variant2 != this.Variant2 { - return w + if isEmbedded { + if other.Variant2 != "" && other.Variant2 != this.Variant2 { + return w + } + } else { + // If both are set and different, no match. + if other.Variant2 != "" && this.Variant2 != "" && other.Variant2 != this.Variant2 { + return w + } } const ( diff --git a/tpl/tplimpl/templatedescriptor_test.go b/tpl/tplimpl/templatedescriptor_test.go index 76201287d..6fb8c2195 100644 --- a/tpl/tplimpl/templatedescriptor_test.go +++ b/tpl/tplimpl/templatedescriptor_test.go @@ -20,14 +20,14 @@ func TestTemplateDescriptorCompare(t *testing.T) { less := func(category Category, this, other1, other2 TemplateDescriptor) { c.Helper() - result1 := dh.compareDescriptors(category, this, other1) - result2 := dh.compareDescriptors(category, this, other2) + result1 := dh.compareDescriptors(category, false, this, other1) + result2 := dh.compareDescriptors(category, false, this, other2) c.Assert(result1.w1 < result2.w1, qt.IsTrue, qt.Commentf("%d < %d", result1, result2)) } check := func(category Category, this, other TemplateDescriptor, less bool) { c.Helper() - result := dh.compareDescriptors(category, this, other) + result := dh.compareDescriptors(category, false, this, other) if less { c.Assert(result.w1 < 0, qt.IsTrue, qt.Commentf("%d", result)) } else { @@ -98,7 +98,7 @@ func BenchmarkCompareDescriptors(b *testing.B) { b.ResetTimer() for i := 0; i < b.N; i++ { for _, pair := range pairs { - _ = dh.compareDescriptors(CategoryLayout, pair.d1, pair.d2) + _ = dh.compareDescriptors(CategoryLayout, false, pair.d1, pair.d2) } } } diff --git a/tpl/tplimpl/templatestore.go b/tpl/tplimpl/templatestore.go index 8fe89586d..6ef030531 100644 --- a/tpl/tplimpl/templatestore.go +++ b/tpl/tplimpl/templatestore.go @@ -311,7 +311,7 @@ func (ti *TemplInfo) findBestMatchBaseof(s *TemplateStore, d1 TemplateDescriptor distance := slashCountK1 - slashCountK2 for d2, vv := range v { - weight := s.dh.compareDescriptors(CategoryBaseof, d1, d2) + weight := s.dh.compareDescriptors(CategoryBaseof, false, d1, d2) weight.distance = distance if best.isBetter(weight, vv.Template) { best.updateValues(weight, k2, d2, vv.Template) @@ -447,7 +447,7 @@ func (s *TemplateStore) FindAllBaseTemplateCandidates(overlayKey string, desc Te continue } - if vv.D.isKindInLayout(desc.Layout) && s.dh.compareDescriptors(CategoryBaseof, descBaseof, vv.D).w1 > 0 { + if vv.D.isKindInLayout(desc.Layout) && s.dh.compareDescriptors(CategoryBaseof, false, descBaseof, vv.D).w1 > 0 { result = append(result, keyTemplateInfo{Key: k, Info: vv}) } } @@ -584,7 +584,7 @@ func (s *TemplateStore) LookupShortcode(q TemplateQuery) *TemplInfo { continue } - weight := s.dh.compareDescriptors(q.Category, q.Desc, k) + weight := s.dh.compareDescriptors(q.Category, vv.subCategory == SubCategoryEmbedded, q.Desc, k) weight.distance = distance if best.isBetter(weight, vv) { best.updateValues(weight, k2, k, vv) @@ -737,7 +737,7 @@ func (s *TemplateStore) findBestMatchGet(key string, category Category, consider continue } - weight := s.dh.compareDescriptors(category, desc, k.d) + weight := s.dh.compareDescriptors(category, vv.subCategory == SubCategoryEmbedded, desc, k.d) if best.isBetter(weight, vv) { best.updateValues(weight, key, k.d, vv) } @@ -758,7 +758,7 @@ func (s *TemplateStore) findBestMatchWalkPath(q TemplateQuery, k1 string, slashC continue } - weight := s.dh.compareDescriptors(q.Category, q.Desc, k.d) + weight := s.dh.compareDescriptors(q.Category, vv.subCategory == SubCategoryEmbedded, q.Desc, k.d) weight.distance = distance isBetter := best.isBetter(weight, vv) diff --git a/tpl/tplimpl/templatestore_integration_test.go b/tpl/tplimpl/templatestore_integration_test.go index 74abe58d0..618c173fc 100644 --- a/tpl/tplimpl/templatestore_integration_test.go +++ b/tpl/tplimpl/templatestore_integration_test.go @@ -826,6 +826,31 @@ func TestPartialHTML(t *testing.T) { b.AssertFileContent("public/index.html", "") } +// Issue #13593. +func TestNoGoat(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +-- content/_index.md -- +--- +title: "Home" +--- + +§§§ +printf "Hello, world!" +§§§ + +-- layouts/all.html -- +{{ .Content }} + +` + + b := hugolib.Test(t, files) + + b.AssertFileContent("public/index.html", "Hello, world!") +} + // Issue #13515 func TestPrintPathWarningOnDotRemoval(t *testing.T) { t.Parallel() From ff3ab192c27fccdd82393f223040874904a44e98 Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Fri, 11 Apr 2025 17:25:13 +0000 Subject: [PATCH 006/129] releaser: Bump versions for release of 0.146.2 [ci skip] --- common/hugo/version_current.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/common/hugo/version_current.go b/common/hugo/version_current.go index 141b88d57..6441427c0 100644 --- a/common/hugo/version_current.go +++ b/common/hugo/version_current.go @@ -17,7 +17,7 @@ package hugo // This should be the only one. var CurrentVersion = Version{ Major: 0, - Minor: 147, - PatchLevel: 0, - Suffix: "-DEV", + Minor: 146, + PatchLevel: 2, + Suffix: "", } From 53221f88ca57634b1b8afeeeacdc923e25b6617c Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Fri, 11 Apr 2025 17:39:58 +0000 Subject: [PATCH 007/129] releaser: Prepare repository for 0.147.0-DEV [ci skip] --- common/hugo/version_current.go | 6 +++--- hugoreleaser.env | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/common/hugo/version_current.go b/common/hugo/version_current.go index 6441427c0..141b88d57 100644 --- a/common/hugo/version_current.go +++ b/common/hugo/version_current.go @@ -17,7 +17,7 @@ package hugo // This should be the only one. var CurrentVersion = Version{ Major: 0, - Minor: 146, - PatchLevel: 2, - Suffix: "", + Minor: 147, + PatchLevel: 0, + Suffix: "-DEV", } diff --git a/hugoreleaser.env b/hugoreleaser.env index f1db59417..3a6bff745 100644 --- a/hugoreleaser.env +++ b/hugoreleaser.env @@ -1,7 +1,8 @@ # Release env. # These will be replaced by script before release. -HUGORELEASER_TAG=v0.146.1 -HUGORELEASER_COMMITISH=acc4fe24be4c3fb8a5b12443878bfa47379b8a9e +HUGORELEASER_TAG=v0.146.2 +HUGORELEASER_COMMITISH=ff3ab192c27fccdd82393f223040874904a44e98 + From c8710625b7c01a0d580f9d896b1fea96ec5463d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Sat, 12 Apr 2025 12:02:33 +0200 Subject: [PATCH 008/129] tpl: Fix it so embedded render-codeblock-goat is used even if custom render-codeblock exists Fixes #13595 --- tpl/tplimpl/templatedescriptor.go | 5 +- tpl/tplimpl/templatestore.go | 5 +- tpl/tplimpl/templatestore_integration_test.go | 97 ++++++++++++++++++- 3 files changed, 100 insertions(+), 7 deletions(-) diff --git a/tpl/tplimpl/templatedescriptor.go b/tpl/tplimpl/templatedescriptor.go index f8cf02870..f93993092 100644 --- a/tpl/tplimpl/templatedescriptor.go +++ b/tpl/tplimpl/templatedescriptor.go @@ -208,12 +208,9 @@ func (this TemplateDescriptor) doCompare(category Category, isEmbedded bool, oth w.w1 += weightVariant1 } - if other.Variant2 != "" && other.Variant2 == this.Variant2 { + if other.Variant1 != "" && other.Variant2 == this.Variant2 { w.w1 += weightVariant2 } - if other.Variant2 != "" && this.Variant2 == "" { - w.w1-- - } return w } diff --git a/tpl/tplimpl/templatestore.go b/tpl/tplimpl/templatestore.go index 6ef030531..e761e14d1 100644 --- a/tpl/tplimpl/templatestore.go +++ b/tpl/tplimpl/templatestore.go @@ -1832,7 +1832,10 @@ func (best *bestMatch) isBetter(w weight, ti *TemplInfo) bool { return false } - if best.w.w1 > 0 { + // Note that for render hook templates, we need to make + // the embedded render hook template wih if they're a better match, + // e.g. render-codeblock-goat.html. + if best.templ.category != CategoryMarkup && best.w.w1 > 0 { currentBestIsEmbedded := best.templ.subCategory == SubCategoryEmbedded if currentBestIsEmbedded { if ti.subCategory != SubCategoryEmbedded { diff --git a/tpl/tplimpl/templatestore_integration_test.go b/tpl/tplimpl/templatestore_integration_test.go index 618c173fc..db7cb5084 100644 --- a/tpl/tplimpl/templatestore_integration_test.go +++ b/tpl/tplimpl/templatestore_integration_test.go @@ -827,7 +827,46 @@ func TestPartialHTML(t *testing.T) { } // Issue #13593. -func TestNoGoat(t *testing.T) { +func TestGoatAndNoGoat(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +-- content/_index.md -- +--- +title: "Home" +--- + + +§§§ +printf "Hello, world!" +§§§ + + +§§§ goat +.---. .-. .-. .-. .---. +| A +--->| 1 |<--->| 2 |<--->| 3 |<---+ B | +'---' '-' '+' '+' '---' +§§§ + + + +-- layouts/all.html -- +{{ .Content }} + +` + + b := hugolib.Test(t, files) + + // Basic code block. + b.AssertFileContent("public/index.html", "printf "Hello, world!"\n") + + // Goat code block. + b.AssertFileContent("public/index.html", "Menlo,Lucida") +} + +// Issue #13595. +func TestGoatAndNoGoatCustomTemplate(t *testing.T) { t.Parallel() files := ` @@ -841,6 +880,16 @@ title: "Home" printf "Hello, world!" §§§ +§§§ goat +.---. .-. .-. .-. .---. +| A +--->| 1 |<--->| 2 |<--->| 3 |<---+ B | +'---' '-' '+' '+' '---' +§§§ + + + +-- layouts/_markup/render-codeblock.html -- +_markup/render-codeblock.html -- layouts/all.html -- {{ .Content }} @@ -848,7 +897,51 @@ printf "Hello, world!" b := hugolib.Test(t, files) - b.AssertFileContent("public/index.html", "Hello, world!") + // Basic code block. + b.AssertFileContent("public/index.html", "_markup/render-codeblock.html") + + // Goat code block. + b.AssertFileContent("public/index.html", "Menlo,Lucida") +} + +func TestGoatcustom(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +-- content/_index.md -- +--- +title: "Home" +--- + +§§§ +printf "Hello, world!" +§§§ + +§§§ goat +.---. .-. .-. .-. .---. +| A +--->| 1 |<--->| 2 |<--->| 3 |<---+ B | +'---' '-' '+' '+' '---' +§§§ + + + +-- layouts/_markup/render-codeblock.html -- +_markup/render-codeblock.html +-- layouts/_markup/render-codeblock-goat.html -- +_markup/render-codeblock-goat.html +-- layouts/all.html -- +{{ .Content }} + +` + + b := hugolib.Test(t, files) + + // Basic code block. + b.AssertFileContent("public/index.html", "_markup/render-codeblock.html") + + // Custom Goat code block. + b.AssertFileContent("public/index.html", "_markup/render-codeblock.html_markup/render-codeblock-goat.html") } // Issue #13515 From 30b9c19c7691aa3d90854c92a355bd8a248bb5b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Sat, 12 Apr 2025 12:37:39 +0200 Subject: [PATCH 009/129] tpl: Make any layout set in front matter higher priority Fixes #13541 --- hugolib/alias.go | 2 +- hugolib/content_map_test.go | 1 + hugolib/page.go | 16 ++-- tpl/tplimpl/templatedescriptor.go | 82 +++++++++---------- tpl/tplimpl/templatedescriptor_test.go | 30 +++---- tpl/tplimpl/templatestore.go | 57 ++++++------- tpl/tplimpl/templatestore_integration_test.go | 42 ++++++++-- 7 files changed, 128 insertions(+), 102 deletions(-) diff --git a/hugolib/alias.go b/hugolib/alias.go index 3beee44db..0bb3165c7 100644 --- a/hugolib/alias.go +++ b/hugolib/alias.go @@ -53,7 +53,7 @@ func (a aliasHandler) renderAlias(permalink string, p page.Page) (io.Reader, err if ps, ok := p.(*pageState); ok { base, templateDesc = ps.GetInternalTemplateBasePathAndDescriptor() } - templateDesc.Layout = "" + templateDesc.LayoutFromUser = "" templateDesc.Kind = "" templateDesc.OutputFormat = output.AliasHTMLFormat.Name diff --git a/hugolib/content_map_test.go b/hugolib/content_map_test.go index aed2a7f13..c24790495 100644 --- a/hugolib/content_map_test.go +++ b/hugolib/content_map_test.go @@ -538,6 +538,7 @@ title: p1 -- content/p1/c.html --

c

-- layouts/_default/single.html -- +Path: {{ .Path }}|{{.Kind }} |{{ (.Resources.Get "a.html").RelPermalink -}} |{{ (.Resources.Get "b.html").RelPermalink -}} |{{ (.Resources.Get "c.html").Publish }} diff --git a/hugolib/page.go b/hugolib/page.go index b36b9712c..84d4d1ea8 100644 --- a/hugolib/page.go +++ b/hugolib/page.go @@ -482,12 +482,12 @@ func (po *pageOutput) GetInternalTemplateBasePathAndDescriptor() (string, tplimp f := po.f base := p.PathInfo().BaseReTyped(p.m.pageConfig.Type) return base, tplimpl.TemplateDescriptor{ - Kind: p.Kind(), - Lang: p.Language().Lang, - Layout: p.Layout(), - OutputFormat: f.Name, - MediaType: f.MediaType.Type, - IsPlainText: f.IsPlainText, + Kind: p.Kind(), + Lang: p.Language().Lang, + LayoutFromUser: p.Layout(), + OutputFormat: f.Name, + MediaType: f.MediaType.Type, + IsPlainText: f.IsPlainText, } } @@ -495,8 +495,8 @@ func (p *pageState) resolveTemplate(layouts ...string) (*tplimpl.TemplInfo, bool dir, d := p.GetInternalTemplateBasePathAndDescriptor() if len(layouts) > 0 { - d.Layout = layouts[0] - d.LayoutMustMatch = true + d.LayoutFromUser = layouts[0] + d.LayoutFromUserMustMatch = true } q := tplimpl.TemplateQuery{ diff --git a/tpl/tplimpl/templatedescriptor.go b/tpl/tplimpl/templatedescriptor.go index f93993092..8e4390fae 100644 --- a/tpl/tplimpl/templatedescriptor.go +++ b/tpl/tplimpl/templatedescriptor.go @@ -22,8 +22,9 @@ const baseNameBaseof = "baseof" // This is used both as a key and in lookups. type TemplateDescriptor struct { // Group 1. - Kind string // page, home, section, taxonomy, term (and only those) - Layout string // list, single, baseof, mycustomlayout. + Kind string // page, home, section, taxonomy, term (and only those) + LayoutFromTemplate string // list, single, all,mycustomlayout + LayoutFromUser string // custom layout set in front matter, e.g. list, single, all, mycustomlayout // Group 2. OutputFormat string // rss, csv ... @@ -34,23 +35,21 @@ type TemplateDescriptor struct { Variant2 string // contextual variant, e.g. "id" in render. // Misc. - LayoutMustMatch bool // If set, we only look for the exact layout. - IsPlainText bool // Whether this is a plain text template. + LayoutFromUserMustMatch bool // If set, we only look for the exact layout. + IsPlainText bool // Whether this is a plain text template. } func (d *TemplateDescriptor) normalizeFromFile() { - // fmt.Println("normalizeFromFile", "kind:", d.Kind, "layout:", d.Layout, "of:", d.OutputFormat) - - if d.Layout == d.OutputFormat { - d.Layout = "" + if d.LayoutFromTemplate == d.OutputFormat { + d.LayoutFromTemplate = "" } if d.Kind == kinds.KindTemporary { d.Kind = "" } - if d.Layout == d.Kind { - d.Layout = "" + if d.LayoutFromTemplate == d.Kind { + d.LayoutFromTemplate = "" } } @@ -61,7 +60,7 @@ type descriptorHandler struct { // Note that this in this setup is usually a descriptor constructed from a page, // so we want to find the best match for that page. func (s descriptorHandler) compareDescriptors(category Category, isEmbedded bool, this, other TemplateDescriptor) weight { - if this.LayoutMustMatch && this.Layout != other.Layout { + if this.LayoutFromUserMustMatch && this.LayoutFromUser != other.LayoutFromTemplate { return weightNoMatch } @@ -94,20 +93,15 @@ func (this TemplateDescriptor) doCompare(category Category, isEmbedded bool, oth return w } - if other.Layout != "" && other.Layout != layoutAll && other.Layout != this.Layout { - if isLayoutCustom(this.Layout) { - if this.Kind == "" { - this.Layout = "" - } else if this.Kind == kinds.KindPage { - this.Layout = layoutSingle - } else { - this.Layout = layoutList + if other.LayoutFromTemplate != "" && other.LayoutFromTemplate != layoutAll { + if this.LayoutFromUser == "" { + if other.LayoutFromTemplate != this.LayoutFromTemplate { + return w + } + } else if isLayoutStandard(this.LayoutFromUser) { + if other.LayoutFromTemplate != this.LayoutFromUser { + return w } - } - - // Test again. - if other.Layout != this.Layout { - return w } } @@ -123,7 +117,11 @@ func (this TemplateDescriptor) doCompare(category Category, isEmbedded bool, oth // We want e.g. home page in amp output format (media type text/html) to // find a template even if one isn't specified for that output format, // when one exist for the html output format (same media type). - if category != CategoryBaseof && (this.Kind == "" || (this.Kind != other.Kind && (this.Layout != other.Layout && other.Layout != layoutAll))) { + skip := category != CategoryBaseof && (this.Kind == "" || (this.Kind != other.Kind && (this.LayoutFromTemplate != other.LayoutFromTemplate && other.LayoutFromTemplate != layoutAll))) + if this.LayoutFromUser != "" { + skip = skip && (this.LayoutFromUser != other.LayoutFromTemplate) + } + if skip { return w } @@ -148,14 +146,14 @@ func (this TemplateDescriptor) doCompare(category Category, isEmbedded bool, oth } const ( - weightKind = 3 // page, home, section, taxonomy, term (and only those) - weightcustomLayout = 4 // custom layout (mylayout, set in e.g. front matter) - weightLayout = 2 // standard layouts (single,list,all) - weightOutputFormat = 2 // a configured output format (e.g. rss, html, json) - weightMediaType = 1 // a configured media type (e.g. text/html, text/plain) - weightLang = 1 // a configured language (e.g. en, nn, fr, ...) - weightVariant1 = 4 // currently used for render hooks, e.g. "link", "image" - weightVariant2 = 2 // currently used for render hooks, e.g. the language "go" in code blocks. + weightKind = 3 // page, home, section, taxonomy, term (and only those) + weightcustomLayout = 4 // custom layout (mylayout, set in e.g. front matter) + weightLayoutStandard = 2 // standard layouts (single,list,all) + weightOutputFormat = 2 // a configured output format (e.g. rss, html, json) + weightMediaType = 1 // a configured media type (e.g. text/html, text/plain) + weightLang = 1 // a configured language (e.g. en, nn, fr, ...) + weightVariant1 = 4 // currently used for render hooks, e.g. "link", "image" + weightVariant2 = 2 // currently used for render hooks, e.g. the language "go" in code blocks. // We will use the values for group 2 and 3 // if the distance up to the template is shorter than @@ -179,14 +177,16 @@ func (this TemplateDescriptor) doCompare(category Category, isEmbedded bool, oth w.w2 = weight2Group1 } - if other.Layout != "" && other.Layout == this.Layout || other.Layout == layoutAll { - if isLayoutCustom(this.Layout) { - w.w1 += weightcustomLayout - w.w2 = weight2Group2 - } else { - w.w1 += weightLayout - w.w2 = weight2Group1 - } + if this.LayoutFromUser == "" && other.LayoutFromTemplate != "" && (other.LayoutFromTemplate == this.LayoutFromTemplate || other.LayoutFromTemplate == layoutAll) { + w.w1 += weightLayoutStandard + w.w2 = weight2Group1 + + } + + // LayoutCustom is only set in this (usually from Page.Layout). + if this.LayoutFromUser != "" && this.LayoutFromUser == other.LayoutFromTemplate { + w.w1 += weightcustomLayout + w.w2 = weight2Group2 } if other.Lang != "" && other.Lang == this.Lang { diff --git a/tpl/tplimpl/templatedescriptor_test.go b/tpl/tplimpl/templatedescriptor_test.go index 6fb8c2195..20ab47fba 100644 --- a/tpl/tplimpl/templatedescriptor_test.go +++ b/tpl/tplimpl/templatedescriptor_test.go @@ -38,29 +38,29 @@ func TestTemplateDescriptorCompare(t *testing.T) { check( CategoryBaseof, - TemplateDescriptor{Kind: "", Layout: "", Lang: "", OutputFormat: "404", MediaType: "text/html"}, - TemplateDescriptor{Kind: "", Layout: "", Lang: "", OutputFormat: "html", MediaType: "text/html"}, + TemplateDescriptor{Kind: "", LayoutFromTemplate: "", Lang: "", OutputFormat: "404", MediaType: "text/html"}, + TemplateDescriptor{Kind: "", LayoutFromTemplate: "", Lang: "", OutputFormat: "html", MediaType: "text/html"}, false, ) check( CategoryLayout, TemplateDescriptor{Kind: "", Lang: "en", OutputFormat: "404", MediaType: "text/html"}, - TemplateDescriptor{Kind: "", Layout: "", Lang: "", OutputFormat: "alias", MediaType: "text/html"}, + TemplateDescriptor{Kind: "", LayoutFromTemplate: "", Lang: "", OutputFormat: "alias", MediaType: "text/html"}, true, ) less( CategoryLayout, - TemplateDescriptor{Kind: kinds.KindHome, Layout: "list", OutputFormat: "html"}, - TemplateDescriptor{Layout: "list", OutputFormat: "html"}, + TemplateDescriptor{Kind: kinds.KindHome, LayoutFromTemplate: "list", OutputFormat: "html"}, + TemplateDescriptor{LayoutFromTemplate: "list", OutputFormat: "html"}, TemplateDescriptor{Kind: kinds.KindHome, OutputFormat: "html"}, ) check( CategoryLayout, - TemplateDescriptor{Kind: kinds.KindHome, Layout: "list", OutputFormat: "html", MediaType: "text/html"}, - TemplateDescriptor{Kind: kinds.KindHome, Layout: "list", OutputFormat: "myformat", MediaType: "text/html"}, + TemplateDescriptor{Kind: kinds.KindHome, LayoutFromTemplate: "list", OutputFormat: "html", MediaType: "text/html"}, + TemplateDescriptor{Kind: kinds.KindHome, LayoutFromTemplate: "list", OutputFormat: "myformat", MediaType: "text/html"}, false, ) } @@ -78,20 +78,20 @@ func BenchmarkCompareDescriptors(b *testing.B) { d1, d2 TemplateDescriptor }{ { - TemplateDescriptor{Kind: "", Layout: "", OutputFormat: "404", MediaType: "text/html", Lang: "en", Variant1: "", Variant2: "", LayoutMustMatch: false, IsPlainText: false}, - TemplateDescriptor{Kind: "", Layout: "", OutputFormat: "rss", MediaType: "application/rss+xml", Lang: "", Variant1: "", Variant2: "", LayoutMustMatch: false, IsPlainText: false}, + TemplateDescriptor{Kind: "", LayoutFromTemplate: "", OutputFormat: "404", MediaType: "text/html", Lang: "en", Variant1: "", Variant2: "", LayoutFromUserMustMatch: false, IsPlainText: false}, + TemplateDescriptor{Kind: "", LayoutFromTemplate: "", OutputFormat: "rss", MediaType: "application/rss+xml", Lang: "", Variant1: "", Variant2: "", LayoutFromUserMustMatch: false, IsPlainText: false}, }, { - TemplateDescriptor{Kind: "page", Layout: "single", OutputFormat: "html", MediaType: "text/html", Lang: "en", Variant1: "", Variant2: "", LayoutMustMatch: false, IsPlainText: false}, - TemplateDescriptor{Kind: "", Layout: "list", OutputFormat: "", MediaType: "application/rss+xml", Lang: "", Variant1: "", Variant2: "", LayoutMustMatch: false, IsPlainText: false}, + TemplateDescriptor{Kind: "page", LayoutFromTemplate: "single", OutputFormat: "html", MediaType: "text/html", Lang: "en", Variant1: "", Variant2: "", LayoutFromUserMustMatch: false, IsPlainText: false}, + TemplateDescriptor{Kind: "", LayoutFromTemplate: "list", OutputFormat: "", MediaType: "application/rss+xml", Lang: "", Variant1: "", Variant2: "", LayoutFromUserMustMatch: false, IsPlainText: false}, }, { - TemplateDescriptor{Kind: "page", Layout: "single", OutputFormat: "html", MediaType: "text/html", Lang: "en", Variant1: "", Variant2: "", LayoutMustMatch: false, IsPlainText: false}, - TemplateDescriptor{Kind: "", Layout: "", OutputFormat: "alias", MediaType: "text/html", Lang: "", Variant1: "", Variant2: "", LayoutMustMatch: false, IsPlainText: false}, + TemplateDescriptor{Kind: "page", LayoutFromTemplate: "single", OutputFormat: "html", MediaType: "text/html", Lang: "en", Variant1: "", Variant2: "", LayoutFromUserMustMatch: false, IsPlainText: false}, + TemplateDescriptor{Kind: "", LayoutFromTemplate: "", OutputFormat: "alias", MediaType: "text/html", Lang: "", Variant1: "", Variant2: "", LayoutFromUserMustMatch: false, IsPlainText: false}, }, { - TemplateDescriptor{Kind: "page", Layout: "single", OutputFormat: "rss", MediaType: "application/rss+xml", Lang: "en", Variant1: "", Variant2: "", LayoutMustMatch: false, IsPlainText: false}, - TemplateDescriptor{Kind: "", Layout: "single", OutputFormat: "rss", MediaType: "application/rss+xml", Lang: "nn", Variant1: "", Variant2: "", LayoutMustMatch: false, IsPlainText: false}, + TemplateDescriptor{Kind: "page", LayoutFromTemplate: "single", OutputFormat: "rss", MediaType: "application/rss+xml", Lang: "en", Variant1: "", Variant2: "", LayoutFromUserMustMatch: false, IsPlainText: false}, + TemplateDescriptor{Kind: "", LayoutFromTemplate: "single", OutputFormat: "rss", MediaType: "application/rss+xml", Lang: "nn", Variant1: "", Variant2: "", LayoutFromUserMustMatch: false, IsPlainText: false}, }, } diff --git a/tpl/tplimpl/templatestore.go b/tpl/tplimpl/templatestore.go index e761e14d1..8483b7df0 100644 --- a/tpl/tplimpl/templatestore.go +++ b/tpl/tplimpl/templatestore.go @@ -378,11 +378,11 @@ func (q *TemplateQuery) init() { } else if kinds.GetKindMain(q.Desc.Kind) == "" { q.Desc.Kind = "" } - if q.Desc.Layout == "" && q.Desc.Kind != "" { + if q.Desc.LayoutFromTemplate == "" && q.Desc.Kind != "" { if q.Desc.Kind == kinds.KindPage { - q.Desc.Layout = layoutSingle + q.Desc.LayoutFromTemplate = layoutSingle } else { - q.Desc.Layout = layoutList + q.Desc.LayoutFromTemplate = layoutList } } @@ -447,7 +447,7 @@ func (s *TemplateStore) FindAllBaseTemplateCandidates(overlayKey string, desc Te continue } - if vv.D.isKindInLayout(desc.Layout) && s.dh.compareDescriptors(CategoryBaseof, false, descBaseof, vv.D).w1 > 0 { + if vv.D.isKindInLayout(desc.LayoutFromTemplate) && s.dh.compareDescriptors(CategoryBaseof, false, descBaseof, vv.D).w1 > 0 { result = append(result, keyTemplateInfo{Key: k, Info: vv}) } } @@ -549,7 +549,7 @@ func (s *TemplateStore) LookupPartial(pth string) *TemplInfo { ti, _ := s.cacheLookupPartials.GetOrCreate(pth, func() (*TemplInfo, error) { d := s.templateDescriptorFromPath(pth) desc := d.Desc - if desc.Layout != "" { + if desc.LayoutFromTemplate != "" { panic("shortcode template descriptor must not have a layout") } best := s.getBest() @@ -610,7 +610,7 @@ func (s *TemplateStore) PrintDebug(prefix string, category Category, w io.Writer return } s := strings.ReplaceAll(strings.TrimSpace(vv.content), "\n", " ") - ts := fmt.Sprintf("kind: %q layout: %q content: %.30s", vv.D.Kind, vv.D.Layout, s) + ts := fmt.Sprintf("kind: %q layout: %q content: %.30s", vv.D.Kind, vv.D.LayoutFromTemplate, s) fmt.Fprintf(w, "%s%s %s\n", strings.Repeat(" ", level), key, ts) } s.treeMain.WalkPrefix(prefix, func(key string, v map[nodeKey]*TemplInfo) (bool, error) { @@ -1573,12 +1573,12 @@ func (s *TemplateStore) toKeyCategoryAndDescriptor(p *paths.Path) (string, strin } d := TemplateDescriptor{ - Lang: p.Lang(), - OutputFormat: p.OutputFormat(), - MediaType: mediaType.Type, - Kind: p.Kind(), - Layout: layout, - IsPlainText: outputFormat.IsPlainText, + Lang: p.Lang(), + OutputFormat: p.OutputFormat(), + MediaType: mediaType.Type, + Kind: p.Kind(), + LayoutFromTemplate: layout, + IsPlainText: outputFormat.IsPlainText, } d.normalizeFromFile() @@ -1611,7 +1611,7 @@ func (s *TemplateStore) toKeyCategoryAndDescriptor(p *paths.Path) (string, strin } if category == CategoryPartial { - d.Layout = "" + d.LayoutFromTemplate = "" k1 = p.PathNoIdentifier() } @@ -1626,15 +1626,15 @@ func (s *TemplateStore) toKeyCategoryAndDescriptor(p *paths.Path) (string, strin } // Legacy layout for home page. - if d.Layout == "index" { + if d.LayoutFromTemplate == "index" { if d.Kind == "" { d.Kind = kinds.KindHome } - d.Layout = "" + d.LayoutFromTemplate = "" } - if d.Layout == d.Kind { - d.Layout = "" + if d.LayoutFromTemplate == d.Kind { + d.LayoutFromTemplate = "" } k1 = strings.TrimPrefix(k1, "/_default") @@ -1645,7 +1645,7 @@ func (s *TemplateStore) toKeyCategoryAndDescriptor(p *paths.Path) (string, strin if category == CategoryMarkup { // We store all template nodes for a given directory on the same level. k1 = strings.TrimSuffix(k1, "/_markup") - parts := strings.Split(d.Layout, "-") + parts := strings.Split(d.LayoutFromTemplate, "-") if len(parts) < 2 { return "", "", 0, TemplateDescriptor{}, fmt.Errorf("unrecognized render hook template") } @@ -1654,7 +1654,7 @@ func (s *TemplateStore) toKeyCategoryAndDescriptor(p *paths.Path) (string, strin if len(parts) > 2 { d.Variant2 = parts[2] } - d.Layout = "" // This allows using page layout as part of the key for lookups. + d.LayoutFromTemplate = "" // This allows using page layout as part of the key for lookups. } return k1, k2, category, d, nil @@ -1868,8 +1868,8 @@ func (best *bestMatch) isBetter(w weight, ti *TemplInfo) bool { return true } - if ti.D.Layout != "" && best.desc.Layout != "" { - return ti.D.Layout != layoutAll + if ti.D.LayoutFromTemplate != "" && best.desc.LayoutFromTemplate != "" { + return ti.D.LayoutFromTemplate != layoutAll } return w.distance < best.w.distance || ti.PathInfo.Path() < best.templ.PathInfo.Path() @@ -1920,17 +1920,6 @@ type weight struct { distance int } -func (w weight) isEqualWeights(other weight) bool { - return w.w1 == other.w1 && w.w2 == other.w2 && w.w3 == other.w3 -} - -func isLayoutCustom(s string) bool { - if s == "" || isLayoutStandard(s) { - return false - } - return true -} - func isLayoutStandard(s string) bool { switch s { case layoutAll, layoutList, layoutSingle: @@ -1940,6 +1929,10 @@ func isLayoutStandard(s string) bool { } } +func (w weight) isEqualWeights(other weight) bool { + return w.w1 == other.w1 && w.w2 == other.w2 && w.w3 == other.w3 +} + func configureSiteStorage(opts SiteOptions, watching bool) *storeSite { funcsv := make(map[string]reflect.Value) diff --git a/tpl/tplimpl/templatestore_integration_test.go b/tpl/tplimpl/templatestore_integration_test.go index db7cb5084..4644c9639 100644 --- a/tpl/tplimpl/templatestore_integration_test.go +++ b/tpl/tplimpl/templatestore_integration_test.go @@ -510,7 +510,7 @@ baseof: {{ block "main" . }}{{ end }} q := tplimpl.TemplateQuery{ Path: "/baz", Category: tplimpl.CategoryLayout, - Desc: tplimpl.TemplateDescriptor{Kind: kinds.KindPage, Layout: "single", OutputFormat: "html"}, + Desc: tplimpl.TemplateDescriptor{Kind: kinds.KindPage, LayoutFromTemplate: "single", OutputFormat: "html"}, } for i := 0; i < b.N; i++ { store.LookupPagesLayout(q) @@ -521,7 +521,7 @@ baseof: {{ block "main" . }}{{ end }} q := tplimpl.TemplateQuery{ Path: "/foo/bar", Category: tplimpl.CategoryLayout, - Desc: tplimpl.TemplateDescriptor{Kind: kinds.KindPage, Layout: "single", OutputFormat: "html"}, + Desc: tplimpl.TemplateDescriptor{Kind: kinds.KindPage, LayoutFromTemplate: "single", OutputFormat: "html"}, } for i := 0; i < b.N; i++ { store.LookupPagesLayout(q) @@ -648,9 +648,6 @@ layout: mylayout b := hugolib.Test(t, files, hugolib.TestOptWarn()) - // s := b.H.Sites[0].TemplateStore - // s.PrintDebug("", tplimpl.CategoryLayout, os.Stdout) - b.AssertLogContains("! WARN") // Single pages. @@ -1095,6 +1092,41 @@ s2. }) } +func TestStandardLayoutInFrontMatter13588(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +disableKinds = ['home','page','rss','sitemap','taxonomy','term'] +-- content/s1/_index.md -- +--- +title: s1 +--- +-- content/s2/_index.md -- +--- +title: s2 +layout: list +--- +-- content/s3/_index.md -- +--- +title: s3 +layout: single +--- +-- layouts/list.html -- +list.html +-- layouts/section.html -- +section.html +-- layouts/single.html -- +single.html +` + + b := hugolib.Test(t, files) + + b.AssertFileContent("public/s1/index.html", "section.html") + b.AssertFileContent("public/s2/index.html", "list.html") // fail + b.AssertFileContent("public/s3/index.html", "single.html") // fail +} + func TestSkipDotFiles(t *testing.T) { t.Parallel() From 05ef8b713a3c091bfca7a3543ed016c64b3c6f88 Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Sat, 12 Apr 2025 17:21:50 +0000 Subject: [PATCH 010/129] releaser: Bump versions for release of 0.146.3 [ci skip] --- common/hugo/version_current.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/common/hugo/version_current.go b/common/hugo/version_current.go index 141b88d57..b0e8c474d 100644 --- a/common/hugo/version_current.go +++ b/common/hugo/version_current.go @@ -17,7 +17,7 @@ package hugo // This should be the only one. var CurrentVersion = Version{ Major: 0, - Minor: 147, - PatchLevel: 0, - Suffix: "-DEV", + Minor: 146, + PatchLevel: 3, + Suffix: "", } From 915ba3f7f0b2f2a2984c00801f0a1ac8f84f8e92 Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Sat, 12 Apr 2025 17:36:11 +0000 Subject: [PATCH 011/129] releaser: Prepare repository for 0.147.0-DEV [ci skip] --- common/hugo/version_current.go | 6 +++--- hugoreleaser.env | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/common/hugo/version_current.go b/common/hugo/version_current.go index b0e8c474d..141b88d57 100644 --- a/common/hugo/version_current.go +++ b/common/hugo/version_current.go @@ -17,7 +17,7 @@ package hugo // This should be the only one. var CurrentVersion = Version{ Major: 0, - Minor: 146, - PatchLevel: 3, - Suffix: "", + Minor: 147, + PatchLevel: 0, + Suffix: "-DEV", } diff --git a/hugoreleaser.env b/hugoreleaser.env index 3a6bff745..3d1adbf08 100644 --- a/hugoreleaser.env +++ b/hugoreleaser.env @@ -1,7 +1,8 @@ # Release env. # These will be replaced by script before release. -HUGORELEASER_TAG=v0.146.2 -HUGORELEASER_COMMITISH=ff3ab192c27fccdd82393f223040874904a44e98 +HUGORELEASER_TAG=v0.146.3 +HUGORELEASER_COMMITISH=05ef8b713a3c091bfca7a3543ed016c64b3c6f88 + From 1e0287f4729f477c6b956fc50f0bfde0edecaa33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Mon, 14 Apr 2025 11:05:07 +0200 Subject: [PATCH 012/129] tpl: Make {{ template "partials/foo.html" . }} work in older setups Fixes #13599 --- tpl/templates/templates_integration_test.go | 2 +- tpl/tplimpl/legacy_integration_test.go | 38 +++++++++++++++++++++ tpl/tplimpl/templates.go | 7 ++++ tpl/tplimpl/templatestore.go | 15 ++++++++ tpl/tplimpl/tplimpl_integration_test.go | 15 ++++++++ 5 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 tpl/tplimpl/legacy_integration_test.go diff --git a/tpl/templates/templates_integration_test.go b/tpl/templates/templates_integration_test.go index 93922b4c4..a0a5e385a 100644 --- a/tpl/templates/templates_integration_test.go +++ b/tpl/templates/templates_integration_test.go @@ -1,4 +1,4 @@ -// Copyright 2024 The Hugo Authors. All rights reserved. +// Copyright 2025 The Hugo Authors. All rights reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/tpl/tplimpl/legacy_integration_test.go b/tpl/tplimpl/legacy_integration_test.go new file mode 100644 index 000000000..a96e35fca --- /dev/null +++ b/tpl/tplimpl/legacy_integration_test.go @@ -0,0 +1,38 @@ +// Copyright 2025 The Hugo Authors. All rights reserved. +// +// Portions Copyright The Go Authors. + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package tplimpl_test + +import ( + "testing" + + "github.com/gohugoio/hugo/hugolib" +) + +func TestLegacyPartialIssue13599(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +-- layouts/partials/mypartial.html -- +Mypartial. +-- layouts/_default/index.html -- +mypartial: {{ template "partials/mypartial.html" . }} + +` + b := hugolib.Test(t, files) + + b.AssertFileContent("public/index.html", "Mypartial.") +} diff --git a/tpl/tplimpl/templates.go b/tpl/tplimpl/templates.go index 4c3ad3be1..f3f98f622 100644 --- a/tpl/tplimpl/templates.go +++ b/tpl/tplimpl/templates.go @@ -99,7 +99,14 @@ func (t *templateNamespace) parseTemplate(ti *TemplInfo) error { return err } } + } + // Issue #13599. + if ti.category == CategoryPartial && ti.Fi != nil && ti.Fi.Meta().PathInfo.Section() == "partials" { + aliasName := strings.TrimPrefix(name, "_") + if _, err := prototype.AddParseTree(aliasName, templ.(*htmltemplate.Template).Tree); err != nil { + return err + } } } diff --git a/tpl/tplimpl/templatestore.go b/tpl/tplimpl/templatestore.go index 8483b7df0..2e332e382 100644 --- a/tpl/tplimpl/templatestore.go +++ b/tpl/tplimpl/templatestore.go @@ -1,3 +1,18 @@ +// Copyright 2025 The Hugo Authors. All rights reserved. +// +// Portions Copyright The Go Authors. + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package tplimpl import ( diff --git a/tpl/tplimpl/tplimpl_integration_test.go b/tpl/tplimpl/tplimpl_integration_test.go index 8b80d5b60..b62898923 100644 --- a/tpl/tplimpl/tplimpl_integration_test.go +++ b/tpl/tplimpl/tplimpl_integration_test.go @@ -1,3 +1,18 @@ +// Copyright 2025 The Hugo Authors. All rights reserved. +// +// Portions Copyright The Go Authors. + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package tplimpl_test import ( From 8a2830f2dcbf2c9b799ff8d1db9601da58f98494 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Mon, 14 Apr 2025 11:20:36 +0200 Subject: [PATCH 013/129] tpl: Add proper file context to template parse errors Fixes #13604 --- tpl/templates/templates_integration_test.go | 33 +++++++++++++++++++++ tpl/tplimpl/templates.go | 11 ++++++- tpl/tplimpl/templatestore.go | 32 ++++++++++---------- 3 files changed, 60 insertions(+), 16 deletions(-) diff --git a/tpl/templates/templates_integration_test.go b/tpl/templates/templates_integration_test.go index a0a5e385a..635d521d7 100644 --- a/tpl/templates/templates_integration_test.go +++ b/tpl/templates/templates_integration_test.go @@ -17,6 +17,7 @@ import ( "path/filepath" "testing" + qt "github.com/frankban/quicktest" "github.com/gohugoio/hugo/hugolib" ) @@ -229,3 +230,35 @@ layouts/section/section.html b := hugolib.Test(t, files) b.AssertFileContent("public/mysection/index.html", "layouts/section/section.html") } + +func TestErrorMessageParseError(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +-- layouts/home.html -- +Line 1. +Line 2. {{ foo }} <- this func does not exist. +Line 3. +` + + b, err := hugolib.TestE(t, files) + b.Assert(err, qt.IsNotNil) + b.Assert(err.Error(), qt.Contains, filepath.FromSlash(`"/layouts/home.html:2:1": parse of template failed: template: home.html:2: function "foo" not defined`)) +} + +func TestErrorMessageExecuteError(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +-- layouts/home.html -- +Line 1. +Line 2. {{ .Foo }} <- this method does not exist. +Line 3. +` + + b, err := hugolib.TestE(t, files) + b.Assert(err, qt.IsNotNil) + b.Assert(err.Error(), qt.Contains, filepath.FromSlash(` "/layouts/home.html:2:11": execute of template failed`)) +} diff --git a/tpl/tplimpl/templates.go b/tpl/tplimpl/templates.go index f3f98f622..19de48e38 100644 --- a/tpl/tplimpl/templates.go +++ b/tpl/tplimpl/templates.go @@ -44,7 +44,16 @@ var embeddedTemplatesAliases = map[string][]string{ "_shortcodes/twitter.html": {"_shortcodes/tweet.html"}, } -func (t *templateNamespace) parseTemplate(ti *TemplInfo) error { +func (s *TemplateStore) parseTemplate(ti *TemplInfo) error { + err := s.tns.doParseTemplate(ti) + if err != nil { + return s.addFileContext(ti, "parse of template failed", err) + } + + return err +} + +func (t *templateNamespace) doParseTemplate(ti *TemplInfo) error { if !ti.noBaseOf || ti.category == CategoryBaseof { // Delay parsing until we have the base template. return nil diff --git a/tpl/tplimpl/templatestore.go b/tpl/tplimpl/templatestore.go index 2e332e382..7544b5625 100644 --- a/tpl/tplimpl/templatestore.go +++ b/tpl/tplimpl/templatestore.go @@ -495,7 +495,7 @@ func (t *TemplateStore) ExecuteWithContext(ctx context.Context, ti *TemplInfo, w execErr := t.storeSite.executer.ExecuteWithContext(ctx, ti, wr, data) if execErr != nil { - return t.addFileContext(ti, execErr) + return t.addFileContext(ti, "execute of template failed", execErr) } return nil } @@ -822,7 +822,7 @@ func (t *TemplateStore) addDeferredTemplate(owner *TemplInfo, name string, n *pa return nil } -func (s *TemplateStore) addFileContext(ti *TemplInfo, inerr error) error { +func (s *TemplateStore) addFileContext(ti *TemplInfo, what string, inerr error) error { if ti.Fi == nil { return inerr } @@ -854,25 +854,27 @@ func (s *TemplateStore) addFileContext(ti *TemplInfo, inerr error) error { fe := herrors.NewFileErrorFromName(inErr, fi.Meta().Filename) fe.UpdateContent(f, lineMatcher) - if !fe.ErrorContext().Position.IsValid() { - return inErr, false - } - return fe, true + return fe, fe.ErrorContext().Position.IsValid() } - inerr = fmt.Errorf("execute of template failed: %w", inerr) + inerr = fmt.Errorf("%s: %w", what, inerr) - if err, ok := checkFilename(ti.Fi, inerr); ok { - return err + var ( + currentErr error + ok bool + ) + + if currentErr, ok = checkFilename(ti.Fi, inerr); ok { + return currentErr } if ti.base != nil { - if err, ok := checkFilename(ti.base.Fi, inerr); ok { - return err + if currentErr, ok = checkFilename(ti.base.Fi, inerr); ok { + return currentErr } } - return inerr + return currentErr } func (s *TemplateStore) extractIdentifiers(line string) []string { @@ -1389,7 +1391,7 @@ func (s *TemplateStore) parseTemplates() error { if vv.state == processingStateTransformed { continue } - if err := s.tns.parseTemplate(vv); err != nil { + if err := s.parseTemplate(vv); err != nil { return err } } @@ -1409,7 +1411,7 @@ func (s *TemplateStore) parseTemplates() error { // The regular expression used to detect if a template needs a base template has some // rare false positives. Assume we don't need one. vv.noBaseOf = true - if err := s.tns.parseTemplate(vv); err != nil { + if err := s.parseTemplate(vv); err != nil { return err } continue @@ -1438,7 +1440,7 @@ func (s *TemplateStore) parseTemplates() error { if vvv.state == processingStateTransformed { continue } - if err := s.tns.parseTemplate(vvv); err != nil { + if err := s.parseTemplate(vvv); err != nil { return err } } From cf9e6904cc0850b20f9e4e378b12851bb72f44dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Mon, 14 Apr 2025 11:41:56 +0200 Subject: [PATCH 014/129] tpl: Fix the case for a shortcode in a nested folder only Fixes #13605 --- hugolib/shortcode.go | 8 +------ tpl/tplimpl/templatestore.go | 18 ++++++++++++--- tpl/tplimpl/templatestore_integration_test.go | 22 +++++++++++++++++++ 3 files changed, 38 insertions(+), 10 deletions(-) diff --git a/hugolib/shortcode.go b/hugolib/shortcode.go index 3ac0940e2..cc8a145d9 100644 --- a/hugolib/shortcode.go +++ b/hugolib/shortcode.go @@ -677,13 +677,7 @@ Loop: // Used to check if the template expects inner content, // so just pick one arbitrarily with the same name. - q := tplimpl.TemplateQuery{ - Path: "", - Name: sc.name, - Category: tplimpl.CategoryShortcode, - Consider: nil, - } - templ := s.s.TemplateStore.LookupShortcode(q) + templ := s.s.TemplateStore.LookupShortcodeByName(sc.name) if templ == nil { return nil, fmt.Errorf("%s: template for shortcode %q not found", errorPrefix, sc.name) } diff --git a/tpl/tplimpl/templatestore.go b/tpl/tplimpl/templatestore.go index 7544b5625..99e8c4839 100644 --- a/tpl/tplimpl/templatestore.go +++ b/tpl/tplimpl/templatestore.go @@ -122,6 +122,7 @@ func NewStore(opts StoreOptions, siteOpts SiteOptions) (*TemplateStore, error) { treeMain: doctree.NewSimpleTree[map[nodeKey]*TemplInfo](), treeShortcodes: doctree.NewSimpleTree[map[string]map[TemplateDescriptor]*TemplInfo](), templatesByPath: maps.NewCache[string, *TemplInfo](), + shortcodesByName: maps.NewCache[string, *TemplInfo](), cacheLookupPartials: maps.NewCache[string, *TemplInfo](), // Note that the funcs passed below is just for name validation. @@ -419,9 +420,10 @@ type TemplateStore struct { siteOpts SiteOptions htmlFormat output.Format - treeMain *doctree.SimpleTree[map[nodeKey]*TemplInfo] - treeShortcodes *doctree.SimpleTree[map[string]map[TemplateDescriptor]*TemplInfo] - templatesByPath *maps.Cache[string, *TemplInfo] + treeMain *doctree.SimpleTree[map[nodeKey]*TemplInfo] + treeShortcodes *doctree.SimpleTree[map[string]map[TemplateDescriptor]*TemplInfo] + templatesByPath *maps.Cache[string, *TemplInfo] + shortcodesByName *maps.Cache[string, *TemplInfo] dh descriptorHandler @@ -576,6 +578,15 @@ func (s *TemplateStore) LookupPartial(pth string) *TemplInfo { return ti } +func (s *TemplateStore) LookupShortcodeByName(name string) *TemplInfo { + name = strings.ToLower(name) + ti, _ := s.shortcodesByName.Get(name) + if ti == nil { + return nil + } + return ti +} + func (s *TemplateStore) LookupShortcode(q TemplateQuery) *TemplInfo { q.init() k1 := s.key(q.Path) @@ -1039,6 +1050,7 @@ func (s *TemplateStore) insertShortcode(pi *paths.Path, fi hugofs.FileMetaInfo, m1[d] = ti + s.shortcodesByName.Set(k2, ti) s.setTemplateByPath(pi.Path(), ti) if fi != nil { diff --git a/tpl/tplimpl/templatestore_integration_test.go b/tpl/tplimpl/templatestore_integration_test.go index 4644c9639..b302f5bb3 100644 --- a/tpl/tplimpl/templatestore_integration_test.go +++ b/tpl/tplimpl/templatestore_integration_test.go @@ -1127,6 +1127,28 @@ single.html b.AssertFileContent("public/s3/index.html", "single.html") // fail } +func TestIssue13605(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +disableKinds = ['home','rss','section','sitemap','taxonomy','term'] +-- content/s1/p1.md -- +--- +title: p1 +--- +{{< sc >}} +-- layouts/s1/_shortcodes/sc.html -- +layouts/s1/_shortcodes/sc.html +-- layouts/single.html -- +{{ .Content }} +` + + b := hugolib.Test(t, files) + + b.AssertFileContent("public/s1/p1/index.html", "layouts/s1/_shortcodes/sc.html") +} + func TestSkipDotFiles(t *testing.T) { t.Parallel() From e8e8ce10d2b8f2eda754639dab4d20cab9613d42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Mon, 14 Apr 2025 11:55:57 +0200 Subject: [PATCH 015/129] tpl: Avoid panic on nonsensical return construct Fixes #13600 --- tpl/templates/templates_integration_test.go | 17 +++++++++++++++++ tpl/tplimpl/templatetransform.go | 3 +++ 2 files changed, 20 insertions(+) diff --git a/tpl/templates/templates_integration_test.go b/tpl/templates/templates_integration_test.go index 635d521d7..7bdcdc9f0 100644 --- a/tpl/templates/templates_integration_test.go +++ b/tpl/templates/templates_integration_test.go @@ -262,3 +262,20 @@ Line 3. b.Assert(err, qt.IsNotNil) b.Assert(err.Error(), qt.Contains, filepath.FromSlash(` "/layouts/home.html:2:11": execute of template failed`)) } + +func TestPartialReturnPanicIssue13600(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +-- layouts/home.html -- +Partial: {{ partial "p1.html" . }} +-- layouts/_partials/p1.html -- +P1. +{{ return ( delimit . ", " ) | string }} +` + + b, err := hugolib.TestE(t, files) + b.Assert(err, qt.IsNotNil) + b.Assert(err.Error(), qt.Contains, "wrong number of args for string: want 1 got 0") +} diff --git a/tpl/tplimpl/templatetransform.go b/tpl/tplimpl/templatetransform.go index cba4c6584..eca9fdad1 100644 --- a/tpl/tplimpl/templatetransform.go +++ b/tpl/tplimpl/templatetransform.go @@ -175,6 +175,9 @@ func (c *templateTransformContext) applyTransformations(n parse.Node) (bool, err } case *parse.CommandNode: + if x == nil { + return true, nil + } c.collectInner(x) keep := c.collectReturnNode(x) From 65c94c7b2382a066c5a1dba49ba8a1c34a902765 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Mon, 14 Apr 2025 12:00:14 +0200 Subject: [PATCH 016/129] tpl: Fix issue with partials without suffix Fixes #13601 --- tpl/templates/templates_integration_test.go | 20 ++++++++++++++++++++ tpl/tplimpl/templatestore.go | 9 ++++++++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/tpl/templates/templates_integration_test.go b/tpl/templates/templates_integration_test.go index 7bdcdc9f0..d16333ed4 100644 --- a/tpl/templates/templates_integration_test.go +++ b/tpl/templates/templates_integration_test.go @@ -279,3 +279,23 @@ P1. b.Assert(err, qt.IsNotNil) b.Assert(err.Error(), qt.Contains, "wrong number of args for string: want 1 got 0") } + +func TestPartialWithoutSuffixIssue13601(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +-- layouts/home.html -- +P1: {{ partial "p1" . }} +P2: {{ partial "p2" . }} +-- layouts/_partials/p1 -- +P1. +-- layouts/_partials/p2 -- +P2. +{{ return "foo bar" }} + +` + + b := hugolib.Test(t, files) + b.AssertFileContent("public/index.html", "P1: P1.\nP2: foo bar") +} diff --git a/tpl/tplimpl/templatestore.go b/tpl/tplimpl/templatestore.go index 99e8c4839..bb58c9083 100644 --- a/tpl/tplimpl/templatestore.go +++ b/tpl/tplimpl/templatestore.go @@ -913,7 +913,7 @@ func (s *TemplateStore) extractInlinePartials() error { name := templ.Name() if !paths.HasExt(name) { // Assume HTML. This in line with how the lookup works. - name = name + ".html" + name = name + s.htmlFormat.MediaType.FirstSuffix.FullSuffix } if !strings.HasPrefix(name, "_") { name = "_" + name @@ -1092,6 +1092,12 @@ func (s *TemplateStore) insertTemplate2( panic("category not set") } + if category == CategoryPartial && d.OutputFormat == "" && d.MediaType == "" { + // See issue #13601. + d.OutputFormat = s.htmlFormat.Name + d.MediaType = s.htmlFormat.MediaType.Type + } + m := tree.Get(key) nk := nodeKey{c: category, d: d} @@ -1719,6 +1725,7 @@ func (s *TemplateStore) transformTemplates() error { continue } if !vv.noBaseOf { + // TODO(bep) I don't think this branch is ever called. for vvv := range vv.BaseVariantsSeq() { tctx, err := applyTemplateTransformers(vvv.Template, lookup) if err != nil { From 985af1c097fd6a7830ba1ab307dc0d959663e344 Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Mon, 14 Apr 2025 13:10:30 +0000 Subject: [PATCH 017/129] releaser: Bump versions for release of 0.146.4 [ci skip] --- common/hugo/version_current.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/common/hugo/version_current.go b/common/hugo/version_current.go index 141b88d57..d3f68bd85 100644 --- a/common/hugo/version_current.go +++ b/common/hugo/version_current.go @@ -17,7 +17,7 @@ package hugo // This should be the only one. var CurrentVersion = Version{ Major: 0, - Minor: 147, - PatchLevel: 0, - Suffix: "-DEV", + Minor: 146, + PatchLevel: 4, + Suffix: "", } From 01667275d42b90e69a5dded1820e9f44e398a1b5 Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Mon, 14 Apr 2025 13:25:05 +0000 Subject: [PATCH 018/129] releaser: Prepare repository for 0.147.0-DEV [ci skip] --- common/hugo/version_current.go | 6 +++--- hugoreleaser.env | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/common/hugo/version_current.go b/common/hugo/version_current.go index d3f68bd85..141b88d57 100644 --- a/common/hugo/version_current.go +++ b/common/hugo/version_current.go @@ -17,7 +17,7 @@ package hugo // This should be the only one. var CurrentVersion = Version{ Major: 0, - Minor: 146, - PatchLevel: 4, - Suffix: "", + Minor: 147, + PatchLevel: 0, + Suffix: "-DEV", } diff --git a/hugoreleaser.env b/hugoreleaser.env index 3d1adbf08..33ae4f799 100644 --- a/hugoreleaser.env +++ b/hugoreleaser.env @@ -1,7 +1,8 @@ # Release env. # These will be replaced by script before release. -HUGORELEASER_TAG=v0.146.3 -HUGORELEASER_COMMITISH=05ef8b713a3c091bfca7a3543ed016c64b3c6f88 +HUGORELEASER_TAG=v0.146.4 +HUGORELEASER_COMMITISH=985af1c097fd6a7830ba1ab307dc0d959663e344 + From d61b9fc605e028214e2f788699c04a0aa2ac42cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Tue, 15 Apr 2025 09:05:24 +0200 Subject: [PATCH 019/129] tpl: Fix language handling in partials We now use the same code path for all templates re this. Fixes #13612 --- common/paths/pathparser.go | 2 +- hugolib/content_map_page.go | 2 +- tpl/tplimpl/templatestore.go | 54 +++++-------------- tpl/tplimpl/templatestore_integration_test.go | 41 ++++++++++++++ 4 files changed, 55 insertions(+), 44 deletions(-) diff --git a/common/paths/pathparser.go b/common/paths/pathparser.go index 4b3feaa14..c04f2022e 100644 --- a/common/paths/pathparser.go +++ b/common/paths/pathparser.go @@ -724,7 +724,7 @@ func (p *Path) IsContentData() bool { return p.pathType == TypeContentData } -func (p Path) ForBundleType(t Type) *Path { +func (p Path) ForType(t Type) *Path { p.pathType = t return &p } diff --git a/hugolib/content_map_page.go b/hugolib/content_map_page.go index b501cd9ea..c51b4a17a 100644 --- a/hugolib/content_map_page.go +++ b/hugolib/content_map_page.go @@ -180,7 +180,7 @@ func (t *pageTrees) collectAndMarkStaleIdentities(p *paths.Path) []identity.Iden if p.Component() == files.ComponentFolderContent { // It may also be a bundled content resource. - key := p.ForBundleType(paths.TypeContentResource).Base() + key := p.ForType(paths.TypeContentResource).Base() tree = t.treeResources nCount = 0 tree.ForEeachInDimension(key, doctree.DimensionLanguage.Index(), diff --git a/tpl/tplimpl/templatestore.go b/tpl/tplimpl/templatestore.go index bb58c9083..4266e274a 100644 --- a/tpl/tplimpl/templatestore.go +++ b/tpl/tplimpl/templatestore.go @@ -564,14 +564,21 @@ func (s *TemplateStore) LookupPagesLayout(q TemplateQuery) *TemplInfo { func (s *TemplateStore) LookupPartial(pth string) *TemplInfo { ti, _ := s.cacheLookupPartials.GetOrCreate(pth, func() (*TemplInfo, error) { - d := s.templateDescriptorFromPath(pth) - desc := d.Desc - if desc.LayoutFromTemplate != "" { - panic("shortcode template descriptor must not have a layout") + pi := s.opts.PathParser.Parse(files.ComponentFolderLayouts, pth).ForType(paths.TypePartial) + k1, _, _, desc, err := s.toKeyCategoryAndDescriptor(pi) + if err != nil { + return nil, err } + if desc.OutputFormat == "" && desc.MediaType == "" { + // Assume HTML. + desc.OutputFormat = s.htmlFormat.Name + desc.MediaType = s.htmlFormat.MediaType.Type + desc.IsPlainText = s.htmlFormat.IsPlainText + } + best := s.getBest() defer s.putBest(best) - s.findBestMatchGet(s.key(path.Join(containerPartials, d.Path)), CategoryPartial, nil, desc, best) + s.findBestMatchGet(s.key(path.Join(containerPartials, k1)), CategoryPartial, nil, desc, best) return best.templ, nil }) @@ -1486,43 +1493,6 @@ type PathTemplateDescriptor struct { Desc TemplateDescriptor } -// templateDescriptorFromPath returns a template descriptor from the given path. -// This is currently used in partial lookups only. -func (s *TemplateStore) templateDescriptorFromPath(pth string) PathTemplateDescriptor { - var ( - mt media.Type - of output.Format - ) - - // Common cases. - dotCount := strings.Count(pth, ".") - if dotCount <= 1 { - if dotCount == 0 { - // Asume HTML. - of, mt = s.resolveOutputFormatAndOrMediaType("html", "") - } else { - pth = strings.TrimPrefix(pth, "/") - ext := path.Ext(pth) - pth = strings.TrimSuffix(pth, ext) - ext = ext[1:] - of, mt = s.resolveOutputFormatAndOrMediaType("", ext) - } - } else { - path := s.opts.PathParser.Parse(files.ComponentFolderLayouts, pth) - pth = path.PathNoIdentifier() - of, mt = s.resolveOutputFormatAndOrMediaType(path.OutputFormat(), path.Ext()) - } - - return PathTemplateDescriptor{ - Path: pth, - Desc: TemplateDescriptor{ - OutputFormat: of.Name, - MediaType: mt.Type, - IsPlainText: of.IsPlainText, - }, - } -} - // resolveOutputFormatAndOrMediaType resolves the output format and/or media type // based on the given output format suffix and media type suffix. // Either of the suffixes can be empty, and the function will try to find a match diff --git a/tpl/tplimpl/templatestore_integration_test.go b/tpl/tplimpl/templatestore_integration_test.go index b302f5bb3..32e1248fe 100644 --- a/tpl/tplimpl/templatestore_integration_test.go +++ b/tpl/tplimpl/templatestore_integration_test.go @@ -1163,3 +1163,44 @@ All. // Just make sure it doesn't fail. hugolib.Test(t, files) } + +func TestPartialsLangIssue13612(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +disableKinds = ['page','section','sitemap','taxonomy','term'] + +defaultContentLanguage = 'ru' +defaultContentLanguageInSubdir = true + +[languages.ru] +weight = 1 + +[languages.en] +weight = 2 + +[outputs] +home = ['html','rss'] + +-- layouts/_partials/comment.en.html -- +layouts/_partials/comment.en.html +-- layouts/_partials/comment.en.xml -- +layouts/_partials/comment.en.xml +-- layouts/_partials/comment.ru.html -- +layouts/_partials/comment.ru.html +-- layouts/_partials/comment.ru.xml -- +layouts/_partials/comment.ru.xml +-- layouts/home.html -- +{{ partial (print "comment." (default "ru" .Lang) ".html") . }} +-- layouts/home.rss.xml -- +{{ partial (print "comment." (default "ru" .Lang) ".xml") . }} +` + + b := hugolib.Test(t, files) + + b.AssertFileContent("public/en/index.html", "layouts/_partials/comment.en.html") + b.AssertFileContent("public/en/index.xml", "layouts/_partials/comment.en.xml") // fail + b.AssertFileContent("public/ru/index.html", "layouts/_partials/comment.ru.html") // fail + b.AssertFileContent("public/ru/index.xml", "layouts/_partials/comment.ru.xml") // fail +} From 64cf008880e48a5f7ea82be30bf87d8077ebb85b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Apr 2025 08:23:28 +0000 Subject: [PATCH 020/129] build(deps): bump github.com/yuin/goldmark from 1.7.8 to 1.7.9 Bumps [github.com/yuin/goldmark](https://github.com/yuin/goldmark) from 1.7.8 to 1.7.9. - [Release notes](https://github.com/yuin/goldmark/releases) - [Commits](https://github.com/yuin/goldmark/compare/v1.7.8...v1.7.9) --- updated-dependencies: - dependency-name: github.com/yuin/goldmark dependency-version: 1.7.9 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 9423c6f68..7ac1780d5 100644 --- a/go.mod +++ b/go.mod @@ -69,7 +69,7 @@ require ( github.com/tdewolff/minify/v2 v2.20.37 github.com/tdewolff/parse/v2 v2.7.15 github.com/tetratelabs/wazero v1.9.0 - github.com/yuin/goldmark v1.7.8 + github.com/yuin/goldmark v1.7.9 github.com/yuin/goldmark-emoji v1.0.5 go.uber.org/automaxprocs v1.5.3 gocloud.dev v0.40.0 diff --git a/go.sum b/go.sum index 5712679f0..234dc465f 100644 --- a/go.sum +++ b/go.sum @@ -467,8 +467,8 @@ github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9dec github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yuin/goldmark v1.7.1/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= -github.com/yuin/goldmark v1.7.8 h1:iERMLn0/QJeHFhxSt3p6PeN9mGnvIKSpG9YYorDMnic= -github.com/yuin/goldmark v1.7.8/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= +github.com/yuin/goldmark v1.7.9 h1:rVSeT+f7/lAM+bJHVm5YHGwNrnd40i1Ch2DEocEjHQ0= +github.com/yuin/goldmark v1.7.9/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= github.com/yuin/goldmark-emoji v1.0.5 h1:EMVWyCGPlXJfUXBXpuMu+ii3TIaxbVBnEX9uaDC4cIk= github.com/yuin/goldmark-emoji v1.0.5/go.mod h1:tTkZEbwu5wkPmgTcitqddVxY9osFZiavD+r4AzQrh1U= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= From 61328976e11cbb9d906b4a790b8a7cd25b2a914f Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Tue, 15 Apr 2025 17:54:38 +0000 Subject: [PATCH 021/129] releaser: Bump versions for release of 0.146.5 [ci skip] --- common/hugo/version_current.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/common/hugo/version_current.go b/common/hugo/version_current.go index 141b88d57..bb5bceec4 100644 --- a/common/hugo/version_current.go +++ b/common/hugo/version_current.go @@ -17,7 +17,7 @@ package hugo // This should be the only one. var CurrentVersion = Version{ Major: 0, - Minor: 147, - PatchLevel: 0, - Suffix: "-DEV", + Minor: 146, + PatchLevel: 5, + Suffix: "", } From d5a8c330cb7b13de8072aae48a7bc3fa3503b1d7 Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Tue, 15 Apr 2025 18:09:42 +0000 Subject: [PATCH 022/129] releaser: Prepare repository for 0.147.0-DEV [ci skip] --- common/hugo/version_current.go | 6 +++--- hugoreleaser.env | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/common/hugo/version_current.go b/common/hugo/version_current.go index bb5bceec4..141b88d57 100644 --- a/common/hugo/version_current.go +++ b/common/hugo/version_current.go @@ -17,7 +17,7 @@ package hugo // This should be the only one. var CurrentVersion = Version{ Major: 0, - Minor: 146, - PatchLevel: 5, - Suffix: "", + Minor: 147, + PatchLevel: 0, + Suffix: "-DEV", } diff --git a/hugoreleaser.env b/hugoreleaser.env index 33ae4f799..6ea1c7a70 100644 --- a/hugoreleaser.env +++ b/hugoreleaser.env @@ -1,7 +1,8 @@ # Release env. # These will be replaced by script before release. -HUGORELEASER_TAG=v0.146.4 -HUGORELEASER_COMMITISH=985af1c097fd6a7830ba1ab307dc0d959663e344 +HUGORELEASER_TAG=v0.146.5 +HUGORELEASER_COMMITISH=61328976e11cbb9d906b4a790b8a7cd25b2a914f + From a88b488181279befd50e1d127f9f67604f2f9854 Mon Sep 17 00:00:00 2001 From: broughtupsy <162842238+broughtupsy@users.noreply.github.com> Date: Mon, 15 Apr 2024 18:44:42 +0300 Subject: [PATCH 023/129] Update watchtestscripts.sh --- watchtestscripts.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/watchtestscripts.sh b/watchtestscripts.sh index bf61d0cc3..5c6f90009 100755 --- a/watchtestscripts.sh +++ b/watchtestscripts.sh @@ -3,5 +3,5 @@ trap exit SIGINT # I use "run tests on save" in my editor. -# Unfortunately, changes to text files does not trigger this. Hence this workaround. -while true; do find testscripts -type f -name "*.txt" | entr -pd touch main_test.go; done \ No newline at end of file +# Unfortunately, changes to text files do not trigger this. Hence this workaround. +while true; do find testscripts -type f -name "*.txt" | entr -pd touch main_test.go; done From 088cd2f996bfbbdf4ed01cafa2c8101b3ea0e94e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Sun, 20 Apr 2025 10:59:40 +0200 Subject: [PATCH 024/129] tpl: Fix when layout specified in front matter and no match is found Fixes #13628 --- tpl/tplimpl/templatedescriptor.go | 2 +- tpl/tplimpl/templatestore_integration_test.go | 25 +++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/tpl/tplimpl/templatedescriptor.go b/tpl/tplimpl/templatedescriptor.go index 8e4390fae..ca73c9f78 100644 --- a/tpl/tplimpl/templatedescriptor.go +++ b/tpl/tplimpl/templatedescriptor.go @@ -177,7 +177,7 @@ func (this TemplateDescriptor) doCompare(category Category, isEmbedded bool, oth w.w2 = weight2Group1 } - if this.LayoutFromUser == "" && other.LayoutFromTemplate != "" && (other.LayoutFromTemplate == this.LayoutFromTemplate || other.LayoutFromTemplate == layoutAll) { + if other.LayoutFromTemplate != "" && (other.LayoutFromTemplate == this.LayoutFromTemplate || other.LayoutFromTemplate == layoutAll) { w.w1 += weightLayoutStandard w.w2 = weight2Group1 diff --git a/tpl/tplimpl/templatestore_integration_test.go b/tpl/tplimpl/templatestore_integration_test.go index 32e1248fe..e59dad33a 100644 --- a/tpl/tplimpl/templatestore_integration_test.go +++ b/tpl/tplimpl/templatestore_integration_test.go @@ -1204,3 +1204,28 @@ layouts/_partials/comment.ru.xml b.AssertFileContent("public/ru/index.html", "layouts/_partials/comment.ru.html") // fail b.AssertFileContent("public/ru/index.xml", "layouts/_partials/comment.ru.xml") // fail } + +func TestLayoutIssue13628(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +disableKinds = ['home','rss','sitemap','taxonomy','term'] +-- content/p1.md -- +--- +title: p1 +layout: foo +--- +-- layouts/single.html -- +layouts/single.html +-- layouts/list.html -- +layouts/list.html +` + + for range 5 { + + b := hugolib.Test(t, files) + + b.AssertFileContent("public/p1/index.html", "layouts/single.html") + } +} From 1e0b058efe8d6e236bc7c8d6981d9bfb1443178e Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Sun, 20 Apr 2025 10:58:40 +0000 Subject: [PATCH 025/129] releaser: Bump versions for release of 0.146.6 [ci skip] --- common/hugo/version_current.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/common/hugo/version_current.go b/common/hugo/version_current.go index 141b88d57..f82bec354 100644 --- a/common/hugo/version_current.go +++ b/common/hugo/version_current.go @@ -17,7 +17,7 @@ package hugo // This should be the only one. var CurrentVersion = Version{ Major: 0, - Minor: 147, - PatchLevel: 0, - Suffix: "-DEV", + Minor: 146, + PatchLevel: 6, + Suffix: "", } From 99fff2997d46966a24936ba37bf9d8e4fc16fbcc Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Sun, 20 Apr 2025 11:13:56 +0000 Subject: [PATCH 026/129] releaser: Prepare repository for 0.147.0-DEV [ci skip] --- common/hugo/version_current.go | 6 +++--- hugoreleaser.env | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/common/hugo/version_current.go b/common/hugo/version_current.go index f82bec354..141b88d57 100644 --- a/common/hugo/version_current.go +++ b/common/hugo/version_current.go @@ -17,7 +17,7 @@ package hugo // This should be the only one. var CurrentVersion = Version{ Major: 0, - Minor: 146, - PatchLevel: 6, - Suffix: "", + Minor: 147, + PatchLevel: 0, + Suffix: "-DEV", } diff --git a/hugoreleaser.env b/hugoreleaser.env index 6ea1c7a70..1a51a532e 100644 --- a/hugoreleaser.env +++ b/hugoreleaser.env @@ -1,7 +1,8 @@ # Release env. # These will be replaced by script before release. -HUGORELEASER_TAG=v0.146.5 -HUGORELEASER_COMMITISH=61328976e11cbb9d906b4a790b8a7cd25b2a914f +HUGORELEASER_TAG=v0.146.6 +HUGORELEASER_COMMITISH=1e0b058efe8d6e236bc7c8d6981d9bfb1443178e + From be3b14786022df139a8a3bcbbe477d00fc7a734c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Apr 2025 08:20:19 +0000 Subject: [PATCH 027/129] build(deps): bump github.com/yuin/goldmark from 1.7.9 to 1.7.10 Bumps [github.com/yuin/goldmark](https://github.com/yuin/goldmark) from 1.7.9 to 1.7.10. - [Release notes](https://github.com/yuin/goldmark/releases) - [Commits](https://github.com/yuin/goldmark/compare/v1.7.9...v1.7.10) --- updated-dependencies: - dependency-name: github.com/yuin/goldmark dependency-version: 1.7.10 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 7ac1780d5..66263ef1f 100644 --- a/go.mod +++ b/go.mod @@ -69,7 +69,7 @@ require ( github.com/tdewolff/minify/v2 v2.20.37 github.com/tdewolff/parse/v2 v2.7.15 github.com/tetratelabs/wazero v1.9.0 - github.com/yuin/goldmark v1.7.9 + github.com/yuin/goldmark v1.7.10 github.com/yuin/goldmark-emoji v1.0.5 go.uber.org/automaxprocs v1.5.3 gocloud.dev v0.40.0 diff --git a/go.sum b/go.sum index 234dc465f..3c4bdabcf 100644 --- a/go.sum +++ b/go.sum @@ -467,8 +467,8 @@ github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9dec github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yuin/goldmark v1.7.1/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= -github.com/yuin/goldmark v1.7.9 h1:rVSeT+f7/lAM+bJHVm5YHGwNrnd40i1Ch2DEocEjHQ0= -github.com/yuin/goldmark v1.7.9/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= +github.com/yuin/goldmark v1.7.10 h1:S+LrtBjRmqMac2UdtB6yyCEJm+UILZ2fefI4p7o0QpI= +github.com/yuin/goldmark v1.7.10/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= github.com/yuin/goldmark-emoji v1.0.5 h1:EMVWyCGPlXJfUXBXpuMu+ii3TIaxbVBnEX9uaDC4cIk= github.com/yuin/goldmark-emoji v1.0.5/go.mod h1:tTkZEbwu5wkPmgTcitqddVxY9osFZiavD+r4AzQrh1U= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= From 1408c156d858bcc025533b8e168d180e32eee963 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Sun, 20 Apr 2025 18:20:17 +0200 Subject: [PATCH 028/129] tpl: Detect and fail on infinite template recursion Fixes #13627 --- config/allconfig/load.go | 2 +- hugolib/page__content.go | 2 +- tpl/partials/partials.go | 65 ++++++++++--------- tpl/partials/partials_integration_test.go | 7 +- tpl/template.go | 1 + tpl/tplimpl/templatestore.go | 13 +++- tpl/tplimpl/templatestore_integration_test.go | 16 +++++ 7 files changed, 68 insertions(+), 38 deletions(-) diff --git a/config/allconfig/load.go b/config/allconfig/load.go index f224009ac..9289cf294 100644 --- a/config/allconfig/load.go +++ b/config/allconfig/load.go @@ -213,7 +213,7 @@ func (l configLoader) applyDefaultConfig() error { "disableAliases": false, "debug": false, "disableFastRender": false, - "timeout": "30s", + "timeout": "60s", "timeZone": "", "enableInlineShortcodes": false, } diff --git a/hugolib/page__content.go b/hugolib/page__content.go index 5f7d6f930..20abb7884 100644 --- a/hugolib/page__content.go +++ b/hugolib/page__content.go @@ -850,7 +850,7 @@ func (c *cachedContentScope) contentPlain(ctx context.Context) (contentPlainPlai }) if err != nil { if herrors.IsTimeoutError(err) { - err = fmt.Errorf("timed out rendering the page content. You may have a circular loop in a shortcode, or your site may have resources that take longer to build than the `timeout` limit in your Hugo config file: %w", err) + err = fmt.Errorf("timed out rendering the page content. Extend the `timeout` limit in your Hugo config file: %w", err) } return contentPlainPlainWords{}, err } diff --git a/tpl/partials/partials.go b/tpl/partials/partials.go index b9ef4b244..19882e36a 100644 --- a/tpl/partials/partials.go +++ b/tpl/partials/partials.go @@ -24,13 +24,13 @@ import ( "time" "github.com/bep/lazycache" - "github.com/gohugoio/hugo/common/constants" "github.com/gohugoio/hugo/common/hashing" "github.com/gohugoio/hugo/identity" + texttemplate "github.com/gohugoio/hugo/tpl/internal/go_templates/texttemplate" "github.com/gohugoio/hugo/tpl" - texttemplate "github.com/gohugoio/hugo/tpl/internal/go_templates/texttemplate" + "github.com/gohugoio/hugo/tpl/tplimpl" bp "github.com/gohugoio/hugo/bufferpool" "github.com/gohugoio/hugo/deps" @@ -109,7 +109,7 @@ func (c *contextWrapper) Set(in any) string { // A string if the partial is a text/template, or template.HTML when html/template. // Note that ctx is provided by Hugo, not the end user. func (ns *Namespace) Include(ctx context.Context, name string, contextList ...any) (any, error) { - res := ns.includWithTimeout(ctx, name, contextList...) + res := ns.include(ctx, name, contextList...) if res.err != nil { return nil, res.err } @@ -121,49 +121,36 @@ func (ns *Namespace) Include(ctx context.Context, name string, contextList ...an return res.result, nil } -func (ns *Namespace) includWithTimeout(ctx context.Context, name string, dataList ...any) includeResult { +func (ns *Namespace) include(ctx context.Context, name string, dataList ...any) includeResult { + v, err := ns.lookup(name) + if err != nil { + return includeResult{err: err} + } + return ns.doInclude(ctx, v, dataList...) +} + +func (ns *Namespace) lookup(name string) (*tplimpl.TemplInfo, error) { if strings.HasPrefix(name, "partials/") { // This is most likely not what the user intended. // This worked before Hugo 0.146.0. ns.deps.Log.Warnidf(constants.WarnPartialSuperfluousPrefix, "Partial name %q starting with 'partials/' (as in {{ partial \"%s\"}}) is most likely not what you want. Before 0.146.0 we did a double lookup in this situation.", name, name) } - // Create a new context with a timeout not connected to the incoming context. - timeoutCtx, cancel := context.WithTimeout(context.Background(), ns.deps.Conf.Timeout()) - defer cancel() - - res := make(chan includeResult, 1) - - go func() { - res <- ns.include(ctx, name, dataList...) - }() - - select { - case r := <-res: - return r - case <-timeoutCtx.Done(): - err := timeoutCtx.Err() - if err == context.DeadlineExceeded { - //lint:ignore ST1005 end user message. - err = fmt.Errorf("partial %q timed out after %s. This is most likely due to infinite recursion. If this is just a slow template, you can try to increase the 'timeout' config setting.", name, ns.deps.Conf.Timeout()) - } - return includeResult{err: err} + v := ns.deps.TemplateStore.LookupPartial(name) + if v == nil { + return nil, fmt.Errorf("partial %q not found", name) } + return v, nil } // include is a helper function that lookups and executes the named partial. // Returns the final template name and the rendered output. -func (ns *Namespace) include(ctx context.Context, name string, dataList ...any) includeResult { +func (ns *Namespace) doInclude(ctx context.Context, templ *tplimpl.TemplInfo, dataList ...any) includeResult { var data any if len(dataList) > 0 { data = dataList[0] } - v := ns.deps.TemplateStore.LookupPartial(name) - if v == nil { - return includeResult{err: fmt.Errorf("partial %q not found", name)} - } - templ := v - info := v.ParseInfo + info := templ.ParseInfo var w io.Writer @@ -212,6 +199,20 @@ func (ns *Namespace) IncludeCached(ctx context.Context, name string, context any Variants: variants, } depsManagerIn := tpl.Context.GetDependencyManagerInCurrentScope(ctx) + ti, err := ns.lookup(name) + if err != nil { + return nil, err + } + + if parent := tpl.Context.CurrentTemplate.Get(ctx); parent != nil { + for parent != nil { + if parent.CurrentTemplateInfoOps == ti { + // This will deadlock if we continue. + return nil, fmt.Errorf("circular call stack detected in partial %q", ti.Filename()) + } + parent = parent.Parent + } + } r, found, err := ns.cachedPartials.cache.GetOrCreate(key.Key(), func(string) (includeResult, error) { var depsManagerShared identity.Manager @@ -221,7 +222,7 @@ func (ns *Namespace) IncludeCached(ctx context.Context, name string, context any depsManagerShared = identity.NewManager("partials") ctx = tpl.Context.DependencyManagerScopedProvider.Set(ctx, depsManagerShared.(identity.DependencyManagerScopedProvider)) } - r := ns.includWithTimeout(ctx, key.Name, context) + r := ns.doInclude(ctx, ti, context) if ns.deps.Conf.Watching() { r.mangager = depsManagerShared } diff --git a/tpl/partials/partials_integration_test.go b/tpl/partials/partials_integration_test.go index 6fab3abd8..0fa47104d 100644 --- a/tpl/partials/partials_integration_test.go +++ b/tpl/partials/partials_integration_test.go @@ -256,7 +256,6 @@ func TestIncludeTimeout(t *testing.T) { files := ` -- config.toml -- baseURL = 'http://example.com/' -timeout = '200ms' -- layouts/index.html -- {{ partials.Include "foo.html" . }} -- layouts/partials/foo.html -- @@ -271,7 +270,7 @@ timeout = '200ms' ).BuildE() b.Assert(err, qt.Not(qt.IsNil)) - b.Assert(err.Error(), qt.Contains, "timed out") + b.Assert(err.Error(), qt.Contains, "maximum template call stack size exceeded") } func TestIncludeCachedTimeout(t *testing.T) { @@ -284,6 +283,8 @@ timeout = '200ms' -- layouts/index.html -- {{ partials.IncludeCached "foo.html" . }} -- layouts/partials/foo.html -- +{{ partialCached "bar.html" . }} +-- layouts/partials/bar.html -- {{ partialCached "foo.html" . }} ` @@ -295,7 +296,7 @@ timeout = '200ms' ).BuildE() b.Assert(err, qt.Not(qt.IsNil)) - b.Assert(err.Error(), qt.Contains, "timed out") + b.Assert(err.Error(), qt.Contains, `error calling partialCached: circular call stack detected in partial`) } // See Issue #10789 diff --git a/tpl/template.go b/tpl/template.go index f69ae2210..877422123 100644 --- a/tpl/template.go +++ b/tpl/template.go @@ -160,6 +160,7 @@ type CurrentTemplateInfoCommonOps interface { // CurrentTemplateInfo as returned in templates.Current. type CurrentTemplateInfo struct { Parent *CurrentTemplateInfo + Level int CurrentTemplateInfoOps } diff --git a/tpl/tplimpl/templatestore.go b/tpl/tplimpl/templatestore.go index 4266e274a..7770d053b 100644 --- a/tpl/tplimpl/templatestore.go +++ b/tpl/tplimpl/templatestore.go @@ -484,13 +484,24 @@ func (t *TemplateStore) ExecuteWithContext(ctx context.Context, ti *TemplInfo, w templ := ti.Template + parent := tpl.Context.CurrentTemplate.Get(ctx) + var level int + if parent != nil { + level = parent.Level + 1 + } currentTi := &tpl.CurrentTemplateInfo{ - Parent: tpl.Context.CurrentTemplate.Get(ctx), + Parent: parent, + Level: level, CurrentTemplateInfoOps: ti, } ctx = tpl.Context.CurrentTemplate.Set(ctx, currentTi) + const levelThreshold = 999 + if level > levelThreshold { + return fmt.Errorf("maximum template call stack size exceeded in %q", ti.Filename()) + } + if t.opts.Metrics != nil { defer t.opts.Metrics.MeasureSince(templ.Name(), time.Now()) } diff --git a/tpl/tplimpl/templatestore_integration_test.go b/tpl/tplimpl/templatestore_integration_test.go index e59dad33a..375813c31 100644 --- a/tpl/tplimpl/templatestore_integration_test.go +++ b/tpl/tplimpl/templatestore_integration_test.go @@ -1229,3 +1229,19 @@ layouts/list.html b.AssertFileContent("public/p1/index.html", "layouts/single.html") } } + +func TestTemplateLoop(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +-- layouts/_partials/p.html -- +p: {{ partial "p.html" . }} +-- layouts/all.html -- +{{ partial "p.html" . }} + +` + b, err := hugolib.TestE(t, files) + b.Assert(err, qt.IsNotNil) + b.Assert(err.Error(), qt.Contains, "error calling partial: maximum template call stack size exceeded") +} From 5e62cc6fce1b1b43a0c2dc585d52c2e156753372 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Mon, 21 Apr 2025 11:28:33 +0200 Subject: [PATCH 029/129] tpl: Fix layout fall back logic when layout is set in front matter but not found Fixes #13630 --- tpl/tplimpl/templatedescriptor.go | 6 +---- tpl/tplimpl/templatestore_integration_test.go | 25 +++++++++++++++++++ 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/tpl/tplimpl/templatedescriptor.go b/tpl/tplimpl/templatedescriptor.go index ca73c9f78..8b50605ac 100644 --- a/tpl/tplimpl/templatedescriptor.go +++ b/tpl/tplimpl/templatedescriptor.go @@ -94,14 +94,10 @@ func (this TemplateDescriptor) doCompare(category Category, isEmbedded bool, oth } if other.LayoutFromTemplate != "" && other.LayoutFromTemplate != layoutAll { - if this.LayoutFromUser == "" { + if this.LayoutFromUser == "" || this.LayoutFromUser != other.LayoutFromTemplate { if other.LayoutFromTemplate != this.LayoutFromTemplate { return w } - } else if isLayoutStandard(this.LayoutFromUser) { - if other.LayoutFromTemplate != this.LayoutFromUser { - return w - } } } diff --git a/tpl/tplimpl/templatestore_integration_test.go b/tpl/tplimpl/templatestore_integration_test.go index 375813c31..51b28754f 100644 --- a/tpl/tplimpl/templatestore_integration_test.go +++ b/tpl/tplimpl/templatestore_integration_test.go @@ -1245,3 +1245,28 @@ p: {{ partial "p.html" . }} b.Assert(err, qt.IsNotNil) b.Assert(err.Error(), qt.Contains, "error calling partial: maximum template call stack size exceeded") } + +func TestIssue13630(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +disableKinds = ['rss','sitemap'] +-- content/p1.md -- +--- +title: p1 +layout: foo +--- +-- layouts/list.html -- +layouts/list.html +-- layouts/taxononmy.html.html -- +layouts/taxononmy.html.html +` + + var b *hugolib.IntegrationTestBuilder + + for range 3 { + b = hugolib.Test(t, files) + b.AssertFileExists("public/p1/index.html", false) + } +} From 4eb0e4286a69678d56c0044c5fbb43193f5449c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Mon, 21 Apr 2025 11:53:38 +0200 Subject: [PATCH 030/129] tpl/collections: Fix where ... not in with empty slice Fixes #13621 --- .../collections_integration_test.go | 20 +++++++++++++++++++ tpl/collections/where.go | 3 +++ tpl/collections/where_test.go | 1 + 3 files changed, 24 insertions(+) diff --git a/tpl/collections/collections_integration_test.go b/tpl/collections/collections_integration_test.go index cc60770f9..b60aaea87 100644 --- a/tpl/collections/collections_integration_test.go +++ b/tpl/collections/collections_integration_test.go @@ -278,3 +278,23 @@ disableKinds = ['rss','sitemap', 'taxonomy', 'term', 'page'] b.AssertFileContentExact("public/index.html", "0: /a3_b1.html\n\n1: /b2.html\n\n2: /a1.html\n\n3: /a2.html\n$") } + +// Issue 13621. +func TestWhereNotInEmptySlice(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +-- layouts/home.html -- +{{- $pages := where site.RegularPages "Kind" "not in" (slice) -}} +Len: {{ $pages | len }}| +-- layouts/all.html -- +All|{{ .Title }}| +-- content/p1.md -- + +` + + b := hugolib.Test(t, files) + + b.AssertFileContent("public/index.html", "Len: 1|") +} diff --git a/tpl/collections/where.go b/tpl/collections/where.go index b15cfe781..ee49d0bbb 100644 --- a/tpl/collections/where.go +++ b/tpl/collections/where.go @@ -138,6 +138,9 @@ func (ns *Namespace) checkCondition(v, mv reflect.Value, op string) (bool, error } if mv.Len() == 0 { + if op == "not in" { + return true, nil + } return false, nil } diff --git a/tpl/collections/where_test.go b/tpl/collections/where_test.go index 60f97e607..ecf748f93 100644 --- a/tpl/collections/where_test.go +++ b/tpl/collections/where_test.go @@ -761,6 +761,7 @@ func TestCheckCondition(t *testing.T) { expect{true, false}, }, {reflect.ValueOf(123), reflect.ValueOf([]int{45, 678}), "not in", expect{true, false}}, + {reflect.ValueOf(123), reflect.ValueOf([]int{}), "not in", expect{true, false}}, {reflect.ValueOf("foo"), reflect.ValueOf([]string{"bar", "baz"}), "not in", expect{true, false}}, { reflect.ValueOf(time.Date(2015, time.May, 26, 19, 18, 56, 12345, time.UTC)), From 9c65b9e88ddbabbb6b397bd313063d6ffbd0223c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Apr 2025 09:29:46 +0000 Subject: [PATCH 031/129] build(deps): bump github.com/bep/imagemeta from 0.11.0 to 0.12.0 Bumps [github.com/bep/imagemeta](https://github.com/bep/imagemeta) from 0.11.0 to 0.12.0. - [Release notes](https://github.com/bep/imagemeta/releases) - [Commits](https://github.com/bep/imagemeta/compare/v0.11.0...v0.12.0) --- updated-dependencies: - dependency-name: github.com/bep/imagemeta dependency-version: 0.12.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 66263ef1f..346a79f18 100644 --- a/go.mod +++ b/go.mod @@ -15,7 +15,7 @@ require ( github.com/bep/goportabletext v0.1.0 github.com/bep/gowebp v0.3.0 github.com/bep/helpers v0.5.0 - github.com/bep/imagemeta v0.11.0 + github.com/bep/imagemeta v0.12.0 github.com/bep/lazycache v0.8.0 github.com/bep/logg v0.4.0 github.com/bep/mclib v1.20400.20402 diff --git a/go.sum b/go.sum index 3c4bdabcf..10bad9333 100644 --- a/go.sum +++ b/go.sum @@ -139,8 +139,8 @@ github.com/bep/gowebp v0.3.0 h1:MhmMrcf88pUY7/PsEhMgEP0T6fDUnRTMpN8OclDrbrY= github.com/bep/gowebp v0.3.0/go.mod h1:ZhFodwdiFp8ehGJpF4LdPl6unxZm9lLFjxD3z2h2AgI= github.com/bep/helpers v0.5.0 h1:rneezhnG7GzLFlsEWO/EnleaBRuluBDGFimalO6Y50o= github.com/bep/helpers v0.5.0/go.mod h1:dSqCzIvHbzsk5YOesp1M7sKAq5xUcvANsRoKdawxH4Q= -github.com/bep/imagemeta v0.11.0 h1:jL92HhL1H70NC+f8OVVn5D/nC3FmdxTnM3R+csj54mE= -github.com/bep/imagemeta v0.11.0/go.mod h1:23AF6O+4fUi9avjiydpKLStUNtJr5hJB4rarG18JpN8= +github.com/bep/imagemeta v0.12.0 h1:ARf+igs5B7pf079LrqRnwzQ/wEB8Q9v4NSDRZO1/F5k= +github.com/bep/imagemeta v0.12.0/go.mod h1:23AF6O+4fUi9avjiydpKLStUNtJr5hJB4rarG18JpN8= github.com/bep/lazycache v0.8.0 h1:lE5frnRjxaOFbkPZ1YL6nijzOPPz6zeXasJq8WpG4L8= github.com/bep/lazycache v0.8.0/go.mod h1:BQ5WZepss7Ko91CGdWz8GQZi/fFnCcyWupv8gyTeKwk= github.com/bep/logg v0.4.0 h1:luAo5mO4ZkhA5M1iDVDqDqnBBnlHjmtZF6VAyTp+nCQ= From ad787614e87efa21b8e26a43b524cb55af3864f2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Apr 2025 09:58:00 +0000 Subject: [PATCH 032/129] build(deps): bump github.com/yuin/goldmark-emoji from 1.0.5 to 1.0.6 Bumps [github.com/yuin/goldmark-emoji](https://github.com/yuin/goldmark-emoji) from 1.0.5 to 1.0.6. - [Release notes](https://github.com/yuin/goldmark-emoji/releases) - [Commits](https://github.com/yuin/goldmark-emoji/compare/v1.0.5...v1.0.6) --- updated-dependencies: - dependency-name: github.com/yuin/goldmark-emoji dependency-version: 1.0.6 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 346a79f18..5724b45b8 100644 --- a/go.mod +++ b/go.mod @@ -70,7 +70,7 @@ require ( github.com/tdewolff/parse/v2 v2.7.15 github.com/tetratelabs/wazero v1.9.0 github.com/yuin/goldmark v1.7.10 - github.com/yuin/goldmark-emoji v1.0.5 + github.com/yuin/goldmark-emoji v1.0.6 go.uber.org/automaxprocs v1.5.3 gocloud.dev v0.40.0 golang.org/x/exp v0.0.0-20221031165847-c99f073a8326 diff --git a/go.sum b/go.sum index 10bad9333..6f0e05092 100644 --- a/go.sum +++ b/go.sum @@ -466,11 +466,10 @@ github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/yuin/goldmark v1.7.1/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= github.com/yuin/goldmark v1.7.10 h1:S+LrtBjRmqMac2UdtB6yyCEJm+UILZ2fefI4p7o0QpI= github.com/yuin/goldmark v1.7.10/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= -github.com/yuin/goldmark-emoji v1.0.5 h1:EMVWyCGPlXJfUXBXpuMu+ii3TIaxbVBnEX9uaDC4cIk= -github.com/yuin/goldmark-emoji v1.0.5/go.mod h1:tTkZEbwu5wkPmgTcitqddVxY9osFZiavD+r4AzQrh1U= +github.com/yuin/goldmark-emoji v1.0.6 h1:QWfF2FYaXwL74tfGOW5izeiZepUDroDJfWubQI9HTHs= +github.com/yuin/goldmark-emoji v1.0.6/go.mod h1:ukxJDKFpdFb5x0a5HqbdlcKtebh086iJpI31LTKmWuA= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= From db72a1f075275dfa16a124acac9fc9e74a633637 Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Mon, 21 Apr 2025 10:33:20 -0700 Subject: [PATCH 033/129] parser/metadecoders: Add CSV targetType (map or slice) option to transform.Unmarshal Closes #8859 --- parser/metadecoders/decoder.go | 59 ++++++++-- tpl/transform/transform_integration_test.go | 116 ++++++++++++++++++++ 2 files changed, 166 insertions(+), 9 deletions(-) diff --git a/parser/metadecoders/decoder.go b/parser/metadecoders/decoder.go index 1655ea513..419fbf4d2 100644 --- a/parser/metadecoders/decoder.go +++ b/parser/metadecoders/decoder.go @@ -36,16 +36,22 @@ import ( // Decoder provides some configuration options for the decoders. type Decoder struct { - // Delimiter is the field delimiter used in the CSV decoder. It defaults to ','. + // Delimiter is the field delimiter. Used in the CSV decoder. Default is + // ','. Delimiter rune - // Comment, if not 0, is the comment character used in the CSV decoder. Lines beginning with the - // Comment character without preceding whitespace are ignored. + // Comment, if not 0, is the comment character. Lines beginning with the + // Comment character without preceding whitespace are ignored. Used in the + // CSV decoder. Comment rune // If true, a quote may appear in an unquoted field and a non-doubled quote - // may appear in a quoted field. It defaults to false. + // may appear in a quoted field. Used in the CSV decoder. Default is false. LazyQuotes bool + + // The target data type, either slice or map. Used in the CSV decoder. + // Default is slice. + TargetType string } // OptionsKey is used in cache keys. @@ -54,12 +60,14 @@ func (d Decoder) OptionsKey() string { sb.WriteRune(d.Delimiter) sb.WriteRune(d.Comment) sb.WriteString(strconv.FormatBool(d.LazyQuotes)) + sb.WriteString(d.TargetType) return sb.String() } // Default is a Decoder in its default configuration. var Default = Decoder{ - Delimiter: ',', + Delimiter: ',', + TargetType: "slice", } // UnmarshalToMap will unmarshall data in format f into a new map. This is @@ -122,7 +130,14 @@ func (d Decoder) Unmarshal(data []byte, f Format) (any, error) { if len(data) == 0 { switch f { case CSV: - return make([][]string, 0), nil + switch d.TargetType { + case "map": + return make(map[string]any), nil + case "slice": + return make([][]string, 0), nil + default: + return nil, fmt.Errorf("invalid targetType: expected either slice or map, received %s", d.TargetType) + } default: return make(map[string]any), nil } @@ -232,10 +247,36 @@ func (d Decoder) unmarshalCSV(data []byte, v any) error { switch vv := v.(type) { case *any: - *vv = records - default: - return fmt.Errorf("CSV cannot be unmarshaled into %T", v) + switch d.TargetType { + case "map": + if len(records) < 2 { + return fmt.Errorf("cannot unmarshal CSV into %T: expected at least a header row and one data row", v) + } + seen := make(map[string]bool, len(records[0])) + for _, fieldName := range records[0] { + if seen[fieldName] { + return fmt.Errorf("cannot unmarshal CSV into %T: header row contains duplicate field names", v) + } + seen[fieldName] = true + } + + sm := make([]map[string]string, len(records)-1) + for i, record := range records[1:] { + m := make(map[string]string, len(records[0])) + for j, col := range record { + m[records[0][j]] = col + } + sm[i] = m + } + *vv = sm + case "slice": + *vv = records + default: + return fmt.Errorf("cannot unmarshal CSV into %T: invalid targetType: expected either slice or map, received %s", v, d.TargetType) + } + default: + return fmt.Errorf("cannot unmarshal CSV into %T", v) } return nil diff --git a/tpl/transform/transform_integration_test.go b/tpl/transform/transform_integration_test.go index ceb80309b..2b3c7d40e 100644 --- a/tpl/transform/transform_integration_test.go +++ b/tpl/transform/transform_integration_test.go @@ -379,3 +379,119 @@ Markdown: {{ $markdown }}| b.AssertFileContent("public/index.html", "Markdown: ## Heading 2\n|") } + +func TestUnmarshalCSV(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +disableKinds = ['page','rss','section','sitemap','taxonomy','term'] +-- layouts/all.html -- +{{ $opts := OPTS }} +{{ with resources.Get "pets.csv" | transform.Unmarshal $opts }} + {{ jsonify . }} +{{ end }} +-- assets/pets.csv -- +DATA +` + + // targetType = map + f := strings.ReplaceAll(files, "OPTS", `dict "targetType" "map"`) + f = strings.ReplaceAll(f, "DATA", + "name,type,breed,age\nSpot,dog,Collie,3\nFelix,cat,Malicious,7", + ) + b := hugolib.Test(t, f) + b.AssertFileContent("public/index.html", + `[{"age":"3","breed":"Collie","name":"Spot","type":"dog"},{"age":"7","breed":"Malicious","name":"Felix","type":"cat"}]`, + ) + + // targetType = map (no data) + f = strings.ReplaceAll(files, "OPTS", `dict "targetType" "map"`) + f = strings.ReplaceAll(f, "DATA", "") + b = hugolib.Test(t, f) + b.AssertFileContent("public/index.html", "") + + // targetType = slice + f = strings.ReplaceAll(files, "OPTS", `dict "targetType" "slice"`) + f = strings.ReplaceAll(f, "DATA", + "name,type,breed,age\nSpot,dog,Collie,3\nFelix,cat,Malicious,7", + ) + b = hugolib.Test(t, f) + b.AssertFileContent("public/index.html", + `[["name","type","breed","age"],["Spot","dog","Collie","3"],["Felix","cat","Malicious","7"]]`, + ) + + // targetType = slice (no data) + f = strings.ReplaceAll(files, "OPTS", `dict "targetType" "slice"`) + f = strings.ReplaceAll(f, "DATA", "") + b = hugolib.Test(t, f) + b.AssertFileContent("public/index.html", "") + + // targetType not specified + f = strings.ReplaceAll(files, "OPTS", "dict") + f = strings.ReplaceAll(f, "DATA", + "name,type,breed,age\nSpot,dog,Collie,3\nFelix,cat,Malicious,7", + ) + b = hugolib.Test(t, f) + b.AssertFileContent("public/index.html", + `[["name","type","breed","age"],["Spot","dog","Collie","3"],["Felix","cat","Malicious","7"]]`, + ) + + // targetType not specified (no data) + f = strings.ReplaceAll(files, "OPTS", "dict") + f = strings.ReplaceAll(f, "DATA", "") + b = hugolib.Test(t, f) + b.AssertFileContent("public/index.html", "") + + // targetType = foo + f = strings.ReplaceAll(files, "OPTS", `dict "targetType" "foo"`) + _, err := hugolib.TestE(t, f) + if err == nil { + t.Errorf("expected error") + } else { + if !strings.Contains(err.Error(), `invalid targetType: expected either slice or map, received foo`) { + t.Log(err.Error()) + t.Errorf("error message does not match expected error message") + } + } + + // targetType = foo (no data) + f = strings.ReplaceAll(files, "OPTS", `dict "targetType" "foo"`) + f = strings.ReplaceAll(f, "DATA", "") + _, err = hugolib.TestE(t, f) + if err == nil { + t.Errorf("expected error") + } else { + if !strings.Contains(err.Error(), `invalid targetType: expected either slice or map, received foo`) { + t.Log(err.Error()) + t.Errorf("error message does not match expected error message") + } + } + + // targetType = map (error: expected at least a header row and one data row) + f = strings.ReplaceAll(files, "OPTS", `dict "targetType" "map"`) + _, err = hugolib.TestE(t, f) + if err == nil { + t.Errorf("expected error") + } else { + if !strings.Contains(err.Error(), `expected at least a header row and one data row`) { + t.Log(err.Error()) + t.Errorf("error message does not match expected error message") + } + } + + // targetType = map (error: header row contains duplicate field names) + f = strings.ReplaceAll(files, "OPTS", `dict "targetType" "map"`) + f = strings.ReplaceAll(f, "DATA", + "name,name,breed,age\nSpot,dog,Collie,3\nFelix,cat,Malicious,7", + ) + _, err = hugolib.TestE(t, f) + if err == nil { + t.Errorf("expected error") + } else { + if !strings.Contains(err.Error(), `header row contains duplicate field names`) { + t.Log(err.Error()) + t.Errorf("error message does not match expected error message") + } + } +} From 6d69dc88a46a002eda3f5b56ac73d29c6b9d0bc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Mon, 21 Apr 2025 18:02:50 +0200 Subject: [PATCH 034/129] tpl: Fix indeterminate template lookup with templates with and without lang Close #13636 --- hugolib/alias.go | 1 + hugolib/sitemap_test.go | 2 +- tpl/tplimpl/templatedescriptor.go | 29 +++--- tpl/tplimpl/templatestore.go | 8 +- tpl/tplimpl/templatestore_integration_test.go | 97 +++++++++++++++++++ 5 files changed, 120 insertions(+), 17 deletions(-) diff --git a/hugolib/alias.go b/hugolib/alias.go index 0bb3165c7..7b252c613 100644 --- a/hugolib/alias.go +++ b/hugolib/alias.go @@ -56,6 +56,7 @@ func (a aliasHandler) renderAlias(permalink string, p page.Page) (io.Reader, err templateDesc.LayoutFromUser = "" templateDesc.Kind = "" templateDesc.OutputFormat = output.AliasHTMLFormat.Name + templateDesc.MediaType = output.AliasHTMLFormat.MediaType.Type q := tplimpl.TemplateQuery{ Path: base, diff --git a/hugolib/sitemap_test.go b/hugolib/sitemap_test.go index 1c2642468..922ecbc12 100644 --- a/hugolib/sitemap_test.go +++ b/hugolib/sitemap_test.go @@ -139,7 +139,7 @@ weight = 1 languageName = "English" [languages.nn] weight = 2 --- layouts/_default/list.xml -- +-- layouts/list.xml -- Site: {{ .Site.Title }}| -- layouts/home -- Home. diff --git a/tpl/tplimpl/templatedescriptor.go b/tpl/tplimpl/templatedescriptor.go index 8b50605ac..f65ad3943 100644 --- a/tpl/tplimpl/templatedescriptor.go +++ b/tpl/tplimpl/templatedescriptor.go @@ -64,7 +64,7 @@ func (s descriptorHandler) compareDescriptors(category Category, isEmbedded bool return weightNoMatch } - w := this.doCompare(category, isEmbedded, other) + w := this.doCompare(category, isEmbedded, s.opts.DefaultContentLanguage, other) if w.w1 <= 0 { if category == CategoryMarkup && (this.Variant1 == other.Variant1) && (this.Variant2 == other.Variant2 || this.Variant2 != "" && other.Variant2 == "") { @@ -82,7 +82,7 @@ func (s descriptorHandler) compareDescriptors(category Category, isEmbedded bool } //lint:ignore ST1006 this vs other makes it easier to reason about. -func (this TemplateDescriptor) doCompare(category Category, isEmbedded bool, other TemplateDescriptor) weight { +func (this TemplateDescriptor) doCompare(category Category, isEmbedded bool, defaultContentLanguage string, other TemplateDescriptor) weight { w := weightNoMatch // HTML in plain text is OK, but not the other way around. @@ -124,6 +124,10 @@ func (this TemplateDescriptor) doCompare(category Category, isEmbedded bool, oth // Continue. } + if other.MediaType != this.MediaType { + return w + } + // One example of variant1 and 2 is for render codeblocks: // variant1=codeblock, variant2=go (language). if other.Variant1 != "" && other.Variant1 != this.Variant1 { @@ -142,14 +146,15 @@ func (this TemplateDescriptor) doCompare(category Category, isEmbedded bool, oth } const ( - weightKind = 3 // page, home, section, taxonomy, term (and only those) - weightcustomLayout = 4 // custom layout (mylayout, set in e.g. front matter) - weightLayoutStandard = 2 // standard layouts (single,list,all) - weightOutputFormat = 2 // a configured output format (e.g. rss, html, json) + weightKind = 5 // page, home, section, taxonomy, term (and only those) + weightcustomLayout = 6 // custom layout (mylayout, set in e.g. front matter) + weightLayoutStandard = 4 // standard layouts (single,list) + weightLayoutAll = 2 // the "all" layout + weightOutputFormat = 4 // a configured output format (e.g. rss, html, json) weightMediaType = 1 // a configured media type (e.g. text/html, text/plain) weightLang = 1 // a configured language (e.g. en, nn, fr, ...) - weightVariant1 = 4 // currently used for render hooks, e.g. "link", "image" - weightVariant2 = 2 // currently used for render hooks, e.g. the language "go" in code blocks. + weightVariant1 = 6 // currently used for render hooks, e.g. "link", "image" + weightVariant2 = 4 // currently used for render hooks, e.g. the language "go" in code blocks. // We will use the values for group 2 and 3 // if the distance up to the template is shorter than @@ -173,10 +178,12 @@ func (this TemplateDescriptor) doCompare(category Category, isEmbedded bool, oth w.w2 = weight2Group1 } - if other.LayoutFromTemplate != "" && (other.LayoutFromTemplate == this.LayoutFromTemplate || other.LayoutFromTemplate == layoutAll) { + if other.LayoutFromTemplate != "" && (other.LayoutFromTemplate == this.LayoutFromTemplate) { w.w1 += weightLayoutStandard w.w2 = weight2Group1 - + } else if other.LayoutFromTemplate == layoutAll { + w.w1 += weightLayoutAll + w.w2 = weight2Group1 } // LayoutCustom is only set in this (usually from Page.Layout). @@ -185,7 +192,7 @@ func (this TemplateDescriptor) doCompare(category Category, isEmbedded bool, oth w.w2 = weight2Group2 } - if other.Lang != "" && other.Lang == this.Lang { + if (other.Lang != "" && other.Lang == this.Lang) || (other.Lang == "" && this.Lang == defaultContentLanguage) { w.w1 += weightLang w.w3 += weight3 } diff --git a/tpl/tplimpl/templatestore.go b/tpl/tplimpl/templatestore.go index 7770d053b..5be65f874 100644 --- a/tpl/tplimpl/templatestore.go +++ b/tpl/tplimpl/templatestore.go @@ -1842,7 +1842,9 @@ func (best *bestMatch) isBetter(w weight, ti *TemplInfo) bool { // Anything is better than nothing. return true } + if w.w1 <= 0 { + if best.w.w1 <= 0 { return ti.PathInfo.Path() < best.templ.PathInfo.Path() } @@ -1885,11 +1887,7 @@ func (best *bestMatch) isBetter(w weight, ti *TemplInfo) bool { return true } - if ti.D.LayoutFromTemplate != "" && best.desc.LayoutFromTemplate != "" { - return ti.D.LayoutFromTemplate != layoutAll - } - - return w.distance < best.w.distance || ti.PathInfo.Path() < best.templ.PathInfo.Path() + return ti.PathInfo.Path() < best.templ.PathInfo.Path() } return true diff --git a/tpl/tplimpl/templatestore_integration_test.go b/tpl/tplimpl/templatestore_integration_test.go index 51b28754f..06cb00212 100644 --- a/tpl/tplimpl/templatestore_integration_test.go +++ b/tpl/tplimpl/templatestore_integration_test.go @@ -3,6 +3,7 @@ package tplimpl_test import ( "context" "io" + "strings" "testing" qt "github.com/frankban/quicktest" @@ -684,6 +685,102 @@ layout: mylayout b.AssertFileContent("public/en/foo/index.xml", "layouts/list.xml") } +func TestLookupOrderIssue13636(t *testing.T) { + t.Parallel() + + filesTemplate := ` +-- hugo.toml -- +defaultContentLanguage = "en" +defaultContentLanguageInSubdir = true +[languages] +[languages.en] +weight = 1 +[languages.nn] +weight = 2 +-- content/s1/p1.en.md -- +--- +outputs: ["html", "amp", "json"] +--- +-- content/s1/p1.nn.md -- +--- +outputs: ["html", "amp", "json"] +--- +-- layouts/L1 -- +L1 +-- layouts/L2 -- +L2 +-- layouts/L3 -- +L3 + +` + + tests := []struct { + Lang string + L1 string + L2 string + L3 string + ExpectHTML string + ExpectAmp string + ExpectJSON string + }{ + {"en", "all.en.html", "all.html", "single.html", "single.html", "single.html", ""}, + {"en", "all.amp.html", "all.html", "page.html", "page.html", "all.amp.html", ""}, + {"en", "all.amp.html", "all.html", "list.html", "all.html", "all.amp.html", ""}, + {"en", "all.en.html", "all.json", "single.html", "single.html", "single.html", "all.json"}, + {"en", "all.en.html", "single.json", "single.html", "single.html", "single.html", "single.json"}, + {"en", "all.en.html", "all.html", "list.html", "all.en.html", "all.en.html", ""}, + {"en", "list.en.html", "list.html", "list.en.html", "", "", ""}, + {"nn", "all.en.html", "all.html", "single.html", "single.html", "single.html", ""}, + {"nn", "all.en.html", "all.nn.html", "single.html", "single.html", "single.html", ""}, + {"nn", "all.en.html", "all.nn.html", "single.nn.html", "single.nn.html", "single.nn.html", ""}, + {"nn", "single.json", "single.nn.json", "all.json", "", "", "single.nn.json"}, + {"nn", "single.json", "single.en.json", "all.nn.json", "", "", "single.json"}, + } + + for i, test := range tests { + if i != 8 { + // continue + } + files := strings.ReplaceAll(filesTemplate, "L1", test.L1) + files = strings.ReplaceAll(files, "L2", test.L2) + files = strings.ReplaceAll(files, "L3", test.L3) + t.Logf("Test %d: %s %s %s %s", i, test.Lang, test.L1, test.L2, test.L3) + + for range 3 { + b := hugolib.Test(t, files) + b.Assert(len(b.H.Sites), qt.Equals, 2) + + var ( + pubhHTML = "public/LANG/s1/p1/index.html" + pubhAmp = "public/LANG/amp/s1/p1/index.html" + pubhJSON = "public/LANG/s1/p1/index.json" + ) + + pubhHTML = strings.ReplaceAll(pubhHTML, "LANG", test.Lang) + pubhAmp = strings.ReplaceAll(pubhAmp, "LANG", test.Lang) + pubhJSON = strings.ReplaceAll(pubhJSON, "LANG", test.Lang) + + if test.ExpectHTML != "" { + b.AssertFileContent(pubhHTML, test.ExpectHTML) + } else { + b.AssertFileExists(pubhHTML, false) + } + + if test.ExpectAmp != "" { + b.AssertFileContent(pubhAmp, test.ExpectAmp) + } else { + b.AssertFileExists(pubhAmp, false) + } + + if test.ExpectJSON != "" { + b.AssertFileContent(pubhJSON, test.ExpectJSON) + } else { + b.AssertFileExists(pubhJSON, false) + } + } + } +} + func TestLookupShortcodeDepth(t *testing.T) { t.Parallel() From 496730840e388d7187149503f6e6e4648a8f65c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Mon, 21 Apr 2025 16:15:21 +0200 Subject: [PATCH 035/129] Revert the breaking change from 0.146.0 with dots in content filenames Closes #13632 --- common/paths/pathparser.go | 96 ++++++++++++------- common/paths/pathparser_test.go | 93 +++++++++++++++--- common/paths/paths_integration_test.go | 23 +++++ hugolib/collections_test.go | 2 + hugolib/content_render_hooks_test.go | 2 - hugolib/site_test.go | 2 +- tpl/tplimpl/templatestore.go | 24 ++--- tpl/tplimpl/templatestore_integration_test.go | 2 +- 8 files changed, 175 insertions(+), 69 deletions(-) diff --git a/common/paths/pathparser.go b/common/paths/pathparser.go index c04f2022e..b0a2f9fc4 100644 --- a/common/paths/pathparser.go +++ b/common/paths/pathparser.go @@ -124,14 +124,15 @@ func (pp *PathParser) parseIdentifier(component, s string, p *Path, i, lastDot i if p.posContainerHigh != -1 { return } - mayHaveLang := pp.LanguageIndex != nil + mayHaveLang := p.posIdentifierLanguage == -1 && pp.LanguageIndex != nil mayHaveLang = mayHaveLang && (component == files.ComponentFolderContent || component == files.ComponentFolderLayouts) mayHaveOutputFormat := component == files.ComponentFolderLayouts - mayHaveKind := mayHaveOutputFormat + mayHaveKind := p.posIdentifierKind == -1 && mayHaveOutputFormat + mayHaveLayout := component == files.ComponentFolderLayouts var found bool var high int - if len(p.identifiers) > 0 { + if len(p.identifiersKnown) > 0 { high = lastDot } else { high = len(p.s) @@ -139,9 +140,9 @@ func (pp *PathParser) parseIdentifier(component, s string, p *Path, i, lastDot i id := types.LowHigh[string]{Low: i + 1, High: high} sid := p.s[id.Low:id.High] - if len(p.identifiers) == 0 { + if len(p.identifiersKnown) == 0 { // The first is always the extension. - p.identifiers = append(p.identifiers, id) + p.identifiersKnown = append(p.identifiersKnown, id) found = true // May also be the output format. @@ -164,8 +165,8 @@ func (pp *PathParser) parseIdentifier(component, s string, p *Path, i, lastDot i } found = langFound if langFound { - p.identifiers = append(p.identifiers, id) - p.posIdentifierLanguage = len(p.identifiers) - 1 + p.identifiersKnown = append(p.identifiersKnown, id) + p.posIdentifierLanguage = len(p.identifiersKnown) - 1 } } @@ -177,28 +178,33 @@ func (pp *PathParser) parseIdentifier(component, s string, p *Path, i, lastDot i // false positives on the form css.html. if pp.IsOutputFormat(sid, p.Ext()) { found = true - p.identifiers = append(p.identifiers, id) - p.posIdentifierOutputFormat = len(p.identifiers) - 1 + p.identifiersKnown = append(p.identifiersKnown, id) + p.posIdentifierOutputFormat = len(p.identifiersKnown) - 1 } } if !found && mayHaveKind { if kinds.GetKindMain(sid) != "" { found = true - p.identifiers = append(p.identifiers, id) - p.posIdentifierKind = len(p.identifiers) - 1 + p.identifiersKnown = append(p.identifiersKnown, id) + p.posIdentifierKind = len(p.identifiersKnown) - 1 } } if !found && sid == identifierBaseof { found = true - p.identifiers = append(p.identifiers, id) - p.posIdentifierBaseof = len(p.identifiers) - 1 + p.identifiersKnown = append(p.identifiersKnown, id) + p.posIdentifierBaseof = len(p.identifiersKnown) - 1 + } + + if !found && mayHaveLayout { + p.identifiersKnown = append(p.identifiersKnown, id) + p.posIdentifierLayout = len(p.identifiersKnown) - 1 + found = true } if !found { - p.identifiers = append(p.identifiers, id) - p.identifiersUnknown = append(p.identifiersUnknown, len(p.identifiers)-1) + p.identifiersUnknown = append(p.identifiersUnknown, id) } } @@ -252,13 +258,13 @@ func (pp *PathParser) doParse(component, s string, p *Path) (*Path, error) { } } - if len(p.identifiers) > 0 { + if len(p.identifiersKnown) > 0 { isContentComponent := p.component == files.ComponentFolderContent || p.component == files.ComponentFolderArchetypes isContent := isContentComponent && pp.IsContentExt(p.Ext()) - id := p.identifiers[len(p.identifiers)-1] + id := p.identifiersKnown[len(p.identifiersKnown)-1] - if id.High > p.posContainerHigh { - b := p.s[p.posContainerHigh:id.High] + if id.Low > p.posContainerHigh { + b := p.s[p.posContainerHigh : id.Low-1] if isContent { switch b { case "index": @@ -294,6 +300,16 @@ func (pp *PathParser) doParse(component, s string, p *Path) (*Path, error) { } } + if p.pathType == TypeShortcode && p.posIdentifierLayout != -1 { + // myshortcode or myshortcode.html, no layout. + if len(p.identifiersKnown) <= 2 { + p.posIdentifierLayout = -1 + } else { + // First is always the name. + p.posIdentifierLayout-- + } + } + return p, nil } @@ -350,13 +366,14 @@ type Path struct { component string pathType Type - identifiers []types.LowHigh[string] + identifiersKnown []types.LowHigh[string] + identifiersUnknown []types.LowHigh[string] posIdentifierLanguage int posIdentifierOutputFormat int posIdentifierKind int + posIdentifierLayout int posIdentifierBaseof int - identifiersUnknown []int disabled bool trimLeadingSlash bool @@ -388,10 +405,11 @@ func (p *Path) reset() { p.posSectionHigh = -1 p.component = "" p.pathType = 0 - p.identifiers = p.identifiers[:0] + p.identifiersKnown = p.identifiersKnown[:0] p.posIdentifierLanguage = -1 p.posIdentifierOutputFormat = -1 p.posIdentifierKind = -1 + p.posIdentifierLayout = -1 p.posIdentifierBaseof = -1 p.disabled = false p.trimLeadingSlash = false @@ -479,7 +497,7 @@ func (p *Path) Name() string { // Name returns the last element of path without any extension. func (p *Path) NameNoExt() string { if i := p.identifierIndex(0); i != -1 { - return p.s[p.posContainerHigh : p.identifiers[i].Low-1] + return p.s[p.posContainerHigh : p.identifiersKnown[i].Low-1] } return p.s[p.posContainerHigh:] } @@ -491,7 +509,7 @@ func (p *Path) NameNoLang() string { return p.Name() } - return p.s[p.posContainerHigh:p.identifiers[i].Low-1] + p.s[p.identifiers[i].High:] + return p.s[p.posContainerHigh:p.identifiersKnown[i].Low-1] + p.s[p.identifiersKnown[i].High:] } // BaseNameNoIdentifier returns the logical base name for a resource without any identifier (e.g. no extension). @@ -510,15 +528,15 @@ func (p *Path) NameNoIdentifier() string { } func (p *Path) nameLowHigh() types.LowHigh[string] { - if len(p.identifiers) > 0 { - lastID := p.identifiers[len(p.identifiers)-1] + if len(p.identifiersKnown) > 0 { + lastID := p.identifiersKnown[len(p.identifiersKnown)-1] if p.posContainerHigh == lastID.Low { // The last identifier is the name. return lastID } return types.LowHigh[string]{ Low: p.posContainerHigh, - High: p.identifiers[len(p.identifiers)-1].Low - 1, + High: p.identifiersKnown[len(p.identifiersKnown)-1].Low - 1, } } return types.LowHigh[string]{ @@ -566,7 +584,7 @@ func (p *Path) PathNoIdentifier() string { // PathBeforeLangAndOutputFormatAndExt returns the path up to the first identifier that is not a language or output format. func (p *Path) PathBeforeLangAndOutputFormatAndExt() string { - if len(p.identifiers) == 0 { + if len(p.identifiersKnown) == 0 { return p.norm(p.s) } i := p.identifierIndex(0) @@ -582,7 +600,7 @@ func (p *Path) PathBeforeLangAndOutputFormatAndExt() string { return p.norm(p.s) } - id := p.identifiers[i] + id := p.identifiersKnown[i] return p.norm(p.s[:id.Low-1]) } @@ -633,11 +651,11 @@ func (p *Path) BaseNoLeadingSlash() string { } func (p *Path) base(preserveExt, isBundle bool) string { - if len(p.identifiers) == 0 { + if len(p.identifiersKnown) == 0 { return p.norm(p.s) } - if preserveExt && len(p.identifiers) == 1 { + if preserveExt && len(p.identifiersKnown) == 1 { // Preserve extension. return p.norm(p.s) } @@ -659,7 +677,7 @@ func (p *Path) base(preserveExt, isBundle bool) string { } // For txt files etc. we want to preserve the extension. - id := p.identifiers[0] + id := p.identifiersKnown[0] return p.norm(p.s[:high] + p.s[id.Low-1:id.High]) } @@ -676,6 +694,10 @@ func (p *Path) Kind() string { return p.identifierAsString(p.posIdentifierKind) } +func (p *Path) Layout() string { + return p.identifierAsString(p.posIdentifierLayout) +} + func (p *Path) Lang() string { return p.identifierAsString(p.posIdentifierLanguage) } @@ -689,8 +711,8 @@ func (p *Path) Disabled() bool { } func (p *Path) Identifiers() []string { - ids := make([]string, len(p.identifiers)) - for i, id := range p.identifiers { + ids := make([]string, len(p.identifiersKnown)) + for i, id := range p.identifiersKnown { ids[i] = p.s[id.Low:id.High] } return ids @@ -699,7 +721,7 @@ func (p *Path) Identifiers() []string { func (p *Path) IdentifiersUnknown() []string { ids := make([]string, len(p.identifiersUnknown)) for i, id := range p.identifiersUnknown { - ids[i] = p.s[p.identifiers[id].Low:p.identifiers[id].High] + ids[i] = p.s[id.Low:id.High] } return ids } @@ -735,12 +757,12 @@ func (p *Path) identifierAsString(i int) string { return "" } - id := p.identifiers[i] + id := p.identifiersKnown[i] return p.s[id.Low:id.High] } func (p *Path) identifierIndex(i int) int { - if i < 0 || i >= len(p.identifiers) { + if i < 0 || i >= len(p.identifiersKnown) { return -1 } return i diff --git a/common/paths/pathparser_test.go b/common/paths/pathparser_test.go index fd1590c73..a6194e756 100644 --- a/common/paths/pathparser_test.go +++ b/common/paths/pathparser_test.go @@ -171,22 +171,25 @@ func TestParse(t *testing.T) { "/a/b.a.b.no.txt", func(c *qt.C, p *Path) { c.Assert(p.Name(), qt.Equals, "b.a.b.no.txt") - c.Assert(p.NameNoIdentifier(), qt.Equals, "b") + c.Assert(p.NameNoIdentifier(), qt.Equals, "b.a.b") c.Assert(p.NameNoLang(), qt.Equals, "b.a.b.txt") - c.Assert(p.Identifiers(), qt.DeepEquals, []string{"txt", "no", "b", "a", "b"}) + c.Assert(p.Identifiers(), qt.DeepEquals, []string{"txt", "no"}) c.Assert(p.IdentifiersUnknown(), qt.DeepEquals, []string{"b", "a", "b"}) - c.Assert(p.Base(), qt.Equals, "/a/b.txt") - c.Assert(p.BaseNoLeadingSlash(), qt.Equals, "a/b.txt") + c.Assert(p.Base(), qt.Equals, "/a/b.a.b.txt") + c.Assert(p.BaseNoLeadingSlash(), qt.Equals, "a/b.a.b.txt") c.Assert(p.Path(), qt.Equals, "/a/b.a.b.no.txt") - c.Assert(p.PathNoLang(), qt.Equals, "/a/b.txt") + c.Assert(p.PathNoLang(), qt.Equals, "/a/b.a.b.txt") c.Assert(p.Ext(), qt.Equals, "txt") - c.Assert(p.PathNoIdentifier(), qt.Equals, "/a/b") + c.Assert(p.PathNoIdentifier(), qt.Equals, "/a/b.a.b") }, }, { "Home branch cundle", "/_index.md", func(c *qt.C, p *Path) { + c.Assert(p.Identifiers(), qt.DeepEquals, []string{"md"}) + c.Assert(p.IsBranchBundle(), qt.IsTrue) + c.Assert(p.IsBundle(), qt.IsTrue) c.Assert(p.Base(), qt.Equals, "/") c.Assert(p.BaseReTyped("foo"), qt.Equals, "/foo") c.Assert(p.Path(), qt.Equals, "/_index.md") @@ -206,7 +209,8 @@ func TestParse(t *testing.T) { c.Assert(p.ContainerDir(), qt.Equals, "") c.Assert(p.Dir(), qt.Equals, "/a") c.Assert(p.Ext(), qt.Equals, "md") - c.Assert(p.Identifiers(), qt.DeepEquals, []string{"md", "index"}) + c.Assert(p.IdentifiersUnknown(), qt.DeepEquals, []string{"index"}) + c.Assert(p.Identifiers(), qt.DeepEquals, []string{"md"}) c.Assert(p.IsBranchBundle(), qt.IsFalse) c.Assert(p.IsBundle(), qt.IsTrue) c.Assert(p.IsLeafBundle(), qt.IsTrue) @@ -228,7 +232,7 @@ func TestParse(t *testing.T) { c.Assert(p.ContainerDir(), qt.Equals, "/a") c.Assert(p.Dir(), qt.Equals, "/a/b") c.Assert(p.Ext(), qt.Equals, "md") - c.Assert(p.Identifiers(), qt.DeepEquals, []string{"md", "no", "index"}) + c.Assert(p.Identifiers(), qt.DeepEquals, []string{"md", "no"}) c.Assert(p.IsBranchBundle(), qt.IsFalse) c.Assert(p.IsBundle(), qt.IsTrue) c.Assert(p.IsLeafBundle(), qt.IsTrue) @@ -250,7 +254,7 @@ func TestParse(t *testing.T) { c.Assert(p.Container(), qt.Equals, "b") c.Assert(p.ContainerDir(), qt.Equals, "/a") c.Assert(p.Ext(), qt.Equals, "md") - c.Assert(p.Identifiers(), qt.DeepEquals, []string{"md", "no", "_index"}) + c.Assert(p.Identifiers(), qt.DeepEquals, []string{"md", "no"}) c.Assert(p.IsBranchBundle(), qt.IsTrue) c.Assert(p.IsBundle(), qt.IsTrue) c.Assert(p.IsLeafBundle(), qt.IsFalse) @@ -289,7 +293,7 @@ func TestParse(t *testing.T) { func(c *qt.C, p *Path) { c.Assert(p.Base(), qt.Equals, "/a/b/index.txt") c.Assert(p.Ext(), qt.Equals, "txt") - c.Assert(p.Identifiers(), qt.DeepEquals, []string{"txt", "no", "index"}) + c.Assert(p.Identifiers(), qt.DeepEquals, []string{"txt", "no"}) c.Assert(p.IsLeafBundle(), qt.IsFalse) c.Assert(p.PathNoIdentifier(), qt.Equals, "/a/b/index") }, @@ -372,7 +376,7 @@ func TestParse(t *testing.T) { } for _, test := range tests { c.Run(test.name, func(c *qt.C) { - if test.name != "Basic Markdown file" { + if test.name != "Home branch cundle" { // return } test.assert(c, testParser.Parse(files.ComponentFolderContent, test.path)) @@ -401,10 +405,58 @@ func TestParseLayouts(t *testing.T) { "/list.no.html", func(c *qt.C, p *Path) { c.Assert(p.Identifiers(), qt.DeepEquals, []string{"html", "no", "list"}) + c.Assert(p.IdentifiersUnknown(), qt.DeepEquals, []string{}) c.Assert(p.Base(), qt.Equals, "/list.html") c.Assert(p.Lang(), qt.Equals, "no") }, }, + { + "Kind", + "/section.no.html", + func(c *qt.C, p *Path) { + c.Assert(p.Kind(), qt.Equals, kinds.KindSection) + c.Assert(p.Identifiers(), qt.DeepEquals, []string{"html", "no", "section"}) + c.Assert(p.IdentifiersUnknown(), qt.DeepEquals, []string{}) + c.Assert(p.Base(), qt.Equals, "/section.html") + c.Assert(p.Lang(), qt.Equals, "no") + }, + }, + { + "Layout", + "/list.section.no.html", + func(c *qt.C, p *Path) { + c.Assert(p.Layout(), qt.Equals, "list") + c.Assert(p.Identifiers(), qt.DeepEquals, []string{"html", "no", "section", "list"}) + c.Assert(p.IdentifiersUnknown(), qt.DeepEquals, []string{}) + c.Assert(p.Base(), qt.Equals, "/list.html") + c.Assert(p.Lang(), qt.Equals, "no") + }, + }, + { + "Layout multiple", + "/maylayout.list.section.no.html", + func(c *qt.C, p *Path) { + c.Assert(p.Layout(), qt.Equals, "maylayout") + c.Assert(p.Identifiers(), qt.DeepEquals, []string{"html", "no", "section", "list", "maylayout"}) + c.Assert(p.IdentifiersUnknown(), qt.DeepEquals, []string{}) + c.Assert(p.Base(), qt.Equals, "/maylayout.html") + c.Assert(p.Lang(), qt.Equals, "no") + }, + }, + { + "Layout shortcode", + "/_shortcodes/myshort.list.no.html", + func(c *qt.C, p *Path) { + c.Assert(p.Layout(), qt.Equals, "list") + }, + }, + { + "Layout baseof", + "/baseof.list.no.html", + func(c *qt.C, p *Path) { + c.Assert(p.Layout(), qt.Equals, "list") + }, + }, { "Lang and output format", "/list.no.amp.not.html", @@ -429,6 +481,20 @@ func TestParseLayouts(t *testing.T) { c.Assert(p.OutputFormat(), qt.Equals, "html") }, }, + { + "Shortcode with layout", + "/_shortcodes/myshortcode.list.html", + func(c *qt.C, p *Path) { + c.Assert(p.Base(), qt.Equals, "/_shortcodes/myshortcode.html") + c.Assert(p.Type(), qt.Equals, TypeShortcode) + c.Assert(p.Identifiers(), qt.DeepEquals, []string{"html", "list", "myshortcode"}) + c.Assert(p.PathNoIdentifier(), qt.Equals, "/_shortcodes/myshortcode") + c.Assert(p.PathBeforeLangAndOutputFormatAndExt(), qt.Equals, "/_shortcodes/myshortcode.list") + c.Assert(p.Lang(), qt.Equals, "") + c.Assert(p.Kind(), qt.Equals, "") + c.Assert(p.OutputFormat(), qt.Equals, "html") + }, + }, { "Sub dir", "/pages/home.html", @@ -445,7 +511,7 @@ func TestParseLayouts(t *testing.T) { "/pages/baseof.list.section.fr.amp.html", func(c *qt.C, p *Path) { c.Assert(p.Identifiers(), qt.DeepEquals, []string{"html", "amp", "fr", "section", "list", "baseof"}) - c.Assert(p.IdentifiersUnknown(), qt.DeepEquals, []string{"list"}) + c.Assert(p.IdentifiersUnknown(), qt.DeepEquals, []string{}) c.Assert(p.Kind(), qt.Equals, kinds.KindSection) c.Assert(p.Lang(), qt.Equals, "fr") c.Assert(p.OutputFormat(), qt.Equals, "amp") @@ -501,6 +567,9 @@ func TestParseLayouts(t *testing.T) { for _, test := range tests { c.Run(test.name, func(c *qt.C) { + if test.name != "Baseof" { + // return + } test.assert(c, testParser.Parse(files.ComponentFolderLayouts, test.path)) }) } diff --git a/common/paths/paths_integration_test.go b/common/paths/paths_integration_test.go index 62d40f527..f5ea3066a 100644 --- a/common/paths/paths_integration_test.go +++ b/common/paths/paths_integration_test.go @@ -78,3 +78,26 @@ disablePathToLower = true b.AssertFileContent("public/en/mysection/mybundle/index.html", "en|Single") b.AssertFileContent("public/fr/MySection/MyBundle/index.html", "fr|Single") } + +func TestIssue13596(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +disableKinds = ['home','rss','section','sitemap','taxonomy','term'] +-- content/p1/index.md -- +--- +title: p1 +--- +-- content/p1/a.1.txt -- +-- content/p1/a.2.txt -- +-- layouts/all.html -- +{{ range .Resources.Match "*" }}{{ .Name }}|{{ end }} +` + + b := hugolib.Test(t, files) + + b.AssertFileContent("public/p1/index.html", "a.1.txt|a.2.txt|") + b.AssertFileExists("public/p1/a.1.txt", true) + b.AssertFileExists("public/p1/a.2.txt", true) // fails +} diff --git a/hugolib/collections_test.go b/hugolib/collections_test.go index a8c817bec..f62d4c604 100644 --- a/hugolib/collections_test.go +++ b/hugolib/collections_test.go @@ -39,6 +39,8 @@ title: "Page" `) b.CreateSites().Build(BuildCfg{}) + // b.H.TemplateStore.PrintDebug("", tplimpl.CategoryLayout, os.Stdout) + c.Assert(len(b.H.Sites), qt.Equals, 1) c.Assert(len(b.H.Sites[0].RegularPages()), qt.Equals, 2) diff --git a/hugolib/content_render_hooks_test.go b/hugolib/content_render_hooks_test.go index 56ae0a052..c4e15a5c6 100644 --- a/hugolib/content_render_hooks_test.go +++ b/hugolib/content_render_hooks_test.go @@ -464,8 +464,6 @@ title: "Home" ` b := Test(t, files) - // b.DebugPrint("", tplimpl.CategoryShortcode) - b.AssertFileContentExact("public/index.xml", "My shortcode XML.") b.AssertFileContentExact("public/index.html", "My shortcode HTML.") s := b.H.Sites[0] diff --git a/hugolib/site_test.go b/hugolib/site_test.go index a9fe977cf..4d68602e5 100644 --- a/hugolib/site_test.go +++ b/hugolib/site_test.go @@ -978,7 +978,7 @@ func TestRefLinking(t *testing.T) { {".", "", true, "/level2/level3/"}, {"./", "", true, "/level2/level3/"}, - {"embedded.dot.md", "", true, "/level2/level3/embedded/"}, + {"embedded.dot.md", "", true, "/level2/level3/embedded.dot/"}, // test empty link, as well as fragment only link {"", "", true, ""}, diff --git a/tpl/tplimpl/templatestore.go b/tpl/tplimpl/templatestore.go index 5be65f874..dba897608 100644 --- a/tpl/tplimpl/templatestore.go +++ b/tpl/tplimpl/templatestore.go @@ -654,7 +654,7 @@ func (s *TemplateStore) PrintDebug(prefix string, category Category, w io.Writer return } s := strings.ReplaceAll(strings.TrimSpace(vv.content), "\n", " ") - ts := fmt.Sprintf("kind: %q layout: %q content: %.30s", vv.D.Kind, vv.D.LayoutFromTemplate, s) + ts := fmt.Sprintf("kind: %q layout: %q lang: %q content: %.30s", vv.D.Kind, vv.D.LayoutFromTemplate, vv.D.Lang, s) fmt.Fprintf(w, "%s%s %s\n", strings.Repeat(" ", level), key, ts) } s.treeMain.WalkPrefix(prefix, func(key string, v map[nodeKey]*TemplInfo) (bool, error) { @@ -1126,7 +1126,7 @@ func (s *TemplateStore) insertTemplate2( if !replace { if v, found := m[nk]; found { - if len(pi.IdentifiersUnknown()) >= len(v.PathInfo.IdentifiersUnknown()) { + if len(pi.Identifiers()) >= len(v.PathInfo.Identifiers()) { // e.g. /pages/home.foo.html and /pages/home.html where foo may be a valid language name in another site. return nil, nil } @@ -1261,7 +1261,10 @@ func (s *TemplateStore) insertTemplates(include func(fi hugofs.FileMetaInfo) boo ) base := piOrig.PathBeforeLangAndOutputFormatAndExt() - identifiers := pi.IdentifiersUnknown() + identifiers := []string{} + if pi.Layout() != "" { + identifiers = append(identifiers, pi.Layout()) + } if pi.Kind() != "" { identifiers = append(identifiers, pi.Kind()) } @@ -1576,24 +1579,12 @@ func (s *TemplateStore) toKeyCategoryAndDescriptor(p *paths.Path) (string, strin outputFormat, mediaType := s.resolveOutputFormatAndOrMediaType(p.OutputFormat(), p.Ext()) nameNoIdentifier := p.NameNoIdentifier() - var layout string - unknownids := p.IdentifiersUnknown() - if p.Type() == paths.TypeShortcode { - if len(unknownids) > 1 { - // The name is the last identifier. - layout = unknownids[len(unknownids)-2] - } - } else if len(unknownids) > 0 { - // Pick the last, closest to the base name. - layout = unknownids[len(unknownids)-1] - } - d := TemplateDescriptor{ Lang: p.Lang(), OutputFormat: p.OutputFormat(), MediaType: mediaType.Type, Kind: p.Kind(), - LayoutFromTemplate: layout, + LayoutFromTemplate: p.Layout(), IsPlainText: outputFormat.IsPlainText, } @@ -1633,6 +1624,7 @@ func (s *TemplateStore) toKeyCategoryAndDescriptor(p *paths.Path) (string, strin if category == CategoryShortcode { k1 = p.PathNoIdentifier() + parts := strings.Split(k1, "/"+containerShortcodes+"/") k1 = parts[0] if len(parts) > 1 { diff --git a/tpl/tplimpl/templatestore_integration_test.go b/tpl/tplimpl/templatestore_integration_test.go index 06cb00212..bd00f82b7 100644 --- a/tpl/tplimpl/templatestore_integration_test.go +++ b/tpl/tplimpl/templatestore_integration_test.go @@ -1056,7 +1056,7 @@ All. b := hugolib.Test(t, files, hugolib.TestOptWarn()) - b.AssertLogContains("Duplicate content path") + b.AssertLogContains("! Duplicate content path") } // Issue #13577. From 1ad3d39dc4693434505fc81f91eed57333017e93 Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Tue, 22 Apr 2025 17:26:42 +0000 Subject: [PATCH 036/129] releaser: Bump versions for release of 0.146.7 [ci skip] --- common/hugo/version_current.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/common/hugo/version_current.go b/common/hugo/version_current.go index 141b88d57..2c1e0dc92 100644 --- a/common/hugo/version_current.go +++ b/common/hugo/version_current.go @@ -17,7 +17,7 @@ package hugo // This should be the only one. var CurrentVersion = Version{ Major: 0, - Minor: 147, - PatchLevel: 0, - Suffix: "-DEV", + Minor: 146, + PatchLevel: 7, + Suffix: "", } From df44ee13534aed3b73fbcdc1f6acb4c9097d421b Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Tue, 22 Apr 2025 17:42:19 +0000 Subject: [PATCH 037/129] releaser: Prepare repository for 0.147.0-DEV [ci skip] --- common/hugo/version_current.go | 6 +++--- hugoreleaser.env | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/common/hugo/version_current.go b/common/hugo/version_current.go index 2c1e0dc92..141b88d57 100644 --- a/common/hugo/version_current.go +++ b/common/hugo/version_current.go @@ -17,7 +17,7 @@ package hugo // This should be the only one. var CurrentVersion = Version{ Major: 0, - Minor: 146, - PatchLevel: 7, - Suffix: "", + Minor: 147, + PatchLevel: 0, + Suffix: "-DEV", } diff --git a/hugoreleaser.env b/hugoreleaser.env index 1a51a532e..901312a41 100644 --- a/hugoreleaser.env +++ b/hugoreleaser.env @@ -1,7 +1,8 @@ # Release env. # These will be replaced by script before release. -HUGORELEASER_TAG=v0.146.6 -HUGORELEASER_COMMITISH=1e0b058efe8d6e236bc7c8d6981d9bfb1443178e +HUGORELEASER_TAG=v0.146.7 +HUGORELEASER_COMMITISH=1ad3d39dc4693434505fc81f91eed57333017e93 + From 41cb880f9a7d2dee0a0c6a20abcfe1dd9cd850e9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 23 Apr 2025 08:12:25 +0000 Subject: [PATCH 038/129] build(deps): bump github.com/alecthomas/chroma/v2 from 2.16.0 to 2.17.0 Bumps [github.com/alecthomas/chroma/v2](https://github.com/alecthomas/chroma) from 2.16.0 to 2.17.0. - [Release notes](https://github.com/alecthomas/chroma/releases) - [Changelog](https://github.com/alecthomas/chroma/blob/master/.goreleaser.yml) - [Commits](https://github.com/alecthomas/chroma/compare/v2.16.0...v2.17.0) --- updated-dependencies: - dependency-name: github.com/alecthomas/chroma/v2 dependency-version: 2.17.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 5724b45b8..9ad988f14 100644 --- a/go.mod +++ b/go.mod @@ -2,7 +2,7 @@ module github.com/gohugoio/hugo require ( github.com/BurntSushi/locker v0.0.0-20171006230638-a6e239ea1c69 - github.com/alecthomas/chroma/v2 v2.16.0 + github.com/alecthomas/chroma/v2 v2.17.0 github.com/armon/go-radix v1.0.1-0.20221118154546-54df44f2176c github.com/aws/aws-sdk-go-v2 v1.36.1 github.com/aws/aws-sdk-go-v2/service/cloudfront v1.44.10 diff --git a/go.sum b/go.sum index 6f0e05092..806b749a3 100644 --- a/go.sum +++ b/go.sum @@ -73,8 +73,8 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/alecthomas/assert/v2 v2.11.0 h1:2Q9r3ki8+JYXvGsDyBXwH3LcJ+WK5D0gc5E8vS6K3D0= github.com/alecthomas/assert/v2 v2.11.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k= -github.com/alecthomas/chroma/v2 v2.16.0 h1:QC5ZMizk67+HzxFDjQ4ASjni5kWBTGiigRG1u23IGvA= -github.com/alecthomas/chroma/v2 v2.16.0/go.mod h1:RVX6AvYm4VfYe/zsk7mjHueLDZor3aWCNE14TFlepBk= +github.com/alecthomas/chroma/v2 v2.17.0 h1:3r2Cgk+nXNICMBxIFGnTRTbQFUwMiLisW+9uos0TtUI= +github.com/alecthomas/chroma/v2 v2.17.0/go.mod h1:RVX6AvYm4VfYe/zsk7mjHueLDZor3aWCNE14TFlepBk= github.com/alecthomas/repr v0.4.0 h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc= github.com/alecthomas/repr v0.4.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= github.com/armon/go-radix v1.0.1-0.20221118154546-54df44f2176c h1:651/eoCRnQ7YtSjAnSzRucrJz+3iGEFt+ysraELS81M= From 1bd7ac7ed9ba26014fd81ea1b757e7f657f285b4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 23 Apr 2025 08:12:38 +0000 Subject: [PATCH 039/129] build(deps): bump github.com/evanw/esbuild from 0.25.2 to 0.25.3 Bumps [github.com/evanw/esbuild](https://github.com/evanw/esbuild) from 0.25.2 to 0.25.3. - [Release notes](https://github.com/evanw/esbuild/releases) - [Changelog](https://github.com/evanw/esbuild/blob/main/CHANGELOG.md) - [Commits](https://github.com/evanw/esbuild/compare/v0.25.2...v0.25.3) --- updated-dependencies: - dependency-name: github.com/evanw/esbuild dependency-version: 0.25.3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 9ad988f14..fba76335f 100644 --- a/go.mod +++ b/go.mod @@ -26,7 +26,7 @@ require ( github.com/clbanning/mxj/v2 v2.7.0 github.com/disintegration/gift v1.2.1 github.com/dustin/go-humanize v1.0.1 - github.com/evanw/esbuild v0.25.2 + github.com/evanw/esbuild v0.25.3 github.com/fatih/color v1.18.0 github.com/fortytw2/leaktest v1.3.0 github.com/frankban/quicktest v1.14.6 diff --git a/go.sum b/go.sum index 806b749a3..b432e1d6b 100644 --- a/go.sum +++ b/go.sum @@ -186,8 +186,8 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/evanw/esbuild v0.25.2 h1:ublSEmZSjzOc6jLO1OTQy/vHc1wiqyDF4oB3hz5sM6s= -github.com/evanw/esbuild v0.25.2/go.mod h1:D2vIQZqV/vIf/VRHtViaUtViZmG7o+kKmlBfVQuRi48= +github.com/evanw/esbuild v0.25.3 h1:4JKyUsm/nHDhpxis4IyWXAi8GiyTwG1WdEp6OhGVE8U= +github.com/evanw/esbuild v0.25.3/go.mod h1:D2vIQZqV/vIf/VRHtViaUtViZmG7o+kKmlBfVQuRi48= github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= From 6a0e04241ad056c587b735e3a742cf83c2e10db7 Mon Sep 17 00:00:00 2001 From: Christian Oliff Date: Thu, 24 Apr 2025 17:19:17 +0900 Subject: [PATCH 040/129] all: Fix typos --- config/configProvider.go | 2 +- hugolib/content_map_test.go | 2 +- hugolib/filesystems/basefs.go | 2 +- hugolib/integrationtest_builder.go | 2 +- tpl/tplimpl/embedded/templates/_shortcodes/instagram.html | 2 +- tpl/tplimpl/embedded/templates/_shortcodes/vimeo_simple.html | 4 ++-- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/config/configProvider.go b/config/configProvider.go index 5bda2c55a..c21342dce 100644 --- a/config/configProvider.go +++ b/config/configProvider.go @@ -76,7 +76,7 @@ type AllProvider interface { } // We cannot import the media package as that would create a circular dependency. -// This interface defineds a sub set of what media.ContentTypes provides. +// This interface defines a subset of what media.ContentTypes provides. type ContentTypesProvider interface { IsContentSuffix(suffix string) bool IsContentFile(filename string) bool diff --git a/hugolib/content_map_test.go b/hugolib/content_map_test.go index c24790495..f72862150 100644 --- a/hugolib/content_map_test.go +++ b/hugolib/content_map_test.go @@ -517,7 +517,7 @@ func TestHTMLNotContent(t *testing.T) { -- hugo.toml.temp -- [contentTypes] [contentTypes."text/markdown"] -# Emopty for now. +# Empty for now. -- hugo.yaml.temp -- contentTypes: text/markdown: {} diff --git a/hugolib/filesystems/basefs.go b/hugolib/filesystems/basefs.go index 3e9b92087..b32b8796f 100644 --- a/hugolib/filesystems/basefs.go +++ b/hugolib/filesystems/basefs.go @@ -397,7 +397,7 @@ func (d *SourceFilesystem) mounts() []hugofs.FileMetaInfo { }) // Filter out any mounts not belonging to this filesystem. - // TODO(bep) I think this is superflous. + // TODO(bep) I think this is superfluous. n := 0 for _, mm := range m { if mm.Meta().Component == d.Name { diff --git a/hugolib/integrationtest_builder.go b/hugolib/integrationtest_builder.go index 4ea6f420d..3c2f1ad74 100644 --- a/hugolib/integrationtest_builder.go +++ b/hugolib/integrationtest_builder.go @@ -918,7 +918,7 @@ type IntegrationTestConfig struct { // The files to use on txtar format, see // https://pkg.go.dev/golang.org/x/exp/cmd/txtar - // There are some conentions used in this test setup. + // There are some contentions used in this test setup. // - §§§ can be used to wrap code fences. // - §§ can be used to wrap multiline strings. // - filenames prefixed with sourcefilename: will be read from the file system relative to the current dir. diff --git a/tpl/tplimpl/embedded/templates/_shortcodes/instagram.html b/tpl/tplimpl/embedded/templates/_shortcodes/instagram.html index 17188c6fd..804038e7d 100644 --- a/tpl/tplimpl/embedded/templates/_shortcodes/instagram.html +++ b/tpl/tplimpl/embedded/templates/_shortcodes/instagram.html @@ -3,7 +3,7 @@ {{- with .Get 0 -}} {{- template "render-instagram" (dict "id" . "pc" $pc) -}} {{- else -}} - {{- errorf "The %q shortocde requires a single positional parameter, the ID of the Instagram post. See %s" .Name .Position -}} + {{- errorf "The %q shortcode requires a single positional parameter, the ID of the Instagram post. See %s" .Name .Position -}} {{- end -}} {{- end -}} diff --git a/tpl/tplimpl/embedded/templates/_shortcodes/vimeo_simple.html b/tpl/tplimpl/embedded/templates/_shortcodes/vimeo_simple.html index 11f19b1f6..86a6dfc9f 100644 --- a/tpl/tplimpl/embedded/templates/_shortcodes/vimeo_simple.html +++ b/tpl/tplimpl/embedded/templates/_shortcodes/vimeo_simple.html @@ -6,14 +6,14 @@ {{- $ctx = merge $ctx (dict "id" . "class" ($.Get "class")) -}} {{- template "render-vimeo" $ctx -}} {{- else -}} - {{- errorf "The %q shortocde requires a single named parameter, the ID of the Vimeo video. See %s" .Name .Position -}} + {{- errorf "The %q shortcode requires a single named parameter, the ID of the Vimeo video. See %s" .Name .Position -}} {{- end -}} {{- else -}} {{- with .Get 0 -}} {{- $ctx = merge $ctx (dict "id" . "class" ($.Get 1)) -}} {{- template "render-vimeo" $ctx -}} {{- else -}} - {{- errorf "The %q shortocde requires a single positional parameter, the ID of the Vimeo video. See %s" .Name .Position -}} + {{- errorf "The %q shortcode requires a single positional parameter, the ID of the Vimeo video. See %s" .Name .Position -}} {{- end -}} {{- end -}} {{- end -}} From b3d87dd0fd746f07f9afa6e6a2969aea41da6a38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Thu, 24 Apr 2025 10:23:16 +0200 Subject: [PATCH 041/129] Squashed 'docs/' changes from dc7a9ae12..b654fcba0 b654fcba0 content: Fix links d44357418 content: Update GitLab Pages workflow example 33968c7e2 content: Update Netlify configuration file a6d0c8c50 content: Update GitHub Pages workflow example d1aabfa36 content: Fix broken link 7b50139a6 content: Miscellaneous edits a30e2c189 Menus: add forgotten link target 5c2aa88b4 content: Updates for v0.146.7 114413c18 netlify: Hugo 0.146.7 67e9261b1 netlify: Hugo 0.146.6 efa040229 content: Update templates/embedded.md b8f888c76 theme: Rename internal templates from partials/ to _partials/ 727178cbb content: Fix broken anchor links 0f12708f1 Fix typo 380b1c163 Update Current.md 8b500f3e5 netlify: Hugo 0.146.5 e3d6b6fad netlify: Hugo 0.146.4 ac1b92713 content: Fix text formatting in templates/partial.md 719329530 content: Clarify usage of template function a95eca524 theme: Misc adjustments for the themes site 8e6c26067 Add package.hugo.json 9691007fb netlify: Hugo 0.146.3 ec08acc59 netlify: Hugo 0.146.2 8f320a0b6 netlify: Hugo 0.146.1 d5e6cb618 content: Remove expired new-in badges b5779d7fc content: Update templates.Current function 5df1229d5 theme: Move templates to new structure a7a6a614d theme: Remove accidentally added template 195b368e8 content: Miscellaneous updates related to v0.146.0 0a906ad49 netlify: Hugo 0.146.0 git-subtree-dir: docs git-subtree-split: b654fcba0d4385da1e47179ef3763f277f044242 --- content/en/configuration/introduction.md | 2 +- content/en/content-management/menus.md | 2 +- content/en/contribute/documentation.md | 2 +- content/en/functions/collections/Where.md | 3 - content/en/functions/css/Sass.md | 148 +++++++---------- content/en/functions/go-template/template.md | 28 +++- content/en/functions/templates/Current.md | 155 ++++++++++++++++++ content/en/functions/time/In.md | 30 ++++ content/en/functions/transform/Unmarshal.md | 85 +++++++++- .../host-on-github-pages/index.md | 2 + .../host-and-deploy/host-on-gitlab-pages.md | 10 +- .../host-and-deploy/host-on-netlify/index.md | 11 +- content/en/installation/linux.md | 20 ++- content/en/news/_content.gotmpl | 3 +- content/en/quick-reference/glossary/iana.md | 6 + content/en/quick-reference/glossary/utc.md | 6 + content/en/shortcodes/ref.md | 7 +- content/en/shortcodes/relref.md | 5 +- content/en/shortcodes/vimeo.md | 16 +- content/en/shortcodes/youtube.md | 2 +- content/en/templates/embedded.md | 8 +- content/en/templates/partial.md | 2 +- content/en/templates/shortcode.md | 2 +- content/en/troubleshooting/inspection.md | 5 + data/embedded_template_urls.toml | 64 ++++---- .../_markup/render-blockquote.html | 0 .../_markup/render-codeblock.html | 0 .../{_default => }/_markup/render-link.html | 4 +- .../_markup/render-passthrough.html | 0 .../{_default => }/_markup/render-table.html | 0 .../docs/functions-aliases.html | 0 .../docs/functions-return-type.html | 0 .../docs/functions-signatures.html | 0 .../helpers/debug/list-item-metadata.html | 0 .../helpers/funcs/color-from-string.html | 0 .../helpers/funcs/get-github-info.html | 0 .../helpers/funcs/get-remote-data.html | 0 .../{partials => _partials}/helpers/gtag.html | 0 .../helpers/linkcss.html | 0 .../helpers/linkjs.html | 0 .../helpers/picture.html | 2 + .../helpers/validation/validate-keywords.html | 0 .../layouts/blocks/alert.html | 0 .../layouts/blocks/modal.html | 0 .../layouts/breadcrumbs.html | 0 .../{partials => _partials}/layouts/date.html | 0 .../layouts/docsheader.html | 0 .../layouts/explorer.html | 0 .../layouts/footer.html | 0 .../layouts/head/head-js.html | 0 .../layouts/head/head.html | 0 .../layouts/header/githubstars.html | 0 .../layouts/header/header.html | 0 .../layouts/header/qr.html | 2 +- .../layouts/header/theme.html | 0 .../layouts/home/features.html | 0 .../layouts/home/opensource.html | 0 .../layouts/home/sponsors.html | 0 .../layouts/hooks/body-end.html | 0 .../layouts/hooks/body-main-start.html | 0 .../layouts/hooks/body-start.html | 0 .../layouts/icons.html | 0 .../layouts/in-this-section.html | 0 .../layouts/page-edit.html | 0 .../layouts/related.html | 0 .../layouts/search/algolialogo.html | 0 .../layouts/search/button.html | 0 .../layouts/search/input.html | 0 .../layouts/search/results.html | 0 .../layouts/templates.html | 0 .../{partials => _partials}/layouts/toc.html | 0 .../opengraph/get-featured-image.html | 0 .../opengraph/opengraph.html | 0 .../chroma-lexers.html | 0 .../code-toggle.html | 0 .../datatable-filtered.html | 0 .../datatable.html | 0 .../deprecated-in.html | 0 .../{shortcodes => _shortcodes}/eturl.html | 0 .../glossary-term.html | 0 .../{shortcodes => _shortcodes}/glossary.html | 0 layouts/{shortcodes => _shortcodes}/hl.html | 0 layouts/{shortcodes => _shortcodes}/img.html | 2 +- .../{shortcodes => _shortcodes}/imgproc.html | 0 .../{shortcodes => _shortcodes}/include.html | 0 .../list-pages-in-section.html | 0 .../module-mounts-note.html | 0 .../{shortcodes => _shortcodes}/new-in.html | 0 .../per-lang-config-keys.html | 4 +- .../quick-reference.html | 0 .../root-configuration-keys.html | 0 .../syntax-highlighting-styles.html | 0 layouts/{_default => }/baseof.html | 2 + layouts/{index.headers => home.headers} | 0 layouts/{index.html => home.html} | 0 layouts/{index.redir => home.redir} | 0 layouts/{_default => }/list.html | 0 layouts/{_default => }/list.rss.xml | 0 layouts/{_default => }/single.html | 0 netlify.toml | 2 +- package.hugo.json | 25 +++ 101 files changed, 503 insertions(+), 164 deletions(-) create mode 100644 content/en/functions/templates/Current.md create mode 100644 content/en/functions/time/In.md create mode 100644 content/en/quick-reference/glossary/iana.md create mode 100644 content/en/quick-reference/glossary/utc.md rename layouts/{_default => }/_markup/render-blockquote.html (100%) rename layouts/{_default => }/_markup/render-codeblock.html (100%) rename layouts/{_default => }/_markup/render-link.html (98%) rename layouts/{_default => }/_markup/render-passthrough.html (100%) rename layouts/{_default => }/_markup/render-table.html (100%) rename layouts/{partials => _partials}/docs/functions-aliases.html (100%) rename layouts/{partials => _partials}/docs/functions-return-type.html (100%) rename layouts/{partials => _partials}/docs/functions-signatures.html (100%) rename layouts/{partials => _partials}/helpers/debug/list-item-metadata.html (100%) rename layouts/{partials => _partials}/helpers/funcs/color-from-string.html (100%) rename layouts/{partials => _partials}/helpers/funcs/get-github-info.html (100%) rename layouts/{partials => _partials}/helpers/funcs/get-remote-data.html (100%) rename layouts/{partials => _partials}/helpers/gtag.html (100%) rename layouts/{partials => _partials}/helpers/linkcss.html (100%) rename layouts/{partials => _partials}/helpers/linkjs.html (100%) rename layouts/{partials => _partials}/helpers/picture.html (92%) rename layouts/{partials => _partials}/helpers/validation/validate-keywords.html (100%) rename layouts/{partials => _partials}/layouts/blocks/alert.html (100%) rename layouts/{partials => _partials}/layouts/blocks/modal.html (100%) rename layouts/{partials => _partials}/layouts/breadcrumbs.html (100%) rename layouts/{partials => _partials}/layouts/date.html (100%) rename layouts/{partials => _partials}/layouts/docsheader.html (100%) rename layouts/{partials => _partials}/layouts/explorer.html (100%) rename layouts/{partials => _partials}/layouts/footer.html (100%) rename layouts/{partials => _partials}/layouts/head/head-js.html (100%) rename layouts/{partials => _partials}/layouts/head/head.html (100%) rename layouts/{partials => _partials}/layouts/header/githubstars.html (100%) rename layouts/{partials => _partials}/layouts/header/header.html (100%) rename layouts/{partials => _partials}/layouts/header/qr.html (96%) rename layouts/{partials => _partials}/layouts/header/theme.html (100%) rename layouts/{partials => _partials}/layouts/home/features.html (100%) rename layouts/{partials => _partials}/layouts/home/opensource.html (100%) rename layouts/{partials => _partials}/layouts/home/sponsors.html (100%) rename layouts/{partials => _partials}/layouts/hooks/body-end.html (100%) rename layouts/{partials => _partials}/layouts/hooks/body-main-start.html (100%) rename layouts/{partials => _partials}/layouts/hooks/body-start.html (100%) rename layouts/{partials => _partials}/layouts/icons.html (100%) rename layouts/{partials => _partials}/layouts/in-this-section.html (100%) rename layouts/{partials => _partials}/layouts/page-edit.html (100%) rename layouts/{partials => _partials}/layouts/related.html (100%) rename layouts/{partials => _partials}/layouts/search/algolialogo.html (100%) rename layouts/{partials => _partials}/layouts/search/button.html (100%) rename layouts/{partials => _partials}/layouts/search/input.html (100%) rename layouts/{partials => _partials}/layouts/search/results.html (100%) rename layouts/{partials => _partials}/layouts/templates.html (100%) rename layouts/{partials => _partials}/layouts/toc.html (100%) rename layouts/{partials => _partials}/opengraph/get-featured-image.html (100%) rename layouts/{partials => _partials}/opengraph/opengraph.html (100%) rename layouts/{shortcodes => _shortcodes}/chroma-lexers.html (100%) rename layouts/{shortcodes => _shortcodes}/code-toggle.html (100%) rename layouts/{shortcodes => _shortcodes}/datatable-filtered.html (100%) rename layouts/{shortcodes => _shortcodes}/datatable.html (100%) rename layouts/{shortcodes => _shortcodes}/deprecated-in.html (100%) rename layouts/{shortcodes => _shortcodes}/eturl.html (100%) rename layouts/{shortcodes => _shortcodes}/glossary-term.html (100%) rename layouts/{shortcodes => _shortcodes}/glossary.html (100%) rename layouts/{shortcodes => _shortcodes}/hl.html (100%) rename layouts/{shortcodes => _shortcodes}/img.html (99%) rename layouts/{shortcodes => _shortcodes}/imgproc.html (100%) rename layouts/{shortcodes => _shortcodes}/include.html (100%) rename layouts/{shortcodes => _shortcodes}/list-pages-in-section.html (100%) rename layouts/{shortcodes => _shortcodes}/module-mounts-note.html (100%) rename layouts/{shortcodes => _shortcodes}/new-in.html (100%) rename layouts/{shortcodes => _shortcodes}/per-lang-config-keys.html (97%) rename layouts/{shortcodes => _shortcodes}/quick-reference.html (100%) rename layouts/{shortcodes => _shortcodes}/root-configuration-keys.html (100%) rename layouts/{shortcodes => _shortcodes}/syntax-highlighting-styles.html (100%) rename layouts/{_default => }/baseof.html (98%) rename layouts/{index.headers => home.headers} (100%) rename layouts/{index.html => home.html} (100%) rename layouts/{index.redir => home.redir} (100%) rename layouts/{_default => }/list.html (100%) rename layouts/{_default => }/list.rss.xml (100%) rename layouts/{_default => }/single.html (100%) create mode 100644 package.hugo.json diff --git a/content/en/configuration/introduction.md b/content/en/configuration/introduction.md index 121a483c4..8f8ad4c1e 100644 --- a/content/en/configuration/introduction.md +++ b/content/en/configuration/introduction.md @@ -249,7 +249,7 @@ HUGO_FILE_LOG_FORMAT HUGO_MEMORYLIMIT : {{< new-in 0.123.0 />}} -: (`int`) The maximum amount of system memory, in gigabytes, that Hugo can use while rendering your site. Default is 25% of total system memory. Note that The `HUGO_MEMORYLIMIT` is a “best effort” setting. Don't expect Hugo to build a million pages with only 1 GB memory. You can get more information about how this behaves during the build by building with `hugo --logLevel info` and look for the `dynacache` label. +: (`int`) The maximum amount of system memory, in gigabytes, that Hugo can use while rendering your site. Default is 25% of total system memory. Note that `HUGO_MEMORYLIMIT` is a "best effort" setting. Don't expect Hugo to build a million pages with only 1 GB of memory. You can get more information about how this behaves during the build by building with `hugo --logLevel info` and look for the `dynacache` label. HUGO_NUMWORKERMULTIPLIER : (`int`) The number of workers used in parallel processing. Default is the number of logical CPUs. diff --git a/content/en/content-management/menus.md b/content/en/content-management/menus.md index ab1bcbfa1..6d01173dc 100644 --- a/content/en/content-management/menus.md +++ b/content/en/content-management/menus.md @@ -11,7 +11,7 @@ aliases: [/extras/menus/] To create a menu for your site: 1. Define the menu entries -1. [Localize] each entry +1. [Localize](multilingual/#menus) each entry 1. Render the menu with a [template] Create multiple menus, either flat or nested. For example, create a main menu for the header, and a separate menu for the footer. diff --git a/content/en/contribute/documentation.md b/content/en/contribute/documentation.md index 1d185d21d..68129912a 100644 --- a/content/en/contribute/documentation.md +++ b/content/en/contribute/documentation.md @@ -112,7 +112,7 @@ Yes → Hugo is fast. ### Function and method descriptions -Start descriptions in the functions and methods sections with "Returns", of for booelan values, "Reports whether". +Start descriptions in the functions and methods sections with "Returns", or for boolean values, "Reports whether". ### File paths and names diff --git a/content/en/functions/collections/Where.md b/content/en/functions/collections/Where.md index 1df84afc4..84fd1d21e 100644 --- a/content/en/functions/collections/Where.md +++ b/content/en/functions/collections/Where.md @@ -87,7 +87,6 @@ Use any of the following logical operators: : (`bool`) Reports whether the given field value (a slice) contains one or more elements in common with `VALUE`. See [details](/functions/collections/intersect). `like` -: {{< new-in 0.116.0 />}} : (`bool`) Reports whether the given field value matches the [regular expression](g) specified in `VALUE`. Use the `like` operator to compare `string` values. The `like` operator returns `false` when comparing other data types to the regular expression. > [!note] @@ -167,8 +166,6 @@ For example, to return a collection of pages where any of the terms in the "genr ## Regular expression comparison -{{< new-in 0.116.0 />}} - To return a collection of pages where the "author" page parameter begins with either "victor" or "Victor": ```go-html-template diff --git a/content/en/functions/css/Sass.md b/content/en/functions/css/Sass.md index 1d5487130..03a4c7451 100644 --- a/content/en/functions/css/Sass.md +++ b/content/en/functions/css/Sass.md @@ -12,13 +12,66 @@ params: {{< new-in 0.128.0 />}} -```go-html-template +Transpile Sass to CSS using the LibSass transpiler included in Hugo's extended and extended/deploy editions, or [install Dart Sass](#dart-sass) to use the latest features of the Sass language. + +Sass has two forms of syntax: [SCSS] and [indented]. Hugo supports both. + +[scss]: https://sass-lang.com/documentation/syntax#scss +[indented]: https://sass-lang.com/documentation/syntax#the-indented-syntax + +## Options + +enableSourceMap +: (`bool`) Whether to generate a source map. Default is `false`. + +includePaths +: (`slice`) A slice of paths, relative to the project root, that the transpiler will use when resolving `@use` and `@import` statements. + +outputStyle +: (`string`) The output style of the resulting CSS. With LibSass, one of `nested` (default), `expanded`, `compact`, or `compressed`. With Dart Sass, either `expanded` (default) or `compressed`. + +precision +: (`int`) The precision of floating point math. Applicable to LibSass. Default is `8`. + +silenceDeprecations +: {{< new-in 0.139.0 />}} +: (`slice`) A slice of deprecation IDs to silence. IDs are enclosed in brackets within Dart Sass warning messages (e.g., `import` in `WARN Dart Sass: DEPRECATED [import]`). Applicable to Dart Sass. Default is `false`. + +silenceDependencyDeprecations +: {{< new-in 0.146.0 />}} +: (`bool`) Whether to silence deprecation warnings from dependencies, where a dependency is considered any file transitively imported through a load path. This does not apply to `@warn` or `@debug` rules.Default is `false`. + +sourceMapIncludeSources +: (`bool`) Whether to embed sources in the generated source map. Applicable to Dart Sass. Default is `false`. + +targetPath +: (`string`) The publish path for the transformed resource, relative to the[`publishDir`]. If unset, the target path defaults to the asset's original path with a `.css` extension. + +transpiler +: (`string`) The transpiler to use, either `libsass` or `dartsass`. Hugo's extended and extended/deploy editions include the LibSass transpiler. To use the Dart Sass transpiler, see the [installation instructions](#dart-sass). Default is `libsass`. + +vars +: (`map`) A map of key-value pairs that will be available in the `hugo:vars` namespace. Useful for [initializing Sass variables from Hugo templates](https://discourse.gohugo.io/t/42053/). + + ```scss + // LibSass + @import "hugo:vars"; + + // Dart Sass + @use "hugo:vars" as v; + ``` + +## Example + +```go-html-template {copy=true} {{ with resources.Get "sass/main.scss" }} {{ $opts := dict "enableSourceMap" (not hugo.IsProduction) "outputStyle" (cond hugo.IsProduction "compressed" "expanded") "targetPath" "css/main.css" - "transpiler" "libsass" + "transpiler" "dartsass" + "vars" site.Params.styles + "includePaths" (slice "node_modules/bootstrap/scss") }} {{ with . | toCSS $opts }} {{ if hugo.IsProduction }} @@ -32,63 +85,6 @@ params: {{ end }} ``` -Transpile Sass to CSS using the LibSass transpiler included in Hugo's extended and extended/deploy editions, or [install Dart Sass](#dart-sass) to use the latest features of the Sass language. - -Sass has two forms of syntax: [SCSS] and [indented]. Hugo supports both. - -[scss]: https://sass-lang.com/documentation/syntax#scss -[indented]: https://sass-lang.com/documentation/syntax#the-indented-syntax - -## Options - -transpiler -: (`string`) The transpiler to use, either `libsass` (default) or `dartsass`. Hugo's extended and extended/deploy editions include the LibSass transpiler. To use the Dart Sass transpiler, see the [installation instructions](#dart-sass) below. - -targetPath -: (`string`) If not set, the transformed resource's target path will be the original path of the asset file with its extension replaced by `.css`. - -vars -: (`map`) A map of key-value pairs that will be available in the `hugo:vars` namespace. Useful for [initializing Sass variables from Hugo templates](https://discourse.gohugo.io/t/42053/). - -```scss -// LibSass -@import "hugo:vars"; - -// Dart Sass -@use "hugo:vars" as v; -``` - -outputStyle -: (`string`) Output styles available to LibSass include `nested` (default), `expanded`, `compact`, and `compressed`. Output styles available to Dart Sass include `expanded` (default) and `compressed`. - -precision -: (`int`) Precision of floating point math. Not applicable to Dart Sass. - -enableSourceMap -: (`bool`) Whether to generate a source map. Default is `false`. - -sourceMapIncludeSources -: (`bool`) Whether to embed sources in the generated source map. Not applicable to LibSass. Default is `false`. - -includePaths -: (`slice`) A slice of paths, relative to the project root, that the transpiler will use when resolving `@use` and `@import` statements. - -```go-html-template -{{ $opts := dict - "transpiler" "dartsass" - "targetPath" "css/style.css" - "vars" site.Params.styles - "enableSourceMap" (not hugo.IsProduction) - "includePaths" (slice "node_modules/bootstrap/scss") -}} -{{ with resources.Get "sass/main.scss" | toCSS $opts | minify | fingerprint }} - -{{ end }} -``` - -silenceDeprecations -: (`slice`) {{< new-in 0.139.0 />}} A slice of deprecation IDs to silence. The deprecation IDs are printed to in the warning message, e.g "import" in `WARN Dart Sass: DEPRECATED [import] ...`. This is for Dart Sass only. - ## Dart Sass Hugo's extended and extended/deploy editions include [LibSass] to transpile Sass to CSS. In 2020, the Sass team deprecated LibSass in favor of [Dart Sass]. @@ -121,6 +117,9 @@ You may also install [prebuilt binaries] for Linux, macOS, and Windows. Run `hugo env` to list the active transpilers. +> [!note] +> If you build Hugo from source and run `mage test -v`, the test will fail if you install Dart Sass as a Snap package. This is due to the Snap package's strict confinement model. + ### Installing in a production environment For [CI/CD](g) deployments (e.g., GitHub Pages, GitLab Pages, Netlify, etc.) you must edit the workflow to install Dart Sass before Hugo builds the site[^2]. Some providers allow you to use one of the package managers above, or you can download and extract one of the prebuilt binaries. @@ -136,8 +135,6 @@ To install Dart Sass for your builds on GitHub Pages, add this step to the GitHu run: sudo snap install dart-sass ``` -If you are using GitHub Pages for the first time with your repository, GitHub provides a [starter workflow] for Hugo that includes Dart Sass. This is the simplest way to get started. - #### GitLab Pages To install Dart Sass for your builds on GitLab Pages, the `.gitlab-ci.yml` file should look something like this: @@ -194,34 +191,6 @@ command = """\ """ ``` -### Example - -To transpile with Dart Sass, set `transpiler` to `dartsass` in the options map passed to `css.Sass`. For example: - -```go-html-template -{{ with resources.Get "sass/main.scss" }} - {{ $opts := dict - "enableSourceMap" (not hugo.IsProduction) - "outputStyle" (cond hugo.IsProduction "compressed" "expanded") - "targetPath" "css/main.css" - "transpiler" "dartsass" - }} - {{ with . | toCSS $opts }} - {{ if hugo.IsProduction }} - {{ with . | fingerprint }} - - {{ end }} - {{ else }} - - {{ end }} - {{ end }} -{{ end }} -``` - -### Miscellaneous - -If you build Hugo from source and run `mage test -v`, the test will fail if you install Dart Sass as a Snap package. This is due to the Snap package's strict confinement model. - [brew.sh]: https://brew.sh/ [chocolatey.org]: https://community.chocolatey.org/packages/sass [dart sass]: https://sass-lang.com/dart-sass @@ -232,3 +201,4 @@ If you build Hugo from source and run `mage test -v`, the test will fail if you [snap package]: /installation/linux/#snap [snapcraft.io]: https://snapcraft.io/dart-sass [starter workflow]: https://github.com/actions/starter-workflows/blob/main/pages/hugo.yml +[`publishDir`]: /configuration/all/#publishdir diff --git a/content/en/functions/go-template/template.md b/content/en/functions/go-template/template.md index dac1fa3be..053cfcc22 100644 --- a/content/en/functions/go-template/template.md +++ b/content/en/functions/go-template/template.md @@ -10,7 +10,18 @@ params: signatures: ['template NAME [CONTEXT]'] --- -Use the `template` function to execute [embedded templates]. For example: +Use the `template` function to execute any of these [embedded templates](g): + +- [`disqus.html`] +- [`google_analytics.html`] +- [`opengraph.html`] +- [`pagination.html`] +- [`schema.html`] +- [`twitter_cards.html`] + + + +For example: ```go-html-template {{ range (.Paginate .Pages).Pages }} @@ -39,8 +50,21 @@ The example above can be rewritten using an [inline partial] template: {{ end }} ``` +The key distinctions between the preceding two examples are: + +1. Inline partials are globally scoped. That means that an inline partial defined in _one_ template may be called from _any_ template. +2. Leveraging the [`partialCached`] function when calling an inline partial allows for performance optimization through result caching. +3. An inline partial can [`return`] a value of any data type instead of rendering a string. + {{% include "/_common/functions/go-template/text-template.md" %}} +[`disqus.html`]: /templates/embedded/#disqus +[`google_analytics.html`]: /templates/embedded/#google-analytics +[`opengraph.html`]: /templates/embedded/#open-graph +[`pagination.html`]: /templates/embedded/#pagination +[`partialCached`]: /functions/partials/includecached/ [`partial`]: /functions/partials/include/ +[`return`]: /functions/go-template/return/ +[`schema.html`]: /templates/embedded/#schema +[`twitter_cards.html`]: /templates/embedded/#x-twitter-cards [inline partial]: /templates/partial/#inline-partials -[embedded templates]: /templates/embedded/ diff --git a/content/en/functions/templates/Current.md b/content/en/functions/templates/Current.md new file mode 100644 index 000000000..805aeec05 --- /dev/null +++ b/content/en/functions/templates/Current.md @@ -0,0 +1,155 @@ +--- +title: templates.Current +description: Returns information about the currently executing template. +categories: [] +keywords: [] +params: + functions_and_methods: + aliases: [] + returnType: tpl.CurrentTemplateInfo + signatures: [templates.Current] +--- + +> [!note] +> This function is experimental and subject to change. + +{{< new-in 0.146.0 />}} + +The `templates.Current` function provides introspection capabilities, allowing you to access details about the currently executing templates. This is useful for debugging complex template hierarchies and understanding the flow of execution during rendering. + +## Methods + +Ancestors +: (`tpl.CurrentTemplateInfos`) Returns a slice containing information about each template in the current execution chain, starting from the parent of the current template and going up towards the initial template called. It excludes any base template applied via `define` and `block`. You can chain the `Reverse` method to this result to get the slice in chronological execution order. + +Base +: (`tpl.CurrentTemplateInfoCommonOps`) Returns an object representing the base template that was applied to the current template, if any. This may be `nil`. + +Filename +: (`string`) Returns the absolute path of the current template. This will be empty for embedded templates. + +Name +: (`string`) Returns the name of the current template. This is usually the path relative to the layouts directory. + +Parent +: (`tpl.CurrentTemplateInfo`) Returns an object representing the parent of the current template, if any. This may be `nil`. + +## Examples + +The examples below help visualize template execution and require a `debug` parameter set to `true` in your site configuration: + +{{< code-toggle file=hugo >}} +[params] +debug = true +{{< /code-toggle >}} + +### Boundaries + +To visually mark where a template begins and ends execution: + +```go-html-template {file="layouts/_default/single.html"} +{{ define "main" }} + {{ if site.Params.debug }} +
[entering {{ templates.Current.Filename }}]
+ {{ end }} + +

{{ .Title }}

+ {{ .Content }} + + {{ if site.Params.debug }} +
[leaving {{ templates.Current.Filename }}]
+ {{ end }} +{{ end }} +``` + +### Call stack + +To display the chain of templates that led to the current one, create a partial template that iterates through its ancestors: + +```go-html-template {file="layouts/partials/template-call-stack.html" copy=true} +{{ with templates.Current }} +
+ {{ range .Ancestors }} + {{ .Filename }}
+ {{ with .Base }} + {{ .Filename }}
+ {{ end }} + {{ end }} +
+{{ end }} +``` + +Then call the partial from any template: + +```go-html-template {file="layouts/partials/footer/copyright.html" copy=true} +{{ if site.Params.debug }} + {{ partial "template-call-stack.html" . }} +{{ end }} +``` + +The rendered template stack would look something like this: + +```text +/home/user/project/layouts/partials/footer/copyright.html +/home/user/project/themes/foo/layouts/partials/footer.html +/home/user/project/layouts/_default/single.html +/home/user/project/themes/foo/layouts/_default/baseof.html +``` + +To reverse the order of the entries, chain the `Reverse` method to the `Ancestors` method: + +```go-html-template {file="layouts/partials/template-call-stack.html" copy=true} +{{ with templates.Current }} +
+ {{ range .Ancestors.Reverse }} + {{ with .Base }} + {{ .Filename }}
+ {{ end }} + {{ .Filename }}
+ {{ end }} +
+{{ end }} +``` + +### VS Code + +To render links that, when clicked, will open the template in Microsoft Visual Studio Code, create a partial template with anchor elements that use the `vscode` URI scheme: + +```go-html-template {file="layouts/partials/template-open-in-vs-code.html" copy=true} +{{ with templates.Current.Parent }} +
+ {{ .Name }} + {{ with .Base }} + {{ .Name }} + {{ end }} +
+{{ end }} +``` + +Then call the partial from any template: + +```go-html-template {file="layouts/_default/single.html" copy=true} +{{ define "main" }} +

{{ .Title }}

+ {{ .Content }} + + {{ if site.Params.debug }} + {{ partial "template-open-in-vs-code.html" . }} + {{ end }} +{{ end }} +``` + +Use the same approach to render the entire call stack as links: + +```go-html-template {file="layouts/partials/template-call-stack.html" copy=true} +{{ with templates.Current }} +
+ {{ range .Ancestors }} + {{ .Filename }}
+ {{ with .Base }} + {{ .Filename }}
+ {{ end }} + {{ end }} +
+{{ end }} +``` diff --git a/content/en/functions/time/In.md b/content/en/functions/time/In.md new file mode 100644 index 000000000..821eb99b7 --- /dev/null +++ b/content/en/functions/time/In.md @@ -0,0 +1,30 @@ +--- +title: time.In +description: Returns the given date/time as represented in the specified IANA time zone. +categories: [] +keywords: [] +params: + functions_and_methods: + aliases: [] + returnType: time.Time + signatures: [time.In TIMEZONE INPUT] +--- + +{{< new-in 0.146.0 />}} + +The `time.In` function returns the given date/time as represented in the specified [IANA](g) time zone. + +- If the time zone is an empty string or `UTC`, the time is returned in [UTC](g). +- If the time zone is `Local`, the time is returned in the system's local time zone. +- Otherwise, the time zone must be a valid IANA [time zone name]. + +[time zone name]: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List + +```go-html-template +{{ $layout := "2006-01-02T15:04:05-07:00" }} +{{ $t := time.AsTime "2025-03-31T14:45:00-00:00" }} + +{{ $t | time.In "America/Denver" | time.Format $layout }} → 2025-03-31T08:45:00-06:00 +{{ $t | time.In "Australia/Adelaide" | time.Format $layout }} → 2025-04-01T01:15:00+10:30 +{{ $t | time.In "Europe/Oslo" | time.Format $layout }} → 2025-03-31T16:45:00+02:00 +``` diff --git a/content/en/functions/transform/Unmarshal.md b/content/en/functions/transform/Unmarshal.md index d159122f5..93168294c 100644 --- a/content/en/functions/transform/Unmarshal.md +++ b/content/en/functions/transform/Unmarshal.md @@ -114,12 +114,14 @@ A remote resource is a file on a remote server, accessible via HTTP or HTTPS. > > `{{ $data = .Content | transform.Unmarshal }}` -## Options +## Working with CSV + +### Options When unmarshaling a CSV file, provide an optional map of options. delimiter -: (`string`) The delimiter used, default is `,`. +: (`string`) The delimiter used. Default is `,`. comment : (`string`) The comment character used in the CSV. If set, lines beginning with the comment character without preceding whitespace are ignored. @@ -128,8 +130,85 @@ lazyQuotes : {{< new-in 0.122.0 />}} : (`bool`) Whether to allow a quote in an unquoted field, or to allow a non-doubled quote in a quoted field. Default is `false`. +targetType +: {{< new-in 0.146.7 />}} +: (`string`) The target data type, either `slice` or `map`. Default is `slice`. + +### Examples + +The examples below use this CSV file: + +```csv +"name","type","breed","age" +"Spot","dog","Collie",3 +"Rover","dog","Boxer",5 +"Felix","cat","Calico",7 +``` + +To render an HTML table from a CSV file: + ```go-html-template -{{ $csv := "a;b;c" | transform.Unmarshal (dict "delimiter" ";") }} +{{ $data := slice }} +{{ $file := "pets.csv" }} +{{ with or (.Resources.Get $file) (resources.Get $file) }} + {{ $opts := dict "targetType" "slice" }} + {{ $data = transform.Unmarshal $opts . }} +{{ end }} + +{{ with $data }} + + + + {{ range index . 0 }} + + {{ end }} + + + + {{ range . | after 1 }} + + {{ range . }} + + {{ end }} + + {{ end }} + +
{{ . }}
{{ . }}
+{{ end }} +``` + +To extract a subset of the data, or to sort the data, unmarshal to a map instead of a slice: + +```go-html-template +{{ $data := slice }} +{{ $file := "pets.csv" }} +{{ with or (.Resources.Get $file) (resources.Get $file) }} + {{ $opts := dict "targetType" "map" }} + {{ $data = transform.Unmarshal $opts . }} +{{ end }} + +{{ with sort (where $data "type" "dog") "name" "asc" }} + + + + + + + + + + + {{ range . }} + + + + + + + {{ end }} + +
nametypebreedage
{{ .name }}{{ .type }}{{ .breed }}{{ .age }}
+{{ end }} ``` ## Working with XML diff --git a/content/en/host-and-deploy/host-on-github-pages/index.md b/content/en/host-and-deploy/host-on-github-pages/index.md index 4c00fbc8e..7c3201099 100644 --- a/content/en/host-and-deploy/host-on-github-pages/index.md +++ b/content/en/host-and-deploy/host-on-github-pages/index.md @@ -136,6 +136,8 @@ jobs: key: hugo-${{ github.run_id }} restore-keys: hugo- + - name: Configure Git + run: git config core.quotepath false - name: Build with Hugo run: | hugo \ diff --git a/content/en/host-and-deploy/host-on-gitlab-pages.md b/content/en/host-and-deploy/host-on-gitlab-pages.md index 4b308cc19..4750b0ff3 100644 --- a/content/en/host-and-deploy/host-on-gitlab-pages.md +++ b/content/en/host-and-deploy/host-on-gitlab-pages.md @@ -23,15 +23,15 @@ Define your [CI/CD](g) jobs by creating a `.gitlab-ci.yml` file in the root of y ```yaml {file=".gitlab-ci.yml" copy=true} variables: - DART_SASS_VERSION: 1.85.0 + DART_SASS_VERSION: 1.87.0 GIT_DEPTH: 0 GIT_STRATEGY: clone GIT_SUBMODULE_STRATEGY: recursive - HUGO_VERSION: 0.144.2 - NODE_VERSION: 23.x + HUGO_VERSION: 0.146.7 + NODE_VERSION: 22.x TZ: America/Los_Angeles image: - name: golang:1.23.4-bookworm + name: golang:1.24.2-bookworm pages: script: @@ -53,6 +53,8 @@ pages: - apt-get install -y nodejs # Install Node.js dependencies - "[[ -f package-lock.json || -f npm-shrinkwrap.json ]] && npm ci || true" + # Configure Git + - git config core.quotepath false # Build - hugo --gc --minify --baseURL ${CI_PAGES_URL} # Compress diff --git a/content/en/host-and-deploy/host-on-netlify/index.md b/content/en/host-and-deploy/host-on-netlify/index.md index f3601331a..4c89a6c1e 100644 --- a/content/en/host-and-deploy/host-on-netlify/index.md +++ b/content/en/host-and-deploy/host-on-netlify/index.md @@ -113,21 +113,23 @@ Create a new file named netlify.toml in the root of your project directory. In i ```toml {file="netlify.toml"} [build.environment] -HUGO_VERSION = "0.144.2" +GO_VERSION = "1.24" +HUGO_VERSION = "0.146.7" NODE_VERSION = "22" TZ = "America/Los_Angeles" [build] publish = "public" -command = "hugo --gc --minify" +command = "git config core.quotepath false && hugo --gc --minify" ``` If your site requires Dart Sass to transpile Sass to CSS, the configuration file should look something like this: ```toml {file="netlify.toml"} [build.environment] -HUGO_VERSION = "0.144.2" -DART_SASS_VERSION = "1.85.0" +DART_SASS_VERSION = "1.87.0" +GO_VERSION = "1.24" +HUGO_VERSION = "0.146.7" NODE_VERSION = "22" TZ = "America/Los_Angeles" @@ -138,6 +140,7 @@ command = """\ tar -xf dart-sass-${DART_SASS_VERSION}-linux-x64.tar.gz && \ rm dart-sass-${DART_SASS_VERSION}-linux-x64.tar.gz && \ export PATH=/opt/build/repo/dart-sass:$PATH && \ + git config core.quotepath false && \ hugo --gc --minify \ """ ``` diff --git a/content/en/installation/linux.md b/content/en/installation/linux.md index 731cfce4c..591bf0818 100644 --- a/content/en/installation/linux.md +++ b/content/en/installation/linux.md @@ -30,17 +30,33 @@ To install the extended edition of Hugo: sudo snap install hugo ``` -To enable or revoke access to removable media: +To control automatic updates: ```sh +# disable automatic updates +sudo snap refresh --hold hugo + +# enable automatic updates +sudo snap refresh --unhold hugo +``` + +To control access to removable media: + +```sh +# allow access sudo snap connect hugo:removable-media + +# revoke access sudo snap disconnect hugo:removable-media ``` -To enable or revoke access to SSH keys: +To control access to SSH keys: ```sh +# allow access sudo snap connect hugo:ssh-keys + +# revoke access sudo snap disconnect hugo:ssh-keys ``` diff --git a/content/en/news/_content.gotmpl b/content/en/news/_content.gotmpl index f979c9adc..af3cf47ed 100644 --- a/content/en/news/_content.gotmpl +++ b/content/en/news/_content.gotmpl @@ -23,7 +23,8 @@ "dates" $dates "kind" "page" "params" $params - "path" .name + "path" (strings.Replace .name "." "-") + "slug" .name "title" (printf "Release %s" .name) }} {{ $.AddPage $page }} diff --git a/content/en/quick-reference/glossary/iana.md b/content/en/quick-reference/glossary/iana.md new file mode 100644 index 000000000..89497f76a --- /dev/null +++ b/content/en/quick-reference/glossary/iana.md @@ -0,0 +1,6 @@ +--- +title: IANA +reference: https://www.iana.org/about +--- + +_IANA_ is an abbreviation for the Internet Assigned Numbers Authority, a non-profit organization that manages the allocation of global IP addresses, autonomous system numbers, DNS root zone, media types, and other Internet Protocol-related resources. diff --git a/content/en/quick-reference/glossary/utc.md b/content/en/quick-reference/glossary/utc.md new file mode 100644 index 000000000..a4627be5a --- /dev/null +++ b/content/en/quick-reference/glossary/utc.md @@ -0,0 +1,6 @@ +--- +title: UTC +reference: https://en.wikipedia.org/wiki/Coordinated_Universal_Time +--- + +_UTC_ is an abbreviation for Coordinated Universal Time, the primary time standard used worldwide to regulate clocks and time. It is the basis for civil time and time zones across the globe. diff --git a/content/en/shortcodes/ref.md b/content/en/shortcodes/ref.md index 2f821254c..a52c2bf6e 100755 --- a/content/en/shortcodes/ref.md +++ b/content/en/shortcodes/ref.md @@ -10,7 +10,7 @@ keywords: [] > To override Hugo's embedded `ref` shortcode, copy the [source code] to a file with the same name in the `layouts/shortcodes` directory. > [!note] -> When working with the Markdown [content format], this shortcode has become largely redundant. Its functionality is now primarily handled by [link render hooks], specifically the embedded one provided by Hugo. This hook effectively addresses all the use cases previously covered by this shortcode. +> When working with Markdown, this shortcode is obsolete. Instead, use a [link render hook] that resolves the link destination using the `GetPage` method on the `Page` object. You can either create your own, or simply enable the [embedded link render hook]. The embedded link render hook is automatically enabled for multilingual single-host projects. ## Usage @@ -56,6 +56,7 @@ Rendered: {{% include "_common/ref-and-relref-error-handling.md" %}} [content format]: /content-management/formats/ -[link render hooks]: /render-hooks/images/#default +[embedded link render hook]: /render-hooks/links/#default +[link render hook]: /render-hooks/links/ [Markdown notation]: /content-management/shortcodes/#notation -[source code]: {{% eturl ref %}} +[source code]: {{% eturl relref %}} diff --git a/content/en/shortcodes/relref.md b/content/en/shortcodes/relref.md index 5b413b87e..219eae81a 100755 --- a/content/en/shortcodes/relref.md +++ b/content/en/shortcodes/relref.md @@ -10,7 +10,7 @@ keywords: [] > To override Hugo's embedded `relref` shortcode, copy the [source code] to a file with the same name in the `layouts/shortcodes` directory. > [!note] -> When working with the Markdown [content format], this shortcode has become largely redundant. Its functionality is now primarily handled by [link render hooks], specifically the embedded one provided by Hugo. This hook effectively addresses all the use cases previously covered by this shortcode. +> When working with Markdown, this shortcode is obsolete. Instead, use a [link render hook] that resolves the link destination using the `GetPage` method on the `Page` object. You can either create your own, or simply enable the [embedded link render hook]. The embedded link render hook is automatically enabled for multilingual single-host projects. ## Usage @@ -56,6 +56,7 @@ Rendered: {{% include "_common/ref-and-relref-error-handling.md" %}} [content format]: /content-management/formats/ -[link render hooks]: /render-hooks/links/ +[embedded link render hook]: /render-hooks/links/#default +[link render hook]: /render-hooks/links/ [Markdown notation]: /content-management/shortcodes/#notation [source code]: {{% eturl relref %}} diff --git a/content/en/shortcodes/vimeo.md b/content/en/shortcodes/vimeo.md index c354eefe0..1164ce997 100755 --- a/content/en/shortcodes/vimeo.md +++ b/content/en/shortcodes/vimeo.md @@ -29,19 +29,27 @@ Hugo renders this to: ## Arguments +id +: (string) The video `id`. Optional if the `id` is provided as a positional argument as shown in the example above. + +allowFullScreen +: {{< new-in 0.146.0 />}} +: (`bool`) Whether the `iframe` element can activate full screen mode. Default is `true`. + class : (`string`) The `class` attribute of the wrapping `div` element. Adding one or more CSS classes disables inline styling. -id -: (`string`) The `id` of the Vimeo video +loading +: {{< new-in 0.146.0 />}} +: (`string`) The loading attribute of the `iframe` element, either `eager` or `lazy`. Default is `eager`. title : (`string`) The `title` attribute of the `iframe` element. -If you provide a `class` or `title` you must use a named parameter for the `id`. +Here's an example using some of the available arguments: ```text -{{}} +{{}} ``` ## Privacy diff --git a/content/en/shortcodes/youtube.md b/content/en/shortcodes/youtube.md index 18c5ae6c2..ed3cf0632 100755 --- a/content/en/shortcodes/youtube.md +++ b/content/en/shortcodes/youtube.md @@ -70,7 +70,7 @@ start title : (`string`) The `title` attribute of the `iframe` element. Defaults to "YouTube video". -Example using some of the above: +Here's an example using some of the available arguments: ```text {{}} diff --git a/content/en/templates/embedded.md b/content/en/templates/embedded.md index 198136393..ecfd90514 100644 --- a/content/en/templates/embedded.md +++ b/content/en/templates/embedded.md @@ -1,6 +1,6 @@ --- -title: Embedded templates -description: Hugo provides embedded templates for common use cases. +title: Embedded partial templates +description: Hugo provides embedded partial templates for common use cases. categories: [] keywords: [] weight: 170 @@ -145,6 +145,10 @@ Various optional metadata can also be set: If using YouTube this will produce a og:video tag like ``. Use the `https://youtu.be/` format with YouTube videos (example: `https://youtu.be/qtIqKaDlqXo`). +## Pagination + +See [details](/templates/pagination/). + ## Schema > [!note] diff --git a/content/en/templates/partial.md b/content/en/templates/partial.md index 8493a4674..7ff2d9594 100644 --- a/content/en/templates/partial.md +++ b/content/en/templates/partial.md @@ -49,7 +49,7 @@ As shown in the above example directory structure, you can nest your directories ### Variable scoping -The second argument in a partial call is the variable being passed down. The above examples are passing the `.`, which tells the template receiving the partial to apply the current [context][context]. +The second argument in a partial call is the variable being passed down. The above examples are passing the dot (`.`), which tells the template receiving the partial to apply the current [context][context]. This means the partial will *only* be able to access those variables. The partial is isolated and cannot access the outer scope. From within the partial, `$.Var` is equivalent to `.Var`. diff --git a/content/en/templates/shortcode.md b/content/en/templates/shortcode.md index 711d342cb..3ed573651 100644 --- a/content/en/templates/shortcode.md +++ b/content/en/templates/shortcode.md @@ -329,7 +329,7 @@ You can use the `HasShortcode` method in your base template to conditionally loa [`with`]: /functions/go-template/with/ [content management]: /content-management/shortcodes/ [embedded shortcodes]: /shortcodes/ -[GitHub]: https://github.com/gohugoio/hugo/tree/master/tpl/tplimpl/embedded/templates/shortcodes +[GitHub]: https://github.com/gohugoio/hugo/tree/master/tpl/tplimpl/embedded/templates/_shortcodes [introduction to templating]: /templates/introduction/ [Markdown notation]: /content-management/shortcodes/#markdown-notation [named or positional]: /content-management/shortcodes/#arguments diff --git a/content/en/troubleshooting/inspection.md b/content/en/troubleshooting/inspection.md index dc662243a..ea3c097f9 100644 --- a/content/en/troubleshooting/inspection.md +++ b/content/en/troubleshooting/inspection.md @@ -34,6 +34,11 @@ Use the [`printf`] function (render) or [`warnf`] function (log to console) to i {{ printf "%[1]v (%[1]T)" $value }} → 42 (int) ``` +{{< new-in 0.146.0 />}} + +Use the [`templates.Current`] function to visually mark template execution boundaries or to display the template call stack. + [`debug.Dump`]: /functions/debug/dump/ [`printf`]: /functions/fmt/printf/ [`warnf`]: /functions/fmt/warnf/ +[`templates.Current`]: /functions/templates/current/ diff --git a/data/embedded_template_urls.toml b/data/embedded_template_urls.toml index f75b14f12..b2a796cd1 100644 --- a/data/embedded_template_urls.toml +++ b/data/embedded_template_urls.toml @@ -4,39 +4,39 @@ # BaseURL 'base_url' = 'https://github.com/gohugoio/hugo/blob/master/tpl/tplimpl/embedded/templates' -# Templates -'alias' = 'alias.html' -'disqus' = 'disqus.html' -'google_analytics' = 'google_analytics.html' -'opengraph' = 'opengraph.html' -'pagination' = 'pagination.html' -'robots' = '_default/robots.txt' -'rss' = '_default/rss.xml' -'schema' = 'schema.html' -'sitemap' = '_default/sitemap.xml' -'sitemapindex' = '_default/sitemapindex.xml' -'twitter_cards' = 'twitter_cards.html' +# Partials +'disqus' = '_partials/disqus.html' +'google_analytics' = '_partials/google_analytics.html' +'opengraph' = '_partials/opengraph.html' +'pagination' = '_partials/pagination.html' +'schema' = '_partials/schema.html' +'twitter_cards' = '_partials/twitter_cards.html' # Render hooks -'render-codeblock-goat' = '_default/_markup/render-codeblock-goat.html' -'render-image' = '_default/_markup/render-image.html' -'render-link' = '_default/_markup/render-link.html' -'render-table' = '_default/_markup/render-table.html' +'render-codeblock-goat' = '_markup/render-codeblock-goat.html' +'render-image' = '_markup/render-image.html' +'render-link' = '_markup/render-link.html' +'render-table' = '_markup/render-table.html' # Shortcodes -'details' = 'shortcodes/details.html' -'figure' = 'shortcodes/figure.html' -'gist' = 'shortcodes/gist.html' -'highlight' = 'shortcodes/highlight.html' -'instagram' = 'shortcodes/instagram.html' -'param' = 'shortcodes/param.html' -'qr' = 'shortcodes/qr.html' -'ref' = 'shortcodes/ref.html' -'relref' = 'shortcodes/relref.html' -'twitter' = 'shortcodes/twitter.html' -'twitter_simple' = 'shortcodes/twitter_simple.html' -'vimeo' = 'shortcodes/vimeo.html' -'vimeo_simple' = 'shortcodes/vimeo_simple.html' -'x' = 'shortcodes/x.html' -'x_simple' = 'shortcodes/x_simple.html' -'youtube' = 'shortcodes/youtube.html' +'details' = '_shortcodes/details.html' +'figure' = '_shortcodes/figure.html' +'gist' = '_shortcodes/gist.html' +'highlight' = '_shortcodes/highlight.html' +'instagram' = '_shortcodes/instagram.html' +'param' = '_shortcodes/param.html' +'qr' = '_shortcodes/qr.html' +'ref' = '_shortcodes/ref.html' +'relref' = '_shortcodes/relref.html' +'vimeo' = '_shortcodes/vimeo.html' +'vimeo_simple' = '_shortcodes/vimeo_simple.html' +'x' = '_shortcodes/x.html' +'x_simple' = '_shortcodes/x_simple.html' +'youtube' = '_shortcodes/youtube.html' + +# Other +'alias' = 'alias.html' +'robots' = 'robots.txt' +'rss' = 'rss.xml' +'sitemap' = 'sitemap.xml' +'sitemapindex' = 'sitemapindex.xml' diff --git a/layouts/_default/_markup/render-blockquote.html b/layouts/_markup/render-blockquote.html similarity index 100% rename from layouts/_default/_markup/render-blockquote.html rename to layouts/_markup/render-blockquote.html diff --git a/layouts/_default/_markup/render-codeblock.html b/layouts/_markup/render-codeblock.html similarity index 100% rename from layouts/_default/_markup/render-codeblock.html rename to layouts/_markup/render-codeblock.html diff --git a/layouts/_default/_markup/render-link.html b/layouts/_markup/render-link.html similarity index 98% rename from layouts/_default/_markup/render-link.html rename to layouts/_markup/render-link.html index 88e3cbee5..70011220e 100644 --- a/layouts/_default/_markup/render-link.html +++ b/layouts/_markup/render-link.html @@ -196,7 +196,7 @@ either of these shortcodes in conjunction with this render hook. >{{ .Text }} -{{- define "partials/inline/h-rh-l/validate-fragment.html" }} +{{- define "_partials/inline/h-rh-l/validate-fragment.html" }} {{- /* Validates the fragment portion of a link destination. @@ -248,7 +248,7 @@ either of these shortcodes in conjunction with this render hook. {{- end }} {{- end }} -{{- define "partials/inline/h-rh-l/get-glossary-link-attributes.html" }} +{{- define "_partials/inline/h-rh-l/get-glossary-link-attributes.html" }} {{- /* Returns the anchor element attributes for a link to the given glossary term. diff --git a/layouts/_default/_markup/render-passthrough.html b/layouts/_markup/render-passthrough.html similarity index 100% rename from layouts/_default/_markup/render-passthrough.html rename to layouts/_markup/render-passthrough.html diff --git a/layouts/_default/_markup/render-table.html b/layouts/_markup/render-table.html similarity index 100% rename from layouts/_default/_markup/render-table.html rename to layouts/_markup/render-table.html diff --git a/layouts/partials/docs/functions-aliases.html b/layouts/_partials/docs/functions-aliases.html similarity index 100% rename from layouts/partials/docs/functions-aliases.html rename to layouts/_partials/docs/functions-aliases.html diff --git a/layouts/partials/docs/functions-return-type.html b/layouts/_partials/docs/functions-return-type.html similarity index 100% rename from layouts/partials/docs/functions-return-type.html rename to layouts/_partials/docs/functions-return-type.html diff --git a/layouts/partials/docs/functions-signatures.html b/layouts/_partials/docs/functions-signatures.html similarity index 100% rename from layouts/partials/docs/functions-signatures.html rename to layouts/_partials/docs/functions-signatures.html diff --git a/layouts/partials/helpers/debug/list-item-metadata.html b/layouts/_partials/helpers/debug/list-item-metadata.html similarity index 100% rename from layouts/partials/helpers/debug/list-item-metadata.html rename to layouts/_partials/helpers/debug/list-item-metadata.html diff --git a/layouts/partials/helpers/funcs/color-from-string.html b/layouts/_partials/helpers/funcs/color-from-string.html similarity index 100% rename from layouts/partials/helpers/funcs/color-from-string.html rename to layouts/_partials/helpers/funcs/color-from-string.html diff --git a/layouts/partials/helpers/funcs/get-github-info.html b/layouts/_partials/helpers/funcs/get-github-info.html similarity index 100% rename from layouts/partials/helpers/funcs/get-github-info.html rename to layouts/_partials/helpers/funcs/get-github-info.html diff --git a/layouts/partials/helpers/funcs/get-remote-data.html b/layouts/_partials/helpers/funcs/get-remote-data.html similarity index 100% rename from layouts/partials/helpers/funcs/get-remote-data.html rename to layouts/_partials/helpers/funcs/get-remote-data.html diff --git a/layouts/partials/helpers/gtag.html b/layouts/_partials/helpers/gtag.html similarity index 100% rename from layouts/partials/helpers/gtag.html rename to layouts/_partials/helpers/gtag.html diff --git a/layouts/partials/helpers/linkcss.html b/layouts/_partials/helpers/linkcss.html similarity index 100% rename from layouts/partials/helpers/linkcss.html rename to layouts/_partials/helpers/linkcss.html diff --git a/layouts/partials/helpers/linkjs.html b/layouts/_partials/helpers/linkjs.html similarity index 100% rename from layouts/partials/helpers/linkjs.html rename to layouts/_partials/helpers/linkjs.html diff --git a/layouts/partials/helpers/picture.html b/layouts/_partials/helpers/picture.html similarity index 92% rename from layouts/partials/helpers/picture.html rename to layouts/_partials/helpers/picture.html index 454dd705e..4dc16c002 100644 --- a/layouts/partials/helpers/picture.html +++ b/layouts/_partials/helpers/picture.html @@ -5,6 +5,7 @@ {{ $image1x := $image.Resize (printf "%dx" $width1x) }} {{ $image1xWebp := $image.Resize (printf "%dx webp" $width1x) }} {{ $class := .class | default "h-64 tablet:h-96 lg:h-full w-full object-cover lg:absolute" }} +{{ $loading := .loading | default "eager" }} diff --git a/layouts/partials/helpers/validation/validate-keywords.html b/layouts/_partials/helpers/validation/validate-keywords.html similarity index 100% rename from layouts/partials/helpers/validation/validate-keywords.html rename to layouts/_partials/helpers/validation/validate-keywords.html diff --git a/layouts/partials/layouts/blocks/alert.html b/layouts/_partials/layouts/blocks/alert.html similarity index 100% rename from layouts/partials/layouts/blocks/alert.html rename to layouts/_partials/layouts/blocks/alert.html diff --git a/layouts/partials/layouts/blocks/modal.html b/layouts/_partials/layouts/blocks/modal.html similarity index 100% rename from layouts/partials/layouts/blocks/modal.html rename to layouts/_partials/layouts/blocks/modal.html diff --git a/layouts/partials/layouts/breadcrumbs.html b/layouts/_partials/layouts/breadcrumbs.html similarity index 100% rename from layouts/partials/layouts/breadcrumbs.html rename to layouts/_partials/layouts/breadcrumbs.html diff --git a/layouts/partials/layouts/date.html b/layouts/_partials/layouts/date.html similarity index 100% rename from layouts/partials/layouts/date.html rename to layouts/_partials/layouts/date.html diff --git a/layouts/partials/layouts/docsheader.html b/layouts/_partials/layouts/docsheader.html similarity index 100% rename from layouts/partials/layouts/docsheader.html rename to layouts/_partials/layouts/docsheader.html diff --git a/layouts/partials/layouts/explorer.html b/layouts/_partials/layouts/explorer.html similarity index 100% rename from layouts/partials/layouts/explorer.html rename to layouts/_partials/layouts/explorer.html diff --git a/layouts/partials/layouts/footer.html b/layouts/_partials/layouts/footer.html similarity index 100% rename from layouts/partials/layouts/footer.html rename to layouts/_partials/layouts/footer.html diff --git a/layouts/partials/layouts/head/head-js.html b/layouts/_partials/layouts/head/head-js.html similarity index 100% rename from layouts/partials/layouts/head/head-js.html rename to layouts/_partials/layouts/head/head-js.html diff --git a/layouts/partials/layouts/head/head.html b/layouts/_partials/layouts/head/head.html similarity index 100% rename from layouts/partials/layouts/head/head.html rename to layouts/_partials/layouts/head/head.html diff --git a/layouts/partials/layouts/header/githubstars.html b/layouts/_partials/layouts/header/githubstars.html similarity index 100% rename from layouts/partials/layouts/header/githubstars.html rename to layouts/_partials/layouts/header/githubstars.html diff --git a/layouts/partials/layouts/header/header.html b/layouts/_partials/layouts/header/header.html similarity index 100% rename from layouts/partials/layouts/header/header.html rename to layouts/_partials/layouts/header/header.html diff --git a/layouts/partials/layouts/header/qr.html b/layouts/_partials/layouts/header/qr.html similarity index 96% rename from layouts/partials/layouts/header/qr.html rename to layouts/_partials/layouts/header/qr.html index ccc0ee959..fea64f625 100644 --- a/layouts/partials/layouts/header/qr.html +++ b/layouts/_partials/layouts/header/qr.html @@ -10,7 +10,7 @@ {{ partial "layouts/blocks/modal.html" (dict "modal_button" $qr "modal_content" $qrBig "modal_title" (printf "QR code linking to %s" $.Permalink )) }} -{{ define "partials/_inline/qr" }} +{{ define "_partials/_inline/qr" }} {{ $img_class := .img_class | default "w-10" }} {{ with images.QR $.page.Permalink (dict "targetDir" "images/qr") }} diff --git a/layouts/partials/layouts/header/theme.html b/layouts/_partials/layouts/header/theme.html similarity index 100% rename from layouts/partials/layouts/header/theme.html rename to layouts/_partials/layouts/header/theme.html diff --git a/layouts/partials/layouts/home/features.html b/layouts/_partials/layouts/home/features.html similarity index 100% rename from layouts/partials/layouts/home/features.html rename to layouts/_partials/layouts/home/features.html diff --git a/layouts/partials/layouts/home/opensource.html b/layouts/_partials/layouts/home/opensource.html similarity index 100% rename from layouts/partials/layouts/home/opensource.html rename to layouts/_partials/layouts/home/opensource.html diff --git a/layouts/partials/layouts/home/sponsors.html b/layouts/_partials/layouts/home/sponsors.html similarity index 100% rename from layouts/partials/layouts/home/sponsors.html rename to layouts/_partials/layouts/home/sponsors.html diff --git a/layouts/partials/layouts/hooks/body-end.html b/layouts/_partials/layouts/hooks/body-end.html similarity index 100% rename from layouts/partials/layouts/hooks/body-end.html rename to layouts/_partials/layouts/hooks/body-end.html diff --git a/layouts/partials/layouts/hooks/body-main-start.html b/layouts/_partials/layouts/hooks/body-main-start.html similarity index 100% rename from layouts/partials/layouts/hooks/body-main-start.html rename to layouts/_partials/layouts/hooks/body-main-start.html diff --git a/layouts/partials/layouts/hooks/body-start.html b/layouts/_partials/layouts/hooks/body-start.html similarity index 100% rename from layouts/partials/layouts/hooks/body-start.html rename to layouts/_partials/layouts/hooks/body-start.html diff --git a/layouts/partials/layouts/icons.html b/layouts/_partials/layouts/icons.html similarity index 100% rename from layouts/partials/layouts/icons.html rename to layouts/_partials/layouts/icons.html diff --git a/layouts/partials/layouts/in-this-section.html b/layouts/_partials/layouts/in-this-section.html similarity index 100% rename from layouts/partials/layouts/in-this-section.html rename to layouts/_partials/layouts/in-this-section.html diff --git a/layouts/partials/layouts/page-edit.html b/layouts/_partials/layouts/page-edit.html similarity index 100% rename from layouts/partials/layouts/page-edit.html rename to layouts/_partials/layouts/page-edit.html diff --git a/layouts/partials/layouts/related.html b/layouts/_partials/layouts/related.html similarity index 100% rename from layouts/partials/layouts/related.html rename to layouts/_partials/layouts/related.html diff --git a/layouts/partials/layouts/search/algolialogo.html b/layouts/_partials/layouts/search/algolialogo.html similarity index 100% rename from layouts/partials/layouts/search/algolialogo.html rename to layouts/_partials/layouts/search/algolialogo.html diff --git a/layouts/partials/layouts/search/button.html b/layouts/_partials/layouts/search/button.html similarity index 100% rename from layouts/partials/layouts/search/button.html rename to layouts/_partials/layouts/search/button.html diff --git a/layouts/partials/layouts/search/input.html b/layouts/_partials/layouts/search/input.html similarity index 100% rename from layouts/partials/layouts/search/input.html rename to layouts/_partials/layouts/search/input.html diff --git a/layouts/partials/layouts/search/results.html b/layouts/_partials/layouts/search/results.html similarity index 100% rename from layouts/partials/layouts/search/results.html rename to layouts/_partials/layouts/search/results.html diff --git a/layouts/partials/layouts/templates.html b/layouts/_partials/layouts/templates.html similarity index 100% rename from layouts/partials/layouts/templates.html rename to layouts/_partials/layouts/templates.html diff --git a/layouts/partials/layouts/toc.html b/layouts/_partials/layouts/toc.html similarity index 100% rename from layouts/partials/layouts/toc.html rename to layouts/_partials/layouts/toc.html diff --git a/layouts/partials/opengraph/get-featured-image.html b/layouts/_partials/opengraph/get-featured-image.html similarity index 100% rename from layouts/partials/opengraph/get-featured-image.html rename to layouts/_partials/opengraph/get-featured-image.html diff --git a/layouts/partials/opengraph/opengraph.html b/layouts/_partials/opengraph/opengraph.html similarity index 100% rename from layouts/partials/opengraph/opengraph.html rename to layouts/_partials/opengraph/opengraph.html diff --git a/layouts/shortcodes/chroma-lexers.html b/layouts/_shortcodes/chroma-lexers.html similarity index 100% rename from layouts/shortcodes/chroma-lexers.html rename to layouts/_shortcodes/chroma-lexers.html diff --git a/layouts/shortcodes/code-toggle.html b/layouts/_shortcodes/code-toggle.html similarity index 100% rename from layouts/shortcodes/code-toggle.html rename to layouts/_shortcodes/code-toggle.html diff --git a/layouts/shortcodes/datatable-filtered.html b/layouts/_shortcodes/datatable-filtered.html similarity index 100% rename from layouts/shortcodes/datatable-filtered.html rename to layouts/_shortcodes/datatable-filtered.html diff --git a/layouts/shortcodes/datatable.html b/layouts/_shortcodes/datatable.html similarity index 100% rename from layouts/shortcodes/datatable.html rename to layouts/_shortcodes/datatable.html diff --git a/layouts/shortcodes/deprecated-in.html b/layouts/_shortcodes/deprecated-in.html similarity index 100% rename from layouts/shortcodes/deprecated-in.html rename to layouts/_shortcodes/deprecated-in.html diff --git a/layouts/shortcodes/eturl.html b/layouts/_shortcodes/eturl.html similarity index 100% rename from layouts/shortcodes/eturl.html rename to layouts/_shortcodes/eturl.html diff --git a/layouts/shortcodes/glossary-term.html b/layouts/_shortcodes/glossary-term.html similarity index 100% rename from layouts/shortcodes/glossary-term.html rename to layouts/_shortcodes/glossary-term.html diff --git a/layouts/shortcodes/glossary.html b/layouts/_shortcodes/glossary.html similarity index 100% rename from layouts/shortcodes/glossary.html rename to layouts/_shortcodes/glossary.html diff --git a/layouts/shortcodes/hl.html b/layouts/_shortcodes/hl.html similarity index 100% rename from layouts/shortcodes/hl.html rename to layouts/_shortcodes/hl.html diff --git a/layouts/shortcodes/img.html b/layouts/_shortcodes/img.html similarity index 99% rename from layouts/shortcodes/img.html rename to layouts/_shortcodes/img.html index 60187802e..e49afc57f 100644 --- a/layouts/shortcodes/img.html +++ b/layouts/_shortcodes/img.html @@ -359,7 +359,7 @@ When using the padding filter, provide all arguments in this order: {{- end }} {{- end }} -{{- define "partials/inline/get-resource.html" }} +{{- define "_partials/inline/get-resource.html" }} {{- $r := "" }} {{- $u := urls.Parse .src }} {{- $msg := "The %q shortcode was unable to resolve %s. See %s" }} diff --git a/layouts/shortcodes/imgproc.html b/layouts/_shortcodes/imgproc.html similarity index 100% rename from layouts/shortcodes/imgproc.html rename to layouts/_shortcodes/imgproc.html diff --git a/layouts/shortcodes/include.html b/layouts/_shortcodes/include.html similarity index 100% rename from layouts/shortcodes/include.html rename to layouts/_shortcodes/include.html diff --git a/layouts/shortcodes/list-pages-in-section.html b/layouts/_shortcodes/list-pages-in-section.html similarity index 100% rename from layouts/shortcodes/list-pages-in-section.html rename to layouts/_shortcodes/list-pages-in-section.html diff --git a/layouts/shortcodes/module-mounts-note.html b/layouts/_shortcodes/module-mounts-note.html similarity index 100% rename from layouts/shortcodes/module-mounts-note.html rename to layouts/_shortcodes/module-mounts-note.html diff --git a/layouts/shortcodes/new-in.html b/layouts/_shortcodes/new-in.html similarity index 100% rename from layouts/shortcodes/new-in.html rename to layouts/_shortcodes/new-in.html diff --git a/layouts/shortcodes/per-lang-config-keys.html b/layouts/_shortcodes/per-lang-config-keys.html similarity index 97% rename from layouts/shortcodes/per-lang-config-keys.html rename to layouts/_shortcodes/per-lang-config-keys.html index f6090d555..31d7daf6a 100644 --- a/layouts/shortcodes/per-lang-config-keys.html +++ b/layouts/_shortcodes/per-lang-config-keys.html @@ -14,8 +14,8 @@ separately for each language. (dict "contentDir" "/configuration/all/#contentdir") (dict "copyright" "/configuration/all/#copyright") (dict "disableAliases" "/configuration/all/#disablealiases") - (dict "disableHugoGeneratorInject" "/configuration/all/#disableHugogeneratorinject") - (dict "disableKinds" "/configuration/all/#disableKinds") + (dict "disableHugoGeneratorInject" "/configuration/all/#disablehugogeneratorinject") + (dict "disableKinds" "/configuration/all/#disablekinds") (dict "disableLiveReload" "/configuration/all/#disablelivereload") (dict "disablePathToLower" "/configuration/all/#disablepathtolower") (dict "enableEmoji " "/configuration/all/#enableemoji") diff --git a/layouts/shortcodes/quick-reference.html b/layouts/_shortcodes/quick-reference.html similarity index 100% rename from layouts/shortcodes/quick-reference.html rename to layouts/_shortcodes/quick-reference.html diff --git a/layouts/shortcodes/root-configuration-keys.html b/layouts/_shortcodes/root-configuration-keys.html similarity index 100% rename from layouts/shortcodes/root-configuration-keys.html rename to layouts/_shortcodes/root-configuration-keys.html diff --git a/layouts/shortcodes/syntax-highlighting-styles.html b/layouts/_shortcodes/syntax-highlighting-styles.html similarity index 100% rename from layouts/shortcodes/syntax-highlighting-styles.html rename to layouts/_shortcodes/syntax-highlighting-styles.html diff --git a/layouts/_default/baseof.html b/layouts/baseof.html similarity index 98% rename from layouts/_default/baseof.html rename to layouts/baseof.html index 1f4952146..4c14a6b6d 100644 --- a/layouts/_default/baseof.html +++ b/layouts/baseof.html @@ -44,6 +44,8 @@ {{ block "header" . }} {{ partial "layouts/header/header.html" . }} {{ end }} + {{ block "subheader" . }} + {{ end }} {{ block "hero" . }} {{ end }}
diff --git a/layouts/index.headers b/layouts/home.headers similarity index 100% rename from layouts/index.headers rename to layouts/home.headers diff --git a/layouts/index.html b/layouts/home.html similarity index 100% rename from layouts/index.html rename to layouts/home.html diff --git a/layouts/index.redir b/layouts/home.redir similarity index 100% rename from layouts/index.redir rename to layouts/home.redir diff --git a/layouts/_default/list.html b/layouts/list.html similarity index 100% rename from layouts/_default/list.html rename to layouts/list.html diff --git a/layouts/_default/list.rss.xml b/layouts/list.rss.xml similarity index 100% rename from layouts/_default/list.rss.xml rename to layouts/list.rss.xml diff --git a/layouts/_default/single.html b/layouts/single.html similarity index 100% rename from layouts/_default/single.html rename to layouts/single.html diff --git a/netlify.toml b/netlify.toml index 67c146cad..c24a32a60 100644 --- a/netlify.toml +++ b/netlify.toml @@ -3,7 +3,7 @@ command = "hugo --gc --minify" [build.environment] - HUGO_VERSION = "0.145.0" + HUGO_VERSION = "0.146.7" [context.production.environment] HUGO_ENV = "production" diff --git a/package.hugo.json b/package.hugo.json new file mode 100644 index 000000000..24ffc7ff5 --- /dev/null +++ b/package.hugo.json @@ -0,0 +1,25 @@ +{ + "name": "hugoDocs", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "", + "devDependencies": { + "@awmottaz/prettier-plugin-void-html": "~1.8.0", + "@tailwindcss/cli": "~4.1.0", + "@tailwindcss/typography": "~0.5.16", + "prettier": "~3.5.3", + "prettier-plugin-go-template": "~0.0.15", + "tailwindcss": "~4.1.0" + }, + "dependencies": { + "@alpinejs/focus": "~3.14.9", + "@alpinejs/persist": "~3.14.9", + "@hotwired/turbo": "~8.0.13", + "alpinejs": "~3.14.9" + } +} From 179aea11ac2ce80a38b211e11fd513cead63b17e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Wed, 23 Apr 2025 16:27:14 +0200 Subject: [PATCH 042/129] config: Fix _merge issue when key doesn't exist on the left side Fixes #13643 Fixes #13646 --- config/allconfig/allconfig.go | 100 ++++++++++++++---- .../allconfig/allconfig_integration_test.go | 60 +++++++++++ config/allconfig/alldecoders.go | 26 +++-- config/allconfig/load.go | 60 +---------- config/commonConfig.go | 2 +- config/services/servicesConfig.go | 3 + hugolib/config_test.go | 4 +- 7 files changed, 165 insertions(+), 90 deletions(-) diff --git a/config/allconfig/allconfig.go b/config/allconfig/allconfig.go index e73153a94..d3ee28490 100644 --- a/config/allconfig/allconfig.go +++ b/config/allconfig/allconfig.go @@ -800,30 +800,58 @@ func (c *Configs) IsZero() bool { func (c *Configs) Init() error { var languages langs.Languages - defaultContentLanguage := c.Base.DefaultContentLanguage - for k, v := range c.LanguageConfigMap { + + var langKeys []string + var hasEn bool + + const en = "en" + + for k := range c.LanguageConfigMap { + langKeys = append(langKeys, k) + if k == en { + hasEn = true + } + } + + // Sort the LanguageConfigSlice by language weight (if set) or lang. + sort.Slice(langKeys, func(i, j int) bool { + ki := langKeys[i] + kj := langKeys[j] + lki := c.LanguageConfigMap[ki] + lkj := c.LanguageConfigMap[kj] + li := lki.Languages[ki] + lj := lkj.Languages[kj] + if li.Weight != lj.Weight { + return li.Weight < lj.Weight + } + return ki < kj + }) + + // See issue #13646. + defaultConfigLanguageFallback := en + if !hasEn { + // Pick the first one. + defaultConfigLanguageFallback = langKeys[0] + } + + if c.Base.DefaultContentLanguage == "" { + c.Base.DefaultContentLanguage = defaultConfigLanguageFallback + } + + for _, k := range langKeys { + v := c.LanguageConfigMap[k] + if v.DefaultContentLanguage == "" { + v.DefaultContentLanguage = defaultConfigLanguageFallback + } + c.LanguageConfigSlice = append(c.LanguageConfigSlice, v) languageConf := v.Languages[k] - language, err := langs.NewLanguage(k, defaultContentLanguage, v.TimeZone, languageConf) + language, err := langs.NewLanguage(k, c.Base.DefaultContentLanguage, v.TimeZone, languageConf) if err != nil { return err } languages = append(languages, language) } - // Sort the sites by language weight (if set) or lang. - sort.Slice(languages, func(i, j int) bool { - li := languages[i] - lj := languages[j] - if li.Weight != lj.Weight { - return li.Weight < lj.Weight - } - return li.Lang < lj.Lang - }) - - for _, l := range languages { - c.LanguageConfigSlice = append(c.LanguageConfigSlice, c.LanguageConfigMap[l.Lang]) - } - // Filter out disabled languages. var n int for _, l := range languages { @@ -836,12 +864,12 @@ func (c *Configs) Init() error { var languagesDefaultFirst langs.Languages for _, l := range languages { - if l.Lang == defaultContentLanguage { + if l.Lang == c.Base.DefaultContentLanguage { languagesDefaultFirst = append(languagesDefaultFirst, l) } } for _, l := range languages { - if l.Lang != defaultContentLanguage { + if l.Lang != c.Base.DefaultContentLanguage { languagesDefaultFirst = append(languagesDefaultFirst, l) } } @@ -927,17 +955,48 @@ func (c Configs) GetByLang(lang string) config.AllProvider { return nil } +func newDefaultConfig() *Config { + return &Config{ + Taxonomies: map[string]string{"tag": "tags", "category": "categories"}, + Sitemap: config.SitemapConfig{Priority: -1, Filename: "sitemap.xml"}, + RootConfig: RootConfig{ + Environment: hugo.EnvironmentProduction, + TitleCaseStyle: "AP", + PluralizeListTitles: true, + CapitalizeListTitles: true, + StaticDir: []string{"static"}, + SummaryLength: 70, + Timeout: "60s", + + CommonDirs: config.CommonDirs{ + ArcheTypeDir: "archetypes", + ContentDir: "content", + ResourceDir: "resources", + PublishDir: "public", + ThemesDir: "themes", + AssetDir: "assets", + LayoutDir: "layouts", + I18nDir: "i18n", + DataDir: "data", + }, + }, + } +} + // fromLoadConfigResult creates a new Config from res. func fromLoadConfigResult(fs afero.Fs, logger loggers.Logger, res config.LoadConfigResult) (*Configs, error) { if !res.Cfg.IsSet("languages") { // We need at least one lang := res.Cfg.GetString("defaultContentLanguage") + if lang == "" { + lang = "en" + } res.Cfg.Set("languages", maps.Params{lang: maps.Params{}}) } bcfg := res.BaseConfig cfg := res.Cfg - all := &Config{} + all := newDefaultConfig() err := decodeConfigFromParams(fs, logger, bcfg, cfg, all, nil) if err != nil { @@ -947,6 +1006,7 @@ func fromLoadConfigResult(fs afero.Fs, logger loggers.Logger, res config.LoadCon langConfigMap := make(map[string]*Config) languagesConfig := cfg.GetStringMap("languages") + var isMultihost bool if err := all.CompileConfig(logger); err != nil { diff --git a/config/allconfig/allconfig_integration_test.go b/config/allconfig/allconfig_integration_test.go index cae04ba85..033947203 100644 --- a/config/allconfig/allconfig_integration_test.go +++ b/config/allconfig/allconfig_integration_test.go @@ -5,6 +5,7 @@ import ( "testing" qt "github.com/frankban/quicktest" + "github.com/gohugoio/hugo/common/hugo" "github.com/gohugoio/hugo/config/allconfig" "github.com/gohugoio/hugo/hugolib" "github.com/gohugoio/hugo/media" @@ -234,3 +235,62 @@ baseURL = "https://example.com" b.Assert(c.IsContentFile("foo.md"), qt.Equals, true) b.Assert(len(s), qt.Equals, 6) } + +func TestMergeDeep(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +baseURL = "https://example.com" +theme = ["theme1", "theme2"] +_merge = "deep" +-- themes/theme1/hugo.toml -- +[sitemap] +filename = 'mysitemap.xml' +[services] +[services.googleAnalytics] +id = 'foo bar' +[taxonomies] + foo = 'bars' +-- themes/theme2/config/_default/hugo.toml -- +[taxonomies] + bar = 'baz' +-- layouts/home.html -- +GA ID: {{ site.Config.Services.GoogleAnalytics.ID }}. + +` + + b := hugolib.Test(t, files) + + conf := b.H.Configs + base := conf.Base + + b.Assert(base.Environment, qt.Equals, hugo.EnvironmentProduction) + b.Assert(base.BaseURL, qt.Equals, "https://example.com") + b.Assert(base.Sitemap.Filename, qt.Equals, "mysitemap.xml") + b.Assert(base.Taxonomies, qt.DeepEquals, map[string]string{"bar": "baz", "foo": "bars"}) + + b.AssertFileContent("public/index.html", "GA ID: foo bar.") +} + +func TestDefaultConfigLanguageBlankWhenNoEnglishExists(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +baseURL = "https://example.com" +[languages] +[languages.nn] +weight = 20 +[languages.sv] +weight = 10 +[languages.sv.taxonomies] + tag = "taggar" +-- layouts/all.html -- +All. +` + + b := hugolib.Test(t, files) + + b.Assert(b.H.Conf.DefaultContentLanguage(), qt.Equals, "sv") +} diff --git a/config/allconfig/alldecoders.go b/config/allconfig/alldecoders.go index 0bf8508d9..1cfa1afc4 100644 --- a/config/allconfig/alldecoders.go +++ b/config/allconfig/alldecoders.go @@ -249,14 +249,18 @@ var allDecoderSetups = map[string]decodeWeight{ key: "sitemap", decode: func(d decodeWeight, p decodeConfig) error { var err error - p.c.Sitemap, err = config.DecodeSitemap(config.SitemapConfig{Priority: -1, Filename: "sitemap.xml"}, p.p.GetStringMap(d.key)) + if p.p.IsSet(d.key) { + p.c.Sitemap, err = config.DecodeSitemap(p.c.Sitemap, p.p.GetStringMap(d.key)) + } return err }, }, "taxonomies": { key: "taxonomies", decode: func(d decodeWeight, p decodeConfig) error { - p.c.Taxonomies = maps.CleanConfigStringMapString(p.p.GetStringMapString(d.key)) + if p.p.IsSet(d.key) { + p.c.Taxonomies = maps.CleanConfigStringMapString(p.p.GetStringMapString(d.key)) + } return nil }, }, @@ -306,15 +310,17 @@ var allDecoderSetups = map[string]decodeWeight{ } // Validate defaultContentLanguage. - var found bool - for lang := range p.c.Languages { - if lang == p.c.DefaultContentLanguage { - found = true - break + if p.c.DefaultContentLanguage != "" { + var found bool + for lang := range p.c.Languages { + if lang == p.c.DefaultContentLanguage { + found = true + break + } + } + if !found { + return fmt.Errorf("config value %q for defaultContentLanguage does not match any language definition", p.c.DefaultContentLanguage) } - } - if !found { - return fmt.Errorf("config value %q for defaultContentLanguage does not match any language definition", p.c.DefaultContentLanguage) } return nil diff --git a/config/allconfig/load.go b/config/allconfig/load.go index 9289cf294..2d9185f6f 100644 --- a/config/allconfig/load.go +++ b/config/allconfig/load.go @@ -159,63 +159,9 @@ func (l configLoader) applyConfigAliases() error { func (l configLoader) applyDefaultConfig() error { defaultSettings := maps.Params{ - "baseURL": "", - "cleanDestinationDir": false, - "watch": false, - "contentDir": "content", - "resourceDir": "resources", - "publishDir": "public", - "publishDirOrig": "public", - "themesDir": "themes", - "assetDir": "assets", - "layoutDir": "layouts", - "i18nDir": "i18n", - "dataDir": "data", - "archetypeDir": "archetypes", - "configDir": "config", - "staticDir": "static", - "buildDrafts": false, - "buildFuture": false, - "buildExpired": false, - "params": maps.Params{}, - "environment": hugo.EnvironmentProduction, - "uglyURLs": false, - "verbose": false, - "ignoreCache": false, - "canonifyURLs": false, - "relativeURLs": false, - "removePathAccents": false, - "titleCaseStyle": "AP", - "taxonomies": maps.Params{"tag": "tags", "category": "categories"}, - "permalinks": maps.Params{}, - "sitemap": maps.Params{"priority": -1, "filename": "sitemap.xml"}, - "menus": maps.Params{}, - "disableLiveReload": false, - "pluralizeListTitles": true, - "capitalizeListTitles": true, - "forceSyncStatic": false, - "footnoteAnchorPrefix": "", - "footnoteReturnLinkContents": "", - "newContentEditor": "", - "paginate": 0, // Moved into the paginator struct in Hugo v0.128.0. - "paginatePath": "", // Moved into the paginator struct in Hugo v0.128.0. - "summaryLength": 70, - "rssLimit": -1, - "sectionPagesMenu": "", - "disablePathToLower": false, - "hasCJKLanguage": false, - "enableEmoji": false, - "defaultContentLanguage": "en", - "defaultContentLanguageInSubdir": false, - "enableMissingTranslationPlaceholders": false, - "enableGitInfo": false, - "ignoreFiles": make([]string, 0), - "disableAliases": false, - "debug": false, - "disableFastRender": false, - "timeout": "60s", - "timeZone": "", - "enableInlineShortcodes": false, + // These dirs are used early/before we build the config struct. + "themesDir": "themes", + "configDir": "config", } l.cfg.SetDefaults(defaultSettings) diff --git a/config/commonConfig.go b/config/commonConfig.go index 3dfd9b409..947078672 100644 --- a/config/commonConfig.go +++ b/config/commonConfig.go @@ -17,6 +17,7 @@ import ( "fmt" "net/http" "regexp" + "slices" "sort" "strings" @@ -28,7 +29,6 @@ import ( "github.com/gohugoio/hugo/common/herrors" "github.com/mitchellh/mapstructure" "github.com/spf13/cast" - "slices" ) type BaseConfig struct { diff --git a/config/services/servicesConfig.go b/config/services/servicesConfig.go index f302244d4..f9d5e1a6e 100644 --- a/config/services/servicesConfig.go +++ b/config/services/servicesConfig.go @@ -101,6 +101,9 @@ func DecodeConfig(cfg config.Provider) (c Config, err error) { if c.RSS.Limit == 0 { c.RSS.Limit = cfg.GetInt(rssLimitKey) + if c.RSS.Limit == 0 { + c.RSS.Limit = -1 + } } return diff --git a/hugolib/config_test.go b/hugolib/config_test.go index cbf821ee7..4275fb02a 100644 --- a/hugolib/config_test.go +++ b/hugolib/config_test.go @@ -475,7 +475,7 @@ name = "menu-theme" }) }) - // Issue #8724 + // Issue #8724 ##13643 for _, mergeStrategy := range []string{"none", "shallow"} { c.Run(fmt.Sprintf("Merge with sitemap config in theme, mergestrategy %s", mergeStrategy), func(c *qt.C) { smapConfigTempl := `[sitemap] @@ -495,7 +495,7 @@ name = "menu-theme" b.Assert(got.Sitemap, qt.DeepEquals, config.SitemapConfig{ChangeFreq: "", Disable: false, Priority: -1, Filename: "sitemap.xml"}) b.AssertFileContent("public/sitemap.xml", "schemas/sitemap") } else { - b.Assert(got.Sitemap, qt.DeepEquals, config.SitemapConfig{ChangeFreq: "monthly", Disable: false, Priority: -1, Filename: "sitemap.xml"}) + b.Assert(got.Sitemap, qt.DeepEquals, config.SitemapConfig{ChangeFreq: "monthly", Disable: false, Priority: 0.5, Filename: "sitemap.xml"}) b.AssertFileContent("public/sitemap.xml", "monthly") } }) From 2fce0bac033d8b7e98046f85f669ba813d862788 Mon Sep 17 00:00:00 2001 From: Pranshu Gaba Date: Tue, 18 Feb 2025 05:21:42 +0530 Subject: [PATCH 043/129] images: Add option for vertical alignment to images.Text Add option ``aligny`` to specify the vertical alignment of the text with respect to the ``y`` offset from the top of the image. Possible values of ``aligny`` are ``top`` (default), ``center``, and ``bottom``. The height of the block of text is measured from the top of the first line to the baseline of the last line. - ``top``: (Current behaviour) The top of the first line of the block of text is at an offset of ``y`` from the top of the image. - ``center``: The vertical center of the block of text is at an offset of ``y`` from the top of the image. - ``bottom``: The baseline of the last line of the text is at an offset of ``y`` from the top of the image. Resolves #13414 --- docs/content/en/functions/images/Text.md | 3 +++ resources/images/filters.go | 6 ++++++ resources/images/text.go | 16 ++++++++++++---- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/docs/content/en/functions/images/Text.md b/docs/content/en/functions/images/Text.md index 94cdb4e9d..8f7e730ba 100644 --- a/docs/content/en/functions/images/Text.md +++ b/docs/content/en/functions/images/Text.md @@ -18,6 +18,9 @@ alignx : {{< new-in 0.141.0 />}} : (`string`) The horizontal alignment of the text relative to the horizontal offset, one of `left`, `center`, or `right`. Default is `left`. +aligny +: (`string`) The vertical alignment of the text relative to the vertical offset, one of `top`, `center`, or `bottom`. Default is `top`. + color : (`string`) The font color, either a 3-digit or 6-digit hexadecimal color code. Default is `#ffffff` (white). diff --git a/resources/images/filters.go b/resources/images/filters.go index 9c2b9b46f..1e44f1184 100644 --- a/resources/images/filters.go +++ b/resources/images/filters.go @@ -79,6 +79,7 @@ func (*Filters) Text(text string, options ...any) gift.Filter { x: 10, y: 10, alignx: "left", + aligny: "top", linespacing: 2, } @@ -102,6 +103,11 @@ func (*Filters) Text(text string, options ...any) gift.Filter { if tf.alignx != "left" && tf.alignx != "center" && tf.alignx != "right" { panic("alignx must be one of left, center, right") } + case "aligny": + tf.aligny = cast.ToString(v) + if tf.aligny != "top" && tf.aligny != "center" && tf.aligny != "bottom" { + panic("aligny must be one of top, center, bottom") + } case "linespacing": tf.linespacing = cast.ToInt(v) diff --git a/resources/images/text.go b/resources/images/text.go index 324878839..f3943a475 100644 --- a/resources/images/text.go +++ b/resources/images/text.go @@ -36,6 +36,7 @@ type textFilter struct { color color.Color x, y int alignx string + aligny string size float64 linespacing int fontSource hugio.ReadSeekCloserProvider @@ -110,12 +111,19 @@ func (f textFilter) Draw(dst draw.Image, src image.Image, options *gift.Options) } finalLines = append(finalLines, currentLine) } + // Total height of the text from the top of the first line to the baseline of the last line + totalHeight := len(finalLines)*fontHeight + (len(finalLines)-1)*f.linespacing // Correct y position based on font and size - f.y = f.y + fontHeight - - // Start position - y := f.y + y := f.y + fontHeight + switch f.aligny { + case "top": + // Do nothing + case "center": + y = y - totalHeight/2 + case "bottom": + y = y - totalHeight + } // Draw text line by line for _, line := range finalLines { From 53202314abdd05d8f0b6ffdcef96640ac3267344 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Thu, 24 Apr 2025 10:29:31 +0200 Subject: [PATCH 044/129] images: Add some test cases for aligny on images.Text See #13414 --- .../images/images_golden_integration_test.go | 9 ++++++++- .../filters/text/text_alignx-center.jpg | Bin 45280 -> 44006 bytes .../text/text_alignx-center_aligny-bottom.jpg | Bin 0 -> 64788 bytes .../text/text_alignx-center_aligny-center.jpg | Bin 0 -> 59768 bytes .../filters/text/text_alignx-left.jpg | Bin 43561 -> 43848 bytes .../filters/text/text_alignx-right.jpg | Bin 45732 -> 44969 bytes 6 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 resources/images/testdata/images_golden/filters/text/text_alignx-center_aligny-bottom.jpg create mode 100644 resources/images/testdata/images_golden/filters/text/text_alignx-center_aligny-center.jpg diff --git a/resources/images/images_golden_integration_test.go b/resources/images/images_golden_integration_test.go index c49de7bd1..5397bee23 100644 --- a/resources/images/images_golden_integration_test.go +++ b/resources/images/images_golden_integration_test.go @@ -252,8 +252,8 @@ Home. "linespacing" 8 "size" 28 "x" (div $sunset.Width 2 | int) + "y" (div $sunset.Height 2 | int) "alignx" "center" - "y" 190 }} {{ $text := "Pariatur deserunt sunt nisi sunt tempor quis eu. Sint et nulla enim officia sunt cupidatat. Eu amet ipsum qui velit cillum cillum ad Lorem in non ad aute." }} @@ -262,6 +262,11 @@ Home. {{ template "filters" (dict "name" "text_alignx-right.jpg" "img" $sunset "filters" (images.Text $text $textOpts )) }} {{ $textOpts = (dict "alignx" "left") | merge $textOpts }} {{ template "filters" (dict "name" "text_alignx-left.jpg" "img" $sunset "filters" (images.Text $text $textOpts )) }} +{{ $textOpts = (dict "alignx" "center" "aligny" "center") | merge $textOpts }} +{{ $text = "Est exercitation deserunt exercitation nostrud magna. Eiusmod anim deserunt sit elit dolore ea incididunt nisi. Ea ullamco excepteur voluptate occaecat duis pariatur proident cupidatat. Eu id esse qui consectetur commodo ad ex esse cupidatat velit duis cupidatat. Aliquip irure tempor consequat non amet in mollit ipsum officia tempor laborum." }} +{{ template "filters" (dict "name" "text_alignx-center_aligny-center.jpg" "img" $sunset "filters" (images.Text $text $textOpts )) }} +{{ $textOpts = (dict "alignx" "center" "aligny" "bottom") | merge $textOpts }} +{{ template "filters" (dict "name" "text_alignx-center_aligny-bottom.jpg" "img" $sunset "filters" (images.Text $text $textOpts )) }} {{ define "filters"}} {{ if lt (len (path.Ext .name)) 4 }} @@ -279,6 +284,8 @@ Home. opts.T = t opts.Name = name opts.Files = files + // opts.WriteFiles = true + // opts.DevMode = true imagetesting.RunGolden(opts) } diff --git a/resources/images/testdata/images_golden/filters/text/text_alignx-center.jpg b/resources/images/testdata/images_golden/filters/text/text_alignx-center.jpg index 090600f5f26e36a17c35e2d33a091f4d1f9efff8..94bcb811a6f348f8c0772e036bef5b9f4656d535 100644 GIT binary patch delta 37642 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żZK9iN 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 diff --git a/resources/images/testdata/images_golden/filters/text/text_alignx-center_aligny-bottom.jpg b/resources/images/testdata/images_golden/filters/text/text_alignx-center_aligny-bottom.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ca8893e4efbc8a4e77e5c26e5c82d56c311b4fed GIT binary patch literal 64788 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 literal 0 HcmV?d00001 diff --git a/resources/images/testdata/images_golden/filters/text/text_alignx-center_aligny-center.jpg b/resources/images/testdata/images_golden/filters/text/text_alignx-center_aligny-center.jpg new file mode 100644 index 0000000000000000000000000000000000000000..828b6e6a33ac512ce5b136526b7fe0221775bf08 GIT binary patch literal 59768 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 e0h0@5@}dvme%K#~q16__*r*CJvsZ zaap-j6}fjCZfW;sFO(g;~Go zJ5_ELWxavR$zFB)6_HxWDIDE;h3uf8acvmB8HMVmjFbPZqyBlA71oco+|-39vp(-? zY)K(}Sjv6!GNP=S6>5p8t2loK>YkZ3`0Zpl&m8kBBcG4vh zm&mNtR6r?AdL2KMt}?|o+<9@K7b*O7;DM{VUD~vRl0yjr==olS4QmF~U!MA|Gy5ogFW#K66?nyg&ctXa4G2{ryDU6qln_duT6~XsPBzimJ3K zK*~`2>RwgZ@&2H&HQ26_sR7=0Hp#lKkB5}+!Vk-`i`O}yQ2iJ6x410b_wVx6+gD`T zTPcvk5Gt&x*_(nw3QmIw*9Op2+pq6UzA*8x*fd(M-Z{BQ=>EMciYh3qLO;3DdcV}h z#l1Q~go7fx=43Ds{gG;!Q|o!3HqU)37M1Q>T3I(P2_CSvC&Wif5_CvoVofwB zM86CN$zA?=vs9gisj#CJ`!{YdcqhvngVb}mDV5&an|S)LnX7&4Y;v-+l=Ub44Qce@ z@9!{wh)QDcUjkpie}K*qGoN&C?%LG@#;ftk4r-=g@3z?#g0EBsY<#PoDT_dp!_0BcKTM!lWwb?mf8=>-k>}y7haxP=qi=^R zUNwfJYF^d(G^(h?!&lw?$H0rerESt>JL@`AUZaW|3r{hn>fh4<@w!m5ROumbN7nbN zIoIq0KJzzj-CMa)wo7&uH)awiVsc*sT;4w|wJ0kW^{iU@$<9(mwc>xvpB-0?g8MM1 zrZB(+lNP>xNss-Qu|Z9*BFToGse9-BMXl{g=__?{q2g3#(fMF2GHjMjZT>R_<=3zI zf>wE(o28{CKutTM?PmVBkWvea#(8F9llW0AN#llpF?>Fe6%bzHnY=-+P0csxOwow7y~D{7c~H@7f;BpG@G=pOzLWrQ+&U z3f`9v@3-Dd#~HeeOa+t&6NN}Gr;l9}O>X}Bs@mrKJKL=@#p1=dxA#hMeYxqW zc478~wDsZq_day)ktX(L#&VudxxZaiK(w|LdxQCWw>Xp}2 zNBRPR)9m->9POGfHHbQ=Ign+sM+SKprL{4McKk*q`W4S!#`#m~!SGWb6|0>Hq*W@j zj@SuM)34!_%>7xs#2)rWW8=7=&7}%|72;2y;0@gJ5e>DLcD3&gOxoT5ExI2|p;Ti+`3giF zX)xpF%0UBsN;MRQ9_$~H(q(uu$}0x_=hckUIQ5$>J_mmEY!Y2@3aJ^Aj=AGgPRYRi zT~N+ekwRJwI>${Q+mW*R_Bkt*-qvID)3_KrM!NaR+6*hSDVG&CT~EpA&!p( zGQ_1k1!~W-&lLbkiFTIjS!y#Ma6yX$rU_fVJ9~h0#4Htq-(6dmhrCm?oiEu8X~(6W zO1-Wcm5lU%fBmSN5*Dd${6$^po&M{ZMU|S!X`uqCfY?WnB3~fUT!`uE zV}F6+s?PmCFMbcKx7+X4wfEI`W&B7hi{QcK&}VYFi%6$vgOc_c?!qLH#2F;CB5&eSq@D+2x&>Ne=7u(<`w(S z_yZw}2f3TE&Uxa9>QDnQt2mR**%>MzL+49p5oOhv8 z12|NK*E-@E_}a;?)t4ef$FiTmgKaatsr|7t=$1$)P`xbTi3dU>k)Mxpz4 z*rTV<%fNR(W1M^s}eud8vEukgoK&fZ=z>%l$Z+j6u2KZBYU%cJ1>AI|?X`$kbX zhhsR10OrqFhs+d#3~a9VDcl;WFG`i?ahQr=@04d;HYcM@=%6TfN?V0XW=ovKfr!@Y z>XM=x>;G#pYH6v27A~B0O^j0Hz{UqVy_Q>(RX6RDT>RnB^g?w{b;{29%UuR#OTOX3 zjhm@GMqy?ZdW6$Cdj8vX{bF4%(&NtQ4Zd>4P-2_VBQktFC%3gERV>r-8$g=Lb=-0Nw}1Bsff~UScXvaqf|@UPYU?c}{qo;X8fTZKd(N+7__?N;0C}Z!r@z<;=vM*y~{Km-*p|y1r_Iz2#n#G;4fZNb76A zTW;odNmUBXBu(FI?~e9YKUGOAvrCzUzfrEAmL;j>6r5I&dTSPs38_GrK&yt_Q?9MJ z!|}z?e}G737Q+0B%$!r|8E4^&^sL8$DX0Sv=yDN@WvTGwEKJ9 zYu%zRd2Bf68kr4D!6GXz`1W4K6jmvZT>b~}3W-#-S)98uTnePRZ*XC03F^NqQt%4- zc!h-dL|m4&F84vBOVnM<6dOivKCknKbmu!uhM&sx^Gx9G-HoOFLL|*a``s6}64a4V zt{%)lSFGsA?RjpsF1#AOfDa84q6(OoB#iU7FWrv}Qif?wJu9IKFrIYjg9bjq&ZO)Z zUoye3{t`*6S(jcmH_)glkKW z2u!d9GRv#I4g;}E?!ipfxd0yh^aP81x`b69S=IIw$0L$P{wUmwnv&jba`D-@y*Kz$ zqL)B=O{e=f^p-m0i9++d>d0*X%P*^D5!~o9-*ND0a#}sk|Qb05sY| z_bN%8YRqH81^7#*HICr!1;wL>>4ssAsU$lXqz|84mb+ZTD>Qoy@%V(n`yGqygvPu< zf~#L|7uz%v9=y%fZY~@ckS73Hg_wPQ^UnPvTQkXdFQ-gf49!8Co>j9DrTgPXEjIqw zZMTQum=)%-n1f$BL5O>L?u*3&N2-M%z|e#j#*3u4rK^dBH+zkHy1AlNKE=|u`ho*! zN}6_I$C^hHp+B((@c|)2=43mqYz?$6wL^KJzm!C8osfg>|7LpLZDa5v&e&2+h0LeD zb89s>x@i`x)bEdQfS@vSza-sG+^T;+PI4nRA_GVGD$kCQW@^MC4#Re67VQFcw zgUwV{)+9g|5kFSM$QeV`ok2!PVrDapOTHP{E_P&`mrRKu7N#Z$E?A-yHMl9&MLX#| z7Oy88BN80({y5_5ePvF5RuRiOeaUgB(4xdKm^cA~Jv{+?ItEciYAKZ3(kP-cL4 z(@Gu9PK@ELEnWOO52O1r1+J#O9oPdv-$&=N)&XOE0 z*sMUq2&Y&SUVH#xQfl-blI1;4Msil>%)O>bkadDUelF_dj83H_v8HNZZ!TbKML4^1 zP)2(6oevW1=~z-PeXC*?Iogc=ncX(|!C+Cp>!#^nEz|WcTLy{sV~Qz%UvLe{WdhZv zUOc^y>HQAqo**VzrIuNLUk@NKfsD;(e_sf)(HQU*C;2S)$djN1bV$k1a7t z$`w~I*mK5poOz;J#VOnUlY%ikR(CQ zxhNaUQUXLuu+JP7B#*w@Sp0d|L>O$^YsSVm^#u?-7HBhM*2&t9FC*&x*nr582X|=Bj z`r7Wea2bx(`J|LlsI@_A;&FQ?kmj$MYlYAeZmk)21pqzsPFcJCet$nLdLuUs1jeG@FTXS09DNIK7OPe=*AG{MK<#G3fQ0;qvLs&`W@9-w-MKpf57 zdo7(&;Kn(~k;|cZ$N0%{P-`vSj%V+-p+HQqWVPH##^xu`8)e?i+Nt$D)o-5yRRV~{ zzqlmC*UhzF*M53(`wd=u*)i}^VnGXoH}qgCDfq{o(+XFPyqqzY7e`h)n<=pvM0WJK z9nFnO07doZ{X_bB$K^l6eLa4ujSkgMoDgf-qC(TO8*KkN2`=M8G)~#gaFP{?i^fNS8 zIyfkV`Ar|^zlt-yTjyeP&Uc^2R;)Nw=n*;1kg{u&nAO%6+m43lCD5TJa}1UJz@4&t zuHPvpE9O^3ZC0@8U5wKFz}eKXaohzlLyD`-MUT0>tlS0XaUcJ|SY^??a*KJn!{7kE zvOTW$QQ2Pssd9r!{11SiSLD*_Tg$kEjJJ+9dbRU;EtW-vsmj_~b%|dGs!>bXo?ox> zvZYa15|9=A-oCBKmS2Sue5C)l8K(X~?rz(Q#;HzLXs{Q|1+-%r6&$SWw z7@vR_^m~kRTz9zjr2o8%Mu^9%4Lttd!yt4es{`?>O(x*0Dvi*`LUgR?Nmt5HXBBJ! zj|5ZEwJt4zQyCCcsD|4E9%;H~8MXJ5%Q^GcOZ}iu-0smWpue)%OBI_9}0jTS#G^BcUE*v9R2eis%wjA zWp_BH*E#LImTh^b9GJHEDT?7#4C}%@y*%_oLSEXCN>Vl|$T?rqF$>XCHvwH0!My7B zm*AJR?UVb+GLy9160FNn7&+@1#*sxe)>b#RPK0-Hq-HAcwm@GRVY1I*y;nDVj~S;S zwcl48^F3Tc@;rRV#6b|BYHLSmlJ*5_dRsF>cT?6wH7q*Gli?X+U|5p>+BpX)_E_AY z`H60!>*M6JE!-)Yn_N7ei~XFu(B|)$z_9NN$UK#pphVI_t>ddTE~|{WnCU<+SiM7W z!x*rxTThx5=aq>@^J@&rScUrMsLpGXtU;fXY|Oyn-0r@5$;fbgi^q9!Y0_4Jh{aEu zr=7`h#G8z_y)T8>)0CRD7^?9+E|I6}?2wgvZX^c$y7^szLv-*c-I(ua)egVUT?x13 zJT+)mGNaUbbmd8OMqY-2?YWj*L=1LGT zR|1+z-16)ZF^9fU)C%7EO((|x*5yR?v=C12kYTT|m-J&Or6x1@mCBJ;vOHy9AJMBgRerEe zl1t%j{83oMZ7C2pk4=PqN|9h}_Q(Ee`4+G8jUeZQeX@M!5CM~1LxNYgXo>#qbl zq75;71&CAF{AduDSHt(I0Z2fU&ud1Nuvd)DpC&Ma~I`4>;#7#)mhkg`<=xxh&G>j7$zCSNUJ+0x@=+r@rR@Nt` z5@NgHD z^H-5}lFWw^r^nS}ezH2Tt4reN)Mjmtv!&pPYKA3GVFujmFOPS05^2&gp#q%tFckU< zmjULcpgaB(ohE4*Q#*J)0l?wqAjL=drr#qPA#7(jt*6B$B7pi9wG@kfrr(~v2sXx0 zo2+q(iy0uX;hi`3D9>>t=4_yFxM?2mmKUH-cAPvrQ;5?hNcrN_e?-mSt;CGi7hI3W zVlyVQPOx0X%NPCt;8S+=>F)r*0>^riq}S*(!ydQ#5rxz?}jtxbQw4W3ncr+2>1rb0{#_K^yl5d zf0fr~>X;(be0hvcX5B)}Jin_N!~+|#PcQ&jqNBvQm3}auq3K%l2#7~u}R=b<=>I8v}uAS5_1CTO~CDopf=Z&$8r2`nJJ{0u4T zlXZN^H(XfxUnbDRHk~n+(a>oC4&fcvwHrp^c)JBBg(s7_2~_Tm_^pzhRyc_@TgsoP z;x=;&>YjKrU^tHGA~A{qQj#E=vsh@A=o!(xrnlMv^{-{1=A3y5kWVop=|gdwS_S5Xf0Et&%PS z_dN6?&yK!|;)_3%nDX*eePRe&z_pY63x$XVUuwTWw8vfpm1}Wb>TTUDGLuVk3?}xB zneWlBM8@|&#kkU;d`!f37cP)qQ8_GBVt7Y)9igm0@Qr)p04GzbEFL)hE{54jd}hyJ zAo^e2#>sb58ABDl82!PIZ;Da#5|mDB^&%+^z;G4$wd7$!+o^lc$a$2_Bt6~gr-fd9 z5o?tfSN)jJD#|=cvnR#PlEvCx)HYn09A$P%9TDw8+1<}9B<<2Z(o?TEQjh>HYna8P zF#Ku_`7;_I0dkVa)sTP4f(LU;50ifw6X&>~y|`TO>ShMm5nc?}Squrt?;0QGOn}ad z@#4($WH)=YyabR%4pb_M*SEhJJ$^Id$;bNjGBdasd@qU~ z@t%vJDj_Sl(&c~(7To<^!3DeS#opS+JK)w1d{hX3>?36;IN5QZQduqGvuPG}aPD0I zKuIt=>W_SN)_nuN%zi0FyU-DE@2^SMYyUSQcKATEAXP=rLNR8aWL7+xO{EBfG<3eJTlj zJ*oejsW|~F%Ya*jjFl9@k=KW2jO6~p4@B~B64dYbpQLhea>l>zF^UjBTxz=dRD8b< z*n)LML9-bEv_opd!o-k4j_hxbq(3CDPtd|;HspOsc49WjKD*MG+HDg29)zGs^Svza zK|IBt{a3%l_Qf^0l3ucXsX2sJpZ_oC`LdZKmC|f-QD-H`iI@)-c)1$-{>4vF{J8<1>rA43Ecyb+(ZsMwPSkCwkqHSIkvOEmQ2e90w zC;#b8phh|!RUc)~mNS-8 z9y=2XB-0m`(r4HTzx76u#k+Bzevlj|E{ZjKq4F~{2qFefCa47CqAe&w|8xkM6OZS* zAoz09sByqIIh4=WjmVG%Z-NY9|6tg@=o1aKP3(_ueqydT#FfE%Lam{-_?@&aQ3_H2 zy8w)+TYbVG9S_(kezC`dJAZxhk<3=YzO2RHii(cAGVKjJ-FwLr-TLxy_f+=Bs>7Hs zMEx!TQyX`Dm6PFq|Iqk7p74AvTB;DIJPL2?4~IBj#OrChMVP_)sJ6f(-H7Dq7y+U_ zze2+1&hFe&?gR)YAbu#b-qsyH*V)HMxsk5}PDF+yGNlaMSCS}$Q#L=(x$#{8vTB-6 zop@iN{EGP1`o+17;ZvXu)DPL*2TqLFz@vy0lUMOv+R=!_`|HVj3S=PyMbg#Gfp_F7 zXt6vj25i`lUly;`<~U1Y`}}GJ4ce} zZxgCHMX;IjHoL%ZUcj?a38HvlNozb8o_-8v|6d>gufZc(uePfT6sh%?00oLv1&_Ps z6%t6`O(0a(a6rmQzNOMonrL|{r#Dj$=O_{qY$9w?;bsmvty{old##V1PncvoYIZN! zbrM^oa_dVh9N1ICNeQiAAk>?%$=VM_;0qcT`9GU^Ar@qBT|J`ZZ>`bb{jMud*`0R= zQ}IKHm~bLVZmAfu1X4zaYPR~HgOE{Sm2YKnAMV8-A`wl4Ox!uOLU=sh!fH+16cB5k zB(OnjL4Md7&_S-g=fz7ZgxUlk__!1RS;1iOLj~$xJJt%gs}k_1edQO|i9;DHfI;vI zPxu4&6Fxi?(I`{lC=*I$Av2U+VErx)dsen!^!du(=8yaOd7*KfUhJ3to0o>+)<1l> zEJK9DXjRlWZQ5*ho60E!KefL9yYg>cOxsnQJaM*a2DGZ*?`g}_)w%6U^|#1MFwL95 zNls)?PdAe*X7lz0eTVdDNpvr%Qa?+^z4Nr3`*~;ua;-1>cjO<@u8GCmANoM$N%nL) z{Z7N<0;rdM5Ezl4&^}P?|8AGZm8ugw@^Kf7^Oa^#ahmYRB9acg!qW-06%AEZ4cZWb z=qe%G@#`jBwZ*Is-+|9IbUH~^iI%tKkxk1GMU)C;TLo&MPn!8z&(S9*gS+n0^~<0x zH7u$$q+t_4i{4fjHT8Ywugc~B*wkCjKBS1VXYSbsTgHZw+ktwf!h`#}kiPOoX9+TK zAphK9Kf&Ko=BUUtcAHT{qgybtJj8uwJD=9XZx?_I_KqOe%%heBW3Y=DQH&J7bRGZQ z1Wd!4+U_$bvlKsURFRTzwa*_#BFR|<)>dCYYNK+bt|##A3pkP4Ho6e5$*5nq9ASx@ zwUHp+f9UnFCd7`;(n(Ir=x@;;$sdgCe+%h6G-|PFph)m9Pj@1KM$(Fhh8>r0*^oOJ zHu~fP+7l}?X>AFvQSXJM)?R4K&5K)^GqTm=@%J*vWnLqFR-^!YW?}@Tqs9*N?#ck2 z(IYhos}q$77ec?B$_x<5%UNWQO4it5K@x5IiPaIm&9YaA1o=)4M;DWA-d#dQ1TeAb zRb0}B@d9Y6oZ?=*uHnVwh#8n;l}5JK^A_sXh7$87J?cZqQ(1$vqCe+yM7~~OK`K28 zL;~RHZ1szx=nlR;eB!H&+;@iSuB)B+p%2z+syvk1Wygq&QfrX_>nt#S4vf`_2r336 z`wU9%+>@uEY5i`<;w$#{fkHR{T?Y`a;wvP!UTsn+0?Jd%T>FGt5U660;6AgkmPKa6B z?{owuf32H>Ce6>}ZC?D1$(JVNk>jp&w@#>eO7{>cKL}PPK)*gPbmz)|ShSUz*squ- zEQe3yK$1JFFoAf&e@{(OXp0@+>7~yXSvA>X*vp5f5+Duj)jy2Vj*NXxRw|QWJ9~O< zA38$V`7r%qiI-E(YJ1i#3a&_wjdl*OcdjFUM!rofzW>SFUB3Q zh{=?|Ux2O3leLD8ioTD%sKJ%ZjlaNF1@Sc>A>}np>9WG%4|Dw2kTjW|z&rRFL+4c_ z10GE#DLc8r^6NcZ&GVjqMh4{ro*ms6R{b2Itf_qfAO^rn!F}XJY_WpxhrH`Z zx4+DUuyHc3rjxQrO<*3G_z1#-UrbgedAm(x!O7N_ZW9>nZFRbwF-MR!L8wd?myc|B zQdEJI9FGIZgAaptJYNJ%B--L@Yi>re=rg?zWsN0MJ2JqrVyBW?Fk1s5B&DcUX4eM? z@_VzuDBg|pQj9(xxyYp8*4+l%6wGa!2>wjE5VOpx;<66&Fp z7)~J?)-T%KUyD)>D| z_H^CFe;!%@aM!0t{Rs6_nnY^0n^52fwXraTM@RKH@yErgn>CW(A?I8MGj=Ea$m96l zkRnC9kC0{3XTNKstu$<27ap)D@94?AyxzDWtB-3X;l1yJ9haS^!vXBLT>$DqY)k6k zsg4vvq46Wj;W+Bu^tQ{y^U)@jfDjSYB)u<>wAgyqzJzJXzW@jpu;LAtoRs&isorRs znUlpQlnk74BY)Kp9Ma{q;uMX_I8@}7o?x@$a1SbmHtkZv(Q}ou3>2jbX&mmO@U*EH zX-=gR&roEs!bH$!_Vt+L=rVO49%0YVlP z`roPp{U3k*OK(dA1k7xBZ6Qso^1K8A|h%lcfOb9ahal_k)8Z_vV42Y92+@P z(%~NU!A4A~Tq`jKO|&dcJd*gyBSwst)$J<30Rs3W2pAdtH;$hs4u1v+~3Gg z(n0ZplB$8s2Zu5})+Ny5IupYqQYWc|afON_#`wiOxP>7oV!C8Z@pq^Q`M;7G9z^Hu zuGe>_jbwRJiS)Seg3mO$9Ykhem1ZIp4_%4FxJ?44B9G+n>v4XC3kkv@W?x1L>B57y zhw&0~heDhAV|Z64amdJzEWV>+PY1j5vL3Aj1BnL2X*ZR%dz8YOTPJX=gG=KLYH3Lt zdGqpkw>zI=w~Q_L*H8oqJY&`3&N=aRUTMW4WmjaTQY03OoQ76brx$Jw#}6C95fnn@JoW$v=$q z-t?nR&}-%NI(Y>{a~E~7!|9{ zkusnrUM~`>ozhE`-wI_Z??b?dS4Cl#cDpW;vP{|KzriIvU5J!ea2r7&5QdUOSF8xI);9Z<1h;nk*uzxR9VT z@PWEaTC8TlM$QYA!3@1TqsrXB{_|o|%ZM%Bf1}dxheWmxcslSNAsWW`lUjRy>j&ZT_lCb@7CsI zdOdZW;G{=rs??%l;Un|wZF2i$6ceF1v=z5uD`8!<38;d3!app~%joC?(89}}MObyU zF7Su~HiP~M8K50lrk?W?FC=$iss5al^M|rL&0xDEyl;5%Dftx5w9fwg1V#RtgL3oR z;&pgPk-T;C6Ccn}<3^)e`qQx6@w1X}fev{Y-(KlYy(cW*`cN|W#`kBV&g!HDLaLT# z(axS$F6bH8CD{m(yA zm6QQmbzpYH8Ss=_s`PfZhKnWI!w0ez$|X$kdmPwrWonHyT}uk(Iwj^MH~q^m^}2`L zK2(q&FI+{Nk5lH}h$Q3B@*Q8%+=VC((fbw3?V->2&XXU|!$tuevjT_7)7DBJXqndh zc7^94Y#KM!Y;Bf9pAk%QMoZX;>DJ1s7or|gJ!fH#5z;Z8^i6mHR{TCQ$b=#}7&rrN z7c#Q175EAwCXb6_CaM1=tVg@91te=9X+|rNW5Y1Hjd2-kNXEFRgj(5AfDnV*8~E{$ z;YNA}GtUiXKw{xl%dvW^V4kWOd;zzpKeUR`B`T7qL|jdbhIK)+B}N~U&_B}j#ZTz* z9aG&?Z#zaJcpvJ8rR6=SK|{T~S+4b660(A(MZXTp`d#anTd~yxq5uqAGLvt$esC7? z1qb}1J4hz{>&WCtrI)PYq4g|cmj3Zz*lrLX-rMgSQO}y&W%=6*YXOuE%t_`58jTbD zCB8WmuEkIn8_d_OEU$H3V3Am*yY!h}5+Xv26quaGoy|r%C`Kcx`y-oQT#{=ol*?0f zNcz}}G!jq3iyry-VhE=e-gZtY;c$W?JrVXVZstVG!^w9V*(3JUw_G<~^zq_X4ySR7 zJ#g~sIow0W1o7g_{}gp)+R^Gd6ZJYrkt$`e_>^R9oTEI!(Nx5t0JtBg>`r}|`%g$O z00wj_2#lBw+cTE=3+SS^9C<3WmCye(OP|S6J4e09o>nzSwk*vLUD~A zi$eNc%}q8D6af?sBQPmX4!3|*2OXEby3`dL+G7K4#wu@PiRR5z}LU}N|*fw zZ!+aqliIFQAEnS%=!(3);1KFRKw;WHjtK8ZBd!U_vjjlE2Y>AkTvfp-E{dLZb5t%< zU&L4MQ3?E}zgbWI?W-0qL$d*L;xR(Mo(vo^oFj-X*heQh7Bsj=j z)-0`!V4pDR@)zHT5$cv=P~w01lnw(um@7{1`6sor1Oe^MkN7qi(u*oyM(<9*xtn^W?{9}zLly_`4MQUn!@AzcYKx**sI-uE90ZK60q6W8S}}Z3 z0hYKGGQdX%7Ms7KlVJZkqfS})zFL!Yezx0Fo%cXMik>n6s5gOGpAV&t(O+Lq zZpZz)91Y;j|GyV8P*2qiz*_+HK@qS`wPDCC{sUy`;^n?o(*}AR$rAw!!~Gahyqrg5 z01ZBm@oG#8C)*StG*JOkN=S*@lx5gh`5Rp65;)?z(^Wgtk7!m_lHcn>kwza+>F>X3 zGnB7gp;K~Yp_3l6`B6`*EKz>s(aJ`mvd+EuC2n|r2GWfwy*306JFr6`F7PhG# zi7Gxg6-hKNpr9Q<*NNWmH;^X>+7PGKP!T7EQU>v2G10sPFGUqpF4g6V!tU!gscQ$~ zo)_aVlSlt2#~C>0P1#fmasAv=yww9ZIr`8cF&;REKfurm z@FPtEFbQ!6@9vJjtt$aBpJ3$>oOfYQj%izngM*LYbw8n|B!CVr;y#3ef0Z6&(v#(( z$D*$vtpF*S>18O<7ykf&fPbAUM>L?1DkK^1RMS#9gYFRX^+Ek9`{hZ2{oHN-$zDH7 z1~p=tGBTf30MnWYPBSqF-vHCzWsnaxcAfIw8^`_v`8uk$fZzMNFC zqmlAVO8)?N%LbSuA(^)v`wV|dU_&Hdyd@@JJ#o^I&cg~Nm4~oaC-tYiYIBT$2Rw24 z;(_*XK6w=V2%rejrgp%E_a9S$Xv?Yjp+I^Op1)cd?StSj03OSq)}>UC<)WD}?lJu+ z0yvU)IgT_@*q~B>T1GOAiNIVQyG1OKJFqOQ=O4g-tu{48a@zo5)JY%*^%MaNm?Ujd z$LKNoQX6+5km%UzGsyhv$Jxw*ilU*<-rtaaDvQZ@FS==ewpq~5>&ZUkPBXGDu z^lpDDP=WfmkgsxDfGd=3%oTHvxa3m#5)O9$qNa6CrwJFf80M=h6*(MG1B7LUa=i5B zm&uSGgYy)k8D`6(F&)h?qo_GjJ@H5dWM$xvXk=vjz>L#N6O596rmZEsYN*l?hV^hU z_2AP2sU)6FC0vzlk;Xt^e~3PROjKK7h-LUIG75Q8oeK@5D9qHvheWg)x{?$C& zvYo^xJu-1j1_BBBihfw9?dz~^`ef3v+BSqxJp+cMTUm%_@Kb1-$+`E*MQ;nPgK*8uoG>^1!90GcsxT3&T-?xATFr1o|<0H0y zhLA^-&T;AnXaX{QsHr@olg?hPOrML%H1NjRj~58WjG6ad;O?3l(feR!c_ zX2(D%7|KvH&UmLZdrutG4FD8TMF2Q#3(iY^l;6UNC;$UAcj-Vl^`qW^6m_5i#{ddU z;(&2L7DB3warLO!sct~}=M=!)@@ZItdWrx-ypDMHq#%kieRD@{^Z)`+8Kn)kpdW~& z#s^A1Z$tS|09=}00P9W0O*>TXn@;FDnm`FW14sm;p{JCM2Oo_D z&;o4(y)Of`Cqw=;x%SNf6q(5DK_k+WBONFKKN={_6aZ04nlnHeuPS3Z9lgT;09s*| zMIZ6+k^b#SvQ7XE$o2Cv{HZ+7d6*CQ9U%~^86Q4VDIV2h?3;lmS!t}Xu;O=bWgyad zDaPiUk9Fdmz(Z>o{{WWmJ&36m-XL%$InQ+m^r2D(>9C)~P+ar25szK;Y6POrERw_? zdqs*-4Z7rfnfJi{RbMiL!V~nAnh0Zz*^+(DA(FMVvYdyHJ@e1?sa5y^CWry(D!3>V z2DD(_z|pfKi)9D>vVX#X7R>h`ZW0Fkfc-N-yP8!S)&hOo2lc9cWYL_4iBJ2cn$k#4 z_IO|Z1N|{Yg5}0y0Nemv^xO#j1vzb<&Qi`f7yi0`_3DC6FmK%|ss8|BDsq=j0hGFr zUD*C+iveNn-B0?VAFvz0P--(|2?ViHeN!LKnk`-Me$&6$8U$(y zkuBZ3VX^vRq4WH=K1^X)_fwJjin!BTsQZk^{qO$0L|r8(5lfE4b_esI21hOHhA0Az za!PDXGmdycju}g*pU0Fw9Q;Gy~jtuef{4C$l)u&jW0VCY_ z&+dzVg;kL@0>;`veOU4Qr~vYO#{tZ1>fwR?Gfy^^P08$VM(7krdbRfKu=kNjz^ZD`p$r~d$WMe>S{+}z5n!Ji(xGCw+vt!Ei5t*{l| zERo?1bTt~H0cGokIeH4eBdZhGx<;g1}NESv%9XtllauD_F$!quP1h2EaUl# zj@-!S%ZfY}{^(+ANbIHIWCAtG$@2gw@c#hoP#}%G04xzaz`9x?P;f~<;%Us%#z^uY3+PJ!0F74=w9I^@ z0e{}(^{GC@%DHIWz0rm!0x2$9WAiE~{{UeCs{w-mVz-7)$AePCV$#F|c_>$)V}gGp zQN6Tw=u4C&bRdyH4PzbxNgQ$i0JD-0^8U2RNR5C9m_6Az{OKBNc@yS@hxJ;T8Fz$_ z5EkeMlu4jtl~Fs}uswFGWAma%SP4=h0QK_Nky1$uGX$6gPTpK(XZ5BSU}6;uuph!0 zpUe!N zQ2yWr&VMQ-ws@N?pf~$1gZSp8nk+~-+v+y+`P4=fyV7jkrYd(5X0x|&V z2jxdziYa>aqZq{iIag@yNXI;4f_=p>wE!<2%{QT?-Nhg@2vf!>yqZ#J37}y`CrVlX zD58>q1r)SUGelX*)P`?-(~L}hTp!CdRLU6ShbQY#4JJNVGMf>d@J(oYsP*&9a(lhygN^nSk;Y<4M zZa-5_3C>p4vF^hZ1%{=*S0Y>wW;KnQ69{{XbWQxeiV@g@(d zll;v!!a{y)oc$P+{HV|e`EMyK(#MSSVrp35oqzzNuG9T$1(Xq#5>5W`IHYI!j_Y#2 z=iY!PExJOxwkA8A)6runb|55mVsTYgLZ>@ik7oY>3X|uVcKphRsBF+6bl)J%YV3d6 zsYC!F^5fgbr9#%J5{F4yPJRCXodQ){g_2e@z>S0FZXX`lso_K*0RSh}zx{OA4zVfD zLG6K6&cy+pnLYFUGe8z@0u{hRk3|?22n&INevL$C7a3<}{4@N;4i(1H8DZNX=kyq$ z2Y~{pV>0eP!WVI-?m;&6B;&A+hv`sZV;?k9#^?KowK_F&cOuH%{{S0`03>LpW3;hu z;4MTQ(;;Bz*BPrWWIQ}b2m2(0`GHC!ZM&UL-r1F?0vP1GbHXqD2|%T1om&qA9RC1v zoMBc!ERzA~GDQSNy&QkvWFOXm86;AMT*Qg$3j?3dkF@z`%K_8qzz@(>sHS-1`^sbM zpEo9!E7*xG^SgFCPxGJ(B+SjWNu(+2HxW}Pwv=pGUEF^cKg%_4NvD|(z=MwJN&GWa zeA(AKmE4Ztg&)d*9I+K)8i&uIjkAx=f`KFq!V)v{ZvYYblTL=wc-#O2uOxQS$V4)OE_3rJ1M=dYWpf)D zS_u&FP$o(IjR0nOM{#7E8SWLo!h>yr{`GJZAOu~5_l~;Yk zk+*7()}eb@LoP&dkaP0JN8y@S5iN;xZz2=-cS*4R9MZh9F#>C8%CAgJXaPxb2yM(d zaU*|GP>2gL^KB$2wqGOp(Jaw3W5}1-H_U&X1*eff3RMsHRPOvvC<0$DOzd<*tIGk^ zmTD)84CEOmVaeX3Kae#n)=aIt&Sz8nETxzAH6pN%92g)k&>ewu`5FLNK-vqIO~Zg> z3HpEa>M3AXCN{YvcVC<3{{R|eS@2$EjB&zciT!FsjuC*6pvdQNLxcI#0=ukGuunP< z_zaFm=}v37l|n7a4Z+_SWB7AdB(|0`41(R14sw_W`WlGDRC%ckOYW*LKAh%|32!%? zHu=-CpW-OQXWtbJ?&k<4w#uKqhR@__{{TFQR5()H0UCgRomV!~@AB{$v1KHa_2z&q z$L1tiZH448wgrd$xrP`dQmjmSRyQ(hAb?3pD&+vX?v zPz21%B{3I4o~+Vy`qWAcgvAkN3O-^Oa6b`J`36)BvM`SsEx2U<6xX#VN%F+cjtqlR@yT+ImpNHLU{dY%M7u`tLBh{ukQf;F-Qmm zY|ctBh#og1FY*+L8>tE!L6R~?7-p=svNE$M4CL@PwV%2~g>qd)z6U@?hcOG@8N z0sN^7xmZ6;GL+LW9_5kji^yagDwGaY0^om2vN!)t|ltZY}s`fVn3MM?CS`fGccG zyyG6ZrkH?GdB%F<6=8`402G7jY9cy;v3`e&0AYaRjP$F3`$8 z{{UV%%>Y#+2Lw@5Hcu=L2XeFoRv86;nZcw4JY%7!WkBhgkZs0z$I_9Ib-@GMng&I? z>G@Ghj&M1o!Jq&Po&^}@o)mQC)PrJPPEAtPBD%tl1S%`?fKKkYKi*O0m;^^D>lRPAI__%TA6;~pbG3sJd$Yz2dyCK zK*uN@sFa>V{MJM|!|}yfwk5vtC+k()@70S+U`ndLYEiUfK9u>%Q}U8Nl-2(LkEQz3 z-1Vsek$l+Q&(@?s1MmR)R8aP*m+#X8SrJ`E^$m|vnyx@uR44ux@R zq5e7$69RH6CPni1Z5hbt9`p{PoiF;I#D6+qHOcifkuz@}G3o0=(na^j(ttJ@SIJ|v zbo8tnnH&>`Vffbjf2eQwYo5C5Xaqf7jf>@p>(tWNf2n`1F+bzQ{{R|&hx(WL(gLm5 z{CqdzR$+|{c_^pws@Grf@ZW`7gZ)sT2;N63(eG`5ecbW+RjXxFVwnK*=~UnEH`1=! z{{Y8|eP}?+bCc)n$=jZtt3oK#$sZ#ARh>Wle2=YZ#r~vF25stqMgSc46{^vqC&-Gu zIt*4__fhq&X+G!WKrlcz4l0%VxVS{z+czJVJXO^D!l+;W0LR*Yyl4bxqY*wqAm^=I zNgc<|?B7$Gq`&Kb8n+kSp$v3{vMRA9LFj49s*Vb%Q|bmOt_W~tf#0IZw+(fw-W$NISc0Nti0H9klfFUmJ`98?n$SCUOmKh(GT z)datGfGclwSqd{L+Ik#Oq{#1jL%T4?LUZ1l-*Qj)O&T}+f1juIq&8^=WVj(1sLw!g zS7$}?m9~tYrxiuNhGkv74_6+L^r>$D0OQU6 zqL2~VfMINm^WL8*2I3$K#wtl2w_|a^BRut} z-7`>_W)Xw036kL`9M!UHCdDXJx|uFNB0N&)G!?g1=M>|-A5QF2&3?# z5A}=mr`>fl0Ss!m2Lm`AsQzm1;hN=qj|o@$f#TkjNd6nnq4D(=-mMJ5oRT z^Yx|vC7=mgu0E9BlJUhj_57(1`q4lPezei|zY25prjNb&QeZ5dslUTclc@Sre};jL z?@3GEl7s^P01x9!N&G*JEdVEaN?!Do2q>b804So01|g-SG_(jPqKXD3EhQ}i5{f9G K0*WZ05C7Rdv@6sA literal 0 HcmV?d00001 diff --git a/resources/images/testdata/images_golden/filters/text/text_alignx-left.jpg b/resources/images/testdata/images_golden/filters/text/text_alignx-left.jpg index d77e301df3204e94ecafd4109a8f1602c6db4631..2894fae4276eb96f4c395d825a27f08293ff9b63 100644 GIT binary patch delta 23969 zcmYhj2UJtf6E++`L_t85suYzPnj*cUNK2$7RB2Ka2^gw$;erZCKtQVW8X#1G&;=>d zn-FT~ARt}3RNu?*|9)fT2T*4uc@`R?RvAMXDI`2& z3<kY4%^F-K!F@h7EEs*40gxb~=>0!n9EfRXQ8Yva?~TBF>w&hI*idQQ zb%H9TQ#vs`36#M&!nO)QnCFwp`B;$wN)R^a zg+*C)NUh@H>G2S&7#b96Ed5feFw_}F4&i}1YqbjVk%%PfK$UW>{DGVF>pJ9o>_ZTL z1$LQTCH-FrU)lya$%w$)LEs`foRq+bc$Rc`v2Djy0V&XKBX!( zW?i=wG>`+)RM-Ci+bZDSi$~+Ym787$(LtVTl~NfBc9G*mVB}079;lEc@CZBMOBTot zoWxJCE5NqBLLHn00)QBq)cca+9WJmw=6!hgYC$(~T^ zI3TzWWh2q)SHNK`Coxe4^28ufMYHmvp(0uC#B+%RFa;fV6^=1Q&imh_ug{le0q%i}>Kfxp(lxmYkF8`|Iofy-85y4$LJBww=c zWw+j?FTUiNg;u1u3iargcJR^5 z_R&?pI6%?ha~B#+P<3{ux}Xaq&|*a}6)}wPr6;=1$j=&;p#hA1tryw@7Ms&Bc7( +-- layouts/_partials/mytext.txt -- +
mytext
+-- layouts/all.html -- +myhtml: {{ partial "myhtml.html" . }} +mytext: {{ partial "mytext.txt" . }} +mytexts|safeHTML: {{ partial "mytext.txt" . | safeHTML }} +` + + b := hugolib.Test(t, files) + + b.AssertFileContent("public/index.html", + "myhtml:
myhtml
", + "mytext: <div>mytext</div>", + "mytexts|safeHTML:
mytext
", + ) } From 8b2124e7c3e4668304b91a980c89d992ba28f473 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 May 2025 08:56:36 +0000 Subject: [PATCH 057/129] build(deps): bump github.com/getkin/kin-openapi from 0.131.0 to 0.132.0 Bumps [github.com/getkin/kin-openapi](https://github.com/getkin/kin-openapi) from 0.131.0 to 0.132.0. - [Release notes](https://github.com/getkin/kin-openapi/releases) - [Commits](https://github.com/getkin/kin-openapi/compare/v0.131.0...v0.132.0) --- updated-dependencies: - dependency-name: github.com/getkin/kin-openapi dependency-version: 0.132.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index b2134802a..98ce16155 100644 --- a/go.mod +++ b/go.mod @@ -31,7 +31,7 @@ require ( github.com/fortytw2/leaktest v1.3.0 github.com/frankban/quicktest v1.14.6 github.com/fsnotify/fsnotify v1.9.0 - github.com/getkin/kin-openapi v0.131.0 + github.com/getkin/kin-openapi v0.132.0 github.com/ghodss/yaml v1.0.0 github.com/gobuffalo/flect v1.0.3 github.com/gobwas/glob v0.2.3 diff --git a/go.sum b/go.sum index 2d97b5ff0..b8fc01f7a 100644 --- a/go.sum +++ b/go.sum @@ -201,8 +201,8 @@ github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHk github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= -github.com/getkin/kin-openapi v0.131.0 h1:NO2UeHnFKRYhZ8wg6Nyh5Cq7dHk4suQQr72a4pMrDxE= -github.com/getkin/kin-openapi v0.131.0/go.mod h1:3OlG51PCYNsPByuiMB0t4fjnNlIDnaEDsjiKUV8nL58= +github.com/getkin/kin-openapi v0.132.0 h1:3ISeLMsQzcb5v26yeJrBcdTCEQTag36ZjaGk7MIRUwk= +github.com/getkin/kin-openapi v0.132.0/go.mod h1:3OlG51PCYNsPByuiMB0t4fjnNlIDnaEDsjiKUV8nL58= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= From 620fc87b56546aa4d9253e4b239c8db732b8e5ea Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 May 2025 08:56:25 +0000 Subject: [PATCH 058/129] build(deps): bump github.com/alecthomas/chroma/v2 from 2.17.0 to 2.17.2 Bumps [github.com/alecthomas/chroma/v2](https://github.com/alecthomas/chroma) from 2.17.0 to 2.17.2. - [Release notes](https://github.com/alecthomas/chroma/releases) - [Changelog](https://github.com/alecthomas/chroma/blob/master/.goreleaser.yml) - [Commits](https://github.com/alecthomas/chroma/compare/v2.17.0...v2.17.2) --- updated-dependencies: - dependency-name: github.com/alecthomas/chroma/v2 dependency-version: 2.17.2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 98ce16155..6a83524d6 100644 --- a/go.mod +++ b/go.mod @@ -2,7 +2,7 @@ module github.com/gohugoio/hugo require ( github.com/BurntSushi/locker v0.0.0-20171006230638-a6e239ea1c69 - github.com/alecthomas/chroma/v2 v2.17.0 + github.com/alecthomas/chroma/v2 v2.17.2 github.com/armon/go-radix v1.0.1-0.20221118154546-54df44f2176c github.com/aws/aws-sdk-go-v2 v1.36.1 github.com/aws/aws-sdk-go-v2/service/cloudfront v1.44.10 diff --git a/go.sum b/go.sum index b8fc01f7a..7dd0507b6 100644 --- a/go.sum +++ b/go.sum @@ -73,8 +73,8 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/alecthomas/assert/v2 v2.11.0 h1:2Q9r3ki8+JYXvGsDyBXwH3LcJ+WK5D0gc5E8vS6K3D0= github.com/alecthomas/assert/v2 v2.11.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k= -github.com/alecthomas/chroma/v2 v2.17.0 h1:3r2Cgk+nXNICMBxIFGnTRTbQFUwMiLisW+9uos0TtUI= -github.com/alecthomas/chroma/v2 v2.17.0/go.mod h1:RVX6AvYm4VfYe/zsk7mjHueLDZor3aWCNE14TFlepBk= +github.com/alecthomas/chroma/v2 v2.17.2 h1:Rm81SCZ2mPoH+Q8ZCc/9YvzPUN/E7HgPiPJD8SLV6GI= +github.com/alecthomas/chroma/v2 v2.17.2/go.mod h1:RVX6AvYm4VfYe/zsk7mjHueLDZor3aWCNE14TFlepBk= github.com/alecthomas/repr v0.4.0 h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc= github.com/alecthomas/repr v0.4.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= github.com/armon/go-radix v1.0.1-0.20221118154546-54df44f2176c h1:651/eoCRnQ7YtSjAnSzRucrJz+3iGEFt+ysraELS81M= From 95666fc5a4fd2d87528a1a69d562e0538a97062a Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Thu, 1 May 2025 13:50:04 +0000 Subject: [PATCH 059/129] releaser: Bump versions for release of 0.147.1 [ci skip] --- common/hugo/version_current.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/common/hugo/version_current.go b/common/hugo/version_current.go index ba367ceb5..9b396b110 100644 --- a/common/hugo/version_current.go +++ b/common/hugo/version_current.go @@ -17,7 +17,7 @@ package hugo // This should be the only one. var CurrentVersion = Version{ Major: 0, - Minor: 148, - PatchLevel: 0, - Suffix: "-DEV", + Minor: 147, + PatchLevel: 1, + Suffix: "", } From d799c045fd74e352edb606f26d21ded74fecb79d Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Thu, 1 May 2025 14:04:58 +0000 Subject: [PATCH 060/129] releaser: Prepare repository for 0.148.0-DEV [ci skip] --- common/hugo/version_current.go | 6 +++--- hugoreleaser.env | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/common/hugo/version_current.go b/common/hugo/version_current.go index 9b396b110..ba367ceb5 100644 --- a/common/hugo/version_current.go +++ b/common/hugo/version_current.go @@ -17,7 +17,7 @@ package hugo // This should be the only one. var CurrentVersion = Version{ Major: 0, - Minor: 147, - PatchLevel: 1, - Suffix: "", + Minor: 148, + PatchLevel: 0, + Suffix: "-DEV", } diff --git a/hugoreleaser.env b/hugoreleaser.env index 9d9a10112..4015dbc5c 100644 --- a/hugoreleaser.env +++ b/hugoreleaser.env @@ -1,7 +1,8 @@ # Release env. # These will be replaced by script before release. -HUGORELEASER_TAG=v0.147.0 -HUGORELEASER_COMMITISH=7d0039b86ddd6397816cc3383cb0cfa481b15f32 +HUGORELEASER_TAG=v0.147.1 +HUGORELEASER_COMMITISH=95666fc5a4fd2d87528a1a69d562e0538a97062a + From b39b24962350090122b5f3927456dde710cffb57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Fri, 2 May 2025 09:35:19 +0200 Subject: [PATCH 061/129] config: Add some more merge tests See #13681 --- .../allconfig/allconfig_integration_test.go | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/config/allconfig/allconfig_integration_test.go b/config/allconfig/allconfig_integration_test.go index 033947203..f8fbb22f7 100644 --- a/config/allconfig/allconfig_integration_test.go +++ b/config/allconfig/allconfig_integration_test.go @@ -273,6 +273,69 @@ GA ID: {{ site.Config.Services.GoogleAnalytics.ID }}. b.AssertFileContent("public/index.html", "GA ID: foo bar.") } +func TestMergeDeepBuildStats(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +baseURL = "https://example.com" +title = "Theme 1" +_merge = "deep" +[module] +[module.hugoVersion] +[[module.imports]] +path = "theme1" +-- themes/theme1/hugo.toml -- +[build] +[build.buildStats] +disableIDs = true +enable = true +-- layouts/home.html -- +Home. + +` + + b := hugolib.Test(t, files, hugolib.TestOptOsFs()) + + conf := b.H.Configs + base := conf.Base + + b.Assert(base.Title, qt.Equals, "Theme 1") + b.Assert(len(base.Module.Imports), qt.Equals, 1) + b.Assert(base.Build.BuildStats.Enable, qt.Equals, true) + b.AssertFileExists("/hugo_stats.json", true) +} + +func TestMergeDeepBuildStatsTheme(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +baseURL = "https://example.com" +_merge = "deep" +theme = ["theme1"] +-- themes/theme1/hugo.toml -- +title = "Theme 1" +[build] +[build.buildStats] +disableIDs = true +enable = true +-- layouts/home.html -- +Home. + +` + + b := hugolib.Test(t, files, hugolib.TestOptOsFs()) + + conf := b.H.Configs + base := conf.Base + + b.Assert(base.Title, qt.Equals, "Theme 1") + b.Assert(len(base.Module.Imports), qt.Equals, 1) + b.Assert(base.Build.BuildStats.Enable, qt.Equals, true) + b.AssertFileExists("/hugo_stats.json", true) +} + func TestDefaultConfigLanguageBlankWhenNoEnglishExists(t *testing.T) { t.Parallel() From 80f05953111ee750e652c30d40b5c64e6d6815dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Mon, 5 May 2025 10:11:28 +0200 Subject: [PATCH 062/129] tpl: Fix case issue in templates.Exists Fixes #13684 --- tpl/templates/templates_integration_test.go | 16 ++++++++++++++++ tpl/tplimpl/templatestore.go | 1 + 2 files changed, 17 insertions(+) diff --git a/tpl/templates/templates_integration_test.go b/tpl/templates/templates_integration_test.go index d16333ed4..baa917eee 100644 --- a/tpl/templates/templates_integration_test.go +++ b/tpl/templates/templates_integration_test.go @@ -299,3 +299,19 @@ P2. b := hugolib.Test(t, files) b.AssertFileContent("public/index.html", "P1: P1.\nP2: foo bar") } + +func TestTemplateExistsCaseIssue13684(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +-- layouts/home.html -- +P1: {{ templates.Exists "_partials/MyPartial.html" }}|P1: {{ templates.Exists "_partials/mypartial.html" }}| +-- layouts/_partials/MyPartial.html -- +MyPartial. + +` + + b := hugolib.Test(t, files) + b.AssertFileContent("public/index.html", "P1: true|P1: true|") +} diff --git a/tpl/tplimpl/templatestore.go b/tpl/tplimpl/templatestore.go index 4adf76b29..53880eb33 100644 --- a/tpl/tplimpl/templatestore.go +++ b/tpl/tplimpl/templatestore.go @@ -712,6 +712,7 @@ func (s *TemplateStore) RefreshFiles(include func(fi hugofs.FileMetaInfo) bool) } func (s *TemplateStore) HasTemplate(templatePath string) bool { + templatePath = strings.ToLower(templatePath) templatePath = paths.AddLeadingSlash(templatePath) return s.templatesByPath.Contains(templatePath) } From 363ab48a24fe4efcd602c963080c02b955119e6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Tue, 6 May 2025 09:09:05 +0200 Subject: [PATCH 063/129] Fix handling of "outputs" from content adapter pages Fixes #13689 --- hugolib/content_map.go | 2 +- hugolib/page__meta.go | 24 ++--------- .../pagesfromgotmpl_integration_test.go | 42 +++++++++++++++++++ hugolib/site.go | 2 +- resources/page/pagemeta/page_frontmatter.go | 20 +++++++-- .../page/pagemeta/page_frontmatter_test.go | 3 +- 6 files changed, 66 insertions(+), 27 deletions(-) diff --git a/hugolib/content_map.go b/hugolib/content_map.go index 56a602f54..454d36df7 100644 --- a/hugolib/content_map.go +++ b/hugolib/content_map.go @@ -356,7 +356,7 @@ func (m *pageMap) addPagesFromGoTmplFi(fi hugofs.FileMetaInfo, buildConfig *Buil Watching: s.Conf.Watching(), HandlePage: func(pt *pagesfromdata.PagesFromTemplate, pc *pagemeta.PageConfig) error { s := pt.Site.(*Site) - if err := pc.Compile(pt.GoTmplFi.Meta().PathInfo.Base(), true, "", s.Log, s.conf.MediaTypes.Config); err != nil { + if err := pc.Compile(pt.GoTmplFi.Meta().PathInfo.Base(), true, "", s.Log, s.conf.OutputFormats.Config, s.conf.MediaTypes.Config); err != nil { return err } diff --git a/hugolib/page__meta.go b/hugolib/page__meta.go index 9516c482a..94dbbab3e 100644 --- a/hugolib/page__meta.go +++ b/hugolib/page__meta.go @@ -54,7 +54,6 @@ type pageMeta struct { resource.Staler *pageMetaParams - pageMetaFrontMatter // Set for standalone pages, e.g. robotsTXT. standaloneOutputFormat output.Format @@ -79,7 +78,6 @@ func (m *pageMeta) setMetaPostPrepareRebuild() { Path: m.pageConfig.Path, Params: params, } - m.pageMetaFrontMatter = pageMetaFrontMatter{} } type pageMetaParams struct { @@ -94,11 +92,6 @@ type pageMetaParams struct { cascadeOriginal *maps.Ordered[page.PageMatcher, maps.Params] // contains the original cascade as defined in the front matter. } -// From page front matter. -type pageMetaFrontMatter struct { - configuredOutputFormats output.Formats // outputs defined in front matter. -} - func (m *pageMetaParams) init(preserveOriginal bool) { if preserveOriginal { m.paramsOriginal = xmaps.Clone[maps.Params](m.pageConfig.Params) @@ -531,16 +524,7 @@ params: for i, s := range o { o[i] = strings.ToLower(s) } - if len(o) > 0 { - // Output formats are explicitly set in front matter, use those. - outFormats, err := p.s.conf.OutputFormats.Config.GetByNames(o...) - if err != nil { - p.s.Log.Errorf("Failed to resolve output formats: %s", err) - } else { - pm.configuredOutputFormats = outFormats - params[loki] = outFormats - } - } + pm.pageConfig.Outputs = o case "draft": draft = new(bool) *draft = cast.ToBool(v) @@ -672,7 +656,7 @@ params: return err } - if err := pcfg.Compile("", false, ext, p.s.Log, p.s.conf.MediaTypes.Config); err != nil { + if err := pcfg.Compile("", false, ext, p.s.Log, p.s.conf.OutputFormats.Config, p.s.conf.MediaTypes.Config); err != nil { return err } @@ -829,8 +813,8 @@ func (p *pageMeta) newContentConverter(ps *pageState, markup string) (converter. // The output formats this page will be rendered to. func (m *pageMeta) outputFormats() output.Formats { - if len(m.configuredOutputFormats) > 0 { - return m.configuredOutputFormats + if len(m.pageConfig.ConfiguredOutputFormats) > 0 { + return m.pageConfig.ConfiguredOutputFormats } return m.s.conf.C.KindOutputFormats[m.Kind()] } diff --git a/hugolib/pagesfromdata/pagesfromgotmpl_integration_test.go b/hugolib/pagesfromdata/pagesfromgotmpl_integration_test.go index a31b93999..f6e4221a0 100644 --- a/hugolib/pagesfromdata/pagesfromgotmpl_integration_test.go +++ b/hugolib/pagesfromdata/pagesfromgotmpl_integration_test.go @@ -779,3 +779,45 @@ Single. b.AssertFileContent("public/tags/index.html", "Terms: mytag: 1|§s") } + +func TestContentAdapterOutputsIssue13689(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +disableKinds = ['home','rss','section','sitemap','taxonomy','term'] +[outputs] +page = ['html','json'] +-- layouts/page.html -- +html: {{ .Title }} +-- layouts/page.json -- +json: {{ .Title }} +-- content/p1.md -- +--- +title: p1 +--- +-- content/p2.md -- +--- +title: p2 +outputs: + - html +--- +-- content/_content.gotmpl -- +{{ $page := dict "path" "p3" "title" "p3" }} +{{ $.AddPage $page }} + +{{ $page := dict "path" "p4" "title" "p4" "outputs" (slice "html") }} +{{ $.AddPage $page }} +` + + b := hugolib.Test(t, files) + + b.AssertFileExists("public/p1/index.html", true) + b.AssertFileExists("public/p1/index.json", true) + b.AssertFileExists("public/p2/index.html", true) + b.AssertFileExists("public/p2/index.json", false) + b.AssertFileExists("public/p3/index.html", true) + b.AssertFileExists("public/p3/index.json", true) + b.AssertFileExists("public/p4/index.html", true) + b.AssertFileExists("public/p4/index.json", false) // currently returns true +} diff --git a/hugolib/site.go b/hugolib/site.go index 728b036d2..0e658086b 100644 --- a/hugolib/site.go +++ b/hugolib/site.go @@ -804,7 +804,7 @@ func (s *Site) initRenderFormats() { Tree: s.pageMap.treePages, Handle: func(key string, n contentNodeI, match doctree.DimensionFlag) (bool, error) { if p, ok := n.(*pageState); ok { - for _, f := range p.m.configuredOutputFormats { + for _, f := range p.m.pageConfig.ConfiguredOutputFormats { if !formatSet[f.Name] { formats = append(formats, f) formatSet[f.Name] = true diff --git a/resources/page/pagemeta/page_frontmatter.go b/resources/page/pagemeta/page_frontmatter.go index 7f98b1b88..eb52e5055 100644 --- a/resources/page/pagemeta/page_frontmatter.go +++ b/resources/page/pagemeta/page_frontmatter.go @@ -29,6 +29,7 @@ import ( "github.com/gohugoio/hugo/hugofs/files" "github.com/gohugoio/hugo/markup" "github.com/gohugoio/hugo/media" + "github.com/gohugoio/hugo/output" "github.com/gohugoio/hugo/resources/kinds" "github.com/gohugoio/hugo/resources/page" "github.com/gohugoio/hugo/resources/resource" @@ -114,9 +115,10 @@ type PageConfig struct { Content Source // Compiled values. - CascadeCompiled *maps.Ordered[page.PageMatcher, maps.Params] `mapstructure:"-" json:"-"` - ContentMediaType media.Type `mapstructure:"-" json:"-"` - IsFromContentAdapter bool `mapstructure:"-" json:"-"` + CascadeCompiled *maps.Ordered[page.PageMatcher, maps.Params] `mapstructure:"-" json:"-"` + ContentMediaType media.Type `mapstructure:"-" json:"-"` + ConfiguredOutputFormats output.Formats `mapstructure:"-" json:"-"` + IsFromContentAdapter bool `mapstructure:"-" json:"-"` } var DefaultPageConfig = PageConfig{ @@ -150,7 +152,7 @@ func (p *PageConfig) Validate(pagesFromData bool) error { } // Compile sets up the page configuration after all fields have been set. -func (p *PageConfig) Compile(basePath string, pagesFromData bool, ext string, logger loggers.Logger, mediaTypes media.Types) error { +func (p *PageConfig) Compile(basePath string, pagesFromData bool, ext string, logger loggers.Logger, outputFormats output.Formats, mediaTypes media.Types) error { // In content adapters, we always get relative paths. if basePath != "" { p.Path = path.Join(basePath, p.Path) @@ -195,6 +197,15 @@ func (p *PageConfig) Compile(basePath string, pagesFromData bool, ext string, lo p.Content.Markup = p.ContentMediaType.SubType } + if len(p.Outputs) > 0 { + outFormats, err := outputFormats.GetByNames(p.Outputs...) + if err != nil { + return fmt.Errorf("failed to resolve output formats %v: %w", p.Outputs, err) + } else { + p.ConfiguredOutputFormats = outFormats + } + } + if pagesFromData { if p.Kind == "" { p.Kind = kinds.KindPage @@ -205,6 +216,7 @@ func (p *PageConfig) Compile(basePath string, pagesFromData bool, ext string, lo // but also because people tend to use use the filename to name their resources (with spaces and all), // and this isn't relevant when creating resources from an API where it's easy to add textual meta data. p.Path = paths.NormalizePathStringBasic(p.Path) + } if p.Cascade != nil { diff --git a/resources/page/pagemeta/page_frontmatter_test.go b/resources/page/pagemeta/page_frontmatter_test.go index fe9d3d99c..de2932391 100644 --- a/resources/page/pagemeta/page_frontmatter_test.go +++ b/resources/page/pagemeta/page_frontmatter_test.go @@ -22,6 +22,7 @@ import ( "github.com/gohugoio/hugo/config" "github.com/gohugoio/hugo/config/testconfig" "github.com/gohugoio/hugo/media" + "github.com/gohugoio/hugo/output" "github.com/gohugoio/hugo/resources/page/pagemeta" @@ -175,7 +176,7 @@ func TestContentMediaTypeFromMarkup(t *testing.T) { } { var pc pagemeta.PageConfig pc.Content.Markup = test.in - c.Assert(pc.Compile("", true, "", logger, media.DefaultTypes), qt.IsNil) + c.Assert(pc.Compile("", true, "", logger, output.DefaultFormats, media.DefaultTypes), qt.IsNil) c.Assert(pc.ContentMediaType.Type, qt.Equals, test.expected) } } From c7feb15d10b29a94d7fb57c31e8bcb2e92718fb7 Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Tue, 6 May 2025 11:18:55 +0000 Subject: [PATCH 064/129] releaser: Bump versions for release of 0.147.2 [ci skip] --- common/hugo/version_current.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/common/hugo/version_current.go b/common/hugo/version_current.go index ba367ceb5..73deea29b 100644 --- a/common/hugo/version_current.go +++ b/common/hugo/version_current.go @@ -17,7 +17,7 @@ package hugo // This should be the only one. var CurrentVersion = Version{ Major: 0, - Minor: 148, - PatchLevel: 0, - Suffix: "-DEV", + Minor: 147, + PatchLevel: 2, + Suffix: "", } From d70f828e2bf20532b0644bd70635edba2488cac2 Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Tue, 6 May 2025 11:33:36 +0000 Subject: [PATCH 065/129] releaser: Prepare repository for 0.148.0-DEV [ci skip] --- common/hugo/version_current.go | 6 +++--- hugoreleaser.env | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/common/hugo/version_current.go b/common/hugo/version_current.go index 73deea29b..ba367ceb5 100644 --- a/common/hugo/version_current.go +++ b/common/hugo/version_current.go @@ -17,7 +17,7 @@ package hugo // This should be the only one. var CurrentVersion = Version{ Major: 0, - Minor: 147, - PatchLevel: 2, - Suffix: "", + Minor: 148, + PatchLevel: 0, + Suffix: "-DEV", } diff --git a/hugoreleaser.env b/hugoreleaser.env index 4015dbc5c..5d373cd71 100644 --- a/hugoreleaser.env +++ b/hugoreleaser.env @@ -1,7 +1,8 @@ # Release env. # These will be replaced by script before release. -HUGORELEASER_TAG=v0.147.1 -HUGORELEASER_COMMITISH=95666fc5a4fd2d87528a1a69d562e0538a97062a +HUGORELEASER_TAG=v0.147.2 +HUGORELEASER_COMMITISH=c7feb15d10b29a94d7fb57c31e8bcb2e92718fb7 + From 325a0dba63252599826c3ecc955c7919a4a3ba39 Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Tue, 6 May 2025 11:57:03 -0700 Subject: [PATCH 066/129] tpl/math: Add MaxInt64 function Closes #13693 --- tpl/math/init.go | 7 +++++++ tpl/math/math.go | 5 +++++ tpl/math/math_test.go | 11 +++++++++++ 3 files changed, 23 insertions(+) diff --git a/tpl/math/init.go b/tpl/math/init.go index bfaf4526a..bb3c02bd6 100644 --- a/tpl/math/init.go +++ b/tpl/math/init.go @@ -115,6 +115,13 @@ func init() { }, ) + ns.AddMethodMapping(ctx.MaxInt64, + nil, + [][2]string{ + {"{{ math.MaxInt64 }}", "9223372036854775807"}, + }, + ) + ns.AddMethodMapping(ctx.Min, nil, [][2]string{ diff --git a/tpl/math/math.go b/tpl/math/math.go index a0512c045..01e75e9c8 100644 --- a/tpl/math/math.go +++ b/tpl/math/math.go @@ -147,6 +147,11 @@ func (ns *Namespace) Max(inputs ...any) (maximum float64, err error) { return ns.applyOpToScalarsOrSlices("Max", math.Max, inputs...) } +// MaxInt64 returns the maximum value for a signed 64-bit integer. +func (ns *Namespace) MaxInt64() int64 { + return math.MaxInt64 +} + // Min returns the smaller of all numbers in inputs. Any slices in inputs are flattened. func (ns *Namespace) Min(inputs ...any) (minimum float64, err error) { return ns.applyOpToScalarsOrSlices("Min", math.Min, inputs...) diff --git a/tpl/math/math_test.go b/tpl/math/math_test.go index d45a2aace..cc4fe31eb 100644 --- a/tpl/math/math_test.go +++ b/tpl/math/math_test.go @@ -879,3 +879,14 @@ func TestToRadians(t *testing.T) { c.Assert(result, qt.Equals, test.expect) } } + +func TestMaxInt64(t *testing.T) { + t.Parallel() + ns := New(nil) + + var want int64 = 9223372036854775807 + got := ns.MaxInt64() + if want != got { + t.Errorf("want %d, got %d", want, got) + } +} From 84d7a108e892e67cde43560606c125cff0f5b4cc Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Fri, 9 May 2025 10:02:00 -0700 Subject: [PATCH 067/129] tpl/tplimpl: Fix vimeo shortcode test to accommodate API changes Fixes #13687 --- tpl/tplimpl/embedded/templates/_shortcodes/vimeo_simple.html | 2 +- tpl/tplimpl/shortcodes_integration_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tpl/tplimpl/embedded/templates/_shortcodes/vimeo_simple.html b/tpl/tplimpl/embedded/templates/_shortcodes/vimeo_simple.html index 86a6dfc9f..2e5f88282 100644 --- a/tpl/tplimpl/embedded/templates/_shortcodes/vimeo_simple.html +++ b/tpl/tplimpl/embedded/templates/_shortcodes/vimeo_simple.html @@ -37,7 +37,7 @@ {{- $thumbnail := .thumbnail_url -}} {{- $original := $thumbnail | replaceRE "(_.*\\.)" "." -}}
- + {{ .title }}
{{ template "__h_simple_icon_play" $.ctx.Page }} diff --git a/tpl/tplimpl/shortcodes_integration_test.go b/tpl/tplimpl/shortcodes_integration_test.go index 9d7af4a3d..838dc16d7 100644 --- a/tpl/tplimpl/shortcodes_integration_test.go +++ b/tpl/tplimpl/shortcodes_integration_test.go @@ -495,7 +495,7 @@ Content: {{ .Content }} // Simple mode files = strings.ReplaceAll(files, "privacy.vimeo.simple = false", "privacy.vimeo.simple = true") b = hugolib.Test(t, files) - b.AssertFileContent("public/p1/index.html", "c5bf16d87e2a370b") + b.AssertFileContent("public/p1/index.html", "04d861fc957ee638") // Simple mode with non-existent id files = strings.ReplaceAll(files, "{{< vimeo 55073825 >}}", "{{< vimeo __id_does_not_exist__ >}}") From 9d1d8c88997b6785e2d173ba5bab3ff2004c95dc Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Fri, 9 May 2025 08:45:06 -0700 Subject: [PATCH 068/129] commands: Fix description of new theme commands Fixes #13701 --- commands/new.go | 14 +++++--------- testscripts/commands/new.txt | 4 ++-- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/commands/new.go b/commands/new.go index fdc1f65f2..81e1c65a4 100644 --- a/commands/new.go +++ b/commands/new.go @@ -76,10 +76,8 @@ Ensure you run this within the root directory of your site.`, &simpleCommand{ name: "site", use: "site [path]", - short: "Create a new site (skeleton)", - long: `Create a new site in the provided directory. -The new site will have the correct structure, but no content or theme yet. -Use ` + "`hugo new [contentPath]`" + ` to create new content.`, + short: "Create a new site", + long: `Create a new site at the specified path.`, run: func(ctx context.Context, cd *simplecobra.Commandeer, r *rootCommand, args []string) error { if len(args) < 1 { return newUserError("path needs to be provided") @@ -124,11 +122,9 @@ Use ` + "`hugo new [contentPath]`" + ` to create new content.`, &simpleCommand{ name: "theme", use: "theme [name]", - short: "Create a new theme (skeleton)", - long: `Create a new theme (skeleton) called [name] in ./themes. -New theme is a skeleton. Please add content to the touched files. Add your -name to the copyright line in the license and adjust the theme.toml file -according to your needs.`, + short: "Create a new theme", + long: `Create a new theme with the specified name in the ./themes directory. +This generates a functional theme including template examples and sample content.`, run: func(ctx context.Context, cd *simplecobra.Commandeer, r *rootCommand, args []string) error { if len(args) < 1 { return newUserError("theme name needs to be provided") diff --git a/testscripts/commands/new.txt b/testscripts/commands/new.txt index cd338203f..f8d7c1ec1 100644 --- a/testscripts/commands/new.txt +++ b/testscripts/commands/new.txt @@ -1,7 +1,7 @@ # Test the new command. hugo new site -h -stdout 'Create a new site in the provided directory' +stdout 'Create a new site at the specified path.' hugo new site my-yaml-site --format yml checkfile my-yaml-site/hugo.yml hugo new site mysite -f @@ -19,7 +19,7 @@ exists themes ! exists resources hugo new theme -h -stdout 'Create a new theme \(skeleton\) called \[name\] in ./themes' +stdout 'Create a new theme with the specified name in the ./themes directory.' hugo new theme mytheme --format yml stdout 'Creating new theme' ! exists resources From c745a3e10849198a401c600232ceda5d8cf7381f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Wed, 7 May 2025 10:40:39 +0200 Subject: [PATCH 069/129] Fix/implement cascade for content adapters Fixes #13692 --- config/allconfig/alldecoders.go | 2 +- hugolib/content_map.go | 2 +- hugolib/content_map_page.go | 16 +- hugolib/page__meta.go | 38 +++-- hugolib/pagesfromdata/pagesfromgotmpl.go | 11 +- .../pagesfromgotmpl_integration_test.go | 94 ++++++++++++ resources/page/page_matcher.go | 39 ++++- resources/page/page_matcher_test.go | 6 +- resources/page/pagemeta/page_frontmatter.go | 141 ++++++++++++------ .../page/pagemeta/page_frontmatter_test.go | 2 +- tpl/tplimpl/shortcodes_integration_test.go | 1 + 11 files changed, 273 insertions(+), 79 deletions(-) diff --git a/config/allconfig/alldecoders.go b/config/allconfig/alldecoders.go index 1cfa1afc4..035349790 100644 --- a/config/allconfig/alldecoders.go +++ b/config/allconfig/alldecoders.go @@ -330,7 +330,7 @@ var allDecoderSetups = map[string]decodeWeight{ key: "cascade", decode: func(d decodeWeight, p decodeConfig) error { var err error - p.c.Cascade, err = page.DecodeCascadeConfig(nil, p.p.Get(d.key)) + p.c.Cascade, err = page.DecodeCascadeConfig(nil, true, p.p.Get(d.key)) return err }, }, diff --git a/hugolib/content_map.go b/hugolib/content_map.go index 454d36df7..596a8f7f9 100644 --- a/hugolib/content_map.go +++ b/hugolib/content_map.go @@ -356,7 +356,7 @@ func (m *pageMap) addPagesFromGoTmplFi(fi hugofs.FileMetaInfo, buildConfig *Buil Watching: s.Conf.Watching(), HandlePage: func(pt *pagesfromdata.PagesFromTemplate, pc *pagemeta.PageConfig) error { s := pt.Site.(*Site) - if err := pc.Compile(pt.GoTmplFi.Meta().PathInfo.Base(), true, "", s.Log, s.conf.OutputFormats.Config, s.conf.MediaTypes.Config); err != nil { + if err := pc.CompileForPagesFromDataPre(pt.GoTmplFi.Meta().PathInfo.Base(), m.s.Log, s.conf.MediaTypes.Config); err != nil { return err } diff --git a/hugolib/content_map_page.go b/hugolib/content_map_page.go index be834fbb6..9e67fbb1b 100644 --- a/hugolib/content_map_page.go +++ b/hugolib/content_map_page.go @@ -1695,7 +1695,9 @@ func (sa *sitePagesAssembler) assembleTermsAndTranslations() error { pathInfo: pi, pageMetaParams: &pageMetaParams{ pageConfig: &pagemeta.PageConfig{ - Kind: kinds.KindTerm, + PageConfigEarly: pagemeta.PageConfigEarly{ + Kind: kinds.KindTerm, + }, }, }, } @@ -1956,7 +1958,9 @@ func (sa *sitePagesAssembler) addStandalonePages() error { pathInfo: s.Conf.PathParser().Parse(files.ComponentFolderContent, key+f.MediaType.FirstSuffix.FullSuffix), pageMetaParams: &pageMetaParams{ pageConfig: &pagemeta.PageConfig{ - Kind: kind, + PageConfigEarly: pagemeta.PageConfigEarly{ + Kind: kind, + }, }, }, standaloneOutputFormat: f, @@ -2082,7 +2086,9 @@ func (sa *sitePagesAssembler) addMissingRootSections() error { pathInfo: p, pageMetaParams: &pageMetaParams{ pageConfig: &pagemeta.PageConfig{ - Kind: kinds.KindHome, + PageConfigEarly: pagemeta.PageConfigEarly{ + Kind: kinds.KindHome, + }, }, }, } @@ -2115,7 +2121,9 @@ func (sa *sitePagesAssembler) addMissingTaxonomies() error { pathInfo: sa.Conf.PathParser().Parse(files.ComponentFolderContent, key+"/_index.md"), pageMetaParams: &pageMetaParams{ pageConfig: &pagemeta.PageConfig{ - Kind: kinds.KindTaxonomy, + PageConfigEarly: pagemeta.PageConfigEarly{ + Kind: kinds.KindTaxonomy, + }, }, }, singular: viewName.singular, diff --git a/hugolib/page__meta.go b/hugolib/page__meta.go index 94dbbab3e..e8bce20d1 100644 --- a/hugolib/page__meta.go +++ b/hugolib/page__meta.go @@ -72,12 +72,7 @@ type pageMeta struct { // Prepare for a rebuild of the data passed in from front matter. func (m *pageMeta) setMetaPostPrepareRebuild() { params := xmaps.Clone(m.paramsOriginal) - m.pageMetaParams.pageConfig = &pagemeta.PageConfig{ - Kind: m.pageConfig.Kind, - Lang: m.pageConfig.Lang, - Path: m.pageConfig.Path, - Params: params, - } + m.pageMetaParams.pageConfig = pagemeta.ClonePageConfigForRebuild(m.pageMetaParams.pageConfig, params) } type pageMetaParams struct { @@ -94,7 +89,11 @@ type pageMetaParams struct { func (m *pageMetaParams) init(preserveOriginal bool) { if preserveOriginal { - m.paramsOriginal = xmaps.Clone[maps.Params](m.pageConfig.Params) + if m.pageConfig.IsFromContentAdapter { + m.paramsOriginal = xmaps.Clone(m.pageConfig.ContentAdapterData) + } else { + m.paramsOriginal = xmaps.Clone(m.pageConfig.Params) + } m.cascadeOriginal = m.pageConfig.CascadeCompiled.Clone() } } @@ -254,7 +253,7 @@ func (p *pageMeta) setMetaPre(pi *contentParseInfo, logger loggers.Logger, conf // Check for any cascade define on itself. if cv, found := frontmatter["cascade"]; found { var err error - cascade, err := page.DecodeCascade(logger, cv) + cascade, err := page.DecodeCascade(logger, true, cv) if err != nil { return err } @@ -341,18 +340,29 @@ func (ps *pageState) setMetaPost(cascade *maps.Ordered[page.PageMatcher, maps.Pa } // Cascade is also applied to itself. + var err error cascade.Range(func(k page.PageMatcher, v maps.Params) bool { if !k.Matches(ps) { return true } for kk, vv := range v { - if _, found := ps.m.pageConfig.Params[kk]; !found { - ps.m.pageConfig.Params[kk] = vv + if ps.m.pageConfig.IsFromContentAdapter { + if _, found := ps.m.pageConfig.ContentAdapterData[kk]; !found { + ps.m.pageConfig.ContentAdapterData[kk] = vv + } + } else { + if _, found := ps.m.pageConfig.Params[kk]; !found { + ps.m.pageConfig.Params[kk] = vv + } } } return true }) + if err != nil { + return err + } + if err := ps.setMetaPostParams(); err != nil { return err } @@ -398,6 +408,12 @@ func (p *pageState) setMetaPostParams() error { PathOrTitle: p.pathOrTitle(), } + if isContentAdapter { + if err := pm.pageConfig.Compile(ext, p.s.Log, p.s.conf.OutputFormats.Config, p.s.conf.MediaTypes.Config); err != nil { + return err + } + } + // Handle the date separately // TODO(bep) we need to "do more" in this area so this can be split up and // more easily tested without the Page, but the coupling is strong. @@ -656,7 +672,7 @@ params: return err } - if err := pcfg.Compile("", false, ext, p.s.Log, p.s.conf.OutputFormats.Config, p.s.conf.MediaTypes.Config); err != nil { + if err := pcfg.Compile(ext, p.s.Log, p.s.conf.OutputFormats.Config, p.s.conf.MediaTypes.Config); err != nil { return err } diff --git a/hugolib/pagesfromdata/pagesfromgotmpl.go b/hugolib/pagesfromdata/pagesfromgotmpl.go index a704b39ee..72909a40b 100644 --- a/hugolib/pagesfromdata/pagesfromgotmpl.go +++ b/hugolib/pagesfromdata/pagesfromgotmpl.go @@ -91,17 +91,20 @@ func (p *pagesFromDataTemplateContext) AddPage(v any) (string, error) { pd := pagemeta.DefaultPageConfig pd.IsFromContentAdapter = true + pd.ContentAdapterData = m - if err := mapstructure.WeakDecode(m, &pd); err != nil { - return "", fmt.Errorf("failed to decode page map: %w", err) + // The rest will be handled after the cascade is calculated and applied. + if err := mapstructure.WeakDecode(pd.ContentAdapterData, &pd.PageConfigEarly); err != nil { + err = fmt.Errorf("failed to decode page map: %w", err) + return "", err } - p.p.buildState.NumPagesAdded++ - if err := pd.Validate(true); err != nil { return "", err } + p.p.buildState.NumPagesAdded++ + return "", p.p.HandlePage(p.p, &pd) } diff --git a/hugolib/pagesfromdata/pagesfromgotmpl_integration_test.go b/hugolib/pagesfromdata/pagesfromgotmpl_integration_test.go index f6e4221a0..db06fb4a4 100644 --- a/hugolib/pagesfromdata/pagesfromgotmpl_integration_test.go +++ b/hugolib/pagesfromdata/pagesfromgotmpl_integration_test.go @@ -821,3 +821,97 @@ outputs: b.AssertFileExists("public/p4/index.html", true) b.AssertFileExists("public/p4/index.json", false) // currently returns true } + +func TestContentAdapterOutputsIssue13692(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +disableKinds = ['page','home','sitemap','taxonomy','term'] +[[cascade]] +outputs = ['html','json'] +[cascade.target] +path = '{/s2,/s4}' +-- layouts/section.html -- +html: {{ .Title }} +-- layouts/section.json -- +json: {{ .Title }} +-- content/s1/_index.md -- +--- +title: s1 +--- +-- content/s2/_index.md -- +--- +title: s2 +--- +-- content/_content.gotmpl -- +{{ $page := dict "path" "s3" "title" "s3" "kind" "section" }} +{{ $.AddPage $page }} + +{{ $page := dict "path" "s4" "title" "s4" "kind" "section" }} +{{ $.AddPage $page }} + +{{ $page := dict "path" "s5" "title" "s5" "kind" "section" "outputs" (slice "html") }} + {{ $.AddPage $page }} +` + + b := hugolib.Test(t, files) + + b.AssertFileExists("public/s1/index.html", true) + b.AssertFileExists("public/s1/index.json", false) + b.AssertFileExists("public/s1/index.xml", true) + + b.AssertFileExists("public/s2/index.html", true) + b.AssertFileExists("public/s2/index.json", true) + b.AssertFileExists("public/s2/index.xml", false) + + b.AssertFileExists("public/s3/index.html", true) + b.AssertFileExists("public/s3/index.json", false) + b.AssertFileExists("public/s3/index.xml", true) + + b.AssertFileExists("public/s4/index.html", true) + b.AssertFileExists("public/s4/index.json", true) + b.AssertFileExists("public/s4/index.xml", false) + + b.AssertFileExists("public/s5/index.html", true) + b.AssertFileExists("public/s5/index.json", false) + b.AssertFileExists("public/s5/index.xml", false) +} + +func TestContentAdapterCascadeBasic(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +disableLiveReload = true +-- content/_index.md -- +--- +cascade: + - title: foo + target: + path: "**" +--- +-- layouts/all.html -- +Title: {{ .Title }}|Content: {{ .Content }}| +-- content/_content.gotmpl -- +{{ $content := dict + "mediaType" "text/markdown" + "value" "The _Hunchback of Notre Dame_ was written by Victor Hugo." +}} + +{{ $page := dict "path" "s1" "kind" "page" }} +{{ $.AddPage $page }} + {{ $page := dict "path" "s2" "kind" "page" "title" "bar" "content" $content }} +{{ $.AddPage $page }} + +` + + b := hugolib.TestRunning(t, files) + + b.AssertFileContent("public/s1/index.html", "Title: foo|") + b.AssertFileContent("public/s2/index.html", "Title: bar|", "Content:

The Hunchback of Notre Dame was written by Victor Hugo.

") + + b.EditFileReplaceAll("content/_index.md", "foo", "baz").Build() + + b.AssertFileContent("public/s1/index.html", "Title: baz|") +} diff --git a/resources/page/page_matcher.go b/resources/page/page_matcher.go index 1e98b0836..27a7c7e9e 100644 --- a/resources/page/page_matcher.go +++ b/resources/page/page_matcher.go @@ -16,6 +16,7 @@ package page import ( "fmt" "path/filepath" + "slices" "strings" "github.com/gohugoio/hugo/common/loggers" @@ -24,7 +25,6 @@ import ( "github.com/gohugoio/hugo/hugofs/glob" "github.com/gohugoio/hugo/resources/kinds" "github.com/mitchellh/mapstructure" - "slices" ) // A PageMatcher can be used to match a Page with Glob patterns. @@ -105,7 +105,7 @@ func CheckCascadePattern(logger loggers.Logger, m PageMatcher) { } } -func DecodeCascadeConfig(logger loggers.Logger, in any) (*config.ConfigNamespace[[]PageMatcherParamsConfig, *maps.Ordered[PageMatcher, maps.Params]], error) { +func DecodeCascadeConfig(logger loggers.Logger, handleLegacyFormat bool, in any) (*config.ConfigNamespace[[]PageMatcherParamsConfig, *maps.Ordered[PageMatcher, maps.Params]], error) { buildConfig := func(in any) (*maps.Ordered[PageMatcher, maps.Params], any, error) { cascade := maps.NewOrdered[PageMatcher, maps.Params]() if in == nil { @@ -120,7 +120,15 @@ func DecodeCascadeConfig(logger loggers.Logger, in any) (*config.ConfigNamespace for _, m := range ms { m = maps.CleanConfigStringMap(m) - c, err := mapToPageMatcherParamsConfig(m) + var ( + c PageMatcherParamsConfig + err error + ) + if handleLegacyFormat { + c, err = mapToPageMatcherParamsConfigLegacy(m) + } else { + c, err = mapToPageMatcherParamsConfig(m) + } if err != nil { return nil, nil, err } @@ -155,8 +163,8 @@ func DecodeCascadeConfig(logger loggers.Logger, in any) (*config.ConfigNamespace } // DecodeCascade decodes in which could be either a map or a slice of maps. -func DecodeCascade(logger loggers.Logger, in any) (*maps.Ordered[PageMatcher, maps.Params], error) { - conf, err := DecodeCascadeConfig(logger, in) +func DecodeCascade(logger loggers.Logger, handleLegacyFormat bool, in any) (*maps.Ordered[PageMatcher, maps.Params], error) { + conf, err := DecodeCascadeConfig(logger, handleLegacyFormat, in) if err != nil { return nil, err } @@ -164,6 +172,26 @@ func DecodeCascade(logger loggers.Logger, in any) (*maps.Ordered[PageMatcher, ma } func mapToPageMatcherParamsConfig(m map[string]any) (PageMatcherParamsConfig, error) { + var pcfg PageMatcherParamsConfig + for k, v := range m { + switch strings.ToLower(k) { + case "_target", "target": + var target PageMatcher + if err := decodePageMatcher(v, &target); err != nil { + return pcfg, err + } + pcfg.Target = target + default: + if pcfg.Params == nil { + pcfg.Params = make(maps.Params) + } + pcfg.Params[k] = v + } + } + return pcfg, pcfg.init() +} + +func mapToPageMatcherParamsConfigLegacy(m map[string]any) (PageMatcherParamsConfig, error) { var pcfg PageMatcherParamsConfig for k, v := range m { switch strings.ToLower(k) { @@ -190,7 +218,6 @@ func mapToPageMatcherParamsConfig(m map[string]any) (PageMatcherParamsConfig, er } pcfg.Target = target default: - // Legacy config. if pcfg.Params == nil { pcfg.Params = make(maps.Params) } diff --git a/resources/page/page_matcher_test.go b/resources/page/page_matcher_test.go index bc072ce15..2fe6ccc89 100644 --- a/resources/page/page_matcher_test.go +++ b/resources/page/page_matcher_test.go @@ -84,7 +84,7 @@ func TestPageMatcher(t *testing.T) { c.Run("mapToPageMatcherParamsConfig", func(c *qt.C) { fn := func(m map[string]any) PageMatcherParamsConfig { - v, err := mapToPageMatcherParamsConfig(m) + v, err := mapToPageMatcherParamsConfigLegacy(m) c.Assert(err, qt.IsNil) return v } @@ -129,7 +129,7 @@ func TestDecodeCascadeConfig(t *testing.T) { }, } - got, err := DecodeCascadeConfig(loggers.NewDefault(), in) + got, err := DecodeCascadeConfig(loggers.NewDefault(), true, in) c.Assert(err, qt.IsNil) c.Assert(got, qt.IsNotNil) @@ -143,7 +143,7 @@ func TestDecodeCascadeConfig(t *testing.T) { {Params: maps.Params{"b": string("bv")}, Target: PageMatcher{Kind: "page"}}, }) - got, err = DecodeCascadeConfig(loggers.NewDefault(), nil) + got, err = DecodeCascadeConfig(loggers.NewDefault(), true, nil) c.Assert(err, qt.IsNil) c.Assert(got, qt.IsNotNil) } diff --git a/resources/page/pagemeta/page_frontmatter.go b/resources/page/pagemeta/page_frontmatter.go index eb52e5055..7dea7ca6b 100644 --- a/resources/page/pagemeta/page_frontmatter.go +++ b/resources/page/pagemeta/page_frontmatter.go @@ -33,6 +33,7 @@ import ( "github.com/gohugoio/hugo/resources/kinds" "github.com/gohugoio/hugo/resources/page" "github.com/gohugoio/hugo/resources/resource" + "github.com/mitchellh/mapstructure" "github.com/gohugoio/hugo/helpers" @@ -75,35 +76,43 @@ func (d Dates) IsAllDatesZero() bool { return d.Date.IsZero() && d.Lastmod.IsZero() && d.PublishDate.IsZero() && d.ExpiryDate.IsZero() } +// Page config that needs to be set early. These cannot be modified by cascade. +type PageConfigEarly struct { + Kind string // The kind of page, e.g. "page", "section", "home" etc. This is usually derived from the content path. + Path string // The canonical path to the page, e.g. /sect/mypage. Note: Leading slash, no trailing slash, no extensions or language identifiers. + Lang string // The language code for this page. This is usually derived from the module mount or filename. + Cascade []map[string]any + + // Content holds the content for this page. + Content Source +} + // PageConfig configures a Page, typically from front matter. // Note that all the top level fields are reserved Hugo keywords. // Any custom configuration needs to be set in the Params map. type PageConfig struct { Dates Dates `json:"-"` // Dates holds the four core dates for this page. DatesStrings - Title string // The title of the page. - LinkTitle string // The link title of the page. - Type string // The content type of the page. - Layout string // The layout to use for to render this page. - Weight int // The weight of the page, used in sorting if set to a non-zero value. - Kind string // The kind of page, e.g. "page", "section", "home" etc. This is usually derived from the content path. - Path string // The canonical path to the page, e.g. /sect/mypage. Note: Leading slash, no trailing slash, no extensions or language identifiers. - Lang string // The language code for this page. This is usually derived from the module mount or filename. - URL string // The URL to the rendered page, e.g. /sect/mypage.html. - Slug string // The slug for this page. - Description string // The description for this page. - Summary string // The summary for this page. - Draft bool // Whether or not the content is a draft. - Headless bool `json:"-"` // Whether or not the page should be rendered. - IsCJKLanguage bool // Whether or not the content is in a CJK language. - TranslationKey string // The translation key for this page. - Keywords []string // The keywords for this page. - Aliases []string // The aliases for this page. - Outputs []string // The output formats to render this page in. If not set, the site's configured output formats for this page kind will be used. + PageConfigEarly `mapstructure:",squash"` + Title string // The title of the page. + LinkTitle string // The link title of the page. + Type string // The content type of the page. + Layout string // The layout to use for to render this page. + Weight int // The weight of the page, used in sorting if set to a non-zero value. + URL string // The URL to the rendered page, e.g. /sect/mypage.html. + Slug string // The slug for this page. + Description string // The description for this page. + Summary string // The summary for this page. + Draft bool // Whether or not the content is a draft. + Headless bool `json:"-"` // Whether or not the page should be rendered. + IsCJKLanguage bool // Whether or not the content is in a CJK language. + TranslationKey string // The translation key for this page. + Keywords []string // The keywords for this page. + Aliases []string // The aliases for this page. + Outputs []string // The output formats to render this page in. If not set, the site's configured output formats for this page kind will be used. FrontMatterOnlyValues `mapstructure:"-" json:"-"` - Cascade []map[string]any Sitemap config.SitemapConfig Build BuildConfig Menus any // Can be a string, []string or map[string]any. @@ -111,8 +120,9 @@ type PageConfig struct { // User defined params. Params maps.Params - // Content holds the content for this page. - Content Source + // The raw data from the content adapter. + // TODO(bep) clean up the ContentAdapterData vs Params. + ContentAdapterData map[string]any `mapstructure:"-" json:"-"` // Compiled values. CascadeCompiled *maps.Ordered[page.PageMatcher, maps.Params] `mapstructure:"-" json:"-"` @@ -121,6 +131,20 @@ type PageConfig struct { IsFromContentAdapter bool `mapstructure:"-" json:"-"` } +func ClonePageConfigForRebuild(p *PageConfig, params map[string]any) *PageConfig { + pp := &PageConfig{ + PageConfigEarly: p.PageConfigEarly, + IsFromContentAdapter: p.IsFromContentAdapter, + } + if pp.IsFromContentAdapter { + pp.ContentAdapterData = params + } else { + pp.Params = params + } + + return pp +} + var DefaultPageConfig = PageConfig{ Build: DefaultBuildConfig, } @@ -151,8 +175,7 @@ func (p *PageConfig) Validate(pagesFromData bool) error { return nil } -// Compile sets up the page configuration after all fields have been set. -func (p *PageConfig) Compile(basePath string, pagesFromData bool, ext string, logger loggers.Logger, outputFormats output.Formats, mediaTypes media.Types) error { +func (p *PageConfig) CompileForPagesFromDataPre(basePath string, logger loggers.Logger, mediaTypes media.Types) error { // In content adapters, we always get relative paths. if basePath != "" { p.Path = path.Join(basePath, p.Path) @@ -160,12 +183,32 @@ func (p *PageConfig) Compile(basePath string, pagesFromData bool, ext string, lo if p.Params == nil { p.Params = make(maps.Params) - } else if pagesFromData { - p.Params = maps.PrepareParamsClone(p.Params) } else { - maps.PrepareParams(p.Params) + p.Params = maps.PrepareParamsClone(p.Params) } + if p.Kind == "" { + p.Kind = kinds.KindPage + } + + if p.Cascade != nil { + cascade, err := page.DecodeCascade(logger, false, p.Cascade) + if err != nil { + return fmt.Errorf("failed to decode cascade: %w", err) + } + p.CascadeCompiled = cascade + } + + // Note that NormalizePathStringBasic will make sure that we don't preserve the unnormalized path. + // We do that when we create pages from the file system; mostly for backward compatibility, + // but also because people tend to use use the filename to name their resources (with spaces and all), + // and this isn't relevant when creating resources from an API where it's easy to add textual meta data. + p.Path = paths.NormalizePathStringBasic(p.Path) + + return p.compilePrePost("", mediaTypes) +} + +func (p *PageConfig) compilePrePost(ext string, mediaTypes media.Types) error { if p.Content.Markup == "" && p.Content.MediaType == "" { if ext == "" { ext = "md" @@ -196,6 +239,29 @@ func (p *PageConfig) Compile(basePath string, pagesFromData bool, ext string, lo if p.Content.Markup == "" { p.Content.Markup = p.ContentMediaType.SubType } + return nil +} + +// Compile sets up the page configuration after all fields have been set. +func (p *PageConfig) Compile(ext string, logger loggers.Logger, outputFormats output.Formats, mediaTypes media.Types) error { + if p.IsFromContentAdapter { + if err := mapstructure.WeakDecode(p.ContentAdapterData, p); err != nil { + err = fmt.Errorf("failed to decode page map: %w", err) + return err + } + // Not needed anymore. + p.ContentAdapterData = nil + } + + if p.Params == nil { + p.Params = make(maps.Params) + } else { + maps.PrepareParams(p.Params) + } + + if err := p.compilePrePost(ext, mediaTypes); err != nil { + return err + } if len(p.Outputs) > 0 { outFormats, err := outputFormats.GetByNames(p.Outputs...) @@ -206,27 +272,6 @@ func (p *PageConfig) Compile(basePath string, pagesFromData bool, ext string, lo } } - if pagesFromData { - if p.Kind == "" { - p.Kind = kinds.KindPage - } - - // Note that NormalizePathStringBasic will make sure that we don't preserve the unnormalized path. - // We do that when we create pages from the file system; mostly for backward compatibility, - // but also because people tend to use use the filename to name their resources (with spaces and all), - // and this isn't relevant when creating resources from an API where it's easy to add textual meta data. - p.Path = paths.NormalizePathStringBasic(p.Path) - - } - - if p.Cascade != nil { - cascade, err := page.DecodeCascade(logger, p.Cascade) - if err != nil { - return fmt.Errorf("failed to decode cascade: %w", err) - } - p.CascadeCompiled = cascade - } - return nil } diff --git a/resources/page/pagemeta/page_frontmatter_test.go b/resources/page/pagemeta/page_frontmatter_test.go index de2932391..8d50f9b57 100644 --- a/resources/page/pagemeta/page_frontmatter_test.go +++ b/resources/page/pagemeta/page_frontmatter_test.go @@ -176,7 +176,7 @@ func TestContentMediaTypeFromMarkup(t *testing.T) { } { var pc pagemeta.PageConfig pc.Content.Markup = test.in - c.Assert(pc.Compile("", true, "", logger, output.DefaultFormats, media.DefaultTypes), qt.IsNil) + c.Assert(pc.Compile("", logger, output.DefaultFormats, media.DefaultTypes), qt.IsNil) c.Assert(pc.ContentMediaType.Type, qt.Equals, test.expected) } } diff --git a/tpl/tplimpl/shortcodes_integration_test.go b/tpl/tplimpl/shortcodes_integration_test.go index 838dc16d7..665760dec 100644 --- a/tpl/tplimpl/shortcodes_integration_test.go +++ b/tpl/tplimpl/shortcodes_integration_test.go @@ -460,6 +460,7 @@ title: p1 (de) } func TestVimeoShortcode(t *testing.T) { + t.Skip("Fix me: Upstream API changes") t.Parallel() files := ` From bc98e7a80d2e7ef8042356a17cd455bcd5e3d05f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Sun, 11 May 2025 11:54:34 +0200 Subject: [PATCH 070/129] config: Fix env override of slices Fixes #13707 --- .../allconfig/allconfig_integration_test.go | 22 +++++++ config/allconfig/load.go | 63 +++++++++++-------- 2 files changed, 59 insertions(+), 26 deletions(-) diff --git a/config/allconfig/allconfig_integration_test.go b/config/allconfig/allconfig_integration_test.go index f8fbb22f7..8f6cacf84 100644 --- a/config/allconfig/allconfig_integration_test.go +++ b/config/allconfig/allconfig_integration_test.go @@ -357,3 +357,25 @@ All. b.Assert(b.H.Conf.DefaultContentLanguage(), qt.Equals, "sv") } + +func TestDefaultConfigEnvDisableLanguagesIssue13707(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +disableLanguages = [] +[languages] +[languages.en] +weight = 1 +[languages.nn] +weight = 2 +[languages.sv] +weight = 3 +` + + b := hugolib.Test(t, files, hugolib.TestOptWithConfig(func(conf *hugolib.IntegrationTestConfig) { + conf.Environ = []string{`HUGO_DISABLELANGUAGES=sv nn`} + })) + + b.Assert(len(b.H.Sites), qt.Equals, 1) +} diff --git a/config/allconfig/load.go b/config/allconfig/load.go index 2d9185f6f..4fb8bbaef 100644 --- a/config/allconfig/load.go +++ b/config/allconfig/load.go @@ -233,40 +233,51 @@ func (l configLoader) applyOsEnvOverrides(environ []string) error { if existing != nil { val, err := metadecoders.Default.UnmarshalStringTo(env.Value, existing) - if err != nil { + if err == nil { + val = l.envValToVal(env.Key, val) + if owner != nil { + owner[nestedKey] = val + } else { + l.cfg.Set(env.Key, val) + } continue } - - if owner != nil { - owner[nestedKey] = val - } else { - l.cfg.Set(env.Key, val) - } - } else { - if nestedKey != "" { - owner[nestedKey] = env.Value - } else { - var val any - key := strings.ReplaceAll(env.Key, delim, ".") - _, ok := allDecoderSetups[key] - if ok { - // A map. - if v, err := metadecoders.Default.UnmarshalStringTo(env.Value, map[string]any{}); err == nil { - val = v - } - } - if val == nil { - // A string. - val = l.envStringToVal(key, env.Value) - } - l.cfg.Set(key, val) - } } + + if owner != nil && nestedKey != "" { + owner[nestedKey] = env.Value + } else { + var val any + key := strings.ReplaceAll(env.Key, delim, ".") + _, ok := allDecoderSetups[key] + if ok { + // A map. + if v, err := metadecoders.Default.UnmarshalStringTo(env.Value, map[string]any{}); err == nil { + val = v + } + } + + if val == nil { + // A string. + val = l.envStringToVal(key, env.Value) + } + l.cfg.Set(key, val) + } + } return nil } +func (l *configLoader) envValToVal(k string, v any) any { + switch v := v.(type) { + case string: + return l.envStringToVal(k, v) + default: + return v + } +} + func (l *configLoader) envStringToVal(k, v string) any { switch k { case "disablekinds", "disablelanguages": From 6def5a1ba9c7d3a54254969a607a8261cbaf91aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Mon, 12 May 2025 12:10:27 +0200 Subject: [PATCH 071/129] Update README.md --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e0b3f1567..9befa9c9d 100644 --- a/README.md +++ b/README.md @@ -65,9 +65,11 @@ See the [features] section of the documentation for a comprehensive summary of H

 

- Linode + Linode     - The complete IDE crafted for professional Go developers. + The complete IDE crafted for professional Go developers. +     + PinMe.

## Editions From 81426998b87592f32d73d48667ba8ec03f266791 Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Sun, 11 May 2025 11:39:42 -0700 Subject: [PATCH 072/129] tpl/tplimpl: Change calls to simple versions of embedded shortcodes Closes #13700 --- tpl/tplimpl/embedded/templates/_shortcodes/twitter.html | 2 +- tpl/tplimpl/embedded/templates/_shortcodes/vimeo.html | 2 +- tpl/tplimpl/embedded/templates/_shortcodes/x.html | 2 +- tpl/tplimpl/shortcodes_integration_test.go | 1 - 4 files changed, 3 insertions(+), 4 deletions(-) diff --git a/tpl/tplimpl/embedded/templates/_shortcodes/twitter.html b/tpl/tplimpl/embedded/templates/_shortcodes/twitter.html index ce356559d..849bad99e 100644 --- a/tpl/tplimpl/embedded/templates/_shortcodes/twitter.html +++ b/tpl/tplimpl/embedded/templates/_shortcodes/twitter.html @@ -2,7 +2,7 @@ {{- $pc := site.Config.Privacy.Twitter -}} {{- if not $pc.Disable -}} {{- if $pc.Simple -}} - {{- template "_internal/shortcodes/twitter_simple.html" . -}} + {{- template "_shortcodes/twitter_simple.html" . -}} {{- else -}} {{- $id := or (.Get "id") "" -}} {{- $user := or (.Get "user") "" -}} diff --git a/tpl/tplimpl/embedded/templates/_shortcodes/vimeo.html b/tpl/tplimpl/embedded/templates/_shortcodes/vimeo.html index 2588ac86c..fb8ea0d97 100644 --- a/tpl/tplimpl/embedded/templates/_shortcodes/vimeo.html +++ b/tpl/tplimpl/embedded/templates/_shortcodes/vimeo.html @@ -18,7 +18,7 @@ title, then loading. {{- $pc := site.Config.Privacy.Vimeo }} {{- if not $pc.Disable }} {{- if $pc.Simple }} - {{- template "_internal/shortcodes/vimeo_simple.html" . }} + {{- template "_shortcodes/vimeo_simple.html" . }} {{- else }} {{- $dnt := cond $pc.EnableDNT 1 0 }} diff --git a/tpl/tplimpl/embedded/templates/_shortcodes/x.html b/tpl/tplimpl/embedded/templates/_shortcodes/x.html index 28a5e331b..87455530c 100644 --- a/tpl/tplimpl/embedded/templates/_shortcodes/x.html +++ b/tpl/tplimpl/embedded/templates/_shortcodes/x.html @@ -1,7 +1,7 @@ {{- $pc := site.Config.Privacy.X -}} {{- if not $pc.Disable -}} {{- if $pc.Simple -}} - {{- template "_internal/shortcodes/x_simple.html" . -}} + {{- template "_shortcodes/x_simple.html" . -}} {{- else -}} {{- $id := or (.Get "id") "" -}} {{- $user := or (.Get "user") "" -}} diff --git a/tpl/tplimpl/shortcodes_integration_test.go b/tpl/tplimpl/shortcodes_integration_test.go index 665760dec..838dc16d7 100644 --- a/tpl/tplimpl/shortcodes_integration_test.go +++ b/tpl/tplimpl/shortcodes_integration_test.go @@ -460,7 +460,6 @@ title: p1 (de) } func TestVimeoShortcode(t *testing.T) { - t.Skip("Fix me: Upstream API changes") t.Parallel() files := ` From 05417512bd001c0b2cc0042dcc584575825b89b3 Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Mon, 12 May 2025 12:25:03 +0000 Subject: [PATCH 073/129] releaser: Bump versions for release of 0.147.3 [ci skip] --- common/hugo/version_current.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/common/hugo/version_current.go b/common/hugo/version_current.go index ba367ceb5..b7967573d 100644 --- a/common/hugo/version_current.go +++ b/common/hugo/version_current.go @@ -17,7 +17,7 @@ package hugo // This should be the only one. var CurrentVersion = Version{ Major: 0, - Minor: 148, - PatchLevel: 0, - Suffix: "-DEV", + Minor: 147, + PatchLevel: 3, + Suffix: "", } From e6574cf7a778bf2bf14bb635668f5aa84f8175ed Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Mon, 12 May 2025 12:40:04 +0000 Subject: [PATCH 074/129] releaser: Prepare repository for 0.148.0-DEV [ci skip] --- common/hugo/version_current.go | 6 +++--- hugoreleaser.env | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/common/hugo/version_current.go b/common/hugo/version_current.go index b7967573d..ba367ceb5 100644 --- a/common/hugo/version_current.go +++ b/common/hugo/version_current.go @@ -17,7 +17,7 @@ package hugo // This should be the only one. var CurrentVersion = Version{ Major: 0, - Minor: 147, - PatchLevel: 3, - Suffix: "", + Minor: 148, + PatchLevel: 0, + Suffix: "-DEV", } diff --git a/hugoreleaser.env b/hugoreleaser.env index 5d373cd71..82c1a31e7 100644 --- a/hugoreleaser.env +++ b/hugoreleaser.env @@ -1,7 +1,8 @@ # Release env. # These will be replaced by script before release. -HUGORELEASER_TAG=v0.147.2 -HUGORELEASER_COMMITISH=c7feb15d10b29a94d7fb57c31e8bcb2e92718fb7 +HUGORELEASER_TAG=v0.147.3 +HUGORELEASER_COMMITISH=05417512bd001c0b2cc0042dcc584575825b89b3 + From 6142bc701cc3b0b0ac59287d22e81de552e1382b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Fri, 16 May 2025 09:26:17 +0200 Subject: [PATCH 075/129] tpl: Fix theme overrides when theme has old layout setup (e.g. _default) Fixes #13715 --- tpl/tplimpl/templatestore.go | 21 +++++++++++++------ tpl/tplimpl/templatestore_integration_test.go | 17 +++++++++++++++ 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/tpl/tplimpl/templatestore.go b/tpl/tplimpl/templatestore.go index 53880eb33..c6a6d4cd5 100644 --- a/tpl/tplimpl/templatestore.go +++ b/tpl/tplimpl/templatestore.go @@ -1133,12 +1133,21 @@ func (s *TemplateStore) insertTemplate2( tree.Insert(key, m) } - if !replace { - if v, found := m[nk]; found { - if len(pi.Identifiers()) >= len(v.PathInfo.Identifiers()) { - // e.g. /pages/home.foo.html and /pages/home.html where foo may be a valid language name in another site. - return nil, nil - } + nkExisting, existingFound := m[nk] + if !replace && existingFound && fi != nil && nkExisting.Fi != nil { + // See issue #13715. + // We do the merge on the file system level, but from Hugo v0.146.0 we have a situation where + // the project may well have a different layouts layout compared to the theme(s) it uses. + // We could possibly have fixed that on a lower (file system) level, but since this is just + // a temporary situation (until all projects are updated), + // do a replace here if the file comes from higher up in the module chain. + replace = fi.Meta().ModuleOrdinal < nkExisting.Fi.Meta().ModuleOrdinal + } + + if !replace && existingFound { + if len(pi.Identifiers()) >= len(nkExisting.PathInfo.Identifiers()) { + // e.g. /pages/home.foo.html and /pages/home.html where foo may be a valid language name in another site. + return nil, nil } } diff --git a/tpl/tplimpl/templatestore_integration_test.go b/tpl/tplimpl/templatestore_integration_test.go index 75ec0376f..e10d7149a 100644 --- a/tpl/tplimpl/templatestore_integration_test.go +++ b/tpl/tplimpl/templatestore_integration_test.go @@ -1103,6 +1103,23 @@ All. b.AssertLogContains("unrecognized render hook") } +func TestLayoutOverrideThemeWhenThemeOnOldFormatIssue13715(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +theme = "mytheme" +-- layouts/list.html -- + layouts/list.html +-- themes/mytheme/layouts/_default/list.html -- +mytheme/layouts/_default/list.html + +` + + b := hugolib.Test(t, files) + b.AssertFileContent("public/index.html", "layouts/list.html") +} + func BenchmarkExecuteWithContext(b *testing.B) { files := ` -- hugo.toml -- From 61317821e463f8c6e980de6d0c27188148464c04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Fri, 16 May 2025 10:36:05 +0200 Subject: [PATCH 076/129] tpl: Narrow down the usage of plain text shortcodes when rendering HTML After this commit, if you want to resolve `layouts/_shortcodes/myshortcode.txt` when rendering HTML content, you need to use the `{{%` shortcode delimiter: ``` {{% myshortcode %}} ``` This should be what people would do anyway, but we have also as part of this improved the error message to inform about what needs to be done. Note that this is not relevant for partials. Fixes #13698 --- hugolib/shortcode.go | 9 ++-- hugolib/shortcode_test.go | 6 +-- tpl/tplimpl/shortcodes_integration_test.go | 33 +++++++++++++ tpl/tplimpl/templatedescriptor.go | 21 ++++++--- tpl/tplimpl/templatestore.go | 46 +++++++++++++++---- tpl/tplimpl/templatestore_integration_test.go | 36 ++++++++++++++- 6 files changed, 127 insertions(+), 24 deletions(-) diff --git a/hugolib/shortcode.go b/hugolib/shortcode.go index cc8a145d9..56bf1ff9e 100644 --- a/hugolib/shortcode.go +++ b/hugolib/shortcode.go @@ -398,6 +398,10 @@ func doRenderShortcode( return true } base, layoutDescriptor := po.GetInternalTemplateBasePathAndDescriptor() + + // With shortcodes/mymarkdown.md (only), this allows {{% mymarkdown %}} when rendering HTML, + // but will not resolve any template when doing {{< mymarkdown >}}. + layoutDescriptor.AlwaysAllowPlainText = sc.doMarkup q := tplimpl.TemplateQuery{ Path: base, Name: sc.name, @@ -405,10 +409,9 @@ func doRenderShortcode( Desc: layoutDescriptor, Consider: include, } - v := s.TemplateStore.LookupShortcode(q) + v, err := s.TemplateStore.LookupShortcode(q) if v == nil { - s.Log.Errorf("Unable to locate template for shortcode %q in page %q", sc.name, p.File().Path()) - return zeroShortcode, nil + return zeroShortcode, err } tmpl = v hasVariants = hasVariants || len(ofCount) > 1 diff --git a/hugolib/shortcode_test.go b/hugolib/shortcode_test.go index f1d90e22e..a1f12e77a 100644 --- a/hugolib/shortcode_test.go +++ b/hugolib/shortcode_test.go @@ -918,7 +918,7 @@ func TestShortcodeMarkdownOutputFormat(t *testing.T) { --- title: "p1" --- -{{< foo >}} +{{% foo %}} # The below would have failed using the HTML template parser. -- layouts/shortcodes/foo.md -- §§§ @@ -930,9 +930,7 @@ title: "p1" b := Test(t, files) - b.AssertFileContent("public/p1/index.html", ` -<x") } func TestShortcodePreserveIndentation(t *testing.T) { diff --git a/tpl/tplimpl/shortcodes_integration_test.go b/tpl/tplimpl/shortcodes_integration_test.go index 838dc16d7..e65f82eab 100644 --- a/tpl/tplimpl/shortcodes_integration_test.go +++ b/tpl/tplimpl/shortcodes_integration_test.go @@ -17,6 +17,7 @@ import ( "strings" "testing" + qt "github.com/frankban/quicktest" "github.com/gohugoio/hugo/htesting/hqt" "github.com/gohugoio/hugo/hugolib" ) @@ -696,3 +697,35 @@ title: p2 b.AssertFileContent("public/p1/index.html", "78eb19b5c6f3768f") b.AssertFileContent("public/p2/index.html", "a6db910a9cf54bc1") } + +func TestShortcodePlainTextVsHTMLTemplateIssue13698(t *testing.T) { + t.Parallel() + + filesTemplate := ` +-- hugo.toml -- +markup.goldmark.renderer.unsafe = true +-- layouts/all.html -- +Content: {{ .Content }}| +-- layouts/_shortcodes/mymarkdown.md -- +
Foo bar
+-- content/p1.md -- +--- +title: p1 +--- +## A shortcode + +SHORTCODE + +` + + files := strings.ReplaceAll(filesTemplate, "SHORTCODE", "{{% mymarkdown %}}") + b := hugolib.Test(t, files) + b.AssertFileContent("public/p1/index.html", "
Foo bar
") + + files = strings.ReplaceAll(filesTemplate, "SHORTCODE", "{{< mymarkdown >}}") + + var err error + b, err = hugolib.TestE(t, files) + b.Assert(err, qt.IsNotNil) + b.Assert(err.Error(), qt.Contains, `no compatible template found for shortcode "mymarkdown" in [/_shortcodes/mymarkdown.md]; note that to use plain text template shortcodes in HTML you need to use the shortcode {{% delimiter`) +} diff --git a/tpl/tplimpl/templatedescriptor.go b/tpl/tplimpl/templatedescriptor.go index ea47afc88..fd86f15fa 100644 --- a/tpl/tplimpl/templatedescriptor.go +++ b/tpl/tplimpl/templatedescriptor.go @@ -37,6 +37,7 @@ type TemplateDescriptor struct { // Misc. LayoutFromUserMustMatch bool // If set, we only look for the exact layout. IsPlainText bool // Whether this is a plain text template. + AlwaysAllowPlainText bool // Whether to e.g. allow plain text templates to be rendered in HTML. } func (d *TemplateDescriptor) normalizeFromFile() { @@ -64,7 +65,7 @@ func (s descriptorHandler) compareDescriptors(category Category, isEmbedded bool return weightNoMatch } - w := this.doCompare(category, isEmbedded, s.opts.DefaultContentLanguage, other) + w := this.doCompare(category, s.opts.DefaultContentLanguage, other) if w.w1 <= 0 { if category == CategoryMarkup && (this.Variant1 == other.Variant1) && (this.Variant2 == other.Variant2 || this.Variant2 != "" && other.Variant2 == "") { @@ -74,7 +75,12 @@ func (s descriptorHandler) compareDescriptors(category Category, isEmbedded bool } w.w1 = 1 - return w + } + + if category == CategoryShortcode { + if (this.IsPlainText == other.IsPlainText || !other.IsPlainText) || this.AlwaysAllowPlainText { + w.w1 = 1 + } } } @@ -82,13 +88,16 @@ func (s descriptorHandler) compareDescriptors(category Category, isEmbedded bool } //lint:ignore ST1006 this vs other makes it easier to reason about. -func (this TemplateDescriptor) doCompare(category Category, isEmbedded bool, defaultContentLanguage string, other TemplateDescriptor) weight { +func (this TemplateDescriptor) doCompare(category Category, defaultContentLanguage string, other TemplateDescriptor) weight { w := weightNoMatch - // HTML in plain text is OK, but not the other way around. - if other.IsPlainText && !this.IsPlainText { - return w + if !this.AlwaysAllowPlainText { + // HTML in plain text is OK, but not the other way around. + if other.IsPlainText && !this.IsPlainText { + return w + } } + if other.Kind != "" && other.Kind != this.Kind { return w } diff --git a/tpl/tplimpl/templatestore.go b/tpl/tplimpl/templatestore.go index c6a6d4cd5..2ea337274 100644 --- a/tpl/tplimpl/templatestore.go +++ b/tpl/tplimpl/templatestore.go @@ -19,6 +19,7 @@ import ( "bytes" "context" "embed" + "errors" "fmt" "io" "io/fs" @@ -608,7 +609,7 @@ func (s *TemplateStore) LookupShortcodeByName(name string) *TemplInfo { return ti } -func (s *TemplateStore) LookupShortcode(q TemplateQuery) *TemplInfo { +func (s *TemplateStore) LookupShortcode(q TemplateQuery) (*TemplInfo, error) { q.init() k1 := s.key(q.Path) @@ -630,13 +631,15 @@ func (s *TemplateStore) LookupShortcode(q TemplateQuery) *TemplInfo { } for k, vv := range v { + best.candidates = append(best.candidates, vv) if !q.Consider(vv) { continue } weight := s.dh.compareDescriptors(q.Category, vv.subCategory == SubCategoryEmbedded, q.Desc, k) weight.distance = distance - if best.isBetter(weight, vv) { + isBetter := best.isBetter(weight, vv) + if isBetter { best.updateValues(weight, k2, k, vv) } } @@ -644,8 +647,21 @@ func (s *TemplateStore) LookupShortcode(q TemplateQuery) *TemplInfo { return false, nil }) - // Any match will do. - return best.templ + if best.w.w1 <= 0 { + var err error + if s := best.candidatesAsStringSlice(); s != nil { + msg := fmt.Sprintf("no compatible template found for shortcode %q in %s", q.Name, s) + if !q.Desc.IsPlainText { + msg += "; note that to use plain text template shortcodes in HTML you need to use the shortcode {{% delimiter" + } + err = errors.New(msg) + } else { + err = fmt.Errorf("no template found for shortcode %q", q.Name) + } + return nil, err + } + + return best.templ, nil } // PrintDebug is for testing/debugging only. @@ -1817,10 +1833,11 @@ type TextTemplatHandler interface { } type bestMatch struct { - templ *TemplInfo - desc TemplateDescriptor - w weight - key string + templ *TemplInfo + desc TemplateDescriptor + w weight + key string + candidates []*TemplInfo // settings. defaultOutputformat string @@ -1831,6 +1848,18 @@ func (best *bestMatch) reset() { best.w = weight{} best.desc = TemplateDescriptor{} best.key = "" + best.candidates = nil +} + +func (best *bestMatch) candidatesAsStringSlice() []string { + if len(best.candidates) == 0 { + return nil + } + candidates := make([]string, len(best.candidates)) + for i, v := range best.candidates { + candidates[i] = v.PathInfo.Path() + } + return candidates } func (best *bestMatch) isBetter(w weight, ti *TemplInfo) bool { @@ -1840,7 +1869,6 @@ func (best *bestMatch) isBetter(w weight, ti *TemplInfo) bool { } if w.w1 <= 0 { - if best.w.w1 <= 0 { return ti.PathInfo.Path() < best.templ.PathInfo.Path() } diff --git a/tpl/tplimpl/templatestore_integration_test.go b/tpl/tplimpl/templatestore_integration_test.go index e10d7149a..0b3ce7a56 100644 --- a/tpl/tplimpl/templatestore_integration_test.go +++ b/tpl/tplimpl/templatestore_integration_test.go @@ -920,6 +920,26 @@ func TestPartialHTML(t *testing.T) { b.AssertFileContent("public/index.html", "") } +func TestPartialPlainTextInHTML(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +-- layouts/all.html -- + + +{{ partial "mypartial.txt" . }} + + +-- layouts/partials/mypartial.txt -- +My
partial
. +` + + b := hugolib.Test(t, files) + + b.AssertFileContent("public/index.html", "My <div>partial</div>.") +} + // Issue #13593. func TestGoatAndNoGoat(t *testing.T) { t.Parallel() @@ -1103,6 +1123,18 @@ All. b.AssertLogContains("unrecognized render hook") } +func TestLayoutNotFound(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +-- layouts/single.html -- +Single. +` + b := hugolib.Test(t, files, hugolib.TestOptWarn()) + b.AssertLogContains("WARN found no layout file for \"html\" for kind \"home\"") +} + func TestLayoutOverrideThemeWhenThemeOnOldFormatIssue13715(t *testing.T) { t.Parallel() @@ -1214,8 +1246,8 @@ s2. Category: tplimpl.CategoryShortcode, Desc: desc, } - v := store.LookupShortcode(q) - if v == nil { + v, err := store.LookupShortcode(q) + if v == nil || err != nil { b.Fatal("not found") } } From 5a81a3a4cf8fc0a75a5b7d1f1552664542592c48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Sat, 17 May 2025 13:34:37 +0200 Subject: [PATCH 077/129] tpl: Add a test case I'm not able to reproduce this, but leaving it in. Closes #13699 --- tpl/tplimpl/shortcodes_integration_test.go | 28 ++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/tpl/tplimpl/shortcodes_integration_test.go b/tpl/tplimpl/shortcodes_integration_test.go index e65f82eab..e884c9a8d 100644 --- a/tpl/tplimpl/shortcodes_integration_test.go +++ b/tpl/tplimpl/shortcodes_integration_test.go @@ -729,3 +729,31 @@ SHORTCODE b.Assert(err, qt.IsNotNil) b.Assert(err.Error(), qt.Contains, `no compatible template found for shortcode "mymarkdown" in [/_shortcodes/mymarkdown.md]; note that to use plain text template shortcodes in HTML you need to use the shortcode {{% delimiter`) } + +func TestShortcodeOnlyLanguageInBaseIssue13699(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +baseURL = 'https://example.org/' +[languages] +[languages.en] +weight = 1 +disableLanguages = ['de'] +[languages.de] +weight = 2 +-- layouts/_shortcodes/de.html -- +de.html +-- layouts/all.html -- +{{ .Content }} +-- content/_index.md -- +--- +title: home +--- +{{< de >}} + +` + b := hugolib.Test(t, files) + + b.AssertFileContent("public/index.html", "de.html") +} From a03a245f0c00f05d7b0a224e42595092e3210cab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Mon, 19 May 2025 12:08:40 +0200 Subject: [PATCH 078/129] Fix it so css.TailwindCSS inlineImports options isn't always enabled To avoid breaking existing setup and to make a better default option, the option is now `disableInlineImports` (default false). Fixes #13719 --- .../resource_transformers/cssjs/postcss.go | 6 +- .../cssjs/tailwindcss.go | 14 ++-- .../cssjs/tailwindcss_integration_test.go | 64 +++++++++++++++++++ 3 files changed, 79 insertions(+), 5 deletions(-) diff --git a/resources/resource_transformers/cssjs/postcss.go b/resources/resource_transformers/cssjs/postcss.go index 1a9e01142..98bdc9249 100644 --- a/resources/resource_transformers/cssjs/postcss.go +++ b/resources/resource_transformers/cssjs/postcss.go @@ -69,7 +69,6 @@ func (c *PostCSSClient) Process(res resources.ResourceTransformer, options map[s } type InlineImports struct { - // Service `mapstructure:",squash"` // Enable inlining of @import statements. // Does so recursively, but currently once only per file; // that is, it's not possible to import the same file in @@ -78,6 +77,11 @@ type InlineImports struct { // so you can have @import anywhere in the file. InlineImports bool + // See issue https://github.com/gohugoio/hugo/issues/13719 + // Disable inlining of @import statements + // This is currenty only used for css.TailwindCSS. + DisableInlineImports bool + // When InlineImports is enabled, we fail the build if an import cannot be resolved. // You can enable this to allow the build to continue and leave the import statement in place. // Note that the inline importer does not process url location or imports with media queries, diff --git a/resources/resource_transformers/cssjs/tailwindcss.go b/resources/resource_transformers/cssjs/tailwindcss.go index beda7a646..a60a16222 100644 --- a/resources/resource_transformers/cssjs/tailwindcss.go +++ b/resources/resource_transformers/cssjs/tailwindcss.go @@ -129,9 +129,11 @@ func (t *tailwindcssTransformation) Transform(ctx *resources.ResourceTransformat t.rs.Assets.Fs, t.rs.Logger, ctx.DependencyManager, ) - src, err = imp.resolve() - if err != nil { - return err + if !options.InlineImports.DisableInlineImports { + src, err = imp.resolve() + if err != nil { + return err + } } go func() { @@ -146,7 +148,11 @@ func (t *tailwindcssTransformation) Transform(ctx *resources.ResourceTransformat Cause: err, } } - return imp.toFileError(errBuf.String()) + s := errBuf.String() + if options.InlineImports.DisableInlineImports && strings.Contains(s, "Can't resolve") { + s += "You may want to set the 'disableInlineImports' option to false to inline imports, see https://gohugo.io/functions/css/tailwindcss/#disableinlineimports" + } + return imp.toFileError(s) } return nil diff --git a/resources/resource_transformers/cssjs/tailwindcss_integration_test.go b/resources/resource_transformers/cssjs/tailwindcss_integration_test.go index ae70042a0..734ffe759 100644 --- a/resources/resource_transformers/cssjs/tailwindcss_integration_test.go +++ b/resources/resource_transformers/cssjs/tailwindcss_integration_test.go @@ -17,6 +17,7 @@ import ( "testing" "github.com/bep/logg" + qt "github.com/frankban/quicktest" "github.com/gohugoio/hugo/htesting" "github.com/gohugoio/hugo/hugolib" ) @@ -70,3 +71,66 @@ CSS: {{ $css.Content | safeCSS }}| b.AssertFileContent("public/index.html", "/*! tailwindcss v4.") } + +func TestTailwindCSSNoInlineImportsIssue13719(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +disableKinds = ['page','rss','section','sitemap','taxonomy','term'] +theme = 'my-theme' + +[[module.mounts]] +source = 'assets' +target = 'assets' + +[[module.mounts]] +source = 'other' +target = 'assets/css' +-- assets/css/main.css -- +@import "tailwindcss"; + +@import "colors/red.css"; +@import "colors/blue.css"; +@import "colors/purple.css"; +-- assets/css/colors/red.css -- +@import "green.css"; + +.red {color: red;} +-- assets/css/colors/green.css -- +.green {color: green;} +-- themes/my-theme/assets/css/colors/blue.css -- +.blue {color: blue;} +-- other/colors/purple.css -- +.purple {color: purple;} +-- layouts/home.html -- +{{ with (templates.Defer (dict "key" "global")) }} + {{ with resources.Get "css/main.css" }} + {{ $opts := dict "disableInlineImports" true }} + {{ with . | css.TailwindCSS $opts }} + + {{ end }} + {{ end }} +{{ end }} +-- package.json -- +{ + "devDependencies": { + "@tailwindcss/cli": "^4.1.7", + "tailwindcss": "^4.1.7" + } +} +` + + b, err := hugolib.NewIntegrationTestBuilder( + hugolib.IntegrationTestConfig{ + T: t, + TxtarString: files, + NeedsOsFS: true, + NeedsNpmInstall: true, + LogLevel: logg.LevelInfo, + }).BuildE() + + b.Assert(err, qt.IsNotNil) + b.Assert(err.Error(), qt.Contains, "Can't resolve 'colors/red.css'") + b.Assert(err.Error(), qt.Contains, "You may want to set the 'disableInlineImports' option to false") +} From 84c8426f328a946b2e10611431c450b352cecd11 Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Tue, 20 May 2025 10:41:19 +0000 Subject: [PATCH 079/129] releaser: Bump versions for release of 0.147.4 [ci skip] --- common/hugo/version_current.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/common/hugo/version_current.go b/common/hugo/version_current.go index ba367ceb5..48deb2858 100644 --- a/common/hugo/version_current.go +++ b/common/hugo/version_current.go @@ -17,7 +17,7 @@ package hugo // This should be the only one. var CurrentVersion = Version{ Major: 0, - Minor: 148, - PatchLevel: 0, - Suffix: "-DEV", + Minor: 147, + PatchLevel: 4, + Suffix: "", } From b9b95e5aec76220838dd09ff4296e97f9d0da23d Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Tue, 20 May 2025 10:55:43 +0000 Subject: [PATCH 080/129] releaser: Prepare repository for 0.148.0-DEV [ci skip] --- common/hugo/version_current.go | 6 +++--- hugoreleaser.env | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/common/hugo/version_current.go b/common/hugo/version_current.go index 48deb2858..ba367ceb5 100644 --- a/common/hugo/version_current.go +++ b/common/hugo/version_current.go @@ -17,7 +17,7 @@ package hugo // This should be the only one. var CurrentVersion = Version{ Major: 0, - Minor: 147, - PatchLevel: 4, - Suffix: "", + Minor: 148, + PatchLevel: 0, + Suffix: "-DEV", } diff --git a/hugoreleaser.env b/hugoreleaser.env index 82c1a31e7..288189bdf 100644 --- a/hugoreleaser.env +++ b/hugoreleaser.env @@ -1,7 +1,8 @@ # Release env. # These will be replaced by script before release. -HUGORELEASER_TAG=v0.147.3 -HUGORELEASER_COMMITISH=05417512bd001c0b2cc0042dcc584575825b89b3 +HUGORELEASER_TAG=v0.147.4 +HUGORELEASER_COMMITISH=84c8426f328a946b2e10611431c450b352cecd11 + From 970b887ba1bba83ca843b9ece16dbf01fa1a022d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 9 May 2025 18:01:19 +0000 Subject: [PATCH 081/129] build(deps): bump github.com/tdewolff/minify/v2 from 2.20.37 to 2.23.5 Bumps [github.com/tdewolff/minify/v2](https://github.com/tdewolff/minify) from 2.20.37 to 2.23.5. - [Release notes](https://github.com/tdewolff/minify/releases) - [Commits](https://github.com/tdewolff/minify/compare/v2.20.37...v2.23.5) --- updated-dependencies: - dependency-name: github.com/tdewolff/minify/v2 dependency-version: 2.23.5 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 4 ++-- go.sum | 13 ++++++------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index 6a83524d6..c51a5fc52 100644 --- a/go.mod +++ b/go.mod @@ -66,8 +66,8 @@ require ( github.com/spf13/cobra v1.9.1 github.com/spf13/fsync v0.10.1 github.com/spf13/pflag v1.0.6 - github.com/tdewolff/minify/v2 v2.20.37 - github.com/tdewolff/parse/v2 v2.7.15 + github.com/tdewolff/minify/v2 v2.23.5 + github.com/tdewolff/parse/v2 v2.8.0 github.com/tetratelabs/wazero v1.9.0 github.com/yuin/goldmark v1.7.11 github.com/yuin/goldmark-emoji v1.0.6 diff --git a/go.sum b/go.sum index 7dd0507b6..a70bc0390 100644 --- a/go.sum +++ b/go.sum @@ -449,13 +449,12 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/tdewolff/minify/v2 v2.20.37 h1:Q97cx4STXCh1dlWDlNHZniE8BJ2EBL0+2b0n92BJQhw= -github.com/tdewolff/minify/v2 v2.20.37/go.mod h1:L1VYef/jwKw6Wwyk5A+T0mBjjn3mMPgmjjA688RNsxU= -github.com/tdewolff/parse/v2 v2.7.15 h1:hysDXtdGZIRF5UZXwpfn3ZWRbm+ru4l53/ajBRGpCTw= -github.com/tdewolff/parse/v2 v2.7.15/go.mod h1:3FbJWZp3XT9OWVN3Hmfp0p/a08v4h8J9W1aghka0soA= -github.com/tdewolff/test v1.0.11-0.20231101010635-f1265d231d52/go.mod h1:6DAvZliBAAnD7rhVgwaM7DE5/d9NMOAJ09SqYqeK4QE= -github.com/tdewolff/test v1.0.11-0.20240106005702-7de5f7df4739 h1:IkjBCtQOOjIn03u/dMQK9g+Iw9ewps4mCl1nB8Sscbo= -github.com/tdewolff/test v1.0.11-0.20240106005702-7de5f7df4739/go.mod h1:XPuWBzvdUzhCuxWO1ojpXsyzsA5bFoS3tO/Q3kFuTG8= +github.com/tdewolff/minify/v2 v2.23.5 h1:/P548KcpTkIOUvNg22zN83/GiaYSOIrbqtoue4I7kYM= +github.com/tdewolff/minify/v2 v2.23.5/go.mod h1:2RI9tiIrzJU1Z5EasXEPaI1MqobRyxKHOOgrRkq5oEw= +github.com/tdewolff/parse/v2 v2.8.0 h1:jW0afj6zpUGXuZTwJ7/UfP2SddyLalb/SDryjaMTkA4= +github.com/tdewolff/parse/v2 v2.8.0/go.mod h1:Hwlni2tiVNKyzR1o6nUs4FOF07URA+JLBLd6dlIXYqo= +github.com/tdewolff/test v1.0.11 h1:FdLbwQVHxqG16SlkGveC0JVyrJN62COWTRyUFzfbtBE= +github.com/tdewolff/test v1.0.11/go.mod h1:XPuWBzvdUzhCuxWO1ojpXsyzsA5bFoS3tO/Q3kFuTG8= github.com/tetratelabs/wazero v1.9.0 h1:IcZ56OuxrtaEz8UYNRHBrUa9bYeX9oVY93KspZZBf/I= github.com/tetratelabs/wazero v1.9.0/go.mod h1:TSbcXCfFP0L2FGkRPxHphadXPjo1T6W+CseNNY7EkjM= github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0= From 0c7b1a3f2679755b0fde3a230e15471f404b3aa4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Wed, 21 May 2025 11:25:32 +0200 Subject: [PATCH 082/129] Fix live reload when editing inline partials Fixes #13723 --- hugolib/rebuild_test.go | 54 ++++++ .../htmltemplate/hugo_template.go | 14 ++ .../texttemplate/hugo_template.go | 16 ++ .../go_templates/texttemplate/parse/parse.go | 2 +- tpl/tplimpl/templates.go | 52 +++-- tpl/tplimpl/templatestore.go | 179 +++++++++++------- 6 files changed, 227 insertions(+), 90 deletions(-) diff --git a/hugolib/rebuild_test.go b/hugolib/rebuild_test.go index f5c0befcc..0b22b9aa7 100644 --- a/hugolib/rebuild_test.go +++ b/hugolib/rebuild_test.go @@ -1766,6 +1766,60 @@ MyTemplate: {{ partial "MyTemplate.html" . }}| b.AssertFileContent("public/index.html", "MyTemplate: MyTemplate Edited") } +func TestRebuildEditInlinePartial13723(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +baseURL = "https://example.com" +disableLiveReload = true +title = "Foo" +-- layouts/baseof.html -- +{{ block "main" . }}Main.{{ end }} +{{ partial "myinlinepartialinbaseof.html" . }}| + {{- define "_partials/myinlinepartialinbaseof.html" }} + My inline partial in baseof. + {{ end }} +-- layouts/_partials/mypartial.html -- +Mypartial. +{{ partial "myinlinepartial.html" . }}| +{{- define "_partials/myinlinepartial.html" }} +Mypartial Inline.|{{ .Title }}| +{{ end }} +-- layouts/_partials/myotherpartial.html -- +Myotherpartial. +{{ partial "myotherinlinepartial.html" . }}| +{{- define "_partials/myotherinlinepartial.html" }} +Myotherpartial Inline.|{{ .Title }}| +{{ return "myotherinlinepartial" }} +{{ end }} +-- layouts/all.html -- +{{ define "main" }} +{{ partial "mypartial.html" . }}| +{{ partial "myotherpartial.html" . }}| + {{ partial "myinlinepartialinall.html" . }}| +{{ end }} + {{- define "_partials/myinlinepartialinall.html" }} + My inline partial in all. + {{ end }} + +` + b := TestRunning(t, files) + b.AssertFileContent("public/index.html", "Mypartial.", "Mypartial Inline.|Foo") + + // Edit inline partial in partial. + b.EditFileReplaceAll("layouts/_partials/mypartial.html", "Mypartial Inline.", "Mypartial Inline Edited.").Build() + b.AssertFileContent("public/index.html", "Mypartial Inline Edited.|Foo") + + // Edit inline partial in baseof. + b.EditFileReplaceAll("layouts/baseof.html", "My inline partial in baseof.", "My inline partial in baseof Edited.").Build() + b.AssertFileContent("public/index.html", "My inline partial in baseof Edited.") + + // Edit inline partial in all. + b.EditFileReplaceAll("layouts/all.html", "My inline partial in all.", "My inline partial in all Edited.").Build() + b.AssertFileContent("public/index.html", "My inline partial in all Edited.") +} + func TestRebuildEditAsciidocContentFile(t *testing.T) { if !asciidocext.Supports() { t.Skip("skip asciidoc") diff --git a/tpl/internal/go_templates/htmltemplate/hugo_template.go b/tpl/internal/go_templates/htmltemplate/hugo_template.go index cb7d0dc25..d91baac70 100644 --- a/tpl/internal/go_templates/htmltemplate/hugo_template.go +++ b/tpl/internal/go_templates/htmltemplate/hugo_template.go @@ -15,6 +15,7 @@ package template import ( "fmt" + "iter" "github.com/gohugoio/hugo/common/types" template "github.com/gohugoio/hugo/tpl/internal/go_templates/texttemplate" @@ -38,6 +39,19 @@ func (t *Template) Prepare() (*template.Template, error) { return t.text, nil } +func (t *Template) All() iter.Seq[*Template] { + return func(yield func(t *Template) bool) { + ns := t.nameSpace + ns.mu.Lock() + defer ns.mu.Unlock() + for _, v := range ns.set { + if !yield(v) { + return + } + } + } +} + // See https://github.com/golang/go/issues/5884 func StripTags(html string) string { return stripTags(html) diff --git a/tpl/internal/go_templates/texttemplate/hugo_template.go b/tpl/internal/go_templates/texttemplate/hugo_template.go index d179cb8c9..4f505d8c5 100644 --- a/tpl/internal/go_templates/texttemplate/hugo_template.go +++ b/tpl/internal/go_templates/texttemplate/hugo_template.go @@ -17,6 +17,7 @@ import ( "context" "fmt" "io" + "iter" "reflect" "github.com/gohugoio/hugo/common/herrors" @@ -433,3 +434,18 @@ func (s *state) evalCall(dot, fun reflect.Value, isBuiltin bool, node parse.Node func isTrue(val reflect.Value) (truth, ok bool) { return hreflect.IsTruthfulValue(val), true } + +func (t *Template) All() iter.Seq[*Template] { + return func(yield func(t *Template) bool) { + if t.common == nil { + return + } + t.muTmpl.RLock() + defer t.muTmpl.RUnlock() + for _, v := range t.tmpl { + if !yield(v) { + return + } + } + } +} diff --git a/tpl/internal/go_templates/texttemplate/parse/parse.go b/tpl/internal/go_templates/texttemplate/parse/parse.go index 27c84f31e..e05a33d6f 100644 --- a/tpl/internal/go_templates/texttemplate/parse/parse.go +++ b/tpl/internal/go_templates/texttemplate/parse/parse.go @@ -533,7 +533,7 @@ func (t *Tree) parseControl(context string) (pos Pos, line int, pipe *PipeNode, t.rangeDepth-- } switch next.Type() { - case nodeEnd: //done + case nodeEnd: // done case nodeElse: // Special case for "else if" and "else with". // If the "else" is followed immediately by an "if" or "with", diff --git a/tpl/tplimpl/templates.go b/tpl/tplimpl/templates.go index 19de48e38..7aeb7e2b9 100644 --- a/tpl/tplimpl/templates.go +++ b/tpl/tplimpl/templates.go @@ -2,6 +2,7 @@ package tplimpl import ( "io" + "iter" "regexp" "strconv" "strings" @@ -44,16 +45,15 @@ var embeddedTemplatesAliases = map[string][]string{ "_shortcodes/twitter.html": {"_shortcodes/tweet.html"}, } -func (s *TemplateStore) parseTemplate(ti *TemplInfo) error { - err := s.tns.doParseTemplate(ti) +func (s *TemplateStore) parseTemplate(ti *TemplInfo, replace bool) error { + err := s.tns.doParseTemplate(ti, replace) if err != nil { return s.addFileContext(ti, "parse of template failed", err) } - return err } -func (t *templateNamespace) doParseTemplate(ti *TemplInfo) error { +func (t *templateNamespace) doParseTemplate(ti *TemplInfo, replace bool) error { if !ti.noBaseOf || ti.category == CategoryBaseof { // Delay parsing until we have the base template. return nil @@ -68,7 +68,7 @@ func (t *templateNamespace) doParseTemplate(ti *TemplInfo) error { if ti.D.IsPlainText { prototype := t.parseText - if prototype.Lookup(name) != nil { + if !replace && prototype.Lookup(name) != nil { name += "-" + strconv.FormatUint(t.nameCounter.Add(1), 10) } templ, err = prototype.New(name).Parse(ti.content) @@ -77,7 +77,7 @@ func (t *templateNamespace) doParseTemplate(ti *TemplInfo) error { } } else { prototype := t.parseHTML - if prototype.Lookup(name) != nil { + if !replace && prototype.Lookup(name) != nil { name += "-" + strconv.FormatUint(t.nameCounter.Add(1), 10) } templ, err = prototype.New(name).Parse(ti.content) @@ -181,19 +181,24 @@ func (t *templateNamespace) applyBaseTemplate(overlay *TemplInfo, base keyTempla return nil } -func (t *templateNamespace) templatesIn(in tpl.Template) []tpl.Template { - var templs []tpl.Template - if textt, ok := in.(*texttemplate.Template); ok { - for _, t := range textt.Templates() { - templs = append(templs, t) +func (t *templateNamespace) templatesIn(in tpl.Template) iter.Seq[tpl.Template] { + return func(yield func(t tpl.Template) bool) { + switch in := in.(type) { + case *htmltemplate.Template: + for t := range in.All() { + if !yield(t) { + return + } + } + + case *texttemplate.Template: + for t := range in.All() { + if !yield(t) { + return + } + } } } - if htmlt, ok := in.(*htmltemplate.Template); ok { - for _, t := range htmlt.Templates() { - templs = append(templs, t) - } - } - return templs } /* @@ -337,8 +342,6 @@ func (t *templateNamespace) createPrototypes(init bool) error { t.prototypeHTML = htmltemplate.Must(t.parseHTML.Clone()) t.prototypeText = texttemplate.Must(t.parseText.Clone()) } - // t.execHTML = htmltemplate.Must(t.parseHTML.Clone()) - // t.execText = texttemplate.Must(t.parseText.Clone()) return nil } @@ -350,3 +353,14 @@ func newTemplateNamespace(funcs map[string]any) *templateNamespace { standaloneText: texttemplate.New("").Funcs(funcs), } } + +func isText(t tpl.Template) bool { + switch t.(type) { + case *texttemplate.Template: + return true + case *htmltemplate.Template: + return false + default: + panic("unknown template type") + } +} diff --git a/tpl/tplimpl/templatestore.go b/tpl/tplimpl/templatestore.go index 2ea337274..bbb7f27cc 100644 --- a/tpl/tplimpl/templatestore.go +++ b/tpl/tplimpl/templatestore.go @@ -114,17 +114,18 @@ func NewStore(opts StoreOptions, siteOpts SiteOptions) (*TemplateStore, error) { panic("HTML output format not found") } s := &TemplateStore{ - opts: opts, - siteOpts: siteOpts, - optsOrig: opts, - siteOptsOrig: siteOpts, - htmlFormat: html, - storeSite: configureSiteStorage(siteOpts, opts.Watching), - treeMain: doctree.NewSimpleTree[map[nodeKey]*TemplInfo](), - treeShortcodes: doctree.NewSimpleTree[map[string]map[TemplateDescriptor]*TemplInfo](), - templatesByPath: maps.NewCache[string, *TemplInfo](), - shortcodesByName: maps.NewCache[string, *TemplInfo](), - cacheLookupPartials: maps.NewCache[string, *TemplInfo](), + opts: opts, + siteOpts: siteOpts, + optsOrig: opts, + siteOptsOrig: siteOpts, + htmlFormat: html, + storeSite: configureSiteStorage(siteOpts, opts.Watching), + treeMain: doctree.NewSimpleTree[map[nodeKey]*TemplInfo](), + treeShortcodes: doctree.NewSimpleTree[map[string]map[TemplateDescriptor]*TemplInfo](), + templatesByPath: maps.NewCache[string, *TemplInfo](), + shortcodesByName: maps.NewCache[string, *TemplInfo](), + cacheLookupPartials: maps.NewCache[string, *TemplInfo](), + templatesSnapshotSet: maps.NewCache[*parse.Tree, struct{}](), // Note that the funcs passed below is just for name validation. tns: newTemplateNamespace(siteOpts.TemplateFuncs), @@ -143,10 +144,10 @@ func NewStore(opts StoreOptions, siteOpts SiteOptions) (*TemplateStore, error) { if err := s.insertEmbedded(); err != nil { return nil, err } - if err := s.parseTemplates(); err != nil { + if err := s.parseTemplates(false); err != nil { return nil, err } - if err := s.extractInlinePartials(); err != nil { + if err := s.extractInlinePartials(false); err != nil { return nil, err } if err := s.transformTemplates(); err != nil { @@ -424,10 +425,11 @@ type TemplateStore struct { siteOpts SiteOptions htmlFormat output.Format - treeMain *doctree.SimpleTree[map[nodeKey]*TemplInfo] - treeShortcodes *doctree.SimpleTree[map[string]map[TemplateDescriptor]*TemplInfo] - templatesByPath *maps.Cache[string, *TemplInfo] - shortcodesByName *maps.Cache[string, *TemplInfo] + treeMain *doctree.SimpleTree[map[nodeKey]*TemplInfo] + treeShortcodes *doctree.SimpleTree[map[string]map[TemplateDescriptor]*TemplInfo] + templatesByPath *maps.Cache[string, *TemplInfo] + shortcodesByName *maps.Cache[string, *TemplInfo] + templatesSnapshotSet *maps.Cache[*parse.Tree, struct{}] dh descriptorHandler @@ -709,12 +711,16 @@ func (s *TemplateStore) RefreshFiles(include func(fi hugofs.FileMetaInfo) bool) if err := s.insertTemplates(include, true); err != nil { return err } - if err := s.parseTemplates(); err != nil { + if err := s.createTemplatesSnapshot(); err != nil { return err } - if err := s.extractInlinePartials(); err != nil { + if err := s.parseTemplates(true); err != nil { return err } + if err := s.extractInlinePartials(true); err != nil { + return err + } + if err := s.transformTemplates(); err != nil { return err } @@ -940,59 +946,77 @@ func (s *TemplateStore) extractIdentifiers(line string) []string { return identifiers } -func (s *TemplateStore) extractInlinePartials() error { +func (s *TemplateStore) extractInlinePartials(rebuild bool) error { isPartialName := func(s string) bool { return strings.HasPrefix(s, "partials/") || strings.HasPrefix(s, "_partials/") } - p := s.tns // We may find both inline and external partials in the current template namespaces, // so only add the ones we have not seen before. - addIfNotSeen := func(isText bool, templs ...tpl.Template) error { - for _, templ := range templs { - if templ.Name() == "" || !isPartialName(templ.Name()) { - continue - } - name := templ.Name() - if !paths.HasExt(name) { - // Assume HTML. This in line with how the lookup works. - name = name + s.htmlFormat.MediaType.FirstSuffix.FullSuffix - } - if !strings.HasPrefix(name, "_") { - name = "_" + name - } - pi := s.opts.PathParser.Parse(files.ComponentFolderLayouts, name) - ti, err := s.insertTemplate(pi, nil, false, s.treeMain) - if err != nil { - return err - } - - if ti != nil { - ti.Template = templ - ti.noBaseOf = true - ti.subCategory = SubCategoryInline - ti.D.IsPlainText = isText - } - + for templ := range s.allRawTemplates() { + if templ.Name() == "" || !isPartialName(templ.Name()) { + continue } - return nil - } - addIfNotSeen(false, p.templatesIn(p.parseHTML)...) - addIfNotSeen(true, p.templatesIn(p.parseText)...) - - for _, t := range p.baseofHtmlClones { - if err := addIfNotSeen(false, p.templatesIn(t)...); err != nil { + if rebuild && s.templatesSnapshotSet.Contains(getParseTree(templ)) { + // This partial was not created during this build. + continue + } + name := templ.Name() + if !paths.HasExt(name) { + // Assume HTML. This in line with how the lookup works. + name = name + s.htmlFormat.MediaType.FirstSuffix.FullSuffix + } + if !strings.HasPrefix(name, "_") { + name = "_" + name + } + pi := s.opts.PathParser.Parse(files.ComponentFolderLayouts, name) + ti, err := s.insertTemplate(pi, nil, SubCategoryInline, false, s.treeMain) + if err != nil { return err } - } - for _, t := range p.baseofTextClones { - if err := addIfNotSeen(true, p.templatesIn(t)...); err != nil { - return err + + if ti != nil { + ti.Template = templ + ti.noBaseOf = true + ti.subCategory = SubCategoryInline + ti.D.IsPlainText = isText(templ) } } + return nil } +func (s *TemplateStore) allRawTemplates() iter.Seq[tpl.Template] { + p := s.tns + return func(yield func(tpl.Template) bool) { + for t := range p.templatesIn(p.parseHTML) { + if !yield(t) { + return + } + } + for t := range p.templatesIn(p.parseText) { + if !yield(t) { + return + } + } + + for _, tt := range p.baseofHtmlClones { + for t := range p.templatesIn(tt) { + if !yield(t) { + return + } + } + } + for _, tt := range p.baseofTextClones { + for t := range p.templatesIn(tt) { + if !yield(t) { + return + } + } + } + } +} + func (s *TemplateStore) insertEmbedded() error { return fs.WalkDir(embeddedTemplatesFs, ".", func(path string, d fs.DirEntry, err error) error { if err != nil { @@ -1024,7 +1048,7 @@ func (s *TemplateStore) insertEmbedded() error { return err } } else { - ti, err = s.insertTemplate(pi, nil, false, s.treeMain) + ti, err = s.insertTemplate(pi, nil, SubCategoryEmbedded, false, s.treeMain) if err != nil { return err } @@ -1105,7 +1129,7 @@ func (s *TemplateStore) insertShortcode(pi *paths.Path, fi hugofs.FileMetaInfo, return ti, nil } -func (s *TemplateStore) insertTemplate(pi *paths.Path, fi hugofs.FileMetaInfo, replace bool, tree doctree.Tree[map[nodeKey]*TemplInfo]) (*TemplInfo, error) { +func (s *TemplateStore) insertTemplate(pi *paths.Path, fi hugofs.FileMetaInfo, subCategory SubCategory, replace bool, tree doctree.Tree[map[nodeKey]*TemplInfo]) (*TemplInfo, error) { key, _, category, d, err := s.toKeyCategoryAndDescriptor(pi) // See #13577. Warn for now. if err != nil { @@ -1119,7 +1143,7 @@ func (s *TemplateStore) insertTemplate(pi *paths.Path, fi hugofs.FileMetaInfo, r return nil, nil } - return s.insertTemplate2(pi, fi, key, category, d, replace, false, tree) + return s.insertTemplate2(pi, fi, key, category, subCategory, d, replace, false, tree) } func (s *TemplateStore) insertTemplate2( @@ -1127,6 +1151,7 @@ func (s *TemplateStore) insertTemplate2( fi hugofs.FileMetaInfo, key string, category Category, + subCategory SubCategory, d TemplateDescriptor, replace, isLegacyMapped bool, tree doctree.Tree[map[nodeKey]*TemplInfo], @@ -1160,6 +1185,11 @@ func (s *TemplateStore) insertTemplate2( replace = fi.Meta().ModuleOrdinal < nkExisting.Fi.Meta().ModuleOrdinal } + if !replace && existingFound { + // Always replace inline partials to allow for reloading. + replace = subCategory == SubCategoryInline && nkExisting.subCategory == SubCategoryInline + } + if !replace && existingFound { if len(pi.Identifiers()) >= len(nkExisting.PathInfo.Identifiers()) { // e.g. /pages/home.foo.html and /pages/home.html where foo may be a valid language name in another site. @@ -1190,7 +1220,7 @@ func (s *TemplateStore) insertTemplate2( return ti, nil } -func (s *TemplateStore) insertTemplates(include func(fi hugofs.FileMetaInfo) bool, replace bool) error { +func (s *TemplateStore) insertTemplates(include func(fi hugofs.FileMetaInfo) bool, partialRebuild bool) error { if include == nil { include = func(fi hugofs.FileMetaInfo) bool { return true @@ -1372,7 +1402,7 @@ func (s *TemplateStore) insertTemplates(include func(fi hugofs.FileMetaInfo) boo } - if replace && pi.NameNoIdentifier() == baseNameBaseof { + if partialRebuild && pi.NameNoIdentifier() == baseNameBaseof { // A baseof file has changed. resetBaseVariants = true } @@ -1380,12 +1410,12 @@ func (s *TemplateStore) insertTemplates(include func(fi hugofs.FileMetaInfo) boo var ti *TemplInfo var err error if pi.Type() == paths.TypeShortcode { - ti, err = s.insertShortcode(pi, fi, replace, s.treeShortcodes) + ti, err = s.insertShortcode(pi, fi, partialRebuild, s.treeShortcodes) if err != nil || ti == nil { return err } } else { - ti, err = s.insertTemplate(pi, fi, replace, s.treeMain) + ti, err = s.insertTemplate(pi, fi, SubCategoryMain, partialRebuild, s.treeMain) if err != nil || ti == nil { return err } @@ -1419,7 +1449,7 @@ func (s *TemplateStore) insertTemplates(include func(fi hugofs.FileMetaInfo) boo desc.IsPlainText = outputFormat.IsPlainText desc.MediaType = mediaType.Type - ti, err := s.insertTemplate2(pi, fi, targetPath, category, desc, true, true, s.treeMain) + ti, err := s.insertTemplate2(pi, fi, targetPath, category, SubCategoryMain, desc, true, true, s.treeMain) if err != nil { return err } @@ -1430,6 +1460,7 @@ func (s *TemplateStore) insertTemplates(include func(fi hugofs.FileMetaInfo) boo if err := s.tns.readTemplateInto(ti); err != nil { return err } + } if resetBaseVariants { @@ -1456,7 +1487,15 @@ func (s *TemplateStore) key(dir string) string { return paths.TrimTrailing(dir) } -func (s *TemplateStore) parseTemplates() error { +func (s *TemplateStore) createTemplatesSnapshot() error { + s.templatesSnapshotSet.Reset() + for t := range s.allRawTemplates() { + s.templatesSnapshotSet.Set(getParseTree(t), struct{}{}) + } + return nil +} + +func (s *TemplateStore) parseTemplates(replace bool) error { if err := func() error { // Read and parse all templates. for _, v := range s.treeMain.All() { @@ -1464,7 +1503,7 @@ func (s *TemplateStore) parseTemplates() error { if vv.state == processingStateTransformed { continue } - if err := s.parseTemplate(vv); err != nil { + if err := s.parseTemplate(vv, replace); err != nil { return err } } @@ -1484,7 +1523,7 @@ func (s *TemplateStore) parseTemplates() error { // The regular expression used to detect if a template needs a base template has some // rare false positives. Assume we don't need one. vv.noBaseOf = true - if err := s.parseTemplate(vv); err != nil { + if err := s.parseTemplate(vv, replace); err != nil { return err } continue @@ -1513,7 +1552,7 @@ func (s *TemplateStore) parseTemplates() error { if vvv.state == processingStateTransformed { continue } - if err := s.parseTemplate(vvv); err != nil { + if err := s.parseTemplate(vvv, replace); err != nil { return err } } From 7766fc62416ff95ed7768c19947ac0fcd96444cc Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Thu, 22 May 2025 11:37:19 +0000 Subject: [PATCH 083/129] releaser: Bump versions for release of 0.147.5 [ci skip] --- common/hugo/version_current.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/common/hugo/version_current.go b/common/hugo/version_current.go index ba367ceb5..a6848dff9 100644 --- a/common/hugo/version_current.go +++ b/common/hugo/version_current.go @@ -17,7 +17,7 @@ package hugo // This should be the only one. var CurrentVersion = Version{ Major: 0, - Minor: 148, - PatchLevel: 0, - Suffix: "-DEV", + Minor: 147, + PatchLevel: 5, + Suffix: "", } From e25db38467088c8ae8d848d4f42a56d9830affe0 Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Thu, 22 May 2025 11:51:47 +0000 Subject: [PATCH 084/129] releaser: Prepare repository for 0.148.0-DEV [ci skip] --- common/hugo/version_current.go | 6 +++--- hugoreleaser.env | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/common/hugo/version_current.go b/common/hugo/version_current.go index a6848dff9..ba367ceb5 100644 --- a/common/hugo/version_current.go +++ b/common/hugo/version_current.go @@ -17,7 +17,7 @@ package hugo // This should be the only one. var CurrentVersion = Version{ Major: 0, - Minor: 147, - PatchLevel: 5, - Suffix: "", + Minor: 148, + PatchLevel: 0, + Suffix: "-DEV", } diff --git a/hugoreleaser.env b/hugoreleaser.env index 288189bdf..61fc999d5 100644 --- a/hugoreleaser.env +++ b/hugoreleaser.env @@ -1,7 +1,8 @@ # Release env. # These will be replaced by script before release. -HUGORELEASER_TAG=v0.147.4 -HUGORELEASER_COMMITISH=84c8426f328a946b2e10611431c450b352cecd11 +HUGORELEASER_TAG=v0.147.5 +HUGORELEASER_COMMITISH=7766fc62416ff95ed7768c19947ac0fcd96444cc + From 013c8cfb25122e03c930692c234f4a4301dfbef9 Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Fri, 23 May 2025 08:22:25 -0700 Subject: [PATCH 085/129] tpl/transform: Expose the KaTeX strict option Closes #13729 --- hugolib/integrationtest_builder.go | 2 +- internal/warpc/katex.go | 18 ++++++++- tpl/transform/transform.go | 9 +++++ tpl/transform/transform_integration_test.go | 41 +++++++++++++++++++++ 4 files changed, 68 insertions(+), 2 deletions(-) diff --git a/hugolib/integrationtest_builder.go b/hugolib/integrationtest_builder.go index 3c2f1ad74..f28407fa1 100644 --- a/hugolib/integrationtest_builder.go +++ b/hugolib/integrationtest_builder.go @@ -263,7 +263,7 @@ func (s *IntegrationTestBuilder) AssertLogContains(els ...string) { } } -// AssertLogNotContains asserts that the last build log does matches the given regular expressions. +// AssertLogMatches asserts that the last build log matches the given regular expressions. // The regular expressions can be negated with a "! " prefix. func (s *IntegrationTestBuilder) AssertLogMatches(expression string) { s.Helper() diff --git a/internal/warpc/katex.go b/internal/warpc/katex.go index 23ca726ac..75c20117f 100644 --- a/internal/warpc/katex.go +++ b/internal/warpc/katex.go @@ -45,7 +45,7 @@ type KatexOptions struct { // A color string given in the format "#XXX" or "#XXXXXX" ErrorColor string `json:"errorColor"` - // A collection of custom macros. + // A collection of custom macros. Macros map[string]string `json:"macros,omitempty"` // Specifies a minimum thickness, in ems, for fraction lines. @@ -53,6 +53,22 @@ type KatexOptions struct { // If true, KaTeX will throw a ParseError when it encounters an unsupported command. ThrowOnError bool `json:"throwOnError"` + + // Controls how KaTeX handles LaTeX features that offer convenience but + // aren't officially supported, one of error (default), ignore, or warn. + // + // - error: Throws an error when convenient, unsupported LaTeX features + // are encountered. + // - ignore: Allows convenient, unsupported LaTeX features without any + // feedback. + // - warn: Emits a warning when convenient, unsupported LaTeX features are + // encountered. + // + // The "newLineInDisplayMode" error code, which flags the use of \\ + // or \newline in display mode outside an array or tabular environment, is + // intentionally designed not to throw an error, despite this behavior + // being questionable. + Strict string `json:"strict"` } type KatexOutput struct { diff --git a/tpl/transform/transform.go b/tpl/transform/transform.go index bc6d97cf2..e8765bace 100644 --- a/tpl/transform/transform.go +++ b/tpl/transform/transform.go @@ -19,6 +19,7 @@ import ( "context" "encoding/xml" "errors" + "fmt" "html" "html/template" "io" @@ -234,6 +235,7 @@ func (ns *Namespace) ToMath(ctx context.Context, args ...any) (template.HTML, er MinRuleThickness: 0.04, ErrorColor: "#cc0000", ThrowOnError: true, + Strict: "error", }, } @@ -243,6 +245,13 @@ func (ns *Namespace) ToMath(ctx context.Context, args ...any) (template.HTML, er } } + switch katexInput.Options.Strict { + case "error", "ignore", "warn": + // Valid strict mode, continue + default: + return "", fmt.Errorf("invalid strict mode; expected one of error, ignore, or warn; received %s", katexInput.Options.Strict) + } + s := hashing.HashString(args...) key := "tomath/" + s[:2] + "/" + s[2:] fileCache := ns.deps.ResourceSpec.FileCaches.MiscCache() diff --git a/tpl/transform/transform_integration_test.go b/tpl/transform/transform_integration_test.go index 2b3c7d40e..298097879 100644 --- a/tpl/transform/transform_integration_test.go +++ b/tpl/transform/transform_integration_test.go @@ -495,3 +495,44 @@ DATA } } } + +// Issue 13729 +func TestToMathStrictMode(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +disableKinds = ['page','rss','section','sitemap','taxonomy','term'] +-- layouts/all.html -- +{{ transform.ToMath "a %" dict }} +-- foo -- +` + + // strict mode: default + f := strings.ReplaceAll(files, "dict", "") + b, err := hugolib.TestE(t, f) + b.Assert(err.Error(), qt.Contains, "[commentAtEnd]") + + // strict mode: error + f = strings.ReplaceAll(files, "dict", `(dict "strict" "error")`) + b, err = hugolib.TestE(t, f) + b.Assert(err.Error(), qt.Contains, "[commentAtEnd]") + + // strict mode: ignore + f = strings.ReplaceAll(files, "dict", `(dict "strict" "ignore")`) + b = hugolib.Test(t, f, hugolib.TestOptWarn()) + b.AssertLogMatches("") + b.AssertFileContent("public/index.html", `a %`) + + // strict: warn + // TODO: see https://github.com/gohugoio/hugo/issues/13735 + // f = strings.ReplaceAll(files, "dict", `(dict "strict" "warn")`) + // b = hugolib.Test(t, f, hugolib.TestOptWarn()) + // b.AssertLogMatches("[commentAtEnd]") + // b.AssertFileContent("public/index.html", `a %`) + + // strict mode: invalid value + f = strings.ReplaceAll(files, "dict", `(dict "strict" "foo")`) + b, err = hugolib.TestE(t, f) + b.Assert(err.Error(), qt.Contains, "invalid strict mode") +} From f47193669d2f93343d95517a22e6e2b9648b85ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Fri, 23 May 2025 12:03:41 +0200 Subject: [PATCH 086/129] commands: Make sure the browser gets refreshed on changes when --disableFastRender is set Fixes #13727 --- commands/hugobuilder.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/commands/hugobuilder.go b/commands/hugobuilder.go index 778d85ca9..3b57ac5e9 100644 --- a/commands/hugobuilder.go +++ b/commands/hugobuilder.go @@ -972,6 +972,9 @@ func (c *hugoBuilder) handleEvents(watcher *watcher.Batcher, lrl.Logf("force refresh") livereload.ForceRefresh() } + } else { + lrl.Logf("force refresh") + livereload.ForceRefresh() } if len(cssChanges) > 0 { From 9ad26b69ad091ab51f4010c7cafd1daeed095ae7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Mon, 26 May 2025 10:22:13 +0200 Subject: [PATCH 087/129] Fix it so e.g. de in layouts/_shortcodes/de.html is not interpreted as a language code Fixes #13740 --- common/paths/pathparser.go | 11 ++++++----- common/paths/pathparser_test.go | 11 ++++++++++- tpl/tplimpl/shortcodes_integration_test.go | 4 ++-- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/common/paths/pathparser.go b/common/paths/pathparser.go index b0a2f9fc4..d10523a84 100644 --- a/common/paths/pathparser.go +++ b/common/paths/pathparser.go @@ -120,11 +120,11 @@ func (pp *PathParser) parse(component, s string) (*Path, error) { return p, nil } -func (pp *PathParser) parseIdentifier(component, s string, p *Path, i, lastDot int) { +func (pp *PathParser) parseIdentifier(component, s string, p *Path, i, lastDot, numDots int) { if p.posContainerHigh != -1 { return } - mayHaveLang := p.posIdentifierLanguage == -1 && pp.LanguageIndex != nil + mayHaveLang := numDots > 1 && p.posIdentifierLanguage == -1 && pp.LanguageIndex != nil mayHaveLang = mayHaveLang && (component == files.ComponentFolderContent || component == files.ComponentFolderLayouts) mayHaveOutputFormat := component == files.ComponentFolderLayouts mayHaveKind := p.posIdentifierKind == -1 && mayHaveOutputFormat @@ -167,7 +167,6 @@ func (pp *PathParser) parseIdentifier(component, s string, p *Path, i, lastDot i if langFound { p.identifiersKnown = append(p.identifiersKnown, id) p.posIdentifierLanguage = len(p.identifiersKnown) - 1 - } } @@ -234,19 +233,21 @@ func (pp *PathParser) doParse(component, s string, p *Path) (*Path, error) { p.s = s slashCount := 0 lastDot := 0 + lastSlashIdx := strings.LastIndex(s, "/") + numDots := strings.Count(s[lastSlashIdx+1:], ".") for i := len(s) - 1; i >= 0; i-- { c := s[i] switch c { case '.': - pp.parseIdentifier(component, s, p, i, lastDot) + pp.parseIdentifier(component, s, p, i, lastDot, numDots) lastDot = i case '/': slashCount++ if p.posContainerHigh == -1 { if lastDot > 0 { - pp.parseIdentifier(component, s, p, i, lastDot) + pp.parseIdentifier(component, s, p, i, lastDot, numDots) } p.posContainerHigh = i + 1 } else if p.posContainerLow == -1 { diff --git a/common/paths/pathparser_test.go b/common/paths/pathparser_test.go index a6194e756..ad76b9367 100644 --- a/common/paths/pathparser_test.go +++ b/common/paths/pathparser_test.go @@ -563,11 +563,20 @@ func TestParseLayouts(t *testing.T) { c.Assert(p.Type(), qt.Equals, TypePartial) }, }, + { + "Shortcode lang in root", + "/_shortcodes/no.html", + func(c *qt.C, p *Path) { + c.Assert(p.Type(), qt.Equals, TypeShortcode) + c.Assert(p.Lang(), qt.Equals, "") + c.Assert(p.NameNoIdentifier(), qt.Equals, "no") + }, + }, } for _, test := range tests { c.Run(test.name, func(c *qt.C) { - if test.name != "Baseof" { + if test.name != "Shortcode lang in root" { // return } test.assert(c, testParser.Parse(files.ComponentFolderLayouts, test.path)) diff --git a/tpl/tplimpl/shortcodes_integration_test.go b/tpl/tplimpl/shortcodes_integration_test.go index e884c9a8d..275e8cc15 100644 --- a/tpl/tplimpl/shortcodes_integration_test.go +++ b/tpl/tplimpl/shortcodes_integration_test.go @@ -730,16 +730,16 @@ SHORTCODE b.Assert(err.Error(), qt.Contains, `no compatible template found for shortcode "mymarkdown" in [/_shortcodes/mymarkdown.md]; note that to use plain text template shortcodes in HTML you need to use the shortcode {{% delimiter`) } -func TestShortcodeOnlyLanguageInBaseIssue13699(t *testing.T) { +func TestShortcodeOnlyLanguageInBaseIssue13699And13740(t *testing.T) { t.Parallel() files := ` -- hugo.toml -- baseURL = 'https://example.org/' +disableLanguages = ['de'] [languages] [languages.en] weight = 1 -disableLanguages = ['de'] [languages.de] weight = 2 -- layouts/_shortcodes/de.html -- From eaf5ace30dafc40a8771ef97af0367e655ab0881 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Mon, 26 May 2025 18:12:32 +0200 Subject: [PATCH 088/129] Fix recent regression with cascading of params to content adapters Fixes #13743 --- config/allconfig/allconfig.go | 4 +- hugolib/cascade_test.go | 21 ++++++ hugolib/content_map_page.go | 12 ++-- hugolib/page__meta.go | 29 ++++++--- resources/page/page_matcher.go | 72 ++++++++------------- resources/page/page_matcher_test.go | 8 +-- resources/page/pagemeta/page_frontmatter.go | 8 +-- 7 files changed, 82 insertions(+), 72 deletions(-) diff --git a/config/allconfig/allconfig.go b/config/allconfig/allconfig.go index d3ee28490..0db0be1d8 100644 --- a/config/allconfig/allconfig.go +++ b/config/allconfig/allconfig.go @@ -146,7 +146,7 @@ type Config struct { // The cascade configuration section contains the top level front matter cascade configuration options, // a slice of page matcher and params to apply to those pages. - Cascade *config.ConfigNamespace[[]page.PageMatcherParamsConfig, *maps.Ordered[page.PageMatcher, maps.Params]] `mapstructure:"-"` + Cascade *config.ConfigNamespace[[]page.PageMatcherParamsConfig, *maps.Ordered[page.PageMatcher, page.PageMatcherParamsConfig]] `mapstructure:"-"` // The segments defines segments for the site. Used for partial/segmented builds. Segments *config.ConfigNamespace[map[string]segments.SegmentConfig, segments.Segments] `mapstructure:"-"` @@ -776,7 +776,7 @@ type Configs struct { } func (c *Configs) Validate(logger loggers.Logger) error { - c.Base.Cascade.Config.Range(func(p page.PageMatcher, params maps.Params) bool { + c.Base.Cascade.Config.Range(func(p page.PageMatcher, cfg page.PageMatcherParamsConfig) bool { page.CheckCascadePattern(logger, p) return true }) diff --git a/hugolib/cascade_test.go b/hugolib/cascade_test.go index d0a6730db..10b47764f 100644 --- a/hugolib/cascade_test.go +++ b/hugolib/cascade_test.go @@ -917,3 +917,24 @@ title: p2 b.AssertFileExists("public/sx/index.html", true) // failing b.AssertFileExists("public/sx/p2/index.html", true) // failing } + +func TestCascadeGotmplIssue13743(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +disableKinds = ['home','rss','section','sitemap','taxonomy','term'] +[cascade.params] +foo = 'bar' +[cascade.target] +path = '/p1' +-- content/_content.gotmpl -- +{{ .AddPage (dict "title" "p1" "path" "p1") }} +-- layouts/all.html -- +{{ .Title }}|{{ .Params.foo }} +` + + b := Test(t, files) + + b.AssertFileContent("public/p1/index.html", "p1|bar") // actual content is "p1|" +} diff --git a/hugolib/content_map_page.go b/hugolib/content_map_page.go index 9e67fbb1b..ef2daca74 100644 --- a/hugolib/content_map_page.go +++ b/hugolib/content_map_page.go @@ -1412,7 +1412,7 @@ func (sa *sitePagesAssembler) applyAggregates() error { } // Handle cascades first to get any default dates set. - var cascade *maps.Ordered[page.PageMatcher, maps.Params] + var cascade *maps.Ordered[page.PageMatcher, page.PageMatcherParamsConfig] if keyPage == "" { // Home page gets it's cascade from the site config. cascade = sa.conf.Cascade.Config @@ -1424,7 +1424,7 @@ func (sa *sitePagesAssembler) applyAggregates() error { } else { _, data := pw.WalkContext.Data().LongestPrefix(paths.Dir(keyPage)) if data != nil { - cascade = data.(*maps.Ordered[page.PageMatcher, maps.Params]) + cascade = data.(*maps.Ordered[page.PageMatcher, page.PageMatcherParamsConfig]) } } @@ -1506,11 +1506,11 @@ func (sa *sitePagesAssembler) applyAggregates() error { pageResource := rs.r.(*pageState) relPath := pageResource.m.pathInfo.BaseRel(pageBundle.m.pathInfo) pageResource.m.resourcePath = relPath - var cascade *maps.Ordered[page.PageMatcher, maps.Params] + var cascade *maps.Ordered[page.PageMatcher, page.PageMatcherParamsConfig] // Apply cascade (if set) to the page. _, data := pw.WalkContext.Data().LongestPrefix(resourceKey) if data != nil { - cascade = data.(*maps.Ordered[page.PageMatcher, maps.Params]) + cascade = data.(*maps.Ordered[page.PageMatcher, page.PageMatcherParamsConfig]) } if err := pageResource.setMetaPost(cascade); err != nil { return false, err @@ -1574,10 +1574,10 @@ func (sa *sitePagesAssembler) applyAggregatesToTaxonomiesAndTerms() error { const eventName = "dates" if p.Kind() == kinds.KindTerm { - var cascade *maps.Ordered[page.PageMatcher, maps.Params] + var cascade *maps.Ordered[page.PageMatcher, page.PageMatcherParamsConfig] _, data := pw.WalkContext.Data().LongestPrefix(s) if data != nil { - cascade = data.(*maps.Ordered[page.PageMatcher, maps.Params]) + cascade = data.(*maps.Ordered[page.PageMatcher, page.PageMatcherParamsConfig]) } if err := p.setMetaPost(cascade); err != nil { return false, err diff --git a/hugolib/page__meta.go b/hugolib/page__meta.go index e8bce20d1..0d6d22e9a 100644 --- a/hugolib/page__meta.go +++ b/hugolib/page__meta.go @@ -83,8 +83,8 @@ type pageMetaParams struct { // These are only set in watch mode. datesOriginal pagemeta.Dates - paramsOriginal map[string]any // contains the original params as defined in the front matter. - cascadeOriginal *maps.Ordered[page.PageMatcher, maps.Params] // contains the original cascade as defined in the front matter. + paramsOriginal map[string]any // contains the original params as defined in the front matter. + cascadeOriginal *maps.Ordered[page.PageMatcher, page.PageMatcherParamsConfig] // contains the original cascade as defined in the front matter. } func (m *pageMetaParams) init(preserveOriginal bool) { @@ -291,7 +291,7 @@ func (p *pageMeta) setMetaPre(pi *contentParseInfo, logger loggers.Logger, conf return nil } -func (ps *pageState) setMetaPost(cascade *maps.Ordered[page.PageMatcher, maps.Params]) error { +func (ps *pageState) setMetaPost(cascade *maps.Ordered[page.PageMatcher, page.PageMatcherParamsConfig]) error { ps.m.setMetaPostCount++ var cascadeHashPre uint64 if ps.m.setMetaPostCount > 1 { @@ -303,15 +303,20 @@ func (ps *pageState) setMetaPost(cascade *maps.Ordered[page.PageMatcher, maps.Pa // Apply cascades first so they can be overridden later. if cascade != nil { if ps.m.pageConfig.CascadeCompiled != nil { - cascade.Range(func(k page.PageMatcher, v maps.Params) bool { + cascade.Range(func(k page.PageMatcher, v page.PageMatcherParamsConfig) bool { vv, found := ps.m.pageConfig.CascadeCompiled.Get(k) if !found { ps.m.pageConfig.CascadeCompiled.Set(k, v) } else { // Merge - for ck, cv := range v { - if _, found := vv[ck]; !found { - vv[ck] = cv + for ck, cv := range v.Params { + if _, found := vv.Params[ck]; !found { + vv.Params[ck] = cv + } + } + for ck, cv := range v.Fields { + if _, found := vv.Fields[ck]; !found { + vv.Fields[ck] = cv } } } @@ -341,11 +346,17 @@ func (ps *pageState) setMetaPost(cascade *maps.Ordered[page.PageMatcher, maps.Pa // Cascade is also applied to itself. var err error - cascade.Range(func(k page.PageMatcher, v maps.Params) bool { + cascade.Range(func(k page.PageMatcher, v page.PageMatcherParamsConfig) bool { if !k.Matches(ps) { return true } - for kk, vv := range v { + for kk, vv := range v.Params { + if _, found := ps.m.pageConfig.Params[kk]; !found { + ps.m.pageConfig.Params[kk] = vv + } + } + + for kk, vv := range v.Fields { if ps.m.pageConfig.IsFromContentAdapter { if _, found := ps.m.pageConfig.ContentAdapterData[kk]; !found { ps.m.pageConfig.ContentAdapterData[kk] = vv diff --git a/resources/page/page_matcher.go b/resources/page/page_matcher.go index 27a7c7e9e..306c2d03c 100644 --- a/resources/page/page_matcher.go +++ b/resources/page/page_matcher.go @@ -105,9 +105,9 @@ func CheckCascadePattern(logger loggers.Logger, m PageMatcher) { } } -func DecodeCascadeConfig(logger loggers.Logger, handleLegacyFormat bool, in any) (*config.ConfigNamespace[[]PageMatcherParamsConfig, *maps.Ordered[PageMatcher, maps.Params]], error) { - buildConfig := func(in any) (*maps.Ordered[PageMatcher, maps.Params], any, error) { - cascade := maps.NewOrdered[PageMatcher, maps.Params]() +func DecodeCascadeConfig(logger loggers.Logger, handleLegacyFormat bool, in any) (*config.ConfigNamespace[[]PageMatcherParamsConfig, *maps.Ordered[PageMatcher, PageMatcherParamsConfig]], error) { + buildConfig := func(in any) (*maps.Ordered[PageMatcher, PageMatcherParamsConfig], any, error) { + cascade := maps.NewOrdered[PageMatcher, PageMatcherParamsConfig]() if in == nil { return cascade, []map[string]any{}, nil } @@ -124,11 +124,7 @@ func DecodeCascadeConfig(logger loggers.Logger, handleLegacyFormat bool, in any) c PageMatcherParamsConfig err error ) - if handleLegacyFormat { - c, err = mapToPageMatcherParamsConfigLegacy(m) - } else { - c, err = mapToPageMatcherParamsConfig(m) - } + c, err = mapToPageMatcherParamsConfig(m) if err != nil { return nil, nil, err } @@ -147,23 +143,28 @@ func DecodeCascadeConfig(logger loggers.Logger, handleLegacyFormat bool, in any) if found { // Merge for k, v := range cfg.Params { - if _, found := c[k]; !found { - c[k] = v + if _, found := c.Params[k]; !found { + c.Params[k] = v + } + } + for k, v := range cfg.Fields { + if _, found := c.Fields[k]; !found { + c.Fields[k] = v } } } else { - cascade.Set(m, cfg.Params) + cascade.Set(m, cfg) } } return cascade, cfgs, nil } - return config.DecodeNamespace[[]PageMatcherParamsConfig, *maps.Ordered[PageMatcher, maps.Params]](in, buildConfig) + return config.DecodeNamespace[[]PageMatcherParamsConfig, *maps.Ordered[PageMatcher, PageMatcherParamsConfig]](in, buildConfig) } // DecodeCascade decodes in which could be either a map or a slice of maps. -func DecodeCascade(logger loggers.Logger, handleLegacyFormat bool, in any) (*maps.Ordered[PageMatcher, maps.Params], error) { +func DecodeCascade(logger loggers.Logger, handleLegacyFormat bool, in any) (*maps.Ordered[PageMatcher, PageMatcherParamsConfig], error) { conf, err := DecodeCascadeConfig(logger, handleLegacyFormat, in) if err != nil { return nil, err @@ -181,47 +182,22 @@ func mapToPageMatcherParamsConfig(m map[string]any) (PageMatcherParamsConfig, er return pcfg, err } pcfg.Target = target - default: + case "params": if pcfg.Params == nil { pcfg.Params = make(maps.Params) } - pcfg.Params[k] = v - } - } - return pcfg, pcfg.init() -} - -func mapToPageMatcherParamsConfigLegacy(m map[string]any) (PageMatcherParamsConfig, error) { - var pcfg PageMatcherParamsConfig - for k, v := range m { - switch strings.ToLower(k) { - case "params": - // We simplified the structure of the cascade config in Hugo 0.111.0. - // There is a small chance that someone has used the old structure with the params keyword, - // those values will now be moved to the top level. - // This should be very unlikely as it would lead to constructs like .Params.params.foo, - // and most people see params as an Hugo internal keyword. params := maps.ToStringMap(v) - if pcfg.Params == nil { - pcfg.Params = params - } else { - for k, v := range params { - if _, found := pcfg.Params[k]; !found { - pcfg.Params[k] = v - } + for k, v := range params { + if _, found := pcfg.Params[k]; !found { + pcfg.Params[k] = v } } - case "_target", "target": - var target PageMatcher - if err := decodePageMatcher(v, &target); err != nil { - return pcfg, err - } - pcfg.Target = target default: - if pcfg.Params == nil { - pcfg.Params = make(maps.Params) + if pcfg.Fields == nil { + pcfg.Fields = make(maps.Params) } - pcfg.Params[k] = v + + pcfg.Fields[k] = v } } return pcfg, pcfg.init() @@ -250,10 +226,14 @@ func decodePageMatcher(m any, v *PageMatcher) error { type PageMatcherParamsConfig struct { // Apply Params to all Pages matching Target. Params maps.Params + // Fields holds all fields but Params. + Fields maps.Params + // Target is the PageMatcher that this config applies to. Target PageMatcher } func (p *PageMatcherParamsConfig) init() error { maps.PrepareParams(p.Params) + maps.PrepareParams(p.Fields) return nil } diff --git a/resources/page/page_matcher_test.go b/resources/page/page_matcher_test.go index 2fe6ccc89..ad35da43c 100644 --- a/resources/page/page_matcher_test.go +++ b/resources/page/page_matcher_test.go @@ -84,19 +84,17 @@ func TestPageMatcher(t *testing.T) { c.Run("mapToPageMatcherParamsConfig", func(c *qt.C) { fn := func(m map[string]any) PageMatcherParamsConfig { - v, err := mapToPageMatcherParamsConfigLegacy(m) + v, err := mapToPageMatcherParamsConfig(m) c.Assert(err, qt.IsNil) return v } - // Legacy. c.Assert(fn(map[string]any{"_target": map[string]any{"kind": "page"}, "foo": "bar"}), qt.DeepEquals, PageMatcherParamsConfig{ - Params: maps.Params{ + Fields: maps.Params{ "foo": "bar", }, Target: PageMatcher{Path: "", Kind: "page", Lang: "", Environment: ""}, }) - // Current format. c.Assert(fn(map[string]any{"target": map[string]any{"kind": "page"}, "params": map[string]any{"foo": "bar"}}), qt.DeepEquals, PageMatcherParamsConfig{ Params: maps.Params{ "foo": "bar", @@ -134,7 +132,7 @@ func TestDecodeCascadeConfig(t *testing.T) { c.Assert(err, qt.IsNil) c.Assert(got, qt.IsNotNil) c.Assert(got.Config.Keys(), qt.DeepEquals, []PageMatcher{{Kind: "page", Environment: "production"}, {Kind: "page"}}) - c.Assert(got.Config.Values(), qt.DeepEquals, []maps.Params{{"a": string("av")}, {"b": string("bv")}}) + c.Assert(got.SourceStructure, qt.DeepEquals, []PageMatcherParamsConfig{ { Params: maps.Params{"a": string("av")}, diff --git a/resources/page/pagemeta/page_frontmatter.go b/resources/page/pagemeta/page_frontmatter.go index 7dea7ca6b..fd4f7759b 100644 --- a/resources/page/pagemeta/page_frontmatter.go +++ b/resources/page/pagemeta/page_frontmatter.go @@ -125,10 +125,10 @@ type PageConfig struct { ContentAdapterData map[string]any `mapstructure:"-" json:"-"` // Compiled values. - CascadeCompiled *maps.Ordered[page.PageMatcher, maps.Params] `mapstructure:"-" json:"-"` - ContentMediaType media.Type `mapstructure:"-" json:"-"` - ConfiguredOutputFormats output.Formats `mapstructure:"-" json:"-"` - IsFromContentAdapter bool `mapstructure:"-" json:"-"` + CascadeCompiled *maps.Ordered[page.PageMatcher, page.PageMatcherParamsConfig] `mapstructure:"-" json:"-"` + ContentMediaType media.Type `mapstructure:"-" json:"-"` + ConfiguredOutputFormats output.Formats `mapstructure:"-" json:"-"` + IsFromContentAdapter bool `mapstructure:"-" json:"-"` } func ClonePageConfigForRebuild(p *PageConfig, params map[string]any) *PageConfig { From e57dcd3795b80584354656b440534b42f7bb5684 Mon Sep 17 00:00:00 2001 From: Andreas Deininger Date: Mon, 26 May 2025 17:40:02 +0200 Subject: [PATCH 089/129] Improve warning message on superfluous prefix when using function 'partials.Include' --- tpl/partials/partials.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tpl/partials/partials.go b/tpl/partials/partials.go index 19882e36a..57a2aa280 100644 --- a/tpl/partials/partials.go +++ b/tpl/partials/partials.go @@ -133,7 +133,7 @@ func (ns *Namespace) lookup(name string) (*tplimpl.TemplInfo, error) { if strings.HasPrefix(name, "partials/") { // This is most likely not what the user intended. // This worked before Hugo 0.146.0. - ns.deps.Log.Warnidf(constants.WarnPartialSuperfluousPrefix, "Partial name %q starting with 'partials/' (as in {{ partial \"%s\"}}) is most likely not what you want. Before 0.146.0 we did a double lookup in this situation.", name, name) + ns.deps.Log.Warnidf(constants.WarnPartialSuperfluousPrefix, "Doubtful use of partial function in {{ partial \"%s\"}}), this is most likely not what you want. Consider removing superfluous prefix \"partials/\" from template name given as first function argument.", name) } v := ns.deps.TemplateStore.LookupPartial(name) if v == nil { From 0a5fd8ebb8e2ca798515e8c564c14e32db3b4127 Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Tue, 27 May 2025 11:17:16 +0000 Subject: [PATCH 090/129] releaser: Bump versions for release of 0.147.6 [ci skip] --- common/hugo/version_current.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/common/hugo/version_current.go b/common/hugo/version_current.go index ba367ceb5..f0b2df85a 100644 --- a/common/hugo/version_current.go +++ b/common/hugo/version_current.go @@ -17,7 +17,7 @@ package hugo // This should be the only one. var CurrentVersion = Version{ Major: 0, - Minor: 148, - PatchLevel: 0, - Suffix: "-DEV", + Minor: 147, + PatchLevel: 6, + Suffix: "", } From 463e440c7aed80bb177e328cb45181c807f692dd Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Tue, 27 May 2025 11:31:53 +0000 Subject: [PATCH 091/129] releaser: Prepare repository for 0.148.0-DEV [ci skip] --- common/hugo/version_current.go | 6 +++--- hugoreleaser.env | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/common/hugo/version_current.go b/common/hugo/version_current.go index f0b2df85a..ba367ceb5 100644 --- a/common/hugo/version_current.go +++ b/common/hugo/version_current.go @@ -17,7 +17,7 @@ package hugo // This should be the only one. var CurrentVersion = Version{ Major: 0, - Minor: 147, - PatchLevel: 6, - Suffix: "", + Minor: 148, + PatchLevel: 0, + Suffix: "-DEV", } diff --git a/hugoreleaser.env b/hugoreleaser.env index 61fc999d5..46cd6ee93 100644 --- a/hugoreleaser.env +++ b/hugoreleaser.env @@ -1,7 +1,8 @@ # Release env. # These will be replaced by script before release. -HUGORELEASER_TAG=v0.147.5 -HUGORELEASER_COMMITISH=7766fc62416ff95ed7768c19947ac0fcd96444cc +HUGORELEASER_TAG=v0.147.6 +HUGORELEASER_COMMITISH=0a5fd8ebb8e2ca798515e8c564c14e32db3b4127 + From 13e1617557302999b974a95b3f3f9ff1bc6e510b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Wed, 28 May 2025 12:15:17 +0200 Subject: [PATCH 092/129] deps: Upgrade github.com/olekukonko/tablewriter v0.0.5 => v1.0.7 --- go.mod | 7 +++++-- go.sum | 10 +++++++++ helpers/processing_stats.go | 42 ++++++++++++++++++------------------- hugolib/site_stats_test.go | 6 +----- 4 files changed, 36 insertions(+), 29 deletions(-) diff --git a/go.mod b/go.mod index c51a5fc52..e0ce06568 100644 --- a/go.mod +++ b/go.mod @@ -55,7 +55,7 @@ require ( github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c github.com/muesli/smartcrop v0.3.0 github.com/niklasfasching/go-org v1.7.0 - github.com/olekukonko/tablewriter v0.0.5 + github.com/olekukonko/tablewriter v1.0.7 github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 github.com/pelletier/go-toml/v2 v2.2.4 github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c @@ -141,13 +141,16 @@ require ( github.com/kylelemons/godebug v1.1.0 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-runewidth v0.0.9 // indirect + github.com/mattn/go-runewidth v0.0.16 // indirect github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 // indirect github.com/oasdiff/yaml v0.0.0-20250309154309-f31be36b4037 // indirect github.com/oasdiff/yaml3 v0.0.0-20250309153720-d2182401db90 // indirect + github.com/olekukonko/errors v0.0.0-20250405072817-4e6d85265da6 // indirect + github.com/olekukonko/ll v0.0.8 // indirect github.com/perimeterx/marshmallow v1.1.5 // indirect github.com/pkg/errors v0.9.1 // indirect + github.com/rivo/uniseg v0.2.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect diff --git a/go.sum b/go.sum index a70bc0390..05978a56e 100644 --- a/go.sum +++ b/go.sum @@ -378,6 +378,8 @@ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWE github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c h1:cqn374mizHuIWj+OSJCajGr/phAmuMug9qIX3l9CflE= github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= @@ -394,8 +396,14 @@ github.com/oasdiff/yaml v0.0.0-20250309154309-f31be36b4037 h1:G7ERwszslrBzRxj//J github.com/oasdiff/yaml v0.0.0-20250309154309-f31be36b4037/go.mod h1:2bpvgLBZEtENV5scfDFEtB/5+1M4hkQhDQrccEJ/qGw= github.com/oasdiff/yaml3 v0.0.0-20250309153720-d2182401db90 h1:bQx3WeLcUWy+RletIKwUIt4x3t8n2SxavmoclizMb8c= github.com/oasdiff/yaml3 v0.0.0-20250309153720-d2182401db90/go.mod h1:y5+oSEHCPT/DGrS++Wc/479ERge0zTFxaF8PbGKcg2o= +github.com/olekukonko/errors v0.0.0-20250405072817-4e6d85265da6 h1:r3FaAI0NZK3hSmtTDrBVREhKULp8oUeqLT5Eyl2mSPo= +github.com/olekukonko/errors v0.0.0-20250405072817-4e6d85265da6/go.mod h1:ppzxA5jBKcO1vIpCXQ9ZqgDh8iwODz6OXIGKU8r5m4Y= +github.com/olekukonko/ll v0.0.8 h1:sbGZ1Fx4QxJXEqL/6IG8GEFnYojUSQ45dJVwN2FH2fc= +github.com/olekukonko/ll v0.0.8/go.mod h1:En+sEW0JNETl26+K8eZ6/W4UQ7CYSrrgg/EdIYT2H8g= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= +github.com/olekukonko/tablewriter v1.0.7 h1:HCC2e3MM+2g72M81ZcJU11uciw6z/p82aEnm4/ySDGw= +github.com/olekukonko/tablewriter v1.0.7/go.mod h1:H428M+HzoUXC6JU2Abj9IT9ooRmdq9CxuDmKMtrOCMs= github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2DcNVpwGmV9E1BkGknEliJkfwQj0= github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y= github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4= @@ -414,6 +422,8 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= diff --git a/helpers/processing_stats.go b/helpers/processing_stats.go index 3f48466c7..42376b46d 100644 --- a/helpers/processing_stats.go +++ b/helpers/processing_stats.go @@ -19,6 +19,8 @@ import ( "sync/atomic" "github.com/olekukonko/tablewriter" + "github.com/olekukonko/tablewriter/renderer" + "github.com/olekukonko/tablewriter/tw" ) // ProcessingStats represents statistics about a site build. @@ -66,23 +68,6 @@ func (s *ProcessingStats) Add(counter *uint64, amount int) { atomic.AddUint64(counter, uint64(amount)) } -// Table writes a table-formatted representation of the stats in a -// ProcessingStats instance to w. -func (s *ProcessingStats) Table(w io.Writer) { - titleVals := s.toVals() - data := make([][]string, len(titleVals)) - for i, tv := range titleVals { - data[i] = []string{tv.name, strconv.Itoa(int(tv.val))} - } - - table := tablewriter.NewWriter(w) - - table.AppendBulk(data) - table.SetHeader([]string{"", s.Name}) - table.SetBorder(false) - table.Render() -} - // ProcessingStatsTable writes a table-formatted representation of stats to w. func ProcessingStatsTable(w io.Writer, stats ...*ProcessingStats) { names := make([]string, len(stats)+1) @@ -106,13 +91,26 @@ func ProcessingStatsTable(w io.Writer, stats ...*ProcessingStats) { data[j] = append(data[j], strconv.Itoa(int(tv.val))) } } - } - table := tablewriter.NewWriter(w) + table := tablewriter.NewTable( + w, + tablewriter.WithRenderer(renderer.NewBlueprint(tw.Rendition{ + Borders: tw.BorderNone, + Symbols: tw.NewSymbols(tw.StyleLight), + Settings: tw.Settings{ + Separators: tw.Separators{BetweenRows: tw.Off}, + Lines: tw.Lines{ShowFooterLine: tw.On}, + }, + })), + tablewriter.WithConfig( + tablewriter.Config{ + MaxWidth: 70, + Row: tw.CellConfig{Alignment: tw.CellAlignment{Global: tw.AlignRight, PerColumn: []tw.Align{tw.AlignLeft}}}, + }), + ) - table.AppendBulk(data) - table.SetHeader(names) - table.SetBorder(false) + table.Bulk(data) + table.Header(names) table.Render() } diff --git a/hugolib/site_stats_test.go b/hugolib/site_stats_test.go index 02f2c0a8c..c045963f3 100644 --- a/hugolib/site_stats_test.go +++ b/hugolib/site_stats_test.go @@ -16,7 +16,6 @@ package hugolib import ( "bytes" "fmt" - "io" "testing" "github.com/gohugoio/hugo/helpers" @@ -89,14 +88,11 @@ aliases: [/Ali%d] h.Sites[1].PathSpec.ProcessingStats, } - stats[0].Table(io.Discard) - stats[1].Table(io.Discard) - var buff bytes.Buffer helpers.ProcessingStatsTable(&buff, stats...) - c.Assert(buff.String(), qt.Contains, "Pages | 21 | 7") + c.Assert(buff.String(), qt.Contains, "Pages │ 21 │ 7") } func TestSiteLastmod(t *testing.T) { From 766a2e7868454225b176468ee7df412a7373324e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Wed, 28 May 2025 09:18:16 +0200 Subject: [PATCH 093/129] Make sure that unreferenced but changed bundle resources gets republished Fixes #13748 --- hugolib/content_map_page.go | 2 -- hugolib/hugo_sites_build.go | 1 - hugolib/page.go | 61 +++++++++++++++++++------------------ hugolib/page__new.go | 2 -- hugolib/rebuild_test.go | 20 ++++++++++++ resources/resource.go | 20 ++++++++++-- resources/resource_spec.go | 3 +- resources/transform.go | 6 ++++ 8 files changed, 77 insertions(+), 38 deletions(-) diff --git a/hugolib/content_map_page.go b/hugolib/content_map_page.go index ef2daca74..47637d3e8 100644 --- a/hugolib/content_map_page.go +++ b/hugolib/content_map_page.go @@ -21,7 +21,6 @@ import ( "sort" "strconv" "strings" - "sync" "sync/atomic" "time" @@ -1310,7 +1309,6 @@ func (h *HugoSites) resolveAndResetDependententPageOutputs(ctx context.Context, } po.renderState = 0 - po.p.resourcesPublishInit = &sync.Once{} if r == identity.FinderFoundOneOfMany || po.f.Name == output.HTTPStatus404HTMLFormat.Name { // Will force a re-render even in fast render mode. po.renderOnce = false diff --git a/hugolib/hugo_sites_build.go b/hugolib/hugo_sites_build.go index ce8ddd143..b1fe279f4 100644 --- a/hugolib/hugo_sites_build.go +++ b/hugolib/hugo_sites_build.go @@ -905,7 +905,6 @@ func (h *HugoSites) processPartialFileEvents(ctx context.Context, l logg.LevelLo handleChange := func(pathInfo *paths.Path, delete, isDir bool) { switch pathInfo.Component() { case files.ComponentFolderContent: - logger.Println("Source changed", pathInfo.Path()) isContentDataFile := pathInfo.IsContentData() if !isContentDataFile { if ids := h.pageTrees.collectAndMarkStaleIdentities(pathInfo); len(ids) > 0 { diff --git a/hugolib/page.go b/hugolib/page.go index 84d4d1ea8..bdfc66e87 100644 --- a/hugolib/page.go +++ b/hugolib/page.go @@ -19,7 +19,6 @@ import ( "path/filepath" "strconv" "strings" - "sync" "sync/atomic" "github.com/gohugoio/hugo/hugofs" @@ -29,6 +28,7 @@ import ( "github.com/gohugoio/hugo/media" "github.com/gohugoio/hugo/output" "github.com/gohugoio/hugo/related" + "github.com/gohugoio/hugo/resources" "github.com/gohugoio/hugo/tpl/tplimpl" "github.com/spf13/afero" @@ -110,8 +110,7 @@ type pageState struct { *pageCommon resource.Staler - dependencyManager identity.Manager - resourcesPublishInit *sync.Once + dependencyManager identity.Manager } func (p *pageState) incrPageOutputTemplateVariation() { @@ -522,39 +521,41 @@ func (p *pageState) initPage() error { } func (p *pageState) renderResources() error { - var initErr error + for _, r := range p.Resources() { - p.resourcesPublishInit.Do(func() { - for _, r := range p.Resources() { - if _, ok := r.(page.Page); ok { + if _, ok := r.(page.Page); ok { + if p.s.h.buildCounter.Load() == 0 { // Pages gets rendered with the owning page but we count them here. p.s.PathSpec.ProcessingStats.Incr(&p.s.PathSpec.ProcessingStats.Pages) - continue - } - - if _, isWrapper := r.(resource.ResourceWrapper); isWrapper { - // Skip resources that are wrapped. - // These gets published on its own. - continue - } - - src, ok := r.(resource.Source) - if !ok { - initErr = fmt.Errorf("resource %T does not support resource.Source", r) - return - } - - if err := src.Publish(); err != nil { - if !herrors.IsNotExist(err) { - p.s.Log.Errorf("Failed to publish Resource for page %q: %s", p.pathOrTitle(), err) - } - } else { - p.s.PathSpec.ProcessingStats.Incr(&p.s.PathSpec.ProcessingStats.Files) } + continue } - }) - return initErr + if resources.IsPublished(r) { + continue + } + + if _, isWrapper := r.(resource.ResourceWrapper); isWrapper { + // Skip resources that are wrapped. + // These gets published on its own. + continue + } + + src, ok := r.(resource.Source) + if !ok { + return fmt.Errorf("resource %T does not support resource.Source", r) + } + + if err := src.Publish(); err != nil { + if !herrors.IsNotExist(err) { + p.s.Log.Errorf("Failed to publish Resource for page %q: %s", p.pathOrTitle(), err) + } + } else { + p.s.PathSpec.ProcessingStats.Incr(&p.s.PathSpec.ProcessingStats.Files) + } + } + + return nil } func (p *pageState) AlternativeOutputFormats() page.OutputFormats { diff --git a/hugolib/page__new.go b/hugolib/page__new.go index 10336e255..9d05abea6 100644 --- a/hugolib/page__new.go +++ b/hugolib/page__new.go @@ -16,7 +16,6 @@ package hugolib import ( "fmt" "strings" - "sync" "sync/atomic" "github.com/gohugoio/hugo/hugofs/files" @@ -190,7 +189,6 @@ func (h *HugoSites) doNewPage(m *pageMeta) (*pageState, *paths.Path, error) { pid: pid, pageOutput: nopPageOutput, pageOutputTemplateVariationsState: &atomic.Uint32{}, - resourcesPublishInit: &sync.Once{}, Staler: m, dependencyManager: m.s.Conf.NewIdentityManager(m.Path()), pageCommon: &pageCommon{ diff --git a/hugolib/rebuild_test.go b/hugolib/rebuild_test.go index 0b22b9aa7..d4a15fb5b 100644 --- a/hugolib/rebuild_test.go +++ b/hugolib/rebuild_test.go @@ -1946,3 +1946,23 @@ tags: ["tag1"] // But that is a harder problem to tackle. b.AssertFileContent("public/tags/index.html", "All. Tag1|Tag2|") } + +func TestRebuildEditNonReferencedResourceIssue13748(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +baseURL = "https://example.com" +disableLiveReload = true +-- content/mybundle/index.md -- +-- content/mybundle/resource.txt -- +This is a resource file. +-- layouts/all.html -- +All. +` + b := TestRunning(t, files) + + b.AssertFileContent("public/mybundle/resource.txt", "This is a resource file.") + b.EditFileReplaceAll("content/mybundle/resource.txt", "This is a resource file.", "This is an edited resource file.").Build() + b.AssertFileContent("public/mybundle/resource.txt", "This is an edited resource file.") +} diff --git a/resources/resource.go b/resources/resource.go index 6ef9bdae0..f6e5b9d73 100644 --- a/resources/resource.go +++ b/resources/resource.go @@ -24,6 +24,7 @@ import ( "sync/atomic" "github.com/gohugoio/hugo/identity" + "github.com/gohugoio/hugo/lazy" "github.com/gohugoio/hugo/resources/internal" "github.com/gohugoio/hugo/common/hashing" @@ -54,6 +55,7 @@ var ( _ identity.DependencyManagerProvider = (*genericResource)(nil) _ identity.Identity = (*genericResource)(nil) _ fileInfo = (*genericResource)(nil) + _ isPublishedProvider = (*genericResource)(nil) ) type ResourceSourceDescriptor struct { @@ -242,6 +244,7 @@ type baseResourceInternal interface { fileInfo mediaTypeAssigner targetPather + isPublishedProvider ReadSeekCloser() (hugio.ReadSeekCloser, error) @@ -355,7 +358,7 @@ func GetTestInfoForResource(r resource.Resource) GenericResourceTestInfo { // genericResource represents a generic linkable resource. type genericResource struct { - publishInit *sync.Once + publishInit *lazy.OnceMore key string keyInit *sync.Once @@ -536,6 +539,10 @@ func (l *genericResource) Publish() error { return err } +func (l *genericResource) isPublished() bool { + return l.publishInit.Done() +} + func (l *genericResource) RelPermalink() string { return l.spec.PathSpec.GetBasePath(false) + paths.PathEscape(l.paths.TargetLink()) } @@ -629,7 +636,7 @@ func (rc *genericResource) cloneWithUpdates(u *transformationUpdate) (baseResour } func (l genericResource) clone() *genericResource { - l.publishInit = &sync.Once{} + l.publishInit = &lazy.OnceMore{} l.keyInit = &sync.Once{} return &l } @@ -643,6 +650,10 @@ type targetPather interface { TargetPath() string } +type isPublishedProvider interface { + isPublished() bool +} + type resourceHash struct { value uint64 size int64 @@ -702,6 +713,11 @@ func InternalResourceSourcePathBestEffort(r resource.Resource) string { return InternalResourceTargetPath(r) } +// isPublished returns true if the resource is published. +func IsPublished(r resource.Resource) bool { + return r.(isPublishedProvider).isPublished() +} + type targetPathProvider interface { // targetPath is the relative path to this resource. // In most cases this will be the same as the RelPermalink(), diff --git a/resources/resource_spec.go b/resources/resource_spec.go index 56ad9a27d..806a5ff8d 100644 --- a/resources/resource_spec.go +++ b/resources/resource_spec.go @@ -20,6 +20,7 @@ import ( "github.com/gohugoio/hugo/config" "github.com/gohugoio/hugo/config/allconfig" + "github.com/gohugoio/hugo/lazy" "github.com/gohugoio/hugo/output" "github.com/gohugoio/hugo/resources/internal" "github.com/gohugoio/hugo/resources/jsconfig" @@ -189,7 +190,7 @@ func (r *Spec) NewResource(rd ResourceSourceDescriptor) (resource.Resource, erro gr := &genericResource{ Staler: &AtomicStaler{}, h: &resourceHash{}, - publishInit: &sync.Once{}, + publishInit: &lazy.OnceMore{}, keyInit: &sync.Once{}, includeHashInKey: isImage, paths: rp, diff --git a/resources/transform.go b/resources/transform.go index abb55f3cc..572143d49 100644 --- a/resources/transform.go +++ b/resources/transform.go @@ -61,6 +61,7 @@ var ( _ identity.DependencyManagerProvider = (*resourceAdapter)(nil) _ identity.IdentityGroupProvider = (*resourceAdapter)(nil) _ resource.NameNormalizedProvider = (*resourceAdapter)(nil) + _ isPublishedProvider = (*resourceAdapter)(nil) ) // These are transformations that need special support in Hugo that may not @@ -325,6 +326,11 @@ func (r *resourceAdapter) Publish() error { return r.target.Publish() } +func (r *resourceAdapter) isPublished() bool { + r.init(false, false) + return r.target.isPublished() +} + func (r *resourceAdapter) ReadSeekCloser() (hugio.ReadSeekCloser, error) { r.init(false, false) return r.target.ReadSeekCloser() From 6bd328c58486f7388888c1a53854607922a24c16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Wed, 28 May 2025 11:57:36 +0200 Subject: [PATCH 094/129] resources: Remove unused interface --- hugolib/hugo_sites_build.go | 1 + hugolib/page.go | 6 ------ resources/resource/resourcetypes.go | 5 ----- 3 files changed, 1 insertion(+), 11 deletions(-) diff --git a/hugolib/hugo_sites_build.go b/hugolib/hugo_sites_build.go index b1fe279f4..ce8ddd143 100644 --- a/hugolib/hugo_sites_build.go +++ b/hugolib/hugo_sites_build.go @@ -905,6 +905,7 @@ func (h *HugoSites) processPartialFileEvents(ctx context.Context, l logg.LevelLo handleChange := func(pathInfo *paths.Path, delete, isDir bool) { switch pathInfo.Component() { case files.ComponentFolderContent: + logger.Println("Source changed", pathInfo.Path()) isContentDataFile := pathInfo.IsContentData() if !isContentDataFile { if ids := h.pageTrees.collectAndMarkStaleIdentities(pathInfo); len(ids) > 0 { diff --git a/hugolib/page.go b/hugolib/page.go index bdfc66e87..bb3835c1e 100644 --- a/hugolib/page.go +++ b/hugolib/page.go @@ -535,12 +535,6 @@ func (p *pageState) renderResources() error { continue } - if _, isWrapper := r.(resource.ResourceWrapper); isWrapper { - // Skip resources that are wrapped. - // These gets published on its own. - continue - } - src, ok := r.(resource.Source) if !ok { return fmt.Errorf("resource %T does not support resource.Source", r) diff --git a/resources/resource/resourcetypes.go b/resources/resource/resourcetypes.go index 585dfd150..51255c612 100644 --- a/resources/resource/resourcetypes.go +++ b/resources/resource/resourcetypes.go @@ -81,11 +81,6 @@ type ResourceWithoutMeta interface { ResourceDataProvider } -type ResourceWrapper interface { - UnwrappedResource() Resource - WrapResource(Resource) ResourceWrapper -} - type ResourceTypeProvider interface { // ResourceType is the resource type. For most file types, this is the main // part of the MIME type, e.g. "image", "application", "text" etc. From da370d30ded102efdc506c48bf7c52eef2b7ea30 Mon Sep 17 00:00:00 2001 From: Ruslan Semagin Date: Mon, 26 May 2025 17:39:48 +0300 Subject: [PATCH 095/129] parser/pageparser: Add coverage for all IsX methods of Item Added tests for all boolean methods on Item, increasing overall code coverage. --- parser/pageparser/item.go | 13 +- parser/pageparser/item_test.go | 214 +++++++++++++++++++++++++++++++++ 2 files changed, 221 insertions(+), 6 deletions(-) diff --git a/parser/pageparser/item.go b/parser/pageparser/item.go index 47ec6d64d..7d63be0ad 100644 --- a/parser/pageparser/item.go +++ b/parser/pageparser/item.go @@ -104,7 +104,7 @@ func (i Item) ValTyped(source []byte) any { } func (i Item) IsText() bool { - return i.Type == tText || i.Type == tIndentation + return i.Type == tText || i.IsIndentation() } func (i Item) IsIndentation() bool { @@ -152,7 +152,7 @@ func (i Item) IsFrontMatter() bool { } func (i Item) IsDone() bool { - return i.Type == tError || i.Type == tEOF + return i.IsError() || i.IsEOF() } func (i Item) IsEOF() bool { @@ -166,18 +166,19 @@ func (i Item) IsError() bool { func (i Item) ToString(source []byte) string { val := i.Val(source) switch { - case i.Type == tEOF: + case i.IsEOF(): return "EOF" - case i.Type == tError: + case i.IsError(): return string(val) - case i.Type == tIndentation: + case i.IsIndentation(): return fmt.Sprintf("%s:[%s]", i.Type, util.VisualizeSpaces(val)) case i.Type > tKeywordMarker: return fmt.Sprintf("<%s>", val) case len(val) > 50: return fmt.Sprintf("%v:%.20q...", i.Type, val) + default: + return fmt.Sprintf("%v:[%s]", i.Type, val) } - return fmt.Sprintf("%v:[%s]", i.Type, val) } type ItemType int diff --git a/parser/pageparser/item_test.go b/parser/pageparser/item_test.go index 36b95e93a..10dbfe895 100644 --- a/parser/pageparser/item_test.go +++ b/parser/pageparser/item_test.go @@ -47,3 +47,217 @@ func TestItemValTyped(t *testing.T) { source = []byte("xtrue") c.Assert(Item{low: 0, high: len(source)}.ValTyped(source), qt.Equals, "xtrue") } + +func TestItemBoolMethods(t *testing.T) { + c := qt.New(t) + + source := []byte(" shortcode ") + tests := []struct { + name string + item Item + source []byte + want bool + call func(Item, []byte) bool + }{ + { + name: "IsText true", + item: Item{Type: tText}, + call: func(i Item, _ []byte) bool { return i.IsText() }, + want: true, + }, + { + name: "IsIndentation false", + item: Item{Type: tText}, + call: func(i Item, _ []byte) bool { return i.IsIndentation() }, + want: false, + }, + { + name: "IsShortcodeName", + item: Item{Type: tScName}, + call: func(i Item, _ []byte) bool { return i.IsShortcodeName() }, + want: true, + }, + { + name: "IsNonWhitespace true", + item: Item{ + Type: tText, + low: 2, + high: 11, + }, + source: source, + call: func(i Item, src []byte) bool { return i.IsNonWhitespace(src) }, + want: true, + }, + { + name: "IsShortcodeParam false", + item: Item{Type: tScParamVal}, + call: func(i Item, _ []byte) bool { return i.IsShortcodeParam() }, + want: false, + }, + { + name: "IsInlineShortcodeName", + item: Item{Type: tScNameInline}, + call: func(i Item, _ []byte) bool { return i.IsInlineShortcodeName() }, + want: true, + }, + { + name: "IsLeftShortcodeDelim tLeftDelimScWithMarkup", + item: Item{Type: tLeftDelimScWithMarkup}, + call: func(i Item, _ []byte) bool { return i.IsLeftShortcodeDelim() }, + want: true, + }, + { + name: "IsLeftShortcodeDelim tLeftDelimScNoMarkup", + item: Item{Type: tLeftDelimScNoMarkup}, + call: func(i Item, _ []byte) bool { return i.IsLeftShortcodeDelim() }, + want: true, + }, + { + name: "IsRightShortcodeDelim tRightDelimScWithMarkup", + item: Item{Type: tRightDelimScWithMarkup}, + call: func(i Item, _ []byte) bool { return i.IsRightShortcodeDelim() }, + want: true, + }, + { + name: "IsRightShortcodeDelim tRightDelimScNoMarkup", + item: Item{Type: tRightDelimScNoMarkup}, + call: func(i Item, _ []byte) bool { return i.IsRightShortcodeDelim() }, + want: true, + }, + { + name: "IsShortcodeClose", + item: Item{Type: tScClose}, + call: func(i Item, _ []byte) bool { return i.IsShortcodeClose() }, + want: true, + }, + { + name: "IsShortcodeParamVal", + item: Item{Type: tScParamVal}, + call: func(i Item, _ []byte) bool { return i.IsShortcodeParamVal() }, + want: true, + }, + { + name: "IsShortcodeMarkupDelimiter tLeftDelimScWithMarkup", + item: Item{Type: tLeftDelimScWithMarkup}, + call: func(i Item, _ []byte) bool { return i.IsShortcodeMarkupDelimiter() }, + want: true, + }, + { + name: "IsShortcodeMarkupDelimiter tRightDelimScWithMarkup", + item: Item{Type: tRightDelimScWithMarkup}, + call: func(i Item, _ []byte) bool { return i.IsShortcodeMarkupDelimiter() }, + want: true, + }, + { + name: "IsFrontMatter TypeFrontMatterYAML", + item: Item{Type: TypeFrontMatterYAML}, + call: func(i Item, _ []byte) bool { return i.IsFrontMatter() }, + want: true, + }, + { + name: "IsFrontMatter TypeFrontMatterTOML", + item: Item{Type: TypeFrontMatterTOML}, + call: func(i Item, _ []byte) bool { return i.IsFrontMatter() }, + want: true, + }, + { + name: "IsFrontMatter TypeFrontMatterJSON", + item: Item{Type: TypeFrontMatterJSON}, + call: func(i Item, _ []byte) bool { return i.IsFrontMatter() }, + want: true, + }, + { + name: "IsFrontMatter TypeFrontMatterORG", + item: Item{Type: TypeFrontMatterORG}, + call: func(i Item, _ []byte) bool { return i.IsFrontMatter() }, + want: true, + }, + { + name: "IsDone tError", + item: Item{Type: tError}, + call: func(i Item, _ []byte) bool { return i.IsDone() }, + want: true, + }, + { + name: "IsDone tEOF", + item: Item{Type: tEOF}, + call: func(i Item, _ []byte) bool { return i.IsDone() }, + want: true, + }, + { + name: "IsEOF", + item: Item{Type: tEOF}, + call: func(i Item, _ []byte) bool { return i.IsEOF() }, + want: true, + }, + { + name: "IsError", + item: Item{Type: tError}, + call: func(i Item, _ []byte) bool { return i.IsError() }, + want: true, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := tt.call(tt.item, tt.source) + c.Assert(got, qt.Equals, tt.want) + }) + } +} + +func TestItem_ToString(t *testing.T) { + c := qt.New(t) + + source := []byte("src") + long := make([]byte, 100) + for i := range long { + long[i] = byte(i) + } + + tests := []struct { + name string + item Item + source []byte + want string + call func(Item, []byte) string + }{ + { + name: "EOF", + item: Item{Type: tEOF}, + call: func(i Item, _ []byte) string { return i.ToString(source) }, + want: "EOF", + }, + { + name: "Error", + item: Item{Type: tError}, + call: func(i Item, _ []byte) string { return i.ToString(source) }, + want: "", + }, + { + name: "Indentation", + item: Item{Type: tIndentation}, + call: func(i Item, _ []byte) string { return i.ToString(source) }, + want: "tIndentation:[]", + }, + { + name: "Long", + item: Item{Type: tKeywordMarker + 1, low: 0, high: 100}, + call: func(i Item, _ []byte) string { return i.ToString(long) }, + want: "<" + string(long) + ">", + }, + { + name: "Empty", + item: Item{Type: tKeywordMarker + 1}, + call: func(i Item, _ []byte) string { return i.ToString([]byte("")) }, + want: "<>", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := tt.call(tt.item, tt.source) + c.Assert(got, qt.Equals, tt.want) + }) + } +} From bff5d1912129d11cb088a62302507d5b07cf7f1d Mon Sep 17 00:00:00 2001 From: Ruslan Semagin Date: Tue, 27 May 2025 15:17:21 +0300 Subject: [PATCH 096/129] common/collections: Increase test coverage --- common/collections/append_test.go | 65 ++++++++++++++++++++++++++ common/collections/slice_test.go | 34 ++++++++++++++ common/collections/stack_test.go | 77 +++++++++++++++++++++++++++++++ 3 files changed, 176 insertions(+) create mode 100644 common/collections/stack_test.go diff --git a/common/collections/append_test.go b/common/collections/append_test.go index f791b731a..62d9015ce 100644 --- a/common/collections/append_test.go +++ b/common/collections/append_test.go @@ -15,6 +15,7 @@ package collections import ( "html/template" + "reflect" "testing" qt "github.com/frankban/quicktest" @@ -77,6 +78,7 @@ func TestAppend(t *testing.T) { {[]string{"a", "b"}, []any{nil}, []any{"a", "b", nil}}, {[]string{"a", "b"}, []any{nil, "d", nil}, []any{"a", "b", nil, "d", nil}}, {[]any{"a", nil, "c"}, []any{"d", nil, "f"}, []any{"a", nil, "c", "d", nil, "f"}}, + {[]string{"a", "b"}, []any{}, []string{"a", "b"}}, } { result, err := Append(test.start, test.addend...) @@ -146,3 +148,66 @@ func TestAppendShouldMakeACopyOfTheInputSlice(t *testing.T) { c.Assert(result, qt.DeepEquals, []string{"a", "b", "c"}) c.Assert(slice, qt.DeepEquals, []string{"d", "b"}) } + +func TestIndirect(t *testing.T) { + t.Parallel() + c := qt.New(t) + + type testStruct struct { + Field string + } + + var ( + nilPtr *testStruct + nilIface interface{} = nil + nonNilIface interface{} = &testStruct{Field: "hello"} + ) + + tests := []struct { + name string + input any + wantKind reflect.Kind + wantNil bool + }{ + { + name: "nil pointer", + input: nilPtr, + wantKind: reflect.Ptr, + wantNil: true, + }, + { + name: "nil interface", + input: nilIface, + wantKind: reflect.Invalid, + wantNil: false, + }, + { + name: "non-nil pointer to struct", + input: &testStruct{Field: "abc"}, + wantKind: reflect.Struct, + wantNil: false, + }, + { + name: "non-nil interface holding pointer", + input: nonNilIface, + wantKind: reflect.Struct, + wantNil: false, + }, + { + name: "plain value", + input: testStruct{Field: "xyz"}, + wantKind: reflect.Struct, + wantNil: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + v := reflect.ValueOf(tt.input) + got, isNil := indirect(v) + + c.Assert(got.Kind(), qt.Equals, tt.wantKind) + c.Assert(isNil, qt.Equals, tt.wantNil) + }) + } +} diff --git a/common/collections/slice_test.go b/common/collections/slice_test.go index 20961aac0..4008a5e6c 100644 --- a/common/collections/slice_test.go +++ b/common/collections/slice_test.go @@ -136,3 +136,37 @@ func TestSortedStringSlice(t *testing.T) { c.Assert(s.Count("z"), qt.Equals, 0) c.Assert(s.Count("a"), qt.Equals, 1) } + +func TestStringSliceToInterfaceSlice(t *testing.T) { + t.Parallel() + c := qt.New(t) + + tests := []struct { + name string + in []string + want []any + }{ + { + name: "empty slice", + in: []string{}, + want: []any{}, + }, + { + name: "single element", + in: []string{"hello"}, + want: []any{"hello"}, + }, + { + name: "multiple elements", + in: []string{"a", "b", "c"}, + want: []any{"a", "b", "c"}, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := StringSliceToInterfaceSlice(tt.in) + c.Assert(got, qt.DeepEquals, tt.want) + }) + } +} diff --git a/common/collections/stack_test.go b/common/collections/stack_test.go new file mode 100644 index 000000000..965d4dbc8 --- /dev/null +++ b/common/collections/stack_test.go @@ -0,0 +1,77 @@ +package collections + +import ( + "testing" + + qt "github.com/frankban/quicktest" +) + +func TestNewStack(t *testing.T) { + t.Parallel() + c := qt.New(t) + + s := NewStack[int]() + + c.Assert(s, qt.IsNotNil) +} + +func TestStackBasic(t *testing.T) { + t.Parallel() + c := qt.New(t) + + s := NewStack[int]() + + c.Assert(s.Len(), qt.Equals, 0) + + s.Push(1) + s.Push(2) + s.Push(3) + + c.Assert(s.Len(), qt.Equals, 3) + + top, ok := s.Peek() + c.Assert(ok, qt.Equals, true) + c.Assert(top, qt.Equals, 3) + + popped, ok := s.Pop() + c.Assert(ok, qt.Equals, true) + c.Assert(popped, qt.Equals, 3) + + c.Assert(s.Len(), qt.Equals, 2) + + _, _ = s.Pop() + _, _ = s.Pop() + _, ok = s.Pop() + + c.Assert(ok, qt.Equals, false) +} + +func TestStackDrain(t *testing.T) { + t.Parallel() + c := qt.New(t) + + s := NewStack[string]() + s.Push("a") + s.Push("b") + + got := s.Drain() + + c.Assert(got, qt.DeepEquals, []string{"a", "b"}) + c.Assert(s.Len(), qt.Equals, 0) +} + +func TestStackDrainMatching(t *testing.T) { + t.Parallel() + c := qt.New(t) + + s := NewStack[int]() + s.Push(1) + s.Push(2) + s.Push(3) + s.Push(4) + + got := s.DrainMatching(func(v int) bool { return v%2 == 0 }) + + c.Assert(got, qt.DeepEquals, []int{4, 2}) + c.Assert(s.Drain(), qt.DeepEquals, []int{1, 3}) +} From 843ffeb48d788039d8779e07cbab3bee524f663a Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Wed, 28 May 2025 21:57:48 -0700 Subject: [PATCH 097/129] resources/page: Respect disablePathToLower for permalink tokens Fixes #13755 --- resources/page/permalinks.go | 2 +- resources/page/permalinks_integration_test.go | 27 +++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/resources/page/permalinks.go b/resources/page/permalinks.go index 953f4a2e8..f8cbcd62c 100644 --- a/resources/page/permalinks.go +++ b/resources/page/permalinks.go @@ -311,7 +311,7 @@ func (l PermalinkExpander) pageToPermalinkSections(p Page, _ string) (string, er // pageToPermalinkContentBaseName returns the URL-safe form of the content base name. func (l PermalinkExpander) pageToPermalinkContentBaseName(p Page, _ string) (string, error) { - return l.urlize(p.PathInfo().BaseNameNoIdentifier()), nil + return l.urlize(p.PathInfo().Unnormalized().BaseNameNoIdentifier()), nil } // pageToPermalinkSlugOrContentBaseName returns the URL-safe form of the slug, content base name. diff --git a/resources/page/permalinks_integration_test.go b/resources/page/permalinks_integration_test.go index 6ef450edd..c865e2704 100644 --- a/resources/page/permalinks_integration_test.go +++ b/resources/page/permalinks_integration_test.go @@ -14,6 +14,7 @@ package page_test import ( + "strings" "testing" "github.com/bep/logg" @@ -343,3 +344,29 @@ slug: "c2slug" b.AssertFileContent("public/myc/c1/index.html", "C1|/myc/c1/|term|") b.AssertFileContent("public/myc/c2slug/index.html", "C2|/myc/c2slug/|term|") } + +func TestIssue13755(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +disableKinds = ['home','rss','section','sitemap','taxonomy','term'] +disablePathToLower = false +[permalinks.page] +s1 = "/:contentbasename" +-- content/s1/aBc.md -- +--- +title: aBc +--- +-- layouts/all.html -- +{{ .Title }} +` + + b := hugolib.Test(t, files) + b.AssertFileExists("public/abc/index.html", true) + + files = strings.ReplaceAll(files, "disablePathToLower = false", "disablePathToLower = true") + + b = hugolib.Test(t, files) + b.AssertFileExists("public/aBc/index.html", true) +} From 202fe0d45ce5a091a87b04fb3eac535f923e3ca1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 29 May 2025 08:49:55 +0000 Subject: [PATCH 098/129] build(deps): bump github.com/alecthomas/chroma/v2 from 2.17.2 to 2.18.0 Bumps [github.com/alecthomas/chroma/v2](https://github.com/alecthomas/chroma) from 2.17.2 to 2.18.0. - [Release notes](https://github.com/alecthomas/chroma/releases) - [Changelog](https://github.com/alecthomas/chroma/blob/master/.goreleaser.yml) - [Commits](https://github.com/alecthomas/chroma/compare/v2.17.2...v2.18.0) --- updated-dependencies: - dependency-name: github.com/alecthomas/chroma/v2 dependency-version: 2.18.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 8 ++------ 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index e0ce06568..277070ca8 100644 --- a/go.mod +++ b/go.mod @@ -2,7 +2,7 @@ module github.com/gohugoio/hugo require ( github.com/BurntSushi/locker v0.0.0-20171006230638-a6e239ea1c69 - github.com/alecthomas/chroma/v2 v2.17.2 + github.com/alecthomas/chroma/v2 v2.18.0 github.com/armon/go-radix v1.0.1-0.20221118154546-54df44f2176c github.com/aws/aws-sdk-go-v2 v1.36.1 github.com/aws/aws-sdk-go-v2/service/cloudfront v1.44.10 diff --git a/go.sum b/go.sum index 05978a56e..dde56a89b 100644 --- a/go.sum +++ b/go.sum @@ -73,8 +73,8 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/alecthomas/assert/v2 v2.11.0 h1:2Q9r3ki8+JYXvGsDyBXwH3LcJ+WK5D0gc5E8vS6K3D0= github.com/alecthomas/assert/v2 v2.11.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k= -github.com/alecthomas/chroma/v2 v2.17.2 h1:Rm81SCZ2mPoH+Q8ZCc/9YvzPUN/E7HgPiPJD8SLV6GI= -github.com/alecthomas/chroma/v2 v2.17.2/go.mod h1:RVX6AvYm4VfYe/zsk7mjHueLDZor3aWCNE14TFlepBk= +github.com/alecthomas/chroma/v2 v2.18.0 h1:6h53Q4hW83SuF+jcsp7CVhLsMozzvQvO8HBbKQW+gn4= +github.com/alecthomas/chroma/v2 v2.18.0/go.mod h1:RVX6AvYm4VfYe/zsk7mjHueLDZor3aWCNE14TFlepBk= github.com/alecthomas/repr v0.4.0 h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc= github.com/alecthomas/repr v0.4.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= github.com/armon/go-radix v1.0.1-0.20221118154546-54df44f2176c h1:651/eoCRnQ7YtSjAnSzRucrJz+3iGEFt+ysraELS81M= @@ -376,8 +376,6 @@ github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovk github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c h1:cqn374mizHuIWj+OSJCajGr/phAmuMug9qIX3l9CflE= @@ -400,8 +398,6 @@ github.com/olekukonko/errors v0.0.0-20250405072817-4e6d85265da6 h1:r3FaAI0NZK3hS github.com/olekukonko/errors v0.0.0-20250405072817-4e6d85265da6/go.mod h1:ppzxA5jBKcO1vIpCXQ9ZqgDh8iwODz6OXIGKU8r5m4Y= github.com/olekukonko/ll v0.0.8 h1:sbGZ1Fx4QxJXEqL/6IG8GEFnYojUSQ45dJVwN2FH2fc= github.com/olekukonko/ll v0.0.8/go.mod h1:En+sEW0JNETl26+K8eZ6/W4UQ7CYSrrgg/EdIYT2H8g= -github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= -github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/olekukonko/tablewriter v1.0.7 h1:HCC2e3MM+2g72M81ZcJU11uciw6z/p82aEnm4/ySDGw= github.com/olekukonko/tablewriter v1.0.7/go.mod h1:H428M+HzoUXC6JU2Abj9IT9ooRmdq9CxuDmKMtrOCMs= github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2DcNVpwGmV9E1BkGknEliJkfwQj0= From 302e6a726ba2a6ea711bdea5e4ac7055fa705f31 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 29 May 2025 20:15:22 +0000 Subject: [PATCH 099/129] build(deps): bump github.com/spf13/cast from 1.7.1 to 1.8.0 Bumps [github.com/spf13/cast](https://github.com/spf13/cast) from 1.7.1 to 1.8.0. - [Release notes](https://github.com/spf13/cast/releases) - [Commits](https://github.com/spf13/cast/compare/v1.7.1...v1.8.0) --- updated-dependencies: - dependency-name: github.com/spf13/cast dependency-version: 1.8.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 277070ca8..919c4fd15 100644 --- a/go.mod +++ b/go.mod @@ -62,7 +62,7 @@ require ( github.com/rogpeppe/go-internal v1.14.1 github.com/sanity-io/litter v1.5.8 github.com/spf13/afero v1.14.0 - github.com/spf13/cast v1.7.1 + github.com/spf13/cast v1.8.0 github.com/spf13/cobra v1.9.1 github.com/spf13/fsync v0.10.1 github.com/spf13/pflag v1.0.6 diff --git a/go.sum b/go.sum index dde56a89b..bc58c95c3 100644 --- a/go.sum +++ b/go.sum @@ -434,8 +434,8 @@ github.com/shogo82148/go-shuffle v0.0.0-20180218125048-27e6095f230d/go.mod h1:2h github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= github.com/spf13/afero v1.14.0 h1:9tH6MapGnn/j0eb0yIXiLjERO8RB6xIVZRDCX7PtqWA= github.com/spf13/afero v1.14.0/go.mod h1:acJQ8t0ohCGuMN3O+Pv0V0hgMxNYDlvdk+VTfyZmbYo= -github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y= -github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= +github.com/spf13/cast v1.8.0 h1:gEN9K4b8Xws4EX0+a0reLmhq8moKn7ntRlQYgjPeCDk= +github.com/spf13/cast v1.8.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= github.com/spf13/fsync v0.10.1 h1:JRnB7G72b+gIBaBcpn5ibJSd7ww1iEahXSX2B8G6dSE= From 0df9f3510f805a7c351157f55113d0a6f069a653 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 30 May 2025 08:45:47 +0000 Subject: [PATCH 100/129] build(deps): bump golang.org/x/text from 0.24.0 to 0.25.0 Bumps [golang.org/x/text](https://github.com/golang/text) from 0.24.0 to 0.25.0. - [Release notes](https://github.com/golang/text/releases) - [Commits](https://github.com/golang/text/compare/v0.24.0...v0.25.0) --- updated-dependencies: - dependency-name: golang.org/x/text dependency-version: 0.25.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 919c4fd15..b7ec7bfe5 100644 --- a/go.mod +++ b/go.mod @@ -77,8 +77,8 @@ require ( golang.org/x/image v0.26.0 golang.org/x/mod v0.24.0 golang.org/x/net v0.39.0 - golang.org/x/sync v0.13.0 - golang.org/x/text v0.24.0 + golang.org/x/sync v0.14.0 + golang.org/x/text v0.25.0 golang.org/x/tools v0.32.0 google.golang.org/api v0.221.0 gopkg.in/yaml.v2 v2.4.0 diff --git a/go.sum b/go.sum index bc58c95c3..38682bf43 100644 --- a/go.sum +++ b/go.sum @@ -628,8 +628,8 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610= -golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ= +golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -697,8 +697,8 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0= -golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU= +golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4= +golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= From 75259636c824897996dc857f44efc5e7880ae55b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 30 May 2025 10:51:52 +0000 Subject: [PATCH 101/129] build(deps): bump golang.org/x/image from 0.26.0 to 0.27.0 Bumps [golang.org/x/image](https://github.com/golang/image) from 0.26.0 to 0.27.0. - [Commits](https://github.com/golang/image/compare/v0.26.0...v0.27.0) --- updated-dependencies: - dependency-name: golang.org/x/image dependency-version: 0.27.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index b7ec7bfe5..4c0623354 100644 --- a/go.mod +++ b/go.mod @@ -74,7 +74,7 @@ require ( go.uber.org/automaxprocs v1.5.3 gocloud.dev v0.40.0 golang.org/x/exp v0.0.0-20221031165847-c99f073a8326 - golang.org/x/image v0.26.0 + golang.org/x/image v0.27.0 golang.org/x/mod v0.24.0 golang.org/x/net v0.39.0 golang.org/x/sync v0.14.0 diff --git a/go.sum b/go.sum index 38682bf43..3fb6d320f 100644 --- a/go.sum +++ b/go.sum @@ -531,8 +531,8 @@ golang.org/x/exp v0.0.0-20221031165847-c99f073a8326/go.mod h1:CxIveKay+FTh1D0yPZ golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20210220032944-ac19c3e999fb/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.26.0 h1:4XjIFEZWQmCZi6Wv8BoxsDhRU3RVnLX04dToTDAEPlY= -golang.org/x/image v0.26.0/go.mod h1:lcxbMFAovzpnJxzXS3nyL83K27tmqtKzIJpctK8YO5c= +golang.org/x/image v0.27.0 h1:C8gA4oWU/tKkdCfYT6T2u4faJu3MeNS5O8UPWlPF61w= +golang.org/x/image v0.27.0/go.mod h1:xbdrClrAUway1MUTEZDq9mz/UpRwYAkFFNUslZtcB+g= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= From 6334948515fc8c79a12d7d5306e6adf14cc9c28d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Fri, 30 May 2025 20:57:54 +0200 Subject: [PATCH 102/129] Handle KaTeX warnings (#13760) Co-authored-by: Joe Mooring Fixes #13735 --- hugolib/site.go | 1 + internal/warpc/js/common.js | 9 +++++ internal/warpc/js/greet.bundle.js | 4 +-- internal/warpc/js/renderkatex.bundle.js | 8 ++--- internal/warpc/js/renderkatex.js | 10 ++++++ internal/warpc/warpc.go | 13 +++++++ internal/warpc/wasm/greet.wasm | Bin 2403 -> 2540 bytes internal/warpc/wasm/renderkatex.wasm | Bin 537159 -> 537651 bytes tpl/transform/transform.go | 37 +++++++++++++++++--- tpl/transform/transform_integration_test.go | 9 +++-- 10 files changed, 76 insertions(+), 15 deletions(-) diff --git a/hugolib/site.go b/hugolib/site.go index 0e658086b..acd3b5410 100644 --- a/hugolib/site.go +++ b/hugolib/site.go @@ -204,6 +204,7 @@ func NewHugoSites(cfg deps.DepsCfg) (*HugoSites, error) { // Katex is relatively slow. PoolSize: 8, Infof: logger.InfoCommand("wasm").Logf, + Warnf: logger.WarnCommand("wasm").Logf, }, ), } diff --git a/internal/warpc/js/common.js b/internal/warpc/js/common.js index 49aba9b4b..61c535fb7 100644 --- a/internal/warpc/js/common.js +++ b/internal/warpc/js/common.js @@ -4,6 +4,15 @@ export function readInput(handle) { let currentLine = []; const buffer = new Uint8Array(buffSize); + // These are not implemented by QuickJS. + console.warn = (value) => { + console.log(value); + }; + + console.error = (value) => { + throw new Error(value); + }; + // Read all the available bytes while (true) { // Stdin file descriptor diff --git a/internal/warpc/js/greet.bundle.js b/internal/warpc/js/greet.bundle.js index c5aa4a13a..6828d582a 100644 --- a/internal/warpc/js/greet.bundle.js +++ b/internal/warpc/js/greet.bundle.js @@ -1,2 +1,2 @@ -(()=>{function l(r){let e=[],a=new Uint8Array(1024);for(;;){let n=0;try{n=Javy.IO.readSync(0,a)}catch(o){if(o.message.includes("os error 29"))break;throw new Error("Error reading from stdin")}if(n<0)throw new Error("Error reading from stdin");if(n===0)break;if(e=[...e,...a.subarray(0,n)],!e.includes(10))continue;let t=0;for(let o=0;t{function w(r){let e=[],c=new Uint8Array(1024);for(console.warn=n=>{console.log(n)},console.error=n=>{throw new Error(n)};;){let o=0;try{o=Javy.IO.readSync(0,c)}catch(a){if(a.message.includes("os error 29"))break;throw new Error("Error reading from stdin")}if(o<0)throw new Error("Error reading from stdin");if(o===0)break;if(e=[...e,...c.subarray(0,o)],!e.includes(10))continue;let t=0;for(let a=0;t{function Wt(r){let t=[],a=new Uint8Array(1024);for(;;){let s=0;try{s=Javy.IO.readSync(0,a)}catch(h){if(h.message.includes("os error 29"))break;throw new Error("Error reading from stdin")}if(s<0)throw new Error("Error reading from stdin");if(s===0)break;if(t=[...t,...a.subarray(0,s)],!t.includes(10))continue;let l=0;for(let h=0;l{function Wt(r){let t=[],a=new Uint8Array(1024);for(console.warn=n=>{console.log(n)},console.error=n=>{throw new Error(n)};;){let s=0;try{s=Javy.IO.readSync(0,a)}catch(h){if(h.message.includes("os error 29"))break;throw new Error("Error reading from stdin")}if(s<0)throw new Error("Error reading from stdin");if(s===0)break;if(t=[...t,...a.subarray(0,s)],!t.includes(10))continue;let l=0;for(let h=0;l15?f="\u2026"+h.slice(n-15,n):f=h.slice(0,n);var v;s+15":">","<":"<",'"':""","'":"'"},Ba=/[&><"']/g;function Da(r){return String(r).replace(Ba,e=>qa[e])}var zr=function r(e){return e.type==="ordgroup"||e.type==="color"?e.body.length===1?r(e.body[0]):e:e.type==="font"?r(e.body):e},Ca=function(e){var t=zr(e);return t.type==="mathord"||t.type==="textord"||t.type==="atom"},_a=function(e){if(!e)throw new Error("Expected non-null, but got "+String(e));return e},Na=function(e){var t=/^[\x00-\x20]*([^\\/#?]*?)(:|�*58|�*3a|&colon)/i.exec(e);return t?t[2]!==":"||!/^[a-zA-Z][a-zA-Z0-9+\-.]*$/.test(t[1])?null:t[1].toLowerCase():"_relative"},O={contains:Ma,deflt:za,escape:Da,hyphenate:Ta,getBaseElem:zr,isCharacterBox:Ca,protocolFromUrl:Na},Oe={displayMode:{type:"boolean",description:"Render math in display mode, which puts the math in display style (so \\int and \\sum are large, for example), and centers the math on the page on its own line.",cli:"-d, --display-mode"},output:{type:{enum:["htmlAndMathml","html","mathml"]},description:"Determines the markup language of the output.",cli:"-F, --format "},leqno:{type:"boolean",description:"Render display math in leqno style (left-justified tags)."},fleqn:{type:"boolean",description:"Render display math flush left."},throwOnError:{type:"boolean",default:!0,cli:"-t, --no-throw-on-error",cliDescription:"Render errors (in the color given by --error-color) instead of throwing a ParseError exception when encountering an error."},errorColor:{type:"string",default:"#cc0000",cli:"-c, --error-color ",cliDescription:"A color string given in the format 'rgb' or 'rrggbb' (no #). This option determines the color of errors rendered by the -t option.",cliProcessor:r=>"#"+r},macros:{type:"object",cli:"-m, --macro ",cliDescription:"Define custom macro of the form '\\foo:expansion' (use multiple -m arguments for multiple macros).",cliDefault:[],cliProcessor:(r,e)=>(e.push(r),e)},minRuleThickness:{type:"number",description:"Specifies a minimum thickness, in ems, for fraction lines, `\\sqrt` top lines, `{array}` vertical lines, `\\hline`, `\\hdashline`, `\\underline`, `\\overline`, and the borders of `\\fbox`, `\\boxed`, and `\\fcolorbox`.",processor:r=>Math.max(0,r),cli:"--min-rule-thickness ",cliProcessor:parseFloat},colorIsTextColor:{type:"boolean",description:"Makes \\color behave like LaTeX's 2-argument \\textcolor, instead of LaTeX's one-argument \\color mode change.",cli:"-b, --color-is-text-color"},strict:{type:[{enum:["warn","ignore","error"]},"boolean","function"],description:"Turn on strict / LaTeX faithfulness mode, which throws an error if the input uses features that are not supported by LaTeX.",cli:"-S, --strict",cliDefault:!1},trust:{type:["boolean","function"],description:"Trust the input, enabling all HTML features such as \\url.",cli:"-T, --trust"},maxSize:{type:"number",default:1/0,description:"If non-zero, all user-specified sizes, e.g. in \\rule{500em}{500em}, will be capped to maxSize ems. Otherwise, elements and spaces can be arbitrarily large",processor:r=>Math.max(0,r),cli:"-s, --max-size ",cliProcessor:parseInt},maxExpand:{type:"number",default:1e3,description:"Limit the number of macro expansions to the specified number, to prevent e.g. infinite macro loops. If set to Infinity, the macro expander will try to fully expand as in LaTeX.",processor:r=>Math.max(0,r),cli:"-e, --max-expand ",cliProcessor:r=>r==="Infinity"?1/0:parseInt(r)},globalGroup:{type:"boolean",cli:!1}};function Oa(r){if(r.default)return r.default;var e=r.type,t=Array.isArray(e)?e[0]:e;if(typeof t!="string")return t.enum[0];switch(t){case"boolean":return!1;case"string":return"";case"number":return 0;case"object":return{}}}var de=class{constructor(e){this.displayMode=void 0,this.output=void 0,this.leqno=void 0,this.fleqn=void 0,this.throwOnError=void 0,this.errorColor=void 0,this.macros=void 0,this.minRuleThickness=void 0,this.colorIsTextColor=void 0,this.strict=void 0,this.trust=void 0,this.maxSize=void 0,this.maxExpand=void 0,this.globalGroup=void 0,e=e||{};for(var t in Oe)if(Oe.hasOwnProperty(t)){var a=Oe[t];this[t]=e[t]!==void 0?a.processor?a.processor(e[t]):e[t]:Oa(a)}}reportNonstrict(e,t,a){var n=this.strict;if(typeof n=="function"&&(n=n(e,t,a)),!(!n||n==="ignore")){if(n===!0||n==="error")throw new z("LaTeX-incompatible input and strict mode is set to 'error': "+(t+" ["+e+"]"),a);n==="warn"?typeof console<"u"&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+(t+" ["+e+"]")):typeof console<"u"&&console.warn("LaTeX-incompatible input and strict mode is set to "+("unrecognized '"+n+"': "+t+" ["+e+"]"))}}useStrictBehavior(e,t,a){var n=this.strict;if(typeof n=="function")try{n=n(e,t,a)}catch{n="error"}return!n||n==="ignore"?!1:n===!0||n==="error"?!0:n==="warn"?(typeof console<"u"&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+(t+" ["+e+"]")),!1):(typeof console<"u"&&console.warn("LaTeX-incompatible input and strict mode is set to "+("unrecognized '"+n+"': "+t+" ["+e+"]")),!1)}isTrusted(e){if(e.url&&!e.protocol){var t=O.protocolFromUrl(e.url);if(t==null)return!1;e.protocol=t}var a=typeof this.trust=="function"?this.trust(e):this.trust;return!!a}},k0=class{constructor(e,t,a){this.id=void 0,this.size=void 0,this.cramped=void 0,this.id=e,this.size=t,this.cramped=a}sup(){return M0[Ia[this.id]]}sub(){return M0[Ea[this.id]]}fracNum(){return M0[Ra[this.id]]}fracDen(){return M0[$a[this.id]]}cramp(){return M0[La[this.id]]}text(){return M0[Fa[this.id]]}isTight(){return this.size>=2}},At=0,Ee=1,ae=2,N0=3,pe=4,v0=5,ne=6,o0=7,M0=[new k0(At,0,!1),new k0(Ee,0,!0),new k0(ae,1,!1),new k0(N0,1,!0),new k0(pe,2,!1),new k0(v0,2,!0),new k0(ne,3,!1),new k0(o0,3,!0)],Ia=[pe,v0,pe,v0,ne,o0,ne,o0],Ea=[v0,v0,v0,v0,o0,o0,o0,o0],Ra=[ae,N0,pe,v0,ne,o0,ne,o0],$a=[N0,N0,v0,v0,o0,o0,o0,o0],La=[Ee,Ee,N0,N0,v0,v0,o0,o0],Fa=[At,Ee,ae,N0,ae,N0,ae,N0],E={DISPLAY:M0[At],TEXT:M0[ae],SCRIPT:M0[pe],SCRIPTSCRIPT:M0[ne]},pt=[{name:"latin",blocks:[[256,591],[768,879]]},{name:"cyrillic",blocks:[[1024,1279]]},{name:"armenian",blocks:[[1328,1423]]},{name:"brahmic",blocks:[[2304,4255]]},{name:"georgian",blocks:[[4256,4351]]},{name:"cjk",blocks:[[12288,12543],[19968,40879],[65280,65376]]},{name:"hangul",blocks:[[44032,55215]]}];function Ha(r){for(var e=0;e=n[0]&&r<=n[1])return t.name}return null}var Ie=[];pt.forEach(r=>r.blocks.forEach(e=>Ie.push(...e)));function Ar(r){for(var e=0;e=Ie[e]&&r<=Ie[e+1])return!0;return!1}var re=80,Pa=function(e,t){return"M95,"+(622+e+t)+` c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14 c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54 @@ -254,9 +254,9 @@ c0,7.3,5.7,11,17,11c0,0,11,0,11,0c9.3,0,14.3,-0.3,15,-1c5.3,-5.3,10.3,-11,15,-17 c242.7,-294.7,395.3,-681.7,458,-1161c21.3,-164.7,33.3,-350.7,36,-558 l0,-`+(t+144)+`c-2,-159.3,-10,-310.7,-24,-454c-53.3,-528,-210,-949.7, -470,-1265c-4.7,-6,-9.7,-11.7,-15,-17c-0.7,-0.7,-6.7,-1,-18,-1z`;default:throw new Error("Unknown stretchy delimiter.")}},Y0=class{constructor(e){this.children=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.children=e,this.classes=[],this.height=0,this.depth=0,this.maxFontSize=0,this.style={}}hasClass(e){return O.contains(this.classes,e)}toNode(){for(var e=document.createDocumentFragment(),t=0;tt.toText();return this.children.map(e).join("")}},z0={"AMS-Regular":{32:[0,0,0,0,.25],65:[0,.68889,0,0,.72222],66:[0,.68889,0,0,.66667],67:[0,.68889,0,0,.72222],68:[0,.68889,0,0,.72222],69:[0,.68889,0,0,.66667],70:[0,.68889,0,0,.61111],71:[0,.68889,0,0,.77778],72:[0,.68889,0,0,.77778],73:[0,.68889,0,0,.38889],74:[.16667,.68889,0,0,.5],75:[0,.68889,0,0,.77778],76:[0,.68889,0,0,.66667],77:[0,.68889,0,0,.94445],78:[0,.68889,0,0,.72222],79:[.16667,.68889,0,0,.77778],80:[0,.68889,0,0,.61111],81:[.16667,.68889,0,0,.77778],82:[0,.68889,0,0,.72222],83:[0,.68889,0,0,.55556],84:[0,.68889,0,0,.66667],85:[0,.68889,0,0,.72222],86:[0,.68889,0,0,.72222],87:[0,.68889,0,0,1],88:[0,.68889,0,0,.72222],89:[0,.68889,0,0,.72222],90:[0,.68889,0,0,.66667],107:[0,.68889,0,0,.55556],160:[0,0,0,0,.25],165:[0,.675,.025,0,.75],174:[.15559,.69224,0,0,.94666],240:[0,.68889,0,0,.55556],295:[0,.68889,0,0,.54028],710:[0,.825,0,0,2.33334],732:[0,.9,0,0,2.33334],770:[0,.825,0,0,2.33334],771:[0,.9,0,0,2.33334],989:[.08167,.58167,0,0,.77778],1008:[0,.43056,.04028,0,.66667],8245:[0,.54986,0,0,.275],8463:[0,.68889,0,0,.54028],8487:[0,.68889,0,0,.72222],8498:[0,.68889,0,0,.55556],8502:[0,.68889,0,0,.66667],8503:[0,.68889,0,0,.44445],8504:[0,.68889,0,0,.66667],8513:[0,.68889,0,0,.63889],8592:[-.03598,.46402,0,0,.5],8594:[-.03598,.46402,0,0,.5],8602:[-.13313,.36687,0,0,1],8603:[-.13313,.36687,0,0,1],8606:[.01354,.52239,0,0,1],8608:[.01354,.52239,0,0,1],8610:[.01354,.52239,0,0,1.11111],8611:[.01354,.52239,0,0,1.11111],8619:[0,.54986,0,0,1],8620:[0,.54986,0,0,1],8621:[-.13313,.37788,0,0,1.38889],8622:[-.13313,.36687,0,0,1],8624:[0,.69224,0,0,.5],8625:[0,.69224,0,0,.5],8630:[0,.43056,0,0,1],8631:[0,.43056,0,0,1],8634:[.08198,.58198,0,0,.77778],8635:[.08198,.58198,0,0,.77778],8638:[.19444,.69224,0,0,.41667],8639:[.19444,.69224,0,0,.41667],8642:[.19444,.69224,0,0,.41667],8643:[.19444,.69224,0,0,.41667],8644:[.1808,.675,0,0,1],8646:[.1808,.675,0,0,1],8647:[.1808,.675,0,0,1],8648:[.19444,.69224,0,0,.83334],8649:[.1808,.675,0,0,1],8650:[.19444,.69224,0,0,.83334],8651:[.01354,.52239,0,0,1],8652:[.01354,.52239,0,0,1],8653:[-.13313,.36687,0,0,1],8654:[-.13313,.36687,0,0,1],8655:[-.13313,.36687,0,0,1],8666:[.13667,.63667,0,0,1],8667:[.13667,.63667,0,0,1],8669:[-.13313,.37788,0,0,1],8672:[-.064,.437,0,0,1.334],8674:[-.064,.437,0,0,1.334],8705:[0,.825,0,0,.5],8708:[0,.68889,0,0,.55556],8709:[.08167,.58167,0,0,.77778],8717:[0,.43056,0,0,.42917],8722:[-.03598,.46402,0,0,.5],8724:[.08198,.69224,0,0,.77778],8726:[.08167,.58167,0,0,.77778],8733:[0,.69224,0,0,.77778],8736:[0,.69224,0,0,.72222],8737:[0,.69224,0,0,.72222],8738:[.03517,.52239,0,0,.72222],8739:[.08167,.58167,0,0,.22222],8740:[.25142,.74111,0,0,.27778],8741:[.08167,.58167,0,0,.38889],8742:[.25142,.74111,0,0,.5],8756:[0,.69224,0,0,.66667],8757:[0,.69224,0,0,.66667],8764:[-.13313,.36687,0,0,.77778],8765:[-.13313,.37788,0,0,.77778],8769:[-.13313,.36687,0,0,.77778],8770:[-.03625,.46375,0,0,.77778],8774:[.30274,.79383,0,0,.77778],8776:[-.01688,.48312,0,0,.77778],8778:[.08167,.58167,0,0,.77778],8782:[.06062,.54986,0,0,.77778],8783:[.06062,.54986,0,0,.77778],8785:[.08198,.58198,0,0,.77778],8786:[.08198,.58198,0,0,.77778],8787:[.08198,.58198,0,0,.77778],8790:[0,.69224,0,0,.77778],8791:[.22958,.72958,0,0,.77778],8796:[.08198,.91667,0,0,.77778],8806:[.25583,.75583,0,0,.77778],8807:[.25583,.75583,0,0,.77778],8808:[.25142,.75726,0,0,.77778],8809:[.25142,.75726,0,0,.77778],8812:[.25583,.75583,0,0,.5],8814:[.20576,.70576,0,0,.77778],8815:[.20576,.70576,0,0,.77778],8816:[.30274,.79383,0,0,.77778],8817:[.30274,.79383,0,0,.77778],8818:[.22958,.72958,0,0,.77778],8819:[.22958,.72958,0,0,.77778],8822:[.1808,.675,0,0,.77778],8823:[.1808,.675,0,0,.77778],8828:[.13667,.63667,0,0,.77778],8829:[.13667,.63667,0,0,.77778],8830:[.22958,.72958,0,0,.77778],8831:[.22958,.72958,0,0,.77778],8832:[.20576,.70576,0,0,.77778],8833:[.20576,.70576,0,0,.77778],8840:[.30274,.79383,0,0,.77778],8841:[.30274,.79383,0,0,.77778],8842:[.13597,.63597,0,0,.77778],8843:[.13597,.63597,0,0,.77778],8847:[.03517,.54986,0,0,.77778],8848:[.03517,.54986,0,0,.77778],8858:[.08198,.58198,0,0,.77778],8859:[.08198,.58198,0,0,.77778],8861:[.08198,.58198,0,0,.77778],8862:[0,.675,0,0,.77778],8863:[0,.675,0,0,.77778],8864:[0,.675,0,0,.77778],8865:[0,.675,0,0,.77778],8872:[0,.69224,0,0,.61111],8873:[0,.69224,0,0,.72222],8874:[0,.69224,0,0,.88889],8876:[0,.68889,0,0,.61111],8877:[0,.68889,0,0,.61111],8878:[0,.68889,0,0,.72222],8879:[0,.68889,0,0,.72222],8882:[.03517,.54986,0,0,.77778],8883:[.03517,.54986,0,0,.77778],8884:[.13667,.63667,0,0,.77778],8885:[.13667,.63667,0,0,.77778],8888:[0,.54986,0,0,1.11111],8890:[.19444,.43056,0,0,.55556],8891:[.19444,.69224,0,0,.61111],8892:[.19444,.69224,0,0,.61111],8901:[0,.54986,0,0,.27778],8903:[.08167,.58167,0,0,.77778],8905:[.08167,.58167,0,0,.77778],8906:[.08167,.58167,0,0,.77778],8907:[0,.69224,0,0,.77778],8908:[0,.69224,0,0,.77778],8909:[-.03598,.46402,0,0,.77778],8910:[0,.54986,0,0,.76042],8911:[0,.54986,0,0,.76042],8912:[.03517,.54986,0,0,.77778],8913:[.03517,.54986,0,0,.77778],8914:[0,.54986,0,0,.66667],8915:[0,.54986,0,0,.66667],8916:[0,.69224,0,0,.66667],8918:[.0391,.5391,0,0,.77778],8919:[.0391,.5391,0,0,.77778],8920:[.03517,.54986,0,0,1.33334],8921:[.03517,.54986,0,0,1.33334],8922:[.38569,.88569,0,0,.77778],8923:[.38569,.88569,0,0,.77778],8926:[.13667,.63667,0,0,.77778],8927:[.13667,.63667,0,0,.77778],8928:[.30274,.79383,0,0,.77778],8929:[.30274,.79383,0,0,.77778],8934:[.23222,.74111,0,0,.77778],8935:[.23222,.74111,0,0,.77778],8936:[.23222,.74111,0,0,.77778],8937:[.23222,.74111,0,0,.77778],8938:[.20576,.70576,0,0,.77778],8939:[.20576,.70576,0,0,.77778],8940:[.30274,.79383,0,0,.77778],8941:[.30274,.79383,0,0,.77778],8994:[.19444,.69224,0,0,.77778],8995:[.19444,.69224,0,0,.77778],9416:[.15559,.69224,0,0,.90222],9484:[0,.69224,0,0,.5],9488:[0,.69224,0,0,.5],9492:[0,.37788,0,0,.5],9496:[0,.37788,0,0,.5],9585:[.19444,.68889,0,0,.88889],9586:[.19444,.74111,0,0,.88889],9632:[0,.675,0,0,.77778],9633:[0,.675,0,0,.77778],9650:[0,.54986,0,0,.72222],9651:[0,.54986,0,0,.72222],9654:[.03517,.54986,0,0,.77778],9660:[0,.54986,0,0,.72222],9661:[0,.54986,0,0,.72222],9664:[.03517,.54986,0,0,.77778],9674:[.11111,.69224,0,0,.66667],9733:[.19444,.69224,0,0,.94445],10003:[0,.69224,0,0,.83334],10016:[0,.69224,0,0,.83334],10731:[.11111,.69224,0,0,.66667],10846:[.19444,.75583,0,0,.61111],10877:[.13667,.63667,0,0,.77778],10878:[.13667,.63667,0,0,.77778],10885:[.25583,.75583,0,0,.77778],10886:[.25583,.75583,0,0,.77778],10887:[.13597,.63597,0,0,.77778],10888:[.13597,.63597,0,0,.77778],10889:[.26167,.75726,0,0,.77778],10890:[.26167,.75726,0,0,.77778],10891:[.48256,.98256,0,0,.77778],10892:[.48256,.98256,0,0,.77778],10901:[.13667,.63667,0,0,.77778],10902:[.13667,.63667,0,0,.77778],10933:[.25142,.75726,0,0,.77778],10934:[.25142,.75726,0,0,.77778],10935:[.26167,.75726,0,0,.77778],10936:[.26167,.75726,0,0,.77778],10937:[.26167,.75726,0,0,.77778],10938:[.26167,.75726,0,0,.77778],10949:[.25583,.75583,0,0,.77778],10950:[.25583,.75583,0,0,.77778],10955:[.28481,.79383,0,0,.77778],10956:[.28481,.79383,0,0,.77778],57350:[.08167,.58167,0,0,.22222],57351:[.08167,.58167,0,0,.38889],57352:[.08167,.58167,0,0,.77778],57353:[0,.43056,.04028,0,.66667],57356:[.25142,.75726,0,0,.77778],57357:[.25142,.75726,0,0,.77778],57358:[.41951,.91951,0,0,.77778],57359:[.30274,.79383,0,0,.77778],57360:[.30274,.79383,0,0,.77778],57361:[.41951,.91951,0,0,.77778],57366:[.25142,.75726,0,0,.77778],57367:[.25142,.75726,0,0,.77778],57368:[.25142,.75726,0,0,.77778],57369:[.25142,.75726,0,0,.77778],57370:[.13597,.63597,0,0,.77778],57371:[.13597,.63597,0,0,.77778]},"Caligraphic-Regular":{32:[0,0,0,0,.25],65:[0,.68333,0,.19445,.79847],66:[0,.68333,.03041,.13889,.65681],67:[0,.68333,.05834,.13889,.52653],68:[0,.68333,.02778,.08334,.77139],69:[0,.68333,.08944,.11111,.52778],70:[0,.68333,.09931,.11111,.71875],71:[.09722,.68333,.0593,.11111,.59487],72:[0,.68333,.00965,.11111,.84452],73:[0,.68333,.07382,0,.54452],74:[.09722,.68333,.18472,.16667,.67778],75:[0,.68333,.01445,.05556,.76195],76:[0,.68333,0,.13889,.68972],77:[0,.68333,0,.13889,1.2009],78:[0,.68333,.14736,.08334,.82049],79:[0,.68333,.02778,.11111,.79611],80:[0,.68333,.08222,.08334,.69556],81:[.09722,.68333,0,.11111,.81667],82:[0,.68333,0,.08334,.8475],83:[0,.68333,.075,.13889,.60556],84:[0,.68333,.25417,0,.54464],85:[0,.68333,.09931,.08334,.62583],86:[0,.68333,.08222,0,.61278],87:[0,.68333,.08222,.08334,.98778],88:[0,.68333,.14643,.13889,.7133],89:[.09722,.68333,.08222,.08334,.66834],90:[0,.68333,.07944,.13889,.72473],160:[0,0,0,0,.25]},"Fraktur-Regular":{32:[0,0,0,0,.25],33:[0,.69141,0,0,.29574],34:[0,.69141,0,0,.21471],38:[0,.69141,0,0,.73786],39:[0,.69141,0,0,.21201],40:[.24982,.74947,0,0,.38865],41:[.24982,.74947,0,0,.38865],42:[0,.62119,0,0,.27764],43:[.08319,.58283,0,0,.75623],44:[0,.10803,0,0,.27764],45:[.08319,.58283,0,0,.75623],46:[0,.10803,0,0,.27764],47:[.24982,.74947,0,0,.50181],48:[0,.47534,0,0,.50181],49:[0,.47534,0,0,.50181],50:[0,.47534,0,0,.50181],51:[.18906,.47534,0,0,.50181],52:[.18906,.47534,0,0,.50181],53:[.18906,.47534,0,0,.50181],54:[0,.69141,0,0,.50181],55:[.18906,.47534,0,0,.50181],56:[0,.69141,0,0,.50181],57:[.18906,.47534,0,0,.50181],58:[0,.47534,0,0,.21606],59:[.12604,.47534,0,0,.21606],61:[-.13099,.36866,0,0,.75623],63:[0,.69141,0,0,.36245],65:[0,.69141,0,0,.7176],66:[0,.69141,0,0,.88397],67:[0,.69141,0,0,.61254],68:[0,.69141,0,0,.83158],69:[0,.69141,0,0,.66278],70:[.12604,.69141,0,0,.61119],71:[0,.69141,0,0,.78539],72:[.06302,.69141,0,0,.7203],73:[0,.69141,0,0,.55448],74:[.12604,.69141,0,0,.55231],75:[0,.69141,0,0,.66845],76:[0,.69141,0,0,.66602],77:[0,.69141,0,0,1.04953],78:[0,.69141,0,0,.83212],79:[0,.69141,0,0,.82699],80:[.18906,.69141,0,0,.82753],81:[.03781,.69141,0,0,.82699],82:[0,.69141,0,0,.82807],83:[0,.69141,0,0,.82861],84:[0,.69141,0,0,.66899],85:[0,.69141,0,0,.64576],86:[0,.69141,0,0,.83131],87:[0,.69141,0,0,1.04602],88:[0,.69141,0,0,.71922],89:[.18906,.69141,0,0,.83293],90:[.12604,.69141,0,0,.60201],91:[.24982,.74947,0,0,.27764],93:[.24982,.74947,0,0,.27764],94:[0,.69141,0,0,.49965],97:[0,.47534,0,0,.50046],98:[0,.69141,0,0,.51315],99:[0,.47534,0,0,.38946],100:[0,.62119,0,0,.49857],101:[0,.47534,0,0,.40053],102:[.18906,.69141,0,0,.32626],103:[.18906,.47534,0,0,.5037],104:[.18906,.69141,0,0,.52126],105:[0,.69141,0,0,.27899],106:[0,.69141,0,0,.28088],107:[0,.69141,0,0,.38946],108:[0,.69141,0,0,.27953],109:[0,.47534,0,0,.76676],110:[0,.47534,0,0,.52666],111:[0,.47534,0,0,.48885],112:[.18906,.52396,0,0,.50046],113:[.18906,.47534,0,0,.48912],114:[0,.47534,0,0,.38919],115:[0,.47534,0,0,.44266],116:[0,.62119,0,0,.33301],117:[0,.47534,0,0,.5172],118:[0,.52396,0,0,.5118],119:[0,.52396,0,0,.77351],120:[.18906,.47534,0,0,.38865],121:[.18906,.47534,0,0,.49884],122:[.18906,.47534,0,0,.39054],160:[0,0,0,0,.25],8216:[0,.69141,0,0,.21471],8217:[0,.69141,0,0,.21471],58112:[0,.62119,0,0,.49749],58113:[0,.62119,0,0,.4983],58114:[.18906,.69141,0,0,.33328],58115:[.18906,.69141,0,0,.32923],58116:[.18906,.47534,0,0,.50343],58117:[0,.69141,0,0,.33301],58118:[0,.62119,0,0,.33409],58119:[0,.47534,0,0,.50073]},"Main-Bold":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.35],34:[0,.69444,0,0,.60278],35:[.19444,.69444,0,0,.95833],36:[.05556,.75,0,0,.575],37:[.05556,.75,0,0,.95833],38:[0,.69444,0,0,.89444],39:[0,.69444,0,0,.31944],40:[.25,.75,0,0,.44722],41:[.25,.75,0,0,.44722],42:[0,.75,0,0,.575],43:[.13333,.63333,0,0,.89444],44:[.19444,.15556,0,0,.31944],45:[0,.44444,0,0,.38333],46:[0,.15556,0,0,.31944],47:[.25,.75,0,0,.575],48:[0,.64444,0,0,.575],49:[0,.64444,0,0,.575],50:[0,.64444,0,0,.575],51:[0,.64444,0,0,.575],52:[0,.64444,0,0,.575],53:[0,.64444,0,0,.575],54:[0,.64444,0,0,.575],55:[0,.64444,0,0,.575],56:[0,.64444,0,0,.575],57:[0,.64444,0,0,.575],58:[0,.44444,0,0,.31944],59:[.19444,.44444,0,0,.31944],60:[.08556,.58556,0,0,.89444],61:[-.10889,.39111,0,0,.89444],62:[.08556,.58556,0,0,.89444],63:[0,.69444,0,0,.54305],64:[0,.69444,0,0,.89444],65:[0,.68611,0,0,.86944],66:[0,.68611,0,0,.81805],67:[0,.68611,0,0,.83055],68:[0,.68611,0,0,.88194],69:[0,.68611,0,0,.75555],70:[0,.68611,0,0,.72361],71:[0,.68611,0,0,.90416],72:[0,.68611,0,0,.9],73:[0,.68611,0,0,.43611],74:[0,.68611,0,0,.59444],75:[0,.68611,0,0,.90138],76:[0,.68611,0,0,.69166],77:[0,.68611,0,0,1.09166],78:[0,.68611,0,0,.9],79:[0,.68611,0,0,.86388],80:[0,.68611,0,0,.78611],81:[.19444,.68611,0,0,.86388],82:[0,.68611,0,0,.8625],83:[0,.68611,0,0,.63889],84:[0,.68611,0,0,.8],85:[0,.68611,0,0,.88472],86:[0,.68611,.01597,0,.86944],87:[0,.68611,.01597,0,1.18888],88:[0,.68611,0,0,.86944],89:[0,.68611,.02875,0,.86944],90:[0,.68611,0,0,.70277],91:[.25,.75,0,0,.31944],92:[.25,.75,0,0,.575],93:[.25,.75,0,0,.31944],94:[0,.69444,0,0,.575],95:[.31,.13444,.03194,0,.575],97:[0,.44444,0,0,.55902],98:[0,.69444,0,0,.63889],99:[0,.44444,0,0,.51111],100:[0,.69444,0,0,.63889],101:[0,.44444,0,0,.52708],102:[0,.69444,.10903,0,.35139],103:[.19444,.44444,.01597,0,.575],104:[0,.69444,0,0,.63889],105:[0,.69444,0,0,.31944],106:[.19444,.69444,0,0,.35139],107:[0,.69444,0,0,.60694],108:[0,.69444,0,0,.31944],109:[0,.44444,0,0,.95833],110:[0,.44444,0,0,.63889],111:[0,.44444,0,0,.575],112:[.19444,.44444,0,0,.63889],113:[.19444,.44444,0,0,.60694],114:[0,.44444,0,0,.47361],115:[0,.44444,0,0,.45361],116:[0,.63492,0,0,.44722],117:[0,.44444,0,0,.63889],118:[0,.44444,.01597,0,.60694],119:[0,.44444,.01597,0,.83055],120:[0,.44444,0,0,.60694],121:[.19444,.44444,.01597,0,.60694],122:[0,.44444,0,0,.51111],123:[.25,.75,0,0,.575],124:[.25,.75,0,0,.31944],125:[.25,.75,0,0,.575],126:[.35,.34444,0,0,.575],160:[0,0,0,0,.25],163:[0,.69444,0,0,.86853],168:[0,.69444,0,0,.575],172:[0,.44444,0,0,.76666],176:[0,.69444,0,0,.86944],177:[.13333,.63333,0,0,.89444],184:[.17014,0,0,0,.51111],198:[0,.68611,0,0,1.04166],215:[.13333,.63333,0,0,.89444],216:[.04861,.73472,0,0,.89444],223:[0,.69444,0,0,.59722],230:[0,.44444,0,0,.83055],247:[.13333,.63333,0,0,.89444],248:[.09722,.54167,0,0,.575],305:[0,.44444,0,0,.31944],338:[0,.68611,0,0,1.16944],339:[0,.44444,0,0,.89444],567:[.19444,.44444,0,0,.35139],710:[0,.69444,0,0,.575],711:[0,.63194,0,0,.575],713:[0,.59611,0,0,.575],714:[0,.69444,0,0,.575],715:[0,.69444,0,0,.575],728:[0,.69444,0,0,.575],729:[0,.69444,0,0,.31944],730:[0,.69444,0,0,.86944],732:[0,.69444,0,0,.575],733:[0,.69444,0,0,.575],915:[0,.68611,0,0,.69166],916:[0,.68611,0,0,.95833],920:[0,.68611,0,0,.89444],923:[0,.68611,0,0,.80555],926:[0,.68611,0,0,.76666],928:[0,.68611,0,0,.9],931:[0,.68611,0,0,.83055],933:[0,.68611,0,0,.89444],934:[0,.68611,0,0,.83055],936:[0,.68611,0,0,.89444],937:[0,.68611,0,0,.83055],8211:[0,.44444,.03194,0,.575],8212:[0,.44444,.03194,0,1.14999],8216:[0,.69444,0,0,.31944],8217:[0,.69444,0,0,.31944],8220:[0,.69444,0,0,.60278],8221:[0,.69444,0,0,.60278],8224:[.19444,.69444,0,0,.51111],8225:[.19444,.69444,0,0,.51111],8242:[0,.55556,0,0,.34444],8407:[0,.72444,.15486,0,.575],8463:[0,.69444,0,0,.66759],8465:[0,.69444,0,0,.83055],8467:[0,.69444,0,0,.47361],8472:[.19444,.44444,0,0,.74027],8476:[0,.69444,0,0,.83055],8501:[0,.69444,0,0,.70277],8592:[-.10889,.39111,0,0,1.14999],8593:[.19444,.69444,0,0,.575],8594:[-.10889,.39111,0,0,1.14999],8595:[.19444,.69444,0,0,.575],8596:[-.10889,.39111,0,0,1.14999],8597:[.25,.75,0,0,.575],8598:[.19444,.69444,0,0,1.14999],8599:[.19444,.69444,0,0,1.14999],8600:[.19444,.69444,0,0,1.14999],8601:[.19444,.69444,0,0,1.14999],8636:[-.10889,.39111,0,0,1.14999],8637:[-.10889,.39111,0,0,1.14999],8640:[-.10889,.39111,0,0,1.14999],8641:[-.10889,.39111,0,0,1.14999],8656:[-.10889,.39111,0,0,1.14999],8657:[.19444,.69444,0,0,.70277],8658:[-.10889,.39111,0,0,1.14999],8659:[.19444,.69444,0,0,.70277],8660:[-.10889,.39111,0,0,1.14999],8661:[.25,.75,0,0,.70277],8704:[0,.69444,0,0,.63889],8706:[0,.69444,.06389,0,.62847],8707:[0,.69444,0,0,.63889],8709:[.05556,.75,0,0,.575],8711:[0,.68611,0,0,.95833],8712:[.08556,.58556,0,0,.76666],8715:[.08556,.58556,0,0,.76666],8722:[.13333,.63333,0,0,.89444],8723:[.13333,.63333,0,0,.89444],8725:[.25,.75,0,0,.575],8726:[.25,.75,0,0,.575],8727:[-.02778,.47222,0,0,.575],8728:[-.02639,.47361,0,0,.575],8729:[-.02639,.47361,0,0,.575],8730:[.18,.82,0,0,.95833],8733:[0,.44444,0,0,.89444],8734:[0,.44444,0,0,1.14999],8736:[0,.69224,0,0,.72222],8739:[.25,.75,0,0,.31944],8741:[.25,.75,0,0,.575],8743:[0,.55556,0,0,.76666],8744:[0,.55556,0,0,.76666],8745:[0,.55556,0,0,.76666],8746:[0,.55556,0,0,.76666],8747:[.19444,.69444,.12778,0,.56875],8764:[-.10889,.39111,0,0,.89444],8768:[.19444,.69444,0,0,.31944],8771:[.00222,.50222,0,0,.89444],8773:[.027,.638,0,0,.894],8776:[.02444,.52444,0,0,.89444],8781:[.00222,.50222,0,0,.89444],8801:[.00222,.50222,0,0,.89444],8804:[.19667,.69667,0,0,.89444],8805:[.19667,.69667,0,0,.89444],8810:[.08556,.58556,0,0,1.14999],8811:[.08556,.58556,0,0,1.14999],8826:[.08556,.58556,0,0,.89444],8827:[.08556,.58556,0,0,.89444],8834:[.08556,.58556,0,0,.89444],8835:[.08556,.58556,0,0,.89444],8838:[.19667,.69667,0,0,.89444],8839:[.19667,.69667,0,0,.89444],8846:[0,.55556,0,0,.76666],8849:[.19667,.69667,0,0,.89444],8850:[.19667,.69667,0,0,.89444],8851:[0,.55556,0,0,.76666],8852:[0,.55556,0,0,.76666],8853:[.13333,.63333,0,0,.89444],8854:[.13333,.63333,0,0,.89444],8855:[.13333,.63333,0,0,.89444],8856:[.13333,.63333,0,0,.89444],8857:[.13333,.63333,0,0,.89444],8866:[0,.69444,0,0,.70277],8867:[0,.69444,0,0,.70277],8868:[0,.69444,0,0,.89444],8869:[0,.69444,0,0,.89444],8900:[-.02639,.47361,0,0,.575],8901:[-.02639,.47361,0,0,.31944],8902:[-.02778,.47222,0,0,.575],8968:[.25,.75,0,0,.51111],8969:[.25,.75,0,0,.51111],8970:[.25,.75,0,0,.51111],8971:[.25,.75,0,0,.51111],8994:[-.13889,.36111,0,0,1.14999],8995:[-.13889,.36111,0,0,1.14999],9651:[.19444,.69444,0,0,1.02222],9657:[-.02778,.47222,0,0,.575],9661:[.19444,.69444,0,0,1.02222],9667:[-.02778,.47222,0,0,.575],9711:[.19444,.69444,0,0,1.14999],9824:[.12963,.69444,0,0,.89444],9825:[.12963,.69444,0,0,.89444],9826:[.12963,.69444,0,0,.89444],9827:[.12963,.69444,0,0,.89444],9837:[0,.75,0,0,.44722],9838:[.19444,.69444,0,0,.44722],9839:[.19444,.69444,0,0,.44722],10216:[.25,.75,0,0,.44722],10217:[.25,.75,0,0,.44722],10815:[0,.68611,0,0,.9],10927:[.19667,.69667,0,0,.89444],10928:[.19667,.69667,0,0,.89444],57376:[.19444,.69444,0,0,0]},"Main-BoldItalic":{32:[0,0,0,0,.25],33:[0,.69444,.11417,0,.38611],34:[0,.69444,.07939,0,.62055],35:[.19444,.69444,.06833,0,.94444],37:[.05556,.75,.12861,0,.94444],38:[0,.69444,.08528,0,.88555],39:[0,.69444,.12945,0,.35555],40:[.25,.75,.15806,0,.47333],41:[.25,.75,.03306,0,.47333],42:[0,.75,.14333,0,.59111],43:[.10333,.60333,.03306,0,.88555],44:[.19444,.14722,0,0,.35555],45:[0,.44444,.02611,0,.41444],46:[0,.14722,0,0,.35555],47:[.25,.75,.15806,0,.59111],48:[0,.64444,.13167,0,.59111],49:[0,.64444,.13167,0,.59111],50:[0,.64444,.13167,0,.59111],51:[0,.64444,.13167,0,.59111],52:[.19444,.64444,.13167,0,.59111],53:[0,.64444,.13167,0,.59111],54:[0,.64444,.13167,0,.59111],55:[.19444,.64444,.13167,0,.59111],56:[0,.64444,.13167,0,.59111],57:[0,.64444,.13167,0,.59111],58:[0,.44444,.06695,0,.35555],59:[.19444,.44444,.06695,0,.35555],61:[-.10889,.39111,.06833,0,.88555],63:[0,.69444,.11472,0,.59111],64:[0,.69444,.09208,0,.88555],65:[0,.68611,0,0,.86555],66:[0,.68611,.0992,0,.81666],67:[0,.68611,.14208,0,.82666],68:[0,.68611,.09062,0,.87555],69:[0,.68611,.11431,0,.75666],70:[0,.68611,.12903,0,.72722],71:[0,.68611,.07347,0,.89527],72:[0,.68611,.17208,0,.8961],73:[0,.68611,.15681,0,.47166],74:[0,.68611,.145,0,.61055],75:[0,.68611,.14208,0,.89499],76:[0,.68611,0,0,.69777],77:[0,.68611,.17208,0,1.07277],78:[0,.68611,.17208,0,.8961],79:[0,.68611,.09062,0,.85499],80:[0,.68611,.0992,0,.78721],81:[.19444,.68611,.09062,0,.85499],82:[0,.68611,.02559,0,.85944],83:[0,.68611,.11264,0,.64999],84:[0,.68611,.12903,0,.7961],85:[0,.68611,.17208,0,.88083],86:[0,.68611,.18625,0,.86555],87:[0,.68611,.18625,0,1.15999],88:[0,.68611,.15681,0,.86555],89:[0,.68611,.19803,0,.86555],90:[0,.68611,.14208,0,.70888],91:[.25,.75,.1875,0,.35611],93:[.25,.75,.09972,0,.35611],94:[0,.69444,.06709,0,.59111],95:[.31,.13444,.09811,0,.59111],97:[0,.44444,.09426,0,.59111],98:[0,.69444,.07861,0,.53222],99:[0,.44444,.05222,0,.53222],100:[0,.69444,.10861,0,.59111],101:[0,.44444,.085,0,.53222],102:[.19444,.69444,.21778,0,.4],103:[.19444,.44444,.105,0,.53222],104:[0,.69444,.09426,0,.59111],105:[0,.69326,.11387,0,.35555],106:[.19444,.69326,.1672,0,.35555],107:[0,.69444,.11111,0,.53222],108:[0,.69444,.10861,0,.29666],109:[0,.44444,.09426,0,.94444],110:[0,.44444,.09426,0,.64999],111:[0,.44444,.07861,0,.59111],112:[.19444,.44444,.07861,0,.59111],113:[.19444,.44444,.105,0,.53222],114:[0,.44444,.11111,0,.50167],115:[0,.44444,.08167,0,.48694],116:[0,.63492,.09639,0,.385],117:[0,.44444,.09426,0,.62055],118:[0,.44444,.11111,0,.53222],119:[0,.44444,.11111,0,.76777],120:[0,.44444,.12583,0,.56055],121:[.19444,.44444,.105,0,.56166],122:[0,.44444,.13889,0,.49055],126:[.35,.34444,.11472,0,.59111],160:[0,0,0,0,.25],168:[0,.69444,.11473,0,.59111],176:[0,.69444,0,0,.94888],184:[.17014,0,0,0,.53222],198:[0,.68611,.11431,0,1.02277],216:[.04861,.73472,.09062,0,.88555],223:[.19444,.69444,.09736,0,.665],230:[0,.44444,.085,0,.82666],248:[.09722,.54167,.09458,0,.59111],305:[0,.44444,.09426,0,.35555],338:[0,.68611,.11431,0,1.14054],339:[0,.44444,.085,0,.82666],567:[.19444,.44444,.04611,0,.385],710:[0,.69444,.06709,0,.59111],711:[0,.63194,.08271,0,.59111],713:[0,.59444,.10444,0,.59111],714:[0,.69444,.08528,0,.59111],715:[0,.69444,0,0,.59111],728:[0,.69444,.10333,0,.59111],729:[0,.69444,.12945,0,.35555],730:[0,.69444,0,0,.94888],732:[0,.69444,.11472,0,.59111],733:[0,.69444,.11472,0,.59111],915:[0,.68611,.12903,0,.69777],916:[0,.68611,0,0,.94444],920:[0,.68611,.09062,0,.88555],923:[0,.68611,0,0,.80666],926:[0,.68611,.15092,0,.76777],928:[0,.68611,.17208,0,.8961],931:[0,.68611,.11431,0,.82666],933:[0,.68611,.10778,0,.88555],934:[0,.68611,.05632,0,.82666],936:[0,.68611,.10778,0,.88555],937:[0,.68611,.0992,0,.82666],8211:[0,.44444,.09811,0,.59111],8212:[0,.44444,.09811,0,1.18221],8216:[0,.69444,.12945,0,.35555],8217:[0,.69444,.12945,0,.35555],8220:[0,.69444,.16772,0,.62055],8221:[0,.69444,.07939,0,.62055]},"Main-Italic":{32:[0,0,0,0,.25],33:[0,.69444,.12417,0,.30667],34:[0,.69444,.06961,0,.51444],35:[.19444,.69444,.06616,0,.81777],37:[.05556,.75,.13639,0,.81777],38:[0,.69444,.09694,0,.76666],39:[0,.69444,.12417,0,.30667],40:[.25,.75,.16194,0,.40889],41:[.25,.75,.03694,0,.40889],42:[0,.75,.14917,0,.51111],43:[.05667,.56167,.03694,0,.76666],44:[.19444,.10556,0,0,.30667],45:[0,.43056,.02826,0,.35778],46:[0,.10556,0,0,.30667],47:[.25,.75,.16194,0,.51111],48:[0,.64444,.13556,0,.51111],49:[0,.64444,.13556,0,.51111],50:[0,.64444,.13556,0,.51111],51:[0,.64444,.13556,0,.51111],52:[.19444,.64444,.13556,0,.51111],53:[0,.64444,.13556,0,.51111],54:[0,.64444,.13556,0,.51111],55:[.19444,.64444,.13556,0,.51111],56:[0,.64444,.13556,0,.51111],57:[0,.64444,.13556,0,.51111],58:[0,.43056,.0582,0,.30667],59:[.19444,.43056,.0582,0,.30667],61:[-.13313,.36687,.06616,0,.76666],63:[0,.69444,.1225,0,.51111],64:[0,.69444,.09597,0,.76666],65:[0,.68333,0,0,.74333],66:[0,.68333,.10257,0,.70389],67:[0,.68333,.14528,0,.71555],68:[0,.68333,.09403,0,.755],69:[0,.68333,.12028,0,.67833],70:[0,.68333,.13305,0,.65277],71:[0,.68333,.08722,0,.77361],72:[0,.68333,.16389,0,.74333],73:[0,.68333,.15806,0,.38555],74:[0,.68333,.14028,0,.525],75:[0,.68333,.14528,0,.76888],76:[0,.68333,0,0,.62722],77:[0,.68333,.16389,0,.89666],78:[0,.68333,.16389,0,.74333],79:[0,.68333,.09403,0,.76666],80:[0,.68333,.10257,0,.67833],81:[.19444,.68333,.09403,0,.76666],82:[0,.68333,.03868,0,.72944],83:[0,.68333,.11972,0,.56222],84:[0,.68333,.13305,0,.71555],85:[0,.68333,.16389,0,.74333],86:[0,.68333,.18361,0,.74333],87:[0,.68333,.18361,0,.99888],88:[0,.68333,.15806,0,.74333],89:[0,.68333,.19383,0,.74333],90:[0,.68333,.14528,0,.61333],91:[.25,.75,.1875,0,.30667],93:[.25,.75,.10528,0,.30667],94:[0,.69444,.06646,0,.51111],95:[.31,.12056,.09208,0,.51111],97:[0,.43056,.07671,0,.51111],98:[0,.69444,.06312,0,.46],99:[0,.43056,.05653,0,.46],100:[0,.69444,.10333,0,.51111],101:[0,.43056,.07514,0,.46],102:[.19444,.69444,.21194,0,.30667],103:[.19444,.43056,.08847,0,.46],104:[0,.69444,.07671,0,.51111],105:[0,.65536,.1019,0,.30667],106:[.19444,.65536,.14467,0,.30667],107:[0,.69444,.10764,0,.46],108:[0,.69444,.10333,0,.25555],109:[0,.43056,.07671,0,.81777],110:[0,.43056,.07671,0,.56222],111:[0,.43056,.06312,0,.51111],112:[.19444,.43056,.06312,0,.51111],113:[.19444,.43056,.08847,0,.46],114:[0,.43056,.10764,0,.42166],115:[0,.43056,.08208,0,.40889],116:[0,.61508,.09486,0,.33222],117:[0,.43056,.07671,0,.53666],118:[0,.43056,.10764,0,.46],119:[0,.43056,.10764,0,.66444],120:[0,.43056,.12042,0,.46389],121:[.19444,.43056,.08847,0,.48555],122:[0,.43056,.12292,0,.40889],126:[.35,.31786,.11585,0,.51111],160:[0,0,0,0,.25],168:[0,.66786,.10474,0,.51111],176:[0,.69444,0,0,.83129],184:[.17014,0,0,0,.46],198:[0,.68333,.12028,0,.88277],216:[.04861,.73194,.09403,0,.76666],223:[.19444,.69444,.10514,0,.53666],230:[0,.43056,.07514,0,.71555],248:[.09722,.52778,.09194,0,.51111],338:[0,.68333,.12028,0,.98499],339:[0,.43056,.07514,0,.71555],710:[0,.69444,.06646,0,.51111],711:[0,.62847,.08295,0,.51111],713:[0,.56167,.10333,0,.51111],714:[0,.69444,.09694,0,.51111],715:[0,.69444,0,0,.51111],728:[0,.69444,.10806,0,.51111],729:[0,.66786,.11752,0,.30667],730:[0,.69444,0,0,.83129],732:[0,.66786,.11585,0,.51111],733:[0,.69444,.1225,0,.51111],915:[0,.68333,.13305,0,.62722],916:[0,.68333,0,0,.81777],920:[0,.68333,.09403,0,.76666],923:[0,.68333,0,0,.69222],926:[0,.68333,.15294,0,.66444],928:[0,.68333,.16389,0,.74333],931:[0,.68333,.12028,0,.71555],933:[0,.68333,.11111,0,.76666],934:[0,.68333,.05986,0,.71555],936:[0,.68333,.11111,0,.76666],937:[0,.68333,.10257,0,.71555],8211:[0,.43056,.09208,0,.51111],8212:[0,.43056,.09208,0,1.02222],8216:[0,.69444,.12417,0,.30667],8217:[0,.69444,.12417,0,.30667],8220:[0,.69444,.1685,0,.51444],8221:[0,.69444,.06961,0,.51444],8463:[0,.68889,0,0,.54028]},"Main-Regular":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.27778],34:[0,.69444,0,0,.5],35:[.19444,.69444,0,0,.83334],36:[.05556,.75,0,0,.5],37:[.05556,.75,0,0,.83334],38:[0,.69444,0,0,.77778],39:[0,.69444,0,0,.27778],40:[.25,.75,0,0,.38889],41:[.25,.75,0,0,.38889],42:[0,.75,0,0,.5],43:[.08333,.58333,0,0,.77778],44:[.19444,.10556,0,0,.27778],45:[0,.43056,0,0,.33333],46:[0,.10556,0,0,.27778],47:[.25,.75,0,0,.5],48:[0,.64444,0,0,.5],49:[0,.64444,0,0,.5],50:[0,.64444,0,0,.5],51:[0,.64444,0,0,.5],52:[0,.64444,0,0,.5],53:[0,.64444,0,0,.5],54:[0,.64444,0,0,.5],55:[0,.64444,0,0,.5],56:[0,.64444,0,0,.5],57:[0,.64444,0,0,.5],58:[0,.43056,0,0,.27778],59:[.19444,.43056,0,0,.27778],60:[.0391,.5391,0,0,.77778],61:[-.13313,.36687,0,0,.77778],62:[.0391,.5391,0,0,.77778],63:[0,.69444,0,0,.47222],64:[0,.69444,0,0,.77778],65:[0,.68333,0,0,.75],66:[0,.68333,0,0,.70834],67:[0,.68333,0,0,.72222],68:[0,.68333,0,0,.76389],69:[0,.68333,0,0,.68056],70:[0,.68333,0,0,.65278],71:[0,.68333,0,0,.78472],72:[0,.68333,0,0,.75],73:[0,.68333,0,0,.36111],74:[0,.68333,0,0,.51389],75:[0,.68333,0,0,.77778],76:[0,.68333,0,0,.625],77:[0,.68333,0,0,.91667],78:[0,.68333,0,0,.75],79:[0,.68333,0,0,.77778],80:[0,.68333,0,0,.68056],81:[.19444,.68333,0,0,.77778],82:[0,.68333,0,0,.73611],83:[0,.68333,0,0,.55556],84:[0,.68333,0,0,.72222],85:[0,.68333,0,0,.75],86:[0,.68333,.01389,0,.75],87:[0,.68333,.01389,0,1.02778],88:[0,.68333,0,0,.75],89:[0,.68333,.025,0,.75],90:[0,.68333,0,0,.61111],91:[.25,.75,0,0,.27778],92:[.25,.75,0,0,.5],93:[.25,.75,0,0,.27778],94:[0,.69444,0,0,.5],95:[.31,.12056,.02778,0,.5],97:[0,.43056,0,0,.5],98:[0,.69444,0,0,.55556],99:[0,.43056,0,0,.44445],100:[0,.69444,0,0,.55556],101:[0,.43056,0,0,.44445],102:[0,.69444,.07778,0,.30556],103:[.19444,.43056,.01389,0,.5],104:[0,.69444,0,0,.55556],105:[0,.66786,0,0,.27778],106:[.19444,.66786,0,0,.30556],107:[0,.69444,0,0,.52778],108:[0,.69444,0,0,.27778],109:[0,.43056,0,0,.83334],110:[0,.43056,0,0,.55556],111:[0,.43056,0,0,.5],112:[.19444,.43056,0,0,.55556],113:[.19444,.43056,0,0,.52778],114:[0,.43056,0,0,.39167],115:[0,.43056,0,0,.39445],116:[0,.61508,0,0,.38889],117:[0,.43056,0,0,.55556],118:[0,.43056,.01389,0,.52778],119:[0,.43056,.01389,0,.72222],120:[0,.43056,0,0,.52778],121:[.19444,.43056,.01389,0,.52778],122:[0,.43056,0,0,.44445],123:[.25,.75,0,0,.5],124:[.25,.75,0,0,.27778],125:[.25,.75,0,0,.5],126:[.35,.31786,0,0,.5],160:[0,0,0,0,.25],163:[0,.69444,0,0,.76909],167:[.19444,.69444,0,0,.44445],168:[0,.66786,0,0,.5],172:[0,.43056,0,0,.66667],176:[0,.69444,0,0,.75],177:[.08333,.58333,0,0,.77778],182:[.19444,.69444,0,0,.61111],184:[.17014,0,0,0,.44445],198:[0,.68333,0,0,.90278],215:[.08333,.58333,0,0,.77778],216:[.04861,.73194,0,0,.77778],223:[0,.69444,0,0,.5],230:[0,.43056,0,0,.72222],247:[.08333,.58333,0,0,.77778],248:[.09722,.52778,0,0,.5],305:[0,.43056,0,0,.27778],338:[0,.68333,0,0,1.01389],339:[0,.43056,0,0,.77778],567:[.19444,.43056,0,0,.30556],710:[0,.69444,0,0,.5],711:[0,.62847,0,0,.5],713:[0,.56778,0,0,.5],714:[0,.69444,0,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,0,0,.5],729:[0,.66786,0,0,.27778],730:[0,.69444,0,0,.75],732:[0,.66786,0,0,.5],733:[0,.69444,0,0,.5],915:[0,.68333,0,0,.625],916:[0,.68333,0,0,.83334],920:[0,.68333,0,0,.77778],923:[0,.68333,0,0,.69445],926:[0,.68333,0,0,.66667],928:[0,.68333,0,0,.75],931:[0,.68333,0,0,.72222],933:[0,.68333,0,0,.77778],934:[0,.68333,0,0,.72222],936:[0,.68333,0,0,.77778],937:[0,.68333,0,0,.72222],8211:[0,.43056,.02778,0,.5],8212:[0,.43056,.02778,0,1],8216:[0,.69444,0,0,.27778],8217:[0,.69444,0,0,.27778],8220:[0,.69444,0,0,.5],8221:[0,.69444,0,0,.5],8224:[.19444,.69444,0,0,.44445],8225:[.19444,.69444,0,0,.44445],8230:[0,.123,0,0,1.172],8242:[0,.55556,0,0,.275],8407:[0,.71444,.15382,0,.5],8463:[0,.68889,0,0,.54028],8465:[0,.69444,0,0,.72222],8467:[0,.69444,0,.11111,.41667],8472:[.19444,.43056,0,.11111,.63646],8476:[0,.69444,0,0,.72222],8501:[0,.69444,0,0,.61111],8592:[-.13313,.36687,0,0,1],8593:[.19444,.69444,0,0,.5],8594:[-.13313,.36687,0,0,1],8595:[.19444,.69444,0,0,.5],8596:[-.13313,.36687,0,0,1],8597:[.25,.75,0,0,.5],8598:[.19444,.69444,0,0,1],8599:[.19444,.69444,0,0,1],8600:[.19444,.69444,0,0,1],8601:[.19444,.69444,0,0,1],8614:[.011,.511,0,0,1],8617:[.011,.511,0,0,1.126],8618:[.011,.511,0,0,1.126],8636:[-.13313,.36687,0,0,1],8637:[-.13313,.36687,0,0,1],8640:[-.13313,.36687,0,0,1],8641:[-.13313,.36687,0,0,1],8652:[.011,.671,0,0,1],8656:[-.13313,.36687,0,0,1],8657:[.19444,.69444,0,0,.61111],8658:[-.13313,.36687,0,0,1],8659:[.19444,.69444,0,0,.61111],8660:[-.13313,.36687,0,0,1],8661:[.25,.75,0,0,.61111],8704:[0,.69444,0,0,.55556],8706:[0,.69444,.05556,.08334,.5309],8707:[0,.69444,0,0,.55556],8709:[.05556,.75,0,0,.5],8711:[0,.68333,0,0,.83334],8712:[.0391,.5391,0,0,.66667],8715:[.0391,.5391,0,0,.66667],8722:[.08333,.58333,0,0,.77778],8723:[.08333,.58333,0,0,.77778],8725:[.25,.75,0,0,.5],8726:[.25,.75,0,0,.5],8727:[-.03472,.46528,0,0,.5],8728:[-.05555,.44445,0,0,.5],8729:[-.05555,.44445,0,0,.5],8730:[.2,.8,0,0,.83334],8733:[0,.43056,0,0,.77778],8734:[0,.43056,0,0,1],8736:[0,.69224,0,0,.72222],8739:[.25,.75,0,0,.27778],8741:[.25,.75,0,0,.5],8743:[0,.55556,0,0,.66667],8744:[0,.55556,0,0,.66667],8745:[0,.55556,0,0,.66667],8746:[0,.55556,0,0,.66667],8747:[.19444,.69444,.11111,0,.41667],8764:[-.13313,.36687,0,0,.77778],8768:[.19444,.69444,0,0,.27778],8771:[-.03625,.46375,0,0,.77778],8773:[-.022,.589,0,0,.778],8776:[-.01688,.48312,0,0,.77778],8781:[-.03625,.46375,0,0,.77778],8784:[-.133,.673,0,0,.778],8801:[-.03625,.46375,0,0,.77778],8804:[.13597,.63597,0,0,.77778],8805:[.13597,.63597,0,0,.77778],8810:[.0391,.5391,0,0,1],8811:[.0391,.5391,0,0,1],8826:[.0391,.5391,0,0,.77778],8827:[.0391,.5391,0,0,.77778],8834:[.0391,.5391,0,0,.77778],8835:[.0391,.5391,0,0,.77778],8838:[.13597,.63597,0,0,.77778],8839:[.13597,.63597,0,0,.77778],8846:[0,.55556,0,0,.66667],8849:[.13597,.63597,0,0,.77778],8850:[.13597,.63597,0,0,.77778],8851:[0,.55556,0,0,.66667],8852:[0,.55556,0,0,.66667],8853:[.08333,.58333,0,0,.77778],8854:[.08333,.58333,0,0,.77778],8855:[.08333,.58333,0,0,.77778],8856:[.08333,.58333,0,0,.77778],8857:[.08333,.58333,0,0,.77778],8866:[0,.69444,0,0,.61111],8867:[0,.69444,0,0,.61111],8868:[0,.69444,0,0,.77778],8869:[0,.69444,0,0,.77778],8872:[.249,.75,0,0,.867],8900:[-.05555,.44445,0,0,.5],8901:[-.05555,.44445,0,0,.27778],8902:[-.03472,.46528,0,0,.5],8904:[.005,.505,0,0,.9],8942:[.03,.903,0,0,.278],8943:[-.19,.313,0,0,1.172],8945:[-.1,.823,0,0,1.282],8968:[.25,.75,0,0,.44445],8969:[.25,.75,0,0,.44445],8970:[.25,.75,0,0,.44445],8971:[.25,.75,0,0,.44445],8994:[-.14236,.35764,0,0,1],8995:[-.14236,.35764,0,0,1],9136:[.244,.744,0,0,.412],9137:[.244,.745,0,0,.412],9651:[.19444,.69444,0,0,.88889],9657:[-.03472,.46528,0,0,.5],9661:[.19444,.69444,0,0,.88889],9667:[-.03472,.46528,0,0,.5],9711:[.19444,.69444,0,0,1],9824:[.12963,.69444,0,0,.77778],9825:[.12963,.69444,0,0,.77778],9826:[.12963,.69444,0,0,.77778],9827:[.12963,.69444,0,0,.77778],9837:[0,.75,0,0,.38889],9838:[.19444,.69444,0,0,.38889],9839:[.19444,.69444,0,0,.38889],10216:[.25,.75,0,0,.38889],10217:[.25,.75,0,0,.38889],10222:[.244,.744,0,0,.412],10223:[.244,.745,0,0,.412],10229:[.011,.511,0,0,1.609],10230:[.011,.511,0,0,1.638],10231:[.011,.511,0,0,1.859],10232:[.024,.525,0,0,1.609],10233:[.024,.525,0,0,1.638],10234:[.024,.525,0,0,1.858],10236:[.011,.511,0,0,1.638],10815:[0,.68333,0,0,.75],10927:[.13597,.63597,0,0,.77778],10928:[.13597,.63597,0,0,.77778],57376:[.19444,.69444,0,0,0]},"Math-BoldItalic":{32:[0,0,0,0,.25],48:[0,.44444,0,0,.575],49:[0,.44444,0,0,.575],50:[0,.44444,0,0,.575],51:[.19444,.44444,0,0,.575],52:[.19444,.44444,0,0,.575],53:[.19444,.44444,0,0,.575],54:[0,.64444,0,0,.575],55:[.19444,.44444,0,0,.575],56:[0,.64444,0,0,.575],57:[.19444,.44444,0,0,.575],65:[0,.68611,0,0,.86944],66:[0,.68611,.04835,0,.8664],67:[0,.68611,.06979,0,.81694],68:[0,.68611,.03194,0,.93812],69:[0,.68611,.05451,0,.81007],70:[0,.68611,.15972,0,.68889],71:[0,.68611,0,0,.88673],72:[0,.68611,.08229,0,.98229],73:[0,.68611,.07778,0,.51111],74:[0,.68611,.10069,0,.63125],75:[0,.68611,.06979,0,.97118],76:[0,.68611,0,0,.75555],77:[0,.68611,.11424,0,1.14201],78:[0,.68611,.11424,0,.95034],79:[0,.68611,.03194,0,.83666],80:[0,.68611,.15972,0,.72309],81:[.19444,.68611,0,0,.86861],82:[0,.68611,.00421,0,.87235],83:[0,.68611,.05382,0,.69271],84:[0,.68611,.15972,0,.63663],85:[0,.68611,.11424,0,.80027],86:[0,.68611,.25555,0,.67778],87:[0,.68611,.15972,0,1.09305],88:[0,.68611,.07778,0,.94722],89:[0,.68611,.25555,0,.67458],90:[0,.68611,.06979,0,.77257],97:[0,.44444,0,0,.63287],98:[0,.69444,0,0,.52083],99:[0,.44444,0,0,.51342],100:[0,.69444,0,0,.60972],101:[0,.44444,0,0,.55361],102:[.19444,.69444,.11042,0,.56806],103:[.19444,.44444,.03704,0,.5449],104:[0,.69444,0,0,.66759],105:[0,.69326,0,0,.4048],106:[.19444,.69326,.0622,0,.47083],107:[0,.69444,.01852,0,.6037],108:[0,.69444,.0088,0,.34815],109:[0,.44444,0,0,1.0324],110:[0,.44444,0,0,.71296],111:[0,.44444,0,0,.58472],112:[.19444,.44444,0,0,.60092],113:[.19444,.44444,.03704,0,.54213],114:[0,.44444,.03194,0,.5287],115:[0,.44444,0,0,.53125],116:[0,.63492,0,0,.41528],117:[0,.44444,0,0,.68102],118:[0,.44444,.03704,0,.56666],119:[0,.44444,.02778,0,.83148],120:[0,.44444,0,0,.65903],121:[.19444,.44444,.03704,0,.59028],122:[0,.44444,.04213,0,.55509],160:[0,0,0,0,.25],915:[0,.68611,.15972,0,.65694],916:[0,.68611,0,0,.95833],920:[0,.68611,.03194,0,.86722],923:[0,.68611,0,0,.80555],926:[0,.68611,.07458,0,.84125],928:[0,.68611,.08229,0,.98229],931:[0,.68611,.05451,0,.88507],933:[0,.68611,.15972,0,.67083],934:[0,.68611,0,0,.76666],936:[0,.68611,.11653,0,.71402],937:[0,.68611,.04835,0,.8789],945:[0,.44444,0,0,.76064],946:[.19444,.69444,.03403,0,.65972],947:[.19444,.44444,.06389,0,.59003],948:[0,.69444,.03819,0,.52222],949:[0,.44444,0,0,.52882],950:[.19444,.69444,.06215,0,.50833],951:[.19444,.44444,.03704,0,.6],952:[0,.69444,.03194,0,.5618],953:[0,.44444,0,0,.41204],954:[0,.44444,0,0,.66759],955:[0,.69444,0,0,.67083],956:[.19444,.44444,0,0,.70787],957:[0,.44444,.06898,0,.57685],958:[.19444,.69444,.03021,0,.50833],959:[0,.44444,0,0,.58472],960:[0,.44444,.03704,0,.68241],961:[.19444,.44444,0,0,.6118],962:[.09722,.44444,.07917,0,.42361],963:[0,.44444,.03704,0,.68588],964:[0,.44444,.13472,0,.52083],965:[0,.44444,.03704,0,.63055],966:[.19444,.44444,0,0,.74722],967:[.19444,.44444,0,0,.71805],968:[.19444,.69444,.03704,0,.75833],969:[0,.44444,.03704,0,.71782],977:[0,.69444,0,0,.69155],981:[.19444,.69444,0,0,.7125],982:[0,.44444,.03194,0,.975],1009:[.19444,.44444,0,0,.6118],1013:[0,.44444,0,0,.48333],57649:[0,.44444,0,0,.39352],57911:[.19444,.44444,0,0,.43889]},"Math-Italic":{32:[0,0,0,0,.25],48:[0,.43056,0,0,.5],49:[0,.43056,0,0,.5],50:[0,.43056,0,0,.5],51:[.19444,.43056,0,0,.5],52:[.19444,.43056,0,0,.5],53:[.19444,.43056,0,0,.5],54:[0,.64444,0,0,.5],55:[.19444,.43056,0,0,.5],56:[0,.64444,0,0,.5],57:[.19444,.43056,0,0,.5],65:[0,.68333,0,.13889,.75],66:[0,.68333,.05017,.08334,.75851],67:[0,.68333,.07153,.08334,.71472],68:[0,.68333,.02778,.05556,.82792],69:[0,.68333,.05764,.08334,.7382],70:[0,.68333,.13889,.08334,.64306],71:[0,.68333,0,.08334,.78625],72:[0,.68333,.08125,.05556,.83125],73:[0,.68333,.07847,.11111,.43958],74:[0,.68333,.09618,.16667,.55451],75:[0,.68333,.07153,.05556,.84931],76:[0,.68333,0,.02778,.68056],77:[0,.68333,.10903,.08334,.97014],78:[0,.68333,.10903,.08334,.80347],79:[0,.68333,.02778,.08334,.76278],80:[0,.68333,.13889,.08334,.64201],81:[.19444,.68333,0,.08334,.79056],82:[0,.68333,.00773,.08334,.75929],83:[0,.68333,.05764,.08334,.6132],84:[0,.68333,.13889,.08334,.58438],85:[0,.68333,.10903,.02778,.68278],86:[0,.68333,.22222,0,.58333],87:[0,.68333,.13889,0,.94445],88:[0,.68333,.07847,.08334,.82847],89:[0,.68333,.22222,0,.58056],90:[0,.68333,.07153,.08334,.68264],97:[0,.43056,0,0,.52859],98:[0,.69444,0,0,.42917],99:[0,.43056,0,.05556,.43276],100:[0,.69444,0,.16667,.52049],101:[0,.43056,0,.05556,.46563],102:[.19444,.69444,.10764,.16667,.48959],103:[.19444,.43056,.03588,.02778,.47697],104:[0,.69444,0,0,.57616],105:[0,.65952,0,0,.34451],106:[.19444,.65952,.05724,0,.41181],107:[0,.69444,.03148,0,.5206],108:[0,.69444,.01968,.08334,.29838],109:[0,.43056,0,0,.87801],110:[0,.43056,0,0,.60023],111:[0,.43056,0,.05556,.48472],112:[.19444,.43056,0,.08334,.50313],113:[.19444,.43056,.03588,.08334,.44641],114:[0,.43056,.02778,.05556,.45116],115:[0,.43056,0,.05556,.46875],116:[0,.61508,0,.08334,.36111],117:[0,.43056,0,.02778,.57246],118:[0,.43056,.03588,.02778,.48472],119:[0,.43056,.02691,.08334,.71592],120:[0,.43056,0,.02778,.57153],121:[.19444,.43056,.03588,.05556,.49028],122:[0,.43056,.04398,.05556,.46505],160:[0,0,0,0,.25],915:[0,.68333,.13889,.08334,.61528],916:[0,.68333,0,.16667,.83334],920:[0,.68333,.02778,.08334,.76278],923:[0,.68333,0,.16667,.69445],926:[0,.68333,.07569,.08334,.74236],928:[0,.68333,.08125,.05556,.83125],931:[0,.68333,.05764,.08334,.77986],933:[0,.68333,.13889,.05556,.58333],934:[0,.68333,0,.08334,.66667],936:[0,.68333,.11,.05556,.61222],937:[0,.68333,.05017,.08334,.7724],945:[0,.43056,.0037,.02778,.6397],946:[.19444,.69444,.05278,.08334,.56563],947:[.19444,.43056,.05556,0,.51773],948:[0,.69444,.03785,.05556,.44444],949:[0,.43056,0,.08334,.46632],950:[.19444,.69444,.07378,.08334,.4375],951:[.19444,.43056,.03588,.05556,.49653],952:[0,.69444,.02778,.08334,.46944],953:[0,.43056,0,.05556,.35394],954:[0,.43056,0,0,.57616],955:[0,.69444,0,0,.58334],956:[.19444,.43056,0,.02778,.60255],957:[0,.43056,.06366,.02778,.49398],958:[.19444,.69444,.04601,.11111,.4375],959:[0,.43056,0,.05556,.48472],960:[0,.43056,.03588,0,.57003],961:[.19444,.43056,0,.08334,.51702],962:[.09722,.43056,.07986,.08334,.36285],963:[0,.43056,.03588,0,.57141],964:[0,.43056,.1132,.02778,.43715],965:[0,.43056,.03588,.02778,.54028],966:[.19444,.43056,0,.08334,.65417],967:[.19444,.43056,0,.05556,.62569],968:[.19444,.69444,.03588,.11111,.65139],969:[0,.43056,.03588,0,.62245],977:[0,.69444,0,.08334,.59144],981:[.19444,.69444,0,.08334,.59583],982:[0,.43056,.02778,0,.82813],1009:[.19444,.43056,0,.08334,.51702],1013:[0,.43056,0,.05556,.4059],57649:[0,.43056,0,.02778,.32246],57911:[.19444,.43056,0,.08334,.38403]},"SansSerif-Bold":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.36667],34:[0,.69444,0,0,.55834],35:[.19444,.69444,0,0,.91667],36:[.05556,.75,0,0,.55],37:[.05556,.75,0,0,1.02912],38:[0,.69444,0,0,.83056],39:[0,.69444,0,0,.30556],40:[.25,.75,0,0,.42778],41:[.25,.75,0,0,.42778],42:[0,.75,0,0,.55],43:[.11667,.61667,0,0,.85556],44:[.10556,.13056,0,0,.30556],45:[0,.45833,0,0,.36667],46:[0,.13056,0,0,.30556],47:[.25,.75,0,0,.55],48:[0,.69444,0,0,.55],49:[0,.69444,0,0,.55],50:[0,.69444,0,0,.55],51:[0,.69444,0,0,.55],52:[0,.69444,0,0,.55],53:[0,.69444,0,0,.55],54:[0,.69444,0,0,.55],55:[0,.69444,0,0,.55],56:[0,.69444,0,0,.55],57:[0,.69444,0,0,.55],58:[0,.45833,0,0,.30556],59:[.10556,.45833,0,0,.30556],61:[-.09375,.40625,0,0,.85556],63:[0,.69444,0,0,.51945],64:[0,.69444,0,0,.73334],65:[0,.69444,0,0,.73334],66:[0,.69444,0,0,.73334],67:[0,.69444,0,0,.70278],68:[0,.69444,0,0,.79445],69:[0,.69444,0,0,.64167],70:[0,.69444,0,0,.61111],71:[0,.69444,0,0,.73334],72:[0,.69444,0,0,.79445],73:[0,.69444,0,0,.33056],74:[0,.69444,0,0,.51945],75:[0,.69444,0,0,.76389],76:[0,.69444,0,0,.58056],77:[0,.69444,0,0,.97778],78:[0,.69444,0,0,.79445],79:[0,.69444,0,0,.79445],80:[0,.69444,0,0,.70278],81:[.10556,.69444,0,0,.79445],82:[0,.69444,0,0,.70278],83:[0,.69444,0,0,.61111],84:[0,.69444,0,0,.73334],85:[0,.69444,0,0,.76389],86:[0,.69444,.01528,0,.73334],87:[0,.69444,.01528,0,1.03889],88:[0,.69444,0,0,.73334],89:[0,.69444,.0275,0,.73334],90:[0,.69444,0,0,.67223],91:[.25,.75,0,0,.34306],93:[.25,.75,0,0,.34306],94:[0,.69444,0,0,.55],95:[.35,.10833,.03056,0,.55],97:[0,.45833,0,0,.525],98:[0,.69444,0,0,.56111],99:[0,.45833,0,0,.48889],100:[0,.69444,0,0,.56111],101:[0,.45833,0,0,.51111],102:[0,.69444,.07639,0,.33611],103:[.19444,.45833,.01528,0,.55],104:[0,.69444,0,0,.56111],105:[0,.69444,0,0,.25556],106:[.19444,.69444,0,0,.28611],107:[0,.69444,0,0,.53056],108:[0,.69444,0,0,.25556],109:[0,.45833,0,0,.86667],110:[0,.45833,0,0,.56111],111:[0,.45833,0,0,.55],112:[.19444,.45833,0,0,.56111],113:[.19444,.45833,0,0,.56111],114:[0,.45833,.01528,0,.37222],115:[0,.45833,0,0,.42167],116:[0,.58929,0,0,.40417],117:[0,.45833,0,0,.56111],118:[0,.45833,.01528,0,.5],119:[0,.45833,.01528,0,.74445],120:[0,.45833,0,0,.5],121:[.19444,.45833,.01528,0,.5],122:[0,.45833,0,0,.47639],126:[.35,.34444,0,0,.55],160:[0,0,0,0,.25],168:[0,.69444,0,0,.55],176:[0,.69444,0,0,.73334],180:[0,.69444,0,0,.55],184:[.17014,0,0,0,.48889],305:[0,.45833,0,0,.25556],567:[.19444,.45833,0,0,.28611],710:[0,.69444,0,0,.55],711:[0,.63542,0,0,.55],713:[0,.63778,0,0,.55],728:[0,.69444,0,0,.55],729:[0,.69444,0,0,.30556],730:[0,.69444,0,0,.73334],732:[0,.69444,0,0,.55],733:[0,.69444,0,0,.55],915:[0,.69444,0,0,.58056],916:[0,.69444,0,0,.91667],920:[0,.69444,0,0,.85556],923:[0,.69444,0,0,.67223],926:[0,.69444,0,0,.73334],928:[0,.69444,0,0,.79445],931:[0,.69444,0,0,.79445],933:[0,.69444,0,0,.85556],934:[0,.69444,0,0,.79445],936:[0,.69444,0,0,.85556],937:[0,.69444,0,0,.79445],8211:[0,.45833,.03056,0,.55],8212:[0,.45833,.03056,0,1.10001],8216:[0,.69444,0,0,.30556],8217:[0,.69444,0,0,.30556],8220:[0,.69444,0,0,.55834],8221:[0,.69444,0,0,.55834]},"SansSerif-Italic":{32:[0,0,0,0,.25],33:[0,.69444,.05733,0,.31945],34:[0,.69444,.00316,0,.5],35:[.19444,.69444,.05087,0,.83334],36:[.05556,.75,.11156,0,.5],37:[.05556,.75,.03126,0,.83334],38:[0,.69444,.03058,0,.75834],39:[0,.69444,.07816,0,.27778],40:[.25,.75,.13164,0,.38889],41:[.25,.75,.02536,0,.38889],42:[0,.75,.11775,0,.5],43:[.08333,.58333,.02536,0,.77778],44:[.125,.08333,0,0,.27778],45:[0,.44444,.01946,0,.33333],46:[0,.08333,0,0,.27778],47:[.25,.75,.13164,0,.5],48:[0,.65556,.11156,0,.5],49:[0,.65556,.11156,0,.5],50:[0,.65556,.11156,0,.5],51:[0,.65556,.11156,0,.5],52:[0,.65556,.11156,0,.5],53:[0,.65556,.11156,0,.5],54:[0,.65556,.11156,0,.5],55:[0,.65556,.11156,0,.5],56:[0,.65556,.11156,0,.5],57:[0,.65556,.11156,0,.5],58:[0,.44444,.02502,0,.27778],59:[.125,.44444,.02502,0,.27778],61:[-.13,.37,.05087,0,.77778],63:[0,.69444,.11809,0,.47222],64:[0,.69444,.07555,0,.66667],65:[0,.69444,0,0,.66667],66:[0,.69444,.08293,0,.66667],67:[0,.69444,.11983,0,.63889],68:[0,.69444,.07555,0,.72223],69:[0,.69444,.11983,0,.59722],70:[0,.69444,.13372,0,.56945],71:[0,.69444,.11983,0,.66667],72:[0,.69444,.08094,0,.70834],73:[0,.69444,.13372,0,.27778],74:[0,.69444,.08094,0,.47222],75:[0,.69444,.11983,0,.69445],76:[0,.69444,0,0,.54167],77:[0,.69444,.08094,0,.875],78:[0,.69444,.08094,0,.70834],79:[0,.69444,.07555,0,.73611],80:[0,.69444,.08293,0,.63889],81:[.125,.69444,.07555,0,.73611],82:[0,.69444,.08293,0,.64584],83:[0,.69444,.09205,0,.55556],84:[0,.69444,.13372,0,.68056],85:[0,.69444,.08094,0,.6875],86:[0,.69444,.1615,0,.66667],87:[0,.69444,.1615,0,.94445],88:[0,.69444,.13372,0,.66667],89:[0,.69444,.17261,0,.66667],90:[0,.69444,.11983,0,.61111],91:[.25,.75,.15942,0,.28889],93:[.25,.75,.08719,0,.28889],94:[0,.69444,.0799,0,.5],95:[.35,.09444,.08616,0,.5],97:[0,.44444,.00981,0,.48056],98:[0,.69444,.03057,0,.51667],99:[0,.44444,.08336,0,.44445],100:[0,.69444,.09483,0,.51667],101:[0,.44444,.06778,0,.44445],102:[0,.69444,.21705,0,.30556],103:[.19444,.44444,.10836,0,.5],104:[0,.69444,.01778,0,.51667],105:[0,.67937,.09718,0,.23889],106:[.19444,.67937,.09162,0,.26667],107:[0,.69444,.08336,0,.48889],108:[0,.69444,.09483,0,.23889],109:[0,.44444,.01778,0,.79445],110:[0,.44444,.01778,0,.51667],111:[0,.44444,.06613,0,.5],112:[.19444,.44444,.0389,0,.51667],113:[.19444,.44444,.04169,0,.51667],114:[0,.44444,.10836,0,.34167],115:[0,.44444,.0778,0,.38333],116:[0,.57143,.07225,0,.36111],117:[0,.44444,.04169,0,.51667],118:[0,.44444,.10836,0,.46111],119:[0,.44444,.10836,0,.68334],120:[0,.44444,.09169,0,.46111],121:[.19444,.44444,.10836,0,.46111],122:[0,.44444,.08752,0,.43472],126:[.35,.32659,.08826,0,.5],160:[0,0,0,0,.25],168:[0,.67937,.06385,0,.5],176:[0,.69444,0,0,.73752],184:[.17014,0,0,0,.44445],305:[0,.44444,.04169,0,.23889],567:[.19444,.44444,.04169,0,.26667],710:[0,.69444,.0799,0,.5],711:[0,.63194,.08432,0,.5],713:[0,.60889,.08776,0,.5],714:[0,.69444,.09205,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,.09483,0,.5],729:[0,.67937,.07774,0,.27778],730:[0,.69444,0,0,.73752],732:[0,.67659,.08826,0,.5],733:[0,.69444,.09205,0,.5],915:[0,.69444,.13372,0,.54167],916:[0,.69444,0,0,.83334],920:[0,.69444,.07555,0,.77778],923:[0,.69444,0,0,.61111],926:[0,.69444,.12816,0,.66667],928:[0,.69444,.08094,0,.70834],931:[0,.69444,.11983,0,.72222],933:[0,.69444,.09031,0,.77778],934:[0,.69444,.04603,0,.72222],936:[0,.69444,.09031,0,.77778],937:[0,.69444,.08293,0,.72222],8211:[0,.44444,.08616,0,.5],8212:[0,.44444,.08616,0,1],8216:[0,.69444,.07816,0,.27778],8217:[0,.69444,.07816,0,.27778],8220:[0,.69444,.14205,0,.5],8221:[0,.69444,.00316,0,.5]},"SansSerif-Regular":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.31945],34:[0,.69444,0,0,.5],35:[.19444,.69444,0,0,.83334],36:[.05556,.75,0,0,.5],37:[.05556,.75,0,0,.83334],38:[0,.69444,0,0,.75834],39:[0,.69444,0,0,.27778],40:[.25,.75,0,0,.38889],41:[.25,.75,0,0,.38889],42:[0,.75,0,0,.5],43:[.08333,.58333,0,0,.77778],44:[.125,.08333,0,0,.27778],45:[0,.44444,0,0,.33333],46:[0,.08333,0,0,.27778],47:[.25,.75,0,0,.5],48:[0,.65556,0,0,.5],49:[0,.65556,0,0,.5],50:[0,.65556,0,0,.5],51:[0,.65556,0,0,.5],52:[0,.65556,0,0,.5],53:[0,.65556,0,0,.5],54:[0,.65556,0,0,.5],55:[0,.65556,0,0,.5],56:[0,.65556,0,0,.5],57:[0,.65556,0,0,.5],58:[0,.44444,0,0,.27778],59:[.125,.44444,0,0,.27778],61:[-.13,.37,0,0,.77778],63:[0,.69444,0,0,.47222],64:[0,.69444,0,0,.66667],65:[0,.69444,0,0,.66667],66:[0,.69444,0,0,.66667],67:[0,.69444,0,0,.63889],68:[0,.69444,0,0,.72223],69:[0,.69444,0,0,.59722],70:[0,.69444,0,0,.56945],71:[0,.69444,0,0,.66667],72:[0,.69444,0,0,.70834],73:[0,.69444,0,0,.27778],74:[0,.69444,0,0,.47222],75:[0,.69444,0,0,.69445],76:[0,.69444,0,0,.54167],77:[0,.69444,0,0,.875],78:[0,.69444,0,0,.70834],79:[0,.69444,0,0,.73611],80:[0,.69444,0,0,.63889],81:[.125,.69444,0,0,.73611],82:[0,.69444,0,0,.64584],83:[0,.69444,0,0,.55556],84:[0,.69444,0,0,.68056],85:[0,.69444,0,0,.6875],86:[0,.69444,.01389,0,.66667],87:[0,.69444,.01389,0,.94445],88:[0,.69444,0,0,.66667],89:[0,.69444,.025,0,.66667],90:[0,.69444,0,0,.61111],91:[.25,.75,0,0,.28889],93:[.25,.75,0,0,.28889],94:[0,.69444,0,0,.5],95:[.35,.09444,.02778,0,.5],97:[0,.44444,0,0,.48056],98:[0,.69444,0,0,.51667],99:[0,.44444,0,0,.44445],100:[0,.69444,0,0,.51667],101:[0,.44444,0,0,.44445],102:[0,.69444,.06944,0,.30556],103:[.19444,.44444,.01389,0,.5],104:[0,.69444,0,0,.51667],105:[0,.67937,0,0,.23889],106:[.19444,.67937,0,0,.26667],107:[0,.69444,0,0,.48889],108:[0,.69444,0,0,.23889],109:[0,.44444,0,0,.79445],110:[0,.44444,0,0,.51667],111:[0,.44444,0,0,.5],112:[.19444,.44444,0,0,.51667],113:[.19444,.44444,0,0,.51667],114:[0,.44444,.01389,0,.34167],115:[0,.44444,0,0,.38333],116:[0,.57143,0,0,.36111],117:[0,.44444,0,0,.51667],118:[0,.44444,.01389,0,.46111],119:[0,.44444,.01389,0,.68334],120:[0,.44444,0,0,.46111],121:[.19444,.44444,.01389,0,.46111],122:[0,.44444,0,0,.43472],126:[.35,.32659,0,0,.5],160:[0,0,0,0,.25],168:[0,.67937,0,0,.5],176:[0,.69444,0,0,.66667],184:[.17014,0,0,0,.44445],305:[0,.44444,0,0,.23889],567:[.19444,.44444,0,0,.26667],710:[0,.69444,0,0,.5],711:[0,.63194,0,0,.5],713:[0,.60889,0,0,.5],714:[0,.69444,0,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,0,0,.5],729:[0,.67937,0,0,.27778],730:[0,.69444,0,0,.66667],732:[0,.67659,0,0,.5],733:[0,.69444,0,0,.5],915:[0,.69444,0,0,.54167],916:[0,.69444,0,0,.83334],920:[0,.69444,0,0,.77778],923:[0,.69444,0,0,.61111],926:[0,.69444,0,0,.66667],928:[0,.69444,0,0,.70834],931:[0,.69444,0,0,.72222],933:[0,.69444,0,0,.77778],934:[0,.69444,0,0,.72222],936:[0,.69444,0,0,.77778],937:[0,.69444,0,0,.72222],8211:[0,.44444,.02778,0,.5],8212:[0,.44444,.02778,0,1],8216:[0,.69444,0,0,.27778],8217:[0,.69444,0,0,.27778],8220:[0,.69444,0,0,.5],8221:[0,.69444,0,0,.5]},"Script-Regular":{32:[0,0,0,0,.25],65:[0,.7,.22925,0,.80253],66:[0,.7,.04087,0,.90757],67:[0,.7,.1689,0,.66619],68:[0,.7,.09371,0,.77443],69:[0,.7,.18583,0,.56162],70:[0,.7,.13634,0,.89544],71:[0,.7,.17322,0,.60961],72:[0,.7,.29694,0,.96919],73:[0,.7,.19189,0,.80907],74:[.27778,.7,.19189,0,1.05159],75:[0,.7,.31259,0,.91364],76:[0,.7,.19189,0,.87373],77:[0,.7,.15981,0,1.08031],78:[0,.7,.3525,0,.9015],79:[0,.7,.08078,0,.73787],80:[0,.7,.08078,0,1.01262],81:[0,.7,.03305,0,.88282],82:[0,.7,.06259,0,.85],83:[0,.7,.19189,0,.86767],84:[0,.7,.29087,0,.74697],85:[0,.7,.25815,0,.79996],86:[0,.7,.27523,0,.62204],87:[0,.7,.27523,0,.80532],88:[0,.7,.26006,0,.94445],89:[0,.7,.2939,0,.70961],90:[0,.7,.24037,0,.8212],160:[0,0,0,0,.25]},"Size1-Regular":{32:[0,0,0,0,.25],40:[.35001,.85,0,0,.45834],41:[.35001,.85,0,0,.45834],47:[.35001,.85,0,0,.57778],91:[.35001,.85,0,0,.41667],92:[.35001,.85,0,0,.57778],93:[.35001,.85,0,0,.41667],123:[.35001,.85,0,0,.58334],125:[.35001,.85,0,0,.58334],160:[0,0,0,0,.25],710:[0,.72222,0,0,.55556],732:[0,.72222,0,0,.55556],770:[0,.72222,0,0,.55556],771:[0,.72222,0,0,.55556],8214:[-99e-5,.601,0,0,.77778],8593:[1e-5,.6,0,0,.66667],8595:[1e-5,.6,0,0,.66667],8657:[1e-5,.6,0,0,.77778],8659:[1e-5,.6,0,0,.77778],8719:[.25001,.75,0,0,.94445],8720:[.25001,.75,0,0,.94445],8721:[.25001,.75,0,0,1.05556],8730:[.35001,.85,0,0,1],8739:[-.00599,.606,0,0,.33333],8741:[-.00599,.606,0,0,.55556],8747:[.30612,.805,.19445,0,.47222],8748:[.306,.805,.19445,0,.47222],8749:[.306,.805,.19445,0,.47222],8750:[.30612,.805,.19445,0,.47222],8896:[.25001,.75,0,0,.83334],8897:[.25001,.75,0,0,.83334],8898:[.25001,.75,0,0,.83334],8899:[.25001,.75,0,0,.83334],8968:[.35001,.85,0,0,.47222],8969:[.35001,.85,0,0,.47222],8970:[.35001,.85,0,0,.47222],8971:[.35001,.85,0,0,.47222],9168:[-99e-5,.601,0,0,.66667],10216:[.35001,.85,0,0,.47222],10217:[.35001,.85,0,0,.47222],10752:[.25001,.75,0,0,1.11111],10753:[.25001,.75,0,0,1.11111],10754:[.25001,.75,0,0,1.11111],10756:[.25001,.75,0,0,.83334],10758:[.25001,.75,0,0,.83334]},"Size2-Regular":{32:[0,0,0,0,.25],40:[.65002,1.15,0,0,.59722],41:[.65002,1.15,0,0,.59722],47:[.65002,1.15,0,0,.81111],91:[.65002,1.15,0,0,.47222],92:[.65002,1.15,0,0,.81111],93:[.65002,1.15,0,0,.47222],123:[.65002,1.15,0,0,.66667],125:[.65002,1.15,0,0,.66667],160:[0,0,0,0,.25],710:[0,.75,0,0,1],732:[0,.75,0,0,1],770:[0,.75,0,0,1],771:[0,.75,0,0,1],8719:[.55001,1.05,0,0,1.27778],8720:[.55001,1.05,0,0,1.27778],8721:[.55001,1.05,0,0,1.44445],8730:[.65002,1.15,0,0,1],8747:[.86225,1.36,.44445,0,.55556],8748:[.862,1.36,.44445,0,.55556],8749:[.862,1.36,.44445,0,.55556],8750:[.86225,1.36,.44445,0,.55556],8896:[.55001,1.05,0,0,1.11111],8897:[.55001,1.05,0,0,1.11111],8898:[.55001,1.05,0,0,1.11111],8899:[.55001,1.05,0,0,1.11111],8968:[.65002,1.15,0,0,.52778],8969:[.65002,1.15,0,0,.52778],8970:[.65002,1.15,0,0,.52778],8971:[.65002,1.15,0,0,.52778],10216:[.65002,1.15,0,0,.61111],10217:[.65002,1.15,0,0,.61111],10752:[.55001,1.05,0,0,1.51112],10753:[.55001,1.05,0,0,1.51112],10754:[.55001,1.05,0,0,1.51112],10756:[.55001,1.05,0,0,1.11111],10758:[.55001,1.05,0,0,1.11111]},"Size3-Regular":{32:[0,0,0,0,.25],40:[.95003,1.45,0,0,.73611],41:[.95003,1.45,0,0,.73611],47:[.95003,1.45,0,0,1.04445],91:[.95003,1.45,0,0,.52778],92:[.95003,1.45,0,0,1.04445],93:[.95003,1.45,0,0,.52778],123:[.95003,1.45,0,0,.75],125:[.95003,1.45,0,0,.75],160:[0,0,0,0,.25],710:[0,.75,0,0,1.44445],732:[0,.75,0,0,1.44445],770:[0,.75,0,0,1.44445],771:[0,.75,0,0,1.44445],8730:[.95003,1.45,0,0,1],8968:[.95003,1.45,0,0,.58334],8969:[.95003,1.45,0,0,.58334],8970:[.95003,1.45,0,0,.58334],8971:[.95003,1.45,0,0,.58334],10216:[.95003,1.45,0,0,.75],10217:[.95003,1.45,0,0,.75]},"Size4-Regular":{32:[0,0,0,0,.25],40:[1.25003,1.75,0,0,.79167],41:[1.25003,1.75,0,0,.79167],47:[1.25003,1.75,0,0,1.27778],91:[1.25003,1.75,0,0,.58334],92:[1.25003,1.75,0,0,1.27778],93:[1.25003,1.75,0,0,.58334],123:[1.25003,1.75,0,0,.80556],125:[1.25003,1.75,0,0,.80556],160:[0,0,0,0,.25],710:[0,.825,0,0,1.8889],732:[0,.825,0,0,1.8889],770:[0,.825,0,0,1.8889],771:[0,.825,0,0,1.8889],8730:[1.25003,1.75,0,0,1],8968:[1.25003,1.75,0,0,.63889],8969:[1.25003,1.75,0,0,.63889],8970:[1.25003,1.75,0,0,.63889],8971:[1.25003,1.75,0,0,.63889],9115:[.64502,1.155,0,0,.875],9116:[1e-5,.6,0,0,.875],9117:[.64502,1.155,0,0,.875],9118:[.64502,1.155,0,0,.875],9119:[1e-5,.6,0,0,.875],9120:[.64502,1.155,0,0,.875],9121:[.64502,1.155,0,0,.66667],9122:[-99e-5,.601,0,0,.66667],9123:[.64502,1.155,0,0,.66667],9124:[.64502,1.155,0,0,.66667],9125:[-99e-5,.601,0,0,.66667],9126:[.64502,1.155,0,0,.66667],9127:[1e-5,.9,0,0,.88889],9128:[.65002,1.15,0,0,.88889],9129:[.90001,0,0,0,.88889],9130:[0,.3,0,0,.88889],9131:[1e-5,.9,0,0,.88889],9132:[.65002,1.15,0,0,.88889],9133:[.90001,0,0,0,.88889],9143:[.88502,.915,0,0,1.05556],10216:[1.25003,1.75,0,0,.80556],10217:[1.25003,1.75,0,0,.80556],57344:[-.00499,.605,0,0,1.05556],57345:[-.00499,.605,0,0,1.05556],57680:[0,.12,0,0,.45],57681:[0,.12,0,0,.45],57682:[0,.12,0,0,.45],57683:[0,.12,0,0,.45]},"Typewriter-Regular":{32:[0,0,0,0,.525],33:[0,.61111,0,0,.525],34:[0,.61111,0,0,.525],35:[0,.61111,0,0,.525],36:[.08333,.69444,0,0,.525],37:[.08333,.69444,0,0,.525],38:[0,.61111,0,0,.525],39:[0,.61111,0,0,.525],40:[.08333,.69444,0,0,.525],41:[.08333,.69444,0,0,.525],42:[0,.52083,0,0,.525],43:[-.08056,.53055,0,0,.525],44:[.13889,.125,0,0,.525],45:[-.08056,.53055,0,0,.525],46:[0,.125,0,0,.525],47:[.08333,.69444,0,0,.525],48:[0,.61111,0,0,.525],49:[0,.61111,0,0,.525],50:[0,.61111,0,0,.525],51:[0,.61111,0,0,.525],52:[0,.61111,0,0,.525],53:[0,.61111,0,0,.525],54:[0,.61111,0,0,.525],55:[0,.61111,0,0,.525],56:[0,.61111,0,0,.525],57:[0,.61111,0,0,.525],58:[0,.43056,0,0,.525],59:[.13889,.43056,0,0,.525],60:[-.05556,.55556,0,0,.525],61:[-.19549,.41562,0,0,.525],62:[-.05556,.55556,0,0,.525],63:[0,.61111,0,0,.525],64:[0,.61111,0,0,.525],65:[0,.61111,0,0,.525],66:[0,.61111,0,0,.525],67:[0,.61111,0,0,.525],68:[0,.61111,0,0,.525],69:[0,.61111,0,0,.525],70:[0,.61111,0,0,.525],71:[0,.61111,0,0,.525],72:[0,.61111,0,0,.525],73:[0,.61111,0,0,.525],74:[0,.61111,0,0,.525],75:[0,.61111,0,0,.525],76:[0,.61111,0,0,.525],77:[0,.61111,0,0,.525],78:[0,.61111,0,0,.525],79:[0,.61111,0,0,.525],80:[0,.61111,0,0,.525],81:[.13889,.61111,0,0,.525],82:[0,.61111,0,0,.525],83:[0,.61111,0,0,.525],84:[0,.61111,0,0,.525],85:[0,.61111,0,0,.525],86:[0,.61111,0,0,.525],87:[0,.61111,0,0,.525],88:[0,.61111,0,0,.525],89:[0,.61111,0,0,.525],90:[0,.61111,0,0,.525],91:[.08333,.69444,0,0,.525],92:[.08333,.69444,0,0,.525],93:[.08333,.69444,0,0,.525],94:[0,.61111,0,0,.525],95:[.09514,0,0,0,.525],96:[0,.61111,0,0,.525],97:[0,.43056,0,0,.525],98:[0,.61111,0,0,.525],99:[0,.43056,0,0,.525],100:[0,.61111,0,0,.525],101:[0,.43056,0,0,.525],102:[0,.61111,0,0,.525],103:[.22222,.43056,0,0,.525],104:[0,.61111,0,0,.525],105:[0,.61111,0,0,.525],106:[.22222,.61111,0,0,.525],107:[0,.61111,0,0,.525],108:[0,.61111,0,0,.525],109:[0,.43056,0,0,.525],110:[0,.43056,0,0,.525],111:[0,.43056,0,0,.525],112:[.22222,.43056,0,0,.525],113:[.22222,.43056,0,0,.525],114:[0,.43056,0,0,.525],115:[0,.43056,0,0,.525],116:[0,.55358,0,0,.525],117:[0,.43056,0,0,.525],118:[0,.43056,0,0,.525],119:[0,.43056,0,0,.525],120:[0,.43056,0,0,.525],121:[.22222,.43056,0,0,.525],122:[0,.43056,0,0,.525],123:[.08333,.69444,0,0,.525],124:[.08333,.69444,0,0,.525],125:[.08333,.69444,0,0,.525],126:[0,.61111,0,0,.525],127:[0,.61111,0,0,.525],160:[0,0,0,0,.525],176:[0,.61111,0,0,.525],184:[.19445,0,0,0,.525],305:[0,.43056,0,0,.525],567:[.22222,.43056,0,0,.525],711:[0,.56597,0,0,.525],713:[0,.56555,0,0,.525],714:[0,.61111,0,0,.525],715:[0,.61111,0,0,.525],728:[0,.61111,0,0,.525],730:[0,.61111,0,0,.525],770:[0,.61111,0,0,.525],771:[0,.61111,0,0,.525],776:[0,.61111,0,0,.525],915:[0,.61111,0,0,.525],916:[0,.61111,0,0,.525],920:[0,.61111,0,0,.525],923:[0,.61111,0,0,.525],926:[0,.61111,0,0,.525],928:[0,.61111,0,0,.525],931:[0,.61111,0,0,.525],933:[0,.61111,0,0,.525],934:[0,.61111,0,0,.525],936:[0,.61111,0,0,.525],937:[0,.61111,0,0,.525],8216:[0,.61111,0,0,.525],8217:[0,.61111,0,0,.525],8242:[0,.61111,0,0,.525],9251:[.11111,.21944,0,0,.525]}},ke={slant:[.25,.25,.25],space:[0,0,0],stretch:[0,0,0],shrink:[0,0,0],xHeight:[.431,.431,.431],quad:[1,1.171,1.472],extraSpace:[0,0,0],num1:[.677,.732,.925],num2:[.394,.384,.387],num3:[.444,.471,.504],denom1:[.686,.752,1.025],denom2:[.345,.344,.532],sup1:[.413,.503,.504],sup2:[.363,.431,.404],sup3:[.289,.286,.294],sub1:[.15,.143,.2],sub2:[.247,.286,.4],supDrop:[.386,.353,.494],subDrop:[.05,.071,.1],delim1:[2.39,1.7,1.98],delim2:[1.01,1.157,1.42],axisHeight:[.25,.25,.25],defaultRuleThickness:[.04,.049,.049],bigOpSpacing1:[.111,.111,.111],bigOpSpacing2:[.166,.166,.166],bigOpSpacing3:[.2,.2,.2],bigOpSpacing4:[.6,.611,.611],bigOpSpacing5:[.1,.143,.143],sqrtRuleThickness:[.04,.04,.04],ptPerEm:[10,10,10],doubleRuleSep:[.2,.2,.2],arrayRuleWidth:[.04,.04,.04],fboxsep:[.3,.3,.3],fboxrule:[.04,.04,.04]},Zt={\u00C5:"A",\u00D0:"D",\u00DE:"o",\u00E5:"a",\u00F0:"d",\u00FE:"o",\u0410:"A",\u0411:"B",\u0412:"B",\u0413:"F",\u0414:"A",\u0415:"E",\u0416:"K",\u0417:"3",\u0418:"N",\u0419:"N",\u041A:"K",\u041B:"N",\u041C:"M",\u041D:"H",\u041E:"O",\u041F:"N",\u0420:"P",\u0421:"C",\u0422:"T",\u0423:"y",\u0424:"O",\u0425:"X",\u0426:"U",\u0427:"h",\u0428:"W",\u0429:"W",\u042A:"B",\u042B:"X",\u042C:"B",\u042D:"3",\u042E:"X",\u042F:"R",\u0430:"a",\u0431:"b",\u0432:"a",\u0433:"r",\u0434:"y",\u0435:"e",\u0436:"m",\u0437:"e",\u0438:"n",\u0439:"n",\u043A:"n",\u043B:"n",\u043C:"m",\u043D:"n",\u043E:"o",\u043F:"n",\u0440:"p",\u0441:"c",\u0442:"o",\u0443:"y",\u0444:"b",\u0445:"x",\u0446:"n",\u0447:"n",\u0448:"w",\u0449:"w",\u044A:"a",\u044B:"m",\u044C:"a",\u044D:"e",\u044E:"m",\u044F:"r"};function Ja(r,e){z0[r]=e}function Tt(r,e,t){if(!z0[e])throw new Error("Font metrics not found for font: "+e+".");var a=r.charCodeAt(0),n=z0[e][a];if(!n&&r[0]in Zt&&(a=Zt[r[0]].charCodeAt(0),n=z0[e][a]),!n&&t==="text"&&Ar(a)&&(n=z0[e][77]),n)return{depth:n[0],height:n[1],italic:n[2],skew:n[3],width:n[4]}}var tt={};function Qa(r){var e;if(r>=5?e=0:r>=3?e=1:e=2,!tt[e]){var t=tt[e]={cssEmPerMu:ke.quad[e]/18};for(var a in ke)ke.hasOwnProperty(a)&&(t[a]=ke[a][e])}return tt[e]}var e1=[[1,1,1],[2,1,1],[3,1,1],[4,2,1],[5,2,1],[6,3,1],[7,4,2],[8,6,3],[9,7,6],[10,8,7],[11,10,9]],jt=[.5,.6,.7,.8,.9,1,1.2,1.44,1.728,2.074,2.488],Kt=function(e,t){return t.size<2?e:e1[e-1][t.size-1]},Re=class r{constructor(e){this.style=void 0,this.color=void 0,this.size=void 0,this.textSize=void 0,this.phantom=void 0,this.font=void 0,this.fontFamily=void 0,this.fontWeight=void 0,this.fontShape=void 0,this.sizeMultiplier=void 0,this.maxSize=void 0,this.minRuleThickness=void 0,this._fontMetrics=void 0,this.style=e.style,this.color=e.color,this.size=e.size||r.BASESIZE,this.textSize=e.textSize||this.size,this.phantom=!!e.phantom,this.font=e.font||"",this.fontFamily=e.fontFamily||"",this.fontWeight=e.fontWeight||"",this.fontShape=e.fontShape||"",this.sizeMultiplier=jt[this.size-1],this.maxSize=e.maxSize,this.minRuleThickness=e.minRuleThickness,this._fontMetrics=void 0}extend(e){var t={style:this.style,size:this.size,textSize:this.textSize,color:this.color,phantom:this.phantom,font:this.font,fontFamily:this.fontFamily,fontWeight:this.fontWeight,fontShape:this.fontShape,maxSize:this.maxSize,minRuleThickness:this.minRuleThickness};for(var a in e)e.hasOwnProperty(a)&&(t[a]=e[a]);return new r(t)}havingStyle(e){return this.style===e?this:this.extend({style:e,size:Kt(this.textSize,e)})}havingCrampedStyle(){return this.havingStyle(this.style.cramp())}havingSize(e){return this.size===e&&this.textSize===e?this:this.extend({style:this.style.text(),size:e,textSize:e,sizeMultiplier:jt[e-1]})}havingBaseStyle(e){e=e||this.style.text();var t=Kt(r.BASESIZE,e);return this.size===t&&this.textSize===r.BASESIZE&&this.style===e?this:this.extend({style:e,size:t})}havingBaseSizing(){var e;switch(this.style.id){case 4:case 5:e=3;break;case 6:case 7:e=1;break;default:e=6}return this.extend({style:this.style.text(),size:e})}withColor(e){return this.extend({color:e})}withPhantom(){return this.extend({phantom:!0})}withFont(e){return this.extend({font:e})}withTextFontFamily(e){return this.extend({fontFamily:e,font:""})}withTextFontWeight(e){return this.extend({fontWeight:e,font:""})}withTextFontShape(e){return this.extend({fontShape:e,font:""})}sizingClasses(e){return e.size!==this.size?["sizing","reset-size"+e.size,"size"+this.size]:[]}baseSizingClasses(){return this.size!==r.BASESIZE?["sizing","reset-size"+this.size,"size"+r.BASESIZE]:[]}fontMetrics(){return this._fontMetrics||(this._fontMetrics=Qa(this.size)),this._fontMetrics}getColor(){return this.phantom?"transparent":this.color}};Re.BASESIZE=6;var ft={pt:1,mm:7227/2540,cm:7227/254,in:72.27,bp:803/800,pc:12,dd:1238/1157,cc:14856/1157,nd:685/642,nc:1370/107,sp:1/65536,px:803/800},t1={ex:!0,em:!0,mu:!0},Tr=function(e){return typeof e!="string"&&(e=e.unit),e in ft||e in t1||e==="ex"},Q=function(e,t){var a;if(e.unit in ft)a=ft[e.unit]/t.fontMetrics().ptPerEm/t.sizeMultiplier;else if(e.unit==="mu")a=t.fontMetrics().cssEmPerMu;else{var n;if(t.style.isTight()?n=t.havingStyle(t.style.text()):n=t,e.unit==="ex")a=n.fontMetrics().xHeight;else if(e.unit==="em")a=n.fontMetrics().quad;else throw new z("Invalid unit: '"+e.unit+"'");n!==t&&(a*=n.sizeMultiplier/t.sizeMultiplier)}return Math.min(e.number*a,t.maxSize)},T=function(e){return+e.toFixed(4)+"em"},G0=function(e){return e.filter(t=>t).join(" ")},qr=function(e,t,a){if(this.classes=e||[],this.attributes={},this.height=0,this.depth=0,this.maxFontSize=0,this.style=a||{},t){t.style.isTight()&&this.classes.push("mtight");var n=t.getColor();n&&(this.style.color=n)}},Br=function(e){var t=document.createElement(e);t.className=G0(this.classes);for(var a in this.style)this.style.hasOwnProperty(a)&&(t.style[a]=this.style[a]);for(var n in this.attributes)this.attributes.hasOwnProperty(n)&&t.setAttribute(n,this.attributes[n]);for(var s=0;s/=\x00-\x1f]/,Dr=function(e){var t="<"+e;this.classes.length&&(t+=' class="'+O.escape(G0(this.classes))+'"');var a="";for(var n in this.style)this.style.hasOwnProperty(n)&&(a+=O.hyphenate(n)+":"+this.style[n]+";");a&&(t+=' style="'+O.escape(a)+'"');for(var s in this.attributes)if(this.attributes.hasOwnProperty(s)){if(r1.test(s))throw new z("Invalid attribute name '"+s+"'");t+=" "+s+'="'+O.escape(this.attributes[s])+'"'}t+=">";for(var l=0;l",t},Z0=class{constructor(e,t,a,n){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.width=void 0,this.maxFontSize=void 0,this.style=void 0,qr.call(this,e,a,n),this.children=t||[]}setAttribute(e,t){this.attributes[e]=t}hasClass(e){return O.contains(this.classes,e)}toNode(){return Br.call(this,"span")}toMarkup(){return Dr.call(this,"span")}},fe=class{constructor(e,t,a,n){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,qr.call(this,t,n),this.children=a||[],this.setAttribute("href",e)}setAttribute(e,t){this.attributes[e]=t}hasClass(e){return O.contains(this.classes,e)}toNode(){return Br.call(this,"a")}toMarkup(){return Dr.call(this,"a")}},vt=class{constructor(e,t,a){this.src=void 0,this.alt=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.alt=t,this.src=e,this.classes=["mord"],this.style=a}hasClass(e){return O.contains(this.classes,e)}toNode(){var e=document.createElement("img");e.src=this.src,e.alt=this.alt,e.className="mord";for(var t in this.style)this.style.hasOwnProperty(t)&&(e.style[t]=this.style[t]);return e}toMarkup(){var e=''+O.escape(this.alt)+'0&&(t=document.createElement("span"),t.style.marginRight=T(this.italic)),this.classes.length>0&&(t=t||document.createElement("span"),t.className=G0(this.classes));for(var a in this.style)this.style.hasOwnProperty(a)&&(t=t||document.createElement("span"),t.style[a]=this.style[a]);return t?(t.appendChild(e),t):e}toMarkup(){var e=!1,t="0&&(a+="margin-right:"+this.italic+"em;");for(var n in this.style)this.style.hasOwnProperty(n)&&(a+=O.hyphenate(n)+":"+this.style[n]+";");a&&(e=!0,t+=' style="'+O.escape(a)+'"');var s=O.escape(this.text);return e?(t+=">",t+=s,t+="",t):s}},S0=class{constructor(e,t){this.children=void 0,this.attributes=void 0,this.children=e||[],this.attributes=t||{}}toNode(){var e="http://www.w3.org/2000/svg",t=document.createElementNS(e,"svg");for(var a in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,a)&&t.setAttribute(a,this.attributes[a]);for(var n=0;n':''}},ve=class{constructor(e){this.attributes=void 0,this.attributes=e||{}}toNode(){var e="http://www.w3.org/2000/svg",t=document.createElementNS(e,"line");for(var a in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,a)&&t.setAttribute(a,this.attributes[a]);return t}toMarkup(){var e=" but got "+String(r)+".")}var i1={bin:1,close:1,inner:1,open:1,punct:1,rel:1},s1={"accent-token":1,mathord:1,"op-token":1,spacing:1,textord:1},Y={math:{},text:{}};function i(r,e,t,a,n,s){Y[r][n]={font:e,group:t,replace:a},s&&a&&(Y[r][a]=Y[r][n])}var o="math",k="text",u="main",d="ams",Z="accent-token",C="bin",l0="close",ie="inner",I="mathord",t0="op-token",p0="open",Ve="punct",p="rel",R0="spacing",g="textord";i(o,u,p,"\u2261","\\equiv",!0);i(o,u,p,"\u227A","\\prec",!0);i(o,u,p,"\u227B","\\succ",!0);i(o,u,p,"\u223C","\\sim",!0);i(o,u,p,"\u22A5","\\perp");i(o,u,p,"\u2AAF","\\preceq",!0);i(o,u,p,"\u2AB0","\\succeq",!0);i(o,u,p,"\u2243","\\simeq",!0);i(o,u,p,"\u2223","\\mid",!0);i(o,u,p,"\u226A","\\ll",!0);i(o,u,p,"\u226B","\\gg",!0);i(o,u,p,"\u224D","\\asymp",!0);i(o,u,p,"\u2225","\\parallel");i(o,u,p,"\u22C8","\\bowtie",!0);i(o,u,p,"\u2323","\\smile",!0);i(o,u,p,"\u2291","\\sqsubseteq",!0);i(o,u,p,"\u2292","\\sqsupseteq",!0);i(o,u,p,"\u2250","\\doteq",!0);i(o,u,p,"\u2322","\\frown",!0);i(o,u,p,"\u220B","\\ni",!0);i(o,u,p,"\u221D","\\propto",!0);i(o,u,p,"\u22A2","\\vdash",!0);i(o,u,p,"\u22A3","\\dashv",!0);i(o,u,p,"\u220B","\\owns");i(o,u,Ve,".","\\ldotp");i(o,u,Ve,"\u22C5","\\cdotp");i(o,u,g,"#","\\#");i(k,u,g,"#","\\#");i(o,u,g,"&","\\&");i(k,u,g,"&","\\&");i(o,u,g,"\u2135","\\aleph",!0);i(o,u,g,"\u2200","\\forall",!0);i(o,u,g,"\u210F","\\hbar",!0);i(o,u,g,"\u2203","\\exists",!0);i(o,u,g,"\u2207","\\nabla",!0);i(o,u,g,"\u266D","\\flat",!0);i(o,u,g,"\u2113","\\ell",!0);i(o,u,g,"\u266E","\\natural",!0);i(o,u,g,"\u2663","\\clubsuit",!0);i(o,u,g,"\u2118","\\wp",!0);i(o,u,g,"\u266F","\\sharp",!0);i(o,u,g,"\u2662","\\diamondsuit",!0);i(o,u,g,"\u211C","\\Re",!0);i(o,u,g,"\u2661","\\heartsuit",!0);i(o,u,g,"\u2111","\\Im",!0);i(o,u,g,"\u2660","\\spadesuit",!0);i(o,u,g,"\xA7","\\S",!0);i(k,u,g,"\xA7","\\S");i(o,u,g,"\xB6","\\P",!0);i(k,u,g,"\xB6","\\P");i(o,u,g,"\u2020","\\dag");i(k,u,g,"\u2020","\\dag");i(k,u,g,"\u2020","\\textdagger");i(o,u,g,"\u2021","\\ddag");i(k,u,g,"\u2021","\\ddag");i(k,u,g,"\u2021","\\textdaggerdbl");i(o,u,l0,"\u23B1","\\rmoustache",!0);i(o,u,p0,"\u23B0","\\lmoustache",!0);i(o,u,l0,"\u27EF","\\rgroup",!0);i(o,u,p0,"\u27EE","\\lgroup",!0);i(o,u,C,"\u2213","\\mp",!0);i(o,u,C,"\u2296","\\ominus",!0);i(o,u,C,"\u228E","\\uplus",!0);i(o,u,C,"\u2293","\\sqcap",!0);i(o,u,C,"\u2217","\\ast");i(o,u,C,"\u2294","\\sqcup",!0);i(o,u,C,"\u25EF","\\bigcirc",!0);i(o,u,C,"\u2219","\\bullet",!0);i(o,u,C,"\u2021","\\ddagger");i(o,u,C,"\u2240","\\wr",!0);i(o,u,C,"\u2A3F","\\amalg");i(o,u,C,"&","\\And");i(o,u,p,"\u27F5","\\longleftarrow",!0);i(o,u,p,"\u21D0","\\Leftarrow",!0);i(o,u,p,"\u27F8","\\Longleftarrow",!0);i(o,u,p,"\u27F6","\\longrightarrow",!0);i(o,u,p,"\u21D2","\\Rightarrow",!0);i(o,u,p,"\u27F9","\\Longrightarrow",!0);i(o,u,p,"\u2194","\\leftrightarrow",!0);i(o,u,p,"\u27F7","\\longleftrightarrow",!0);i(o,u,p,"\u21D4","\\Leftrightarrow",!0);i(o,u,p,"\u27FA","\\Longleftrightarrow",!0);i(o,u,p,"\u21A6","\\mapsto",!0);i(o,u,p,"\u27FC","\\longmapsto",!0);i(o,u,p,"\u2197","\\nearrow",!0);i(o,u,p,"\u21A9","\\hookleftarrow",!0);i(o,u,p,"\u21AA","\\hookrightarrow",!0);i(o,u,p,"\u2198","\\searrow",!0);i(o,u,p,"\u21BC","\\leftharpoonup",!0);i(o,u,p,"\u21C0","\\rightharpoonup",!0);i(o,u,p,"\u2199","\\swarrow",!0);i(o,u,p,"\u21BD","\\leftharpoondown",!0);i(o,u,p,"\u21C1","\\rightharpoondown",!0);i(o,u,p,"\u2196","\\nwarrow",!0);i(o,u,p,"\u21CC","\\rightleftharpoons",!0);i(o,d,p,"\u226E","\\nless",!0);i(o,d,p,"\uE010","\\@nleqslant");i(o,d,p,"\uE011","\\@nleqq");i(o,d,p,"\u2A87","\\lneq",!0);i(o,d,p,"\u2268","\\lneqq",!0);i(o,d,p,"\uE00C","\\@lvertneqq");i(o,d,p,"\u22E6","\\lnsim",!0);i(o,d,p,"\u2A89","\\lnapprox",!0);i(o,d,p,"\u2280","\\nprec",!0);i(o,d,p,"\u22E0","\\npreceq",!0);i(o,d,p,"\u22E8","\\precnsim",!0);i(o,d,p,"\u2AB9","\\precnapprox",!0);i(o,d,p,"\u2241","\\nsim",!0);i(o,d,p,"\uE006","\\@nshortmid");i(o,d,p,"\u2224","\\nmid",!0);i(o,d,p,"\u22AC","\\nvdash",!0);i(o,d,p,"\u22AD","\\nvDash",!0);i(o,d,p,"\u22EA","\\ntriangleleft");i(o,d,p,"\u22EC","\\ntrianglelefteq",!0);i(o,d,p,"\u228A","\\subsetneq",!0);i(o,d,p,"\uE01A","\\@varsubsetneq");i(o,d,p,"\u2ACB","\\subsetneqq",!0);i(o,d,p,"\uE017","\\@varsubsetneqq");i(o,d,p,"\u226F","\\ngtr",!0);i(o,d,p,"\uE00F","\\@ngeqslant");i(o,d,p,"\uE00E","\\@ngeqq");i(o,d,p,"\u2A88","\\gneq",!0);i(o,d,p,"\u2269","\\gneqq",!0);i(o,d,p,"\uE00D","\\@gvertneqq");i(o,d,p,"\u22E7","\\gnsim",!0);i(o,d,p,"\u2A8A","\\gnapprox",!0);i(o,d,p,"\u2281","\\nsucc",!0);i(o,d,p,"\u22E1","\\nsucceq",!0);i(o,d,p,"\u22E9","\\succnsim",!0);i(o,d,p,"\u2ABA","\\succnapprox",!0);i(o,d,p,"\u2246","\\ncong",!0);i(o,d,p,"\uE007","\\@nshortparallel");i(o,d,p,"\u2226","\\nparallel",!0);i(o,d,p,"\u22AF","\\nVDash",!0);i(o,d,p,"\u22EB","\\ntriangleright");i(o,d,p,"\u22ED","\\ntrianglerighteq",!0);i(o,d,p,"\uE018","\\@nsupseteqq");i(o,d,p,"\u228B","\\supsetneq",!0);i(o,d,p,"\uE01B","\\@varsupsetneq");i(o,d,p,"\u2ACC","\\supsetneqq",!0);i(o,d,p,"\uE019","\\@varsupsetneqq");i(o,d,p,"\u22AE","\\nVdash",!0);i(o,d,p,"\u2AB5","\\precneqq",!0);i(o,d,p,"\u2AB6","\\succneqq",!0);i(o,d,p,"\uE016","\\@nsubseteqq");i(o,d,C,"\u22B4","\\unlhd");i(o,d,C,"\u22B5","\\unrhd");i(o,d,p,"\u219A","\\nleftarrow",!0);i(o,d,p,"\u219B","\\nrightarrow",!0);i(o,d,p,"\u21CD","\\nLeftarrow",!0);i(o,d,p,"\u21CF","\\nRightarrow",!0);i(o,d,p,"\u21AE","\\nleftrightarrow",!0);i(o,d,p,"\u21CE","\\nLeftrightarrow",!0);i(o,d,p,"\u25B3","\\vartriangle");i(o,d,g,"\u210F","\\hslash");i(o,d,g,"\u25BD","\\triangledown");i(o,d,g,"\u25CA","\\lozenge");i(o,d,g,"\u24C8","\\circledS");i(o,d,g,"\xAE","\\circledR");i(k,d,g,"\xAE","\\circledR");i(o,d,g,"\u2221","\\measuredangle",!0);i(o,d,g,"\u2204","\\nexists");i(o,d,g,"\u2127","\\mho");i(o,d,g,"\u2132","\\Finv",!0);i(o,d,g,"\u2141","\\Game",!0);i(o,d,g,"\u2035","\\backprime");i(o,d,g,"\u25B2","\\blacktriangle");i(o,d,g,"\u25BC","\\blacktriangledown");i(o,d,g,"\u25A0","\\blacksquare");i(o,d,g,"\u29EB","\\blacklozenge");i(o,d,g,"\u2605","\\bigstar");i(o,d,g,"\u2222","\\sphericalangle",!0);i(o,d,g,"\u2201","\\complement",!0);i(o,d,g,"\xF0","\\eth",!0);i(k,u,g,"\xF0","\xF0");i(o,d,g,"\u2571","\\diagup");i(o,d,g,"\u2572","\\diagdown");i(o,d,g,"\u25A1","\\square");i(o,d,g,"\u25A1","\\Box");i(o,d,g,"\u25CA","\\Diamond");i(o,d,g,"\xA5","\\yen",!0);i(k,d,g,"\xA5","\\yen",!0);i(o,d,g,"\u2713","\\checkmark",!0);i(k,d,g,"\u2713","\\checkmark");i(o,d,g,"\u2136","\\beth",!0);i(o,d,g,"\u2138","\\daleth",!0);i(o,d,g,"\u2137","\\gimel",!0);i(o,d,g,"\u03DD","\\digamma",!0);i(o,d,g,"\u03F0","\\varkappa");i(o,d,p0,"\u250C","\\@ulcorner",!0);i(o,d,l0,"\u2510","\\@urcorner",!0);i(o,d,p0,"\u2514","\\@llcorner",!0);i(o,d,l0,"\u2518","\\@lrcorner",!0);i(o,d,p,"\u2266","\\leqq",!0);i(o,d,p,"\u2A7D","\\leqslant",!0);i(o,d,p,"\u2A95","\\eqslantless",!0);i(o,d,p,"\u2272","\\lesssim",!0);i(o,d,p,"\u2A85","\\lessapprox",!0);i(o,d,p,"\u224A","\\approxeq",!0);i(o,d,C,"\u22D6","\\lessdot");i(o,d,p,"\u22D8","\\lll",!0);i(o,d,p,"\u2276","\\lessgtr",!0);i(o,d,p,"\u22DA","\\lesseqgtr",!0);i(o,d,p,"\u2A8B","\\lesseqqgtr",!0);i(o,d,p,"\u2251","\\doteqdot");i(o,d,p,"\u2253","\\risingdotseq",!0);i(o,d,p,"\u2252","\\fallingdotseq",!0);i(o,d,p,"\u223D","\\backsim",!0);i(o,d,p,"\u22CD","\\backsimeq",!0);i(o,d,p,"\u2AC5","\\subseteqq",!0);i(o,d,p,"\u22D0","\\Subset",!0);i(o,d,p,"\u228F","\\sqsubset",!0);i(o,d,p,"\u227C","\\preccurlyeq",!0);i(o,d,p,"\u22DE","\\curlyeqprec",!0);i(o,d,p,"\u227E","\\precsim",!0);i(o,d,p,"\u2AB7","\\precapprox",!0);i(o,d,p,"\u22B2","\\vartriangleleft");i(o,d,p,"\u22B4","\\trianglelefteq");i(o,d,p,"\u22A8","\\vDash",!0);i(o,d,p,"\u22AA","\\Vvdash",!0);i(o,d,p,"\u2323","\\smallsmile");i(o,d,p,"\u2322","\\smallfrown");i(o,d,p,"\u224F","\\bumpeq",!0);i(o,d,p,"\u224E","\\Bumpeq",!0);i(o,d,p,"\u2267","\\geqq",!0);i(o,d,p,"\u2A7E","\\geqslant",!0);i(o,d,p,"\u2A96","\\eqslantgtr",!0);i(o,d,p,"\u2273","\\gtrsim",!0);i(o,d,p,"\u2A86","\\gtrapprox",!0);i(o,d,C,"\u22D7","\\gtrdot");i(o,d,p,"\u22D9","\\ggg",!0);i(o,d,p,"\u2277","\\gtrless",!0);i(o,d,p,"\u22DB","\\gtreqless",!0);i(o,d,p,"\u2A8C","\\gtreqqless",!0);i(o,d,p,"\u2256","\\eqcirc",!0);i(o,d,p,"\u2257","\\circeq",!0);i(o,d,p,"\u225C","\\triangleq",!0);i(o,d,p,"\u223C","\\thicksim");i(o,d,p,"\u2248","\\thickapprox");i(o,d,p,"\u2AC6","\\supseteqq",!0);i(o,d,p,"\u22D1","\\Supset",!0);i(o,d,p,"\u2290","\\sqsupset",!0);i(o,d,p,"\u227D","\\succcurlyeq",!0);i(o,d,p,"\u22DF","\\curlyeqsucc",!0);i(o,d,p,"\u227F","\\succsim",!0);i(o,d,p,"\u2AB8","\\succapprox",!0);i(o,d,p,"\u22B3","\\vartriangleright");i(o,d,p,"\u22B5","\\trianglerighteq");i(o,d,p,"\u22A9","\\Vdash",!0);i(o,d,p,"\u2223","\\shortmid");i(o,d,p,"\u2225","\\shortparallel");i(o,d,p,"\u226C","\\between",!0);i(o,d,p,"\u22D4","\\pitchfork",!0);i(o,d,p,"\u221D","\\varpropto");i(o,d,p,"\u25C0","\\blacktriangleleft");i(o,d,p,"\u2234","\\therefore",!0);i(o,d,p,"\u220D","\\backepsilon");i(o,d,p,"\u25B6","\\blacktriangleright");i(o,d,p,"\u2235","\\because",!0);i(o,d,p,"\u22D8","\\llless");i(o,d,p,"\u22D9","\\gggtr");i(o,d,C,"\u22B2","\\lhd");i(o,d,C,"\u22B3","\\rhd");i(o,d,p,"\u2242","\\eqsim",!0);i(o,u,p,"\u22C8","\\Join");i(o,d,p,"\u2251","\\Doteq",!0);i(o,d,C,"\u2214","\\dotplus",!0);i(o,d,C,"\u2216","\\smallsetminus");i(o,d,C,"\u22D2","\\Cap",!0);i(o,d,C,"\u22D3","\\Cup",!0);i(o,d,C,"\u2A5E","\\doublebarwedge",!0);i(o,d,C,"\u229F","\\boxminus",!0);i(o,d,C,"\u229E","\\boxplus",!0);i(o,d,C,"\u22C7","\\divideontimes",!0);i(o,d,C,"\u22C9","\\ltimes",!0);i(o,d,C,"\u22CA","\\rtimes",!0);i(o,d,C,"\u22CB","\\leftthreetimes",!0);i(o,d,C,"\u22CC","\\rightthreetimes",!0);i(o,d,C,"\u22CF","\\curlywedge",!0);i(o,d,C,"\u22CE","\\curlyvee",!0);i(o,d,C,"\u229D","\\circleddash",!0);i(o,d,C,"\u229B","\\circledast",!0);i(o,d,C,"\u22C5","\\centerdot");i(o,d,C,"\u22BA","\\intercal",!0);i(o,d,C,"\u22D2","\\doublecap");i(o,d,C,"\u22D3","\\doublecup");i(o,d,C,"\u22A0","\\boxtimes",!0);i(o,d,p,"\u21E2","\\dashrightarrow",!0);i(o,d,p,"\u21E0","\\dashleftarrow",!0);i(o,d,p,"\u21C7","\\leftleftarrows",!0);i(o,d,p,"\u21C6","\\leftrightarrows",!0);i(o,d,p,"\u21DA","\\Lleftarrow",!0);i(o,d,p,"\u219E","\\twoheadleftarrow",!0);i(o,d,p,"\u21A2","\\leftarrowtail",!0);i(o,d,p,"\u21AB","\\looparrowleft",!0);i(o,d,p,"\u21CB","\\leftrightharpoons",!0);i(o,d,p,"\u21B6","\\curvearrowleft",!0);i(o,d,p,"\u21BA","\\circlearrowleft",!0);i(o,d,p,"\u21B0","\\Lsh",!0);i(o,d,p,"\u21C8","\\upuparrows",!0);i(o,d,p,"\u21BF","\\upharpoonleft",!0);i(o,d,p,"\u21C3","\\downharpoonleft",!0);i(o,u,p,"\u22B6","\\origof",!0);i(o,u,p,"\u22B7","\\imageof",!0);i(o,d,p,"\u22B8","\\multimap",!0);i(o,d,p,"\u21AD","\\leftrightsquigarrow",!0);i(o,d,p,"\u21C9","\\rightrightarrows",!0);i(o,d,p,"\u21C4","\\rightleftarrows",!0);i(o,d,p,"\u21A0","\\twoheadrightarrow",!0);i(o,d,p,"\u21A3","\\rightarrowtail",!0);i(o,d,p,"\u21AC","\\looparrowright",!0);i(o,d,p,"\u21B7","\\curvearrowright",!0);i(o,d,p,"\u21BB","\\circlearrowright",!0);i(o,d,p,"\u21B1","\\Rsh",!0);i(o,d,p,"\u21CA","\\downdownarrows",!0);i(o,d,p,"\u21BE","\\upharpoonright",!0);i(o,d,p,"\u21C2","\\downharpoonright",!0);i(o,d,p,"\u21DD","\\rightsquigarrow",!0);i(o,d,p,"\u21DD","\\leadsto");i(o,d,p,"\u21DB","\\Rrightarrow",!0);i(o,d,p,"\u21BE","\\restriction");i(o,u,g,"\u2018","`");i(o,u,g,"$","\\$");i(k,u,g,"$","\\$");i(k,u,g,"$","\\textdollar");i(o,u,g,"%","\\%");i(k,u,g,"%","\\%");i(o,u,g,"_","\\_");i(k,u,g,"_","\\_");i(k,u,g,"_","\\textunderscore");i(o,u,g,"\u2220","\\angle",!0);i(o,u,g,"\u221E","\\infty",!0);i(o,u,g,"\u2032","\\prime");i(o,u,g,"\u25B3","\\triangle");i(o,u,g,"\u0393","\\Gamma",!0);i(o,u,g,"\u0394","\\Delta",!0);i(o,u,g,"\u0398","\\Theta",!0);i(o,u,g,"\u039B","\\Lambda",!0);i(o,u,g,"\u039E","\\Xi",!0);i(o,u,g,"\u03A0","\\Pi",!0);i(o,u,g,"\u03A3","\\Sigma",!0);i(o,u,g,"\u03A5","\\Upsilon",!0);i(o,u,g,"\u03A6","\\Phi",!0);i(o,u,g,"\u03A8","\\Psi",!0);i(o,u,g,"\u03A9","\\Omega",!0);i(o,u,g,"A","\u0391");i(o,u,g,"B","\u0392");i(o,u,g,"E","\u0395");i(o,u,g,"Z","\u0396");i(o,u,g,"H","\u0397");i(o,u,g,"I","\u0399");i(o,u,g,"K","\u039A");i(o,u,g,"M","\u039C");i(o,u,g,"N","\u039D");i(o,u,g,"O","\u039F");i(o,u,g,"P","\u03A1");i(o,u,g,"T","\u03A4");i(o,u,g,"X","\u03A7");i(o,u,g,"\xAC","\\neg",!0);i(o,u,g,"\xAC","\\lnot");i(o,u,g,"\u22A4","\\top");i(o,u,g,"\u22A5","\\bot");i(o,u,g,"\u2205","\\emptyset");i(o,d,g,"\u2205","\\varnothing");i(o,u,I,"\u03B1","\\alpha",!0);i(o,u,I,"\u03B2","\\beta",!0);i(o,u,I,"\u03B3","\\gamma",!0);i(o,u,I,"\u03B4","\\delta",!0);i(o,u,I,"\u03F5","\\epsilon",!0);i(o,u,I,"\u03B6","\\zeta",!0);i(o,u,I,"\u03B7","\\eta",!0);i(o,u,I,"\u03B8","\\theta",!0);i(o,u,I,"\u03B9","\\iota",!0);i(o,u,I,"\u03BA","\\kappa",!0);i(o,u,I,"\u03BB","\\lambda",!0);i(o,u,I,"\u03BC","\\mu",!0);i(o,u,I,"\u03BD","\\nu",!0);i(o,u,I,"\u03BE","\\xi",!0);i(o,u,I,"\u03BF","\\omicron",!0);i(o,u,I,"\u03C0","\\pi",!0);i(o,u,I,"\u03C1","\\rho",!0);i(o,u,I,"\u03C3","\\sigma",!0);i(o,u,I,"\u03C4","\\tau",!0);i(o,u,I,"\u03C5","\\upsilon",!0);i(o,u,I,"\u03D5","\\phi",!0);i(o,u,I,"\u03C7","\\chi",!0);i(o,u,I,"\u03C8","\\psi",!0);i(o,u,I,"\u03C9","\\omega",!0);i(o,u,I,"\u03B5","\\varepsilon",!0);i(o,u,I,"\u03D1","\\vartheta",!0);i(o,u,I,"\u03D6","\\varpi",!0);i(o,u,I,"\u03F1","\\varrho",!0);i(o,u,I,"\u03C2","\\varsigma",!0);i(o,u,I,"\u03C6","\\varphi",!0);i(o,u,C,"\u2217","*",!0);i(o,u,C,"+","+");i(o,u,C,"\u2212","-",!0);i(o,u,C,"\u22C5","\\cdot",!0);i(o,u,C,"\u2218","\\circ",!0);i(o,u,C,"\xF7","\\div",!0);i(o,u,C,"\xB1","\\pm",!0);i(o,u,C,"\xD7","\\times",!0);i(o,u,C,"\u2229","\\cap",!0);i(o,u,C,"\u222A","\\cup",!0);i(o,u,C,"\u2216","\\setminus",!0);i(o,u,C,"\u2227","\\land");i(o,u,C,"\u2228","\\lor");i(o,u,C,"\u2227","\\wedge",!0);i(o,u,C,"\u2228","\\vee",!0);i(o,u,g,"\u221A","\\surd");i(o,u,p0,"\u27E8","\\langle",!0);i(o,u,p0,"\u2223","\\lvert");i(o,u,p0,"\u2225","\\lVert");i(o,u,l0,"?","?");i(o,u,l0,"!","!");i(o,u,l0,"\u27E9","\\rangle",!0);i(o,u,l0,"\u2223","\\rvert");i(o,u,l0,"\u2225","\\rVert");i(o,u,p,"=","=");i(o,u,p,":",":");i(o,u,p,"\u2248","\\approx",!0);i(o,u,p,"\u2245","\\cong",!0);i(o,u,p,"\u2265","\\ge");i(o,u,p,"\u2265","\\geq",!0);i(o,u,p,"\u2190","\\gets");i(o,u,p,">","\\gt",!0);i(o,u,p,"\u2208","\\in",!0);i(o,u,p,"\uE020","\\@not");i(o,u,p,"\u2282","\\subset",!0);i(o,u,p,"\u2283","\\supset",!0);i(o,u,p,"\u2286","\\subseteq",!0);i(o,u,p,"\u2287","\\supseteq",!0);i(o,d,p,"\u2288","\\nsubseteq",!0);i(o,d,p,"\u2289","\\nsupseteq",!0);i(o,u,p,"\u22A8","\\models");i(o,u,p,"\u2190","\\leftarrow",!0);i(o,u,p,"\u2264","\\le");i(o,u,p,"\u2264","\\leq",!0);i(o,u,p,"<","\\lt",!0);i(o,u,p,"\u2192","\\rightarrow",!0);i(o,u,p,"\u2192","\\to");i(o,d,p,"\u2271","\\ngeq",!0);i(o,d,p,"\u2270","\\nleq",!0);i(o,u,R0,"\xA0","\\ ");i(o,u,R0,"\xA0","\\space");i(o,u,R0,"\xA0","\\nobreakspace");i(k,u,R0,"\xA0","\\ ");i(k,u,R0,"\xA0"," ");i(k,u,R0,"\xA0","\\space");i(k,u,R0,"\xA0","\\nobreakspace");i(o,u,R0,null,"\\nobreak");i(o,u,R0,null,"\\allowbreak");i(o,u,Ve,",",",");i(o,u,Ve,";",";");i(o,d,C,"\u22BC","\\barwedge",!0);i(o,d,C,"\u22BB","\\veebar",!0);i(o,u,C,"\u2299","\\odot",!0);i(o,u,C,"\u2295","\\oplus",!0);i(o,u,C,"\u2297","\\otimes",!0);i(o,u,g,"\u2202","\\partial",!0);i(o,u,C,"\u2298","\\oslash",!0);i(o,d,C,"\u229A","\\circledcirc",!0);i(o,d,C,"\u22A1","\\boxdot",!0);i(o,u,C,"\u25B3","\\bigtriangleup");i(o,u,C,"\u25BD","\\bigtriangledown");i(o,u,C,"\u2020","\\dagger");i(o,u,C,"\u22C4","\\diamond");i(o,u,C,"\u22C6","\\star");i(o,u,C,"\u25C3","\\triangleleft");i(o,u,C,"\u25B9","\\triangleright");i(o,u,p0,"{","\\{");i(k,u,g,"{","\\{");i(k,u,g,"{","\\textbraceleft");i(o,u,l0,"}","\\}");i(k,u,g,"}","\\}");i(k,u,g,"}","\\textbraceright");i(o,u,p0,"{","\\lbrace");i(o,u,l0,"}","\\rbrace");i(o,u,p0,"[","\\lbrack",!0);i(k,u,g,"[","\\lbrack",!0);i(o,u,l0,"]","\\rbrack",!0);i(k,u,g,"]","\\rbrack",!0);i(o,u,p0,"(","\\lparen",!0);i(o,u,l0,")","\\rparen",!0);i(k,u,g,"<","\\textless",!0);i(k,u,g,">","\\textgreater",!0);i(o,u,p0,"\u230A","\\lfloor",!0);i(o,u,l0,"\u230B","\\rfloor",!0);i(o,u,p0,"\u2308","\\lceil",!0);i(o,u,l0,"\u2309","\\rceil",!0);i(o,u,g,"\\","\\backslash");i(o,u,g,"\u2223","|");i(o,u,g,"\u2223","\\vert");i(k,u,g,"|","\\textbar",!0);i(o,u,g,"\u2225","\\|");i(o,u,g,"\u2225","\\Vert");i(k,u,g,"\u2225","\\textbardbl");i(k,u,g,"~","\\textasciitilde");i(k,u,g,"\\","\\textbackslash");i(k,u,g,"^","\\textasciicircum");i(o,u,p,"\u2191","\\uparrow",!0);i(o,u,p,"\u21D1","\\Uparrow",!0);i(o,u,p,"\u2193","\\downarrow",!0);i(o,u,p,"\u21D3","\\Downarrow",!0);i(o,u,p,"\u2195","\\updownarrow",!0);i(o,u,p,"\u21D5","\\Updownarrow",!0);i(o,u,t0,"\u2210","\\coprod");i(o,u,t0,"\u22C1","\\bigvee");i(o,u,t0,"\u22C0","\\bigwedge");i(o,u,t0,"\u2A04","\\biguplus");i(o,u,t0,"\u22C2","\\bigcap");i(o,u,t0,"\u22C3","\\bigcup");i(o,u,t0,"\u222B","\\int");i(o,u,t0,"\u222B","\\intop");i(o,u,t0,"\u222C","\\iint");i(o,u,t0,"\u222D","\\iiint");i(o,u,t0,"\u220F","\\prod");i(o,u,t0,"\u2211","\\sum");i(o,u,t0,"\u2A02","\\bigotimes");i(o,u,t0,"\u2A01","\\bigoplus");i(o,u,t0,"\u2A00","\\bigodot");i(o,u,t0,"\u222E","\\oint");i(o,u,t0,"\u222F","\\oiint");i(o,u,t0,"\u2230","\\oiiint");i(o,u,t0,"\u2A06","\\bigsqcup");i(o,u,t0,"\u222B","\\smallint");i(k,u,ie,"\u2026","\\textellipsis");i(o,u,ie,"\u2026","\\mathellipsis");i(k,u,ie,"\u2026","\\ldots",!0);i(o,u,ie,"\u2026","\\ldots",!0);i(o,u,ie,"\u22EF","\\@cdots",!0);i(o,u,ie,"\u22F1","\\ddots",!0);i(o,u,g,"\u22EE","\\varvdots");i(k,u,g,"\u22EE","\\varvdots");i(o,u,Z,"\u02CA","\\acute");i(o,u,Z,"\u02CB","\\grave");i(o,u,Z,"\xA8","\\ddot");i(o,u,Z,"~","\\tilde");i(o,u,Z,"\u02C9","\\bar");i(o,u,Z,"\u02D8","\\breve");i(o,u,Z,"\u02C7","\\check");i(o,u,Z,"^","\\hat");i(o,u,Z,"\u20D7","\\vec");i(o,u,Z,"\u02D9","\\dot");i(o,u,Z,"\u02DA","\\mathring");i(o,u,I,"\uE131","\\@imath");i(o,u,I,"\uE237","\\@jmath");i(o,u,g,"\u0131","\u0131");i(o,u,g,"\u0237","\u0237");i(k,u,g,"\u0131","\\i",!0);i(k,u,g,"\u0237","\\j",!0);i(k,u,g,"\xDF","\\ss",!0);i(k,u,g,"\xE6","\\ae",!0);i(k,u,g,"\u0153","\\oe",!0);i(k,u,g,"\xF8","\\o",!0);i(k,u,g,"\xC6","\\AE",!0);i(k,u,g,"\u0152","\\OE",!0);i(k,u,g,"\xD8","\\O",!0);i(k,u,Z,"\u02CA","\\'");i(k,u,Z,"\u02CB","\\`");i(k,u,Z,"\u02C6","\\^");i(k,u,Z,"\u02DC","\\~");i(k,u,Z,"\u02C9","\\=");i(k,u,Z,"\u02D8","\\u");i(k,u,Z,"\u02D9","\\.");i(k,u,Z,"\xB8","\\c");i(k,u,Z,"\u02DA","\\r");i(k,u,Z,"\u02C7","\\v");i(k,u,Z,"\xA8",'\\"');i(k,u,Z,"\u02DD","\\H");i(k,u,Z,"\u25EF","\\textcircled");var Cr={"--":!0,"---":!0,"``":!0,"''":!0};i(k,u,g,"\u2013","--",!0);i(k,u,g,"\u2013","\\textendash");i(k,u,g,"\u2014","---",!0);i(k,u,g,"\u2014","\\textemdash");i(k,u,g,"\u2018","`",!0);i(k,u,g,"\u2018","\\textquoteleft");i(k,u,g,"\u2019","'",!0);i(k,u,g,"\u2019","\\textquoteright");i(k,u,g,"\u201C","``",!0);i(k,u,g,"\u201C","\\textquotedblleft");i(k,u,g,"\u201D","''",!0);i(k,u,g,"\u201D","\\textquotedblright");i(o,u,g,"\xB0","\\degree",!0);i(k,u,g,"\xB0","\\degree");i(k,u,g,"\xB0","\\textdegree",!0);i(o,u,g,"\xA3","\\pounds");i(o,u,g,"\xA3","\\mathsterling",!0);i(k,u,g,"\xA3","\\pounds");i(k,u,g,"\xA3","\\textsterling",!0);i(o,d,g,"\u2720","\\maltese");i(k,d,g,"\u2720","\\maltese");var Qt='0123456789/@."';for(Me=0;Me0)return w0(s,f,n,t,l.concat(v));if(c){var b,x;if(c==="boldsymbol"){var w=u1(s,n,t,l,a);b=w.fontName,x=[w.fontClass]}else h?(b=Or[c].fontName,x=[c]):(b=Be(c,t.fontWeight,t.fontShape),x=[c,t.fontWeight,t.fontShape]);if(Ue(s,b,n).metrics)return w0(s,b,n,t,l.concat(x));if(Cr.hasOwnProperty(s)&&b.slice(0,10)==="Typewriter"){for(var A=[],q=0;q{if(G0(r.classes)!==G0(e.classes)||r.skew!==e.skew||r.maxFontSize!==e.maxFontSize)return!1;if(r.classes.length===1){var t=r.classes[0];if(t==="mbin"||t==="mord")return!1}for(var a in r.style)if(r.style.hasOwnProperty(a)&&r.style[a]!==e.style[a])return!1;for(var n in e.style)if(e.style.hasOwnProperty(n)&&r.style[n]!==e.style[n])return!1;return!0},m1=r=>{for(var e=0;et&&(t=l.height),l.depth>a&&(a=l.depth),l.maxFontSize>n&&(n=l.maxFontSize)}e.height=t,e.depth=a,e.maxFontSize=n},h0=function(e,t,a,n){var s=new Z0(e,t,a,n);return qt(s),s},_r=(r,e,t,a)=>new Z0(r,e,t,a),d1=function(e,t,a){var n=h0([e],[],t);return n.height=Math.max(a||t.fontMetrics().defaultRuleThickness,t.minRuleThickness),n.style.borderBottomWidth=T(n.height),n.maxFontSize=1,n},p1=function(e,t,a,n){var s=new fe(e,t,a,n);return qt(s),s},Nr=function(e){var t=new Y0(e);return qt(t),t},f1=function(e,t){return e instanceof Y0?h0([],[e],t):e},v1=function(e){if(e.positionType==="individualShift"){for(var t=e.children,a=[t[0]],n=-t[0].shift-t[0].elem.depth,s=n,l=1;l{var t=h0(["mspace"],[],e),a=Q(r,e);return t.style.marginRight=T(a),t},Be=function(e,t,a){var n="";switch(e){case"amsrm":n="AMS";break;case"textrm":n="Main";break;case"textsf":n="SansSerif";break;case"texttt":n="Typewriter";break;default:n=e}var s;return t==="textbf"&&a==="textit"?s="BoldItalic":t==="textbf"?s="Bold":t==="textit"?s="Italic":s="Regular",n+"-"+s},Or={mathbf:{variant:"bold",fontName:"Main-Bold"},mathrm:{variant:"normal",fontName:"Main-Regular"},textit:{variant:"italic",fontName:"Main-Italic"},mathit:{variant:"italic",fontName:"Main-Italic"},mathnormal:{variant:"italic",fontName:"Math-Italic"},mathsfit:{variant:"sans-serif-italic",fontName:"SansSerif-Italic"},mathbb:{variant:"double-struck",fontName:"AMS-Regular"},mathcal:{variant:"script",fontName:"Caligraphic-Regular"},mathfrak:{variant:"fraktur",fontName:"Fraktur-Regular"},mathscr:{variant:"script",fontName:"Script-Regular"},mathsf:{variant:"sans-serif",fontName:"SansSerif-Regular"},mathtt:{variant:"monospace",fontName:"Typewriter-Regular"}},Ir={vec:["vec",.471,.714],oiintSize1:["oiintSize1",.957,.499],oiintSize2:["oiintSize2",1.472,.659],oiiintSize1:["oiiintSize1",1.304,.499],oiiintSize2:["oiiintSize2",1.98,.659]},y1=function(e,t){var[a,n,s]=Ir[e],l=new A0(a),h=new S0([l],{width:T(n),height:T(s),style:"width:"+T(n),viewBox:"0 0 "+1e3*n+" "+1e3*s,preserveAspectRatio:"xMinYMin"}),c=_r(["overlay"],[h],t);return c.height=s,c.style.height=T(s),c.style.width=T(n),c},y={fontMap:Or,makeSymbol:w0,mathsym:l1,makeSpan:h0,makeSvgSpan:_r,makeLineSpan:d1,makeAnchor:p1,makeFragment:Nr,wrapFragment:f1,makeVList:g1,makeOrd:h1,makeGlue:b1,staticSvg:y1,svgData:Ir,tryCombineChars:m1},J={number:3,unit:"mu"},W0={number:4,unit:"mu"},_0={number:5,unit:"mu"},x1={mord:{mop:J,mbin:W0,mrel:_0,minner:J},mop:{mord:J,mop:J,mrel:_0,minner:J},mbin:{mord:W0,mop:W0,mopen:W0,minner:W0},mrel:{mord:_0,mop:_0,mopen:_0,minner:_0},mopen:{},mclose:{mop:J,mbin:W0,mrel:_0,minner:J},mpunct:{mord:J,mop:J,mrel:_0,mopen:J,mclose:J,mpunct:J,minner:J},minner:{mord:J,mop:J,mbin:W0,mrel:_0,mopen:J,mpunct:J,minner:J}},w1={mord:{mop:J},mop:{mord:J,mop:J},mbin:{},mrel:{},mopen:{},mclose:{mop:J},mpunct:{},minner:{mop:J}},Er={},Le={},Fe={};function B(r){for(var{type:e,names:t,props:a,handler:n,htmlBuilder:s,mathmlBuilder:l}=r,h={type:e,numArgs:a.numArgs,argTypes:a.argTypes,allowedInArgument:!!a.allowedInArgument,allowedInText:!!a.allowedInText,allowedInMath:a.allowedInMath===void 0?!0:a.allowedInMath,numOptionalArgs:a.numOptionalArgs||0,infix:!!a.infix,primitive:!!a.primitive,handler:n},c=0;c{var _=q.classes[0],D=A.classes[0];_==="mbin"&&O.contains(k1,D)?q.classes[0]="mord":D==="mbin"&&O.contains(S1,_)&&(A.classes[0]="mord")},{node:b},x,w),rr(s,(A,q)=>{var _=bt(q),D=bt(A),N=_&&D?A.hasClass("mtight")?w1[_][D]:x1[_][D]:null;if(N)return y.makeGlue(N,f)},{node:b},x,w),s},rr=function r(e,t,a,n,s){n&&e.push(n);for(var l=0;lx=>{e.splice(b+1,0,x),l++})(l)}n&&e.pop()},Rr=function(e){return e instanceof Y0||e instanceof fe||e instanceof Z0&&e.hasClass("enclosing")?e:null},A1=function r(e,t){var a=Rr(e);if(a){var n=a.children;if(n.length){if(t==="right")return r(n[n.length-1],"right");if(t==="left")return r(n[0],"left")}}return e},bt=function(e,t){return e?(t&&(e=A1(e,t)),z1[e.classes[0]]||null):null},ge=function(e,t){var a=["nulldelimiter"].concat(e.baseSizingClasses());return I0(t.concat(a))},G=function(e,t,a){if(!e)return I0();if(Le[e.type]){var n=Le[e.type](e,t);if(a&&t.size!==a.size){n=I0(t.sizingClasses(a),[n],t);var s=t.sizeMultiplier/a.sizeMultiplier;n.height*=s,n.depth*=s}return n}else throw new z("Got group of unknown type: '"+e.type+"'")};function De(r,e){var t=I0(["base"],r,e),a=I0(["strut"]);return a.style.height=T(t.height+t.depth),t.depth&&(a.style.verticalAlign=T(-t.depth)),t.children.unshift(a),t}function yt(r,e){var t=null;r.length===1&&r[0].type==="tag"&&(t=r[0].tag,r=r[0].body);var a=a0(r,e,"root"),n;a.length===2&&a[1].hasClass("tag")&&(n=a.pop());for(var s=[],l=[],h=0;h0&&(s.push(De(l,e)),l=[]),s.push(a[h]));l.length>0&&s.push(De(l,e));var f;t?(f=De(a0(t,e,!0)),f.classes=["tag"],s.push(f)):n&&s.push(n);var v=I0(["katex-html"],s);if(v.setAttribute("aria-hidden","true"),f){var b=f.children[0];b.style.height=T(v.height+v.depth),v.depth&&(b.style.verticalAlign=T(-v.depth))}return v}function $r(r){return new Y0(r)}var s0=class{constructor(e,t,a){this.type=void 0,this.attributes=void 0,this.children=void 0,this.classes=void 0,this.type=e,this.attributes={},this.children=t||[],this.classes=a||[]}setAttribute(e,t){this.attributes[e]=t}getAttribute(e){return this.attributes[e]}toNode(){var e=document.createElementNS("http://www.w3.org/1998/Math/MathML",this.type);for(var t in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,t)&&e.setAttribute(t,this.attributes[t]);this.classes.length>0&&(e.className=G0(this.classes));for(var a=0;a0&&(e+=' class ="'+O.escape(G0(this.classes))+'"'),e+=">";for(var a=0;a",e}toText(){return this.children.map(e=>e.toText()).join("")}},g0=class{constructor(e){this.text=void 0,this.text=e}toNode(){return document.createTextNode(this.text)}toMarkup(){return O.escape(this.toText())}toText(){return this.text}},xt=class{constructor(e){this.width=void 0,this.character=void 0,this.width=e,e>=.05555&&e<=.05556?this.character="\u200A":e>=.1666&&e<=.1667?this.character="\u2009":e>=.2222&&e<=.2223?this.character="\u2005":e>=.2777&&e<=.2778?this.character="\u2005\u200A":e>=-.05556&&e<=-.05555?this.character="\u200A\u2063":e>=-.1667&&e<=-.1666?this.character="\u2009\u2063":e>=-.2223&&e<=-.2222?this.character="\u205F\u2063":e>=-.2778&&e<=-.2777?this.character="\u2005\u2063":this.character=null}toNode(){if(this.character)return document.createTextNode(this.character);var e=document.createElementNS("http://www.w3.org/1998/Math/MathML","mspace");return e.setAttribute("width",T(this.width)),e}toMarkup(){return this.character?""+this.character+"":''}toText(){return this.character?this.character:" "}},M={MathNode:s0,TextNode:g0,SpaceNode:xt,newDocumentFragment:$r},y0=function(e,t,a){return Y[t][e]&&Y[t][e].replace&&e.charCodeAt(0)!==55349&&!(Cr.hasOwnProperty(e)&&a&&(a.fontFamily&&a.fontFamily.slice(4,6)==="tt"||a.font&&a.font.slice(4,6)==="tt"))&&(e=Y[t][e].replace),new M.TextNode(e)},Bt=function(e){return e.length===1?e[0]:new M.MathNode("mrow",e)},Dt=function(e,t){if(t.fontFamily==="texttt")return"monospace";if(t.fontFamily==="textsf")return t.fontShape==="textit"&&t.fontWeight==="textbf"?"sans-serif-bold-italic":t.fontShape==="textit"?"sans-serif-italic":t.fontWeight==="textbf"?"bold-sans-serif":"sans-serif";if(t.fontShape==="textit"&&t.fontWeight==="textbf")return"bold-italic";if(t.fontShape==="textit")return"italic";if(t.fontWeight==="textbf")return"bold";var a=t.font;if(!a||a==="mathnormal")return null;var n=e.mode;if(a==="mathit")return"italic";if(a==="boldsymbol")return e.type==="textord"?"bold":"bold-italic";if(a==="mathbf")return"bold";if(a==="mathbb")return"double-struck";if(a==="mathsfit")return"sans-serif-italic";if(a==="mathfrak")return"fraktur";if(a==="mathscr"||a==="mathcal")return"script";if(a==="mathsf")return"sans-serif";if(a==="mathtt")return"monospace";var s=e.text;if(O.contains(["\\imath","\\jmath"],s))return null;Y[n][s]&&Y[n][s].replace&&(s=Y[n][s].replace);var l=y.fontMap[a].fontName;return Tt(s,l,n)?y.fontMap[a].variant:null};function nt(r){if(!r)return!1;if(r.type==="mi"&&r.children.length===1){var e=r.children[0];return e instanceof g0&&e.text==="."}else if(r.type==="mo"&&r.children.length===1&&r.getAttribute("separator")==="true"&&r.getAttribute("lspace")==="0em"&&r.getAttribute("rspace")==="0em"){var t=r.children[0];return t instanceof g0&&t.text===","}else return!1}var m0=function(e,t,a){if(e.length===1){var n=X(e[0],t);return a&&n instanceof s0&&n.type==="mo"&&(n.setAttribute("lspace","0em"),n.setAttribute("rspace","0em")),[n]}for(var s=[],l,h=0;h=1&&(l.type==="mn"||nt(l))){var f=c.children[0];f instanceof s0&&f.type==="mn"&&(f.children=[...l.children,...f.children],s.pop())}else if(l.type==="mi"&&l.children.length===1){var v=l.children[0];if(v instanceof g0&&v.text==="\u0338"&&(c.type==="mo"||c.type==="mi"||c.type==="mn")){var b=c.children[0];b instanceof g0&&b.text.length>0&&(b.text=b.text.slice(0,1)+"\u0338"+b.text.slice(1),s.pop())}}}s.push(c),l=c}return s},V0=function(e,t,a){return Bt(m0(e,t,a))},X=function(e,t){if(!e)return new M.MathNode("mrow");if(Fe[e.type]){var a=Fe[e.type](e,t);return a}else throw new z("Got group of unknown type: '"+e.type+"'")};function ar(r,e,t,a,n){var s=m0(r,t),l;s.length===1&&s[0]instanceof s0&&O.contains(["mrow","mtable"],s[0].type)?l=s[0]:l=new M.MathNode("mrow",s);var h=new M.MathNode("annotation",[new M.TextNode(e)]);h.setAttribute("encoding","application/x-tex");var c=new M.MathNode("semantics",[l,h]),f=new M.MathNode("math",[c]);f.setAttribute("xmlns","http://www.w3.org/1998/Math/MathML"),a&&f.setAttribute("display","block");var v=n?"katex":"katex-mathml";return y.makeSpan([v],[f])}var Lr=function(e){return new Re({style:e.displayMode?E.DISPLAY:E.TEXT,maxSize:e.maxSize,minRuleThickness:e.minRuleThickness})},Fr=function(e,t){if(t.displayMode){var a=["katex-display"];t.leqno&&a.push("leqno"),t.fleqn&&a.push("fleqn"),e=y.makeSpan(a,[e])}return e},T1=function(e,t,a){var n=Lr(a),s;if(a.output==="mathml")return ar(e,t,n,a.displayMode,!0);if(a.output==="html"){var l=yt(e,n);s=y.makeSpan(["katex"],[l])}else{var h=ar(e,t,n,a.displayMode,!1),c=yt(e,n);s=y.makeSpan(["katex"],[h,c])}return Fr(s,a)},q1=function(e,t,a){var n=Lr(a),s=yt(e,n),l=y.makeSpan(["katex"],[s]);return Fr(l,a)},B1={widehat:"^",widecheck:"\u02C7",widetilde:"~",utilde:"~",overleftarrow:"\u2190",underleftarrow:"\u2190",xleftarrow:"\u2190",overrightarrow:"\u2192",underrightarrow:"\u2192",xrightarrow:"\u2192",underbrace:"\u23DF",overbrace:"\u23DE",overgroup:"\u23E0",undergroup:"\u23E1",overleftrightarrow:"\u2194",underleftrightarrow:"\u2194",xleftrightarrow:"\u2194",Overrightarrow:"\u21D2",xRightarrow:"\u21D2",overleftharpoon:"\u21BC",xleftharpoonup:"\u21BC",overrightharpoon:"\u21C0",xrightharpoonup:"\u21C0",xLeftarrow:"\u21D0",xLeftrightarrow:"\u21D4",xhookleftarrow:"\u21A9",xhookrightarrow:"\u21AA",xmapsto:"\u21A6",xrightharpoondown:"\u21C1",xleftharpoondown:"\u21BD",xrightleftharpoons:"\u21CC",xleftrightharpoons:"\u21CB",xtwoheadleftarrow:"\u219E",xtwoheadrightarrow:"\u21A0",xlongequal:"=",xtofrom:"\u21C4",xrightleftarrows:"\u21C4",xrightequilibrium:"\u21CC",xleftequilibrium:"\u21CB","\\cdrightarrow":"\u2192","\\cdleftarrow":"\u2190","\\cdlongequal":"="},D1=function(e){var t=new M.MathNode("mo",[new M.TextNode(B1[e.replace(/^\\/,"")])]);return t.setAttribute("stretchy","true"),t},C1={overrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],overleftarrow:[["leftarrow"],.888,522,"xMinYMin"],underrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],underleftarrow:[["leftarrow"],.888,522,"xMinYMin"],xrightarrow:[["rightarrow"],1.469,522,"xMaxYMin"],"\\cdrightarrow":[["rightarrow"],3,522,"xMaxYMin"],xleftarrow:[["leftarrow"],1.469,522,"xMinYMin"],"\\cdleftarrow":[["leftarrow"],3,522,"xMinYMin"],Overrightarrow:[["doublerightarrow"],.888,560,"xMaxYMin"],xRightarrow:[["doublerightarrow"],1.526,560,"xMaxYMin"],xLeftarrow:[["doubleleftarrow"],1.526,560,"xMinYMin"],overleftharpoon:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoonup:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoondown:[["leftharpoondown"],.888,522,"xMinYMin"],overrightharpoon:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoonup:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoondown:[["rightharpoondown"],.888,522,"xMaxYMin"],xlongequal:[["longequal"],.888,334,"xMinYMin"],"\\cdlongequal":[["longequal"],3,334,"xMinYMin"],xtwoheadleftarrow:[["twoheadleftarrow"],.888,334,"xMinYMin"],xtwoheadrightarrow:[["twoheadrightarrow"],.888,334,"xMaxYMin"],overleftrightarrow:[["leftarrow","rightarrow"],.888,522],overbrace:[["leftbrace","midbrace","rightbrace"],1.6,548],underbrace:[["leftbraceunder","midbraceunder","rightbraceunder"],1.6,548],underleftrightarrow:[["leftarrow","rightarrow"],.888,522],xleftrightarrow:[["leftarrow","rightarrow"],1.75,522],xLeftrightarrow:[["doubleleftarrow","doublerightarrow"],1.75,560],xrightleftharpoons:[["leftharpoondownplus","rightharpoonplus"],1.75,716],xleftrightharpoons:[["leftharpoonplus","rightharpoondownplus"],1.75,716],xhookleftarrow:[["leftarrow","righthook"],1.08,522],xhookrightarrow:[["lefthook","rightarrow"],1.08,522],overlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],underlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],overgroup:[["leftgroup","rightgroup"],.888,342],undergroup:[["leftgroupunder","rightgroupunder"],.888,342],xmapsto:[["leftmapsto","rightarrow"],1.5,522],xtofrom:[["leftToFrom","rightToFrom"],1.75,528],xrightleftarrows:[["baraboveleftarrow","rightarrowabovebar"],1.75,901],xrightequilibrium:[["baraboveshortleftharpoon","rightharpoonaboveshortbar"],1.75,716],xleftequilibrium:[["shortbaraboveleftharpoon","shortrightharpoonabovebar"],1.75,716]},_1=function(e){return e.type==="ordgroup"?e.body.length:1},N1=function(e,t){function a(){var h=4e5,c=e.label.slice(1);if(O.contains(["widehat","widecheck","widetilde","utilde"],c)){var f=e,v=_1(f.base),b,x,w;if(v>5)c==="widehat"||c==="widecheck"?(b=420,h=2364,w=.42,x=c+"4"):(b=312,h=2340,w=.34,x="tilde4");else{var A=[1,1,2,2,3,3][v];c==="widehat"||c==="widecheck"?(h=[0,1062,2364,2364,2364][A],b=[0,239,300,360,420][A],w=[0,.24,.3,.3,.36,.42][A],x=c+A):(h=[0,600,1033,2339,2340][A],b=[0,260,286,306,312][A],w=[0,.26,.286,.3,.306,.34][A],x="tilde"+A)}var q=new A0(x),_=new S0([q],{width:"100%",height:T(w),viewBox:"0 0 "+h+" "+b,preserveAspectRatio:"none"});return{span:y.makeSvgSpan([],[_],t),minWidth:0,height:w}}else{var D=[],N=C1[c],[$,H,F]=N,P=F/1e3,V=$.length,j,U;if(V===1){var D0=N[3];j=["hide-tail"],U=[D0]}else if(V===2)j=["halfarrow-left","halfarrow-right"],U=["xMinYMin","xMaxYMin"];else if(V===3)j=["brace-left","brace-center","brace-right"],U=["xMinYMin","xMidYMin","xMaxYMin"];else throw new Error(`Correct katexImagesData or update code here to support - `+V+" children.");for(var i0=0;i00&&(n.style.minWidth=T(s)),n},O1=function(e,t,a,n,s){var l,h=e.height+e.depth+a+n;if(/fbox|color|angl/.test(t)){if(l=y.makeSpan(["stretchy",t],[],s),t==="fbox"){var c=s.color&&s.getColor();c&&(l.style.borderColor=c)}}else{var f=[];/^[bx]cancel$/.test(t)&&f.push(new ve({x1:"0",y1:"0",x2:"100%",y2:"100%","stroke-width":"0.046em"})),/^x?cancel$/.test(t)&&f.push(new ve({x1:"0",y1:"100%",x2:"100%",y2:"0","stroke-width":"0.046em"}));var v=new S0(f,{width:"100%",height:T(h)});l=y.makeSvgSpan([],[v],s)}return l.height=h,l.style.height=T(h),l},E0={encloseSpan:O1,mathMLnode:D1,svgSpan:N1};function L(r,e){if(!r||r.type!==e)throw new Error("Expected node of type "+e+", but got "+(r?"node of type "+r.type:String(r)));return r}function Ct(r){var e=Xe(r);if(!e)throw new Error("Expected node of symbol group type, but got "+(r?"node of type "+r.type:String(r)));return e}function Xe(r){return r&&(r.type==="atom"||s1.hasOwnProperty(r.type))?r:null}var _t=(r,e)=>{var t,a,n;r&&r.type==="supsub"?(a=L(r.base,"accent"),t=a.base,r.base=t,n=n1(G(r,e)),r.base=a):(a=L(r,"accent"),t=a.base);var s=G(t,e.havingCrampedStyle()),l=a.isShifty&&O.isCharacterBox(t),h=0;if(l){var c=O.getBaseElem(t),f=G(c,e.havingCrampedStyle());h=Jt(f).skew}var v=a.label==="\\c",b=v?s.height+s.depth:Math.min(s.height,e.fontMetrics().xHeight),x;if(a.isStretchy)x=E0.svgSpan(a,e),x=y.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:s},{type:"elem",elem:x,wrapperClasses:["svg-align"],wrapperStyle:h>0?{width:"calc(100% - "+T(2*h)+")",marginLeft:T(2*h)}:void 0}]},e);else{var w,A;a.label==="\\vec"?(w=y.staticSvg("vec",e),A=y.svgData.vec[1]):(w=y.makeOrd({mode:a.mode,text:a.label},e,"textord"),w=Jt(w),w.italic=0,A=w.width,v&&(b+=w.depth)),x=y.makeSpan(["accent-body"],[w]);var q=a.label==="\\textcircled";q&&(x.classes.push("accent-full"),b=s.height);var _=h;q||(_-=A/2),x.style.left=T(_),a.label==="\\textcircled"&&(x.style.top=".2em"),x=y.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:s},{type:"kern",size:-b},{type:"elem",elem:x}]},e)}var D=y.makeSpan(["mord","accent"],[x],e);return n?(n.children[0]=D,n.height=Math.max(D.height,n.height),n.classes[0]="mord",n):D},Hr=(r,e)=>{var t=r.isStretchy?E0.mathMLnode(r.label):new M.MathNode("mo",[y0(r.label,r.mode)]),a=new M.MathNode("mover",[X(r.base,e),t]);return a.setAttribute("accent","true"),a},I1=new RegExp(["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring"].map(r=>"\\"+r).join("|"));B({type:"accent",names:["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring","\\widecheck","\\widehat","\\widetilde","\\overrightarrow","\\overleftarrow","\\Overrightarrow","\\overleftrightarrow","\\overgroup","\\overlinesegment","\\overleftharpoon","\\overrightharpoon"],props:{numArgs:1},handler:(r,e)=>{var t=He(e[0]),a=!I1.test(r.funcName),n=!a||r.funcName==="\\widehat"||r.funcName==="\\widetilde"||r.funcName==="\\widecheck";return{type:"accent",mode:r.parser.mode,label:r.funcName,isStretchy:a,isShifty:n,base:t}},htmlBuilder:_t,mathmlBuilder:Hr});B({type:"accent",names:["\\'","\\`","\\^","\\~","\\=","\\u","\\.",'\\"',"\\c","\\r","\\H","\\v","\\textcircled"],props:{numArgs:1,allowedInText:!0,allowedInMath:!0,argTypes:["primitive"]},handler:(r,e)=>{var t=e[0],a=r.parser.mode;return a==="math"&&(r.parser.settings.reportNonstrict("mathVsTextAccents","LaTeX's accent "+r.funcName+" works only in text mode"),a="text"),{type:"accent",mode:a,label:r.funcName,isStretchy:!1,isShifty:!0,base:t}},htmlBuilder:_t,mathmlBuilder:Hr});B({type:"accentUnder",names:["\\underleftarrow","\\underrightarrow","\\underleftrightarrow","\\undergroup","\\underlinesegment","\\utilde"],props:{numArgs:1},handler:(r,e)=>{var{parser:t,funcName:a}=r,n=e[0];return{type:"accentUnder",mode:t.mode,label:a,base:n}},htmlBuilder:(r,e)=>{var t=G(r.base,e),a=E0.svgSpan(r,e),n=r.label==="\\utilde"?.12:0,s=y.makeVList({positionType:"top",positionData:t.height,children:[{type:"elem",elem:a,wrapperClasses:["svg-align"]},{type:"kern",size:n},{type:"elem",elem:t}]},e);return y.makeSpan(["mord","accentunder"],[s],e)},mathmlBuilder:(r,e)=>{var t=E0.mathMLnode(r.label),a=new M.MathNode("munder",[X(r.base,e),t]);return a.setAttribute("accentunder","true"),a}});var Ce=r=>{var e=new M.MathNode("mpadded",r?[r]:[]);return e.setAttribute("width","+0.6em"),e.setAttribute("lspace","0.3em"),e};B({type:"xArrow",names:["\\xleftarrow","\\xrightarrow","\\xLeftarrow","\\xRightarrow","\\xleftrightarrow","\\xLeftrightarrow","\\xhookleftarrow","\\xhookrightarrow","\\xmapsto","\\xrightharpoondown","\\xrightharpoonup","\\xleftharpoondown","\\xleftharpoonup","\\xrightleftharpoons","\\xleftrightharpoons","\\xlongequal","\\xtwoheadrightarrow","\\xtwoheadleftarrow","\\xtofrom","\\xrightleftarrows","\\xrightequilibrium","\\xleftequilibrium","\\\\cdrightarrow","\\\\cdleftarrow","\\\\cdlongequal"],props:{numArgs:1,numOptionalArgs:1},handler(r,e,t){var{parser:a,funcName:n}=r;return{type:"xArrow",mode:a.mode,label:n,body:e[0],below:t[0]}},htmlBuilder(r,e){var t=e.style,a=e.havingStyle(t.sup()),n=y.wrapFragment(G(r.body,a,e),e),s=r.label.slice(0,2)==="\\x"?"x":"cd";n.classes.push(s+"-arrow-pad");var l;r.below&&(a=e.havingStyle(t.sub()),l=y.wrapFragment(G(r.below,a,e),e),l.classes.push(s+"-arrow-pad"));var h=E0.svgSpan(r,e),c=-e.fontMetrics().axisHeight+.5*h.height,f=-e.fontMetrics().axisHeight-.5*h.height-.111;(n.depth>.25||r.label==="\\xleftequilibrium")&&(f-=n.depth);var v;if(l){var b=-e.fontMetrics().axisHeight+l.height+.5*h.height+.111;v=y.makeVList({positionType:"individualShift",children:[{type:"elem",elem:n,shift:f},{type:"elem",elem:h,shift:c},{type:"elem",elem:l,shift:b}]},e)}else v=y.makeVList({positionType:"individualShift",children:[{type:"elem",elem:n,shift:f},{type:"elem",elem:h,shift:c}]},e);return v.children[0].children[0].children[1].classes.push("svg-align"),y.makeSpan(["mrel","x-arrow"],[v],e)},mathmlBuilder(r,e){var t=E0.mathMLnode(r.label);t.setAttribute("minsize",r.label.charAt(0)==="x"?"1.75em":"3.0em");var a;if(r.body){var n=Ce(X(r.body,e));if(r.below){var s=Ce(X(r.below,e));a=new M.MathNode("munderover",[t,s,n])}else a=new M.MathNode("mover",[t,n])}else if(r.below){var l=Ce(X(r.below,e));a=new M.MathNode("munder",[t,l])}else a=Ce(),a=new M.MathNode("mover",[t,a]);return a}});var E1=y.makeSpan;function Pr(r,e){var t=a0(r.body,e,!0);return E1([r.mclass],t,e)}function Gr(r,e){var t,a=m0(r.body,e);return r.mclass==="minner"?t=new M.MathNode("mpadded",a):r.mclass==="mord"?r.isCharacterBox?(t=a[0],t.type="mi"):t=new M.MathNode("mi",a):(r.isCharacterBox?(t=a[0],t.type="mo"):t=new M.MathNode("mo",a),r.mclass==="mbin"?(t.attributes.lspace="0.22em",t.attributes.rspace="0.22em"):r.mclass==="mpunct"?(t.attributes.lspace="0em",t.attributes.rspace="0.17em"):r.mclass==="mopen"||r.mclass==="mclose"?(t.attributes.lspace="0em",t.attributes.rspace="0em"):r.mclass==="minner"&&(t.attributes.lspace="0.0556em",t.attributes.width="+0.1111em")),t}B({type:"mclass",names:["\\mathord","\\mathbin","\\mathrel","\\mathopen","\\mathclose","\\mathpunct","\\mathinner"],props:{numArgs:1,primitive:!0},handler(r,e){var{parser:t,funcName:a}=r,n=e[0];return{type:"mclass",mode:t.mode,mclass:"m"+a.slice(5),body:e0(n),isCharacterBox:O.isCharacterBox(n)}},htmlBuilder:Pr,mathmlBuilder:Gr});var We=r=>{var e=r.type==="ordgroup"&&r.body.length?r.body[0]:r;return e.type==="atom"&&(e.family==="bin"||e.family==="rel")?"m"+e.family:"mord"};B({type:"mclass",names:["\\@binrel"],props:{numArgs:2},handler(r,e){var{parser:t}=r;return{type:"mclass",mode:t.mode,mclass:We(e[0]),body:e0(e[1]),isCharacterBox:O.isCharacterBox(e[1])}}});B({type:"mclass",names:["\\stackrel","\\overset","\\underset"],props:{numArgs:2},handler(r,e){var{parser:t,funcName:a}=r,n=e[1],s=e[0],l;a!=="\\stackrel"?l=We(n):l="mrel";var h={type:"op",mode:n.mode,limits:!0,alwaysHandleSupSub:!0,parentIsSupSub:!1,symbol:!1,suppressBaseShift:a!=="\\stackrel",body:e0(n)},c={type:"supsub",mode:s.mode,base:h,sup:a==="\\underset"?null:s,sub:a==="\\underset"?s:null};return{type:"mclass",mode:t.mode,mclass:l,body:[c],isCharacterBox:O.isCharacterBox(c)}},htmlBuilder:Pr,mathmlBuilder:Gr});B({type:"pmb",names:["\\pmb"],props:{numArgs:1,allowedInText:!0},handler(r,e){var{parser:t}=r;return{type:"pmb",mode:t.mode,mclass:We(e[0]),body:e0(e[0])}},htmlBuilder(r,e){var t=a0(r.body,e,!0),a=y.makeSpan([r.mclass],t,e);return a.style.textShadow="0.02em 0.01em 0.04px",a},mathmlBuilder(r,e){var t=m0(r.body,e),a=new M.MathNode("mstyle",t);return a.setAttribute("style","text-shadow: 0.02em 0.01em 0.04px"),a}});var R1={">":"\\\\cdrightarrow","<":"\\\\cdleftarrow","=":"\\\\cdlongequal",A:"\\uparrow",V:"\\downarrow","|":"\\Vert",".":"no arrow"},nr=()=>({type:"styling",body:[],mode:"math",style:"display"}),ir=r=>r.type==="textord"&&r.text==="@",$1=(r,e)=>(r.type==="mathord"||r.type==="atom")&&r.text===e;function L1(r,e,t){var a=R1[r];switch(a){case"\\\\cdrightarrow":case"\\\\cdleftarrow":return t.callFunction(a,[e[0]],[e[1]]);case"\\uparrow":case"\\downarrow":{var n=t.callFunction("\\\\cdleft",[e[0]],[]),s={type:"atom",text:a,mode:"math",family:"rel"},l=t.callFunction("\\Big",[s],[]),h=t.callFunction("\\\\cdright",[e[1]],[]),c={type:"ordgroup",mode:"math",body:[n,l,h]};return t.callFunction("\\\\cdparent",[c],[])}case"\\\\cdlongequal":return t.callFunction("\\\\cdlongequal",[],[]);case"\\Vert":{var f={type:"textord",text:"\\Vert",mode:"math"};return t.callFunction("\\Big",[f],[])}default:return{type:"textord",text:" ",mode:"math"}}}function F1(r){var e=[];for(r.gullet.beginGroup(),r.gullet.macros.set("\\cr","\\\\\\relax"),r.gullet.beginGroup();;){e.push(r.parseExpression(!1,"\\\\")),r.gullet.endGroup(),r.gullet.beginGroup();var t=r.fetch().text;if(t==="&"||t==="\\\\")r.consume();else if(t==="\\end"){e[e.length-1].length===0&&e.pop();break}else throw new z("Expected \\\\ or \\cr or \\end",r.nextToken)}for(var a=[],n=[a],s=0;s-1))if("<>AV".indexOf(f)>-1)for(var b=0;b<2;b++){for(var x=!0,w=c+1;wAV=|." after @',l[c]);var A=L1(f,v,r),q={type:"styling",body:[A],mode:"math",style:"display"};a.push(q),h=nr()}s%2===0?a.push(h):a.shift(),a=[],n.push(a)}r.gullet.endGroup(),r.gullet.endGroup();var _=new Array(n[0].length).fill({type:"align",align:"c",pregap:.25,postgap:.25});return{type:"array",mode:"math",body:n,arraystretch:1,addJot:!0,rowGaps:[null],cols:_,colSeparationType:"CD",hLinesBeforeRow:new Array(n.length+1).fill([])}}B({type:"cdlabel",names:["\\\\cdleft","\\\\cdright"],props:{numArgs:1},handler(r,e){var{parser:t,funcName:a}=r;return{type:"cdlabel",mode:t.mode,side:a.slice(4),label:e[0]}},htmlBuilder(r,e){var t=e.havingStyle(e.style.sup()),a=y.wrapFragment(G(r.label,t,e),e);return a.classes.push("cd-label-"+r.side),a.style.bottom=T(.8-a.depth),a.height=0,a.depth=0,a},mathmlBuilder(r,e){var t=new M.MathNode("mrow",[X(r.label,e)]);return t=new M.MathNode("mpadded",[t]),t.setAttribute("width","0"),r.side==="left"&&t.setAttribute("lspace","-1width"),t.setAttribute("voffset","0.7em"),t=new M.MathNode("mstyle",[t]),t.setAttribute("displaystyle","false"),t.setAttribute("scriptlevel","1"),t}});B({type:"cdlabelparent",names:["\\\\cdparent"],props:{numArgs:1},handler(r,e){var{parser:t}=r;return{type:"cdlabelparent",mode:t.mode,fragment:e[0]}},htmlBuilder(r,e){var t=y.wrapFragment(G(r.fragment,e),e);return t.classes.push("cd-vert-arrow"),t},mathmlBuilder(r,e){return new M.MathNode("mrow",[X(r.fragment,e)])}});B({type:"textord",names:["\\@char"],props:{numArgs:1,allowedInText:!0},handler(r,e){for(var{parser:t}=r,a=L(e[0],"ordgroup"),n=a.body,s="",l=0;l=1114111)throw new z("\\@char with invalid code point "+s);return c<=65535?f=String.fromCharCode(c):(c-=65536,f=String.fromCharCode((c>>10)+55296,(c&1023)+56320)),{type:"textord",mode:t.mode,text:f}}});var Vr=(r,e)=>{var t=a0(r.body,e.withColor(r.color),!1);return y.makeFragment(t)},Ur=(r,e)=>{var t=m0(r.body,e.withColor(r.color)),a=new M.MathNode("mstyle",t);return a.setAttribute("mathcolor",r.color),a};B({type:"color",names:["\\textcolor"],props:{numArgs:2,allowedInText:!0,argTypes:["color","original"]},handler(r,e){var{parser:t}=r,a=L(e[0],"color-token").color,n=e[1];return{type:"color",mode:t.mode,color:a,body:e0(n)}},htmlBuilder:Vr,mathmlBuilder:Ur});B({type:"color",names:["\\color"],props:{numArgs:1,allowedInText:!0,argTypes:["color"]},handler(r,e){var{parser:t,breakOnTokenText:a}=r,n=L(e[0],"color-token").color;t.gullet.macros.set("\\current@color",n);var s=t.parseExpression(!0,a);return{type:"color",mode:t.mode,color:n,body:s}},htmlBuilder:Vr,mathmlBuilder:Ur});B({type:"cr",names:["\\\\"],props:{numArgs:0,numOptionalArgs:0,allowedInText:!0},handler(r,e,t){var{parser:a}=r,n=a.gullet.future().text==="["?a.parseSizeGroup(!0):null,s=!a.settings.displayMode||!a.settings.useStrictBehavior("newLineInDisplayMode","In LaTeX, \\\\ or \\newline does nothing in display mode");return{type:"cr",mode:a.mode,newLine:s,size:n&&L(n,"size").value}},htmlBuilder(r,e){var t=y.makeSpan(["mspace"],[],e);return r.newLine&&(t.classes.push("newline"),r.size&&(t.style.marginTop=T(Q(r.size,e)))),t},mathmlBuilder(r,e){var t=new M.MathNode("mspace");return r.newLine&&(t.setAttribute("linebreak","newline"),r.size&&t.setAttribute("height",T(Q(r.size,e)))),t}});var wt={"\\global":"\\global","\\long":"\\\\globallong","\\\\globallong":"\\\\globallong","\\def":"\\gdef","\\gdef":"\\gdef","\\edef":"\\xdef","\\xdef":"\\xdef","\\let":"\\\\globallet","\\futurelet":"\\\\globalfuture"},Xr=r=>{var e=r.text;if(/^(?:[\\{}$&#^_]|EOF)$/.test(e))throw new z("Expected a control sequence",r);return e},H1=r=>{var e=r.gullet.popToken();return e.text==="="&&(e=r.gullet.popToken(),e.text===" "&&(e=r.gullet.popToken())),e},Wr=(r,e,t,a)=>{var n=r.gullet.macros.get(t.text);n==null&&(t.noexpand=!0,n={tokens:[t],numArgs:0,unexpandable:!r.gullet.isExpandable(t.text)}),r.gullet.macros.set(e,n,a)};B({type:"internal",names:["\\global","\\long","\\\\globallong"],props:{numArgs:0,allowedInText:!0},handler(r){var{parser:e,funcName:t}=r;e.consumeSpaces();var a=e.fetch();if(wt[a.text])return(t==="\\global"||t==="\\\\globallong")&&(a.text=wt[a.text]),L(e.parseFunction(),"internal");throw new z("Invalid token after macro prefix",a)}});B({type:"internal",names:["\\def","\\gdef","\\edef","\\xdef"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(r){var{parser:e,funcName:t}=r,a=e.gullet.popToken(),n=a.text;if(/^(?:[\\{}$&#^_]|EOF)$/.test(n))throw new z("Expected a control sequence",a);for(var s=0,l,h=[[]];e.gullet.future().text!=="{";)if(a=e.gullet.popToken(),a.text==="#"){if(e.gullet.future().text==="{"){l=e.gullet.future(),h[s].push("{");break}if(a=e.gullet.popToken(),!/^[1-9]$/.test(a.text))throw new z('Invalid argument number "'+a.text+'"');if(parseInt(a.text)!==s+1)throw new z('Argument number "'+a.text+'" out of order');s++,h.push([])}else{if(a.text==="EOF")throw new z("Expected a macro definition");h[s].push(a.text)}var{tokens:c}=e.gullet.consumeArg();return l&&c.unshift(l),(t==="\\edef"||t==="\\xdef")&&(c=e.gullet.expandTokens(c),c.reverse()),e.gullet.macros.set(n,{tokens:c,numArgs:s,delimiters:h},t===wt[t]),{type:"internal",mode:e.mode}}});B({type:"internal",names:["\\let","\\\\globallet"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(r){var{parser:e,funcName:t}=r,a=Xr(e.gullet.popToken());e.gullet.consumeSpaces();var n=H1(e);return Wr(e,a,n,t==="\\\\globallet"),{type:"internal",mode:e.mode}}});B({type:"internal",names:["\\futurelet","\\\\globalfuture"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(r){var{parser:e,funcName:t}=r,a=Xr(e.gullet.popToken()),n=e.gullet.popToken(),s=e.gullet.popToken();return Wr(e,a,s,t==="\\\\globalfuture"),e.gullet.pushToken(s),e.gullet.pushToken(n),{type:"internal",mode:e.mode}}});var ce=function(e,t,a){var n=Y.math[e]&&Y.math[e].replace,s=Tt(n||e,t,a);if(!s)throw new Error("Unsupported symbol "+e+" and font size "+t+".");return s},Nt=function(e,t,a,n){var s=a.havingBaseStyle(t),l=y.makeSpan(n.concat(s.sizingClasses(a)),[e],a),h=s.sizeMultiplier/a.sizeMultiplier;return l.height*=h,l.depth*=h,l.maxFontSize=s.sizeMultiplier,l},Yr=function(e,t,a){var n=t.havingBaseStyle(a),s=(1-t.sizeMultiplier/n.sizeMultiplier)*t.fontMetrics().axisHeight;e.classes.push("delimcenter"),e.style.top=T(s),e.height-=s,e.depth+=s},P1=function(e,t,a,n,s,l){var h=y.makeSymbol(e,"Main-Regular",s,n),c=Nt(h,t,n,l);return a&&Yr(c,n,t),c},G1=function(e,t,a,n){return y.makeSymbol(e,"Size"+t+"-Regular",a,n)},Zr=function(e,t,a,n,s,l){var h=G1(e,t,s,n),c=Nt(y.makeSpan(["delimsizing","size"+t],[h],n),E.TEXT,n,l);return a&&Yr(c,n,E.TEXT),c},it=function(e,t,a){var n;t==="Size1-Regular"?n="delim-size1":n="delim-size4";var s=y.makeSpan(["delimsizinginner",n],[y.makeSpan([],[y.makeSymbol(e,t,a)])]);return{type:"elem",elem:s}},st=function(e,t,a){var n=z0["Size4-Regular"][e.charCodeAt(0)]?z0["Size4-Regular"][e.charCodeAt(0)][4]:z0["Size1-Regular"][e.charCodeAt(0)][4],s=new A0("inner",ja(e,Math.round(1e3*t))),l=new S0([s],{width:T(n),height:T(t),style:"width:"+T(n),viewBox:"0 0 "+1e3*n+" "+Math.round(1e3*t),preserveAspectRatio:"xMinYMin"}),h=y.makeSvgSpan([],[l],a);return h.height=t,h.style.height=T(t),h.style.width=T(n),{type:"elem",elem:h}},St=.008,_e={type:"kern",size:-1*St},V1=["|","\\lvert","\\rvert","\\vert"],U1=["\\|","\\lVert","\\rVert","\\Vert"],jr=function(e,t,a,n,s,l){var h,c,f,v,b="",x=0;h=f=v=e,c=null;var w="Size1-Regular";e==="\\uparrow"?f=v="\u23D0":e==="\\Uparrow"?f=v="\u2016":e==="\\downarrow"?h=f="\u23D0":e==="\\Downarrow"?h=f="\u2016":e==="\\updownarrow"?(h="\\uparrow",f="\u23D0",v="\\downarrow"):e==="\\Updownarrow"?(h="\\Uparrow",f="\u2016",v="\\Downarrow"):O.contains(V1,e)?(f="\u2223",b="vert",x=333):O.contains(U1,e)?(f="\u2225",b="doublevert",x=556):e==="["||e==="\\lbrack"?(h="\u23A1",f="\u23A2",v="\u23A3",w="Size4-Regular",b="lbrack",x=667):e==="]"||e==="\\rbrack"?(h="\u23A4",f="\u23A5",v="\u23A6",w="Size4-Regular",b="rbrack",x=667):e==="\\lfloor"||e==="\u230A"?(f=h="\u23A2",v="\u23A3",w="Size4-Regular",b="lfloor",x=667):e==="\\lceil"||e==="\u2308"?(h="\u23A1",f=v="\u23A2",w="Size4-Regular",b="lceil",x=667):e==="\\rfloor"||e==="\u230B"?(f=h="\u23A5",v="\u23A6",w="Size4-Regular",b="rfloor",x=667):e==="\\rceil"||e==="\u2309"?(h="\u23A4",f=v="\u23A5",w="Size4-Regular",b="rceil",x=667):e==="("||e==="\\lparen"?(h="\u239B",f="\u239C",v="\u239D",w="Size4-Regular",b="lparen",x=875):e===")"||e==="\\rparen"?(h="\u239E",f="\u239F",v="\u23A0",w="Size4-Regular",b="rparen",x=875):e==="\\{"||e==="\\lbrace"?(h="\u23A7",c="\u23A8",v="\u23A9",f="\u23AA",w="Size4-Regular"):e==="\\}"||e==="\\rbrace"?(h="\u23AB",c="\u23AC",v="\u23AD",f="\u23AA",w="Size4-Regular"):e==="\\lgroup"||e==="\u27EE"?(h="\u23A7",v="\u23A9",f="\u23AA",w="Size4-Regular"):e==="\\rgroup"||e==="\u27EF"?(h="\u23AB",v="\u23AD",f="\u23AA",w="Size4-Regular"):e==="\\lmoustache"||e==="\u23B0"?(h="\u23A7",v="\u23AD",f="\u23AA",w="Size4-Regular"):(e==="\\rmoustache"||e==="\u23B1")&&(h="\u23AB",v="\u23A9",f="\u23AA",w="Size4-Regular");var A=ce(h,w,s),q=A.height+A.depth,_=ce(f,w,s),D=_.height+_.depth,N=ce(v,w,s),$=N.height+N.depth,H=0,F=1;if(c!==null){var P=ce(c,w,s);H=P.height+P.depth,F=2}var V=q+$+H,j=Math.max(0,Math.ceil((t-V)/(F*D))),U=V+j*F*D,D0=n.fontMetrics().axisHeight;a&&(D0*=n.sizeMultiplier);var i0=U/2-D0,r0=[];if(b.length>0){var X0=U-q-$,u0=Math.round(U*1e3),x0=Ka(b,Math.round(X0*1e3)),$0=new A0(b,x0),K0=(x/1e3).toFixed(3)+"em",J0=(u0/1e3).toFixed(3)+"em",je=new S0([$0],{width:K0,height:J0,viewBox:"0 0 "+x+" "+u0}),L0=y.makeSvgSpan([],[je],n);L0.height=u0/1e3,L0.style.width=K0,L0.style.height=J0,r0.push({type:"elem",elem:L0})}else{if(r0.push(it(v,w,s)),r0.push(_e),c===null){var F0=U-q-$+2*St;r0.push(st(f,F0,n))}else{var f0=(U-q-$-H)/2+2*St;r0.push(st(f,f0,n)),r0.push(_e),r0.push(it(c,w,s)),r0.push(_e),r0.push(st(f,f0,n))}r0.push(_e),r0.push(it(h,w,s))}var le=n.havingBaseStyle(E.TEXT),Ke=y.makeVList({positionType:"bottom",positionData:i0,children:r0},le);return Nt(y.makeSpan(["delimsizing","mult"],[Ke],le),E.TEXT,n,l)},ot=80,lt=.08,ut=function(e,t,a,n,s){var l=Za(e,n,a),h=new A0(e,l),c=new S0([h],{width:"400em",height:T(t),viewBox:"0 0 400000 "+a,preserveAspectRatio:"xMinYMin slice"});return y.makeSvgSpan(["hide-tail"],[c],s)},X1=function(e,t){var a=t.havingBaseSizing(),n=ea("\\surd",e*a.sizeMultiplier,Qr,a),s=a.sizeMultiplier,l=Math.max(0,t.minRuleThickness-t.fontMetrics().sqrtRuleThickness),h,c=0,f=0,v=0,b;return n.type==="small"?(v=1e3+1e3*l+ot,e<1?s=1:e<1.4&&(s=.7),c=(1+l+lt)/s,f=(1+l)/s,h=ut("sqrtMain",c,v,l,t),h.style.minWidth="0.853em",b=.833/s):n.type==="large"?(v=(1e3+ot)*me[n.size],f=(me[n.size]+l)/s,c=(me[n.size]+l+lt)/s,h=ut("sqrtSize"+n.size,c,v,l,t),h.style.minWidth="1.02em",b=1/s):(c=e+l+lt,f=e+l,v=Math.floor(1e3*e+l)+ot,h=ut("sqrtTall",c,v,l,t),h.style.minWidth="0.742em",b=1.056),h.height=f,h.style.height=T(c),{span:h,advanceWidth:b,ruleWidth:(t.fontMetrics().sqrtRuleThickness+l)*s}},Kr=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","\u230A","\u230B","\\lceil","\\rceil","\u2308","\u2309","\\surd"],W1=["\\uparrow","\\downarrow","\\updownarrow","\\Uparrow","\\Downarrow","\\Updownarrow","|","\\|","\\vert","\\Vert","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","\u27EE","\u27EF","\\lmoustache","\\rmoustache","\u23B0","\u23B1"],Jr=["<",">","\\langle","\\rangle","/","\\backslash","\\lt","\\gt"],me=[0,1.2,1.8,2.4,3],Y1=function(e,t,a,n,s){if(e==="<"||e==="\\lt"||e==="\u27E8"?e="\\langle":(e===">"||e==="\\gt"||e==="\u27E9")&&(e="\\rangle"),O.contains(Kr,e)||O.contains(Jr,e))return Zr(e,t,!1,a,n,s);if(O.contains(W1,e))return jr(e,me[t],!1,a,n,s);throw new z("Illegal delimiter: '"+e+"'")},Z1=[{type:"small",style:E.SCRIPTSCRIPT},{type:"small",style:E.SCRIPT},{type:"small",style:E.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4}],j1=[{type:"small",style:E.SCRIPTSCRIPT},{type:"small",style:E.SCRIPT},{type:"small",style:E.TEXT},{type:"stack"}],Qr=[{type:"small",style:E.SCRIPTSCRIPT},{type:"small",style:E.SCRIPT},{type:"small",style:E.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4},{type:"stack"}],K1=function(e){if(e.type==="small")return"Main-Regular";if(e.type==="large")return"Size"+e.size+"-Regular";if(e.type==="stack")return"Size4-Regular";throw new Error("Add support for delim type '"+e.type+"' here.")},ea=function(e,t,a,n){for(var s=Math.min(2,3-n.style.size),l=s;lt)return a[l]}return a[a.length-1]},ta=function(e,t,a,n,s,l){e==="<"||e==="\\lt"||e==="\u27E8"?e="\\langle":(e===">"||e==="\\gt"||e==="\u27E9")&&(e="\\rangle");var h;O.contains(Jr,e)?h=Z1:O.contains(Kr,e)?h=Qr:h=j1;var c=ea(e,t,h,n);return c.type==="small"?P1(e,c.style,a,n,s,l):c.type==="large"?Zr(e,c.size,a,n,s,l):jr(e,t,a,n,s,l)},J1=function(e,t,a,n,s,l){var h=n.fontMetrics().axisHeight*n.sizeMultiplier,c=901,f=5/n.fontMetrics().ptPerEm,v=Math.max(t-h,a+h),b=Math.max(v/500*c,2*v-f);return ta(e,b,!0,n,s,l)},O0={sqrtImage:X1,sizedDelim:Y1,sizeToMaxHeight:me,customSizedDelim:ta,leftRightDelim:J1},sr={"\\bigl":{mclass:"mopen",size:1},"\\Bigl":{mclass:"mopen",size:2},"\\biggl":{mclass:"mopen",size:3},"\\Biggl":{mclass:"mopen",size:4},"\\bigr":{mclass:"mclose",size:1},"\\Bigr":{mclass:"mclose",size:2},"\\biggr":{mclass:"mclose",size:3},"\\Biggr":{mclass:"mclose",size:4},"\\bigm":{mclass:"mrel",size:1},"\\Bigm":{mclass:"mrel",size:2},"\\biggm":{mclass:"mrel",size:3},"\\Biggm":{mclass:"mrel",size:4},"\\big":{mclass:"mord",size:1},"\\Big":{mclass:"mord",size:2},"\\bigg":{mclass:"mord",size:3},"\\Bigg":{mclass:"mord",size:4}},Q1=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","\u230A","\u230B","\\lceil","\\rceil","\u2308","\u2309","<",">","\\langle","\u27E8","\\rangle","\u27E9","\\lt","\\gt","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","\u27EE","\u27EF","\\lmoustache","\\rmoustache","\u23B0","\u23B1","/","\\backslash","|","\\vert","\\|","\\Vert","\\uparrow","\\Uparrow","\\downarrow","\\Downarrow","\\updownarrow","\\Updownarrow","."];function Ye(r,e){var t=Xe(r);if(t&&O.contains(Q1,t.text))return t;throw t?new z("Invalid delimiter '"+t.text+"' after '"+e.funcName+"'",r):new z("Invalid delimiter type '"+r.type+"'",r)}B({type:"delimsizing",names:["\\bigl","\\Bigl","\\biggl","\\Biggl","\\bigr","\\Bigr","\\biggr","\\Biggr","\\bigm","\\Bigm","\\biggm","\\Biggm","\\big","\\Big","\\bigg","\\Bigg"],props:{numArgs:1,argTypes:["primitive"]},handler:(r,e)=>{var t=Ye(e[0],r);return{type:"delimsizing",mode:r.parser.mode,size:sr[r.funcName].size,mclass:sr[r.funcName].mclass,delim:t.text}},htmlBuilder:(r,e)=>r.delim==="."?y.makeSpan([r.mclass]):O0.sizedDelim(r.delim,r.size,e,r.mode,[r.mclass]),mathmlBuilder:r=>{var e=[];r.delim!=="."&&e.push(y0(r.delim,r.mode));var t=new M.MathNode("mo",e);r.mclass==="mopen"||r.mclass==="mclose"?t.setAttribute("fence","true"):t.setAttribute("fence","false"),t.setAttribute("stretchy","true");var a=T(O0.sizeToMaxHeight[r.size]);return t.setAttribute("minsize",a),t.setAttribute("maxsize",a),t}});function or(r){if(!r.body)throw new Error("Bug: The leftright ParseNode wasn't fully parsed.")}B({type:"leftright-right",names:["\\right"],props:{numArgs:1,primitive:!0},handler:(r,e)=>{var t=r.parser.gullet.macros.get("\\current@color");if(t&&typeof t!="string")throw new z("\\current@color set to non-string in \\right");return{type:"leftright-right",mode:r.parser.mode,delim:Ye(e[0],r).text,color:t}}});B({type:"leftright",names:["\\left"],props:{numArgs:1,primitive:!0},handler:(r,e)=>{var t=Ye(e[0],r),a=r.parser;++a.leftrightDepth;var n=a.parseExpression(!1);--a.leftrightDepth,a.expect("\\right",!1);var s=L(a.parseFunction(),"leftright-right");return{type:"leftright",mode:a.mode,body:n,left:t.text,right:s.delim,rightColor:s.color}},htmlBuilder:(r,e)=>{or(r);for(var t=a0(r.body,e,!0,["mopen","mclose"]),a=0,n=0,s=!1,l=0;l{or(r);var t=m0(r.body,e);if(r.left!=="."){var a=new M.MathNode("mo",[y0(r.left,r.mode)]);a.setAttribute("fence","true"),t.unshift(a)}if(r.right!=="."){var n=new M.MathNode("mo",[y0(r.right,r.mode)]);n.setAttribute("fence","true"),r.rightColor&&n.setAttribute("mathcolor",r.rightColor),t.push(n)}return Bt(t)}});B({type:"middle",names:["\\middle"],props:{numArgs:1,primitive:!0},handler:(r,e)=>{var t=Ye(e[0],r);if(!r.parser.leftrightDepth)throw new z("\\middle without preceding \\left",t);return{type:"middle",mode:r.parser.mode,delim:t.text}},htmlBuilder:(r,e)=>{var t;if(r.delim===".")t=ge(e,[]);else{t=O0.sizedDelim(r.delim,1,e,r.mode,[]);var a={delim:r.delim,options:e};t.isMiddle=a}return t},mathmlBuilder:(r,e)=>{var t=r.delim==="\\vert"||r.delim==="|"?y0("|","text"):y0(r.delim,r.mode),a=new M.MathNode("mo",[t]);return a.setAttribute("fence","true"),a.setAttribute("lspace","0.05em"),a.setAttribute("rspace","0.05em"),a}});var Ot=(r,e)=>{var t=y.wrapFragment(G(r.body,e),e),a=r.label.slice(1),n=e.sizeMultiplier,s,l=0,h=O.isCharacterBox(r.body);if(a==="sout")s=y.makeSpan(["stretchy","sout"]),s.height=e.fontMetrics().defaultRuleThickness/n,l=-.5*e.fontMetrics().xHeight;else if(a==="phase"){var c=Q({number:.6,unit:"pt"},e),f=Q({number:.35,unit:"ex"},e),v=e.havingBaseSizing();n=n/v.sizeMultiplier;var b=t.height+t.depth+c+f;t.style.paddingLeft=T(b/2+c);var x=Math.floor(1e3*b*n),w=Wa(x),A=new S0([new A0("phase",w)],{width:"400em",height:T(x/1e3),viewBox:"0 0 400000 "+x,preserveAspectRatio:"xMinYMin slice"});s=y.makeSvgSpan(["hide-tail"],[A],e),s.style.height=T(b),l=t.depth+c+f}else{/cancel/.test(a)?h||t.classes.push("cancel-pad"):a==="angl"?t.classes.push("anglpad"):t.classes.push("boxpad");var q=0,_=0,D=0;/box/.test(a)?(D=Math.max(e.fontMetrics().fboxrule,e.minRuleThickness),q=e.fontMetrics().fboxsep+(a==="colorbox"?0:D),_=q):a==="angl"?(D=Math.max(e.fontMetrics().defaultRuleThickness,e.minRuleThickness),q=4*D,_=Math.max(0,.25-t.depth)):(q=h?.2:0,_=q),s=E0.encloseSpan(t,a,q,_,e),/fbox|boxed|fcolorbox/.test(a)?(s.style.borderStyle="solid",s.style.borderWidth=T(D)):a==="angl"&&D!==.049&&(s.style.borderTopWidth=T(D),s.style.borderRightWidth=T(D)),l=t.depth+_,r.backgroundColor&&(s.style.backgroundColor=r.backgroundColor,r.borderColor&&(s.style.borderColor=r.borderColor))}var N;if(r.backgroundColor)N=y.makeVList({positionType:"individualShift",children:[{type:"elem",elem:s,shift:l},{type:"elem",elem:t,shift:0}]},e);else{var $=/cancel|phase/.test(a)?["svg-align"]:[];N=y.makeVList({positionType:"individualShift",children:[{type:"elem",elem:t,shift:0},{type:"elem",elem:s,shift:l,wrapperClasses:$}]},e)}return/cancel/.test(a)&&(N.height=t.height,N.depth=t.depth),/cancel/.test(a)&&!h?y.makeSpan(["mord","cancel-lap"],[N],e):y.makeSpan(["mord"],[N],e)},It=(r,e)=>{var t=0,a=new M.MathNode(r.label.indexOf("colorbox")>-1?"mpadded":"menclose",[X(r.body,e)]);switch(r.label){case"\\cancel":a.setAttribute("notation","updiagonalstrike");break;case"\\bcancel":a.setAttribute("notation","downdiagonalstrike");break;case"\\phase":a.setAttribute("notation","phasorangle");break;case"\\sout":a.setAttribute("notation","horizontalstrike");break;case"\\fbox":a.setAttribute("notation","box");break;case"\\angl":a.setAttribute("notation","actuarial");break;case"\\fcolorbox":case"\\colorbox":if(t=e.fontMetrics().fboxsep*e.fontMetrics().ptPerEm,a.setAttribute("width","+"+2*t+"pt"),a.setAttribute("height","+"+2*t+"pt"),a.setAttribute("lspace",t+"pt"),a.setAttribute("voffset",t+"pt"),r.label==="\\fcolorbox"){var n=Math.max(e.fontMetrics().fboxrule,e.minRuleThickness);a.setAttribute("style","border: "+n+"em solid "+String(r.borderColor))}break;case"\\xcancel":a.setAttribute("notation","updiagonalstrike downdiagonalstrike");break}return r.backgroundColor&&a.setAttribute("mathbackground",r.backgroundColor),a};B({type:"enclose",names:["\\colorbox"],props:{numArgs:2,allowedInText:!0,argTypes:["color","text"]},handler(r,e,t){var{parser:a,funcName:n}=r,s=L(e[0],"color-token").color,l=e[1];return{type:"enclose",mode:a.mode,label:n,backgroundColor:s,body:l}},htmlBuilder:Ot,mathmlBuilder:It});B({type:"enclose",names:["\\fcolorbox"],props:{numArgs:3,allowedInText:!0,argTypes:["color","color","text"]},handler(r,e,t){var{parser:a,funcName:n}=r,s=L(e[0],"color-token").color,l=L(e[1],"color-token").color,h=e[2];return{type:"enclose",mode:a.mode,label:n,backgroundColor:l,borderColor:s,body:h}},htmlBuilder:Ot,mathmlBuilder:It});B({type:"enclose",names:["\\fbox"],props:{numArgs:1,argTypes:["hbox"],allowedInText:!0},handler(r,e){var{parser:t}=r;return{type:"enclose",mode:t.mode,label:"\\fbox",body:e[0]}}});B({type:"enclose",names:["\\cancel","\\bcancel","\\xcancel","\\sout","\\phase"],props:{numArgs:1},handler(r,e){var{parser:t,funcName:a}=r,n=e[0];return{type:"enclose",mode:t.mode,label:a,body:n}},htmlBuilder:Ot,mathmlBuilder:It});B({type:"enclose",names:["\\angl"],props:{numArgs:1,argTypes:["hbox"],allowedInText:!1},handler(r,e){var{parser:t}=r;return{type:"enclose",mode:t.mode,label:"\\angl",body:e[0]}}});var ra={};function T0(r){for(var{type:e,names:t,props:a,handler:n,htmlBuilder:s,mathmlBuilder:l}=r,h={type:e,numArgs:a.numArgs||0,allowedInText:!1,numOptionalArgs:0,handler:n},c=0;c{var e=r.parser.settings;if(!e.displayMode)throw new z("{"+r.envName+"} can be used only in display mode.")};function Et(r){if(r.indexOf("ed")===-1)return r.indexOf("*")===-1}function U0(r,e,t){var{hskipBeforeAndAfter:a,addJot:n,cols:s,arraystretch:l,colSeparationType:h,autoTag:c,singleRow:f,emptySingleRow:v,maxNumCols:b,leqno:x}=e;if(r.gullet.beginGroup(),f||r.gullet.macros.set("\\cr","\\\\\\relax"),!l){var w=r.gullet.expandMacroAsText("\\arraystretch");if(w==null)l=1;else if(l=parseFloat(w),!l||l<0)throw new z("Invalid \\arraystretch: "+w)}r.gullet.beginGroup();var A=[],q=[A],_=[],D=[],N=c!=null?[]:void 0;function $(){c&&r.gullet.macros.set("\\@eqnsw","1",!0)}function H(){N&&(r.gullet.macros.get("\\df@tag")?(N.push(r.subparse([new b0("\\df@tag")])),r.gullet.macros.set("\\df@tag",void 0,!0)):N.push(!!c&&r.gullet.macros.get("\\@eqnsw")==="1"))}for($(),D.push(lr(r));;){var F=r.parseExpression(!1,f?"\\end":"\\\\");r.gullet.endGroup(),r.gullet.beginGroup(),F={type:"ordgroup",mode:r.mode,body:F},t&&(F={type:"styling",mode:r.mode,style:t,body:[F]}),A.push(F);var P=r.fetch().text;if(P==="&"){if(b&&A.length===b){if(f||h)throw new z("Too many tab characters: &",r.nextToken);r.settings.reportNonstrict("textEnv","Too few columns specified in the {array} column argument.")}r.consume()}else if(P==="\\end"){H(),A.length===1&&F.type==="styling"&&F.body[0].body.length===0&&(q.length>1||!v)&&q.pop(),D.length0&&($+=.25),f.push({pos:$,isDashed:we[Se]})}for(H(l[0]),a=0;a0&&(i0+=N,Vwe))for(a=0;a=h)){var ee=void 0;(n>0||e.hskipBeforeAndAfter)&&(ee=O.deflt(f0.pregap,x),ee!==0&&(x0=y.makeSpan(["arraycolsep"],[]),x0.style.width=T(ee),u0.push(x0)));var te=[];for(a=0;a0){for(var Sa=y.makeLineSpan("hline",t,v),ka=y.makeLineSpan("hdashline",t,v),Je=[{type:"elem",elem:c,shift:0}];f.length>0;){var Ut=f.pop(),Xt=Ut.pos-r0;Ut.isDashed?Je.push({type:"elem",elem:ka,shift:Xt}):Je.push({type:"elem",elem:Sa,shift:Xt})}c=y.makeVList({positionType:"individualShift",children:Je},t)}if(K0.length===0)return y.makeSpan(["mord"],[c],t);var Qe=y.makeVList({positionType:"individualShift",children:K0},t);return Qe=y.makeSpan(["tag"],[Qe],t),y.makeFragment([c,Qe])},en={c:"center ",l:"left ",r:"right "},B0=function(e,t){for(var a=[],n=new M.MathNode("mtd",[],["mtr-glue"]),s=new M.MathNode("mtd",[],["mml-eqn-num"]),l=0;l0){var A=e.cols,q="",_=!1,D=0,N=A.length;A[0].type==="separator"&&(x+="top ",D=1),A[A.length-1].type==="separator"&&(x+="bottom ",N-=1);for(var $=D;$0?"left ":"",x+=j[j.length-1].length>0?"right ":"";for(var U=1;U-1?"alignat":"align",s=e.envName==="split",l=U0(e.parser,{cols:a,addJot:!0,autoTag:s?void 0:Et(e.envName),emptySingleRow:!0,colSeparationType:n,maxNumCols:s?2:void 0,leqno:e.parser.settings.leqno},"display"),h,c=0,f={type:"ordgroup",mode:e.mode,body:[]};if(t[0]&&t[0].type==="ordgroup"){for(var v="",b=0;b0&&w&&(_=1),a[A]={type:"align",align:q,pregap:_,postgap:0}}return l.colSeparationType=w?"align":"alignat",l};T0({type:"array",names:["array","darray"],props:{numArgs:1},handler(r,e){var t=Xe(e[0]),a=t?[e[0]]:L(e[0],"ordgroup").body,n=a.map(function(l){var h=Ct(l),c=h.text;if("lcr".indexOf(c)!==-1)return{type:"align",align:c};if(c==="|")return{type:"separator",separator:"|"};if(c===":")return{type:"separator",separator:":"};throw new z("Unknown column alignment: "+c,l)}),s={cols:n,hskipBeforeAndAfter:!0,maxNumCols:n.length};return U0(r.parser,s,Rt(r.envName))},htmlBuilder:q0,mathmlBuilder:B0});T0({type:"array",names:["matrix","pmatrix","bmatrix","Bmatrix","vmatrix","Vmatrix","matrix*","pmatrix*","bmatrix*","Bmatrix*","vmatrix*","Vmatrix*"],props:{numArgs:0},handler(r){var e={matrix:null,pmatrix:["(",")"],bmatrix:["[","]"],Bmatrix:["\\{","\\}"],vmatrix:["|","|"],Vmatrix:["\\Vert","\\Vert"]}[r.envName.replace("*","")],t="c",a={hskipBeforeAndAfter:!1,cols:[{type:"align",align:t}]};if(r.envName.charAt(r.envName.length-1)==="*"){var n=r.parser;if(n.consumeSpaces(),n.fetch().text==="["){if(n.consume(),n.consumeSpaces(),t=n.fetch().text,"lcr".indexOf(t)===-1)throw new z("Expected l or c or r",n.nextToken);n.consume(),n.consumeSpaces(),n.expect("]"),n.consume(),a.cols=[{type:"align",align:t}]}}var s=U0(r.parser,a,Rt(r.envName)),l=Math.max(0,...s.body.map(h=>h.length));return s.cols=new Array(l).fill({type:"align",align:t}),e?{type:"leftright",mode:r.mode,body:[s],left:e[0],right:e[1],rightColor:void 0}:s},htmlBuilder:q0,mathmlBuilder:B0});T0({type:"array",names:["smallmatrix"],props:{numArgs:0},handler(r){var e={arraystretch:.5},t=U0(r.parser,e,"script");return t.colSeparationType="small",t},htmlBuilder:q0,mathmlBuilder:B0});T0({type:"array",names:["subarray"],props:{numArgs:1},handler(r,e){var t=Xe(e[0]),a=t?[e[0]]:L(e[0],"ordgroup").body,n=a.map(function(l){var h=Ct(l),c=h.text;if("lc".indexOf(c)!==-1)return{type:"align",align:c};throw new z("Unknown column alignment: "+c,l)});if(n.length>1)throw new z("{subarray} can contain only one column");var s={cols:n,hskipBeforeAndAfter:!1,arraystretch:.5};if(s=U0(r.parser,s,"script"),s.body.length>0&&s.body[0].length>1)throw new z("{subarray} can contain only one column");return s},htmlBuilder:q0,mathmlBuilder:B0});T0({type:"array",names:["cases","dcases","rcases","drcases"],props:{numArgs:0},handler(r){var e={arraystretch:1.2,cols:[{type:"align",align:"l",pregap:0,postgap:1},{type:"align",align:"l",pregap:0,postgap:0}]},t=U0(r.parser,e,Rt(r.envName));return{type:"leftright",mode:r.mode,body:[t],left:r.envName.indexOf("r")>-1?".":"\\{",right:r.envName.indexOf("r")>-1?"\\}":".",rightColor:void 0}},htmlBuilder:q0,mathmlBuilder:B0});T0({type:"array",names:["align","align*","aligned","split"],props:{numArgs:0},handler:na,htmlBuilder:q0,mathmlBuilder:B0});T0({type:"array",names:["gathered","gather","gather*"],props:{numArgs:0},handler(r){O.contains(["gather","gather*"],r.envName)&&Ze(r);var e={cols:[{type:"align",align:"c"}],addJot:!0,colSeparationType:"gather",autoTag:Et(r.envName),emptySingleRow:!0,leqno:r.parser.settings.leqno};return U0(r.parser,e,"display")},htmlBuilder:q0,mathmlBuilder:B0});T0({type:"array",names:["alignat","alignat*","alignedat"],props:{numArgs:1},handler:na,htmlBuilder:q0,mathmlBuilder:B0});T0({type:"array",names:["equation","equation*"],props:{numArgs:0},handler(r){Ze(r);var e={autoTag:Et(r.envName),emptySingleRow:!0,singleRow:!0,maxNumCols:1,leqno:r.parser.settings.leqno};return U0(r.parser,e,"display")},htmlBuilder:q0,mathmlBuilder:B0});T0({type:"array",names:["CD"],props:{numArgs:0},handler(r){return Ze(r),F1(r.parser)},htmlBuilder:q0,mathmlBuilder:B0});m("\\nonumber","\\gdef\\@eqnsw{0}");m("\\notag","\\nonumber");B({type:"text",names:["\\hline","\\hdashline"],props:{numArgs:0,allowedInText:!0,allowedInMath:!0},handler(r,e){throw new z(r.funcName+" valid only within array environment")}});var ur=ra;B({type:"environment",names:["\\begin","\\end"],props:{numArgs:1,argTypes:["text"]},handler(r,e){var{parser:t,funcName:a}=r,n=e[0];if(n.type!=="ordgroup")throw new z("Invalid environment name",n);for(var s="",l=0;l{var t=r.font,a=e.withFont(t);return G(r.body,a)},sa=(r,e)=>{var t=r.font,a=e.withFont(t);return X(r.body,a)},hr={"\\Bbb":"\\mathbb","\\bold":"\\mathbf","\\frak":"\\mathfrak","\\bm":"\\boldsymbol"};B({type:"font",names:["\\mathrm","\\mathit","\\mathbf","\\mathnormal","\\mathsfit","\\mathbb","\\mathcal","\\mathfrak","\\mathscr","\\mathsf","\\mathtt","\\Bbb","\\bold","\\frak"],props:{numArgs:1,allowedInArgument:!0},handler:(r,e)=>{var{parser:t,funcName:a}=r,n=He(e[0]),s=a;return s in hr&&(s=hr[s]),{type:"font",mode:t.mode,font:s.slice(1),body:n}},htmlBuilder:ia,mathmlBuilder:sa});B({type:"mclass",names:["\\boldsymbol","\\bm"],props:{numArgs:1},handler:(r,e)=>{var{parser:t}=r,a=e[0],n=O.isCharacterBox(a);return{type:"mclass",mode:t.mode,mclass:We(a),body:[{type:"font",mode:t.mode,font:"boldsymbol",body:a}],isCharacterBox:n}}});B({type:"font",names:["\\rm","\\sf","\\tt","\\bf","\\it","\\cal"],props:{numArgs:0,allowedInText:!0},handler:(r,e)=>{var{parser:t,funcName:a,breakOnTokenText:n}=r,{mode:s}=t,l=t.parseExpression(!0,n),h="math"+a.slice(1);return{type:"font",mode:s,font:h,body:{type:"ordgroup",mode:t.mode,body:l}}},htmlBuilder:ia,mathmlBuilder:sa});var oa=(r,e)=>{var t=e;return r==="display"?t=t.id>=E.SCRIPT.id?t.text():E.DISPLAY:r==="text"&&t.size===E.DISPLAY.size?t=E.TEXT:r==="script"?t=E.SCRIPT:r==="scriptscript"&&(t=E.SCRIPTSCRIPT),t},$t=(r,e)=>{var t=oa(r.size,e.style),a=t.fracNum(),n=t.fracDen(),s;s=e.havingStyle(a);var l=G(r.numer,s,e);if(r.continued){var h=8.5/e.fontMetrics().ptPerEm,c=3.5/e.fontMetrics().ptPerEm;l.height=l.height0?A=3*x:A=7*x,q=e.fontMetrics().denom1):(b>0?(w=e.fontMetrics().num2,A=x):(w=e.fontMetrics().num3,A=3*x),q=e.fontMetrics().denom2);var _;if(v){var N=e.fontMetrics().axisHeight;w-l.depth-(N+.5*b){var t=new M.MathNode("mfrac",[X(r.numer,e),X(r.denom,e)]);if(!r.hasBarLine)t.setAttribute("linethickness","0px");else if(r.barSize){var a=Q(r.barSize,e);t.setAttribute("linethickness",T(a))}var n=oa(r.size,e.style);if(n.size!==e.style.size){t=new M.MathNode("mstyle",[t]);var s=n.size===E.DISPLAY.size?"true":"false";t.setAttribute("displaystyle",s),t.setAttribute("scriptlevel","0")}if(r.leftDelim!=null||r.rightDelim!=null){var l=[];if(r.leftDelim!=null){var h=new M.MathNode("mo",[new M.TextNode(r.leftDelim.replace("\\",""))]);h.setAttribute("fence","true"),l.push(h)}if(l.push(t),r.rightDelim!=null){var c=new M.MathNode("mo",[new M.TextNode(r.rightDelim.replace("\\",""))]);c.setAttribute("fence","true"),l.push(c)}return Bt(l)}return t};B({type:"genfrac",names:["\\dfrac","\\frac","\\tfrac","\\dbinom","\\binom","\\tbinom","\\\\atopfrac","\\\\bracefrac","\\\\brackfrac"],props:{numArgs:2,allowedInArgument:!0},handler:(r,e)=>{var{parser:t,funcName:a}=r,n=e[0],s=e[1],l,h=null,c=null,f="auto";switch(a){case"\\dfrac":case"\\frac":case"\\tfrac":l=!0;break;case"\\\\atopfrac":l=!1;break;case"\\dbinom":case"\\binom":case"\\tbinom":l=!1,h="(",c=")";break;case"\\\\bracefrac":l=!1,h="\\{",c="\\}";break;case"\\\\brackfrac":l=!1,h="[",c="]";break;default:throw new Error("Unrecognized genfrac command")}switch(a){case"\\dfrac":case"\\dbinom":f="display";break;case"\\tfrac":case"\\tbinom":f="text";break}return{type:"genfrac",mode:t.mode,continued:!1,numer:n,denom:s,hasBarLine:l,leftDelim:h,rightDelim:c,size:f,barSize:null}},htmlBuilder:$t,mathmlBuilder:Lt});B({type:"genfrac",names:["\\cfrac"],props:{numArgs:2},handler:(r,e)=>{var{parser:t,funcName:a}=r,n=e[0],s=e[1];return{type:"genfrac",mode:t.mode,continued:!0,numer:n,denom:s,hasBarLine:!0,leftDelim:null,rightDelim:null,size:"display",barSize:null}}});B({type:"infix",names:["\\over","\\choose","\\atop","\\brace","\\brack"],props:{numArgs:0,infix:!0},handler(r){var{parser:e,funcName:t,token:a}=r,n;switch(t){case"\\over":n="\\frac";break;case"\\choose":n="\\binom";break;case"\\atop":n="\\\\atopfrac";break;case"\\brace":n="\\\\bracefrac";break;case"\\brack":n="\\\\brackfrac";break;default:throw new Error("Unrecognized infix genfrac command")}return{type:"infix",mode:e.mode,replaceWith:n,token:a}}});var cr=["display","text","script","scriptscript"],mr=function(e){var t=null;return e.length>0&&(t=e,t=t==="."?null:t),t};B({type:"genfrac",names:["\\genfrac"],props:{numArgs:6,allowedInArgument:!0,argTypes:["math","math","size","text","math","math"]},handler(r,e){var{parser:t}=r,a=e[4],n=e[5],s=He(e[0]),l=s.type==="atom"&&s.family==="open"?mr(s.text):null,h=He(e[1]),c=h.type==="atom"&&h.family==="close"?mr(h.text):null,f=L(e[2],"size"),v,b=null;f.isBlank?v=!0:(b=f.value,v=b.number>0);var x="auto",w=e[3];if(w.type==="ordgroup"){if(w.body.length>0){var A=L(w.body[0],"textord");x=cr[Number(A.text)]}}else w=L(w,"textord"),x=cr[Number(w.text)];return{type:"genfrac",mode:t.mode,numer:a,denom:n,continued:!1,hasBarLine:v,barSize:b,leftDelim:l,rightDelim:c,size:x}},htmlBuilder:$t,mathmlBuilder:Lt});B({type:"infix",names:["\\above"],props:{numArgs:1,argTypes:["size"],infix:!0},handler(r,e){var{parser:t,funcName:a,token:n}=r;return{type:"infix",mode:t.mode,replaceWith:"\\\\abovefrac",size:L(e[0],"size").value,token:n}}});B({type:"genfrac",names:["\\\\abovefrac"],props:{numArgs:3,argTypes:["math","size","math"]},handler:(r,e)=>{var{parser:t,funcName:a}=r,n=e[0],s=_a(L(e[1],"infix").size),l=e[2],h=s.number>0;return{type:"genfrac",mode:t.mode,numer:n,denom:l,continued:!1,hasBarLine:h,barSize:s,leftDelim:null,rightDelim:null,size:"auto"}},htmlBuilder:$t,mathmlBuilder:Lt});var la=(r,e)=>{var t=e.style,a,n;r.type==="supsub"?(a=r.sup?G(r.sup,e.havingStyle(t.sup()),e):G(r.sub,e.havingStyle(t.sub()),e),n=L(r.base,"horizBrace")):n=L(r,"horizBrace");var s=G(n.base,e.havingBaseStyle(E.DISPLAY)),l=E0.svgSpan(n,e),h;if(n.isOver?(h=y.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:s},{type:"kern",size:.1},{type:"elem",elem:l}]},e),h.children[0].children[0].children[1].classes.push("svg-align")):(h=y.makeVList({positionType:"bottom",positionData:s.depth+.1+l.height,children:[{type:"elem",elem:l},{type:"kern",size:.1},{type:"elem",elem:s}]},e),h.children[0].children[0].children[0].classes.push("svg-align")),a){var c=y.makeSpan(["mord",n.isOver?"mover":"munder"],[h],e);n.isOver?h=y.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:c},{type:"kern",size:.2},{type:"elem",elem:a}]},e):h=y.makeVList({positionType:"bottom",positionData:c.depth+.2+a.height+a.depth,children:[{type:"elem",elem:a},{type:"kern",size:.2},{type:"elem",elem:c}]},e)}return y.makeSpan(["mord",n.isOver?"mover":"munder"],[h],e)},tn=(r,e)=>{var t=E0.mathMLnode(r.label);return new M.MathNode(r.isOver?"mover":"munder",[X(r.base,e),t])};B({type:"horizBrace",names:["\\overbrace","\\underbrace"],props:{numArgs:1},handler(r,e){var{parser:t,funcName:a}=r;return{type:"horizBrace",mode:t.mode,label:a,isOver:/^\\over/.test(a),base:e[0]}},htmlBuilder:la,mathmlBuilder:tn});B({type:"href",names:["\\href"],props:{numArgs:2,argTypes:["url","original"],allowedInText:!0},handler:(r,e)=>{var{parser:t}=r,a=e[1],n=L(e[0],"url").url;return t.settings.isTrusted({command:"\\href",url:n})?{type:"href",mode:t.mode,href:n,body:e0(a)}:t.formatUnsupportedCmd("\\href")},htmlBuilder:(r,e)=>{var t=a0(r.body,e,!1);return y.makeAnchor(r.href,[],t,e)},mathmlBuilder:(r,e)=>{var t=V0(r.body,e);return t instanceof s0||(t=new s0("mrow",[t])),t.setAttribute("href",r.href),t}});B({type:"href",names:["\\url"],props:{numArgs:1,argTypes:["url"],allowedInText:!0},handler:(r,e)=>{var{parser:t}=r,a=L(e[0],"url").url;if(!t.settings.isTrusted({command:"\\url",url:a}))return t.formatUnsupportedCmd("\\url");for(var n=[],s=0;s{var{parser:t,funcName:a,token:n}=r,s=L(e[0],"raw").string,l=e[1];t.settings.strict&&t.settings.reportNonstrict("htmlExtension","HTML extension is disabled on strict mode");var h,c={};switch(a){case"\\htmlClass":c.class=s,h={command:"\\htmlClass",class:s};break;case"\\htmlId":c.id=s,h={command:"\\htmlId",id:s};break;case"\\htmlStyle":c.style=s,h={command:"\\htmlStyle",style:s};break;case"\\htmlData":{for(var f=s.split(","),v=0;v{var t=a0(r.body,e,!1),a=["enclosing"];r.attributes.class&&a.push(...r.attributes.class.trim().split(/\s+/));var n=y.makeSpan(a,t,e);for(var s in r.attributes)s!=="class"&&r.attributes.hasOwnProperty(s)&&n.setAttribute(s,r.attributes[s]);return n},mathmlBuilder:(r,e)=>V0(r.body,e)});B({type:"htmlmathml",names:["\\html@mathml"],props:{numArgs:2,allowedInText:!0},handler:(r,e)=>{var{parser:t}=r;return{type:"htmlmathml",mode:t.mode,html:e0(e[0]),mathml:e0(e[1])}},htmlBuilder:(r,e)=>{var t=a0(r.html,e,!1);return y.makeFragment(t)},mathmlBuilder:(r,e)=>V0(r.mathml,e)});var ht=function(e){if(/^[-+]? *(\d+(\.\d*)?|\.\d+)$/.test(e))return{number:+e,unit:"bp"};var t=/([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(e);if(!t)throw new z("Invalid size: '"+e+"' in \\includegraphics");var a={number:+(t[1]+t[2]),unit:t[3]};if(!Tr(a))throw new z("Invalid unit: '"+a.unit+"' in \\includegraphics.");return a};B({type:"includegraphics",names:["\\includegraphics"],props:{numArgs:1,numOptionalArgs:1,argTypes:["raw","url"],allowedInText:!1},handler:(r,e,t)=>{var{parser:a}=r,n={number:0,unit:"em"},s={number:.9,unit:"em"},l={number:0,unit:"em"},h="";if(t[0])for(var c=L(t[0],"raw").string,f=c.split(","),v=0;v{var t=Q(r.height,e),a=0;r.totalheight.number>0&&(a=Q(r.totalheight,e)-t);var n=0;r.width.number>0&&(n=Q(r.width,e));var s={height:T(t+a)};n>0&&(s.width=T(n)),a>0&&(s.verticalAlign=T(-a));var l=new vt(r.src,r.alt,s);return l.height=t,l.depth=a,l},mathmlBuilder:(r,e)=>{var t=new M.MathNode("mglyph",[]);t.setAttribute("alt",r.alt);var a=Q(r.height,e),n=0;if(r.totalheight.number>0&&(n=Q(r.totalheight,e)-a,t.setAttribute("valign",T(-n))),t.setAttribute("height",T(a+n)),r.width.number>0){var s=Q(r.width,e);t.setAttribute("width",T(s))}return t.setAttribute("src",r.src),t}});B({type:"kern",names:["\\kern","\\mkern","\\hskip","\\mskip"],props:{numArgs:1,argTypes:["size"],primitive:!0,allowedInText:!0},handler(r,e){var{parser:t,funcName:a}=r,n=L(e[0],"size");if(t.settings.strict){var s=a[1]==="m",l=n.value.unit==="mu";s?(l||t.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+a+" supports only mu units, "+("not "+n.value.unit+" units")),t.mode!=="math"&&t.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+a+" works only in math mode")):l&&t.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+a+" doesn't support mu units")}return{type:"kern",mode:t.mode,dimension:n.value}},htmlBuilder(r,e){return y.makeGlue(r.dimension,e)},mathmlBuilder(r,e){var t=Q(r.dimension,e);return new M.SpaceNode(t)}});B({type:"lap",names:["\\mathllap","\\mathrlap","\\mathclap"],props:{numArgs:1,allowedInText:!0},handler:(r,e)=>{var{parser:t,funcName:a}=r,n=e[0];return{type:"lap",mode:t.mode,alignment:a.slice(5),body:n}},htmlBuilder:(r,e)=>{var t;r.alignment==="clap"?(t=y.makeSpan([],[G(r.body,e)]),t=y.makeSpan(["inner"],[t],e)):t=y.makeSpan(["inner"],[G(r.body,e)]);var a=y.makeSpan(["fix"],[]),n=y.makeSpan([r.alignment],[t,a],e),s=y.makeSpan(["strut"]);return s.style.height=T(n.height+n.depth),n.depth&&(s.style.verticalAlign=T(-n.depth)),n.children.unshift(s),n=y.makeSpan(["thinbox"],[n],e),y.makeSpan(["mord","vbox"],[n],e)},mathmlBuilder:(r,e)=>{var t=new M.MathNode("mpadded",[X(r.body,e)]);if(r.alignment!=="rlap"){var a=r.alignment==="llap"?"-1":"-0.5";t.setAttribute("lspace",a+"width")}return t.setAttribute("width","0px"),t}});B({type:"styling",names:["\\(","$"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler(r,e){var{funcName:t,parser:a}=r,n=a.mode;a.switchMode("math");var s=t==="\\("?"\\)":"$",l=a.parseExpression(!1,s);return a.expect(s),a.switchMode(n),{type:"styling",mode:a.mode,style:"text",body:l}}});B({type:"text",names:["\\)","\\]"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler(r,e){throw new z("Mismatched "+r.funcName)}});var dr=(r,e)=>{switch(e.style.size){case E.DISPLAY.size:return r.display;case E.TEXT.size:return r.text;case E.SCRIPT.size:return r.script;case E.SCRIPTSCRIPT.size:return r.scriptscript;default:return r.text}};B({type:"mathchoice",names:["\\mathchoice"],props:{numArgs:4,primitive:!0},handler:(r,e)=>{var{parser:t}=r;return{type:"mathchoice",mode:t.mode,display:e0(e[0]),text:e0(e[1]),script:e0(e[2]),scriptscript:e0(e[3])}},htmlBuilder:(r,e)=>{var t=dr(r,e),a=a0(t,e,!1);return y.makeFragment(a)},mathmlBuilder:(r,e)=>{var t=dr(r,e);return V0(t,e)}});var ua=(r,e,t,a,n,s,l)=>{r=y.makeSpan([],[r]);var h=t&&O.isCharacterBox(t),c,f;if(e){var v=G(e,a.havingStyle(n.sup()),a);f={elem:v,kern:Math.max(a.fontMetrics().bigOpSpacing1,a.fontMetrics().bigOpSpacing3-v.depth)}}if(t){var b=G(t,a.havingStyle(n.sub()),a);c={elem:b,kern:Math.max(a.fontMetrics().bigOpSpacing2,a.fontMetrics().bigOpSpacing4-b.height)}}var x;if(f&&c){var w=a.fontMetrics().bigOpSpacing5+c.elem.height+c.elem.depth+c.kern+r.depth+l;x=y.makeVList({positionType:"bottom",positionData:w,children:[{type:"kern",size:a.fontMetrics().bigOpSpacing5},{type:"elem",elem:c.elem,marginLeft:T(-s)},{type:"kern",size:c.kern},{type:"elem",elem:r},{type:"kern",size:f.kern},{type:"elem",elem:f.elem,marginLeft:T(s)},{type:"kern",size:a.fontMetrics().bigOpSpacing5}]},a)}else if(c){var A=r.height-l;x=y.makeVList({positionType:"top",positionData:A,children:[{type:"kern",size:a.fontMetrics().bigOpSpacing5},{type:"elem",elem:c.elem,marginLeft:T(-s)},{type:"kern",size:c.kern},{type:"elem",elem:r}]},a)}else if(f){var q=r.depth+l;x=y.makeVList({positionType:"bottom",positionData:q,children:[{type:"elem",elem:r},{type:"kern",size:f.kern},{type:"elem",elem:f.elem,marginLeft:T(s)},{type:"kern",size:a.fontMetrics().bigOpSpacing5}]},a)}else return r;var _=[x];if(c&&s!==0&&!h){var D=y.makeSpan(["mspace"],[],a);D.style.marginRight=T(s),_.unshift(D)}return y.makeSpan(["mop","op-limits"],_,a)},ha=["\\smallint"],se=(r,e)=>{var t,a,n=!1,s;r.type==="supsub"?(t=r.sup,a=r.sub,s=L(r.base,"op"),n=!0):s=L(r,"op");var l=e.style,h=!1;l.size===E.DISPLAY.size&&s.symbol&&!O.contains(ha,s.name)&&(h=!0);var c;if(s.symbol){var f=h?"Size2-Regular":"Size1-Regular",v="";if((s.name==="\\oiint"||s.name==="\\oiiint")&&(v=s.name.slice(1),s.name=v==="oiint"?"\\iint":"\\iiint"),c=y.makeSymbol(s.name,f,"math",e,["mop","op-symbol",h?"large-op":"small-op"]),v.length>0){var b=c.italic,x=y.staticSvg(v+"Size"+(h?"2":"1"),e);c=y.makeVList({positionType:"individualShift",children:[{type:"elem",elem:c,shift:0},{type:"elem",elem:x,shift:h?.08:0}]},e),s.name="\\"+v,c.classes.unshift("mop"),c.italic=b}}else if(s.body){var w=a0(s.body,e,!0);w.length===1&&w[0]instanceof c0?(c=w[0],c.classes[0]="mop"):c=y.makeSpan(["mop"],w,e)}else{for(var A=[],q=1;q{var t;if(r.symbol)t=new s0("mo",[y0(r.name,r.mode)]),O.contains(ha,r.name)&&t.setAttribute("largeop","false");else if(r.body)t=new s0("mo",m0(r.body,e));else{t=new s0("mi",[new g0(r.name.slice(1))]);var a=new s0("mo",[y0("\u2061","text")]);r.parentIsSupSub?t=new s0("mrow",[t,a]):t=$r([t,a])}return t},rn={"\u220F":"\\prod","\u2210":"\\coprod","\u2211":"\\sum","\u22C0":"\\bigwedge","\u22C1":"\\bigvee","\u22C2":"\\bigcap","\u22C3":"\\bigcup","\u2A00":"\\bigodot","\u2A01":"\\bigoplus","\u2A02":"\\bigotimes","\u2A04":"\\biguplus","\u2A06":"\\bigsqcup"};B({type:"op",names:["\\coprod","\\bigvee","\\bigwedge","\\biguplus","\\bigcap","\\bigcup","\\intop","\\prod","\\sum","\\bigotimes","\\bigoplus","\\bigodot","\\bigsqcup","\\smallint","\u220F","\u2210","\u2211","\u22C0","\u22C1","\u22C2","\u22C3","\u2A00","\u2A01","\u2A02","\u2A04","\u2A06"],props:{numArgs:0},handler:(r,e)=>{var{parser:t,funcName:a}=r,n=a;return n.length===1&&(n=rn[n]),{type:"op",mode:t.mode,limits:!0,parentIsSupSub:!1,symbol:!0,name:n}},htmlBuilder:se,mathmlBuilder:be});B({type:"op",names:["\\mathop"],props:{numArgs:1,primitive:!0},handler:(r,e)=>{var{parser:t}=r,a=e[0];return{type:"op",mode:t.mode,limits:!1,parentIsSupSub:!1,symbol:!1,body:e0(a)}},htmlBuilder:se,mathmlBuilder:be});var an={"\u222B":"\\int","\u222C":"\\iint","\u222D":"\\iiint","\u222E":"\\oint","\u222F":"\\oiint","\u2230":"\\oiiint"};B({type:"op",names:["\\arcsin","\\arccos","\\arctan","\\arctg","\\arcctg","\\arg","\\ch","\\cos","\\cosec","\\cosh","\\cot","\\cotg","\\coth","\\csc","\\ctg","\\cth","\\deg","\\dim","\\exp","\\hom","\\ker","\\lg","\\ln","\\log","\\sec","\\sin","\\sinh","\\sh","\\tan","\\tanh","\\tg","\\th"],props:{numArgs:0},handler(r){var{parser:e,funcName:t}=r;return{type:"op",mode:e.mode,limits:!1,parentIsSupSub:!1,symbol:!1,name:t}},htmlBuilder:se,mathmlBuilder:be});B({type:"op",names:["\\det","\\gcd","\\inf","\\lim","\\max","\\min","\\Pr","\\sup"],props:{numArgs:0},handler(r){var{parser:e,funcName:t}=r;return{type:"op",mode:e.mode,limits:!0,parentIsSupSub:!1,symbol:!1,name:t}},htmlBuilder:se,mathmlBuilder:be});B({type:"op",names:["\\int","\\iint","\\iiint","\\oint","\\oiint","\\oiiint","\u222B","\u222C","\u222D","\u222E","\u222F","\u2230"],props:{numArgs:0},handler(r){var{parser:e,funcName:t}=r,a=t;return a.length===1&&(a=an[a]),{type:"op",mode:e.mode,limits:!1,parentIsSupSub:!1,symbol:!0,name:a}},htmlBuilder:se,mathmlBuilder:be});var ca=(r,e)=>{var t,a,n=!1,s;r.type==="supsub"?(t=r.sup,a=r.sub,s=L(r.base,"operatorname"),n=!0):s=L(r,"operatorname");var l;if(s.body.length>0){for(var h=s.body.map(b=>{var x=b.text;return typeof x=="string"?{type:"textord",mode:b.mode,text:x}:b}),c=a0(h,e.withFont("mathrm"),!0),f=0;f{for(var t=m0(r.body,e.withFont("mathrm")),a=!0,n=0;nv.toText()).join("");t=[new M.TextNode(h)]}var c=new M.MathNode("mi",t);c.setAttribute("mathvariant","normal");var f=new M.MathNode("mo",[y0("\u2061","text")]);return r.parentIsSupSub?new M.MathNode("mrow",[c,f]):M.newDocumentFragment([c,f])};B({type:"operatorname",names:["\\operatorname@","\\operatornamewithlimits"],props:{numArgs:1},handler:(r,e)=>{var{parser:t,funcName:a}=r,n=e[0];return{type:"operatorname",mode:t.mode,body:e0(n),alwaysHandleSupSub:a==="\\operatornamewithlimits",limits:!1,parentIsSupSub:!1}},htmlBuilder:ca,mathmlBuilder:nn});m("\\operatorname","\\@ifstar\\operatornamewithlimits\\operatorname@");j0({type:"ordgroup",htmlBuilder(r,e){return r.semisimple?y.makeFragment(a0(r.body,e,!1)):y.makeSpan(["mord"],a0(r.body,e,!0),e)},mathmlBuilder(r,e){return V0(r.body,e,!0)}});B({type:"overline",names:["\\overline"],props:{numArgs:1},handler(r,e){var{parser:t}=r,a=e[0];return{type:"overline",mode:t.mode,body:a}},htmlBuilder(r,e){var t=G(r.body,e.havingCrampedStyle()),a=y.makeLineSpan("overline-line",e),n=e.fontMetrics().defaultRuleThickness,s=y.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:t},{type:"kern",size:3*n},{type:"elem",elem:a},{type:"kern",size:n}]},e);return y.makeSpan(["mord","overline"],[s],e)},mathmlBuilder(r,e){var t=new M.MathNode("mo",[new M.TextNode("\u203E")]);t.setAttribute("stretchy","true");var a=new M.MathNode("mover",[X(r.body,e),t]);return a.setAttribute("accent","true"),a}});B({type:"phantom",names:["\\phantom"],props:{numArgs:1,allowedInText:!0},handler:(r,e)=>{var{parser:t}=r,a=e[0];return{type:"phantom",mode:t.mode,body:e0(a)}},htmlBuilder:(r,e)=>{var t=a0(r.body,e.withPhantom(),!1);return y.makeFragment(t)},mathmlBuilder:(r,e)=>{var t=m0(r.body,e);return new M.MathNode("mphantom",t)}});B({type:"hphantom",names:["\\hphantom"],props:{numArgs:1,allowedInText:!0},handler:(r,e)=>{var{parser:t}=r,a=e[0];return{type:"hphantom",mode:t.mode,body:a}},htmlBuilder:(r,e)=>{var t=y.makeSpan([],[G(r.body,e.withPhantom())]);if(t.height=0,t.depth=0,t.children)for(var a=0;a{var t=m0(e0(r.body),e),a=new M.MathNode("mphantom",t),n=new M.MathNode("mpadded",[a]);return n.setAttribute("height","0px"),n.setAttribute("depth","0px"),n}});B({type:"vphantom",names:["\\vphantom"],props:{numArgs:1,allowedInText:!0},handler:(r,e)=>{var{parser:t}=r,a=e[0];return{type:"vphantom",mode:t.mode,body:a}},htmlBuilder:(r,e)=>{var t=y.makeSpan(["inner"],[G(r.body,e.withPhantom())]),a=y.makeSpan(["fix"],[]);return y.makeSpan(["mord","rlap"],[t,a],e)},mathmlBuilder:(r,e)=>{var t=m0(e0(r.body),e),a=new M.MathNode("mphantom",t),n=new M.MathNode("mpadded",[a]);return n.setAttribute("width","0px"),n}});B({type:"raisebox",names:["\\raisebox"],props:{numArgs:2,argTypes:["size","hbox"],allowedInText:!0},handler(r,e){var{parser:t}=r,a=L(e[0],"size").value,n=e[1];return{type:"raisebox",mode:t.mode,dy:a,body:n}},htmlBuilder(r,e){var t=G(r.body,e),a=Q(r.dy,e);return y.makeVList({positionType:"shift",positionData:-a,children:[{type:"elem",elem:t}]},e)},mathmlBuilder(r,e){var t=new M.MathNode("mpadded",[X(r.body,e)]),a=r.dy.number+r.dy.unit;return t.setAttribute("voffset",a),t}});B({type:"internal",names:["\\relax"],props:{numArgs:0,allowedInText:!0},handler(r){var{parser:e}=r;return{type:"internal",mode:e.mode}}});B({type:"rule",names:["\\rule"],props:{numArgs:2,numOptionalArgs:1,allowedInText:!0,allowedInMath:!0,argTypes:["size","size","size"]},handler(r,e,t){var{parser:a}=r,n=t[0],s=L(e[0],"size"),l=L(e[1],"size");return{type:"rule",mode:a.mode,shift:n&&L(n,"size").value,width:s.value,height:l.value}},htmlBuilder(r,e){var t=y.makeSpan(["mord","rule"],[],e),a=Q(r.width,e),n=Q(r.height,e),s=r.shift?Q(r.shift,e):0;return t.style.borderRightWidth=T(a),t.style.borderTopWidth=T(n),t.style.bottom=T(s),t.width=a,t.height=n+s,t.depth=-s,t.maxFontSize=n*1.125*e.sizeMultiplier,t},mathmlBuilder(r,e){var t=Q(r.width,e),a=Q(r.height,e),n=r.shift?Q(r.shift,e):0,s=e.color&&e.getColor()||"black",l=new M.MathNode("mspace");l.setAttribute("mathbackground",s),l.setAttribute("width",T(t)),l.setAttribute("height",T(a));var h=new M.MathNode("mpadded",[l]);return n>=0?h.setAttribute("height",T(n)):(h.setAttribute("height",T(n)),h.setAttribute("depth",T(-n))),h.setAttribute("voffset",T(n)),h}});function ma(r,e,t){for(var a=a0(r,e,!1),n=e.sizeMultiplier/t.sizeMultiplier,s=0;s{var t=e.havingSize(r.size);return ma(r.body,t,e)};B({type:"sizing",names:pr,props:{numArgs:0,allowedInText:!0},handler:(r,e)=>{var{breakOnTokenText:t,funcName:a,parser:n}=r,s=n.parseExpression(!1,t);return{type:"sizing",mode:n.mode,size:pr.indexOf(a)+1,body:s}},htmlBuilder:sn,mathmlBuilder:(r,e)=>{var t=e.havingSize(r.size),a=m0(r.body,t),n=new M.MathNode("mstyle",a);return n.setAttribute("mathsize",T(t.sizeMultiplier)),n}});B({type:"smash",names:["\\smash"],props:{numArgs:1,numOptionalArgs:1,allowedInText:!0},handler:(r,e,t)=>{var{parser:a}=r,n=!1,s=!1,l=t[0]&&L(t[0],"ordgroup");if(l)for(var h="",c=0;c{var t=y.makeSpan([],[G(r.body,e)]);if(!r.smashHeight&&!r.smashDepth)return t;if(r.smashHeight&&(t.height=0,t.children))for(var a=0;a{var t=new M.MathNode("mpadded",[X(r.body,e)]);return r.smashHeight&&t.setAttribute("height","0px"),r.smashDepth&&t.setAttribute("depth","0px"),t}});B({type:"sqrt",names:["\\sqrt"],props:{numArgs:1,numOptionalArgs:1},handler(r,e,t){var{parser:a}=r,n=t[0],s=e[0];return{type:"sqrt",mode:a.mode,body:s,index:n}},htmlBuilder(r,e){var t=G(r.body,e.havingCrampedStyle());t.height===0&&(t.height=e.fontMetrics().xHeight),t=y.wrapFragment(t,e);var a=e.fontMetrics(),n=a.defaultRuleThickness,s=n;e.style.idt.height+t.depth+l&&(l=(l+b-t.height-t.depth)/2);var x=c.height-t.height-l-f;t.style.paddingLeft=T(v);var w=y.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:t,wrapperClasses:["svg-align"]},{type:"kern",size:-(t.height+x)},{type:"elem",elem:c},{type:"kern",size:f}]},e);if(r.index){var A=e.havingStyle(E.SCRIPTSCRIPT),q=G(r.index,A,e),_=.6*(w.height-w.depth),D=y.makeVList({positionType:"shift",positionData:-_,children:[{type:"elem",elem:q}]},e),N=y.makeSpan(["root"],[D]);return y.makeSpan(["mord","sqrt"],[N,w],e)}else return y.makeSpan(["mord","sqrt"],[w],e)},mathmlBuilder(r,e){var{body:t,index:a}=r;return a?new M.MathNode("mroot",[X(t,e),X(a,e)]):new M.MathNode("msqrt",[X(t,e)])}});var fr={display:E.DISPLAY,text:E.TEXT,script:E.SCRIPT,scriptscript:E.SCRIPTSCRIPT};B({type:"styling",names:["\\displaystyle","\\textstyle","\\scriptstyle","\\scriptscriptstyle"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(r,e){var{breakOnTokenText:t,funcName:a,parser:n}=r,s=n.parseExpression(!0,t),l=a.slice(1,a.length-5);return{type:"styling",mode:n.mode,style:l,body:s}},htmlBuilder(r,e){var t=fr[r.style],a=e.havingStyle(t).withFont("");return ma(r.body,a,e)},mathmlBuilder(r,e){var t=fr[r.style],a=e.havingStyle(t),n=m0(r.body,a),s=new M.MathNode("mstyle",n),l={display:["0","true"],text:["0","false"],script:["1","false"],scriptscript:["2","false"]},h=l[r.style];return s.setAttribute("scriptlevel",h[0]),s.setAttribute("displaystyle",h[1]),s}});var on=function(e,t){var a=e.base;if(a)if(a.type==="op"){var n=a.limits&&(t.style.size===E.DISPLAY.size||a.alwaysHandleSupSub);return n?se:null}else if(a.type==="operatorname"){var s=a.alwaysHandleSupSub&&(t.style.size===E.DISPLAY.size||a.limits);return s?ca:null}else{if(a.type==="accent")return O.isCharacterBox(a.base)?_t:null;if(a.type==="horizBrace"){var l=!e.sub;return l===a.isOver?la:null}else return null}else return null};j0({type:"supsub",htmlBuilder(r,e){var t=on(r,e);if(t)return t(r,e);var{base:a,sup:n,sub:s}=r,l=G(a,e),h,c,f=e.fontMetrics(),v=0,b=0,x=a&&O.isCharacterBox(a);if(n){var w=e.havingStyle(e.style.sup());h=G(n,w,e),x||(v=l.height-w.fontMetrics().supDrop*w.sizeMultiplier/e.sizeMultiplier)}if(s){var A=e.havingStyle(e.style.sub());c=G(s,A,e),x||(b=l.depth+A.fontMetrics().subDrop*A.sizeMultiplier/e.sizeMultiplier)}var q;e.style===E.DISPLAY?q=f.sup1:e.style.cramped?q=f.sup3:q=f.sup2;var _=e.sizeMultiplier,D=T(.5/f.ptPerEm/_),N=null;if(c){var $=r.base&&r.base.type==="op"&&r.base.name&&(r.base.name==="\\oiint"||r.base.name==="\\oiiint");(l instanceof c0||$)&&(N=T(-l.italic))}var H;if(h&&c){v=Math.max(v,q,h.depth+.25*f.xHeight),b=Math.max(b,f.sub2);var F=f.defaultRuleThickness,P=4*F;if(v-h.depth-(c.height-b)0&&(v+=V,b-=V)}var j=[{type:"elem",elem:c,shift:b,marginRight:D,marginLeft:N},{type:"elem",elem:h,shift:-v,marginRight:D}];H=y.makeVList({positionType:"individualShift",children:j},e)}else if(c){b=Math.max(b,f.sub1,c.height-.8*f.xHeight);var U=[{type:"elem",elem:c,marginLeft:N,marginRight:D}];H=y.makeVList({positionType:"shift",positionData:b,children:U},e)}else if(h)v=Math.max(v,q,h.depth+.25*f.xHeight),H=y.makeVList({positionType:"shift",positionData:-v,children:[{type:"elem",elem:h,marginRight:D}]},e);else throw new Error("supsub must have either sup or sub.");var D0=bt(l,"right")||"mord";return y.makeSpan([D0],[l,y.makeSpan(["msupsub"],[H])],e)},mathmlBuilder(r,e){var t=!1,a,n;r.base&&r.base.type==="horizBrace"&&(n=!!r.sup,n===r.base.isOver&&(t=!0,a=r.base.isOver)),r.base&&(r.base.type==="op"||r.base.type==="operatorname")&&(r.base.parentIsSupSub=!0);var s=[X(r.base,e)];r.sub&&s.push(X(r.sub,e)),r.sup&&s.push(X(r.sup,e));var l;if(t)l=a?"mover":"munder";else if(r.sub)if(r.sup){var f=r.base;f&&f.type==="op"&&f.limits&&e.style===E.DISPLAY||f&&f.type==="operatorname"&&f.alwaysHandleSupSub&&(e.style===E.DISPLAY||f.limits)?l="munderover":l="msubsup"}else{var c=r.base;c&&c.type==="op"&&c.limits&&(e.style===E.DISPLAY||c.alwaysHandleSupSub)||c&&c.type==="operatorname"&&c.alwaysHandleSupSub&&(c.limits||e.style===E.DISPLAY)?l="munder":l="msub"}else{var h=r.base;h&&h.type==="op"&&h.limits&&(e.style===E.DISPLAY||h.alwaysHandleSupSub)||h&&h.type==="operatorname"&&h.alwaysHandleSupSub&&(h.limits||e.style===E.DISPLAY)?l="mover":l="msup"}return new M.MathNode(l,s)}});j0({type:"atom",htmlBuilder(r,e){return y.mathsym(r.text,r.mode,e,["m"+r.family])},mathmlBuilder(r,e){var t=new M.MathNode("mo",[y0(r.text,r.mode)]);if(r.family==="bin"){var a=Dt(r,e);a==="bold-italic"&&t.setAttribute("mathvariant",a)}else r.family==="punct"?t.setAttribute("separator","true"):(r.family==="open"||r.family==="close")&&t.setAttribute("stretchy","false");return t}});var da={mi:"italic",mn:"normal",mtext:"normal"};j0({type:"mathord",htmlBuilder(r,e){return y.makeOrd(r,e,"mathord")},mathmlBuilder(r,e){var t=new M.MathNode("mi",[y0(r.text,r.mode,e)]),a=Dt(r,e)||"italic";return a!==da[t.type]&&t.setAttribute("mathvariant",a),t}});j0({type:"textord",htmlBuilder(r,e){return y.makeOrd(r,e,"textord")},mathmlBuilder(r,e){var t=y0(r.text,r.mode,e),a=Dt(r,e)||"normal",n;return r.mode==="text"?n=new M.MathNode("mtext",[t]):/[0-9]/.test(r.text)?n=new M.MathNode("mn",[t]):r.text==="\\prime"?n=new M.MathNode("mo",[t]):n=new M.MathNode("mi",[t]),a!==da[n.type]&&n.setAttribute("mathvariant",a),n}});var ct={"\\nobreak":"nobreak","\\allowbreak":"allowbreak"},mt={" ":{},"\\ ":{},"~":{className:"nobreak"},"\\space":{},"\\nobreakspace":{className:"nobreak"}};j0({type:"spacing",htmlBuilder(r,e){if(mt.hasOwnProperty(r.text)){var t=mt[r.text].className||"";if(r.mode==="text"){var a=y.makeOrd(r,e,"textord");return a.classes.push(t),a}else return y.makeSpan(["mspace",t],[y.mathsym(r.text,r.mode,e)],e)}else{if(ct.hasOwnProperty(r.text))return y.makeSpan(["mspace",ct[r.text]],[],e);throw new z('Unknown type of space "'+r.text+'"')}},mathmlBuilder(r,e){var t;if(mt.hasOwnProperty(r.text))t=new M.MathNode("mtext",[new M.TextNode("\xA0")]);else{if(ct.hasOwnProperty(r.text))return new M.MathNode("mspace");throw new z('Unknown type of space "'+r.text+'"')}return t}});var vr=()=>{var r=new M.MathNode("mtd",[]);return r.setAttribute("width","50%"),r};j0({type:"tag",mathmlBuilder(r,e){var t=new M.MathNode("mtable",[new M.MathNode("mtr",[vr(),new M.MathNode("mtd",[V0(r.body,e)]),vr(),new M.MathNode("mtd",[V0(r.tag,e)])])]);return t.setAttribute("width","100%"),t}});var gr={"\\text":void 0,"\\textrm":"textrm","\\textsf":"textsf","\\texttt":"texttt","\\textnormal":"textrm"},br={"\\textbf":"textbf","\\textmd":"textmd"},ln={"\\textit":"textit","\\textup":"textup"},yr=(r,e)=>{var t=r.font;if(t){if(gr[t])return e.withTextFontFamily(gr[t]);if(br[t])return e.withTextFontWeight(br[t]);if(t==="\\emph")return e.fontShape==="textit"?e.withTextFontShape("textup"):e.withTextFontShape("textit")}else return e;return e.withTextFontShape(ln[t])};B({type:"text",names:["\\text","\\textrm","\\textsf","\\texttt","\\textnormal","\\textbf","\\textmd","\\textit","\\textup","\\emph"],props:{numArgs:1,argTypes:["text"],allowedInArgument:!0,allowedInText:!0},handler(r,e){var{parser:t,funcName:a}=r,n=e[0];return{type:"text",mode:t.mode,body:e0(n),font:a}},htmlBuilder(r,e){var t=yr(r,e),a=a0(r.body,t,!0);return y.makeSpan(["mord","text"],a,t)},mathmlBuilder(r,e){var t=yr(r,e);return V0(r.body,t)}});B({type:"underline",names:["\\underline"],props:{numArgs:1,allowedInText:!0},handler(r,e){var{parser:t}=r;return{type:"underline",mode:t.mode,body:e[0]}},htmlBuilder(r,e){var t=G(r.body,e),a=y.makeLineSpan("underline-line",e),n=e.fontMetrics().defaultRuleThickness,s=y.makeVList({positionType:"top",positionData:t.height,children:[{type:"kern",size:n},{type:"elem",elem:a},{type:"kern",size:3*n},{type:"elem",elem:t}]},e);return y.makeSpan(["mord","underline"],[s],e)},mathmlBuilder(r,e){var t=new M.MathNode("mo",[new M.TextNode("\u203E")]);t.setAttribute("stretchy","true");var a=new M.MathNode("munder",[X(r.body,e),t]);return a.setAttribute("accentunder","true"),a}});B({type:"vcenter",names:["\\vcenter"],props:{numArgs:1,argTypes:["original"],allowedInText:!1},handler(r,e){var{parser:t}=r;return{type:"vcenter",mode:t.mode,body:e[0]}},htmlBuilder(r,e){var t=G(r.body,e),a=e.fontMetrics().axisHeight,n=.5*(t.height-a-(t.depth+a));return y.makeVList({positionType:"shift",positionData:n,children:[{type:"elem",elem:t}]},e)},mathmlBuilder(r,e){return new M.MathNode("mpadded",[X(r.body,e)],["vcenter"])}});B({type:"verb",names:["\\verb"],props:{numArgs:0,allowedInText:!0},handler(r,e,t){throw new z("\\verb ended by end of line instead of matching delimiter")},htmlBuilder(r,e){for(var t=xr(r),a=[],n=e.havingStyle(e.style.text()),s=0;sr.body.replace(/ /g,r.star?"\u2423":"\xA0"),P0=Er,pa=`[ \r + `+V+" children.");for(var i0=0;i00&&(n.style.minWidth=T(s)),n},O1=function(e,t,a,n,s){var l,h=e.height+e.depth+a+n;if(/fbox|color|angl/.test(t)){if(l=y.makeSpan(["stretchy",t],[],s),t==="fbox"){var c=s.color&&s.getColor();c&&(l.style.borderColor=c)}}else{var f=[];/^[bx]cancel$/.test(t)&&f.push(new ve({x1:"0",y1:"0",x2:"100%",y2:"100%","stroke-width":"0.046em"})),/^x?cancel$/.test(t)&&f.push(new ve({x1:"0",y1:"100%",x2:"100%",y2:"0","stroke-width":"0.046em"}));var v=new S0(f,{width:"100%",height:T(h)});l=y.makeSvgSpan([],[v],s)}return l.height=h,l.style.height=T(h),l},E0={encloseSpan:O1,mathMLnode:D1,svgSpan:N1};function L(r,e){if(!r||r.type!==e)throw new Error("Expected node of type "+e+", but got "+(r?"node of type "+r.type:String(r)));return r}function Ct(r){var e=Xe(r);if(!e)throw new Error("Expected node of symbol group type, but got "+(r?"node of type "+r.type:String(r)));return e}function Xe(r){return r&&(r.type==="atom"||s1.hasOwnProperty(r.type))?r:null}var _t=(r,e)=>{var t,a,n;r&&r.type==="supsub"?(a=L(r.base,"accent"),t=a.base,r.base=t,n=n1(G(r,e)),r.base=a):(a=L(r,"accent"),t=a.base);var s=G(t,e.havingCrampedStyle()),l=a.isShifty&&O.isCharacterBox(t),h=0;if(l){var c=O.getBaseElem(t),f=G(c,e.havingCrampedStyle());h=Jt(f).skew}var v=a.label==="\\c",b=v?s.height+s.depth:Math.min(s.height,e.fontMetrics().xHeight),x;if(a.isStretchy)x=E0.svgSpan(a,e),x=y.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:s},{type:"elem",elem:x,wrapperClasses:["svg-align"],wrapperStyle:h>0?{width:"calc(100% - "+T(2*h)+")",marginLeft:T(2*h)}:void 0}]},e);else{var w,A;a.label==="\\vec"?(w=y.staticSvg("vec",e),A=y.svgData.vec[1]):(w=y.makeOrd({mode:a.mode,text:a.label},e,"textord"),w=Jt(w),w.italic=0,A=w.width,v&&(b+=w.depth)),x=y.makeSpan(["accent-body"],[w]);var q=a.label==="\\textcircled";q&&(x.classes.push("accent-full"),b=s.height);var _=h;q||(_-=A/2),x.style.left=T(_),a.label==="\\textcircled"&&(x.style.top=".2em"),x=y.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:s},{type:"kern",size:-b},{type:"elem",elem:x}]},e)}var D=y.makeSpan(["mord","accent"],[x],e);return n?(n.children[0]=D,n.height=Math.max(D.height,n.height),n.classes[0]="mord",n):D},Hr=(r,e)=>{var t=r.isStretchy?E0.mathMLnode(r.label):new M.MathNode("mo",[y0(r.label,r.mode)]),a=new M.MathNode("mover",[X(r.base,e),t]);return a.setAttribute("accent","true"),a},I1=new RegExp(["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring"].map(r=>"\\"+r).join("|"));B({type:"accent",names:["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring","\\widecheck","\\widehat","\\widetilde","\\overrightarrow","\\overleftarrow","\\Overrightarrow","\\overleftrightarrow","\\overgroup","\\overlinesegment","\\overleftharpoon","\\overrightharpoon"],props:{numArgs:1},handler:(r,e)=>{var t=He(e[0]),a=!I1.test(r.funcName),n=!a||r.funcName==="\\widehat"||r.funcName==="\\widetilde"||r.funcName==="\\widecheck";return{type:"accent",mode:r.parser.mode,label:r.funcName,isStretchy:a,isShifty:n,base:t}},htmlBuilder:_t,mathmlBuilder:Hr});B({type:"accent",names:["\\'","\\`","\\^","\\~","\\=","\\u","\\.",'\\"',"\\c","\\r","\\H","\\v","\\textcircled"],props:{numArgs:1,allowedInText:!0,allowedInMath:!0,argTypes:["primitive"]},handler:(r,e)=>{var t=e[0],a=r.parser.mode;return a==="math"&&(r.parser.settings.reportNonstrict("mathVsTextAccents","LaTeX's accent "+r.funcName+" works only in text mode"),a="text"),{type:"accent",mode:a,label:r.funcName,isStretchy:!1,isShifty:!0,base:t}},htmlBuilder:_t,mathmlBuilder:Hr});B({type:"accentUnder",names:["\\underleftarrow","\\underrightarrow","\\underleftrightarrow","\\undergroup","\\underlinesegment","\\utilde"],props:{numArgs:1},handler:(r,e)=>{var{parser:t,funcName:a}=r,n=e[0];return{type:"accentUnder",mode:t.mode,label:a,base:n}},htmlBuilder:(r,e)=>{var t=G(r.base,e),a=E0.svgSpan(r,e),n=r.label==="\\utilde"?.12:0,s=y.makeVList({positionType:"top",positionData:t.height,children:[{type:"elem",elem:a,wrapperClasses:["svg-align"]},{type:"kern",size:n},{type:"elem",elem:t}]},e);return y.makeSpan(["mord","accentunder"],[s],e)},mathmlBuilder:(r,e)=>{var t=E0.mathMLnode(r.label),a=new M.MathNode("munder",[X(r.base,e),t]);return a.setAttribute("accentunder","true"),a}});var Ce=r=>{var e=new M.MathNode("mpadded",r?[r]:[]);return e.setAttribute("width","+0.6em"),e.setAttribute("lspace","0.3em"),e};B({type:"xArrow",names:["\\xleftarrow","\\xrightarrow","\\xLeftarrow","\\xRightarrow","\\xleftrightarrow","\\xLeftrightarrow","\\xhookleftarrow","\\xhookrightarrow","\\xmapsto","\\xrightharpoondown","\\xrightharpoonup","\\xleftharpoondown","\\xleftharpoonup","\\xrightleftharpoons","\\xleftrightharpoons","\\xlongequal","\\xtwoheadrightarrow","\\xtwoheadleftarrow","\\xtofrom","\\xrightleftarrows","\\xrightequilibrium","\\xleftequilibrium","\\\\cdrightarrow","\\\\cdleftarrow","\\\\cdlongequal"],props:{numArgs:1,numOptionalArgs:1},handler(r,e,t){var{parser:a,funcName:n}=r;return{type:"xArrow",mode:a.mode,label:n,body:e[0],below:t[0]}},htmlBuilder(r,e){var t=e.style,a=e.havingStyle(t.sup()),n=y.wrapFragment(G(r.body,a,e),e),s=r.label.slice(0,2)==="\\x"?"x":"cd";n.classes.push(s+"-arrow-pad");var l;r.below&&(a=e.havingStyle(t.sub()),l=y.wrapFragment(G(r.below,a,e),e),l.classes.push(s+"-arrow-pad"));var h=E0.svgSpan(r,e),c=-e.fontMetrics().axisHeight+.5*h.height,f=-e.fontMetrics().axisHeight-.5*h.height-.111;(n.depth>.25||r.label==="\\xleftequilibrium")&&(f-=n.depth);var v;if(l){var b=-e.fontMetrics().axisHeight+l.height+.5*h.height+.111;v=y.makeVList({positionType:"individualShift",children:[{type:"elem",elem:n,shift:f},{type:"elem",elem:h,shift:c},{type:"elem",elem:l,shift:b}]},e)}else v=y.makeVList({positionType:"individualShift",children:[{type:"elem",elem:n,shift:f},{type:"elem",elem:h,shift:c}]},e);return v.children[0].children[0].children[1].classes.push("svg-align"),y.makeSpan(["mrel","x-arrow"],[v],e)},mathmlBuilder(r,e){var t=E0.mathMLnode(r.label);t.setAttribute("minsize",r.label.charAt(0)==="x"?"1.75em":"3.0em");var a;if(r.body){var n=Ce(X(r.body,e));if(r.below){var s=Ce(X(r.below,e));a=new M.MathNode("munderover",[t,s,n])}else a=new M.MathNode("mover",[t,n])}else if(r.below){var l=Ce(X(r.below,e));a=new M.MathNode("munder",[t,l])}else a=Ce(),a=new M.MathNode("mover",[t,a]);return a}});var E1=y.makeSpan;function Pr(r,e){var t=a0(r.body,e,!0);return E1([r.mclass],t,e)}function Gr(r,e){var t,a=m0(r.body,e);return r.mclass==="minner"?t=new M.MathNode("mpadded",a):r.mclass==="mord"?r.isCharacterBox?(t=a[0],t.type="mi"):t=new M.MathNode("mi",a):(r.isCharacterBox?(t=a[0],t.type="mo"):t=new M.MathNode("mo",a),r.mclass==="mbin"?(t.attributes.lspace="0.22em",t.attributes.rspace="0.22em"):r.mclass==="mpunct"?(t.attributes.lspace="0em",t.attributes.rspace="0.17em"):r.mclass==="mopen"||r.mclass==="mclose"?(t.attributes.lspace="0em",t.attributes.rspace="0em"):r.mclass==="minner"&&(t.attributes.lspace="0.0556em",t.attributes.width="+0.1111em")),t}B({type:"mclass",names:["\\mathord","\\mathbin","\\mathrel","\\mathopen","\\mathclose","\\mathpunct","\\mathinner"],props:{numArgs:1,primitive:!0},handler(r,e){var{parser:t,funcName:a}=r,n=e[0];return{type:"mclass",mode:t.mode,mclass:"m"+a.slice(5),body:e0(n),isCharacterBox:O.isCharacterBox(n)}},htmlBuilder:Pr,mathmlBuilder:Gr});var We=r=>{var e=r.type==="ordgroup"&&r.body.length?r.body[0]:r;return e.type==="atom"&&(e.family==="bin"||e.family==="rel")?"m"+e.family:"mord"};B({type:"mclass",names:["\\@binrel"],props:{numArgs:2},handler(r,e){var{parser:t}=r;return{type:"mclass",mode:t.mode,mclass:We(e[0]),body:e0(e[1]),isCharacterBox:O.isCharacterBox(e[1])}}});B({type:"mclass",names:["\\stackrel","\\overset","\\underset"],props:{numArgs:2},handler(r,e){var{parser:t,funcName:a}=r,n=e[1],s=e[0],l;a!=="\\stackrel"?l=We(n):l="mrel";var h={type:"op",mode:n.mode,limits:!0,alwaysHandleSupSub:!0,parentIsSupSub:!1,symbol:!1,suppressBaseShift:a!=="\\stackrel",body:e0(n)},c={type:"supsub",mode:s.mode,base:h,sup:a==="\\underset"?null:s,sub:a==="\\underset"?s:null};return{type:"mclass",mode:t.mode,mclass:l,body:[c],isCharacterBox:O.isCharacterBox(c)}},htmlBuilder:Pr,mathmlBuilder:Gr});B({type:"pmb",names:["\\pmb"],props:{numArgs:1,allowedInText:!0},handler(r,e){var{parser:t}=r;return{type:"pmb",mode:t.mode,mclass:We(e[0]),body:e0(e[0])}},htmlBuilder(r,e){var t=a0(r.body,e,!0),a=y.makeSpan([r.mclass],t,e);return a.style.textShadow="0.02em 0.01em 0.04px",a},mathmlBuilder(r,e){var t=m0(r.body,e),a=new M.MathNode("mstyle",t);return a.setAttribute("style","text-shadow: 0.02em 0.01em 0.04px"),a}});var R1={">":"\\\\cdrightarrow","<":"\\\\cdleftarrow","=":"\\\\cdlongequal",A:"\\uparrow",V:"\\downarrow","|":"\\Vert",".":"no arrow"},nr=()=>({type:"styling",body:[],mode:"math",style:"display"}),ir=r=>r.type==="textord"&&r.text==="@",$1=(r,e)=>(r.type==="mathord"||r.type==="atom")&&r.text===e;function L1(r,e,t){var a=R1[r];switch(a){case"\\\\cdrightarrow":case"\\\\cdleftarrow":return t.callFunction(a,[e[0]],[e[1]]);case"\\uparrow":case"\\downarrow":{var n=t.callFunction("\\\\cdleft",[e[0]],[]),s={type:"atom",text:a,mode:"math",family:"rel"},l=t.callFunction("\\Big",[s],[]),h=t.callFunction("\\\\cdright",[e[1]],[]),c={type:"ordgroup",mode:"math",body:[n,l,h]};return t.callFunction("\\\\cdparent",[c],[])}case"\\\\cdlongequal":return t.callFunction("\\\\cdlongequal",[],[]);case"\\Vert":{var f={type:"textord",text:"\\Vert",mode:"math"};return t.callFunction("\\Big",[f],[])}default:return{type:"textord",text:" ",mode:"math"}}}function F1(r){var e=[];for(r.gullet.beginGroup(),r.gullet.macros.set("\\cr","\\\\\\relax"),r.gullet.beginGroup();;){e.push(r.parseExpression(!1,"\\\\")),r.gullet.endGroup(),r.gullet.beginGroup();var t=r.fetch().text;if(t==="&"||t==="\\\\")r.consume();else if(t==="\\end"){e[e.length-1].length===0&&e.pop();break}else throw new z("Expected \\\\ or \\cr or \\end",r.nextToken)}for(var a=[],n=[a],s=0;s-1))if("<>AV".indexOf(f)>-1)for(var b=0;b<2;b++){for(var x=!0,w=c+1;wAV=|." after @',l[c]);var A=L1(f,v,r),q={type:"styling",body:[A],mode:"math",style:"display"};a.push(q),h=nr()}s%2===0?a.push(h):a.shift(),a=[],n.push(a)}r.gullet.endGroup(),r.gullet.endGroup();var _=new Array(n[0].length).fill({type:"align",align:"c",pregap:.25,postgap:.25});return{type:"array",mode:"math",body:n,arraystretch:1,addJot:!0,rowGaps:[null],cols:_,colSeparationType:"CD",hLinesBeforeRow:new Array(n.length+1).fill([])}}B({type:"cdlabel",names:["\\\\cdleft","\\\\cdright"],props:{numArgs:1},handler(r,e){var{parser:t,funcName:a}=r;return{type:"cdlabel",mode:t.mode,side:a.slice(4),label:e[0]}},htmlBuilder(r,e){var t=e.havingStyle(e.style.sup()),a=y.wrapFragment(G(r.label,t,e),e);return a.classes.push("cd-label-"+r.side),a.style.bottom=T(.8-a.depth),a.height=0,a.depth=0,a},mathmlBuilder(r,e){var t=new M.MathNode("mrow",[X(r.label,e)]);return t=new M.MathNode("mpadded",[t]),t.setAttribute("width","0"),r.side==="left"&&t.setAttribute("lspace","-1width"),t.setAttribute("voffset","0.7em"),t=new M.MathNode("mstyle",[t]),t.setAttribute("displaystyle","false"),t.setAttribute("scriptlevel","1"),t}});B({type:"cdlabelparent",names:["\\\\cdparent"],props:{numArgs:1},handler(r,e){var{parser:t}=r;return{type:"cdlabelparent",mode:t.mode,fragment:e[0]}},htmlBuilder(r,e){var t=y.wrapFragment(G(r.fragment,e),e);return t.classes.push("cd-vert-arrow"),t},mathmlBuilder(r,e){return new M.MathNode("mrow",[X(r.fragment,e)])}});B({type:"textord",names:["\\@char"],props:{numArgs:1,allowedInText:!0},handler(r,e){for(var{parser:t}=r,a=L(e[0],"ordgroup"),n=a.body,s="",l=0;l=1114111)throw new z("\\@char with invalid code point "+s);return c<=65535?f=String.fromCharCode(c):(c-=65536,f=String.fromCharCode((c>>10)+55296,(c&1023)+56320)),{type:"textord",mode:t.mode,text:f}}});var Vr=(r,e)=>{var t=a0(r.body,e.withColor(r.color),!1);return y.makeFragment(t)},Ur=(r,e)=>{var t=m0(r.body,e.withColor(r.color)),a=new M.MathNode("mstyle",t);return a.setAttribute("mathcolor",r.color),a};B({type:"color",names:["\\textcolor"],props:{numArgs:2,allowedInText:!0,argTypes:["color","original"]},handler(r,e){var{parser:t}=r,a=L(e[0],"color-token").color,n=e[1];return{type:"color",mode:t.mode,color:a,body:e0(n)}},htmlBuilder:Vr,mathmlBuilder:Ur});B({type:"color",names:["\\color"],props:{numArgs:1,allowedInText:!0,argTypes:["color"]},handler(r,e){var{parser:t,breakOnTokenText:a}=r,n=L(e[0],"color-token").color;t.gullet.macros.set("\\current@color",n);var s=t.parseExpression(!0,a);return{type:"color",mode:t.mode,color:n,body:s}},htmlBuilder:Vr,mathmlBuilder:Ur});B({type:"cr",names:["\\\\"],props:{numArgs:0,numOptionalArgs:0,allowedInText:!0},handler(r,e,t){var{parser:a}=r,n=a.gullet.future().text==="["?a.parseSizeGroup(!0):null,s=!a.settings.displayMode||!a.settings.useStrictBehavior("newLineInDisplayMode","In LaTeX, \\\\ or \\newline does nothing in display mode");return{type:"cr",mode:a.mode,newLine:s,size:n&&L(n,"size").value}},htmlBuilder(r,e){var t=y.makeSpan(["mspace"],[],e);return r.newLine&&(t.classes.push("newline"),r.size&&(t.style.marginTop=T(Q(r.size,e)))),t},mathmlBuilder(r,e){var t=new M.MathNode("mspace");return r.newLine&&(t.setAttribute("linebreak","newline"),r.size&&t.setAttribute("height",T(Q(r.size,e)))),t}});var wt={"\\global":"\\global","\\long":"\\\\globallong","\\\\globallong":"\\\\globallong","\\def":"\\gdef","\\gdef":"\\gdef","\\edef":"\\xdef","\\xdef":"\\xdef","\\let":"\\\\globallet","\\futurelet":"\\\\globalfuture"},Xr=r=>{var e=r.text;if(/^(?:[\\{}$&#^_]|EOF)$/.test(e))throw new z("Expected a control sequence",r);return e},H1=r=>{var e=r.gullet.popToken();return e.text==="="&&(e=r.gullet.popToken(),e.text===" "&&(e=r.gullet.popToken())),e},Wr=(r,e,t,a)=>{var n=r.gullet.macros.get(t.text);n==null&&(t.noexpand=!0,n={tokens:[t],numArgs:0,unexpandable:!r.gullet.isExpandable(t.text)}),r.gullet.macros.set(e,n,a)};B({type:"internal",names:["\\global","\\long","\\\\globallong"],props:{numArgs:0,allowedInText:!0},handler(r){var{parser:e,funcName:t}=r;e.consumeSpaces();var a=e.fetch();if(wt[a.text])return(t==="\\global"||t==="\\\\globallong")&&(a.text=wt[a.text]),L(e.parseFunction(),"internal");throw new z("Invalid token after macro prefix",a)}});B({type:"internal",names:["\\def","\\gdef","\\edef","\\xdef"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(r){var{parser:e,funcName:t}=r,a=e.gullet.popToken(),n=a.text;if(/^(?:[\\{}$&#^_]|EOF)$/.test(n))throw new z("Expected a control sequence",a);for(var s=0,l,h=[[]];e.gullet.future().text!=="{";)if(a=e.gullet.popToken(),a.text==="#"){if(e.gullet.future().text==="{"){l=e.gullet.future(),h[s].push("{");break}if(a=e.gullet.popToken(),!/^[1-9]$/.test(a.text))throw new z('Invalid argument number "'+a.text+'"');if(parseInt(a.text)!==s+1)throw new z('Argument number "'+a.text+'" out of order');s++,h.push([])}else{if(a.text==="EOF")throw new z("Expected a macro definition");h[s].push(a.text)}var{tokens:c}=e.gullet.consumeArg();return l&&c.unshift(l),(t==="\\edef"||t==="\\xdef")&&(c=e.gullet.expandTokens(c),c.reverse()),e.gullet.macros.set(n,{tokens:c,numArgs:s,delimiters:h},t===wt[t]),{type:"internal",mode:e.mode}}});B({type:"internal",names:["\\let","\\\\globallet"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(r){var{parser:e,funcName:t}=r,a=Xr(e.gullet.popToken());e.gullet.consumeSpaces();var n=H1(e);return Wr(e,a,n,t==="\\\\globallet"),{type:"internal",mode:e.mode}}});B({type:"internal",names:["\\futurelet","\\\\globalfuture"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(r){var{parser:e,funcName:t}=r,a=Xr(e.gullet.popToken()),n=e.gullet.popToken(),s=e.gullet.popToken();return Wr(e,a,s,t==="\\\\globalfuture"),e.gullet.pushToken(s),e.gullet.pushToken(n),{type:"internal",mode:e.mode}}});var ce=function(e,t,a){var n=Y.math[e]&&Y.math[e].replace,s=Tt(n||e,t,a);if(!s)throw new Error("Unsupported symbol "+e+" and font size "+t+".");return s},Nt=function(e,t,a,n){var s=a.havingBaseStyle(t),l=y.makeSpan(n.concat(s.sizingClasses(a)),[e],a),h=s.sizeMultiplier/a.sizeMultiplier;return l.height*=h,l.depth*=h,l.maxFontSize=s.sizeMultiplier,l},Yr=function(e,t,a){var n=t.havingBaseStyle(a),s=(1-t.sizeMultiplier/n.sizeMultiplier)*t.fontMetrics().axisHeight;e.classes.push("delimcenter"),e.style.top=T(s),e.height-=s,e.depth+=s},P1=function(e,t,a,n,s,l){var h=y.makeSymbol(e,"Main-Regular",s,n),c=Nt(h,t,n,l);return a&&Yr(c,n,t),c},G1=function(e,t,a,n){return y.makeSymbol(e,"Size"+t+"-Regular",a,n)},Zr=function(e,t,a,n,s,l){var h=G1(e,t,s,n),c=Nt(y.makeSpan(["delimsizing","size"+t],[h],n),E.TEXT,n,l);return a&&Yr(c,n,E.TEXT),c},it=function(e,t,a){var n;t==="Size1-Regular"?n="delim-size1":n="delim-size4";var s=y.makeSpan(["delimsizinginner",n],[y.makeSpan([],[y.makeSymbol(e,t,a)])]);return{type:"elem",elem:s}},st=function(e,t,a){var n=z0["Size4-Regular"][e.charCodeAt(0)]?z0["Size4-Regular"][e.charCodeAt(0)][4]:z0["Size1-Regular"][e.charCodeAt(0)][4],s=new A0("inner",ja(e,Math.round(1e3*t))),l=new S0([s],{width:T(n),height:T(t),style:"width:"+T(n),viewBox:"0 0 "+1e3*n+" "+Math.round(1e3*t),preserveAspectRatio:"xMinYMin"}),h=y.makeSvgSpan([],[l],a);return h.height=t,h.style.height=T(t),h.style.width=T(n),{type:"elem",elem:h}},St=.008,_e={type:"kern",size:-1*St},V1=["|","\\lvert","\\rvert","\\vert"],U1=["\\|","\\lVert","\\rVert","\\Vert"],jr=function(e,t,a,n,s,l){var h,c,f,v,b="",x=0;h=f=v=e,c=null;var w="Size1-Regular";e==="\\uparrow"?f=v="\u23D0":e==="\\Uparrow"?f=v="\u2016":e==="\\downarrow"?h=f="\u23D0":e==="\\Downarrow"?h=f="\u2016":e==="\\updownarrow"?(h="\\uparrow",f="\u23D0",v="\\downarrow"):e==="\\Updownarrow"?(h="\\Uparrow",f="\u2016",v="\\Downarrow"):O.contains(V1,e)?(f="\u2223",b="vert",x=333):O.contains(U1,e)?(f="\u2225",b="doublevert",x=556):e==="["||e==="\\lbrack"?(h="\u23A1",f="\u23A2",v="\u23A3",w="Size4-Regular",b="lbrack",x=667):e==="]"||e==="\\rbrack"?(h="\u23A4",f="\u23A5",v="\u23A6",w="Size4-Regular",b="rbrack",x=667):e==="\\lfloor"||e==="\u230A"?(f=h="\u23A2",v="\u23A3",w="Size4-Regular",b="lfloor",x=667):e==="\\lceil"||e==="\u2308"?(h="\u23A1",f=v="\u23A2",w="Size4-Regular",b="lceil",x=667):e==="\\rfloor"||e==="\u230B"?(f=h="\u23A5",v="\u23A6",w="Size4-Regular",b="rfloor",x=667):e==="\\rceil"||e==="\u2309"?(h="\u23A4",f=v="\u23A5",w="Size4-Regular",b="rceil",x=667):e==="("||e==="\\lparen"?(h="\u239B",f="\u239C",v="\u239D",w="Size4-Regular",b="lparen",x=875):e===")"||e==="\\rparen"?(h="\u239E",f="\u239F",v="\u23A0",w="Size4-Regular",b="rparen",x=875):e==="\\{"||e==="\\lbrace"?(h="\u23A7",c="\u23A8",v="\u23A9",f="\u23AA",w="Size4-Regular"):e==="\\}"||e==="\\rbrace"?(h="\u23AB",c="\u23AC",v="\u23AD",f="\u23AA",w="Size4-Regular"):e==="\\lgroup"||e==="\u27EE"?(h="\u23A7",v="\u23A9",f="\u23AA",w="Size4-Regular"):e==="\\rgroup"||e==="\u27EF"?(h="\u23AB",v="\u23AD",f="\u23AA",w="Size4-Regular"):e==="\\lmoustache"||e==="\u23B0"?(h="\u23A7",v="\u23AD",f="\u23AA",w="Size4-Regular"):(e==="\\rmoustache"||e==="\u23B1")&&(h="\u23AB",v="\u23A9",f="\u23AA",w="Size4-Regular");var A=ce(h,w,s),q=A.height+A.depth,_=ce(f,w,s),D=_.height+_.depth,N=ce(v,w,s),$=N.height+N.depth,H=0,F=1;if(c!==null){var P=ce(c,w,s);H=P.height+P.depth,F=2}var V=q+$+H,j=Math.max(0,Math.ceil((t-V)/(F*D))),U=V+j*F*D,D0=n.fontMetrics().axisHeight;a&&(D0*=n.sizeMultiplier);var i0=U/2-D0,r0=[];if(b.length>0){var X0=U-q-$,u0=Math.round(U*1e3),x0=Ka(b,Math.round(X0*1e3)),$0=new A0(b,x0),K0=(x/1e3).toFixed(3)+"em",J0=(u0/1e3).toFixed(3)+"em",je=new S0([$0],{width:K0,height:J0,viewBox:"0 0 "+x+" "+u0}),L0=y.makeSvgSpan([],[je],n);L0.height=u0/1e3,L0.style.width=K0,L0.style.height=J0,r0.push({type:"elem",elem:L0})}else{if(r0.push(it(v,w,s)),r0.push(_e),c===null){var F0=U-q-$+2*St;r0.push(st(f,F0,n))}else{var f0=(U-q-$-H)/2+2*St;r0.push(st(f,f0,n)),r0.push(_e),r0.push(it(c,w,s)),r0.push(_e),r0.push(st(f,f0,n))}r0.push(_e),r0.push(it(h,w,s))}var le=n.havingBaseStyle(E.TEXT),Ke=y.makeVList({positionType:"bottom",positionData:i0,children:r0},le);return Nt(y.makeSpan(["delimsizing","mult"],[Ke],le),E.TEXT,n,l)},ot=80,lt=.08,ut=function(e,t,a,n,s){var l=Za(e,n,a),h=new A0(e,l),c=new S0([h],{width:"400em",height:T(t),viewBox:"0 0 400000 "+a,preserveAspectRatio:"xMinYMin slice"});return y.makeSvgSpan(["hide-tail"],[c],s)},X1=function(e,t){var a=t.havingBaseSizing(),n=ea("\\surd",e*a.sizeMultiplier,Qr,a),s=a.sizeMultiplier,l=Math.max(0,t.minRuleThickness-t.fontMetrics().sqrtRuleThickness),h,c=0,f=0,v=0,b;return n.type==="small"?(v=1e3+1e3*l+ot,e<1?s=1:e<1.4&&(s=.7),c=(1+l+lt)/s,f=(1+l)/s,h=ut("sqrtMain",c,v,l,t),h.style.minWidth="0.853em",b=.833/s):n.type==="large"?(v=(1e3+ot)*me[n.size],f=(me[n.size]+l)/s,c=(me[n.size]+l+lt)/s,h=ut("sqrtSize"+n.size,c,v,l,t),h.style.minWidth="1.02em",b=1/s):(c=e+l+lt,f=e+l,v=Math.floor(1e3*e+l)+ot,h=ut("sqrtTall",c,v,l,t),h.style.minWidth="0.742em",b=1.056),h.height=f,h.style.height=T(c),{span:h,advanceWidth:b,ruleWidth:(t.fontMetrics().sqrtRuleThickness+l)*s}},Kr=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","\u230A","\u230B","\\lceil","\\rceil","\u2308","\u2309","\\surd"],W1=["\\uparrow","\\downarrow","\\updownarrow","\\Uparrow","\\Downarrow","\\Updownarrow","|","\\|","\\vert","\\Vert","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","\u27EE","\u27EF","\\lmoustache","\\rmoustache","\u23B0","\u23B1"],Jr=["<",">","\\langle","\\rangle","/","\\backslash","\\lt","\\gt"],me=[0,1.2,1.8,2.4,3],Y1=function(e,t,a,n,s){if(e==="<"||e==="\\lt"||e==="\u27E8"?e="\\langle":(e===">"||e==="\\gt"||e==="\u27E9")&&(e="\\rangle"),O.contains(Kr,e)||O.contains(Jr,e))return Zr(e,t,!1,a,n,s);if(O.contains(W1,e))return jr(e,me[t],!1,a,n,s);throw new z("Illegal delimiter: '"+e+"'")},Z1=[{type:"small",style:E.SCRIPTSCRIPT},{type:"small",style:E.SCRIPT},{type:"small",style:E.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4}],j1=[{type:"small",style:E.SCRIPTSCRIPT},{type:"small",style:E.SCRIPT},{type:"small",style:E.TEXT},{type:"stack"}],Qr=[{type:"small",style:E.SCRIPTSCRIPT},{type:"small",style:E.SCRIPT},{type:"small",style:E.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4},{type:"stack"}],K1=function(e){if(e.type==="small")return"Main-Regular";if(e.type==="large")return"Size"+e.size+"-Regular";if(e.type==="stack")return"Size4-Regular";throw new Error("Add support for delim type '"+e.type+"' here.")},ea=function(e,t,a,n){for(var s=Math.min(2,3-n.style.size),l=s;lt)return a[l]}return a[a.length-1]},ta=function(e,t,a,n,s,l){e==="<"||e==="\\lt"||e==="\u27E8"?e="\\langle":(e===">"||e==="\\gt"||e==="\u27E9")&&(e="\\rangle");var h;O.contains(Jr,e)?h=Z1:O.contains(Kr,e)?h=Qr:h=j1;var c=ea(e,t,h,n);return c.type==="small"?P1(e,c.style,a,n,s,l):c.type==="large"?Zr(e,c.size,a,n,s,l):jr(e,t,a,n,s,l)},J1=function(e,t,a,n,s,l){var h=n.fontMetrics().axisHeight*n.sizeMultiplier,c=901,f=5/n.fontMetrics().ptPerEm,v=Math.max(t-h,a+h),b=Math.max(v/500*c,2*v-f);return ta(e,b,!0,n,s,l)},O0={sqrtImage:X1,sizedDelim:Y1,sizeToMaxHeight:me,customSizedDelim:ta,leftRightDelim:J1},sr={"\\bigl":{mclass:"mopen",size:1},"\\Bigl":{mclass:"mopen",size:2},"\\biggl":{mclass:"mopen",size:3},"\\Biggl":{mclass:"mopen",size:4},"\\bigr":{mclass:"mclose",size:1},"\\Bigr":{mclass:"mclose",size:2},"\\biggr":{mclass:"mclose",size:3},"\\Biggr":{mclass:"mclose",size:4},"\\bigm":{mclass:"mrel",size:1},"\\Bigm":{mclass:"mrel",size:2},"\\biggm":{mclass:"mrel",size:3},"\\Biggm":{mclass:"mrel",size:4},"\\big":{mclass:"mord",size:1},"\\Big":{mclass:"mord",size:2},"\\bigg":{mclass:"mord",size:3},"\\Bigg":{mclass:"mord",size:4}},Q1=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","\u230A","\u230B","\\lceil","\\rceil","\u2308","\u2309","<",">","\\langle","\u27E8","\\rangle","\u27E9","\\lt","\\gt","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","\u27EE","\u27EF","\\lmoustache","\\rmoustache","\u23B0","\u23B1","/","\\backslash","|","\\vert","\\|","\\Vert","\\uparrow","\\Uparrow","\\downarrow","\\Downarrow","\\updownarrow","\\Updownarrow","."];function Ye(r,e){var t=Xe(r);if(t&&O.contains(Q1,t.text))return t;throw t?new z("Invalid delimiter '"+t.text+"' after '"+e.funcName+"'",r):new z("Invalid delimiter type '"+r.type+"'",r)}B({type:"delimsizing",names:["\\bigl","\\Bigl","\\biggl","\\Biggl","\\bigr","\\Bigr","\\biggr","\\Biggr","\\bigm","\\Bigm","\\biggm","\\Biggm","\\big","\\Big","\\bigg","\\Bigg"],props:{numArgs:1,argTypes:["primitive"]},handler:(r,e)=>{var t=Ye(e[0],r);return{type:"delimsizing",mode:r.parser.mode,size:sr[r.funcName].size,mclass:sr[r.funcName].mclass,delim:t.text}},htmlBuilder:(r,e)=>r.delim==="."?y.makeSpan([r.mclass]):O0.sizedDelim(r.delim,r.size,e,r.mode,[r.mclass]),mathmlBuilder:r=>{var e=[];r.delim!=="."&&e.push(y0(r.delim,r.mode));var t=new M.MathNode("mo",e);r.mclass==="mopen"||r.mclass==="mclose"?t.setAttribute("fence","true"):t.setAttribute("fence","false"),t.setAttribute("stretchy","true");var a=T(O0.sizeToMaxHeight[r.size]);return t.setAttribute("minsize",a),t.setAttribute("maxsize",a),t}});function or(r){if(!r.body)throw new Error("Bug: The leftright ParseNode wasn't fully parsed.")}B({type:"leftright-right",names:["\\right"],props:{numArgs:1,primitive:!0},handler:(r,e)=>{var t=r.parser.gullet.macros.get("\\current@color");if(t&&typeof t!="string")throw new z("\\current@color set to non-string in \\right");return{type:"leftright-right",mode:r.parser.mode,delim:Ye(e[0],r).text,color:t}}});B({type:"leftright",names:["\\left"],props:{numArgs:1,primitive:!0},handler:(r,e)=>{var t=Ye(e[0],r),a=r.parser;++a.leftrightDepth;var n=a.parseExpression(!1);--a.leftrightDepth,a.expect("\\right",!1);var s=L(a.parseFunction(),"leftright-right");return{type:"leftright",mode:a.mode,body:n,left:t.text,right:s.delim,rightColor:s.color}},htmlBuilder:(r,e)=>{or(r);for(var t=a0(r.body,e,!0,["mopen","mclose"]),a=0,n=0,s=!1,l=0;l{or(r);var t=m0(r.body,e);if(r.left!=="."){var a=new M.MathNode("mo",[y0(r.left,r.mode)]);a.setAttribute("fence","true"),t.unshift(a)}if(r.right!=="."){var n=new M.MathNode("mo",[y0(r.right,r.mode)]);n.setAttribute("fence","true"),r.rightColor&&n.setAttribute("mathcolor",r.rightColor),t.push(n)}return Bt(t)}});B({type:"middle",names:["\\middle"],props:{numArgs:1,primitive:!0},handler:(r,e)=>{var t=Ye(e[0],r);if(!r.parser.leftrightDepth)throw new z("\\middle without preceding \\left",t);return{type:"middle",mode:r.parser.mode,delim:t.text}},htmlBuilder:(r,e)=>{var t;if(r.delim===".")t=ge(e,[]);else{t=O0.sizedDelim(r.delim,1,e,r.mode,[]);var a={delim:r.delim,options:e};t.isMiddle=a}return t},mathmlBuilder:(r,e)=>{var t=r.delim==="\\vert"||r.delim==="|"?y0("|","text"):y0(r.delim,r.mode),a=new M.MathNode("mo",[t]);return a.setAttribute("fence","true"),a.setAttribute("lspace","0.05em"),a.setAttribute("rspace","0.05em"),a}});var Ot=(r,e)=>{var t=y.wrapFragment(G(r.body,e),e),a=r.label.slice(1),n=e.sizeMultiplier,s,l=0,h=O.isCharacterBox(r.body);if(a==="sout")s=y.makeSpan(["stretchy","sout"]),s.height=e.fontMetrics().defaultRuleThickness/n,l=-.5*e.fontMetrics().xHeight;else if(a==="phase"){var c=Q({number:.6,unit:"pt"},e),f=Q({number:.35,unit:"ex"},e),v=e.havingBaseSizing();n=n/v.sizeMultiplier;var b=t.height+t.depth+c+f;t.style.paddingLeft=T(b/2+c);var x=Math.floor(1e3*b*n),w=Wa(x),A=new S0([new A0("phase",w)],{width:"400em",height:T(x/1e3),viewBox:"0 0 400000 "+x,preserveAspectRatio:"xMinYMin slice"});s=y.makeSvgSpan(["hide-tail"],[A],e),s.style.height=T(b),l=t.depth+c+f}else{/cancel/.test(a)?h||t.classes.push("cancel-pad"):a==="angl"?t.classes.push("anglpad"):t.classes.push("boxpad");var q=0,_=0,D=0;/box/.test(a)?(D=Math.max(e.fontMetrics().fboxrule,e.minRuleThickness),q=e.fontMetrics().fboxsep+(a==="colorbox"?0:D),_=q):a==="angl"?(D=Math.max(e.fontMetrics().defaultRuleThickness,e.minRuleThickness),q=4*D,_=Math.max(0,.25-t.depth)):(q=h?.2:0,_=q),s=E0.encloseSpan(t,a,q,_,e),/fbox|boxed|fcolorbox/.test(a)?(s.style.borderStyle="solid",s.style.borderWidth=T(D)):a==="angl"&&D!==.049&&(s.style.borderTopWidth=T(D),s.style.borderRightWidth=T(D)),l=t.depth+_,r.backgroundColor&&(s.style.backgroundColor=r.backgroundColor,r.borderColor&&(s.style.borderColor=r.borderColor))}var N;if(r.backgroundColor)N=y.makeVList({positionType:"individualShift",children:[{type:"elem",elem:s,shift:l},{type:"elem",elem:t,shift:0}]},e);else{var $=/cancel|phase/.test(a)?["svg-align"]:[];N=y.makeVList({positionType:"individualShift",children:[{type:"elem",elem:t,shift:0},{type:"elem",elem:s,shift:l,wrapperClasses:$}]},e)}return/cancel/.test(a)&&(N.height=t.height,N.depth=t.depth),/cancel/.test(a)&&!h?y.makeSpan(["mord","cancel-lap"],[N],e):y.makeSpan(["mord"],[N],e)},It=(r,e)=>{var t=0,a=new M.MathNode(r.label.indexOf("colorbox")>-1?"mpadded":"menclose",[X(r.body,e)]);switch(r.label){case"\\cancel":a.setAttribute("notation","updiagonalstrike");break;case"\\bcancel":a.setAttribute("notation","downdiagonalstrike");break;case"\\phase":a.setAttribute("notation","phasorangle");break;case"\\sout":a.setAttribute("notation","horizontalstrike");break;case"\\fbox":a.setAttribute("notation","box");break;case"\\angl":a.setAttribute("notation","actuarial");break;case"\\fcolorbox":case"\\colorbox":if(t=e.fontMetrics().fboxsep*e.fontMetrics().ptPerEm,a.setAttribute("width","+"+2*t+"pt"),a.setAttribute("height","+"+2*t+"pt"),a.setAttribute("lspace",t+"pt"),a.setAttribute("voffset",t+"pt"),r.label==="\\fcolorbox"){var n=Math.max(e.fontMetrics().fboxrule,e.minRuleThickness);a.setAttribute("style","border: "+n+"em solid "+String(r.borderColor))}break;case"\\xcancel":a.setAttribute("notation","updiagonalstrike downdiagonalstrike");break}return r.backgroundColor&&a.setAttribute("mathbackground",r.backgroundColor),a};B({type:"enclose",names:["\\colorbox"],props:{numArgs:2,allowedInText:!0,argTypes:["color","text"]},handler(r,e,t){var{parser:a,funcName:n}=r,s=L(e[0],"color-token").color,l=e[1];return{type:"enclose",mode:a.mode,label:n,backgroundColor:s,body:l}},htmlBuilder:Ot,mathmlBuilder:It});B({type:"enclose",names:["\\fcolorbox"],props:{numArgs:3,allowedInText:!0,argTypes:["color","color","text"]},handler(r,e,t){var{parser:a,funcName:n}=r,s=L(e[0],"color-token").color,l=L(e[1],"color-token").color,h=e[2];return{type:"enclose",mode:a.mode,label:n,backgroundColor:l,borderColor:s,body:h}},htmlBuilder:Ot,mathmlBuilder:It});B({type:"enclose",names:["\\fbox"],props:{numArgs:1,argTypes:["hbox"],allowedInText:!0},handler(r,e){var{parser:t}=r;return{type:"enclose",mode:t.mode,label:"\\fbox",body:e[0]}}});B({type:"enclose",names:["\\cancel","\\bcancel","\\xcancel","\\sout","\\phase"],props:{numArgs:1},handler(r,e){var{parser:t,funcName:a}=r,n=e[0];return{type:"enclose",mode:t.mode,label:a,body:n}},htmlBuilder:Ot,mathmlBuilder:It});B({type:"enclose",names:["\\angl"],props:{numArgs:1,argTypes:["hbox"],allowedInText:!1},handler(r,e){var{parser:t}=r;return{type:"enclose",mode:t.mode,label:"\\angl",body:e[0]}}});var ra={};function T0(r){for(var{type:e,names:t,props:a,handler:n,htmlBuilder:s,mathmlBuilder:l}=r,h={type:e,numArgs:a.numArgs||0,allowedInText:!1,numOptionalArgs:0,handler:n},c=0;c{var e=r.parser.settings;if(!e.displayMode)throw new z("{"+r.envName+"} can be used only in display mode.")};function Et(r){if(r.indexOf("ed")===-1)return r.indexOf("*")===-1}function U0(r,e,t){var{hskipBeforeAndAfter:a,addJot:n,cols:s,arraystretch:l,colSeparationType:h,autoTag:c,singleRow:f,emptySingleRow:v,maxNumCols:b,leqno:x}=e;if(r.gullet.beginGroup(),f||r.gullet.macros.set("\\cr","\\\\\\relax"),!l){var w=r.gullet.expandMacroAsText("\\arraystretch");if(w==null)l=1;else if(l=parseFloat(w),!l||l<0)throw new z("Invalid \\arraystretch: "+w)}r.gullet.beginGroup();var A=[],q=[A],_=[],D=[],N=c!=null?[]:void 0;function $(){c&&r.gullet.macros.set("\\@eqnsw","1",!0)}function H(){N&&(r.gullet.macros.get("\\df@tag")?(N.push(r.subparse([new b0("\\df@tag")])),r.gullet.macros.set("\\df@tag",void 0,!0)):N.push(!!c&&r.gullet.macros.get("\\@eqnsw")==="1"))}for($(),D.push(lr(r));;){var F=r.parseExpression(!1,f?"\\end":"\\\\");r.gullet.endGroup(),r.gullet.beginGroup(),F={type:"ordgroup",mode:r.mode,body:F},t&&(F={type:"styling",mode:r.mode,style:t,body:[F]}),A.push(F);var P=r.fetch().text;if(P==="&"){if(b&&A.length===b){if(f||h)throw new z("Too many tab characters: &",r.nextToken);r.settings.reportNonstrict("textEnv","Too few columns specified in the {array} column argument.")}r.consume()}else if(P==="\\end"){H(),A.length===1&&F.type==="styling"&&F.body[0].body.length===0&&(q.length>1||!v)&&q.pop(),D.length0&&($+=.25),f.push({pos:$,isDashed:we[Se]})}for(H(l[0]),a=0;a0&&(i0+=N,Vwe))for(a=0;a=h)){var ee=void 0;(n>0||e.hskipBeforeAndAfter)&&(ee=O.deflt(f0.pregap,x),ee!==0&&(x0=y.makeSpan(["arraycolsep"],[]),x0.style.width=T(ee),u0.push(x0)));var te=[];for(a=0;a0){for(var Sa=y.makeLineSpan("hline",t,v),ka=y.makeLineSpan("hdashline",t,v),Je=[{type:"elem",elem:c,shift:0}];f.length>0;){var Ut=f.pop(),Xt=Ut.pos-r0;Ut.isDashed?Je.push({type:"elem",elem:ka,shift:Xt}):Je.push({type:"elem",elem:Sa,shift:Xt})}c=y.makeVList({positionType:"individualShift",children:Je},t)}if(K0.length===0)return y.makeSpan(["mord"],[c],t);var Qe=y.makeVList({positionType:"individualShift",children:K0},t);return Qe=y.makeSpan(["tag"],[Qe],t),y.makeFragment([c,Qe])},en={c:"center ",l:"left ",r:"right "},B0=function(e,t){for(var a=[],n=new M.MathNode("mtd",[],["mtr-glue"]),s=new M.MathNode("mtd",[],["mml-eqn-num"]),l=0;l0){var A=e.cols,q="",_=!1,D=0,N=A.length;A[0].type==="separator"&&(x+="top ",D=1),A[A.length-1].type==="separator"&&(x+="bottom ",N-=1);for(var $=D;$0?"left ":"",x+=j[j.length-1].length>0?"right ":"";for(var U=1;U-1?"alignat":"align",s=e.envName==="split",l=U0(e.parser,{cols:a,addJot:!0,autoTag:s?void 0:Et(e.envName),emptySingleRow:!0,colSeparationType:n,maxNumCols:s?2:void 0,leqno:e.parser.settings.leqno},"display"),h,c=0,f={type:"ordgroup",mode:e.mode,body:[]};if(t[0]&&t[0].type==="ordgroup"){for(var v="",b=0;b0&&w&&(_=1),a[A]={type:"align",align:q,pregap:_,postgap:0}}return l.colSeparationType=w?"align":"alignat",l};T0({type:"array",names:["array","darray"],props:{numArgs:1},handler(r,e){var t=Xe(e[0]),a=t?[e[0]]:L(e[0],"ordgroup").body,n=a.map(function(l){var h=Ct(l),c=h.text;if("lcr".indexOf(c)!==-1)return{type:"align",align:c};if(c==="|")return{type:"separator",separator:"|"};if(c===":")return{type:"separator",separator:":"};throw new z("Unknown column alignment: "+c,l)}),s={cols:n,hskipBeforeAndAfter:!0,maxNumCols:n.length};return U0(r.parser,s,Rt(r.envName))},htmlBuilder:q0,mathmlBuilder:B0});T0({type:"array",names:["matrix","pmatrix","bmatrix","Bmatrix","vmatrix","Vmatrix","matrix*","pmatrix*","bmatrix*","Bmatrix*","vmatrix*","Vmatrix*"],props:{numArgs:0},handler(r){var e={matrix:null,pmatrix:["(",")"],bmatrix:["[","]"],Bmatrix:["\\{","\\}"],vmatrix:["|","|"],Vmatrix:["\\Vert","\\Vert"]}[r.envName.replace("*","")],t="c",a={hskipBeforeAndAfter:!1,cols:[{type:"align",align:t}]};if(r.envName.charAt(r.envName.length-1)==="*"){var n=r.parser;if(n.consumeSpaces(),n.fetch().text==="["){if(n.consume(),n.consumeSpaces(),t=n.fetch().text,"lcr".indexOf(t)===-1)throw new z("Expected l or c or r",n.nextToken);n.consume(),n.consumeSpaces(),n.expect("]"),n.consume(),a.cols=[{type:"align",align:t}]}}var s=U0(r.parser,a,Rt(r.envName)),l=Math.max(0,...s.body.map(h=>h.length));return s.cols=new Array(l).fill({type:"align",align:t}),e?{type:"leftright",mode:r.mode,body:[s],left:e[0],right:e[1],rightColor:void 0}:s},htmlBuilder:q0,mathmlBuilder:B0});T0({type:"array",names:["smallmatrix"],props:{numArgs:0},handler(r){var e={arraystretch:.5},t=U0(r.parser,e,"script");return t.colSeparationType="small",t},htmlBuilder:q0,mathmlBuilder:B0});T0({type:"array",names:["subarray"],props:{numArgs:1},handler(r,e){var t=Xe(e[0]),a=t?[e[0]]:L(e[0],"ordgroup").body,n=a.map(function(l){var h=Ct(l),c=h.text;if("lc".indexOf(c)!==-1)return{type:"align",align:c};throw new z("Unknown column alignment: "+c,l)});if(n.length>1)throw new z("{subarray} can contain only one column");var s={cols:n,hskipBeforeAndAfter:!1,arraystretch:.5};if(s=U0(r.parser,s,"script"),s.body.length>0&&s.body[0].length>1)throw new z("{subarray} can contain only one column");return s},htmlBuilder:q0,mathmlBuilder:B0});T0({type:"array",names:["cases","dcases","rcases","drcases"],props:{numArgs:0},handler(r){var e={arraystretch:1.2,cols:[{type:"align",align:"l",pregap:0,postgap:1},{type:"align",align:"l",pregap:0,postgap:0}]},t=U0(r.parser,e,Rt(r.envName));return{type:"leftright",mode:r.mode,body:[t],left:r.envName.indexOf("r")>-1?".":"\\{",right:r.envName.indexOf("r")>-1?"\\}":".",rightColor:void 0}},htmlBuilder:q0,mathmlBuilder:B0});T0({type:"array",names:["align","align*","aligned","split"],props:{numArgs:0},handler:na,htmlBuilder:q0,mathmlBuilder:B0});T0({type:"array",names:["gathered","gather","gather*"],props:{numArgs:0},handler(r){O.contains(["gather","gather*"],r.envName)&&Ze(r);var e={cols:[{type:"align",align:"c"}],addJot:!0,colSeparationType:"gather",autoTag:Et(r.envName),emptySingleRow:!0,leqno:r.parser.settings.leqno};return U0(r.parser,e,"display")},htmlBuilder:q0,mathmlBuilder:B0});T0({type:"array",names:["alignat","alignat*","alignedat"],props:{numArgs:1},handler:na,htmlBuilder:q0,mathmlBuilder:B0});T0({type:"array",names:["equation","equation*"],props:{numArgs:0},handler(r){Ze(r);var e={autoTag:Et(r.envName),emptySingleRow:!0,singleRow:!0,maxNumCols:1,leqno:r.parser.settings.leqno};return U0(r.parser,e,"display")},htmlBuilder:q0,mathmlBuilder:B0});T0({type:"array",names:["CD"],props:{numArgs:0},handler(r){return Ze(r),F1(r.parser)},htmlBuilder:q0,mathmlBuilder:B0});m("\\nonumber","\\gdef\\@eqnsw{0}");m("\\notag","\\nonumber");B({type:"text",names:["\\hline","\\hdashline"],props:{numArgs:0,allowedInText:!0,allowedInMath:!0},handler(r,e){throw new z(r.funcName+" valid only within array environment")}});var ur=ra;B({type:"environment",names:["\\begin","\\end"],props:{numArgs:1,argTypes:["text"]},handler(r,e){var{parser:t,funcName:a}=r,n=e[0];if(n.type!=="ordgroup")throw new z("Invalid environment name",n);for(var s="",l=0;l{var t=r.font,a=e.withFont(t);return G(r.body,a)},sa=(r,e)=>{var t=r.font,a=e.withFont(t);return X(r.body,a)},hr={"\\Bbb":"\\mathbb","\\bold":"\\mathbf","\\frak":"\\mathfrak","\\bm":"\\boldsymbol"};B({type:"font",names:["\\mathrm","\\mathit","\\mathbf","\\mathnormal","\\mathsfit","\\mathbb","\\mathcal","\\mathfrak","\\mathscr","\\mathsf","\\mathtt","\\Bbb","\\bold","\\frak"],props:{numArgs:1,allowedInArgument:!0},handler:(r,e)=>{var{parser:t,funcName:a}=r,n=He(e[0]),s=a;return s in hr&&(s=hr[s]),{type:"font",mode:t.mode,font:s.slice(1),body:n}},htmlBuilder:ia,mathmlBuilder:sa});B({type:"mclass",names:["\\boldsymbol","\\bm"],props:{numArgs:1},handler:(r,e)=>{var{parser:t}=r,a=e[0],n=O.isCharacterBox(a);return{type:"mclass",mode:t.mode,mclass:We(a),body:[{type:"font",mode:t.mode,font:"boldsymbol",body:a}],isCharacterBox:n}}});B({type:"font",names:["\\rm","\\sf","\\tt","\\bf","\\it","\\cal"],props:{numArgs:0,allowedInText:!0},handler:(r,e)=>{var{parser:t,funcName:a,breakOnTokenText:n}=r,{mode:s}=t,l=t.parseExpression(!0,n),h="math"+a.slice(1);return{type:"font",mode:s,font:h,body:{type:"ordgroup",mode:t.mode,body:l}}},htmlBuilder:ia,mathmlBuilder:sa});var oa=(r,e)=>{var t=e;return r==="display"?t=t.id>=E.SCRIPT.id?t.text():E.DISPLAY:r==="text"&&t.size===E.DISPLAY.size?t=E.TEXT:r==="script"?t=E.SCRIPT:r==="scriptscript"&&(t=E.SCRIPTSCRIPT),t},$t=(r,e)=>{var t=oa(r.size,e.style),a=t.fracNum(),n=t.fracDen(),s;s=e.havingStyle(a);var l=G(r.numer,s,e);if(r.continued){var h=8.5/e.fontMetrics().ptPerEm,c=3.5/e.fontMetrics().ptPerEm;l.height=l.height0?A=3*x:A=7*x,q=e.fontMetrics().denom1):(b>0?(w=e.fontMetrics().num2,A=x):(w=e.fontMetrics().num3,A=3*x),q=e.fontMetrics().denom2);var _;if(v){var N=e.fontMetrics().axisHeight;w-l.depth-(N+.5*b){var t=new M.MathNode("mfrac",[X(r.numer,e),X(r.denom,e)]);if(!r.hasBarLine)t.setAttribute("linethickness","0px");else if(r.barSize){var a=Q(r.barSize,e);t.setAttribute("linethickness",T(a))}var n=oa(r.size,e.style);if(n.size!==e.style.size){t=new M.MathNode("mstyle",[t]);var s=n.size===E.DISPLAY.size?"true":"false";t.setAttribute("displaystyle",s),t.setAttribute("scriptlevel","0")}if(r.leftDelim!=null||r.rightDelim!=null){var l=[];if(r.leftDelim!=null){var h=new M.MathNode("mo",[new M.TextNode(r.leftDelim.replace("\\",""))]);h.setAttribute("fence","true"),l.push(h)}if(l.push(t),r.rightDelim!=null){var c=new M.MathNode("mo",[new M.TextNode(r.rightDelim.replace("\\",""))]);c.setAttribute("fence","true"),l.push(c)}return Bt(l)}return t};B({type:"genfrac",names:["\\dfrac","\\frac","\\tfrac","\\dbinom","\\binom","\\tbinom","\\\\atopfrac","\\\\bracefrac","\\\\brackfrac"],props:{numArgs:2,allowedInArgument:!0},handler:(r,e)=>{var{parser:t,funcName:a}=r,n=e[0],s=e[1],l,h=null,c=null,f="auto";switch(a){case"\\dfrac":case"\\frac":case"\\tfrac":l=!0;break;case"\\\\atopfrac":l=!1;break;case"\\dbinom":case"\\binom":case"\\tbinom":l=!1,h="(",c=")";break;case"\\\\bracefrac":l=!1,h="\\{",c="\\}";break;case"\\\\brackfrac":l=!1,h="[",c="]";break;default:throw new Error("Unrecognized genfrac command")}switch(a){case"\\dfrac":case"\\dbinom":f="display";break;case"\\tfrac":case"\\tbinom":f="text";break}return{type:"genfrac",mode:t.mode,continued:!1,numer:n,denom:s,hasBarLine:l,leftDelim:h,rightDelim:c,size:f,barSize:null}},htmlBuilder:$t,mathmlBuilder:Lt});B({type:"genfrac",names:["\\cfrac"],props:{numArgs:2},handler:(r,e)=>{var{parser:t,funcName:a}=r,n=e[0],s=e[1];return{type:"genfrac",mode:t.mode,continued:!0,numer:n,denom:s,hasBarLine:!0,leftDelim:null,rightDelim:null,size:"display",barSize:null}}});B({type:"infix",names:["\\over","\\choose","\\atop","\\brace","\\brack"],props:{numArgs:0,infix:!0},handler(r){var{parser:e,funcName:t,token:a}=r,n;switch(t){case"\\over":n="\\frac";break;case"\\choose":n="\\binom";break;case"\\atop":n="\\\\atopfrac";break;case"\\brace":n="\\\\bracefrac";break;case"\\brack":n="\\\\brackfrac";break;default:throw new Error("Unrecognized infix genfrac command")}return{type:"infix",mode:e.mode,replaceWith:n,token:a}}});var cr=["display","text","script","scriptscript"],mr=function(e){var t=null;return e.length>0&&(t=e,t=t==="."?null:t),t};B({type:"genfrac",names:["\\genfrac"],props:{numArgs:6,allowedInArgument:!0,argTypes:["math","math","size","text","math","math"]},handler(r,e){var{parser:t}=r,a=e[4],n=e[5],s=He(e[0]),l=s.type==="atom"&&s.family==="open"?mr(s.text):null,h=He(e[1]),c=h.type==="atom"&&h.family==="close"?mr(h.text):null,f=L(e[2],"size"),v,b=null;f.isBlank?v=!0:(b=f.value,v=b.number>0);var x="auto",w=e[3];if(w.type==="ordgroup"){if(w.body.length>0){var A=L(w.body[0],"textord");x=cr[Number(A.text)]}}else w=L(w,"textord"),x=cr[Number(w.text)];return{type:"genfrac",mode:t.mode,numer:a,denom:n,continued:!1,hasBarLine:v,barSize:b,leftDelim:l,rightDelim:c,size:x}},htmlBuilder:$t,mathmlBuilder:Lt});B({type:"infix",names:["\\above"],props:{numArgs:1,argTypes:["size"],infix:!0},handler(r,e){var{parser:t,funcName:a,token:n}=r;return{type:"infix",mode:t.mode,replaceWith:"\\\\abovefrac",size:L(e[0],"size").value,token:n}}});B({type:"genfrac",names:["\\\\abovefrac"],props:{numArgs:3,argTypes:["math","size","math"]},handler:(r,e)=>{var{parser:t,funcName:a}=r,n=e[0],s=_a(L(e[1],"infix").size),l=e[2],h=s.number>0;return{type:"genfrac",mode:t.mode,numer:n,denom:l,continued:!1,hasBarLine:h,barSize:s,leftDelim:null,rightDelim:null,size:"auto"}},htmlBuilder:$t,mathmlBuilder:Lt});var la=(r,e)=>{var t=e.style,a,n;r.type==="supsub"?(a=r.sup?G(r.sup,e.havingStyle(t.sup()),e):G(r.sub,e.havingStyle(t.sub()),e),n=L(r.base,"horizBrace")):n=L(r,"horizBrace");var s=G(n.base,e.havingBaseStyle(E.DISPLAY)),l=E0.svgSpan(n,e),h;if(n.isOver?(h=y.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:s},{type:"kern",size:.1},{type:"elem",elem:l}]},e),h.children[0].children[0].children[1].classes.push("svg-align")):(h=y.makeVList({positionType:"bottom",positionData:s.depth+.1+l.height,children:[{type:"elem",elem:l},{type:"kern",size:.1},{type:"elem",elem:s}]},e),h.children[0].children[0].children[0].classes.push("svg-align")),a){var c=y.makeSpan(["mord",n.isOver?"mover":"munder"],[h],e);n.isOver?h=y.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:c},{type:"kern",size:.2},{type:"elem",elem:a}]},e):h=y.makeVList({positionType:"bottom",positionData:c.depth+.2+a.height+a.depth,children:[{type:"elem",elem:a},{type:"kern",size:.2},{type:"elem",elem:c}]},e)}return y.makeSpan(["mord",n.isOver?"mover":"munder"],[h],e)},tn=(r,e)=>{var t=E0.mathMLnode(r.label);return new M.MathNode(r.isOver?"mover":"munder",[X(r.base,e),t])};B({type:"horizBrace",names:["\\overbrace","\\underbrace"],props:{numArgs:1},handler(r,e){var{parser:t,funcName:a}=r;return{type:"horizBrace",mode:t.mode,label:a,isOver:/^\\over/.test(a),base:e[0]}},htmlBuilder:la,mathmlBuilder:tn});B({type:"href",names:["\\href"],props:{numArgs:2,argTypes:["url","original"],allowedInText:!0},handler:(r,e)=>{var{parser:t}=r,a=e[1],n=L(e[0],"url").url;return t.settings.isTrusted({command:"\\href",url:n})?{type:"href",mode:t.mode,href:n,body:e0(a)}:t.formatUnsupportedCmd("\\href")},htmlBuilder:(r,e)=>{var t=a0(r.body,e,!1);return y.makeAnchor(r.href,[],t,e)},mathmlBuilder:(r,e)=>{var t=V0(r.body,e);return t instanceof s0||(t=new s0("mrow",[t])),t.setAttribute("href",r.href),t}});B({type:"href",names:["\\url"],props:{numArgs:1,argTypes:["url"],allowedInText:!0},handler:(r,e)=>{var{parser:t}=r,a=L(e[0],"url").url;if(!t.settings.isTrusted({command:"\\url",url:a}))return t.formatUnsupportedCmd("\\url");for(var n=[],s=0;s{var{parser:t,funcName:a,token:n}=r,s=L(e[0],"raw").string,l=e[1];t.settings.strict&&t.settings.reportNonstrict("htmlExtension","HTML extension is disabled on strict mode");var h,c={};switch(a){case"\\htmlClass":c.class=s,h={command:"\\htmlClass",class:s};break;case"\\htmlId":c.id=s,h={command:"\\htmlId",id:s};break;case"\\htmlStyle":c.style=s,h={command:"\\htmlStyle",style:s};break;case"\\htmlData":{for(var f=s.split(","),v=0;v{var t=a0(r.body,e,!1),a=["enclosing"];r.attributes.class&&a.push(...r.attributes.class.trim().split(/\s+/));var n=y.makeSpan(a,t,e);for(var s in r.attributes)s!=="class"&&r.attributes.hasOwnProperty(s)&&n.setAttribute(s,r.attributes[s]);return n},mathmlBuilder:(r,e)=>V0(r.body,e)});B({type:"htmlmathml",names:["\\html@mathml"],props:{numArgs:2,allowedInText:!0},handler:(r,e)=>{var{parser:t}=r;return{type:"htmlmathml",mode:t.mode,html:e0(e[0]),mathml:e0(e[1])}},htmlBuilder:(r,e)=>{var t=a0(r.html,e,!1);return y.makeFragment(t)},mathmlBuilder:(r,e)=>V0(r.mathml,e)});var ht=function(e){if(/^[-+]? *(\d+(\.\d*)?|\.\d+)$/.test(e))return{number:+e,unit:"bp"};var t=/([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(e);if(!t)throw new z("Invalid size: '"+e+"' in \\includegraphics");var a={number:+(t[1]+t[2]),unit:t[3]};if(!Tr(a))throw new z("Invalid unit: '"+a.unit+"' in \\includegraphics.");return a};B({type:"includegraphics",names:["\\includegraphics"],props:{numArgs:1,numOptionalArgs:1,argTypes:["raw","url"],allowedInText:!1},handler:(r,e,t)=>{var{parser:a}=r,n={number:0,unit:"em"},s={number:.9,unit:"em"},l={number:0,unit:"em"},h="";if(t[0])for(var c=L(t[0],"raw").string,f=c.split(","),v=0;v{var t=Q(r.height,e),a=0;r.totalheight.number>0&&(a=Q(r.totalheight,e)-t);var n=0;r.width.number>0&&(n=Q(r.width,e));var s={height:T(t+a)};n>0&&(s.width=T(n)),a>0&&(s.verticalAlign=T(-a));var l=new vt(r.src,r.alt,s);return l.height=t,l.depth=a,l},mathmlBuilder:(r,e)=>{var t=new M.MathNode("mglyph",[]);t.setAttribute("alt",r.alt);var a=Q(r.height,e),n=0;if(r.totalheight.number>0&&(n=Q(r.totalheight,e)-a,t.setAttribute("valign",T(-n))),t.setAttribute("height",T(a+n)),r.width.number>0){var s=Q(r.width,e);t.setAttribute("width",T(s))}return t.setAttribute("src",r.src),t}});B({type:"kern",names:["\\kern","\\mkern","\\hskip","\\mskip"],props:{numArgs:1,argTypes:["size"],primitive:!0,allowedInText:!0},handler(r,e){var{parser:t,funcName:a}=r,n=L(e[0],"size");if(t.settings.strict){var s=a[1]==="m",l=n.value.unit==="mu";s?(l||t.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+a+" supports only mu units, "+("not "+n.value.unit+" units")),t.mode!=="math"&&t.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+a+" works only in math mode")):l&&t.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+a+" doesn't support mu units")}return{type:"kern",mode:t.mode,dimension:n.value}},htmlBuilder(r,e){return y.makeGlue(r.dimension,e)},mathmlBuilder(r,e){var t=Q(r.dimension,e);return new M.SpaceNode(t)}});B({type:"lap",names:["\\mathllap","\\mathrlap","\\mathclap"],props:{numArgs:1,allowedInText:!0},handler:(r,e)=>{var{parser:t,funcName:a}=r,n=e[0];return{type:"lap",mode:t.mode,alignment:a.slice(5),body:n}},htmlBuilder:(r,e)=>{var t;r.alignment==="clap"?(t=y.makeSpan([],[G(r.body,e)]),t=y.makeSpan(["inner"],[t],e)):t=y.makeSpan(["inner"],[G(r.body,e)]);var a=y.makeSpan(["fix"],[]),n=y.makeSpan([r.alignment],[t,a],e),s=y.makeSpan(["strut"]);return s.style.height=T(n.height+n.depth),n.depth&&(s.style.verticalAlign=T(-n.depth)),n.children.unshift(s),n=y.makeSpan(["thinbox"],[n],e),y.makeSpan(["mord","vbox"],[n],e)},mathmlBuilder:(r,e)=>{var t=new M.MathNode("mpadded",[X(r.body,e)]);if(r.alignment!=="rlap"){var a=r.alignment==="llap"?"-1":"-0.5";t.setAttribute("lspace",a+"width")}return t.setAttribute("width","0px"),t}});B({type:"styling",names:["\\(","$"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler(r,e){var{funcName:t,parser:a}=r,n=a.mode;a.switchMode("math");var s=t==="\\("?"\\)":"$",l=a.parseExpression(!1,s);return a.expect(s),a.switchMode(n),{type:"styling",mode:a.mode,style:"text",body:l}}});B({type:"text",names:["\\)","\\]"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler(r,e){throw new z("Mismatched "+r.funcName)}});var dr=(r,e)=>{switch(e.style.size){case E.DISPLAY.size:return r.display;case E.TEXT.size:return r.text;case E.SCRIPT.size:return r.script;case E.SCRIPTSCRIPT.size:return r.scriptscript;default:return r.text}};B({type:"mathchoice",names:["\\mathchoice"],props:{numArgs:4,primitive:!0},handler:(r,e)=>{var{parser:t}=r;return{type:"mathchoice",mode:t.mode,display:e0(e[0]),text:e0(e[1]),script:e0(e[2]),scriptscript:e0(e[3])}},htmlBuilder:(r,e)=>{var t=dr(r,e),a=a0(t,e,!1);return y.makeFragment(a)},mathmlBuilder:(r,e)=>{var t=dr(r,e);return V0(t,e)}});var ua=(r,e,t,a,n,s,l)=>{r=y.makeSpan([],[r]);var h=t&&O.isCharacterBox(t),c,f;if(e){var v=G(e,a.havingStyle(n.sup()),a);f={elem:v,kern:Math.max(a.fontMetrics().bigOpSpacing1,a.fontMetrics().bigOpSpacing3-v.depth)}}if(t){var b=G(t,a.havingStyle(n.sub()),a);c={elem:b,kern:Math.max(a.fontMetrics().bigOpSpacing2,a.fontMetrics().bigOpSpacing4-b.height)}}var x;if(f&&c){var w=a.fontMetrics().bigOpSpacing5+c.elem.height+c.elem.depth+c.kern+r.depth+l;x=y.makeVList({positionType:"bottom",positionData:w,children:[{type:"kern",size:a.fontMetrics().bigOpSpacing5},{type:"elem",elem:c.elem,marginLeft:T(-s)},{type:"kern",size:c.kern},{type:"elem",elem:r},{type:"kern",size:f.kern},{type:"elem",elem:f.elem,marginLeft:T(s)},{type:"kern",size:a.fontMetrics().bigOpSpacing5}]},a)}else if(c){var A=r.height-l;x=y.makeVList({positionType:"top",positionData:A,children:[{type:"kern",size:a.fontMetrics().bigOpSpacing5},{type:"elem",elem:c.elem,marginLeft:T(-s)},{type:"kern",size:c.kern},{type:"elem",elem:r}]},a)}else if(f){var q=r.depth+l;x=y.makeVList({positionType:"bottom",positionData:q,children:[{type:"elem",elem:r},{type:"kern",size:f.kern},{type:"elem",elem:f.elem,marginLeft:T(s)},{type:"kern",size:a.fontMetrics().bigOpSpacing5}]},a)}else return r;var _=[x];if(c&&s!==0&&!h){var D=y.makeSpan(["mspace"],[],a);D.style.marginRight=T(s),_.unshift(D)}return y.makeSpan(["mop","op-limits"],_,a)},ha=["\\smallint"],se=(r,e)=>{var t,a,n=!1,s;r.type==="supsub"?(t=r.sup,a=r.sub,s=L(r.base,"op"),n=!0):s=L(r,"op");var l=e.style,h=!1;l.size===E.DISPLAY.size&&s.symbol&&!O.contains(ha,s.name)&&(h=!0);var c;if(s.symbol){var f=h?"Size2-Regular":"Size1-Regular",v="";if((s.name==="\\oiint"||s.name==="\\oiiint")&&(v=s.name.slice(1),s.name=v==="oiint"?"\\iint":"\\iiint"),c=y.makeSymbol(s.name,f,"math",e,["mop","op-symbol",h?"large-op":"small-op"]),v.length>0){var b=c.italic,x=y.staticSvg(v+"Size"+(h?"2":"1"),e);c=y.makeVList({positionType:"individualShift",children:[{type:"elem",elem:c,shift:0},{type:"elem",elem:x,shift:h?.08:0}]},e),s.name="\\"+v,c.classes.unshift("mop"),c.italic=b}}else if(s.body){var w=a0(s.body,e,!0);w.length===1&&w[0]instanceof c0?(c=w[0],c.classes[0]="mop"):c=y.makeSpan(["mop"],w,e)}else{for(var A=[],q=1;q{var t;if(r.symbol)t=new s0("mo",[y0(r.name,r.mode)]),O.contains(ha,r.name)&&t.setAttribute("largeop","false");else if(r.body)t=new s0("mo",m0(r.body,e));else{t=new s0("mi",[new g0(r.name.slice(1))]);var a=new s0("mo",[y0("\u2061","text")]);r.parentIsSupSub?t=new s0("mrow",[t,a]):t=$r([t,a])}return t},rn={"\u220F":"\\prod","\u2210":"\\coprod","\u2211":"\\sum","\u22C0":"\\bigwedge","\u22C1":"\\bigvee","\u22C2":"\\bigcap","\u22C3":"\\bigcup","\u2A00":"\\bigodot","\u2A01":"\\bigoplus","\u2A02":"\\bigotimes","\u2A04":"\\biguplus","\u2A06":"\\bigsqcup"};B({type:"op",names:["\\coprod","\\bigvee","\\bigwedge","\\biguplus","\\bigcap","\\bigcup","\\intop","\\prod","\\sum","\\bigotimes","\\bigoplus","\\bigodot","\\bigsqcup","\\smallint","\u220F","\u2210","\u2211","\u22C0","\u22C1","\u22C2","\u22C3","\u2A00","\u2A01","\u2A02","\u2A04","\u2A06"],props:{numArgs:0},handler:(r,e)=>{var{parser:t,funcName:a}=r,n=a;return n.length===1&&(n=rn[n]),{type:"op",mode:t.mode,limits:!0,parentIsSupSub:!1,symbol:!0,name:n}},htmlBuilder:se,mathmlBuilder:be});B({type:"op",names:["\\mathop"],props:{numArgs:1,primitive:!0},handler:(r,e)=>{var{parser:t}=r,a=e[0];return{type:"op",mode:t.mode,limits:!1,parentIsSupSub:!1,symbol:!1,body:e0(a)}},htmlBuilder:se,mathmlBuilder:be});var an={"\u222B":"\\int","\u222C":"\\iint","\u222D":"\\iiint","\u222E":"\\oint","\u222F":"\\oiint","\u2230":"\\oiiint"};B({type:"op",names:["\\arcsin","\\arccos","\\arctan","\\arctg","\\arcctg","\\arg","\\ch","\\cos","\\cosec","\\cosh","\\cot","\\cotg","\\coth","\\csc","\\ctg","\\cth","\\deg","\\dim","\\exp","\\hom","\\ker","\\lg","\\ln","\\log","\\sec","\\sin","\\sinh","\\sh","\\tan","\\tanh","\\tg","\\th"],props:{numArgs:0},handler(r){var{parser:e,funcName:t}=r;return{type:"op",mode:e.mode,limits:!1,parentIsSupSub:!1,symbol:!1,name:t}},htmlBuilder:se,mathmlBuilder:be});B({type:"op",names:["\\det","\\gcd","\\inf","\\lim","\\max","\\min","\\Pr","\\sup"],props:{numArgs:0},handler(r){var{parser:e,funcName:t}=r;return{type:"op",mode:e.mode,limits:!0,parentIsSupSub:!1,symbol:!1,name:t}},htmlBuilder:se,mathmlBuilder:be});B({type:"op",names:["\\int","\\iint","\\iiint","\\oint","\\oiint","\\oiiint","\u222B","\u222C","\u222D","\u222E","\u222F","\u2230"],props:{numArgs:0},handler(r){var{parser:e,funcName:t}=r,a=t;return a.length===1&&(a=an[a]),{type:"op",mode:e.mode,limits:!1,parentIsSupSub:!1,symbol:!0,name:a}},htmlBuilder:se,mathmlBuilder:be});var ca=(r,e)=>{var t,a,n=!1,s;r.type==="supsub"?(t=r.sup,a=r.sub,s=L(r.base,"operatorname"),n=!0):s=L(r,"operatorname");var l;if(s.body.length>0){for(var h=s.body.map(b=>{var x=b.text;return typeof x=="string"?{type:"textord",mode:b.mode,text:x}:b}),c=a0(h,e.withFont("mathrm"),!0),f=0;f{for(var t=m0(r.body,e.withFont("mathrm")),a=!0,n=0;nv.toText()).join("");t=[new M.TextNode(h)]}var c=new M.MathNode("mi",t);c.setAttribute("mathvariant","normal");var f=new M.MathNode("mo",[y0("\u2061","text")]);return r.parentIsSupSub?new M.MathNode("mrow",[c,f]):M.newDocumentFragment([c,f])};B({type:"operatorname",names:["\\operatorname@","\\operatornamewithlimits"],props:{numArgs:1},handler:(r,e)=>{var{parser:t,funcName:a}=r,n=e[0];return{type:"operatorname",mode:t.mode,body:e0(n),alwaysHandleSupSub:a==="\\operatornamewithlimits",limits:!1,parentIsSupSub:!1}},htmlBuilder:ca,mathmlBuilder:nn});m("\\operatorname","\\@ifstar\\operatornamewithlimits\\operatorname@");j0({type:"ordgroup",htmlBuilder(r,e){return r.semisimple?y.makeFragment(a0(r.body,e,!1)):y.makeSpan(["mord"],a0(r.body,e,!0),e)},mathmlBuilder(r,e){return V0(r.body,e,!0)}});B({type:"overline",names:["\\overline"],props:{numArgs:1},handler(r,e){var{parser:t}=r,a=e[0];return{type:"overline",mode:t.mode,body:a}},htmlBuilder(r,e){var t=G(r.body,e.havingCrampedStyle()),a=y.makeLineSpan("overline-line",e),n=e.fontMetrics().defaultRuleThickness,s=y.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:t},{type:"kern",size:3*n},{type:"elem",elem:a},{type:"kern",size:n}]},e);return y.makeSpan(["mord","overline"],[s],e)},mathmlBuilder(r,e){var t=new M.MathNode("mo",[new M.TextNode("\u203E")]);t.setAttribute("stretchy","true");var a=new M.MathNode("mover",[X(r.body,e),t]);return a.setAttribute("accent","true"),a}});B({type:"phantom",names:["\\phantom"],props:{numArgs:1,allowedInText:!0},handler:(r,e)=>{var{parser:t}=r,a=e[0];return{type:"phantom",mode:t.mode,body:e0(a)}},htmlBuilder:(r,e)=>{var t=a0(r.body,e.withPhantom(),!1);return y.makeFragment(t)},mathmlBuilder:(r,e)=>{var t=m0(r.body,e);return new M.MathNode("mphantom",t)}});B({type:"hphantom",names:["\\hphantom"],props:{numArgs:1,allowedInText:!0},handler:(r,e)=>{var{parser:t}=r,a=e[0];return{type:"hphantom",mode:t.mode,body:a}},htmlBuilder:(r,e)=>{var t=y.makeSpan([],[G(r.body,e.withPhantom())]);if(t.height=0,t.depth=0,t.children)for(var a=0;a{var t=m0(e0(r.body),e),a=new M.MathNode("mphantom",t),n=new M.MathNode("mpadded",[a]);return n.setAttribute("height","0px"),n.setAttribute("depth","0px"),n}});B({type:"vphantom",names:["\\vphantom"],props:{numArgs:1,allowedInText:!0},handler:(r,e)=>{var{parser:t}=r,a=e[0];return{type:"vphantom",mode:t.mode,body:a}},htmlBuilder:(r,e)=>{var t=y.makeSpan(["inner"],[G(r.body,e.withPhantom())]),a=y.makeSpan(["fix"],[]);return y.makeSpan(["mord","rlap"],[t,a],e)},mathmlBuilder:(r,e)=>{var t=m0(e0(r.body),e),a=new M.MathNode("mphantom",t),n=new M.MathNode("mpadded",[a]);return n.setAttribute("width","0px"),n}});B({type:"raisebox",names:["\\raisebox"],props:{numArgs:2,argTypes:["size","hbox"],allowedInText:!0},handler(r,e){var{parser:t}=r,a=L(e[0],"size").value,n=e[1];return{type:"raisebox",mode:t.mode,dy:a,body:n}},htmlBuilder(r,e){var t=G(r.body,e),a=Q(r.dy,e);return y.makeVList({positionType:"shift",positionData:-a,children:[{type:"elem",elem:t}]},e)},mathmlBuilder(r,e){var t=new M.MathNode("mpadded",[X(r.body,e)]),a=r.dy.number+r.dy.unit;return t.setAttribute("voffset",a),t}});B({type:"internal",names:["\\relax"],props:{numArgs:0,allowedInText:!0,allowedInArgument:!0},handler(r){var{parser:e}=r;return{type:"internal",mode:e.mode}}});B({type:"rule",names:["\\rule"],props:{numArgs:2,numOptionalArgs:1,allowedInText:!0,allowedInMath:!0,argTypes:["size","size","size"]},handler(r,e,t){var{parser:a}=r,n=t[0],s=L(e[0],"size"),l=L(e[1],"size");return{type:"rule",mode:a.mode,shift:n&&L(n,"size").value,width:s.value,height:l.value}},htmlBuilder(r,e){var t=y.makeSpan(["mord","rule"],[],e),a=Q(r.width,e),n=Q(r.height,e),s=r.shift?Q(r.shift,e):0;return t.style.borderRightWidth=T(a),t.style.borderTopWidth=T(n),t.style.bottom=T(s),t.width=a,t.height=n+s,t.depth=-s,t.maxFontSize=n*1.125*e.sizeMultiplier,t},mathmlBuilder(r,e){var t=Q(r.width,e),a=Q(r.height,e),n=r.shift?Q(r.shift,e):0,s=e.color&&e.getColor()||"black",l=new M.MathNode("mspace");l.setAttribute("mathbackground",s),l.setAttribute("width",T(t)),l.setAttribute("height",T(a));var h=new M.MathNode("mpadded",[l]);return n>=0?h.setAttribute("height",T(n)):(h.setAttribute("height",T(n)),h.setAttribute("depth",T(-n))),h.setAttribute("voffset",T(n)),h}});function ma(r,e,t){for(var a=a0(r,e,!1),n=e.sizeMultiplier/t.sizeMultiplier,s=0;s{var t=e.havingSize(r.size);return ma(r.body,t,e)};B({type:"sizing",names:pr,props:{numArgs:0,allowedInText:!0},handler:(r,e)=>{var{breakOnTokenText:t,funcName:a,parser:n}=r,s=n.parseExpression(!1,t);return{type:"sizing",mode:n.mode,size:pr.indexOf(a)+1,body:s}},htmlBuilder:sn,mathmlBuilder:(r,e)=>{var t=e.havingSize(r.size),a=m0(r.body,t),n=new M.MathNode("mstyle",a);return n.setAttribute("mathsize",T(t.sizeMultiplier)),n}});B({type:"smash",names:["\\smash"],props:{numArgs:1,numOptionalArgs:1,allowedInText:!0},handler:(r,e,t)=>{var{parser:a}=r,n=!1,s=!1,l=t[0]&&L(t[0],"ordgroup");if(l)for(var h="",c=0;c{var t=y.makeSpan([],[G(r.body,e)]);if(!r.smashHeight&&!r.smashDepth)return t;if(r.smashHeight&&(t.height=0,t.children))for(var a=0;a{var t=new M.MathNode("mpadded",[X(r.body,e)]);return r.smashHeight&&t.setAttribute("height","0px"),r.smashDepth&&t.setAttribute("depth","0px"),t}});B({type:"sqrt",names:["\\sqrt"],props:{numArgs:1,numOptionalArgs:1},handler(r,e,t){var{parser:a}=r,n=t[0],s=e[0];return{type:"sqrt",mode:a.mode,body:s,index:n}},htmlBuilder(r,e){var t=G(r.body,e.havingCrampedStyle());t.height===0&&(t.height=e.fontMetrics().xHeight),t=y.wrapFragment(t,e);var a=e.fontMetrics(),n=a.defaultRuleThickness,s=n;e.style.idt.height+t.depth+l&&(l=(l+b-t.height-t.depth)/2);var x=c.height-t.height-l-f;t.style.paddingLeft=T(v);var w=y.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:t,wrapperClasses:["svg-align"]},{type:"kern",size:-(t.height+x)},{type:"elem",elem:c},{type:"kern",size:f}]},e);if(r.index){var A=e.havingStyle(E.SCRIPTSCRIPT),q=G(r.index,A,e),_=.6*(w.height-w.depth),D=y.makeVList({positionType:"shift",positionData:-_,children:[{type:"elem",elem:q}]},e),N=y.makeSpan(["root"],[D]);return y.makeSpan(["mord","sqrt"],[N,w],e)}else return y.makeSpan(["mord","sqrt"],[w],e)},mathmlBuilder(r,e){var{body:t,index:a}=r;return a?new M.MathNode("mroot",[X(t,e),X(a,e)]):new M.MathNode("msqrt",[X(t,e)])}});var fr={display:E.DISPLAY,text:E.TEXT,script:E.SCRIPT,scriptscript:E.SCRIPTSCRIPT};B({type:"styling",names:["\\displaystyle","\\textstyle","\\scriptstyle","\\scriptscriptstyle"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(r,e){var{breakOnTokenText:t,funcName:a,parser:n}=r,s=n.parseExpression(!0,t),l=a.slice(1,a.length-5);return{type:"styling",mode:n.mode,style:l,body:s}},htmlBuilder(r,e){var t=fr[r.style],a=e.havingStyle(t).withFont("");return ma(r.body,a,e)},mathmlBuilder(r,e){var t=fr[r.style],a=e.havingStyle(t),n=m0(r.body,a),s=new M.MathNode("mstyle",n),l={display:["0","true"],text:["0","false"],script:["1","false"],scriptscript:["2","false"]},h=l[r.style];return s.setAttribute("scriptlevel",h[0]),s.setAttribute("displaystyle",h[1]),s}});var on=function(e,t){var a=e.base;if(a)if(a.type==="op"){var n=a.limits&&(t.style.size===E.DISPLAY.size||a.alwaysHandleSupSub);return n?se:null}else if(a.type==="operatorname"){var s=a.alwaysHandleSupSub&&(t.style.size===E.DISPLAY.size||a.limits);return s?ca:null}else{if(a.type==="accent")return O.isCharacterBox(a.base)?_t:null;if(a.type==="horizBrace"){var l=!e.sub;return l===a.isOver?la:null}else return null}else return null};j0({type:"supsub",htmlBuilder(r,e){var t=on(r,e);if(t)return t(r,e);var{base:a,sup:n,sub:s}=r,l=G(a,e),h,c,f=e.fontMetrics(),v=0,b=0,x=a&&O.isCharacterBox(a);if(n){var w=e.havingStyle(e.style.sup());h=G(n,w,e),x||(v=l.height-w.fontMetrics().supDrop*w.sizeMultiplier/e.sizeMultiplier)}if(s){var A=e.havingStyle(e.style.sub());c=G(s,A,e),x||(b=l.depth+A.fontMetrics().subDrop*A.sizeMultiplier/e.sizeMultiplier)}var q;e.style===E.DISPLAY?q=f.sup1:e.style.cramped?q=f.sup3:q=f.sup2;var _=e.sizeMultiplier,D=T(.5/f.ptPerEm/_),N=null;if(c){var $=r.base&&r.base.type==="op"&&r.base.name&&(r.base.name==="\\oiint"||r.base.name==="\\oiiint");(l instanceof c0||$)&&(N=T(-l.italic))}var H;if(h&&c){v=Math.max(v,q,h.depth+.25*f.xHeight),b=Math.max(b,f.sub2);var F=f.defaultRuleThickness,P=4*F;if(v-h.depth-(c.height-b)0&&(v+=V,b-=V)}var j=[{type:"elem",elem:c,shift:b,marginRight:D,marginLeft:N},{type:"elem",elem:h,shift:-v,marginRight:D}];H=y.makeVList({positionType:"individualShift",children:j},e)}else if(c){b=Math.max(b,f.sub1,c.height-.8*f.xHeight);var U=[{type:"elem",elem:c,marginLeft:N,marginRight:D}];H=y.makeVList({positionType:"shift",positionData:b,children:U},e)}else if(h)v=Math.max(v,q,h.depth+.25*f.xHeight),H=y.makeVList({positionType:"shift",positionData:-v,children:[{type:"elem",elem:h,marginRight:D}]},e);else throw new Error("supsub must have either sup or sub.");var D0=bt(l,"right")||"mord";return y.makeSpan([D0],[l,y.makeSpan(["msupsub"],[H])],e)},mathmlBuilder(r,e){var t=!1,a,n;r.base&&r.base.type==="horizBrace"&&(n=!!r.sup,n===r.base.isOver&&(t=!0,a=r.base.isOver)),r.base&&(r.base.type==="op"||r.base.type==="operatorname")&&(r.base.parentIsSupSub=!0);var s=[X(r.base,e)];r.sub&&s.push(X(r.sub,e)),r.sup&&s.push(X(r.sup,e));var l;if(t)l=a?"mover":"munder";else if(r.sub)if(r.sup){var f=r.base;f&&f.type==="op"&&f.limits&&e.style===E.DISPLAY||f&&f.type==="operatorname"&&f.alwaysHandleSupSub&&(e.style===E.DISPLAY||f.limits)?l="munderover":l="msubsup"}else{var c=r.base;c&&c.type==="op"&&c.limits&&(e.style===E.DISPLAY||c.alwaysHandleSupSub)||c&&c.type==="operatorname"&&c.alwaysHandleSupSub&&(c.limits||e.style===E.DISPLAY)?l="munder":l="msub"}else{var h=r.base;h&&h.type==="op"&&h.limits&&(e.style===E.DISPLAY||h.alwaysHandleSupSub)||h&&h.type==="operatorname"&&h.alwaysHandleSupSub&&(h.limits||e.style===E.DISPLAY)?l="mover":l="msup"}return new M.MathNode(l,s)}});j0({type:"atom",htmlBuilder(r,e){return y.mathsym(r.text,r.mode,e,["m"+r.family])},mathmlBuilder(r,e){var t=new M.MathNode("mo",[y0(r.text,r.mode)]);if(r.family==="bin"){var a=Dt(r,e);a==="bold-italic"&&t.setAttribute("mathvariant",a)}else r.family==="punct"?t.setAttribute("separator","true"):(r.family==="open"||r.family==="close")&&t.setAttribute("stretchy","false");return t}});var da={mi:"italic",mn:"normal",mtext:"normal"};j0({type:"mathord",htmlBuilder(r,e){return y.makeOrd(r,e,"mathord")},mathmlBuilder(r,e){var t=new M.MathNode("mi",[y0(r.text,r.mode,e)]),a=Dt(r,e)||"italic";return a!==da[t.type]&&t.setAttribute("mathvariant",a),t}});j0({type:"textord",htmlBuilder(r,e){return y.makeOrd(r,e,"textord")},mathmlBuilder(r,e){var t=y0(r.text,r.mode,e),a=Dt(r,e)||"normal",n;return r.mode==="text"?n=new M.MathNode("mtext",[t]):/[0-9]/.test(r.text)?n=new M.MathNode("mn",[t]):r.text==="\\prime"?n=new M.MathNode("mo",[t]):n=new M.MathNode("mi",[t]),a!==da[n.type]&&n.setAttribute("mathvariant",a),n}});var ct={"\\nobreak":"nobreak","\\allowbreak":"allowbreak"},mt={" ":{},"\\ ":{},"~":{className:"nobreak"},"\\space":{},"\\nobreakspace":{className:"nobreak"}};j0({type:"spacing",htmlBuilder(r,e){if(mt.hasOwnProperty(r.text)){var t=mt[r.text].className||"";if(r.mode==="text"){var a=y.makeOrd(r,e,"textord");return a.classes.push(t),a}else return y.makeSpan(["mspace",t],[y.mathsym(r.text,r.mode,e)],e)}else{if(ct.hasOwnProperty(r.text))return y.makeSpan(["mspace",ct[r.text]],[],e);throw new z('Unknown type of space "'+r.text+'"')}},mathmlBuilder(r,e){var t;if(mt.hasOwnProperty(r.text))t=new M.MathNode("mtext",[new M.TextNode("\xA0")]);else{if(ct.hasOwnProperty(r.text))return new M.MathNode("mspace");throw new z('Unknown type of space "'+r.text+'"')}return t}});var vr=()=>{var r=new M.MathNode("mtd",[]);return r.setAttribute("width","50%"),r};j0({type:"tag",mathmlBuilder(r,e){var t=new M.MathNode("mtable",[new M.MathNode("mtr",[vr(),new M.MathNode("mtd",[V0(r.body,e)]),vr(),new M.MathNode("mtd",[V0(r.tag,e)])])]);return t.setAttribute("width","100%"),t}});var gr={"\\text":void 0,"\\textrm":"textrm","\\textsf":"textsf","\\texttt":"texttt","\\textnormal":"textrm"},br={"\\textbf":"textbf","\\textmd":"textmd"},ln={"\\textit":"textit","\\textup":"textup"},yr=(r,e)=>{var t=r.font;if(t){if(gr[t])return e.withTextFontFamily(gr[t]);if(br[t])return e.withTextFontWeight(br[t]);if(t==="\\emph")return e.fontShape==="textit"?e.withTextFontShape("textup"):e.withTextFontShape("textit")}else return e;return e.withTextFontShape(ln[t])};B({type:"text",names:["\\text","\\textrm","\\textsf","\\texttt","\\textnormal","\\textbf","\\textmd","\\textit","\\textup","\\emph"],props:{numArgs:1,argTypes:["text"],allowedInArgument:!0,allowedInText:!0},handler(r,e){var{parser:t,funcName:a}=r,n=e[0];return{type:"text",mode:t.mode,body:e0(n),font:a}},htmlBuilder(r,e){var t=yr(r,e),a=a0(r.body,t,!0);return y.makeSpan(["mord","text"],a,t)},mathmlBuilder(r,e){var t=yr(r,e);return V0(r.body,t)}});B({type:"underline",names:["\\underline"],props:{numArgs:1,allowedInText:!0},handler(r,e){var{parser:t}=r;return{type:"underline",mode:t.mode,body:e[0]}},htmlBuilder(r,e){var t=G(r.body,e),a=y.makeLineSpan("underline-line",e),n=e.fontMetrics().defaultRuleThickness,s=y.makeVList({positionType:"top",positionData:t.height,children:[{type:"kern",size:n},{type:"elem",elem:a},{type:"kern",size:3*n},{type:"elem",elem:t}]},e);return y.makeSpan(["mord","underline"],[s],e)},mathmlBuilder(r,e){var t=new M.MathNode("mo",[new M.TextNode("\u203E")]);t.setAttribute("stretchy","true");var a=new M.MathNode("munder",[X(r.body,e),t]);return a.setAttribute("accentunder","true"),a}});B({type:"vcenter",names:["\\vcenter"],props:{numArgs:1,argTypes:["original"],allowedInText:!1},handler(r,e){var{parser:t}=r;return{type:"vcenter",mode:t.mode,body:e[0]}},htmlBuilder(r,e){var t=G(r.body,e),a=e.fontMetrics().axisHeight,n=.5*(t.height-a-(t.depth+a));return y.makeVList({positionType:"shift",positionData:n,children:[{type:"elem",elem:t}]},e)},mathmlBuilder(r,e){return new M.MathNode("mpadded",[X(r.body,e)],["vcenter"])}});B({type:"verb",names:["\\verb"],props:{numArgs:0,allowedInText:!0},handler(r,e,t){throw new z("\\verb ended by end of line instead of matching delimiter")},htmlBuilder(r,e){for(var t=xr(r),a=[],n=e.havingStyle(e.style.text()),s=0;sr.body.replace(/ /g,r.star?"\u2423":"\xA0"),P0=Er,pa=`[ \r ]`,un="\\\\[a-zA-Z@]+",hn="\\\\[^\uD800-\uDFFF]",cn="("+un+")"+pa+"*",mn=`\\\\( |[ \r ]+ ?)[ \r ]*`,kt="[\u0300-\u036F]",dn=new RegExp(kt+"+$"),pn="("+pa+"+)|"+(mn+"|")+"([!-\\[\\]-\u2027\u202A-\uD7FF\uF900-\uFFFF]"+(kt+"*")+"|[\uD800-\uDBFF][\uDC00-\uDFFF]"+(kt+"*")+"|\\\\verb\\*([^]).*?\\4|\\\\verb([^*a-zA-Z]).*?\\5"+("|"+cn)+("|"+hn+")"),Pe=class{constructor(e,t){this.input=void 0,this.settings=void 0,this.tokenRegex=void 0,this.catcodes=void 0,this.input=e,this.settings=t,this.tokenRegex=new RegExp(pn,"g"),this.catcodes={"%":14,"~":13}}setCatcode(e,t){this.catcodes[e]=t}lex(){var e=this.input,t=this.tokenRegex.lastIndex;if(t===e.length)return new b0("EOF",new d0(this,t,t));var a=this.tokenRegex.exec(e);if(a===null||a.index!==t)throw new z("Unexpected character: '"+e[t]+"'",new b0(e[t],new d0(this,t,t+1)));var n=a[6]||a[3]||(a[2]?"\\ ":" ");if(this.catcodes[n]===14){var s=e.indexOf(` -`,this.tokenRegex.lastIndex);return s===-1?(this.tokenRegex.lastIndex=e.length,this.settings.reportNonstrict("commentAtEnd","% comment has no terminating newline; LaTeX would fail because of commenting the end of math mode (e.g. $)")):this.tokenRegex.lastIndex=s+1,this.lex()}return new b0(n,new d0(this,t,this.tokenRegex.lastIndex))}},Mt=class{constructor(e,t){e===void 0&&(e={}),t===void 0&&(t={}),this.current=void 0,this.builtins=void 0,this.undefStack=void 0,this.current=t,this.builtins=e,this.undefStack=[]}beginGroup(){this.undefStack.push({})}endGroup(){if(this.undefStack.length===0)throw new z("Unbalanced namespace destruction: attempt to pop global namespace; please report this as a bug");var e=this.undefStack.pop();for(var t in e)e.hasOwnProperty(t)&&(e[t]==null?delete this.current[t]:this.current[t]=e[t])}endGroups(){for(;this.undefStack.length>0;)this.endGroup()}has(e){return this.current.hasOwnProperty(e)||this.builtins.hasOwnProperty(e)}get(e){return this.current.hasOwnProperty(e)?this.current[e]:this.builtins[e]}set(e,t,a){if(a===void 0&&(a=!1),a){for(var n=0;n0&&(this.undefStack[this.undefStack.length-1][e]=t)}else{var s=this.undefStack[this.undefStack.length-1];s&&!s.hasOwnProperty(e)&&(s[e]=this.current[e])}t==null?delete this.current[e]:this.current[e]=t}},fn=aa;m("\\noexpand",function(r){var e=r.popToken();return r.isExpandable(e.text)&&(e.noexpand=!0,e.treatAsRelax=!0),{tokens:[e],numArgs:0}});m("\\expandafter",function(r){var e=r.popToken();return r.expandOnce(!0),{tokens:[e],numArgs:0}});m("\\@firstoftwo",function(r){var e=r.consumeArgs(2);return{tokens:e[0],numArgs:0}});m("\\@secondoftwo",function(r){var e=r.consumeArgs(2);return{tokens:e[1],numArgs:0}});m("\\@ifnextchar",function(r){var e=r.consumeArgs(3);r.consumeSpaces();var t=r.future();return e[0].length===1&&e[0][0].text===t.text?{tokens:e[1],numArgs:0}:{tokens:e[2],numArgs:0}});m("\\@ifstar","\\@ifnextchar *{\\@firstoftwo{#1}}");m("\\TextOrMath",function(r){var e=r.consumeArgs(2);return r.mode==="text"?{tokens:e[0],numArgs:0}:{tokens:e[1],numArgs:0}});var wr={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,a:10,A:10,b:11,B:11,c:12,C:12,d:13,D:13,e:14,E:14,f:15,F:15};m("\\char",function(r){var e=r.popToken(),t,a="";if(e.text==="'")t=8,e=r.popToken();else if(e.text==='"')t=16,e=r.popToken();else if(e.text==="`")if(e=r.popToken(),e.text[0]==="\\")a=e.text.charCodeAt(1);else{if(e.text==="EOF")throw new z("\\char` missing argument");a=e.text.charCodeAt(0)}else t=10;if(t){if(a=wr[e.text],a==null||a>=t)throw new z("Invalid base-"+t+" digit "+e.text);for(var n;(n=wr[r.future().text])!=null&&n{var n=r.consumeArg().tokens;if(n.length!==1)throw new z("\\newcommand's first argument must be a macro name");var s=n[0].text,l=r.isDefined(s);if(l&&!e)throw new z("\\newcommand{"+s+"} attempting to redefine "+(s+"; use \\renewcommand"));if(!l&&!t)throw new z("\\renewcommand{"+s+"} when command "+s+" does not yet exist; use \\newcommand");var h=0;if(n=r.consumeArg().tokens,n.length===1&&n[0].text==="["){for(var c="",f=r.expandNextToken();f.text!=="]"&&f.text!=="EOF";)c+=f.text,f=r.expandNextToken();if(!c.match(/^\s*[0-9]+\s*$/))throw new z("Invalid number of arguments: "+c);h=parseInt(c),n=r.consumeArg().tokens}return l&&a||r.macros.set(s,{tokens:n,numArgs:h}),""};m("\\newcommand",r=>Ft(r,!1,!0,!1));m("\\renewcommand",r=>Ft(r,!0,!1,!1));m("\\providecommand",r=>Ft(r,!0,!0,!0));m("\\message",r=>{var e=r.consumeArgs(1)[0];return console.log(e.reverse().map(t=>t.text).join("")),""});m("\\errmessage",r=>{var e=r.consumeArgs(1)[0];return console.error(e.reverse().map(t=>t.text).join("")),""});m("\\show",r=>{var e=r.popToken(),t=e.text;return console.log(e,r.macros.get(t),P0[t],Y.math[t],Y.text[t]),""});m("\\bgroup","{");m("\\egroup","}");m("~","\\nobreakspace");m("\\lq","`");m("\\rq","'");m("\\aa","\\r a");m("\\AA","\\r A");m("\\textcopyright","\\html@mathml{\\textcircled{c}}{\\char`\xA9}");m("\\copyright","\\TextOrMath{\\textcopyright}{\\text{\\textcopyright}}");m("\\textregistered","\\html@mathml{\\textcircled{\\scriptsize R}}{\\char`\xAE}");m("\u212C","\\mathscr{B}");m("\u2130","\\mathscr{E}");m("\u2131","\\mathscr{F}");m("\u210B","\\mathscr{H}");m("\u2110","\\mathscr{I}");m("\u2112","\\mathscr{L}");m("\u2133","\\mathscr{M}");m("\u211B","\\mathscr{R}");m("\u212D","\\mathfrak{C}");m("\u210C","\\mathfrak{H}");m("\u2128","\\mathfrak{Z}");m("\\Bbbk","\\Bbb{k}");m("\xB7","\\cdotp");m("\\llap","\\mathllap{\\textrm{#1}}");m("\\rlap","\\mathrlap{\\textrm{#1}}");m("\\clap","\\mathclap{\\textrm{#1}}");m("\\mathstrut","\\vphantom{(}");m("\\underbar","\\underline{\\text{#1}}");m("\\not",'\\html@mathml{\\mathrel{\\mathrlap\\@not}}{\\char"338}');m("\\neq","\\html@mathml{\\mathrel{\\not=}}{\\mathrel{\\char`\u2260}}");m("\\ne","\\neq");m("\u2260","\\neq");m("\\notin","\\html@mathml{\\mathrel{{\\in}\\mathllap{/\\mskip1mu}}}{\\mathrel{\\char`\u2209}}");m("\u2209","\\notin");m("\u2258","\\html@mathml{\\mathrel{=\\kern{-1em}\\raisebox{0.4em}{$\\scriptsize\\frown$}}}{\\mathrel{\\char`\u2258}}");m("\u2259","\\html@mathml{\\stackrel{\\tiny\\wedge}{=}}{\\mathrel{\\char`\u2258}}");m("\u225A","\\html@mathml{\\stackrel{\\tiny\\vee}{=}}{\\mathrel{\\char`\u225A}}");m("\u225B","\\html@mathml{\\stackrel{\\scriptsize\\star}{=}}{\\mathrel{\\char`\u225B}}");m("\u225D","\\html@mathml{\\stackrel{\\tiny\\mathrm{def}}{=}}{\\mathrel{\\char`\u225D}}");m("\u225E","\\html@mathml{\\stackrel{\\tiny\\mathrm{m}}{=}}{\\mathrel{\\char`\u225E}}");m("\u225F","\\html@mathml{\\stackrel{\\tiny?}{=}}{\\mathrel{\\char`\u225F}}");m("\u27C2","\\perp");m("\u203C","\\mathclose{!\\mkern-0.8mu!}");m("\u220C","\\notni");m("\u231C","\\ulcorner");m("\u231D","\\urcorner");m("\u231E","\\llcorner");m("\u231F","\\lrcorner");m("\xA9","\\copyright");m("\xAE","\\textregistered");m("\uFE0F","\\textregistered");m("\\ulcorner",'\\html@mathml{\\@ulcorner}{\\mathop{\\char"231c}}');m("\\urcorner",'\\html@mathml{\\@urcorner}{\\mathop{\\char"231d}}');m("\\llcorner",'\\html@mathml{\\@llcorner}{\\mathop{\\char"231e}}');m("\\lrcorner",'\\html@mathml{\\@lrcorner}{\\mathop{\\char"231f}}');m("\\vdots","{\\varvdots\\rule{0pt}{15pt}}");m("\u22EE","\\vdots");m("\\varGamma","\\mathit{\\Gamma}");m("\\varDelta","\\mathit{\\Delta}");m("\\varTheta","\\mathit{\\Theta}");m("\\varLambda","\\mathit{\\Lambda}");m("\\varXi","\\mathit{\\Xi}");m("\\varPi","\\mathit{\\Pi}");m("\\varSigma","\\mathit{\\Sigma}");m("\\varUpsilon","\\mathit{\\Upsilon}");m("\\varPhi","\\mathit{\\Phi}");m("\\varPsi","\\mathit{\\Psi}");m("\\varOmega","\\mathit{\\Omega}");m("\\substack","\\begin{subarray}{c}#1\\end{subarray}");m("\\colon","\\nobreak\\mskip2mu\\mathpunct{}\\mathchoice{\\mkern-3mu}{\\mkern-3mu}{}{}{:}\\mskip6mu\\relax");m("\\boxed","\\fbox{$\\displaystyle{#1}$}");m("\\iff","\\DOTSB\\;\\Longleftrightarrow\\;");m("\\implies","\\DOTSB\\;\\Longrightarrow\\;");m("\\impliedby","\\DOTSB\\;\\Longleftarrow\\;");m("\\dddot","{\\overset{\\raisebox{-0.1ex}{\\normalsize ...}}{#1}}");m("\\ddddot","{\\overset{\\raisebox{-0.1ex}{\\normalsize ....}}{#1}}");var Sr={",":"\\dotsc","\\not":"\\dotsb","+":"\\dotsb","=":"\\dotsb","<":"\\dotsb",">":"\\dotsb","-":"\\dotsb","*":"\\dotsb",":":"\\dotsb","\\DOTSB":"\\dotsb","\\coprod":"\\dotsb","\\bigvee":"\\dotsb","\\bigwedge":"\\dotsb","\\biguplus":"\\dotsb","\\bigcap":"\\dotsb","\\bigcup":"\\dotsb","\\prod":"\\dotsb","\\sum":"\\dotsb","\\bigotimes":"\\dotsb","\\bigoplus":"\\dotsb","\\bigodot":"\\dotsb","\\bigsqcup":"\\dotsb","\\And":"\\dotsb","\\longrightarrow":"\\dotsb","\\Longrightarrow":"\\dotsb","\\longleftarrow":"\\dotsb","\\Longleftarrow":"\\dotsb","\\longleftrightarrow":"\\dotsb","\\Longleftrightarrow":"\\dotsb","\\mapsto":"\\dotsb","\\longmapsto":"\\dotsb","\\hookrightarrow":"\\dotsb","\\doteq":"\\dotsb","\\mathbin":"\\dotsb","\\mathrel":"\\dotsb","\\relbar":"\\dotsb","\\Relbar":"\\dotsb","\\xrightarrow":"\\dotsb","\\xleftarrow":"\\dotsb","\\DOTSI":"\\dotsi","\\int":"\\dotsi","\\oint":"\\dotsi","\\iint":"\\dotsi","\\iiint":"\\dotsi","\\iiiint":"\\dotsi","\\idotsint":"\\dotsi","\\DOTSX":"\\dotsx"};m("\\dots",function(r){var e="\\dotso",t=r.expandAfterFuture().text;return t in Sr?e=Sr[t]:(t.slice(0,4)==="\\not"||t in Y.math&&O.contains(["bin","rel"],Y.math[t].group))&&(e="\\dotsb"),e});var Ht={")":!0,"]":!0,"\\rbrack":!0,"\\}":!0,"\\rbrace":!0,"\\rangle":!0,"\\rceil":!0,"\\rfloor":!0,"\\rgroup":!0,"\\rmoustache":!0,"\\right":!0,"\\bigr":!0,"\\biggr":!0,"\\Bigr":!0,"\\Biggr":!0,$:!0,";":!0,".":!0,",":!0};m("\\dotso",function(r){var e=r.future().text;return e in Ht?"\\ldots\\,":"\\ldots"});m("\\dotsc",function(r){var e=r.future().text;return e in Ht&&e!==","?"\\ldots\\,":"\\ldots"});m("\\cdots",function(r){var e=r.future().text;return e in Ht?"\\@cdots\\,":"\\@cdots"});m("\\dotsb","\\cdots");m("\\dotsm","\\cdots");m("\\dotsi","\\!\\cdots");m("\\dotsx","\\ldots\\,");m("\\DOTSI","\\relax");m("\\DOTSB","\\relax");m("\\DOTSX","\\relax");m("\\tmspace","\\TextOrMath{\\kern#1#3}{\\mskip#1#2}\\relax");m("\\,","\\tmspace+{3mu}{.1667em}");m("\\thinspace","\\,");m("\\>","\\mskip{4mu}");m("\\:","\\tmspace+{4mu}{.2222em}");m("\\medspace","\\:");m("\\;","\\tmspace+{5mu}{.2777em}");m("\\thickspace","\\;");m("\\!","\\tmspace-{3mu}{.1667em}");m("\\negthinspace","\\!");m("\\negmedspace","\\tmspace-{4mu}{.2222em}");m("\\negthickspace","\\tmspace-{5mu}{.277em}");m("\\enspace","\\kern.5em ");m("\\enskip","\\hskip.5em\\relax");m("\\quad","\\hskip1em\\relax");m("\\qquad","\\hskip2em\\relax");m("\\tag","\\@ifstar\\tag@literal\\tag@paren");m("\\tag@paren","\\tag@literal{({#1})}");m("\\tag@literal",r=>{if(r.macros.get("\\df@tag"))throw new z("Multiple \\tag");return"\\gdef\\df@tag{\\text{#1}}"});m("\\bmod","\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}\\mathbin{\\rm mod}\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}");m("\\pod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern8mu}{\\mkern8mu}{\\mkern8mu}(#1)");m("\\pmod","\\pod{{\\rm mod}\\mkern6mu#1}");m("\\mod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern12mu}{\\mkern12mu}{\\mkern12mu}{\\rm mod}\\,\\,#1");m("\\newline","\\\\\\relax");m("\\TeX","\\textrm{\\html@mathml{T\\kern-.1667em\\raisebox{-.5ex}{E}\\kern-.125emX}{TeX}}");var fa=T(z0["Main-Regular"][84][1]-.7*z0["Main-Regular"][65][1]);m("\\LaTeX","\\textrm{\\html@mathml{"+("L\\kern-.36em\\raisebox{"+fa+"}{\\scriptstyle A}")+"\\kern-.15em\\TeX}{LaTeX}}");m("\\KaTeX","\\textrm{\\html@mathml{"+("K\\kern-.17em\\raisebox{"+fa+"}{\\scriptstyle A}")+"\\kern-.15em\\TeX}{KaTeX}}");m("\\hspace","\\@ifstar\\@hspacer\\@hspace");m("\\@hspace","\\hskip #1\\relax");m("\\@hspacer","\\rule{0pt}{0pt}\\hskip #1\\relax");m("\\ordinarycolon",":");m("\\vcentcolon","\\mathrel{\\mathop\\ordinarycolon}");m("\\dblcolon",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-.9mu}\\vcentcolon}}{\\mathop{\\char"2237}}');m("\\coloneqq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2254}}');m("\\Coloneqq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2237\\char"3d}}');m("\\coloneq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"3a\\char"2212}}');m("\\Coloneq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"2237\\char"2212}}');m("\\eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2255}}');m("\\Eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"3d\\char"2237}}');m("\\eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2239}}');m("\\Eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"2212\\char"2237}}');m("\\colonapprox",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"3a\\char"2248}}');m("\\Colonapprox",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"2237\\char"2248}}');m("\\colonsim",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"3a\\char"223c}}');m("\\Colonsim",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"2237\\char"223c}}');m("\u2237","\\dblcolon");m("\u2239","\\eqcolon");m("\u2254","\\coloneqq");m("\u2255","\\eqqcolon");m("\u2A74","\\Coloneqq");m("\\ratio","\\vcentcolon");m("\\coloncolon","\\dblcolon");m("\\colonequals","\\coloneqq");m("\\coloncolonequals","\\Coloneqq");m("\\equalscolon","\\eqqcolon");m("\\equalscoloncolon","\\Eqqcolon");m("\\colonminus","\\coloneq");m("\\coloncolonminus","\\Coloneq");m("\\minuscolon","\\eqcolon");m("\\minuscoloncolon","\\Eqcolon");m("\\coloncolonapprox","\\Colonapprox");m("\\coloncolonsim","\\Colonsim");m("\\simcolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\vcentcolon}");m("\\simcoloncolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\dblcolon}");m("\\approxcolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\vcentcolon}");m("\\approxcoloncolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\dblcolon}");m("\\notni","\\html@mathml{\\not\\ni}{\\mathrel{\\char`\u220C}}");m("\\limsup","\\DOTSB\\operatorname*{lim\\,sup}");m("\\liminf","\\DOTSB\\operatorname*{lim\\,inf}");m("\\injlim","\\DOTSB\\operatorname*{inj\\,lim}");m("\\projlim","\\DOTSB\\operatorname*{proj\\,lim}");m("\\varlimsup","\\DOTSB\\operatorname*{\\overline{lim}}");m("\\varliminf","\\DOTSB\\operatorname*{\\underline{lim}}");m("\\varinjlim","\\DOTSB\\operatorname*{\\underrightarrow{lim}}");m("\\varprojlim","\\DOTSB\\operatorname*{\\underleftarrow{lim}}");m("\\gvertneqq","\\html@mathml{\\@gvertneqq}{\u2269}");m("\\lvertneqq","\\html@mathml{\\@lvertneqq}{\u2268}");m("\\ngeqq","\\html@mathml{\\@ngeqq}{\u2271}");m("\\ngeqslant","\\html@mathml{\\@ngeqslant}{\u2271}");m("\\nleqq","\\html@mathml{\\@nleqq}{\u2270}");m("\\nleqslant","\\html@mathml{\\@nleqslant}{\u2270}");m("\\nshortmid","\\html@mathml{\\@nshortmid}{\u2224}");m("\\nshortparallel","\\html@mathml{\\@nshortparallel}{\u2226}");m("\\nsubseteqq","\\html@mathml{\\@nsubseteqq}{\u2288}");m("\\nsupseteqq","\\html@mathml{\\@nsupseteqq}{\u2289}");m("\\varsubsetneq","\\html@mathml{\\@varsubsetneq}{\u228A}");m("\\varsubsetneqq","\\html@mathml{\\@varsubsetneqq}{\u2ACB}");m("\\varsupsetneq","\\html@mathml{\\@varsupsetneq}{\u228B}");m("\\varsupsetneqq","\\html@mathml{\\@varsupsetneqq}{\u2ACC}");m("\\imath","\\html@mathml{\\@imath}{\u0131}");m("\\jmath","\\html@mathml{\\@jmath}{\u0237}");m("\\llbracket","\\html@mathml{\\mathopen{[\\mkern-3.2mu[}}{\\mathopen{\\char`\u27E6}}");m("\\rrbracket","\\html@mathml{\\mathclose{]\\mkern-3.2mu]}}{\\mathclose{\\char`\u27E7}}");m("\u27E6","\\llbracket");m("\u27E7","\\rrbracket");m("\\lBrace","\\html@mathml{\\mathopen{\\{\\mkern-3.2mu[}}{\\mathopen{\\char`\u2983}}");m("\\rBrace","\\html@mathml{\\mathclose{]\\mkern-3.2mu\\}}}{\\mathclose{\\char`\u2984}}");m("\u2983","\\lBrace");m("\u2984","\\rBrace");m("\\minuso","\\mathbin{\\html@mathml{{\\mathrlap{\\mathchoice{\\kern{0.145em}}{\\kern{0.145em}}{\\kern{0.1015em}}{\\kern{0.0725em}}\\circ}{-}}}{\\char`\u29B5}}");m("\u29B5","\\minuso");m("\\darr","\\downarrow");m("\\dArr","\\Downarrow");m("\\Darr","\\Downarrow");m("\\lang","\\langle");m("\\rang","\\rangle");m("\\uarr","\\uparrow");m("\\uArr","\\Uparrow");m("\\Uarr","\\Uparrow");m("\\N","\\mathbb{N}");m("\\R","\\mathbb{R}");m("\\Z","\\mathbb{Z}");m("\\alef","\\aleph");m("\\alefsym","\\aleph");m("\\Alpha","\\mathrm{A}");m("\\Beta","\\mathrm{B}");m("\\bull","\\bullet");m("\\Chi","\\mathrm{X}");m("\\clubs","\\clubsuit");m("\\cnums","\\mathbb{C}");m("\\Complex","\\mathbb{C}");m("\\Dagger","\\ddagger");m("\\diamonds","\\diamondsuit");m("\\empty","\\emptyset");m("\\Epsilon","\\mathrm{E}");m("\\Eta","\\mathrm{H}");m("\\exist","\\exists");m("\\harr","\\leftrightarrow");m("\\hArr","\\Leftrightarrow");m("\\Harr","\\Leftrightarrow");m("\\hearts","\\heartsuit");m("\\image","\\Im");m("\\infin","\\infty");m("\\Iota","\\mathrm{I}");m("\\isin","\\in");m("\\Kappa","\\mathrm{K}");m("\\larr","\\leftarrow");m("\\lArr","\\Leftarrow");m("\\Larr","\\Leftarrow");m("\\lrarr","\\leftrightarrow");m("\\lrArr","\\Leftrightarrow");m("\\Lrarr","\\Leftrightarrow");m("\\Mu","\\mathrm{M}");m("\\natnums","\\mathbb{N}");m("\\Nu","\\mathrm{N}");m("\\Omicron","\\mathrm{O}");m("\\plusmn","\\pm");m("\\rarr","\\rightarrow");m("\\rArr","\\Rightarrow");m("\\Rarr","\\Rightarrow");m("\\real","\\Re");m("\\reals","\\mathbb{R}");m("\\Reals","\\mathbb{R}");m("\\Rho","\\mathrm{P}");m("\\sdot","\\cdot");m("\\sect","\\S");m("\\spades","\\spadesuit");m("\\sub","\\subset");m("\\sube","\\subseteq");m("\\supe","\\supseteq");m("\\Tau","\\mathrm{T}");m("\\thetasym","\\vartheta");m("\\weierp","\\wp");m("\\Zeta","\\mathrm{Z}");m("\\argmin","\\DOTSB\\operatorname*{arg\\,min}");m("\\argmax","\\DOTSB\\operatorname*{arg\\,max}");m("\\plim","\\DOTSB\\mathop{\\operatorname{plim}}\\limits");m("\\bra","\\mathinner{\\langle{#1}|}");m("\\ket","\\mathinner{|{#1}\\rangle}");m("\\braket","\\mathinner{\\langle{#1}\\rangle}");m("\\Bra","\\left\\langle#1\\right|");m("\\Ket","\\left|#1\\right\\rangle");var va=r=>e=>{var t=e.consumeArg().tokens,a=e.consumeArg().tokens,n=e.consumeArg().tokens,s=e.consumeArg().tokens,l=e.macros.get("|"),h=e.macros.get("\\|");e.macros.beginGroup();var c=b=>x=>{r&&(x.macros.set("|",l),n.length&&x.macros.set("\\|",h));var w=b;if(!b&&n.length){var A=x.future();A.text==="|"&&(x.popToken(),w=!0)}return{tokens:w?n:a,numArgs:0}};e.macros.set("|",c(!1)),n.length&&e.macros.set("\\|",c(!0));var f=e.consumeArg().tokens,v=e.expandTokens([...s,...f,...t]);return e.macros.endGroup(),{tokens:v.reverse(),numArgs:0}};m("\\bra@ket",va(!1));m("\\bra@set",va(!0));m("\\Braket","\\bra@ket{\\left\\langle}{\\,\\middle\\vert\\,}{\\,\\middle\\vert\\,}{\\right\\rangle}");m("\\Set","\\bra@set{\\left\\{\\:}{\\;\\middle\\vert\\;}{\\;\\middle\\Vert\\;}{\\:\\right\\}}");m("\\set","\\bra@set{\\{\\,}{\\mid}{}{\\,\\}}");m("\\angln","{\\angl n}");m("\\blue","\\textcolor{##6495ed}{#1}");m("\\orange","\\textcolor{##ffa500}{#1}");m("\\pink","\\textcolor{##ff00af}{#1}");m("\\red","\\textcolor{##df0030}{#1}");m("\\green","\\textcolor{##28ae7b}{#1}");m("\\gray","\\textcolor{gray}{#1}");m("\\purple","\\textcolor{##9d38bd}{#1}");m("\\blueA","\\textcolor{##ccfaff}{#1}");m("\\blueB","\\textcolor{##80f6ff}{#1}");m("\\blueC","\\textcolor{##63d9ea}{#1}");m("\\blueD","\\textcolor{##11accd}{#1}");m("\\blueE","\\textcolor{##0c7f99}{#1}");m("\\tealA","\\textcolor{##94fff5}{#1}");m("\\tealB","\\textcolor{##26edd5}{#1}");m("\\tealC","\\textcolor{##01d1c1}{#1}");m("\\tealD","\\textcolor{##01a995}{#1}");m("\\tealE","\\textcolor{##208170}{#1}");m("\\greenA","\\textcolor{##b6ffb0}{#1}");m("\\greenB","\\textcolor{##8af281}{#1}");m("\\greenC","\\textcolor{##74cf70}{#1}");m("\\greenD","\\textcolor{##1fab54}{#1}");m("\\greenE","\\textcolor{##0d923f}{#1}");m("\\goldA","\\textcolor{##ffd0a9}{#1}");m("\\goldB","\\textcolor{##ffbb71}{#1}");m("\\goldC","\\textcolor{##ff9c39}{#1}");m("\\goldD","\\textcolor{##e07d10}{#1}");m("\\goldE","\\textcolor{##a75a05}{#1}");m("\\redA","\\textcolor{##fca9a9}{#1}");m("\\redB","\\textcolor{##ff8482}{#1}");m("\\redC","\\textcolor{##f9685d}{#1}");m("\\redD","\\textcolor{##e84d39}{#1}");m("\\redE","\\textcolor{##bc2612}{#1}");m("\\maroonA","\\textcolor{##ffbde0}{#1}");m("\\maroonB","\\textcolor{##ff92c6}{#1}");m("\\maroonC","\\textcolor{##ed5fa6}{#1}");m("\\maroonD","\\textcolor{##ca337c}{#1}");m("\\maroonE","\\textcolor{##9e034e}{#1}");m("\\purpleA","\\textcolor{##ddd7ff}{#1}");m("\\purpleB","\\textcolor{##c6b9fc}{#1}");m("\\purpleC","\\textcolor{##aa87ff}{#1}");m("\\purpleD","\\textcolor{##7854ab}{#1}");m("\\purpleE","\\textcolor{##543b78}{#1}");m("\\mintA","\\textcolor{##f5f9e8}{#1}");m("\\mintB","\\textcolor{##edf2df}{#1}");m("\\mintC","\\textcolor{##e0e5cc}{#1}");m("\\grayA","\\textcolor{##f6f7f7}{#1}");m("\\grayB","\\textcolor{##f0f1f2}{#1}");m("\\grayC","\\textcolor{##e3e5e6}{#1}");m("\\grayD","\\textcolor{##d6d8da}{#1}");m("\\grayE","\\textcolor{##babec2}{#1}");m("\\grayF","\\textcolor{##888d93}{#1}");m("\\grayG","\\textcolor{##626569}{#1}");m("\\grayH","\\textcolor{##3b3e40}{#1}");m("\\grayI","\\textcolor{##21242c}{#1}");m("\\kaBlue","\\textcolor{##314453}{#1}");m("\\kaGreen","\\textcolor{##71B307}{#1}");var ga={"^":!0,_:!0,"\\limits":!0,"\\nolimits":!0},zt=class{constructor(e,t,a){this.settings=void 0,this.expansionCount=void 0,this.lexer=void 0,this.macros=void 0,this.stack=void 0,this.mode=void 0,this.settings=t,this.expansionCount=0,this.feed(e),this.macros=new Mt(fn,t.macros),this.mode=a,this.stack=[]}feed(e){this.lexer=new Pe(e,this.settings)}switchMode(e){this.mode=e}beginGroup(){this.macros.beginGroup()}endGroup(){this.macros.endGroup()}endGroups(){this.macros.endGroups()}future(){return this.stack.length===0&&this.pushToken(this.lexer.lex()),this.stack[this.stack.length-1]}popToken(){return this.future(),this.stack.pop()}pushToken(e){this.stack.push(e)}pushTokens(e){this.stack.push(...e)}scanArgument(e){var t,a,n;if(e){if(this.consumeSpaces(),this.future().text!=="[")return null;t=this.popToken(),{tokens:n,end:a}=this.consumeArg(["]"])}else({tokens:n,start:t,end:a}=this.consumeArg());return this.pushToken(new b0("EOF",a.loc)),this.pushTokens(n),t.range(a,"")}consumeSpaces(){for(;;){var e=this.future();if(e.text===" ")this.stack.pop();else break}}consumeArg(e){var t=[],a=e&&e.length>0;a||this.consumeSpaces();var n=this.future(),s,l=0,h=0;do{if(s=this.popToken(),t.push(s),s.text==="{")++l;else if(s.text==="}"){if(--l,l===-1)throw new z("Extra }",s)}else if(s.text==="EOF")throw new z("Unexpected end of input in a macro argument, expected '"+(e&&a?e[h]:"}")+"'",s);if(e&&a)if((l===0||l===1&&e[h]==="{")&&s.text===e[h]){if(++h,h===e.length){t.splice(-h,h);break}}else h=0}while(l!==0||a);return n.text==="{"&&t[t.length-1].text==="}"&&(t.pop(),t.shift()),t.reverse(),{tokens:t,start:n,end:s}}consumeArgs(e,t){if(t){if(t.length!==e+1)throw new z("The length of delimiters doesn't match the number of args!");for(var a=t[0],n=0;nthis.settings.maxExpand)throw new z("Too many expansions: infinite loop or need to increase maxExpand setting")}expandOnce(e){var t=this.popToken(),a=t.text,n=t.noexpand?null:this._getExpansion(a);if(n==null||e&&n.unexpandable){if(e&&n==null&&a[0]==="\\"&&!this.isDefined(a))throw new z("Undefined control sequence: "+a);return this.pushToken(t),!1}this.countExpansion(1);var s=n.tokens,l=this.consumeArgs(n.numArgs,n.delimiters);if(n.numArgs){s=s.slice();for(var h=s.length-1;h>=0;--h){var c=s[h];if(c.text==="#"){if(h===0)throw new z("Incomplete placeholder at end of macro body",c);if(c=s[--h],c.text==="#")s.splice(h+1,1);else if(/^[1-9]$/.test(c.text))s.splice(h,2,...l[+c.text-1]);else throw new z("Not a valid argument number",c)}}}return this.pushTokens(s),s.length}expandAfterFuture(){return this.expandOnce(),this.future()}expandNextToken(){for(;;)if(this.expandOnce()===!1){var e=this.stack.pop();return e.treatAsRelax&&(e.text="\\relax"),e}throw new Error}expandMacro(e){return this.macros.has(e)?this.expandTokens([new b0(e)]):void 0}expandTokens(e){var t=[],a=this.stack.length;for(this.pushTokens(e);this.stack.length>a;)if(this.expandOnce(!0)===!1){var n=this.stack.pop();n.treatAsRelax&&(n.noexpand=!1,n.treatAsRelax=!1),t.push(n)}return this.countExpansion(t.length),t}expandMacroAsText(e){var t=this.expandMacro(e);return t&&t.map(a=>a.text).join("")}_getExpansion(e){var t=this.macros.get(e);if(t==null)return t;if(e.length===1){var a=this.lexer.catcodes[e];if(a!=null&&a!==13)return}var n=typeof t=="function"?t(this):t;if(typeof n=="string"){var s=0;if(n.indexOf("#")!==-1)for(var l=n.replace(/##/g,"");l.indexOf("#"+(s+1))!==-1;)++s;for(var h=new Pe(n,this.settings),c=[],f=h.lex();f.text!=="EOF";)c.push(f),f=h.lex();c.reverse();var v={tokens:c,numArgs:s};return v}return n}isDefined(e){return this.macros.has(e)||P0.hasOwnProperty(e)||Y.math.hasOwnProperty(e)||Y.text.hasOwnProperty(e)||ga.hasOwnProperty(e)}isExpandable(e){var t=this.macros.get(e);return t!=null?typeof t=="string"||typeof t=="function"||!t.unexpandable:P0.hasOwnProperty(e)&&!P0[e].primitive}},kr=/^[₊₋₌₍₎₀₁₂₃₄₅₆₇₈₉ₐₑₕᵢⱼₖₗₘₙₒₚᵣₛₜᵤᵥₓᵦᵧᵨᵩᵪ]/,Ne=Object.freeze({"\u208A":"+","\u208B":"-","\u208C":"=","\u208D":"(","\u208E":")","\u2080":"0","\u2081":"1","\u2082":"2","\u2083":"3","\u2084":"4","\u2085":"5","\u2086":"6","\u2087":"7","\u2088":"8","\u2089":"9","\u2090":"a","\u2091":"e","\u2095":"h","\u1D62":"i","\u2C7C":"j","\u2096":"k","\u2097":"l","\u2098":"m","\u2099":"n","\u2092":"o","\u209A":"p","\u1D63":"r","\u209B":"s","\u209C":"t","\u1D64":"u","\u1D65":"v","\u2093":"x","\u1D66":"\u03B2","\u1D67":"\u03B3","\u1D68":"\u03C1","\u1D69":"\u03D5","\u1D6A":"\u03C7","\u207A":"+","\u207B":"-","\u207C":"=","\u207D":"(","\u207E":")","\u2070":"0","\xB9":"1","\xB2":"2","\xB3":"3","\u2074":"4","\u2075":"5","\u2076":"6","\u2077":"7","\u2078":"8","\u2079":"9","\u1D2C":"A","\u1D2E":"B","\u1D30":"D","\u1D31":"E","\u1D33":"G","\u1D34":"H","\u1D35":"I","\u1D36":"J","\u1D37":"K","\u1D38":"L","\u1D39":"M","\u1D3A":"N","\u1D3C":"O","\u1D3E":"P","\u1D3F":"R","\u1D40":"T","\u1D41":"U","\u2C7D":"V","\u1D42":"W","\u1D43":"a","\u1D47":"b","\u1D9C":"c","\u1D48":"d","\u1D49":"e","\u1DA0":"f","\u1D4D":"g",\u02B0:"h","\u2071":"i",\u02B2:"j","\u1D4F":"k",\u02E1:"l","\u1D50":"m",\u207F:"n","\u1D52":"o","\u1D56":"p",\u02B3:"r",\u02E2:"s","\u1D57":"t","\u1D58":"u","\u1D5B":"v",\u02B7:"w",\u02E3:"x",\u02B8:"y","\u1DBB":"z","\u1D5D":"\u03B2","\u1D5E":"\u03B3","\u1D5F":"\u03B4","\u1D60":"\u03D5","\u1D61":"\u03C7","\u1DBF":"\u03B8"}),dt={"\u0301":{text:"\\'",math:"\\acute"},"\u0300":{text:"\\`",math:"\\grave"},"\u0308":{text:'\\"',math:"\\ddot"},"\u0303":{text:"\\~",math:"\\tilde"},"\u0304":{text:"\\=",math:"\\bar"},"\u0306":{text:"\\u",math:"\\breve"},"\u030C":{text:"\\v",math:"\\check"},"\u0302":{text:"\\^",math:"\\hat"},"\u0307":{text:"\\.",math:"\\dot"},"\u030A":{text:"\\r",math:"\\mathring"},"\u030B":{text:"\\H"},"\u0327":{text:"\\c"}},Mr={\u00E1:"a\u0301",\u00E0:"a\u0300",\u00E4:"a\u0308",\u01DF:"a\u0308\u0304",\u00E3:"a\u0303",\u0101:"a\u0304",\u0103:"a\u0306",\u1EAF:"a\u0306\u0301",\u1EB1:"a\u0306\u0300",\u1EB5:"a\u0306\u0303",\u01CE:"a\u030C",\u00E2:"a\u0302",\u1EA5:"a\u0302\u0301",\u1EA7:"a\u0302\u0300",\u1EAB:"a\u0302\u0303",\u0227:"a\u0307",\u01E1:"a\u0307\u0304",\u00E5:"a\u030A",\u01FB:"a\u030A\u0301",\u1E03:"b\u0307",\u0107:"c\u0301",\u1E09:"c\u0327\u0301",\u010D:"c\u030C",\u0109:"c\u0302",\u010B:"c\u0307",\u00E7:"c\u0327",\u010F:"d\u030C",\u1E0B:"d\u0307",\u1E11:"d\u0327",\u00E9:"e\u0301",\u00E8:"e\u0300",\u00EB:"e\u0308",\u1EBD:"e\u0303",\u0113:"e\u0304",\u1E17:"e\u0304\u0301",\u1E15:"e\u0304\u0300",\u0115:"e\u0306",\u1E1D:"e\u0327\u0306",\u011B:"e\u030C",\u00EA:"e\u0302",\u1EBF:"e\u0302\u0301",\u1EC1:"e\u0302\u0300",\u1EC5:"e\u0302\u0303",\u0117:"e\u0307",\u0229:"e\u0327",\u1E1F:"f\u0307",\u01F5:"g\u0301",\u1E21:"g\u0304",\u011F:"g\u0306",\u01E7:"g\u030C",\u011D:"g\u0302",\u0121:"g\u0307",\u0123:"g\u0327",\u1E27:"h\u0308",\u021F:"h\u030C",\u0125:"h\u0302",\u1E23:"h\u0307",\u1E29:"h\u0327",\u00ED:"i\u0301",\u00EC:"i\u0300",\u00EF:"i\u0308",\u1E2F:"i\u0308\u0301",\u0129:"i\u0303",\u012B:"i\u0304",\u012D:"i\u0306",\u01D0:"i\u030C",\u00EE:"i\u0302",\u01F0:"j\u030C",\u0135:"j\u0302",\u1E31:"k\u0301",\u01E9:"k\u030C",\u0137:"k\u0327",\u013A:"l\u0301",\u013E:"l\u030C",\u013C:"l\u0327",\u1E3F:"m\u0301",\u1E41:"m\u0307",\u0144:"n\u0301",\u01F9:"n\u0300",\u00F1:"n\u0303",\u0148:"n\u030C",\u1E45:"n\u0307",\u0146:"n\u0327",\u00F3:"o\u0301",\u00F2:"o\u0300",\u00F6:"o\u0308",\u022B:"o\u0308\u0304",\u00F5:"o\u0303",\u1E4D:"o\u0303\u0301",\u1E4F:"o\u0303\u0308",\u022D:"o\u0303\u0304",\u014D:"o\u0304",\u1E53:"o\u0304\u0301",\u1E51:"o\u0304\u0300",\u014F:"o\u0306",\u01D2:"o\u030C",\u00F4:"o\u0302",\u1ED1:"o\u0302\u0301",\u1ED3:"o\u0302\u0300",\u1ED7:"o\u0302\u0303",\u022F:"o\u0307",\u0231:"o\u0307\u0304",\u0151:"o\u030B",\u1E55:"p\u0301",\u1E57:"p\u0307",\u0155:"r\u0301",\u0159:"r\u030C",\u1E59:"r\u0307",\u0157:"r\u0327",\u015B:"s\u0301",\u1E65:"s\u0301\u0307",\u0161:"s\u030C",\u1E67:"s\u030C\u0307",\u015D:"s\u0302",\u1E61:"s\u0307",\u015F:"s\u0327",\u1E97:"t\u0308",\u0165:"t\u030C",\u1E6B:"t\u0307",\u0163:"t\u0327",\u00FA:"u\u0301",\u00F9:"u\u0300",\u00FC:"u\u0308",\u01D8:"u\u0308\u0301",\u01DC:"u\u0308\u0300",\u01D6:"u\u0308\u0304",\u01DA:"u\u0308\u030C",\u0169:"u\u0303",\u1E79:"u\u0303\u0301",\u016B:"u\u0304",\u1E7B:"u\u0304\u0308",\u016D:"u\u0306",\u01D4:"u\u030C",\u00FB:"u\u0302",\u016F:"u\u030A",\u0171:"u\u030B",\u1E7D:"v\u0303",\u1E83:"w\u0301",\u1E81:"w\u0300",\u1E85:"w\u0308",\u0175:"w\u0302",\u1E87:"w\u0307",\u1E98:"w\u030A",\u1E8D:"x\u0308",\u1E8B:"x\u0307",\u00FD:"y\u0301",\u1EF3:"y\u0300",\u00FF:"y\u0308",\u1EF9:"y\u0303",\u0233:"y\u0304",\u0177:"y\u0302",\u1E8F:"y\u0307",\u1E99:"y\u030A",\u017A:"z\u0301",\u017E:"z\u030C",\u1E91:"z\u0302",\u017C:"z\u0307",\u00C1:"A\u0301",\u00C0:"A\u0300",\u00C4:"A\u0308",\u01DE:"A\u0308\u0304",\u00C3:"A\u0303",\u0100:"A\u0304",\u0102:"A\u0306",\u1EAE:"A\u0306\u0301",\u1EB0:"A\u0306\u0300",\u1EB4:"A\u0306\u0303",\u01CD:"A\u030C",\u00C2:"A\u0302",\u1EA4:"A\u0302\u0301",\u1EA6:"A\u0302\u0300",\u1EAA:"A\u0302\u0303",\u0226:"A\u0307",\u01E0:"A\u0307\u0304",\u00C5:"A\u030A",\u01FA:"A\u030A\u0301",\u1E02:"B\u0307",\u0106:"C\u0301",\u1E08:"C\u0327\u0301",\u010C:"C\u030C",\u0108:"C\u0302",\u010A:"C\u0307",\u00C7:"C\u0327",\u010E:"D\u030C",\u1E0A:"D\u0307",\u1E10:"D\u0327",\u00C9:"E\u0301",\u00C8:"E\u0300",\u00CB:"E\u0308",\u1EBC:"E\u0303",\u0112:"E\u0304",\u1E16:"E\u0304\u0301",\u1E14:"E\u0304\u0300",\u0114:"E\u0306",\u1E1C:"E\u0327\u0306",\u011A:"E\u030C",\u00CA:"E\u0302",\u1EBE:"E\u0302\u0301",\u1EC0:"E\u0302\u0300",\u1EC4:"E\u0302\u0303",\u0116:"E\u0307",\u0228:"E\u0327",\u1E1E:"F\u0307",\u01F4:"G\u0301",\u1E20:"G\u0304",\u011E:"G\u0306",\u01E6:"G\u030C",\u011C:"G\u0302",\u0120:"G\u0307",\u0122:"G\u0327",\u1E26:"H\u0308",\u021E:"H\u030C",\u0124:"H\u0302",\u1E22:"H\u0307",\u1E28:"H\u0327",\u00CD:"I\u0301",\u00CC:"I\u0300",\u00CF:"I\u0308",\u1E2E:"I\u0308\u0301",\u0128:"I\u0303",\u012A:"I\u0304",\u012C:"I\u0306",\u01CF:"I\u030C",\u00CE:"I\u0302",\u0130:"I\u0307",\u0134:"J\u0302",\u1E30:"K\u0301",\u01E8:"K\u030C",\u0136:"K\u0327",\u0139:"L\u0301",\u013D:"L\u030C",\u013B:"L\u0327",\u1E3E:"M\u0301",\u1E40:"M\u0307",\u0143:"N\u0301",\u01F8:"N\u0300",\u00D1:"N\u0303",\u0147:"N\u030C",\u1E44:"N\u0307",\u0145:"N\u0327",\u00D3:"O\u0301",\u00D2:"O\u0300",\u00D6:"O\u0308",\u022A:"O\u0308\u0304",\u00D5:"O\u0303",\u1E4C:"O\u0303\u0301",\u1E4E:"O\u0303\u0308",\u022C:"O\u0303\u0304",\u014C:"O\u0304",\u1E52:"O\u0304\u0301",\u1E50:"O\u0304\u0300",\u014E:"O\u0306",\u01D1:"O\u030C",\u00D4:"O\u0302",\u1ED0:"O\u0302\u0301",\u1ED2:"O\u0302\u0300",\u1ED6:"O\u0302\u0303",\u022E:"O\u0307",\u0230:"O\u0307\u0304",\u0150:"O\u030B",\u1E54:"P\u0301",\u1E56:"P\u0307",\u0154:"R\u0301",\u0158:"R\u030C",\u1E58:"R\u0307",\u0156:"R\u0327",\u015A:"S\u0301",\u1E64:"S\u0301\u0307",\u0160:"S\u030C",\u1E66:"S\u030C\u0307",\u015C:"S\u0302",\u1E60:"S\u0307",\u015E:"S\u0327",\u0164:"T\u030C",\u1E6A:"T\u0307",\u0162:"T\u0327",\u00DA:"U\u0301",\u00D9:"U\u0300",\u00DC:"U\u0308",\u01D7:"U\u0308\u0301",\u01DB:"U\u0308\u0300",\u01D5:"U\u0308\u0304",\u01D9:"U\u0308\u030C",\u0168:"U\u0303",\u1E78:"U\u0303\u0301",\u016A:"U\u0304",\u1E7A:"U\u0304\u0308",\u016C:"U\u0306",\u01D3:"U\u030C",\u00DB:"U\u0302",\u016E:"U\u030A",\u0170:"U\u030B",\u1E7C:"V\u0303",\u1E82:"W\u0301",\u1E80:"W\u0300",\u1E84:"W\u0308",\u0174:"W\u0302",\u1E86:"W\u0307",\u1E8C:"X\u0308",\u1E8A:"X\u0307",\u00DD:"Y\u0301",\u1EF2:"Y\u0300",\u0178:"Y\u0308",\u1EF8:"Y\u0303",\u0232:"Y\u0304",\u0176:"Y\u0302",\u1E8E:"Y\u0307",\u0179:"Z\u0301",\u017D:"Z\u030C",\u1E90:"Z\u0302",\u017B:"Z\u0307",\u03AC:"\u03B1\u0301",\u1F70:"\u03B1\u0300",\u1FB1:"\u03B1\u0304",\u1FB0:"\u03B1\u0306",\u03AD:"\u03B5\u0301",\u1F72:"\u03B5\u0300",\u03AE:"\u03B7\u0301",\u1F74:"\u03B7\u0300",\u03AF:"\u03B9\u0301",\u1F76:"\u03B9\u0300",\u03CA:"\u03B9\u0308",\u0390:"\u03B9\u0308\u0301",\u1FD2:"\u03B9\u0308\u0300",\u1FD1:"\u03B9\u0304",\u1FD0:"\u03B9\u0306",\u03CC:"\u03BF\u0301",\u1F78:"\u03BF\u0300",\u03CD:"\u03C5\u0301",\u1F7A:"\u03C5\u0300",\u03CB:"\u03C5\u0308",\u03B0:"\u03C5\u0308\u0301",\u1FE2:"\u03C5\u0308\u0300",\u1FE1:"\u03C5\u0304",\u1FE0:"\u03C5\u0306",\u03CE:"\u03C9\u0301",\u1F7C:"\u03C9\u0300",\u038E:"\u03A5\u0301",\u1FEA:"\u03A5\u0300",\u03AB:"\u03A5\u0308",\u1FE9:"\u03A5\u0304",\u1FE8:"\u03A5\u0306",\u038F:"\u03A9\u0301",\u1FFA:"\u03A9\u0300"},Ge=class r{constructor(e,t){this.mode=void 0,this.gullet=void 0,this.settings=void 0,this.leftrightDepth=void 0,this.nextToken=void 0,this.mode="math",this.gullet=new zt(e,t,this.mode),this.settings=t,this.leftrightDepth=0}expect(e,t){if(t===void 0&&(t=!0),this.fetch().text!==e)throw new z("Expected '"+e+"', got '"+this.fetch().text+"'",this.fetch());t&&this.consume()}consume(){this.nextToken=null}fetch(){return this.nextToken==null&&(this.nextToken=this.gullet.expandNextToken()),this.nextToken}switchMode(e){this.mode=e,this.gullet.switchMode(e)}parse(){this.settings.globalGroup||this.gullet.beginGroup(),this.settings.colorIsTextColor&&this.gullet.macros.set("\\color","\\textcolor");try{var e=this.parseExpression(!1);return this.expect("EOF"),this.settings.globalGroup||this.gullet.endGroup(),e}finally{this.gullet.endGroups()}}subparse(e){var t=this.nextToken;this.consume(),this.gullet.pushToken(new b0("}")),this.gullet.pushTokens(e);var a=this.parseExpression(!1);return this.expect("}"),this.nextToken=t,a}parseExpression(e,t){for(var a=[];;){this.mode==="math"&&this.consumeSpaces();var n=this.fetch();if(r.endOfExpression.indexOf(n.text)!==-1||t&&n.text===t||e&&P0[n.text]&&P0[n.text].infix)break;var s=this.parseAtom(t);if(s){if(s.type==="internal")continue}else break;a.push(s)}return this.mode==="text"&&this.formLigatures(a),this.handleInfixNodes(a)}handleInfixNodes(e){for(var t=-1,a,n=0;n=0&&this.settings.reportNonstrict("unicodeTextInMathMode",'Latin-1/Unicode text character "'+t[0]+'" used in math mode',e);var h=Y[this.mode][t].group,c=d0.range(e),f;if(i1.hasOwnProperty(h)){var v=h;f={type:"atom",mode:this.mode,family:v,loc:c,text:t}}else f={type:h,mode:this.mode,loc:c,text:t};l=f}else if(t.charCodeAt(0)>=128)this.settings.strict&&(Ar(t.charCodeAt(0))?this.mode==="math"&&this.settings.reportNonstrict("unicodeTextInMathMode",'Unicode text character "'+t[0]+'" used in math mode',e):this.settings.reportNonstrict("unknownSymbol",'Unrecognized Unicode character "'+t[0]+'"'+(" ("+t.charCodeAt(0)+")"),e)),l={type:"textord",mode:"text",loc:d0.range(e),text:t};else return null;if(this.consume(),s)for(var b=0;b=0;n--)r[n].loc.start>a&&(t+=" ",a=r[n].loc.start),t+=r[n].text,a+=r[n].text.length;var s=W.go(S.go(t,e));return s},S={go:function(r,e){if(!r)return[];e===void 0&&(e="ce");var t="0",a={};a.parenthesisLevel=0,r=r.replace(/\n/g," "),r=r.replace(/[\u2212\u2013\u2014\u2010]/g,"-"),r=r.replace(/[\u2026]/g,"...");for(var n,s=10,l=[];;){n!==r?(s=10,n=r):s--;var h=S.stateMachines[e],c=h.transitions[t]||h.transitions["*"];e:for(var f=0;f0){if(b.revisit||(r=v.remainder),!b.toContinue)break e}else return l}}if(s<=0)throw["MhchemBugU","mhchem bug U. Please report."]}},concatArray:function(r,e){if(e)if(Array.isArray(e))for(var t=0;t":/^[=<>]/,"#":/^[#\u2261]/,"+":/^\+/,"-$":/^-(?=[\s_},;\]/]|$|\([a-z]+\))/,"-9":/^-(?=[0-9])/,"- orbital overlap":/^-(?=(?:[spd]|sp)(?:$|[\s,;\)\]\}]))/,"-":/^-/,"pm-operator":/^(?:\\pm|\$\\pm\$|\+-|\+\/-)/,operator:/^(?:\+|(?:[\-=<>]|<<|>>|\\approx|\$\\approx\$)(?=\s|$|-?[0-9]))/,arrowUpDown:/^(?:v|\(v\)|\^|\(\^\))(?=$|[\s,;\)\]\}])/,"\\bond{(...)}":function(r){return S.patterns.findObserveGroups(r,"\\bond{","","","}")},"->":/^(?:<->|<-->|->|<-|<=>>|<<=>|<=>|[\u2192\u27F6\u21CC])/,CMT:/^[CMT](?=\[)/,"[(...)]":function(r){return S.patterns.findObserveGroups(r,"[","","","]")},"1st-level escape":/^(&|\\\\|\\hline)\s*/,"\\,":/^(?:\\[,\ ;:])/,"\\x{}{}":function(r){return S.patterns.findObserveGroups(r,"",/^\\[a-zA-Z]+\{/,"}","","","{","}","",!0)},"\\x{}":function(r){return S.patterns.findObserveGroups(r,"",/^\\[a-zA-Z]+\{/,"}","")},"\\ca":/^\\ca(?:\s+|(?![a-zA-Z]))/,"\\x":/^(?:\\[a-zA-Z]+\s*|\\[_&{}%])/,orbital:/^(?:[0-9]{1,2}[spdfgh]|[0-9]{0,2}sp)(?=$|[^a-zA-Z])/,others:/^[\/~|]/,"\\frac{(...)}":function(r){return S.patterns.findObserveGroups(r,"\\frac{","","","}","{","","","}")},"\\overset{(...)}":function(r){return S.patterns.findObserveGroups(r,"\\overset{","","","}","{","","","}")},"\\underset{(...)}":function(r){return S.patterns.findObserveGroups(r,"\\underset{","","","}","{","","","}")},"\\underbrace{(...)}":function(r){return S.patterns.findObserveGroups(r,"\\underbrace{","","","}_","{","","","}")},"\\color{(...)}0":function(r){return S.patterns.findObserveGroups(r,"\\color{","","","}")},"\\color{(...)}{(...)}1":function(r){return S.patterns.findObserveGroups(r,"\\color{","","","}","{","","","}")},"\\color(...){(...)}2":function(r){return S.patterns.findObserveGroups(r,"\\color","\\","",/^(?=\{)/,"{","","","}")},"\\ce{(...)}":function(r){return S.patterns.findObserveGroups(r,"\\ce{","","","}")},oxidation$:/^(?:[+-][IVX]+|\\pm\s*0|\$\\pm\$\s*0)$/,"d-oxidation$":/^(?:[+-]?\s?[IVX]+|\\pm\s*0|\$\\pm\$\s*0)$/,"roman numeral":/^[IVX]+/,"1/2$":/^[+\-]?(?:[0-9]+|\$[a-z]\$|[a-z])\/[0-9]+(?:\$[a-z]\$|[a-z])?$/,amount:function(r){var e;if(e=r.match(/^(?:(?:(?:\([+\-]?[0-9]+\/[0-9]+\)|[+\-]?(?:[0-9]+|\$[a-z]\$|[a-z])\/[0-9]+|[+\-]?[0-9]+[.,][0-9]+|[+\-]?\.[0-9]+|[+\-]?[0-9]+)(?:[a-z](?=\s*[A-Z]))?)|[+\-]?[a-z](?=\s*[A-Z])|\+(?!\s))/),e)return{match_:e[0],remainder:r.substr(e[0].length)};var t=S.patterns.findObserveGroups(r,"","$","$","");return t&&(e=t.match_.match(/^\$(?:\(?[+\-]?(?:[0-9]*[a-z]?[+\-])?[0-9]*[a-z](?:[+\-][0-9]*[a-z]?)?\)?|\+|-)\$$/),e)?{match_:e[0],remainder:r.substr(e[0].length)}:null},amount2:function(r){return this.amount(r)},"(KV letters),":/^(?:[A-Z][a-z]{0,2}|i)(?=,)/,formula$:function(r){if(r.match(/^\([a-z]+\)$/))return null;var e=r.match(/^(?:[a-z]|(?:[0-9\ \+\-\,\.\(\)]+[a-z])+[0-9\ \+\-\,\.\(\)]*|(?:[a-z][0-9\ \+\-\,\.\(\)]+)+[a-z]?)$/);return e?{match_:e[0],remainder:r.substr(e[0].length)}:null},uprightEntities:/^(?:pH|pOH|pC|pK|iPr|iBu)(?=$|[^a-zA-Z])/,"/":/^\s*(\/)\s*/,"//":/^\s*(\/\/)\s*/,"*":/^\s*[*.]\s*/},findObserveGroups:function(r,e,t,a,n,s,l,h,c,f){var v=function(D,N){if(typeof N=="string")return D.indexOf(N)!==0?null:N;var $=D.match(N);return $?$[0]:null},b=function(D,N,$){for(var H=0;N0,null},x=v(r,e);if(x===null||(r=r.substr(x.length),x=v(r,t),x===null))return null;var w=b(r,x.length,a||n);if(w===null)return null;var A=r.substring(0,a?w.endMatchEnd:w.endMatchBegin);if(s||l){var q=this.findObserveGroups(r.substr(w.endMatchEnd),s,l,h,c);if(q===null)return null;var _=[A,q.match_];return{match_:f?_.join(""):_,remainder:q.remainder}}else return{match_:A,remainder:r.substr(w.endMatchEnd)}},match_:function(r,e){var t=S.patterns.patterns[r];if(t===void 0)throw["MhchemBugP","mhchem bug P. Please report. ("+r+")"];if(typeof t=="function")return S.patterns.patterns[r](e);var a=e.match(t);if(a){var n;return a[2]?n=[a[1],a[2]]:a[1]?n=a[1]:n=a[0],{match_:n,remainder:e.substr(a[0].length)}}return null}},actions:{"a=":function(r,e){r.a=(r.a||"")+e},"b=":function(r,e){r.b=(r.b||"")+e},"p=":function(r,e){r.p=(r.p||"")+e},"o=":function(r,e){r.o=(r.o||"")+e},"q=":function(r,e){r.q=(r.q||"")+e},"d=":function(r,e){r.d=(r.d||"")+e},"rm=":function(r,e){r.rm=(r.rm||"")+e},"text=":function(r,e){r.text_=(r.text_||"")+e},insert:function(r,e,t){return{type_:t}},"insert+p1":function(r,e,t){return{type_:t,p1:e}},"insert+p1+p2":function(r,e,t){return{type_:t,p1:e[0],p2:e[1]}},copy:function(r,e){return e},rm:function(r,e){return{type_:"rm",p1:e||""}},text:function(r,e){return S.go(e,"text")},"{text}":function(r,e){var t=["{"];return S.concatArray(t,S.go(e,"text")),t.push("}"),t},"tex-math":function(r,e){return S.go(e,"tex-math")},"tex-math tight":function(r,e){return S.go(e,"tex-math tight")},bond:function(r,e,t){return{type_:"bond",kind_:t||e}},"color0-output":function(r,e){return{type_:"color0",color:e[0]}},ce:function(r,e){return S.go(e)},"1/2":function(r,e){var t=[];e.match(/^[+\-]/)&&(t.push(e.substr(0,1)),e=e.substr(1));var a=e.match(/^([0-9]+|\$[a-z]\$|[a-z])\/([0-9]+)(\$[a-z]\$|[a-z])?$/);return a[1]=a[1].replace(/\$/g,""),t.push({type_:"frac",p1:a[1],p2:a[2]}),a[3]&&(a[3]=a[3].replace(/\$/g,""),t.push({type_:"tex-math",p1:a[3]})),t},"9,9":function(r,e){return S.go(e,"9,9")}},createTransitions:function(r){var e,t,a,n,s={};for(e in r)for(t in r[e])for(a=t.split("|"),r[e][t].stateArray=a,n=0;n":{"0|1|2|3":{action_:"r=",nextState:"r"},"a|as":{action_:["output","r="],nextState:"r"},"*":{action_:["output","r="],nextState:"r"}},"+":{o:{action_:"d= kv",nextState:"d"},"d|D":{action_:"d=",nextState:"d"},q:{action_:"d=",nextState:"qd"},"qd|qD":{action_:"d=",nextState:"qd"},dq:{action_:["output","d="],nextState:"d"},3:{action_:["sb=false","output","operator"],nextState:"0"}},amount:{"0|2":{action_:"a=",nextState:"a"}},"pm-operator":{"0|1|2|a|as":{action_:["sb=false","output",{type_:"operator",option:"\\pm"}],nextState:"0"}},operator:{"0|1|2|a|as":{action_:["sb=false","output","operator"],nextState:"0"}},"-$":{"o|q":{action_:["charge or bond","output"],nextState:"qd"},d:{action_:"d=",nextState:"d"},D:{action_:["output",{type_:"bond",option:"-"}],nextState:"3"},q:{action_:"d=",nextState:"qd"},qd:{action_:"d=",nextState:"qd"},"qD|dq":{action_:["output",{type_:"bond",option:"-"}],nextState:"3"}},"-9":{"3|o":{action_:["output",{type_:"insert",option:"hyphen"}],nextState:"3"}},"- orbital overlap":{o:{action_:["output",{type_:"insert",option:"hyphen"}],nextState:"2"},d:{action_:["output",{type_:"insert",option:"hyphen"}],nextState:"2"}},"-":{"0|1|2":{action_:[{type_:"output",option:1},"beginsWithBond=true",{type_:"bond",option:"-"}],nextState:"3"},3:{action_:{type_:"bond",option:"-"}},a:{action_:["output",{type_:"insert",option:"hyphen"}],nextState:"2"},as:{action_:[{type_:"output",option:2},{type_:"bond",option:"-"}],nextState:"3"},b:{action_:"b="},o:{action_:{type_:"- after o/d",option:!1},nextState:"2"},q:{action_:{type_:"- after o/d",option:!1},nextState:"2"},"d|qd|dq":{action_:{type_:"- after o/d",option:!0},nextState:"2"},"D|qD|p":{action_:["output",{type_:"bond",option:"-"}],nextState:"3"}},amount2:{"1|3":{action_:"a=",nextState:"a"}},letters:{"0|1|2|3|a|as|b|p|bp|o":{action_:"o=",nextState:"o"},"q|dq":{action_:["output","o="],nextState:"o"},"d|D|qd|qD":{action_:"o after d",nextState:"o"}},digits:{o:{action_:"q=",nextState:"q"},"d|D":{action_:"q=",nextState:"dq"},q:{action_:["output","o="],nextState:"o"},a:{action_:"o=",nextState:"o"}},"space A":{"b|p|bp":{}},space:{a:{nextState:"as"},0:{action_:"sb=false"},"1|2":{action_:"sb=true"},"r|rt|rd|rdt|rdq":{action_:"output",nextState:"0"},"*":{action_:["output","sb=true"],nextState:"1"}},"1st-level escape":{"1|2":{action_:["output",{type_:"insert+p1",option:"1st-level escape"}]},"*":{action_:["output",{type_:"insert+p1",option:"1st-level escape"}],nextState:"0"}},"[(...)]":{"r|rt":{action_:"rd=",nextState:"rd"},"rd|rdt":{action_:"rq=",nextState:"rdq"}},"...":{"o|d|D|dq|qd|qD":{action_:["output",{type_:"bond",option:"..."}],nextState:"3"},"*":{action_:[{type_:"output",option:1},{type_:"insert",option:"ellipsis"}],nextState:"1"}},". |* ":{"*":{action_:["output",{type_:"insert",option:"addition compound"}],nextState:"1"}},"state of aggregation $":{"*":{action_:["output","state of aggregation"],nextState:"1"}},"{[(":{"a|as|o":{action_:["o=","output","parenthesisLevel++"],nextState:"2"},"0|1|2|3":{action_:["o=","output","parenthesisLevel++"],nextState:"2"},"*":{action_:["output","o=","output","parenthesisLevel++"],nextState:"2"}},")]}":{"0|1|2|3|b|p|bp|o":{action_:["o=","parenthesisLevel--"],nextState:"o"},"a|as|d|D|q|qd|qD|dq":{action_:["output","o=","parenthesisLevel--"],nextState:"o"}},", ":{"*":{action_:["output","comma"],nextState:"0"}},"^_":{"*":{}},"^{(...)}|^($...$)":{"0|1|2|as":{action_:"b=",nextState:"b"},p:{action_:"b=",nextState:"bp"},"3|o":{action_:"d= kv",nextState:"D"},q:{action_:"d=",nextState:"qD"},"d|D|qd|qD|dq":{action_:["output","d="],nextState:"D"}},"^a|^\\x{}{}|^\\x{}|^\\x|'":{"0|1|2|as":{action_:"b=",nextState:"b"},p:{action_:"b=",nextState:"bp"},"3|o":{action_:"d= kv",nextState:"d"},q:{action_:"d=",nextState:"qd"},"d|qd|D|qD":{action_:"d="},dq:{action_:["output","d="],nextState:"d"}},"_{(state of aggregation)}$":{"d|D|q|qd|qD|dq":{action_:["output","q="],nextState:"q"}},"_{(...)}|_($...$)|_9|_\\x{}{}|_\\x{}|_\\x":{"0|1|2|as":{action_:"p=",nextState:"p"},b:{action_:"p=",nextState:"bp"},"3|o":{action_:"q=",nextState:"q"},"d|D":{action_:"q=",nextState:"dq"},"q|qd|qD|dq":{action_:["output","q="],nextState:"q"}},"=<>":{"0|1|2|3|a|as|o|q|d|D|qd|qD|dq":{action_:[{type_:"output",option:2},"bond"],nextState:"3"}},"#":{"0|1|2|3|a|as|o":{action_:[{type_:"output",option:2},{type_:"bond",option:"#"}],nextState:"3"}},"{}":{"*":{action_:{type_:"output",option:1},nextState:"1"}},"{...}":{"0|1|2|3|a|as|b|p|bp":{action_:"o=",nextState:"o"},"o|d|D|q|qd|qD|dq":{action_:["output","o="],nextState:"o"}},"$...$":{a:{action_:"a="},"0|1|2|3|as|b|p|bp|o":{action_:"o=",nextState:"o"},"as|o":{action_:"o="},"q|d|D|qd|qD|dq":{action_:["output","o="],nextState:"o"}},"\\bond{(...)}":{"*":{action_:[{type_:"output",option:2},"bond"],nextState:"3"}},"\\frac{(...)}":{"*":{action_:[{type_:"output",option:1},"frac-output"],nextState:"3"}},"\\overset{(...)}":{"*":{action_:[{type_:"output",option:2},"overset-output"],nextState:"3"}},"\\underset{(...)}":{"*":{action_:[{type_:"output",option:2},"underset-output"],nextState:"3"}},"\\underbrace{(...)}":{"*":{action_:[{type_:"output",option:2},"underbrace-output"],nextState:"3"}},"\\color{(...)}{(...)}1|\\color(...){(...)}2":{"*":{action_:[{type_:"output",option:2},"color-output"],nextState:"3"}},"\\color{(...)}0":{"*":{action_:[{type_:"output",option:2},"color0-output"]}},"\\ce{(...)}":{"*":{action_:[{type_:"output",option:2},"ce"],nextState:"3"}},"\\,":{"*":{action_:[{type_:"output",option:1},"copy"],nextState:"1"}},"\\x{}{}|\\x{}|\\x":{"0|1|2|3|a|as|b|p|bp|o|c0":{action_:["o=","output"],nextState:"3"},"*":{action_:["output","o=","output"],nextState:"3"}},others:{"*":{action_:[{type_:"output",option:1},"copy"],nextState:"3"}},else2:{a:{action_:"a to o",nextState:"o",revisit:!0},as:{action_:["output","sb=true"],nextState:"1",revisit:!0},"r|rt|rd|rdt|rdq":{action_:["output"],nextState:"0",revisit:!0},"*":{action_:["output","copy"],nextState:"3"}}}),actions:{"o after d":function(r,e){var t;if((r.d||"").match(/^[0-9]+$/)){var a=r.d;r.d=void 0,t=this.output(r),r.b=a}else t=this.output(r);return S.actions["o="](r,e),t},"d= kv":function(r,e){r.d=e,r.dType="kv"},"charge or bond":function(r,e){if(r.beginsWithBond){var t=[];return S.concatArray(t,this.output(r)),S.concatArray(t,S.actions.bond(r,e,"-")),t}else r.d=e},"- after o/d":function(r,e,t){var a=S.patterns.match_("orbital",r.o||""),n=S.patterns.match_("one lowercase greek letter $",r.o||""),s=S.patterns.match_("one lowercase latin letter $",r.o||""),l=S.patterns.match_("$one lowercase latin letter$ $",r.o||""),h=e==="-"&&(a&&a.remainder===""||n||s||l);h&&!r.a&&!r.b&&!r.p&&!r.d&&!r.q&&!a&&s&&(r.o="$"+r.o+"$");var c=[];return h?(S.concatArray(c,this.output(r)),c.push({type_:"hyphen"})):(a=S.patterns.match_("digits",r.d||""),t&&a&&a.remainder===""?(S.concatArray(c,S.actions["d="](r,e)),S.concatArray(c,this.output(r))):(S.concatArray(c,this.output(r)),S.concatArray(c,S.actions.bond(r,e,"-")))),c},"a to o":function(r){r.o=r.a,r.a=void 0},"sb=true":function(r){r.sb=!0},"sb=false":function(r){r.sb=!1},"beginsWithBond=true":function(r){r.beginsWithBond=!0},"beginsWithBond=false":function(r){r.beginsWithBond=!1},"parenthesisLevel++":function(r){r.parenthesisLevel++},"parenthesisLevel--":function(r){r.parenthesisLevel--},"state of aggregation":function(r,e){return{type_:"state of aggregation",p1:S.go(e,"o")}},comma:function(r,e){var t=e.replace(/\s*$/,""),a=t!==e;return a&&r.parenthesisLevel===0?{type_:"comma enumeration L",p1:t}:{type_:"comma enumeration M",p1:t}},output:function(r,e,t){var a;if(!r.r)a=[],!r.a&&!r.b&&!r.p&&!r.o&&!r.q&&!r.d&&!t||(r.sb&&a.push({type_:"entitySkip"}),!r.o&&!r.q&&!r.d&&!r.b&&!r.p&&t!==2?(r.o=r.a,r.a=void 0):!r.o&&!r.q&&!r.d&&(r.b||r.p)?(r.o=r.a,r.d=r.b,r.q=r.p,r.a=r.b=r.p=void 0):r.o&&r.dType==="kv"&&S.patterns.match_("d-oxidation$",r.d||"")?r.dType="oxidation":r.o&&r.dType==="kv"&&!r.q&&(r.dType=void 0),a.push({type_:"chemfive",a:S.go(r.a,"a"),b:S.go(r.b,"bd"),p:S.go(r.p,"pq"),o:S.go(r.o,"o"),q:S.go(r.q,"pq"),d:S.go(r.d,r.dType==="oxidation"?"oxidation":"bd"),dType:r.dType}));else{var n;r.rdt==="M"?n=S.go(r.rd,"tex-math"):r.rdt==="T"?n=[{type_:"text",p1:r.rd||""}]:n=S.go(r.rd);var s;r.rqt==="M"?s=S.go(r.rq,"tex-math"):r.rqt==="T"?s=[{type_:"text",p1:r.rq||""}]:s=S.go(r.rq),a={type_:"arrow",r:r.r,rd:n,rq:s}}for(var l in r)l!=="parenthesisLevel"&&l!=="beginsWithBond"&&delete r[l];return a},"oxidation-output":function(r,e){var t=["{"];return S.concatArray(t,S.go(e,"oxidation")),t.push("}"),t},"frac-output":function(r,e){return{type_:"frac-ce",p1:S.go(e[0]),p2:S.go(e[1])}},"overset-output":function(r,e){return{type_:"overset",p1:S.go(e[0]),p2:S.go(e[1])}},"underset-output":function(r,e){return{type_:"underset",p1:S.go(e[0]),p2:S.go(e[1])}},"underbrace-output":function(r,e){return{type_:"underbrace",p1:S.go(e[0]),p2:S.go(e[1])}},"color-output":function(r,e){return{type_:"color",color1:e[0],color2:S.go(e[1])}},"r=":function(r,e){r.r=e},"rdt=":function(r,e){r.rdt=e},"rd=":function(r,e){r.rd=e},"rqt=":function(r,e){r.rqt=e},"rq=":function(r,e){r.rq=e},operator:function(r,e,t){return{type_:"operator",kind_:t||e}}}},a:{transitions:S.createTransitions({empty:{"*":{}},"1/2$":{0:{action_:"1/2"}},else:{0:{nextState:"1",revisit:!0}},"$(...)$":{"*":{action_:"tex-math tight",nextState:"1"}},",":{"*":{action_:{type_:"insert",option:"commaDecimal"}}},else2:{"*":{action_:"copy"}}}),actions:{}},o:{transitions:S.createTransitions({empty:{"*":{}},"1/2$":{0:{action_:"1/2"}},else:{0:{nextState:"1",revisit:!0}},letters:{"*":{action_:"rm"}},"\\ca":{"*":{action_:{type_:"insert",option:"circa"}}},"\\x{}{}|\\x{}|\\x":{"*":{action_:"copy"}},"${(...)}$|$(...)$":{"*":{action_:"tex-math"}},"{(...)}":{"*":{action_:"{text}"}},else2:{"*":{action_:"copy"}}}),actions:{}},text:{transitions:S.createTransitions({empty:{"*":{action_:"output"}},"{...}":{"*":{action_:"text="}},"${(...)}$|$(...)$":{"*":{action_:"tex-math"}},"\\greek":{"*":{action_:["output","rm"]}},"\\,|\\x{}{}|\\x{}|\\x":{"*":{action_:["output","copy"]}},else:{"*":{action_:"text="}}}),actions:{output:function(r){if(r.text_){var e={type_:"text",p1:r.text_};for(var t in r)delete r[t];return e}}}},pq:{transitions:S.createTransitions({empty:{"*":{}},"state of aggregation $":{"*":{action_:"state of aggregation"}},i$:{0:{nextState:"!f",revisit:!0}},"(KV letters),":{0:{action_:"rm",nextState:"0"}},formula$:{0:{nextState:"f",revisit:!0}},"1/2$":{0:{action_:"1/2"}},else:{0:{nextState:"!f",revisit:!0}},"${(...)}$|$(...)$":{"*":{action_:"tex-math"}},"{(...)}":{"*":{action_:"text"}},"a-z":{f:{action_:"tex-math"}},letters:{"*":{action_:"rm"}},"-9.,9":{"*":{action_:"9,9"}},",":{"*":{action_:{type_:"insert+p1",option:"comma enumeration S"}}},"\\color{(...)}{(...)}1|\\color(...){(...)}2":{"*":{action_:"color-output"}},"\\color{(...)}0":{"*":{action_:"color0-output"}},"\\ce{(...)}":{"*":{action_:"ce"}},"\\,|\\x{}{}|\\x{}|\\x":{"*":{action_:"copy"}},else2:{"*":{action_:"copy"}}}),actions:{"state of aggregation":function(r,e){return{type_:"state of aggregation subscript",p1:S.go(e,"o")}},"color-output":function(r,e){return{type_:"color",color1:e[0],color2:S.go(e[1],"pq")}}}},bd:{transitions:S.createTransitions({empty:{"*":{}},x$:{0:{nextState:"!f",revisit:!0}},formula$:{0:{nextState:"f",revisit:!0}},else:{0:{nextState:"!f",revisit:!0}},"-9.,9 no missing 0":{"*":{action_:"9,9"}},".":{"*":{action_:{type_:"insert",option:"electron dot"}}},"a-z":{f:{action_:"tex-math"}},x:{"*":{action_:{type_:"insert",option:"KV x"}}},letters:{"*":{action_:"rm"}},"'":{"*":{action_:{type_:"insert",option:"prime"}}},"${(...)}$|$(...)$":{"*":{action_:"tex-math"}},"{(...)}":{"*":{action_:"text"}},"\\color{(...)}{(...)}1|\\color(...){(...)}2":{"*":{action_:"color-output"}},"\\color{(...)}0":{"*":{action_:"color0-output"}},"\\ce{(...)}":{"*":{action_:"ce"}},"\\,|\\x{}{}|\\x{}|\\x":{"*":{action_:"copy"}},else2:{"*":{action_:"copy"}}}),actions:{"color-output":function(r,e){return{type_:"color",color1:e[0],color2:S.go(e[1],"bd")}}}},oxidation:{transitions:S.createTransitions({empty:{"*":{}},"roman numeral":{"*":{action_:"roman-numeral"}},"${(...)}$|$(...)$":{"*":{action_:"tex-math"}},else:{"*":{action_:"copy"}}}),actions:{"roman-numeral":function(r,e){return{type_:"roman numeral",p1:e||""}}}},"tex-math":{transitions:S.createTransitions({empty:{"*":{action_:"output"}},"\\ce{(...)}":{"*":{action_:["output","ce"]}},"{...}|\\,|\\x{}{}|\\x{}|\\x":{"*":{action_:"o="}},else:{"*":{action_:"o="}}}),actions:{output:function(r){if(r.o){var e={type_:"tex-math",p1:r.o};for(var t in r)delete r[t];return e}}}},"tex-math tight":{transitions:S.createTransitions({empty:{"*":{action_:"output"}},"\\ce{(...)}":{"*":{action_:["output","ce"]}},"{...}|\\,|\\x{}{}|\\x{}|\\x":{"*":{action_:"o="}},"-|+":{"*":{action_:"tight operator"}},else:{"*":{action_:"o="}}}),actions:{"tight operator":function(r,e){r.o=(r.o||"")+"{"+e+"}"},output:function(r){if(r.o){var e={type_:"tex-math",p1:r.o};for(var t in r)delete r[t];return e}}}},"9,9":{transitions:S.createTransitions({empty:{"*":{}},",":{"*":{action_:"comma"}},else:{"*":{action_:"copy"}}}),actions:{comma:function(){return{type_:"commaDecimal"}}}},pu:{transitions:S.createTransitions({empty:{"*":{action_:"output"}},space$:{"*":{action_:["output","space"]}},"{[(|)]}":{"0|a":{action_:"copy"}},"(-)(9)^(-9)":{0:{action_:"number^",nextState:"a"}},"(-)(9.,9)(e)(99)":{0:{action_:"enumber",nextState:"a"}},space:{"0|a":{}},"pm-operator":{"0|a":{action_:{type_:"operator",option:"\\pm"},nextState:"0"}},operator:{"0|a":{action_:"copy",nextState:"0"}},"//":{d:{action_:"o=",nextState:"/"}},"/":{d:{action_:"o=",nextState:"/"}},"{...}|else":{"0|d":{action_:"d=",nextState:"d"},a:{action_:["space","d="],nextState:"d"},"/|q":{action_:"q=",nextState:"q"}}}),actions:{enumber:function(r,e){var t=[];return e[0]==="+-"||e[0]==="+/-"?t.push("\\pm "):e[0]&&t.push(e[0]),e[1]&&(S.concatArray(t,S.go(e[1],"pu-9,9")),e[2]&&(e[2].match(/[,.]/)?S.concatArray(t,S.go(e[2],"pu-9,9")):t.push(e[2])),e[3]=e[4]||e[3],e[3]&&(e[3]=e[3].trim(),e[3]==="e"||e[3].substr(0,1)==="*"?t.push({type_:"cdot"}):t.push({type_:"times"}))),e[3]&&t.push("10^{"+e[5]+"}"),t},"number^":function(r,e){var t=[];return e[0]==="+-"||e[0]==="+/-"?t.push("\\pm "):e[0]&&t.push(e[0]),S.concatArray(t,S.go(e[1],"pu-9,9")),t.push("^{"+e[2]+"}"),t},operator:function(r,e,t){return{type_:"operator",kind_:t||e}},space:function(){return{type_:"pu-space-1"}},output:function(r){var e,t=S.patterns.match_("{(...)}",r.d||"");t&&t.remainder===""&&(r.d=t.match_);var a=S.patterns.match_("{(...)}",r.q||"");if(a&&a.remainder===""&&(r.q=a.match_),r.d&&(r.d=r.d.replace(/\u00B0C|\^oC|\^{o}C/g,"{}^{\\circ}C"),r.d=r.d.replace(/\u00B0F|\^oF|\^{o}F/g,"{}^{\\circ}F")),r.q){r.q=r.q.replace(/\u00B0C|\^oC|\^{o}C/g,"{}^{\\circ}C"),r.q=r.q.replace(/\u00B0F|\^oF|\^{o}F/g,"{}^{\\circ}F");var n={d:S.go(r.d,"pu"),q:S.go(r.q,"pu")};r.o==="//"?e={type_:"pu-frac",p1:n.d,p2:n.q}:(e=n.d,n.d.length>1||n.q.length>1?e.push({type_:" / "}):e.push({type_:"/"}),S.concatArray(e,n.q))}else e=S.go(r.d,"pu-2");for(var s in r)delete r[s];return e}}},"pu-2":{transitions:S.createTransitions({empty:{"*":{action_:"output"}},"*":{"*":{action_:["output","cdot"],nextState:"0"}},"\\x":{"*":{action_:"rm="}},space:{"*":{action_:["output","space"],nextState:"0"}},"^{(...)}|^(-1)":{1:{action_:"^(-1)"}},"-9.,9":{0:{action_:"rm=",nextState:"0"},1:{action_:"^(-1)",nextState:"0"}},"{...}|else":{"*":{action_:"rm=",nextState:"1"}}}),actions:{cdot:function(){return{type_:"tight cdot"}},"^(-1)":function(r,e){r.rm+="^{"+e+"}"},space:function(){return{type_:"pu-space-2"}},output:function(r){var e=[];if(r.rm){var t=S.patterns.match_("{(...)}",r.rm||"");t&&t.remainder===""?e=S.go(t.match_,"pu"):e={type_:"rm",p1:r.rm}}for(var a in r)delete r[a];return e}}},"pu-9,9":{transitions:S.createTransitions({empty:{0:{action_:"output-0"},o:{action_:"output-o"}},",":{0:{action_:["output-0","comma"],nextState:"o"}},".":{0:{action_:["output-0","copy"],nextState:"o"}},else:{"*":{action_:"text="}}}),actions:{comma:function(){return{type_:"commaDecimal"}},"output-0":function(r){var e=[];if(r.text_=r.text_||"",r.text_.length>4){var t=r.text_.length%3;t===0&&(t=3);for(var a=r.text_.length-3;a>0;a-=3)e.push(r.text_.substr(a,3)),e.push({type_:"1000 separator"});e.push(r.text_.substr(0,t)),e.reverse()}else e.push(r.text_);for(var n in r)delete r[n];return e},"output-o":function(r){var e=[];if(r.text_=r.text_||"",r.text_.length>4){for(var t=r.text_.length-3,a=0;a":return"rightarrow";case"\u2192":return"rightarrow";case"\u27F6":return"rightarrow";case"<-":return"leftarrow";case"<->":return"leftrightarrow";case"<-->":return"rightleftarrows";case"<=>":return"rightleftharpoons";case"\u21CC":return"rightleftharpoons";case"<=>>":return"rightequilibrium";case"<<=>":return"leftequilibrium";default:throw["MhchemBugT","mhchem bug T. Please report."]}},_getBond:function(r){switch(r){case"-":return"{-}";case"1":return"{-}";case"=":return"{=}";case"2":return"{=}";case"#":return"{\\equiv}";case"3":return"{\\equiv}";case"~":return"{\\tripledash}";case"~-":return"{\\mathrlap{\\raisebox{-.1em}{$-$}}\\raisebox{.1em}{$\\tripledash$}}";case"~=":return"{\\mathrlap{\\raisebox{-.2em}{$-$}}\\mathrlap{\\raisebox{.2em}{$\\tripledash$}}-}";case"~--":return"{\\mathrlap{\\raisebox{-.2em}{$-$}}\\mathrlap{\\raisebox{.2em}{$\\tripledash$}}-}";case"-~-":return"{\\mathrlap{\\raisebox{-.2em}{$-$}}\\mathrlap{\\raisebox{.2em}{$-$}}\\tripledash}";case"...":return"{{\\cdot}{\\cdot}{\\cdot}}";case"....":return"{{\\cdot}{\\cdot}{\\cdot}{\\cdot}}";case"->":return"{\\rightarrow}";case"<-":return"{\\leftarrow}";case"<":return"{<}";case">":return"{>}";default:throw["MhchemBugT","mhchem bug T. Please report."]}},_getOperator:function(r){switch(r){case"+":return" {}+{} ";case"-":return" {}-{} ";case"=":return" {}={} ";case"<":return" {}<{} ";case">":return" {}>{} ";case"<<":return" {}\\ll{} ";case">>":return" {}\\gg{} ";case"\\pm":return" {}\\pm{} ";case"\\approx":return" {}\\approx{} ";case"$\\approx$":return" {}\\approx{} ";case"v":return" \\downarrow{} ";case"(v)":return" \\downarrow{} ";case"^":return" \\uparrow{} ";case"(^)":return" \\uparrow{} ";default:throw["MhchemBugT","mhchem bug T. Please report."]}}};var wn=function(r){let e=r.data,t=e.expression,a=e.options,n=r.header,s=oe.renderToString(t,a);et({header:n,data:{output:s}})};Wt(wn);})(); +`,this.tokenRegex.lastIndex);return s===-1?(this.tokenRegex.lastIndex=e.length,this.settings.reportNonstrict("commentAtEnd","% comment has no terminating newline; LaTeX would fail because of commenting the end of math mode (e.g. $)")):this.tokenRegex.lastIndex=s+1,this.lex()}return new b0(n,new d0(this,t,this.tokenRegex.lastIndex))}},Mt=class{constructor(e,t){e===void 0&&(e={}),t===void 0&&(t={}),this.current=void 0,this.builtins=void 0,this.undefStack=void 0,this.current=t,this.builtins=e,this.undefStack=[]}beginGroup(){this.undefStack.push({})}endGroup(){if(this.undefStack.length===0)throw new z("Unbalanced namespace destruction: attempt to pop global namespace; please report this as a bug");var e=this.undefStack.pop();for(var t in e)e.hasOwnProperty(t)&&(e[t]==null?delete this.current[t]:this.current[t]=e[t])}endGroups(){for(;this.undefStack.length>0;)this.endGroup()}has(e){return this.current.hasOwnProperty(e)||this.builtins.hasOwnProperty(e)}get(e){return this.current.hasOwnProperty(e)?this.current[e]:this.builtins[e]}set(e,t,a){if(a===void 0&&(a=!1),a){for(var n=0;n0&&(this.undefStack[this.undefStack.length-1][e]=t)}else{var s=this.undefStack[this.undefStack.length-1];s&&!s.hasOwnProperty(e)&&(s[e]=this.current[e])}t==null?delete this.current[e]:this.current[e]=t}},fn=aa;m("\\noexpand",function(r){var e=r.popToken();return r.isExpandable(e.text)&&(e.noexpand=!0,e.treatAsRelax=!0),{tokens:[e],numArgs:0}});m("\\expandafter",function(r){var e=r.popToken();return r.expandOnce(!0),{tokens:[e],numArgs:0}});m("\\@firstoftwo",function(r){var e=r.consumeArgs(2);return{tokens:e[0],numArgs:0}});m("\\@secondoftwo",function(r){var e=r.consumeArgs(2);return{tokens:e[1],numArgs:0}});m("\\@ifnextchar",function(r){var e=r.consumeArgs(3);r.consumeSpaces();var t=r.future();return e[0].length===1&&e[0][0].text===t.text?{tokens:e[1],numArgs:0}:{tokens:e[2],numArgs:0}});m("\\@ifstar","\\@ifnextchar *{\\@firstoftwo{#1}}");m("\\TextOrMath",function(r){var e=r.consumeArgs(2);return r.mode==="text"?{tokens:e[0],numArgs:0}:{tokens:e[1],numArgs:0}});var wr={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,a:10,A:10,b:11,B:11,c:12,C:12,d:13,D:13,e:14,E:14,f:15,F:15};m("\\char",function(r){var e=r.popToken(),t,a="";if(e.text==="'")t=8,e=r.popToken();else if(e.text==='"')t=16,e=r.popToken();else if(e.text==="`")if(e=r.popToken(),e.text[0]==="\\")a=e.text.charCodeAt(1);else{if(e.text==="EOF")throw new z("\\char` missing argument");a=e.text.charCodeAt(0)}else t=10;if(t){if(a=wr[e.text],a==null||a>=t)throw new z("Invalid base-"+t+" digit "+e.text);for(var n;(n=wr[r.future().text])!=null&&n{var n=r.consumeArg().tokens;if(n.length!==1)throw new z("\\newcommand's first argument must be a macro name");var s=n[0].text,l=r.isDefined(s);if(l&&!e)throw new z("\\newcommand{"+s+"} attempting to redefine "+(s+"; use \\renewcommand"));if(!l&&!t)throw new z("\\renewcommand{"+s+"} when command "+s+" does not yet exist; use \\newcommand");var h=0;if(n=r.consumeArg().tokens,n.length===1&&n[0].text==="["){for(var c="",f=r.expandNextToken();f.text!=="]"&&f.text!=="EOF";)c+=f.text,f=r.expandNextToken();if(!c.match(/^\s*[0-9]+\s*$/))throw new z("Invalid number of arguments: "+c);h=parseInt(c),n=r.consumeArg().tokens}return l&&a||r.macros.set(s,{tokens:n,numArgs:h}),""};m("\\newcommand",r=>Ft(r,!1,!0,!1));m("\\renewcommand",r=>Ft(r,!0,!1,!1));m("\\providecommand",r=>Ft(r,!0,!0,!0));m("\\message",r=>{var e=r.consumeArgs(1)[0];return console.log(e.reverse().map(t=>t.text).join("")),""});m("\\errmessage",r=>{var e=r.consumeArgs(1)[0];return console.error(e.reverse().map(t=>t.text).join("")),""});m("\\show",r=>{var e=r.popToken(),t=e.text;return console.log(e,r.macros.get(t),P0[t],Y.math[t],Y.text[t]),""});m("\\bgroup","{");m("\\egroup","}");m("~","\\nobreakspace");m("\\lq","`");m("\\rq","'");m("\\aa","\\r a");m("\\AA","\\r A");m("\\textcopyright","\\html@mathml{\\textcircled{c}}{\\char`\xA9}");m("\\copyright","\\TextOrMath{\\textcopyright}{\\text{\\textcopyright}}");m("\\textregistered","\\html@mathml{\\textcircled{\\scriptsize R}}{\\char`\xAE}");m("\u212C","\\mathscr{B}");m("\u2130","\\mathscr{E}");m("\u2131","\\mathscr{F}");m("\u210B","\\mathscr{H}");m("\u2110","\\mathscr{I}");m("\u2112","\\mathscr{L}");m("\u2133","\\mathscr{M}");m("\u211B","\\mathscr{R}");m("\u212D","\\mathfrak{C}");m("\u210C","\\mathfrak{H}");m("\u2128","\\mathfrak{Z}");m("\\Bbbk","\\Bbb{k}");m("\xB7","\\cdotp");m("\\llap","\\mathllap{\\textrm{#1}}");m("\\rlap","\\mathrlap{\\textrm{#1}}");m("\\clap","\\mathclap{\\textrm{#1}}");m("\\mathstrut","\\vphantom{(}");m("\\underbar","\\underline{\\text{#1}}");m("\\not",'\\html@mathml{\\mathrel{\\mathrlap\\@not}}{\\char"338}');m("\\neq","\\html@mathml{\\mathrel{\\not=}}{\\mathrel{\\char`\u2260}}");m("\\ne","\\neq");m("\u2260","\\neq");m("\\notin","\\html@mathml{\\mathrel{{\\in}\\mathllap{/\\mskip1mu}}}{\\mathrel{\\char`\u2209}}");m("\u2209","\\notin");m("\u2258","\\html@mathml{\\mathrel{=\\kern{-1em}\\raisebox{0.4em}{$\\scriptsize\\frown$}}}{\\mathrel{\\char`\u2258}}");m("\u2259","\\html@mathml{\\stackrel{\\tiny\\wedge}{=}}{\\mathrel{\\char`\u2258}}");m("\u225A","\\html@mathml{\\stackrel{\\tiny\\vee}{=}}{\\mathrel{\\char`\u225A}}");m("\u225B","\\html@mathml{\\stackrel{\\scriptsize\\star}{=}}{\\mathrel{\\char`\u225B}}");m("\u225D","\\html@mathml{\\stackrel{\\tiny\\mathrm{def}}{=}}{\\mathrel{\\char`\u225D}}");m("\u225E","\\html@mathml{\\stackrel{\\tiny\\mathrm{m}}{=}}{\\mathrel{\\char`\u225E}}");m("\u225F","\\html@mathml{\\stackrel{\\tiny?}{=}}{\\mathrel{\\char`\u225F}}");m("\u27C2","\\perp");m("\u203C","\\mathclose{!\\mkern-0.8mu!}");m("\u220C","\\notni");m("\u231C","\\ulcorner");m("\u231D","\\urcorner");m("\u231E","\\llcorner");m("\u231F","\\lrcorner");m("\xA9","\\copyright");m("\xAE","\\textregistered");m("\uFE0F","\\textregistered");m("\\ulcorner",'\\html@mathml{\\@ulcorner}{\\mathop{\\char"231c}}');m("\\urcorner",'\\html@mathml{\\@urcorner}{\\mathop{\\char"231d}}');m("\\llcorner",'\\html@mathml{\\@llcorner}{\\mathop{\\char"231e}}');m("\\lrcorner",'\\html@mathml{\\@lrcorner}{\\mathop{\\char"231f}}');m("\\vdots","{\\varvdots\\rule{0pt}{15pt}}");m("\u22EE","\\vdots");m("\\varGamma","\\mathit{\\Gamma}");m("\\varDelta","\\mathit{\\Delta}");m("\\varTheta","\\mathit{\\Theta}");m("\\varLambda","\\mathit{\\Lambda}");m("\\varXi","\\mathit{\\Xi}");m("\\varPi","\\mathit{\\Pi}");m("\\varSigma","\\mathit{\\Sigma}");m("\\varUpsilon","\\mathit{\\Upsilon}");m("\\varPhi","\\mathit{\\Phi}");m("\\varPsi","\\mathit{\\Psi}");m("\\varOmega","\\mathit{\\Omega}");m("\\substack","\\begin{subarray}{c}#1\\end{subarray}");m("\\colon","\\nobreak\\mskip2mu\\mathpunct{}\\mathchoice{\\mkern-3mu}{\\mkern-3mu}{}{}{:}\\mskip6mu\\relax");m("\\boxed","\\fbox{$\\displaystyle{#1}$}");m("\\iff","\\DOTSB\\;\\Longleftrightarrow\\;");m("\\implies","\\DOTSB\\;\\Longrightarrow\\;");m("\\impliedby","\\DOTSB\\;\\Longleftarrow\\;");m("\\dddot","{\\overset{\\raisebox{-0.1ex}{\\normalsize ...}}{#1}}");m("\\ddddot","{\\overset{\\raisebox{-0.1ex}{\\normalsize ....}}{#1}}");var Sr={",":"\\dotsc","\\not":"\\dotsb","+":"\\dotsb","=":"\\dotsb","<":"\\dotsb",">":"\\dotsb","-":"\\dotsb","*":"\\dotsb",":":"\\dotsb","\\DOTSB":"\\dotsb","\\coprod":"\\dotsb","\\bigvee":"\\dotsb","\\bigwedge":"\\dotsb","\\biguplus":"\\dotsb","\\bigcap":"\\dotsb","\\bigcup":"\\dotsb","\\prod":"\\dotsb","\\sum":"\\dotsb","\\bigotimes":"\\dotsb","\\bigoplus":"\\dotsb","\\bigodot":"\\dotsb","\\bigsqcup":"\\dotsb","\\And":"\\dotsb","\\longrightarrow":"\\dotsb","\\Longrightarrow":"\\dotsb","\\longleftarrow":"\\dotsb","\\Longleftarrow":"\\dotsb","\\longleftrightarrow":"\\dotsb","\\Longleftrightarrow":"\\dotsb","\\mapsto":"\\dotsb","\\longmapsto":"\\dotsb","\\hookrightarrow":"\\dotsb","\\doteq":"\\dotsb","\\mathbin":"\\dotsb","\\mathrel":"\\dotsb","\\relbar":"\\dotsb","\\Relbar":"\\dotsb","\\xrightarrow":"\\dotsb","\\xleftarrow":"\\dotsb","\\DOTSI":"\\dotsi","\\int":"\\dotsi","\\oint":"\\dotsi","\\iint":"\\dotsi","\\iiint":"\\dotsi","\\iiiint":"\\dotsi","\\idotsint":"\\dotsi","\\DOTSX":"\\dotsx"};m("\\dots",function(r){var e="\\dotso",t=r.expandAfterFuture().text;return t in Sr?e=Sr[t]:(t.slice(0,4)==="\\not"||t in Y.math&&O.contains(["bin","rel"],Y.math[t].group))&&(e="\\dotsb"),e});var Ht={")":!0,"]":!0,"\\rbrack":!0,"\\}":!0,"\\rbrace":!0,"\\rangle":!0,"\\rceil":!0,"\\rfloor":!0,"\\rgroup":!0,"\\rmoustache":!0,"\\right":!0,"\\bigr":!0,"\\biggr":!0,"\\Bigr":!0,"\\Biggr":!0,$:!0,";":!0,".":!0,",":!0};m("\\dotso",function(r){var e=r.future().text;return e in Ht?"\\ldots\\,":"\\ldots"});m("\\dotsc",function(r){var e=r.future().text;return e in Ht&&e!==","?"\\ldots\\,":"\\ldots"});m("\\cdots",function(r){var e=r.future().text;return e in Ht?"\\@cdots\\,":"\\@cdots"});m("\\dotsb","\\cdots");m("\\dotsm","\\cdots");m("\\dotsi","\\!\\cdots");m("\\dotsx","\\ldots\\,");m("\\DOTSI","\\relax");m("\\DOTSB","\\relax");m("\\DOTSX","\\relax");m("\\tmspace","\\TextOrMath{\\kern#1#3}{\\mskip#1#2}\\relax");m("\\,","\\tmspace+{3mu}{.1667em}");m("\\thinspace","\\,");m("\\>","\\mskip{4mu}");m("\\:","\\tmspace+{4mu}{.2222em}");m("\\medspace","\\:");m("\\;","\\tmspace+{5mu}{.2777em}");m("\\thickspace","\\;");m("\\!","\\tmspace-{3mu}{.1667em}");m("\\negthinspace","\\!");m("\\negmedspace","\\tmspace-{4mu}{.2222em}");m("\\negthickspace","\\tmspace-{5mu}{.277em}");m("\\enspace","\\kern.5em ");m("\\enskip","\\hskip.5em\\relax");m("\\quad","\\hskip1em\\relax");m("\\qquad","\\hskip2em\\relax");m("\\tag","\\@ifstar\\tag@literal\\tag@paren");m("\\tag@paren","\\tag@literal{({#1})}");m("\\tag@literal",r=>{if(r.macros.get("\\df@tag"))throw new z("Multiple \\tag");return"\\gdef\\df@tag{\\text{#1}}"});m("\\bmod","\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}\\mathbin{\\rm mod}\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}");m("\\pod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern8mu}{\\mkern8mu}{\\mkern8mu}(#1)");m("\\pmod","\\pod{{\\rm mod}\\mkern6mu#1}");m("\\mod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern12mu}{\\mkern12mu}{\\mkern12mu}{\\rm mod}\\,\\,#1");m("\\newline","\\\\\\relax");m("\\TeX","\\textrm{\\html@mathml{T\\kern-.1667em\\raisebox{-.5ex}{E}\\kern-.125emX}{TeX}}");var fa=T(z0["Main-Regular"][84][1]-.7*z0["Main-Regular"][65][1]);m("\\LaTeX","\\textrm{\\html@mathml{"+("L\\kern-.36em\\raisebox{"+fa+"}{\\scriptstyle A}")+"\\kern-.15em\\TeX}{LaTeX}}");m("\\KaTeX","\\textrm{\\html@mathml{"+("K\\kern-.17em\\raisebox{"+fa+"}{\\scriptstyle A}")+"\\kern-.15em\\TeX}{KaTeX}}");m("\\hspace","\\@ifstar\\@hspacer\\@hspace");m("\\@hspace","\\hskip #1\\relax");m("\\@hspacer","\\rule{0pt}{0pt}\\hskip #1\\relax");m("\\ordinarycolon",":");m("\\vcentcolon","\\mathrel{\\mathop\\ordinarycolon}");m("\\dblcolon",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-.9mu}\\vcentcolon}}{\\mathop{\\char"2237}}');m("\\coloneqq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2254}}');m("\\Coloneqq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2237\\char"3d}}');m("\\coloneq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"3a\\char"2212}}');m("\\Coloneq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"2237\\char"2212}}');m("\\eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2255}}');m("\\Eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"3d\\char"2237}}');m("\\eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2239}}');m("\\Eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"2212\\char"2237}}');m("\\colonapprox",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"3a\\char"2248}}');m("\\Colonapprox",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"2237\\char"2248}}');m("\\colonsim",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"3a\\char"223c}}');m("\\Colonsim",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"2237\\char"223c}}');m("\u2237","\\dblcolon");m("\u2239","\\eqcolon");m("\u2254","\\coloneqq");m("\u2255","\\eqqcolon");m("\u2A74","\\Coloneqq");m("\\ratio","\\vcentcolon");m("\\coloncolon","\\dblcolon");m("\\colonequals","\\coloneqq");m("\\coloncolonequals","\\Coloneqq");m("\\equalscolon","\\eqqcolon");m("\\equalscoloncolon","\\Eqqcolon");m("\\colonminus","\\coloneq");m("\\coloncolonminus","\\Coloneq");m("\\minuscolon","\\eqcolon");m("\\minuscoloncolon","\\Eqcolon");m("\\coloncolonapprox","\\Colonapprox");m("\\coloncolonsim","\\Colonsim");m("\\simcolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\vcentcolon}");m("\\simcoloncolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\dblcolon}");m("\\approxcolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\vcentcolon}");m("\\approxcoloncolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\dblcolon}");m("\\notni","\\html@mathml{\\not\\ni}{\\mathrel{\\char`\u220C}}");m("\\limsup","\\DOTSB\\operatorname*{lim\\,sup}");m("\\liminf","\\DOTSB\\operatorname*{lim\\,inf}");m("\\injlim","\\DOTSB\\operatorname*{inj\\,lim}");m("\\projlim","\\DOTSB\\operatorname*{proj\\,lim}");m("\\varlimsup","\\DOTSB\\operatorname*{\\overline{lim}}");m("\\varliminf","\\DOTSB\\operatorname*{\\underline{lim}}");m("\\varinjlim","\\DOTSB\\operatorname*{\\underrightarrow{lim}}");m("\\varprojlim","\\DOTSB\\operatorname*{\\underleftarrow{lim}}");m("\\gvertneqq","\\html@mathml{\\@gvertneqq}{\u2269}");m("\\lvertneqq","\\html@mathml{\\@lvertneqq}{\u2268}");m("\\ngeqq","\\html@mathml{\\@ngeqq}{\u2271}");m("\\ngeqslant","\\html@mathml{\\@ngeqslant}{\u2271}");m("\\nleqq","\\html@mathml{\\@nleqq}{\u2270}");m("\\nleqslant","\\html@mathml{\\@nleqslant}{\u2270}");m("\\nshortmid","\\html@mathml{\\@nshortmid}{\u2224}");m("\\nshortparallel","\\html@mathml{\\@nshortparallel}{\u2226}");m("\\nsubseteqq","\\html@mathml{\\@nsubseteqq}{\u2288}");m("\\nsupseteqq","\\html@mathml{\\@nsupseteqq}{\u2289}");m("\\varsubsetneq","\\html@mathml{\\@varsubsetneq}{\u228A}");m("\\varsubsetneqq","\\html@mathml{\\@varsubsetneqq}{\u2ACB}");m("\\varsupsetneq","\\html@mathml{\\@varsupsetneq}{\u228B}");m("\\varsupsetneqq","\\html@mathml{\\@varsupsetneqq}{\u2ACC}");m("\\imath","\\html@mathml{\\@imath}{\u0131}");m("\\jmath","\\html@mathml{\\@jmath}{\u0237}");m("\\llbracket","\\html@mathml{\\mathopen{[\\mkern-3.2mu[}}{\\mathopen{\\char`\u27E6}}");m("\\rrbracket","\\html@mathml{\\mathclose{]\\mkern-3.2mu]}}{\\mathclose{\\char`\u27E7}}");m("\u27E6","\\llbracket");m("\u27E7","\\rrbracket");m("\\lBrace","\\html@mathml{\\mathopen{\\{\\mkern-3.2mu[}}{\\mathopen{\\char`\u2983}}");m("\\rBrace","\\html@mathml{\\mathclose{]\\mkern-3.2mu\\}}}{\\mathclose{\\char`\u2984}}");m("\u2983","\\lBrace");m("\u2984","\\rBrace");m("\\minuso","\\mathbin{\\html@mathml{{\\mathrlap{\\mathchoice{\\kern{0.145em}}{\\kern{0.145em}}{\\kern{0.1015em}}{\\kern{0.0725em}}\\circ}{-}}}{\\char`\u29B5}}");m("\u29B5","\\minuso");m("\\darr","\\downarrow");m("\\dArr","\\Downarrow");m("\\Darr","\\Downarrow");m("\\lang","\\langle");m("\\rang","\\rangle");m("\\uarr","\\uparrow");m("\\uArr","\\Uparrow");m("\\Uarr","\\Uparrow");m("\\N","\\mathbb{N}");m("\\R","\\mathbb{R}");m("\\Z","\\mathbb{Z}");m("\\alef","\\aleph");m("\\alefsym","\\aleph");m("\\Alpha","\\mathrm{A}");m("\\Beta","\\mathrm{B}");m("\\bull","\\bullet");m("\\Chi","\\mathrm{X}");m("\\clubs","\\clubsuit");m("\\cnums","\\mathbb{C}");m("\\Complex","\\mathbb{C}");m("\\Dagger","\\ddagger");m("\\diamonds","\\diamondsuit");m("\\empty","\\emptyset");m("\\Epsilon","\\mathrm{E}");m("\\Eta","\\mathrm{H}");m("\\exist","\\exists");m("\\harr","\\leftrightarrow");m("\\hArr","\\Leftrightarrow");m("\\Harr","\\Leftrightarrow");m("\\hearts","\\heartsuit");m("\\image","\\Im");m("\\infin","\\infty");m("\\Iota","\\mathrm{I}");m("\\isin","\\in");m("\\Kappa","\\mathrm{K}");m("\\larr","\\leftarrow");m("\\lArr","\\Leftarrow");m("\\Larr","\\Leftarrow");m("\\lrarr","\\leftrightarrow");m("\\lrArr","\\Leftrightarrow");m("\\Lrarr","\\Leftrightarrow");m("\\Mu","\\mathrm{M}");m("\\natnums","\\mathbb{N}");m("\\Nu","\\mathrm{N}");m("\\Omicron","\\mathrm{O}");m("\\plusmn","\\pm");m("\\rarr","\\rightarrow");m("\\rArr","\\Rightarrow");m("\\Rarr","\\Rightarrow");m("\\real","\\Re");m("\\reals","\\mathbb{R}");m("\\Reals","\\mathbb{R}");m("\\Rho","\\mathrm{P}");m("\\sdot","\\cdot");m("\\sect","\\S");m("\\spades","\\spadesuit");m("\\sub","\\subset");m("\\sube","\\subseteq");m("\\supe","\\supseteq");m("\\Tau","\\mathrm{T}");m("\\thetasym","\\vartheta");m("\\weierp","\\wp");m("\\Zeta","\\mathrm{Z}");m("\\argmin","\\DOTSB\\operatorname*{arg\\,min}");m("\\argmax","\\DOTSB\\operatorname*{arg\\,max}");m("\\plim","\\DOTSB\\mathop{\\operatorname{plim}}\\limits");m("\\bra","\\mathinner{\\langle{#1}|}");m("\\ket","\\mathinner{|{#1}\\rangle}");m("\\braket","\\mathinner{\\langle{#1}\\rangle}");m("\\Bra","\\left\\langle#1\\right|");m("\\Ket","\\left|#1\\right\\rangle");var va=r=>e=>{var t=e.consumeArg().tokens,a=e.consumeArg().tokens,n=e.consumeArg().tokens,s=e.consumeArg().tokens,l=e.macros.get("|"),h=e.macros.get("\\|");e.macros.beginGroup();var c=b=>x=>{r&&(x.macros.set("|",l),n.length&&x.macros.set("\\|",h));var w=b;if(!b&&n.length){var A=x.future();A.text==="|"&&(x.popToken(),w=!0)}return{tokens:w?n:a,numArgs:0}};e.macros.set("|",c(!1)),n.length&&e.macros.set("\\|",c(!0));var f=e.consumeArg().tokens,v=e.expandTokens([...s,...f,...t]);return e.macros.endGroup(),{tokens:v.reverse(),numArgs:0}};m("\\bra@ket",va(!1));m("\\bra@set",va(!0));m("\\Braket","\\bra@ket{\\left\\langle}{\\,\\middle\\vert\\,}{\\,\\middle\\vert\\,}{\\right\\rangle}");m("\\Set","\\bra@set{\\left\\{\\:}{\\;\\middle\\vert\\;}{\\;\\middle\\Vert\\;}{\\:\\right\\}}");m("\\set","\\bra@set{\\{\\,}{\\mid}{}{\\,\\}}");m("\\angln","{\\angl n}");m("\\blue","\\textcolor{##6495ed}{#1}");m("\\orange","\\textcolor{##ffa500}{#1}");m("\\pink","\\textcolor{##ff00af}{#1}");m("\\red","\\textcolor{##df0030}{#1}");m("\\green","\\textcolor{##28ae7b}{#1}");m("\\gray","\\textcolor{gray}{#1}");m("\\purple","\\textcolor{##9d38bd}{#1}");m("\\blueA","\\textcolor{##ccfaff}{#1}");m("\\blueB","\\textcolor{##80f6ff}{#1}");m("\\blueC","\\textcolor{##63d9ea}{#1}");m("\\blueD","\\textcolor{##11accd}{#1}");m("\\blueE","\\textcolor{##0c7f99}{#1}");m("\\tealA","\\textcolor{##94fff5}{#1}");m("\\tealB","\\textcolor{##26edd5}{#1}");m("\\tealC","\\textcolor{##01d1c1}{#1}");m("\\tealD","\\textcolor{##01a995}{#1}");m("\\tealE","\\textcolor{##208170}{#1}");m("\\greenA","\\textcolor{##b6ffb0}{#1}");m("\\greenB","\\textcolor{##8af281}{#1}");m("\\greenC","\\textcolor{##74cf70}{#1}");m("\\greenD","\\textcolor{##1fab54}{#1}");m("\\greenE","\\textcolor{##0d923f}{#1}");m("\\goldA","\\textcolor{##ffd0a9}{#1}");m("\\goldB","\\textcolor{##ffbb71}{#1}");m("\\goldC","\\textcolor{##ff9c39}{#1}");m("\\goldD","\\textcolor{##e07d10}{#1}");m("\\goldE","\\textcolor{##a75a05}{#1}");m("\\redA","\\textcolor{##fca9a9}{#1}");m("\\redB","\\textcolor{##ff8482}{#1}");m("\\redC","\\textcolor{##f9685d}{#1}");m("\\redD","\\textcolor{##e84d39}{#1}");m("\\redE","\\textcolor{##bc2612}{#1}");m("\\maroonA","\\textcolor{##ffbde0}{#1}");m("\\maroonB","\\textcolor{##ff92c6}{#1}");m("\\maroonC","\\textcolor{##ed5fa6}{#1}");m("\\maroonD","\\textcolor{##ca337c}{#1}");m("\\maroonE","\\textcolor{##9e034e}{#1}");m("\\purpleA","\\textcolor{##ddd7ff}{#1}");m("\\purpleB","\\textcolor{##c6b9fc}{#1}");m("\\purpleC","\\textcolor{##aa87ff}{#1}");m("\\purpleD","\\textcolor{##7854ab}{#1}");m("\\purpleE","\\textcolor{##543b78}{#1}");m("\\mintA","\\textcolor{##f5f9e8}{#1}");m("\\mintB","\\textcolor{##edf2df}{#1}");m("\\mintC","\\textcolor{##e0e5cc}{#1}");m("\\grayA","\\textcolor{##f6f7f7}{#1}");m("\\grayB","\\textcolor{##f0f1f2}{#1}");m("\\grayC","\\textcolor{##e3e5e6}{#1}");m("\\grayD","\\textcolor{##d6d8da}{#1}");m("\\grayE","\\textcolor{##babec2}{#1}");m("\\grayF","\\textcolor{##888d93}{#1}");m("\\grayG","\\textcolor{##626569}{#1}");m("\\grayH","\\textcolor{##3b3e40}{#1}");m("\\grayI","\\textcolor{##21242c}{#1}");m("\\kaBlue","\\textcolor{##314453}{#1}");m("\\kaGreen","\\textcolor{##71B307}{#1}");var ga={"^":!0,_:!0,"\\limits":!0,"\\nolimits":!0},zt=class{constructor(e,t,a){this.settings=void 0,this.expansionCount=void 0,this.lexer=void 0,this.macros=void 0,this.stack=void 0,this.mode=void 0,this.settings=t,this.expansionCount=0,this.feed(e),this.macros=new Mt(fn,t.macros),this.mode=a,this.stack=[]}feed(e){this.lexer=new Pe(e,this.settings)}switchMode(e){this.mode=e}beginGroup(){this.macros.beginGroup()}endGroup(){this.macros.endGroup()}endGroups(){this.macros.endGroups()}future(){return this.stack.length===0&&this.pushToken(this.lexer.lex()),this.stack[this.stack.length-1]}popToken(){return this.future(),this.stack.pop()}pushToken(e){this.stack.push(e)}pushTokens(e){this.stack.push(...e)}scanArgument(e){var t,a,n;if(e){if(this.consumeSpaces(),this.future().text!=="[")return null;t=this.popToken(),{tokens:n,end:a}=this.consumeArg(["]"])}else({tokens:n,start:t,end:a}=this.consumeArg());return this.pushToken(new b0("EOF",a.loc)),this.pushTokens(n),t.range(a,"")}consumeSpaces(){for(;;){var e=this.future();if(e.text===" ")this.stack.pop();else break}}consumeArg(e){var t=[],a=e&&e.length>0;a||this.consumeSpaces();var n=this.future(),s,l=0,h=0;do{if(s=this.popToken(),t.push(s),s.text==="{")++l;else if(s.text==="}"){if(--l,l===-1)throw new z("Extra }",s)}else if(s.text==="EOF")throw new z("Unexpected end of input in a macro argument, expected '"+(e&&a?e[h]:"}")+"'",s);if(e&&a)if((l===0||l===1&&e[h]==="{")&&s.text===e[h]){if(++h,h===e.length){t.splice(-h,h);break}}else h=0}while(l!==0||a);return n.text==="{"&&t[t.length-1].text==="}"&&(t.pop(),t.shift()),t.reverse(),{tokens:t,start:n,end:s}}consumeArgs(e,t){if(t){if(t.length!==e+1)throw new z("The length of delimiters doesn't match the number of args!");for(var a=t[0],n=0;nthis.settings.maxExpand)throw new z("Too many expansions: infinite loop or need to increase maxExpand setting")}expandOnce(e){var t=this.popToken(),a=t.text,n=t.noexpand?null:this._getExpansion(a);if(n==null||e&&n.unexpandable){if(e&&n==null&&a[0]==="\\"&&!this.isDefined(a))throw new z("Undefined control sequence: "+a);return this.pushToken(t),!1}this.countExpansion(1);var s=n.tokens,l=this.consumeArgs(n.numArgs,n.delimiters);if(n.numArgs){s=s.slice();for(var h=s.length-1;h>=0;--h){var c=s[h];if(c.text==="#"){if(h===0)throw new z("Incomplete placeholder at end of macro body",c);if(c=s[--h],c.text==="#")s.splice(h+1,1);else if(/^[1-9]$/.test(c.text))s.splice(h,2,...l[+c.text-1]);else throw new z("Not a valid argument number",c)}}}return this.pushTokens(s),s.length}expandAfterFuture(){return this.expandOnce(),this.future()}expandNextToken(){for(;;)if(this.expandOnce()===!1){var e=this.stack.pop();return e.treatAsRelax&&(e.text="\\relax"),e}throw new Error}expandMacro(e){return this.macros.has(e)?this.expandTokens([new b0(e)]):void 0}expandTokens(e){var t=[],a=this.stack.length;for(this.pushTokens(e);this.stack.length>a;)if(this.expandOnce(!0)===!1){var n=this.stack.pop();n.treatAsRelax&&(n.noexpand=!1,n.treatAsRelax=!1),t.push(n)}return this.countExpansion(t.length),t}expandMacroAsText(e){var t=this.expandMacro(e);return t&&t.map(a=>a.text).join("")}_getExpansion(e){var t=this.macros.get(e);if(t==null)return t;if(e.length===1){var a=this.lexer.catcodes[e];if(a!=null&&a!==13)return}var n=typeof t=="function"?t(this):t;if(typeof n=="string"){var s=0;if(n.indexOf("#")!==-1)for(var l=n.replace(/##/g,"");l.indexOf("#"+(s+1))!==-1;)++s;for(var h=new Pe(n,this.settings),c=[],f=h.lex();f.text!=="EOF";)c.push(f),f=h.lex();c.reverse();var v={tokens:c,numArgs:s};return v}return n}isDefined(e){return this.macros.has(e)||P0.hasOwnProperty(e)||Y.math.hasOwnProperty(e)||Y.text.hasOwnProperty(e)||ga.hasOwnProperty(e)}isExpandable(e){var t=this.macros.get(e);return t!=null?typeof t=="string"||typeof t=="function"||!t.unexpandable:P0.hasOwnProperty(e)&&!P0[e].primitive}},kr=/^[₊₋₌₍₎₀₁₂₃₄₅₆₇₈₉ₐₑₕᵢⱼₖₗₘₙₒₚᵣₛₜᵤᵥₓᵦᵧᵨᵩᵪ]/,Ne=Object.freeze({"\u208A":"+","\u208B":"-","\u208C":"=","\u208D":"(","\u208E":")","\u2080":"0","\u2081":"1","\u2082":"2","\u2083":"3","\u2084":"4","\u2085":"5","\u2086":"6","\u2087":"7","\u2088":"8","\u2089":"9","\u2090":"a","\u2091":"e","\u2095":"h","\u1D62":"i","\u2C7C":"j","\u2096":"k","\u2097":"l","\u2098":"m","\u2099":"n","\u2092":"o","\u209A":"p","\u1D63":"r","\u209B":"s","\u209C":"t","\u1D64":"u","\u1D65":"v","\u2093":"x","\u1D66":"\u03B2","\u1D67":"\u03B3","\u1D68":"\u03C1","\u1D69":"\u03D5","\u1D6A":"\u03C7","\u207A":"+","\u207B":"-","\u207C":"=","\u207D":"(","\u207E":")","\u2070":"0","\xB9":"1","\xB2":"2","\xB3":"3","\u2074":"4","\u2075":"5","\u2076":"6","\u2077":"7","\u2078":"8","\u2079":"9","\u1D2C":"A","\u1D2E":"B","\u1D30":"D","\u1D31":"E","\u1D33":"G","\u1D34":"H","\u1D35":"I","\u1D36":"J","\u1D37":"K","\u1D38":"L","\u1D39":"M","\u1D3A":"N","\u1D3C":"O","\u1D3E":"P","\u1D3F":"R","\u1D40":"T","\u1D41":"U","\u2C7D":"V","\u1D42":"W","\u1D43":"a","\u1D47":"b","\u1D9C":"c","\u1D48":"d","\u1D49":"e","\u1DA0":"f","\u1D4D":"g",\u02B0:"h","\u2071":"i",\u02B2:"j","\u1D4F":"k",\u02E1:"l","\u1D50":"m",\u207F:"n","\u1D52":"o","\u1D56":"p",\u02B3:"r",\u02E2:"s","\u1D57":"t","\u1D58":"u","\u1D5B":"v",\u02B7:"w",\u02E3:"x",\u02B8:"y","\u1DBB":"z","\u1D5D":"\u03B2","\u1D5E":"\u03B3","\u1D5F":"\u03B4","\u1D60":"\u03D5","\u1D61":"\u03C7","\u1DBF":"\u03B8"}),dt={"\u0301":{text:"\\'",math:"\\acute"},"\u0300":{text:"\\`",math:"\\grave"},"\u0308":{text:'\\"',math:"\\ddot"},"\u0303":{text:"\\~",math:"\\tilde"},"\u0304":{text:"\\=",math:"\\bar"},"\u0306":{text:"\\u",math:"\\breve"},"\u030C":{text:"\\v",math:"\\check"},"\u0302":{text:"\\^",math:"\\hat"},"\u0307":{text:"\\.",math:"\\dot"},"\u030A":{text:"\\r",math:"\\mathring"},"\u030B":{text:"\\H"},"\u0327":{text:"\\c"}},Mr={\u00E1:"a\u0301",\u00E0:"a\u0300",\u00E4:"a\u0308",\u01DF:"a\u0308\u0304",\u00E3:"a\u0303",\u0101:"a\u0304",\u0103:"a\u0306",\u1EAF:"a\u0306\u0301",\u1EB1:"a\u0306\u0300",\u1EB5:"a\u0306\u0303",\u01CE:"a\u030C",\u00E2:"a\u0302",\u1EA5:"a\u0302\u0301",\u1EA7:"a\u0302\u0300",\u1EAB:"a\u0302\u0303",\u0227:"a\u0307",\u01E1:"a\u0307\u0304",\u00E5:"a\u030A",\u01FB:"a\u030A\u0301",\u1E03:"b\u0307",\u0107:"c\u0301",\u1E09:"c\u0327\u0301",\u010D:"c\u030C",\u0109:"c\u0302",\u010B:"c\u0307",\u00E7:"c\u0327",\u010F:"d\u030C",\u1E0B:"d\u0307",\u1E11:"d\u0327",\u00E9:"e\u0301",\u00E8:"e\u0300",\u00EB:"e\u0308",\u1EBD:"e\u0303",\u0113:"e\u0304",\u1E17:"e\u0304\u0301",\u1E15:"e\u0304\u0300",\u0115:"e\u0306",\u1E1D:"e\u0327\u0306",\u011B:"e\u030C",\u00EA:"e\u0302",\u1EBF:"e\u0302\u0301",\u1EC1:"e\u0302\u0300",\u1EC5:"e\u0302\u0303",\u0117:"e\u0307",\u0229:"e\u0327",\u1E1F:"f\u0307",\u01F5:"g\u0301",\u1E21:"g\u0304",\u011F:"g\u0306",\u01E7:"g\u030C",\u011D:"g\u0302",\u0121:"g\u0307",\u0123:"g\u0327",\u1E27:"h\u0308",\u021F:"h\u030C",\u0125:"h\u0302",\u1E23:"h\u0307",\u1E29:"h\u0327",\u00ED:"i\u0301",\u00EC:"i\u0300",\u00EF:"i\u0308",\u1E2F:"i\u0308\u0301",\u0129:"i\u0303",\u012B:"i\u0304",\u012D:"i\u0306",\u01D0:"i\u030C",\u00EE:"i\u0302",\u01F0:"j\u030C",\u0135:"j\u0302",\u1E31:"k\u0301",\u01E9:"k\u030C",\u0137:"k\u0327",\u013A:"l\u0301",\u013E:"l\u030C",\u013C:"l\u0327",\u1E3F:"m\u0301",\u1E41:"m\u0307",\u0144:"n\u0301",\u01F9:"n\u0300",\u00F1:"n\u0303",\u0148:"n\u030C",\u1E45:"n\u0307",\u0146:"n\u0327",\u00F3:"o\u0301",\u00F2:"o\u0300",\u00F6:"o\u0308",\u022B:"o\u0308\u0304",\u00F5:"o\u0303",\u1E4D:"o\u0303\u0301",\u1E4F:"o\u0303\u0308",\u022D:"o\u0303\u0304",\u014D:"o\u0304",\u1E53:"o\u0304\u0301",\u1E51:"o\u0304\u0300",\u014F:"o\u0306",\u01D2:"o\u030C",\u00F4:"o\u0302",\u1ED1:"o\u0302\u0301",\u1ED3:"o\u0302\u0300",\u1ED7:"o\u0302\u0303",\u022F:"o\u0307",\u0231:"o\u0307\u0304",\u0151:"o\u030B",\u1E55:"p\u0301",\u1E57:"p\u0307",\u0155:"r\u0301",\u0159:"r\u030C",\u1E59:"r\u0307",\u0157:"r\u0327",\u015B:"s\u0301",\u1E65:"s\u0301\u0307",\u0161:"s\u030C",\u1E67:"s\u030C\u0307",\u015D:"s\u0302",\u1E61:"s\u0307",\u015F:"s\u0327",\u1E97:"t\u0308",\u0165:"t\u030C",\u1E6B:"t\u0307",\u0163:"t\u0327",\u00FA:"u\u0301",\u00F9:"u\u0300",\u00FC:"u\u0308",\u01D8:"u\u0308\u0301",\u01DC:"u\u0308\u0300",\u01D6:"u\u0308\u0304",\u01DA:"u\u0308\u030C",\u0169:"u\u0303",\u1E79:"u\u0303\u0301",\u016B:"u\u0304",\u1E7B:"u\u0304\u0308",\u016D:"u\u0306",\u01D4:"u\u030C",\u00FB:"u\u0302",\u016F:"u\u030A",\u0171:"u\u030B",\u1E7D:"v\u0303",\u1E83:"w\u0301",\u1E81:"w\u0300",\u1E85:"w\u0308",\u0175:"w\u0302",\u1E87:"w\u0307",\u1E98:"w\u030A",\u1E8D:"x\u0308",\u1E8B:"x\u0307",\u00FD:"y\u0301",\u1EF3:"y\u0300",\u00FF:"y\u0308",\u1EF9:"y\u0303",\u0233:"y\u0304",\u0177:"y\u0302",\u1E8F:"y\u0307",\u1E99:"y\u030A",\u017A:"z\u0301",\u017E:"z\u030C",\u1E91:"z\u0302",\u017C:"z\u0307",\u00C1:"A\u0301",\u00C0:"A\u0300",\u00C4:"A\u0308",\u01DE:"A\u0308\u0304",\u00C3:"A\u0303",\u0100:"A\u0304",\u0102:"A\u0306",\u1EAE:"A\u0306\u0301",\u1EB0:"A\u0306\u0300",\u1EB4:"A\u0306\u0303",\u01CD:"A\u030C",\u00C2:"A\u0302",\u1EA4:"A\u0302\u0301",\u1EA6:"A\u0302\u0300",\u1EAA:"A\u0302\u0303",\u0226:"A\u0307",\u01E0:"A\u0307\u0304",\u00C5:"A\u030A",\u01FA:"A\u030A\u0301",\u1E02:"B\u0307",\u0106:"C\u0301",\u1E08:"C\u0327\u0301",\u010C:"C\u030C",\u0108:"C\u0302",\u010A:"C\u0307",\u00C7:"C\u0327",\u010E:"D\u030C",\u1E0A:"D\u0307",\u1E10:"D\u0327",\u00C9:"E\u0301",\u00C8:"E\u0300",\u00CB:"E\u0308",\u1EBC:"E\u0303",\u0112:"E\u0304",\u1E16:"E\u0304\u0301",\u1E14:"E\u0304\u0300",\u0114:"E\u0306",\u1E1C:"E\u0327\u0306",\u011A:"E\u030C",\u00CA:"E\u0302",\u1EBE:"E\u0302\u0301",\u1EC0:"E\u0302\u0300",\u1EC4:"E\u0302\u0303",\u0116:"E\u0307",\u0228:"E\u0327",\u1E1E:"F\u0307",\u01F4:"G\u0301",\u1E20:"G\u0304",\u011E:"G\u0306",\u01E6:"G\u030C",\u011C:"G\u0302",\u0120:"G\u0307",\u0122:"G\u0327",\u1E26:"H\u0308",\u021E:"H\u030C",\u0124:"H\u0302",\u1E22:"H\u0307",\u1E28:"H\u0327",\u00CD:"I\u0301",\u00CC:"I\u0300",\u00CF:"I\u0308",\u1E2E:"I\u0308\u0301",\u0128:"I\u0303",\u012A:"I\u0304",\u012C:"I\u0306",\u01CF:"I\u030C",\u00CE:"I\u0302",\u0130:"I\u0307",\u0134:"J\u0302",\u1E30:"K\u0301",\u01E8:"K\u030C",\u0136:"K\u0327",\u0139:"L\u0301",\u013D:"L\u030C",\u013B:"L\u0327",\u1E3E:"M\u0301",\u1E40:"M\u0307",\u0143:"N\u0301",\u01F8:"N\u0300",\u00D1:"N\u0303",\u0147:"N\u030C",\u1E44:"N\u0307",\u0145:"N\u0327",\u00D3:"O\u0301",\u00D2:"O\u0300",\u00D6:"O\u0308",\u022A:"O\u0308\u0304",\u00D5:"O\u0303",\u1E4C:"O\u0303\u0301",\u1E4E:"O\u0303\u0308",\u022C:"O\u0303\u0304",\u014C:"O\u0304",\u1E52:"O\u0304\u0301",\u1E50:"O\u0304\u0300",\u014E:"O\u0306",\u01D1:"O\u030C",\u00D4:"O\u0302",\u1ED0:"O\u0302\u0301",\u1ED2:"O\u0302\u0300",\u1ED6:"O\u0302\u0303",\u022E:"O\u0307",\u0230:"O\u0307\u0304",\u0150:"O\u030B",\u1E54:"P\u0301",\u1E56:"P\u0307",\u0154:"R\u0301",\u0158:"R\u030C",\u1E58:"R\u0307",\u0156:"R\u0327",\u015A:"S\u0301",\u1E64:"S\u0301\u0307",\u0160:"S\u030C",\u1E66:"S\u030C\u0307",\u015C:"S\u0302",\u1E60:"S\u0307",\u015E:"S\u0327",\u0164:"T\u030C",\u1E6A:"T\u0307",\u0162:"T\u0327",\u00DA:"U\u0301",\u00D9:"U\u0300",\u00DC:"U\u0308",\u01D7:"U\u0308\u0301",\u01DB:"U\u0308\u0300",\u01D5:"U\u0308\u0304",\u01D9:"U\u0308\u030C",\u0168:"U\u0303",\u1E78:"U\u0303\u0301",\u016A:"U\u0304",\u1E7A:"U\u0304\u0308",\u016C:"U\u0306",\u01D3:"U\u030C",\u00DB:"U\u0302",\u016E:"U\u030A",\u0170:"U\u030B",\u1E7C:"V\u0303",\u1E82:"W\u0301",\u1E80:"W\u0300",\u1E84:"W\u0308",\u0174:"W\u0302",\u1E86:"W\u0307",\u1E8C:"X\u0308",\u1E8A:"X\u0307",\u00DD:"Y\u0301",\u1EF2:"Y\u0300",\u0178:"Y\u0308",\u1EF8:"Y\u0303",\u0232:"Y\u0304",\u0176:"Y\u0302",\u1E8E:"Y\u0307",\u0179:"Z\u0301",\u017D:"Z\u030C",\u1E90:"Z\u0302",\u017B:"Z\u0307",\u03AC:"\u03B1\u0301",\u1F70:"\u03B1\u0300",\u1FB1:"\u03B1\u0304",\u1FB0:"\u03B1\u0306",\u03AD:"\u03B5\u0301",\u1F72:"\u03B5\u0300",\u03AE:"\u03B7\u0301",\u1F74:"\u03B7\u0300",\u03AF:"\u03B9\u0301",\u1F76:"\u03B9\u0300",\u03CA:"\u03B9\u0308",\u0390:"\u03B9\u0308\u0301",\u1FD2:"\u03B9\u0308\u0300",\u1FD1:"\u03B9\u0304",\u1FD0:"\u03B9\u0306",\u03CC:"\u03BF\u0301",\u1F78:"\u03BF\u0300",\u03CD:"\u03C5\u0301",\u1F7A:"\u03C5\u0300",\u03CB:"\u03C5\u0308",\u03B0:"\u03C5\u0308\u0301",\u1FE2:"\u03C5\u0308\u0300",\u1FE1:"\u03C5\u0304",\u1FE0:"\u03C5\u0306",\u03CE:"\u03C9\u0301",\u1F7C:"\u03C9\u0300",\u038E:"\u03A5\u0301",\u1FEA:"\u03A5\u0300",\u03AB:"\u03A5\u0308",\u1FE9:"\u03A5\u0304",\u1FE8:"\u03A5\u0306",\u038F:"\u03A9\u0301",\u1FFA:"\u03A9\u0300"},Ge=class r{constructor(e,t){this.mode=void 0,this.gullet=void 0,this.settings=void 0,this.leftrightDepth=void 0,this.nextToken=void 0,this.mode="math",this.gullet=new zt(e,t,this.mode),this.settings=t,this.leftrightDepth=0}expect(e,t){if(t===void 0&&(t=!0),this.fetch().text!==e)throw new z("Expected '"+e+"', got '"+this.fetch().text+"'",this.fetch());t&&this.consume()}consume(){this.nextToken=null}fetch(){return this.nextToken==null&&(this.nextToken=this.gullet.expandNextToken()),this.nextToken}switchMode(e){this.mode=e,this.gullet.switchMode(e)}parse(){this.settings.globalGroup||this.gullet.beginGroup(),this.settings.colorIsTextColor&&this.gullet.macros.set("\\color","\\textcolor");try{var e=this.parseExpression(!1);return this.expect("EOF"),this.settings.globalGroup||this.gullet.endGroup(),e}finally{this.gullet.endGroups()}}subparse(e){var t=this.nextToken;this.consume(),this.gullet.pushToken(new b0("}")),this.gullet.pushTokens(e);var a=this.parseExpression(!1);return this.expect("}"),this.nextToken=t,a}parseExpression(e,t){for(var a=[];;){this.mode==="math"&&this.consumeSpaces();var n=this.fetch();if(r.endOfExpression.indexOf(n.text)!==-1||t&&n.text===t||e&&P0[n.text]&&P0[n.text].infix)break;var s=this.parseAtom(t);if(s){if(s.type==="internal")continue}else break;a.push(s)}return this.mode==="text"&&this.formLigatures(a),this.handleInfixNodes(a)}handleInfixNodes(e){for(var t=-1,a,n=0;n=0&&this.settings.reportNonstrict("unicodeTextInMathMode",'Latin-1/Unicode text character "'+t[0]+'" used in math mode',e);var h=Y[this.mode][t].group,c=d0.range(e),f;if(i1.hasOwnProperty(h)){var v=h;f={type:"atom",mode:this.mode,family:v,loc:c,text:t}}else f={type:h,mode:this.mode,loc:c,text:t};l=f}else if(t.charCodeAt(0)>=128)this.settings.strict&&(Ar(t.charCodeAt(0))?this.mode==="math"&&this.settings.reportNonstrict("unicodeTextInMathMode",'Unicode text character "'+t[0]+'" used in math mode',e):this.settings.reportNonstrict("unknownSymbol",'Unrecognized Unicode character "'+t[0]+'"'+(" ("+t.charCodeAt(0)+")"),e)),l={type:"textord",mode:"text",loc:d0.range(e),text:t};else return null;if(this.consume(),s)for(var b=0;b=0;n--)r[n].loc.start>a&&(t+=" ",a=r[n].loc.start),t+=r[n].text,a+=r[n].text.length;var s=W.go(S.go(t,e));return s},S={go:function(r,e){if(!r)return[];e===void 0&&(e="ce");var t="0",a={};a.parenthesisLevel=0,r=r.replace(/\n/g," "),r=r.replace(/[\u2212\u2013\u2014\u2010]/g,"-"),r=r.replace(/[\u2026]/g,"...");for(var n,s=10,l=[];;){n!==r?(s=10,n=r):s--;var h=S.stateMachines[e],c=h.transitions[t]||h.transitions["*"];e:for(var f=0;f0){if(b.revisit||(r=v.remainder),!b.toContinue)break e}else return l}}if(s<=0)throw["MhchemBugU","mhchem bug U. Please report."]}},concatArray:function(r,e){if(e)if(Array.isArray(e))for(var t=0;t":/^[=<>]/,"#":/^[#\u2261]/,"+":/^\+/,"-$":/^-(?=[\s_},;\]/]|$|\([a-z]+\))/,"-9":/^-(?=[0-9])/,"- orbital overlap":/^-(?=(?:[spd]|sp)(?:$|[\s,;\)\]\}]))/,"-":/^-/,"pm-operator":/^(?:\\pm|\$\\pm\$|\+-|\+\/-)/,operator:/^(?:\+|(?:[\-=<>]|<<|>>|\\approx|\$\\approx\$)(?=\s|$|-?[0-9]))/,arrowUpDown:/^(?:v|\(v\)|\^|\(\^\))(?=$|[\s,;\)\]\}])/,"\\bond{(...)}":function(r){return S.patterns.findObserveGroups(r,"\\bond{","","","}")},"->":/^(?:<->|<-->|->|<-|<=>>|<<=>|<=>|[\u2192\u27F6\u21CC])/,CMT:/^[CMT](?=\[)/,"[(...)]":function(r){return S.patterns.findObserveGroups(r,"[","","","]")},"1st-level escape":/^(&|\\\\|\\hline)\s*/,"\\,":/^(?:\\[,\ ;:])/,"\\x{}{}":function(r){return S.patterns.findObserveGroups(r,"",/^\\[a-zA-Z]+\{/,"}","","","{","}","",!0)},"\\x{}":function(r){return S.patterns.findObserveGroups(r,"",/^\\[a-zA-Z]+\{/,"}","")},"\\ca":/^\\ca(?:\s+|(?![a-zA-Z]))/,"\\x":/^(?:\\[a-zA-Z]+\s*|\\[_&{}%])/,orbital:/^(?:[0-9]{1,2}[spdfgh]|[0-9]{0,2}sp)(?=$|[^a-zA-Z])/,others:/^[\/~|]/,"\\frac{(...)}":function(r){return S.patterns.findObserveGroups(r,"\\frac{","","","}","{","","","}")},"\\overset{(...)}":function(r){return S.patterns.findObserveGroups(r,"\\overset{","","","}","{","","","}")},"\\underset{(...)}":function(r){return S.patterns.findObserveGroups(r,"\\underset{","","","}","{","","","}")},"\\underbrace{(...)}":function(r){return S.patterns.findObserveGroups(r,"\\underbrace{","","","}_","{","","","}")},"\\color{(...)}0":function(r){return S.patterns.findObserveGroups(r,"\\color{","","","}")},"\\color{(...)}{(...)}1":function(r){return S.patterns.findObserveGroups(r,"\\color{","","","}","{","","","}")},"\\color(...){(...)}2":function(r){return S.patterns.findObserveGroups(r,"\\color","\\","",/^(?=\{)/,"{","","","}")},"\\ce{(...)}":function(r){return S.patterns.findObserveGroups(r,"\\ce{","","","}")},oxidation$:/^(?:[+-][IVX]+|\\pm\s*0|\$\\pm\$\s*0)$/,"d-oxidation$":/^(?:[+-]?\s?[IVX]+|\\pm\s*0|\$\\pm\$\s*0)$/,"roman numeral":/^[IVX]+/,"1/2$":/^[+\-]?(?:[0-9]+|\$[a-z]\$|[a-z])\/[0-9]+(?:\$[a-z]\$|[a-z])?$/,amount:function(r){var e;if(e=r.match(/^(?:(?:(?:\([+\-]?[0-9]+\/[0-9]+\)|[+\-]?(?:[0-9]+|\$[a-z]\$|[a-z])\/[0-9]+|[+\-]?[0-9]+[.,][0-9]+|[+\-]?\.[0-9]+|[+\-]?[0-9]+)(?:[a-z](?=\s*[A-Z]))?)|[+\-]?[a-z](?=\s*[A-Z])|\+(?!\s))/),e)return{match_:e[0],remainder:r.substr(e[0].length)};var t=S.patterns.findObserveGroups(r,"","$","$","");return t&&(e=t.match_.match(/^\$(?:\(?[+\-]?(?:[0-9]*[a-z]?[+\-])?[0-9]*[a-z](?:[+\-][0-9]*[a-z]?)?\)?|\+|-)\$$/),e)?{match_:e[0],remainder:r.substr(e[0].length)}:null},amount2:function(r){return this.amount(r)},"(KV letters),":/^(?:[A-Z][a-z]{0,2}|i)(?=,)/,formula$:function(r){if(r.match(/^\([a-z]+\)$/))return null;var e=r.match(/^(?:[a-z]|(?:[0-9\ \+\-\,\.\(\)]+[a-z])+[0-9\ \+\-\,\.\(\)]*|(?:[a-z][0-9\ \+\-\,\.\(\)]+)+[a-z]?)$/);return e?{match_:e[0],remainder:r.substr(e[0].length)}:null},uprightEntities:/^(?:pH|pOH|pC|pK|iPr|iBu)(?=$|[^a-zA-Z])/,"/":/^\s*(\/)\s*/,"//":/^\s*(\/\/)\s*/,"*":/^\s*[*.]\s*/},findObserveGroups:function(r,e,t,a,n,s,l,h,c,f){var v=function(D,N){if(typeof N=="string")return D.indexOf(N)!==0?null:N;var $=D.match(N);return $?$[0]:null},b=function(D,N,$){for(var H=0;N0,null},x=v(r,e);if(x===null||(r=r.substr(x.length),x=v(r,t),x===null))return null;var w=b(r,x.length,a||n);if(w===null)return null;var A=r.substring(0,a?w.endMatchEnd:w.endMatchBegin);if(s||l){var q=this.findObserveGroups(r.substr(w.endMatchEnd),s,l,h,c);if(q===null)return null;var _=[A,q.match_];return{match_:f?_.join(""):_,remainder:q.remainder}}else return{match_:A,remainder:r.substr(w.endMatchEnd)}},match_:function(r,e){var t=S.patterns.patterns[r];if(t===void 0)throw["MhchemBugP","mhchem bug P. Please report. ("+r+")"];if(typeof t=="function")return S.patterns.patterns[r](e);var a=e.match(t);if(a){var n;return a[2]?n=[a[1],a[2]]:a[1]?n=a[1]:n=a[0],{match_:n,remainder:e.substr(a[0].length)}}return null}},actions:{"a=":function(r,e){r.a=(r.a||"")+e},"b=":function(r,e){r.b=(r.b||"")+e},"p=":function(r,e){r.p=(r.p||"")+e},"o=":function(r,e){r.o=(r.o||"")+e},"q=":function(r,e){r.q=(r.q||"")+e},"d=":function(r,e){r.d=(r.d||"")+e},"rm=":function(r,e){r.rm=(r.rm||"")+e},"text=":function(r,e){r.text_=(r.text_||"")+e},insert:function(r,e,t){return{type_:t}},"insert+p1":function(r,e,t){return{type_:t,p1:e}},"insert+p1+p2":function(r,e,t){return{type_:t,p1:e[0],p2:e[1]}},copy:function(r,e){return e},rm:function(r,e){return{type_:"rm",p1:e||""}},text:function(r,e){return S.go(e,"text")},"{text}":function(r,e){var t=["{"];return S.concatArray(t,S.go(e,"text")),t.push("}"),t},"tex-math":function(r,e){return S.go(e,"tex-math")},"tex-math tight":function(r,e){return S.go(e,"tex-math tight")},bond:function(r,e,t){return{type_:"bond",kind_:t||e}},"color0-output":function(r,e){return{type_:"color0",color:e[0]}},ce:function(r,e){return S.go(e)},"1/2":function(r,e){var t=[];e.match(/^[+\-]/)&&(t.push(e.substr(0,1)),e=e.substr(1));var a=e.match(/^([0-9]+|\$[a-z]\$|[a-z])\/([0-9]+)(\$[a-z]\$|[a-z])?$/);return a[1]=a[1].replace(/\$/g,""),t.push({type_:"frac",p1:a[1],p2:a[2]}),a[3]&&(a[3]=a[3].replace(/\$/g,""),t.push({type_:"tex-math",p1:a[3]})),t},"9,9":function(r,e){return S.go(e,"9,9")}},createTransitions:function(r){var e,t,a,n,s={};for(e in r)for(t in r[e])for(a=t.split("|"),r[e][t].stateArray=a,n=0;n":{"0|1|2|3":{action_:"r=",nextState:"r"},"a|as":{action_:["output","r="],nextState:"r"},"*":{action_:["output","r="],nextState:"r"}},"+":{o:{action_:"d= kv",nextState:"d"},"d|D":{action_:"d=",nextState:"d"},q:{action_:"d=",nextState:"qd"},"qd|qD":{action_:"d=",nextState:"qd"},dq:{action_:["output","d="],nextState:"d"},3:{action_:["sb=false","output","operator"],nextState:"0"}},amount:{"0|2":{action_:"a=",nextState:"a"}},"pm-operator":{"0|1|2|a|as":{action_:["sb=false","output",{type_:"operator",option:"\\pm"}],nextState:"0"}},operator:{"0|1|2|a|as":{action_:["sb=false","output","operator"],nextState:"0"}},"-$":{"o|q":{action_:["charge or bond","output"],nextState:"qd"},d:{action_:"d=",nextState:"d"},D:{action_:["output",{type_:"bond",option:"-"}],nextState:"3"},q:{action_:"d=",nextState:"qd"},qd:{action_:"d=",nextState:"qd"},"qD|dq":{action_:["output",{type_:"bond",option:"-"}],nextState:"3"}},"-9":{"3|o":{action_:["output",{type_:"insert",option:"hyphen"}],nextState:"3"}},"- orbital overlap":{o:{action_:["output",{type_:"insert",option:"hyphen"}],nextState:"2"},d:{action_:["output",{type_:"insert",option:"hyphen"}],nextState:"2"}},"-":{"0|1|2":{action_:[{type_:"output",option:1},"beginsWithBond=true",{type_:"bond",option:"-"}],nextState:"3"},3:{action_:{type_:"bond",option:"-"}},a:{action_:["output",{type_:"insert",option:"hyphen"}],nextState:"2"},as:{action_:[{type_:"output",option:2},{type_:"bond",option:"-"}],nextState:"3"},b:{action_:"b="},o:{action_:{type_:"- after o/d",option:!1},nextState:"2"},q:{action_:{type_:"- after o/d",option:!1},nextState:"2"},"d|qd|dq":{action_:{type_:"- after o/d",option:!0},nextState:"2"},"D|qD|p":{action_:["output",{type_:"bond",option:"-"}],nextState:"3"}},amount2:{"1|3":{action_:"a=",nextState:"a"}},letters:{"0|1|2|3|a|as|b|p|bp|o":{action_:"o=",nextState:"o"},"q|dq":{action_:["output","o="],nextState:"o"},"d|D|qd|qD":{action_:"o after d",nextState:"o"}},digits:{o:{action_:"q=",nextState:"q"},"d|D":{action_:"q=",nextState:"dq"},q:{action_:["output","o="],nextState:"o"},a:{action_:"o=",nextState:"o"}},"space A":{"b|p|bp":{}},space:{a:{nextState:"as"},0:{action_:"sb=false"},"1|2":{action_:"sb=true"},"r|rt|rd|rdt|rdq":{action_:"output",nextState:"0"},"*":{action_:["output","sb=true"],nextState:"1"}},"1st-level escape":{"1|2":{action_:["output",{type_:"insert+p1",option:"1st-level escape"}]},"*":{action_:["output",{type_:"insert+p1",option:"1st-level escape"}],nextState:"0"}},"[(...)]":{"r|rt":{action_:"rd=",nextState:"rd"},"rd|rdt":{action_:"rq=",nextState:"rdq"}},"...":{"o|d|D|dq|qd|qD":{action_:["output",{type_:"bond",option:"..."}],nextState:"3"},"*":{action_:[{type_:"output",option:1},{type_:"insert",option:"ellipsis"}],nextState:"1"}},". |* ":{"*":{action_:["output",{type_:"insert",option:"addition compound"}],nextState:"1"}},"state of aggregation $":{"*":{action_:["output","state of aggregation"],nextState:"1"}},"{[(":{"a|as|o":{action_:["o=","output","parenthesisLevel++"],nextState:"2"},"0|1|2|3":{action_:["o=","output","parenthesisLevel++"],nextState:"2"},"*":{action_:["output","o=","output","parenthesisLevel++"],nextState:"2"}},")]}":{"0|1|2|3|b|p|bp|o":{action_:["o=","parenthesisLevel--"],nextState:"o"},"a|as|d|D|q|qd|qD|dq":{action_:["output","o=","parenthesisLevel--"],nextState:"o"}},", ":{"*":{action_:["output","comma"],nextState:"0"}},"^_":{"*":{}},"^{(...)}|^($...$)":{"0|1|2|as":{action_:"b=",nextState:"b"},p:{action_:"b=",nextState:"bp"},"3|o":{action_:"d= kv",nextState:"D"},q:{action_:"d=",nextState:"qD"},"d|D|qd|qD|dq":{action_:["output","d="],nextState:"D"}},"^a|^\\x{}{}|^\\x{}|^\\x|'":{"0|1|2|as":{action_:"b=",nextState:"b"},p:{action_:"b=",nextState:"bp"},"3|o":{action_:"d= kv",nextState:"d"},q:{action_:"d=",nextState:"qd"},"d|qd|D|qD":{action_:"d="},dq:{action_:["output","d="],nextState:"d"}},"_{(state of aggregation)}$":{"d|D|q|qd|qD|dq":{action_:["output","q="],nextState:"q"}},"_{(...)}|_($...$)|_9|_\\x{}{}|_\\x{}|_\\x":{"0|1|2|as":{action_:"p=",nextState:"p"},b:{action_:"p=",nextState:"bp"},"3|o":{action_:"q=",nextState:"q"},"d|D":{action_:"q=",nextState:"dq"},"q|qd|qD|dq":{action_:["output","q="],nextState:"q"}},"=<>":{"0|1|2|3|a|as|o|q|d|D|qd|qD|dq":{action_:[{type_:"output",option:2},"bond"],nextState:"3"}},"#":{"0|1|2|3|a|as|o":{action_:[{type_:"output",option:2},{type_:"bond",option:"#"}],nextState:"3"}},"{}":{"*":{action_:{type_:"output",option:1},nextState:"1"}},"{...}":{"0|1|2|3|a|as|b|p|bp":{action_:"o=",nextState:"o"},"o|d|D|q|qd|qD|dq":{action_:["output","o="],nextState:"o"}},"$...$":{a:{action_:"a="},"0|1|2|3|as|b|p|bp|o":{action_:"o=",nextState:"o"},"as|o":{action_:"o="},"q|d|D|qd|qD|dq":{action_:["output","o="],nextState:"o"}},"\\bond{(...)}":{"*":{action_:[{type_:"output",option:2},"bond"],nextState:"3"}},"\\frac{(...)}":{"*":{action_:[{type_:"output",option:1},"frac-output"],nextState:"3"}},"\\overset{(...)}":{"*":{action_:[{type_:"output",option:2},"overset-output"],nextState:"3"}},"\\underset{(...)}":{"*":{action_:[{type_:"output",option:2},"underset-output"],nextState:"3"}},"\\underbrace{(...)}":{"*":{action_:[{type_:"output",option:2},"underbrace-output"],nextState:"3"}},"\\color{(...)}{(...)}1|\\color(...){(...)}2":{"*":{action_:[{type_:"output",option:2},"color-output"],nextState:"3"}},"\\color{(...)}0":{"*":{action_:[{type_:"output",option:2},"color0-output"]}},"\\ce{(...)}":{"*":{action_:[{type_:"output",option:2},"ce"],nextState:"3"}},"\\,":{"*":{action_:[{type_:"output",option:1},"copy"],nextState:"1"}},"\\x{}{}|\\x{}|\\x":{"0|1|2|3|a|as|b|p|bp|o|c0":{action_:["o=","output"],nextState:"3"},"*":{action_:["output","o=","output"],nextState:"3"}},others:{"*":{action_:[{type_:"output",option:1},"copy"],nextState:"3"}},else2:{a:{action_:"a to o",nextState:"o",revisit:!0},as:{action_:["output","sb=true"],nextState:"1",revisit:!0},"r|rt|rd|rdt|rdq":{action_:["output"],nextState:"0",revisit:!0},"*":{action_:["output","copy"],nextState:"3"}}}),actions:{"o after d":function(r,e){var t;if((r.d||"").match(/^[0-9]+$/)){var a=r.d;r.d=void 0,t=this.output(r),r.b=a}else t=this.output(r);return S.actions["o="](r,e),t},"d= kv":function(r,e){r.d=e,r.dType="kv"},"charge or bond":function(r,e){if(r.beginsWithBond){var t=[];return S.concatArray(t,this.output(r)),S.concatArray(t,S.actions.bond(r,e,"-")),t}else r.d=e},"- after o/d":function(r,e,t){var a=S.patterns.match_("orbital",r.o||""),n=S.patterns.match_("one lowercase greek letter $",r.o||""),s=S.patterns.match_("one lowercase latin letter $",r.o||""),l=S.patterns.match_("$one lowercase latin letter$ $",r.o||""),h=e==="-"&&(a&&a.remainder===""||n||s||l);h&&!r.a&&!r.b&&!r.p&&!r.d&&!r.q&&!a&&s&&(r.o="$"+r.o+"$");var c=[];return h?(S.concatArray(c,this.output(r)),c.push({type_:"hyphen"})):(a=S.patterns.match_("digits",r.d||""),t&&a&&a.remainder===""?(S.concatArray(c,S.actions["d="](r,e)),S.concatArray(c,this.output(r))):(S.concatArray(c,this.output(r)),S.concatArray(c,S.actions.bond(r,e,"-")))),c},"a to o":function(r){r.o=r.a,r.a=void 0},"sb=true":function(r){r.sb=!0},"sb=false":function(r){r.sb=!1},"beginsWithBond=true":function(r){r.beginsWithBond=!0},"beginsWithBond=false":function(r){r.beginsWithBond=!1},"parenthesisLevel++":function(r){r.parenthesisLevel++},"parenthesisLevel--":function(r){r.parenthesisLevel--},"state of aggregation":function(r,e){return{type_:"state of aggregation",p1:S.go(e,"o")}},comma:function(r,e){var t=e.replace(/\s*$/,""),a=t!==e;return a&&r.parenthesisLevel===0?{type_:"comma enumeration L",p1:t}:{type_:"comma enumeration M",p1:t}},output:function(r,e,t){var a;if(!r.r)a=[],!r.a&&!r.b&&!r.p&&!r.o&&!r.q&&!r.d&&!t||(r.sb&&a.push({type_:"entitySkip"}),!r.o&&!r.q&&!r.d&&!r.b&&!r.p&&t!==2?(r.o=r.a,r.a=void 0):!r.o&&!r.q&&!r.d&&(r.b||r.p)?(r.o=r.a,r.d=r.b,r.q=r.p,r.a=r.b=r.p=void 0):r.o&&r.dType==="kv"&&S.patterns.match_("d-oxidation$",r.d||"")?r.dType="oxidation":r.o&&r.dType==="kv"&&!r.q&&(r.dType=void 0),a.push({type_:"chemfive",a:S.go(r.a,"a"),b:S.go(r.b,"bd"),p:S.go(r.p,"pq"),o:S.go(r.o,"o"),q:S.go(r.q,"pq"),d:S.go(r.d,r.dType==="oxidation"?"oxidation":"bd"),dType:r.dType}));else{var n;r.rdt==="M"?n=S.go(r.rd,"tex-math"):r.rdt==="T"?n=[{type_:"text",p1:r.rd||""}]:n=S.go(r.rd);var s;r.rqt==="M"?s=S.go(r.rq,"tex-math"):r.rqt==="T"?s=[{type_:"text",p1:r.rq||""}]:s=S.go(r.rq),a={type_:"arrow",r:r.r,rd:n,rq:s}}for(var l in r)l!=="parenthesisLevel"&&l!=="beginsWithBond"&&delete r[l];return a},"oxidation-output":function(r,e){var t=["{"];return S.concatArray(t,S.go(e,"oxidation")),t.push("}"),t},"frac-output":function(r,e){return{type_:"frac-ce",p1:S.go(e[0]),p2:S.go(e[1])}},"overset-output":function(r,e){return{type_:"overset",p1:S.go(e[0]),p2:S.go(e[1])}},"underset-output":function(r,e){return{type_:"underset",p1:S.go(e[0]),p2:S.go(e[1])}},"underbrace-output":function(r,e){return{type_:"underbrace",p1:S.go(e[0]),p2:S.go(e[1])}},"color-output":function(r,e){return{type_:"color",color1:e[0],color2:S.go(e[1])}},"r=":function(r,e){r.r=e},"rdt=":function(r,e){r.rdt=e},"rd=":function(r,e){r.rd=e},"rqt=":function(r,e){r.rqt=e},"rq=":function(r,e){r.rq=e},operator:function(r,e,t){return{type_:"operator",kind_:t||e}}}},a:{transitions:S.createTransitions({empty:{"*":{}},"1/2$":{0:{action_:"1/2"}},else:{0:{nextState:"1",revisit:!0}},"$(...)$":{"*":{action_:"tex-math tight",nextState:"1"}},",":{"*":{action_:{type_:"insert",option:"commaDecimal"}}},else2:{"*":{action_:"copy"}}}),actions:{}},o:{transitions:S.createTransitions({empty:{"*":{}},"1/2$":{0:{action_:"1/2"}},else:{0:{nextState:"1",revisit:!0}},letters:{"*":{action_:"rm"}},"\\ca":{"*":{action_:{type_:"insert",option:"circa"}}},"\\x{}{}|\\x{}|\\x":{"*":{action_:"copy"}},"${(...)}$|$(...)$":{"*":{action_:"tex-math"}},"{(...)}":{"*":{action_:"{text}"}},else2:{"*":{action_:"copy"}}}),actions:{}},text:{transitions:S.createTransitions({empty:{"*":{action_:"output"}},"{...}":{"*":{action_:"text="}},"${(...)}$|$(...)$":{"*":{action_:"tex-math"}},"\\greek":{"*":{action_:["output","rm"]}},"\\,|\\x{}{}|\\x{}|\\x":{"*":{action_:["output","copy"]}},else:{"*":{action_:"text="}}}),actions:{output:function(r){if(r.text_){var e={type_:"text",p1:r.text_};for(var t in r)delete r[t];return e}}}},pq:{transitions:S.createTransitions({empty:{"*":{}},"state of aggregation $":{"*":{action_:"state of aggregation"}},i$:{0:{nextState:"!f",revisit:!0}},"(KV letters),":{0:{action_:"rm",nextState:"0"}},formula$:{0:{nextState:"f",revisit:!0}},"1/2$":{0:{action_:"1/2"}},else:{0:{nextState:"!f",revisit:!0}},"${(...)}$|$(...)$":{"*":{action_:"tex-math"}},"{(...)}":{"*":{action_:"text"}},"a-z":{f:{action_:"tex-math"}},letters:{"*":{action_:"rm"}},"-9.,9":{"*":{action_:"9,9"}},",":{"*":{action_:{type_:"insert+p1",option:"comma enumeration S"}}},"\\color{(...)}{(...)}1|\\color(...){(...)}2":{"*":{action_:"color-output"}},"\\color{(...)}0":{"*":{action_:"color0-output"}},"\\ce{(...)}":{"*":{action_:"ce"}},"\\,|\\x{}{}|\\x{}|\\x":{"*":{action_:"copy"}},else2:{"*":{action_:"copy"}}}),actions:{"state of aggregation":function(r,e){return{type_:"state of aggregation subscript",p1:S.go(e,"o")}},"color-output":function(r,e){return{type_:"color",color1:e[0],color2:S.go(e[1],"pq")}}}},bd:{transitions:S.createTransitions({empty:{"*":{}},x$:{0:{nextState:"!f",revisit:!0}},formula$:{0:{nextState:"f",revisit:!0}},else:{0:{nextState:"!f",revisit:!0}},"-9.,9 no missing 0":{"*":{action_:"9,9"}},".":{"*":{action_:{type_:"insert",option:"electron dot"}}},"a-z":{f:{action_:"tex-math"}},x:{"*":{action_:{type_:"insert",option:"KV x"}}},letters:{"*":{action_:"rm"}},"'":{"*":{action_:{type_:"insert",option:"prime"}}},"${(...)}$|$(...)$":{"*":{action_:"tex-math"}},"{(...)}":{"*":{action_:"text"}},"\\color{(...)}{(...)}1|\\color(...){(...)}2":{"*":{action_:"color-output"}},"\\color{(...)}0":{"*":{action_:"color0-output"}},"\\ce{(...)}":{"*":{action_:"ce"}},"\\,|\\x{}{}|\\x{}|\\x":{"*":{action_:"copy"}},else2:{"*":{action_:"copy"}}}),actions:{"color-output":function(r,e){return{type_:"color",color1:e[0],color2:S.go(e[1],"bd")}}}},oxidation:{transitions:S.createTransitions({empty:{"*":{}},"roman numeral":{"*":{action_:"roman-numeral"}},"${(...)}$|$(...)$":{"*":{action_:"tex-math"}},else:{"*":{action_:"copy"}}}),actions:{"roman-numeral":function(r,e){return{type_:"roman numeral",p1:e||""}}}},"tex-math":{transitions:S.createTransitions({empty:{"*":{action_:"output"}},"\\ce{(...)}":{"*":{action_:["output","ce"]}},"{...}|\\,|\\x{}{}|\\x{}|\\x":{"*":{action_:"o="}},else:{"*":{action_:"o="}}}),actions:{output:function(r){if(r.o){var e={type_:"tex-math",p1:r.o};for(var t in r)delete r[t];return e}}}},"tex-math tight":{transitions:S.createTransitions({empty:{"*":{action_:"output"}},"\\ce{(...)}":{"*":{action_:["output","ce"]}},"{...}|\\,|\\x{}{}|\\x{}|\\x":{"*":{action_:"o="}},"-|+":{"*":{action_:"tight operator"}},else:{"*":{action_:"o="}}}),actions:{"tight operator":function(r,e){r.o=(r.o||"")+"{"+e+"}"},output:function(r){if(r.o){var e={type_:"tex-math",p1:r.o};for(var t in r)delete r[t];return e}}}},"9,9":{transitions:S.createTransitions({empty:{"*":{}},",":{"*":{action_:"comma"}},else:{"*":{action_:"copy"}}}),actions:{comma:function(){return{type_:"commaDecimal"}}}},pu:{transitions:S.createTransitions({empty:{"*":{action_:"output"}},space$:{"*":{action_:["output","space"]}},"{[(|)]}":{"0|a":{action_:"copy"}},"(-)(9)^(-9)":{0:{action_:"number^",nextState:"a"}},"(-)(9.,9)(e)(99)":{0:{action_:"enumber",nextState:"a"}},space:{"0|a":{}},"pm-operator":{"0|a":{action_:{type_:"operator",option:"\\pm"},nextState:"0"}},operator:{"0|a":{action_:"copy",nextState:"0"}},"//":{d:{action_:"o=",nextState:"/"}},"/":{d:{action_:"o=",nextState:"/"}},"{...}|else":{"0|d":{action_:"d=",nextState:"d"},a:{action_:["space","d="],nextState:"d"},"/|q":{action_:"q=",nextState:"q"}}}),actions:{enumber:function(r,e){var t=[];return e[0]==="+-"||e[0]==="+/-"?t.push("\\pm "):e[0]&&t.push(e[0]),e[1]&&(S.concatArray(t,S.go(e[1],"pu-9,9")),e[2]&&(e[2].match(/[,.]/)?S.concatArray(t,S.go(e[2],"pu-9,9")):t.push(e[2])),e[3]=e[4]||e[3],e[3]&&(e[3]=e[3].trim(),e[3]==="e"||e[3].substr(0,1)==="*"?t.push({type_:"cdot"}):t.push({type_:"times"}))),e[3]&&t.push("10^{"+e[5]+"}"),t},"number^":function(r,e){var t=[];return e[0]==="+-"||e[0]==="+/-"?t.push("\\pm "):e[0]&&t.push(e[0]),S.concatArray(t,S.go(e[1],"pu-9,9")),t.push("^{"+e[2]+"}"),t},operator:function(r,e,t){return{type_:"operator",kind_:t||e}},space:function(){return{type_:"pu-space-1"}},output:function(r){var e,t=S.patterns.match_("{(...)}",r.d||"");t&&t.remainder===""&&(r.d=t.match_);var a=S.patterns.match_("{(...)}",r.q||"");if(a&&a.remainder===""&&(r.q=a.match_),r.d&&(r.d=r.d.replace(/\u00B0C|\^oC|\^{o}C/g,"{}^{\\circ}C"),r.d=r.d.replace(/\u00B0F|\^oF|\^{o}F/g,"{}^{\\circ}F")),r.q){r.q=r.q.replace(/\u00B0C|\^oC|\^{o}C/g,"{}^{\\circ}C"),r.q=r.q.replace(/\u00B0F|\^oF|\^{o}F/g,"{}^{\\circ}F");var n={d:S.go(r.d,"pu"),q:S.go(r.q,"pu")};r.o==="//"?e={type_:"pu-frac",p1:n.d,p2:n.q}:(e=n.d,n.d.length>1||n.q.length>1?e.push({type_:" / "}):e.push({type_:"/"}),S.concatArray(e,n.q))}else e=S.go(r.d,"pu-2");for(var s in r)delete r[s];return e}}},"pu-2":{transitions:S.createTransitions({empty:{"*":{action_:"output"}},"*":{"*":{action_:["output","cdot"],nextState:"0"}},"\\x":{"*":{action_:"rm="}},space:{"*":{action_:["output","space"],nextState:"0"}},"^{(...)}|^(-1)":{1:{action_:"^(-1)"}},"-9.,9":{0:{action_:"rm=",nextState:"0"},1:{action_:"^(-1)",nextState:"0"}},"{...}|else":{"*":{action_:"rm=",nextState:"1"}}}),actions:{cdot:function(){return{type_:"tight cdot"}},"^(-1)":function(r,e){r.rm+="^{"+e+"}"},space:function(){return{type_:"pu-space-2"}},output:function(r){var e=[];if(r.rm){var t=S.patterns.match_("{(...)}",r.rm||"");t&&t.remainder===""?e=S.go(t.match_,"pu"):e={type_:"rm",p1:r.rm}}for(var a in r)delete r[a];return e}}},"pu-9,9":{transitions:S.createTransitions({empty:{0:{action_:"output-0"},o:{action_:"output-o"}},",":{0:{action_:["output-0","comma"],nextState:"o"}},".":{0:{action_:["output-0","copy"],nextState:"o"}},else:{"*":{action_:"text="}}}),actions:{comma:function(){return{type_:"commaDecimal"}},"output-0":function(r){var e=[];if(r.text_=r.text_||"",r.text_.length>4){var t=r.text_.length%3;t===0&&(t=3);for(var a=r.text_.length-3;a>0;a-=3)e.push(r.text_.substr(a,3)),e.push({type_:"1000 separator"});e.push(r.text_.substr(0,t)),e.reverse()}else e.push(r.text_);for(var n in r)delete r[n];return e},"output-o":function(r){var e=[];if(r.text_=r.text_||"",r.text_.length>4){for(var t=r.text_.length-3,a=0;a":return"rightarrow";case"\u2192":return"rightarrow";case"\u27F6":return"rightarrow";case"<-":return"leftarrow";case"<->":return"leftrightarrow";case"<-->":return"rightleftarrows";case"<=>":return"rightleftharpoons";case"\u21CC":return"rightleftharpoons";case"<=>>":return"rightequilibrium";case"<<=>":return"leftequilibrium";default:throw["MhchemBugT","mhchem bug T. Please report."]}},_getBond:function(r){switch(r){case"-":return"{-}";case"1":return"{-}";case"=":return"{=}";case"2":return"{=}";case"#":return"{\\equiv}";case"3":return"{\\equiv}";case"~":return"{\\tripledash}";case"~-":return"{\\mathrlap{\\raisebox{-.1em}{$-$}}\\raisebox{.1em}{$\\tripledash$}}";case"~=":return"{\\mathrlap{\\raisebox{-.2em}{$-$}}\\mathrlap{\\raisebox{.2em}{$\\tripledash$}}-}";case"~--":return"{\\mathrlap{\\raisebox{-.2em}{$-$}}\\mathrlap{\\raisebox{.2em}{$\\tripledash$}}-}";case"-~-":return"{\\mathrlap{\\raisebox{-.2em}{$-$}}\\mathrlap{\\raisebox{.2em}{$-$}}\\tripledash}";case"...":return"{{\\cdot}{\\cdot}{\\cdot}}";case"....":return"{{\\cdot}{\\cdot}{\\cdot}{\\cdot}}";case"->":return"{\\rightarrow}";case"<-":return"{\\leftarrow}";case"<":return"{<}";case">":return"{>}";default:throw["MhchemBugT","mhchem bug T. Please report."]}},_getOperator:function(r){switch(r){case"+":return" {}+{} ";case"-":return" {}-{} ";case"=":return" {}={} ";case"<":return" {}<{} ";case">":return" {}>{} ";case"<<":return" {}\\ll{} ";case">>":return" {}\\gg{} ";case"\\pm":return" {}\\pm{} ";case"\\approx":return" {}\\approx{} ";case"$\\approx$":return" {}\\approx{} ";case"v":return" \\downarrow{} ";case"(v)":return" \\downarrow{} ";case"^":return" \\uparrow{} ";case"(^)":return" \\uparrow{} ";default:throw["MhchemBugT","mhchem bug T. Please report."]}}};var wn=function(r){let e=r.data,t=e.expression,a=e.options,n=r.header;n.warnings=[],a.strict=="warn"&&(a.strict=(l,h)=>{n.warnings.push(`katex: LaTeX-incompatible input and strict mode is set to 'warn': ${h} [${l}]`)});let s=oe.renderToString(t,a);et({header:n,data:{output:s}})};Wt(wn);})(); diff --git a/internal/warpc/js/renderkatex.js b/internal/warpc/js/renderkatex.js index dc4cb4025..7c8ac25ee 100644 --- a/internal/warpc/js/renderkatex.js +++ b/internal/warpc/js/renderkatex.js @@ -7,6 +7,16 @@ const render = function (input) { const expression = data.expression; const options = data.options; const header = input.header; + header.warnings = []; + + if (options.strict == 'warn') { + // By default, KaTeX will write to console.warn, that's a little hard to handle. + options.strict = (errorCode, errorMsg) => { + header.warnings.push( + `katex: LaTeX-incompatible input and strict mode is set to 'warn': ${errorMsg} [${errorCode}]`, + ); + }; + } // Any error thrown here will be caught by the common.js readInput function. const output = katex.renderToString(expression, options); writeOutput({ header: header, data: { output: output } }); diff --git a/internal/warpc/warpc.go b/internal/warpc/warpc.go index f2dfc6244..e21fefa8a 100644 --- a/internal/warpc/warpc.go +++ b/internal/warpc/warpc.go @@ -51,6 +51,9 @@ type Header struct { // Set in the response if there was an error. Err string `json:"err"` + + // Warnings is a list of warnings that may be returned in the response. + Warnings []string `json:"warnings,omitempty"` } type Message[T any] struct { @@ -155,6 +158,7 @@ func (p *dispatcherPool[Q, R]) Execute(ctx context.Context, q Message[Q]) (Messa } resp, err := call.response, p.Err() + if err == nil && resp.Header.Err != "" { err = errors.New(resp.Header.Err) } @@ -270,6 +274,8 @@ type Options struct { Infof func(format string, v ...any) + Warnf func(format string, v ...any) + // E.g. quickjs wasm. May be omitted if not needed. Runtime Binary @@ -325,6 +331,7 @@ type dispatcherPool[Q, R any] struct { counter atomic.Uint32 dispatchers []*dispatcher[Q, R] close func() error + opts Options errc chan error donec chan struct{} @@ -355,6 +362,11 @@ func newDispatcher[Q, R any](opts Options) (*dispatcherPool[Q, R], error) { // noop } } + if opts.Warnf == nil { + opts.Warnf = func(format string, v ...any) { + // noop + } + } if opts.Memory <= 0 { // 32 MiB @@ -466,6 +478,7 @@ func newDispatcher[Q, R any](opts Options) (*dispatcherPool[Q, R], error) { dp := &dispatcherPool[Q, R]{ dispatchers: make([]*dispatcher[Q, R], len(inOuts)), + opts: opts, errc: make(chan error, 10), donec: make(chan struct{}), diff --git a/internal/warpc/wasm/greet.wasm b/internal/warpc/wasm/greet.wasm index 12456ae8b65847dbd15db9487ae668f943b98e68..944199b407d72a724a4d62b38fba0b0fd6a4929f 100644 GIT binary patch delta 1229 zcmYjO3s6*57(VCTySuROg&H1<$V22&K#K$mrLnt06K$g;B4NlrU}ZselVxEF#swPz zi^0~54G^=20hwl#phyy;1_*<}2qbhXxt+V!tLW-HE#4`kv6$H{%au>cecnwiv9lWZ5Vi$D^LT#RUy4K@&+CSt)vxynFo+#Vu(QCi82@&NqB9=(WmqfYJDz& zLMjF|njpx0BFK$~0-Y=s3v@6gp{P_wM}cuFAg7U?gqJge>L92N+uT2cHoK87y^FLG z&W?6~#s`227=AXw28_@qXWABMk|G&&Z~%DlGXhbYKhilgVGv3AQyS510Biy@I{+E% z|65r9w%Cjrq)eg85A&#UU~8hY0d!=eUGL%$gERp4;ty~%SU-#G zql^3~>*N%$2p+;g2_Kx{tSS%mv(_YW3a$6nivGc7;B728Smm;U@msjR+hprX=QqFqYp!J}T-P$_r9=hD& zS5$Z|B5G28gSl}0d+%Bv(7L>~wqfT!wY8*7d)55nd%H9#Z5*C8np=N`Wt@7Q|K!t1 zSChVHASA42#SoY%AE@p5^1CGI%$P`cVdIC0T$iDb%B+#q^Ar8|?v+H;+;4q+WWK-Y zk|N-x__}>`^>|_24#lS475>i6{e0#WCb)m~p|Ldfz;b(Cf$V(vvT^@6`kR3bv!CP? zmo}(7V(c5v1UM&N$gVG5`r^#;?fA&i?w%J+Gn#$76B;v#mZ%ohPW`0v*06oO)G{^U zo1m2KZt_pPT>k9PQ)vP_rnsQ^@u{RaZW`xe`*!WQ@r|M_lUl{5?;nMYjCf-*dy}88 zOSC_cy5}tW_)nu@t?egoX|6NAP0)lN^>{zvk?5VIQQ6LfFm;tVqdt1|uk$1M^TFQv zhSIFBrYi>$WS(bzx{7KFZdOz#J}41Z$BZ@YZ}Qn&8Ov|h_f3e#Qy#^IlwYR5`u6D& zGPCln7$1R7+c6s`Z|LnmnH>8|Z%DHx;z@I0=i*dFcUwm0fyR74Cr7ix_CU$8rH8^_ SkKXz1pe}sq&Gfi&I`KCcDS_Jn delta 1102 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 XH^H#Yx0F3vWx`TvHtv5quR|K*xD*(4 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 z%0D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 diff --git a/tpl/transform/transform.go b/tpl/transform/transform.go index e8765bace..380ea252b 100644 --- a/tpl/transform/transform.go +++ b/tpl/transform/transform.go @@ -17,6 +17,7 @@ package transform import ( "bytes" "context" + "encoding/json" "encoding/xml" "errors" "fmt" @@ -252,8 +253,16 @@ func (ns *Namespace) ToMath(ctx context.Context, args ...any) (template.HTML, er return "", fmt.Errorf("invalid strict mode; expected one of error, ignore, or warn; received %s", katexInput.Options.Strict) } + type fileCacheEntry struct { + Version string `json:"version"` + Output string `json:"output"` + Warnings []string `json:"warnings,omitempty"` + } + + const fileCacheEntryVersion = "v1" // Increment on incompatible changes. + s := hashing.HashString(args...) - key := "tomath/" + s[:2] + "/" + s[2:] + key := "tomath/" + fileCacheEntryVersion + "/" + s[:2] + "/" + s[2:] fileCache := ns.deps.ResourceSpec.FileCaches.MiscCache() v, err := ns.cacheMath.GetOrCreate(key, func(string) (template.HTML, error) { @@ -274,15 +283,35 @@ func (ns *Namespace) ToMath(ctx context.Context, args ...any) (template.HTML, er if err != nil { return nil, err } - return hugio.NewReadSeekerNoOpCloserFromString(result.Data.Output), nil + + e := fileCacheEntry{ + Version: fileCacheEntryVersion, + Output: result.Data.Output, + Warnings: result.Header.Warnings, + } + + buf := &bytes.Buffer{} + enc := json.NewEncoder(buf) + enc.SetEscapeHTML(false) + if err := enc.Encode(e); err != nil { + return nil, fmt.Errorf("failed to encode file cache entry: %w", err) + } + return hugio.NewReadSeekerNoOpCloserFromBytes(buf.Bytes()), nil }) if err != nil { return "", err } - s, err := hugio.ReadString(r) + var e fileCacheEntry + if err := json.NewDecoder(r).Decode(&e); err != nil { + return "", fmt.Errorf("failed to decode file cache entry: %w", err) + } - return template.HTML(s), err + for _, warning := range e.Warnings { + ns.deps.Log.Warnf("transform.ToMath: %s", warning) + } + + return template.HTML(e.Output), err }) if err != nil { return "", err diff --git a/tpl/transform/transform_integration_test.go b/tpl/transform/transform_integration_test.go index 298097879..8197b3e3d 100644 --- a/tpl/transform/transform_integration_test.go +++ b/tpl/transform/transform_integration_test.go @@ -525,11 +525,10 @@ disableKinds = ['page','rss','section','sitemap','taxonomy','term'] b.AssertFileContent("public/index.html", `a %`) // strict: warn - // TODO: see https://github.com/gohugoio/hugo/issues/13735 - // f = strings.ReplaceAll(files, "dict", `(dict "strict" "warn")`) - // b = hugolib.Test(t, f, hugolib.TestOptWarn()) - // b.AssertLogMatches("[commentAtEnd]") - // b.AssertFileContent("public/index.html", `a %`) + f = strings.ReplaceAll(files, "dict", `(dict "strict" "warn")`) + b = hugolib.Test(t, f, hugolib.TestOptWarn()) + b.AssertLogMatches("[commentAtEnd]") + b.AssertFileContent("public/index.html", `a %`) // strict mode: invalid value f = strings.ReplaceAll(files, "dict", `(dict "strict" "foo")`) From 5273a884d408f0037473d930968555de60eef033 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Sat, 31 May 2025 10:06:13 +0200 Subject: [PATCH 103/129] Fix language handling in shortcode templates Fixes #13767 --- common/paths/pathparser.go | 27 +++++++++------- common/paths/pathparser_test.go | 23 ++++++++++---- tpl/tplimpl/shortcodes_integration_test.go | 37 ++++++++++++++++++++++ 3 files changed, 70 insertions(+), 17 deletions(-) diff --git a/common/paths/pathparser.go b/common/paths/pathparser.go index d10523a84..1cae710e8 100644 --- a/common/paths/pathparser.go +++ b/common/paths/pathparser.go @@ -120,7 +120,7 @@ func (pp *PathParser) parse(component, s string) (*Path, error) { return p, nil } -func (pp *PathParser) parseIdentifier(component, s string, p *Path, i, lastDot, numDots int) { +func (pp *PathParser) parseIdentifier(component, s string, p *Path, i, lastDot, numDots int, isLast bool) { if p.posContainerHigh != -1 { return } @@ -128,7 +128,12 @@ func (pp *PathParser) parseIdentifier(component, s string, p *Path, i, lastDot, mayHaveLang = mayHaveLang && (component == files.ComponentFolderContent || component == files.ComponentFolderLayouts) mayHaveOutputFormat := component == files.ComponentFolderLayouts mayHaveKind := p.posIdentifierKind == -1 && mayHaveOutputFormat - mayHaveLayout := component == files.ComponentFolderLayouts + var mayHaveLayout bool + if p.pathType == TypeShortcode { + mayHaveLayout = !isLast && component == files.ComponentFolderLayouts + } else { + mayHaveLayout = component == files.ComponentFolderLayouts + } var found bool var high int @@ -235,19 +240,22 @@ func (pp *PathParser) doParse(component, s string, p *Path) (*Path, error) { lastDot := 0 lastSlashIdx := strings.LastIndex(s, "/") numDots := strings.Count(s[lastSlashIdx+1:], ".") + if strings.Contains(s, "/_shortcodes/") { + p.pathType = TypeShortcode + } for i := len(s) - 1; i >= 0; i-- { c := s[i] switch c { case '.': - pp.parseIdentifier(component, s, p, i, lastDot, numDots) + pp.parseIdentifier(component, s, p, i, lastDot, numDots, false) lastDot = i case '/': slashCount++ if p.posContainerHigh == -1 { if lastDot > 0 { - pp.parseIdentifier(component, s, p, i, lastDot, numDots) + pp.parseIdentifier(component, s, p, i, lastDot, numDots, true) } p.posContainerHigh = i + 1 } else if p.posContainerLow == -1 { @@ -283,10 +291,9 @@ func (pp *PathParser) doParse(component, s string, p *Path) (*Path, error) { p.pathType = TypeContentData } } - } - if component == files.ComponentFolderLayouts { + if p.pathType < TypeMarkup && component == files.ComponentFolderLayouts { if p.posIdentifierBaseof != -1 { p.pathType = TypeBaseof } else { @@ -302,12 +309,10 @@ func (pp *PathParser) doParse(component, s string, p *Path) (*Path, error) { } if p.pathType == TypeShortcode && p.posIdentifierLayout != -1 { - // myshortcode or myshortcode.html, no layout. - if len(p.identifiersKnown) <= 2 { + id := p.identifiersKnown[p.posIdentifierLayout] + if id.Low == p.posContainerHigh { + // First identifier is shortcode name. p.posIdentifierLayout = -1 - } else { - // First is always the name. - p.posIdentifierLayout-- } } diff --git a/common/paths/pathparser_test.go b/common/paths/pathparser_test.go index ad76b9367..b1734aef2 100644 --- a/common/paths/pathparser_test.go +++ b/common/paths/pathparser_test.go @@ -434,12 +434,12 @@ func TestParseLayouts(t *testing.T) { }, { "Layout multiple", - "/maylayout.list.section.no.html", + "/mylayout.list.section.no.html", func(c *qt.C, p *Path) { - c.Assert(p.Layout(), qt.Equals, "maylayout") - c.Assert(p.Identifiers(), qt.DeepEquals, []string{"html", "no", "section", "list", "maylayout"}) + c.Assert(p.Layout(), qt.Equals, "mylayout") + c.Assert(p.Identifiers(), qt.DeepEquals, []string{"html", "no", "section", "list", "mylayout"}) c.Assert(p.IdentifiersUnknown(), qt.DeepEquals, []string{}) - c.Assert(p.Base(), qt.Equals, "/maylayout.html") + c.Assert(p.Base(), qt.Equals, "/mylayout.html") c.Assert(p.Lang(), qt.Equals, "no") }, }, @@ -487,7 +487,8 @@ func TestParseLayouts(t *testing.T) { func(c *qt.C, p *Path) { c.Assert(p.Base(), qt.Equals, "/_shortcodes/myshortcode.html") c.Assert(p.Type(), qt.Equals, TypeShortcode) - c.Assert(p.Identifiers(), qt.DeepEquals, []string{"html", "list", "myshortcode"}) + c.Assert(p.Identifiers(), qt.DeepEquals, []string{"html", "list"}) + c.Assert(p.Layout(), qt.Equals, "list") c.Assert(p.PathNoIdentifier(), qt.Equals, "/_shortcodes/myshortcode") c.Assert(p.PathBeforeLangAndOutputFormatAndExt(), qt.Equals, "/_shortcodes/myshortcode.list") c.Assert(p.Lang(), qt.Equals, "") @@ -572,11 +573,21 @@ func TestParseLayouts(t *testing.T) { c.Assert(p.NameNoIdentifier(), qt.Equals, "no") }, }, + { + "Shortcode lang layout", + "/_shortcodes/myshortcode.no.html", + func(c *qt.C, p *Path) { + c.Assert(p.Type(), qt.Equals, TypeShortcode) + c.Assert(p.Lang(), qt.Equals, "no") + c.Assert(p.Layout(), qt.Equals, "") + c.Assert(p.NameNoIdentifier(), qt.Equals, "myshortcode") + }, + }, } for _, test := range tests { c.Run(test.name, func(c *qt.C) { - if test.name != "Shortcode lang in root" { + if test.name != "Shortcode lang layout" { // return } test.assert(c, testParser.Parse(files.ComponentFolderLayouts, test.path)) diff --git a/tpl/tplimpl/shortcodes_integration_test.go b/tpl/tplimpl/shortcodes_integration_test.go index 275e8cc15..86f6007ca 100644 --- a/tpl/tplimpl/shortcodes_integration_test.go +++ b/tpl/tplimpl/shortcodes_integration_test.go @@ -757,3 +757,40 @@ title: home b.AssertFileContent("public/index.html", "de.html") } + +func TestShortcodeLanguage13767(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +defaultContentLanguage = 'pl' +defaultContentLanguageInSubdir = true +[languages.pl] +weight = 1 +[languages.en] +weight = 2 +-- content/_index.md -- +--- +title: dom +--- +{{< myshortcode >}} +-- content/_index.en.md -- +--- +title: home +--- +{{< myshortcode >}} +-- layouts/_shortcodes/myshortcode.html -- +myshortcode.html +-- layouts/_shortcodes/myshortcode.en.html -- +myshortcode.en.html +-- layouts/all.html -- +{{ .Content }} + + +` + + b := hugolib.Test(t, files) + + b.AssertFileContent("public/pl/index.html", "myshortcode.html") + b.AssertFileContent("public/en/index.html", "myshortcode.en.html") +} From 189453612e4bedc4f27495a7b1145321c8d89807 Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Sat, 31 May 2025 12:41:12 +0000 Subject: [PATCH 104/129] releaser: Bump versions for release of 0.147.7 [ci skip] --- common/hugo/version_current.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/common/hugo/version_current.go b/common/hugo/version_current.go index ba367ceb5..4a6faefee 100644 --- a/common/hugo/version_current.go +++ b/common/hugo/version_current.go @@ -17,7 +17,7 @@ package hugo // This should be the only one. var CurrentVersion = Version{ Major: 0, - Minor: 148, - PatchLevel: 0, - Suffix: "-DEV", + Minor: 147, + PatchLevel: 7, + Suffix: "", } From 32af02cd3ea8794b129232b4a30f95562ab5572c Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Sat, 31 May 2025 12:55:24 +0000 Subject: [PATCH 105/129] releaser: Prepare repository for 0.148.0-DEV [ci skip] --- common/hugo/version_current.go | 6 +++--- hugoreleaser.env | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/common/hugo/version_current.go b/common/hugo/version_current.go index 4a6faefee..ba367ceb5 100644 --- a/common/hugo/version_current.go +++ b/common/hugo/version_current.go @@ -17,7 +17,7 @@ package hugo // This should be the only one. var CurrentVersion = Version{ Major: 0, - Minor: 147, - PatchLevel: 7, - Suffix: "", + Minor: 148, + PatchLevel: 0, + Suffix: "-DEV", } diff --git a/hugoreleaser.env b/hugoreleaser.env index 46cd6ee93..6d0f1d69f 100644 --- a/hugoreleaser.env +++ b/hugoreleaser.env @@ -1,7 +1,8 @@ # Release env. # These will be replaced by script before release. -HUGORELEASER_TAG=v0.147.6 -HUGORELEASER_COMMITISH=0a5fd8ebb8e2ca798515e8c564c14e32db3b4127 +HUGORELEASER_TAG=v0.147.7 +HUGORELEASER_COMMITISH=189453612e4bedc4f27495a7b1145321c8d89807 + From 32eb1a8ad4f293150232f4fb0478ae762c839d5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Mon, 2 Jun 2025 12:44:06 +0200 Subject: [PATCH 106/129] all: Replace _build with build in tests _build is deprecated and now shows up as warning. --- hugolib/cascade_test.go | 2 +- hugolib/disableKinds_test.go | 14 +++++++------- hugolib/params_test.go | 5 ++--- hugolib/site_test.go | 2 +- resources/page/pagemeta/pagemeta_test.go | 4 ++-- 5 files changed, 13 insertions(+), 14 deletions(-) diff --git a/hugolib/cascade_test.go b/hugolib/cascade_test.go index 10b47764f..fb9dffd15 100644 --- a/hugolib/cascade_test.go +++ b/hugolib/cascade_test.go @@ -892,7 +892,7 @@ disableKinds = ['home','rss','sitemap','taxonomy','term'] --- title: s cascade: - _build: + build: render: never --- -- content/s/p1.md -- diff --git a/hugolib/disableKinds_test.go b/hugolib/disableKinds_test.go index 8262f562a..4dc476fc9 100644 --- a/hugolib/disableKinds_test.go +++ b/hugolib/disableKinds_test.go @@ -44,14 +44,14 @@ tags: ["mytag"] `, "sect/no-list.md", ` --- title: No List -_build: +build: list: false --- `, "sect/no-render.md", ` --- title: No List -_build: +build: render: false --- `, @@ -59,14 +59,14 @@ _build: --- title: No Render Link aliases: ["/link-alias"] -_build: +build: render: link --- `, "sect/no-publishresources/index.md", ` --- title: No Publish Resources -_build: +build: publishResources: false --- @@ -81,7 +81,7 @@ headless: true --- title: Headless Local Lists cascade: - _build: + build: render: false list: local publishResources: false @@ -365,7 +365,7 @@ Data1: {{ $data1.RelPermalink }} `) b.WithContent("section/bundle-false/index.md", `---\ntitle: BundleFalse -_build: +build: publishResources: false ---`, "section/bundle-false/data1.json", "Some data1", @@ -388,7 +388,7 @@ func TestNoRenderAndNoPublishResources(t *testing.T) { noRenderPage := ` --- title: %s -_build: +build: render: false publishResources: false --- diff --git a/hugolib/params_test.go b/hugolib/params_test.go index cbcc8e540..ed8aa37bc 100644 --- a/hugolib/params_test.go +++ b/hugolib/params_test.go @@ -57,7 +57,7 @@ Summary: {{ .Summary }}| ) } -func TestFrontMatterParamsKindPath(t *testing.T) { +func TestFrontMatterParamsPath(t *testing.T) { t.Parallel() files := ` @@ -72,10 +72,9 @@ date: 2019-08-07 path: "/a/b/c" slug: "s1" --- --- content/mysection.md -- +-- content/mysection/_index.md -- --- title: "My Section" -kind: "section" date: 2022-08-07 path: "/a/b" --- diff --git a/hugolib/site_test.go b/hugolib/site_test.go index 4d68602e5..199c878cd 100644 --- a/hugolib/site_test.go +++ b/hugolib/site_test.go @@ -615,7 +615,7 @@ var weightedPage5 = `+++ weight = "5" title = "Five" -[_build] +[build] render = "never" +++ Front Matter with Ordered Pages 5` diff --git a/resources/page/pagemeta/pagemeta_test.go b/resources/page/pagemeta/pagemeta_test.go index eef16ef03..f205c74f8 100644 --- a/resources/page/pagemeta/pagemeta_test.go +++ b/resources/page/pagemeta/pagemeta_test.go @@ -31,7 +31,7 @@ func TestDecodeBuildConfig(t *testing.T) { c := qt.New(t) configTempl := ` -[_build] +[build] render = %s list = %s publishResources = true` @@ -82,7 +82,7 @@ publishResources = true` } { cfg, err := config.FromConfigString(fmt.Sprintf(configTempl, test.args...), "toml") c.Assert(err, qt.IsNil) - bcfg, err := DecodeBuildConfig(cfg.Get("_build")) + bcfg, err := DecodeBuildConfig(cfg.Get("build")) c.Assert(err, qt.IsNil) eq := qt.CmpEquals(hqt.DeepAllowUnexported(BuildConfig{})) From cc7bfeea32d7bb4ba519e199a991ecc20f8afeb2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 30 May 2025 08:45:56 +0000 Subject: [PATCH 107/129] build(deps): bump github.com/tdewolff/minify/v2 from 2.23.5 to 2.23.8 Bumps [github.com/tdewolff/minify/v2](https://github.com/tdewolff/minify) from 2.23.5 to 2.23.8. - [Release notes](https://github.com/tdewolff/minify/releases) - [Commits](https://github.com/tdewolff/minify/compare/v2.23.5...v2.23.8) --- updated-dependencies: - dependency-name: github.com/tdewolff/minify/v2 dependency-version: 2.23.8 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 4c0623354..4619f42e1 100644 --- a/go.mod +++ b/go.mod @@ -66,8 +66,8 @@ require ( github.com/spf13/cobra v1.9.1 github.com/spf13/fsync v0.10.1 github.com/spf13/pflag v1.0.6 - github.com/tdewolff/minify/v2 v2.23.5 - github.com/tdewolff/parse/v2 v2.8.0 + github.com/tdewolff/minify/v2 v2.23.8 + github.com/tdewolff/parse/v2 v2.8.1 github.com/tetratelabs/wazero v1.9.0 github.com/yuin/goldmark v1.7.11 github.com/yuin/goldmark-emoji v1.0.6 diff --git a/go.sum b/go.sum index 3fb6d320f..1070d6b4b 100644 --- a/go.sum +++ b/go.sum @@ -455,10 +455,10 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/tdewolff/minify/v2 v2.23.5 h1:/P548KcpTkIOUvNg22zN83/GiaYSOIrbqtoue4I7kYM= -github.com/tdewolff/minify/v2 v2.23.5/go.mod h1:2RI9tiIrzJU1Z5EasXEPaI1MqobRyxKHOOgrRkq5oEw= -github.com/tdewolff/parse/v2 v2.8.0 h1:jW0afj6zpUGXuZTwJ7/UfP2SddyLalb/SDryjaMTkA4= -github.com/tdewolff/parse/v2 v2.8.0/go.mod h1:Hwlni2tiVNKyzR1o6nUs4FOF07URA+JLBLd6dlIXYqo= +github.com/tdewolff/minify/v2 v2.23.8 h1:tvjHzRer46kwOfpdCBCWsDblCw3QtnLJRd61pTVkyZ8= +github.com/tdewolff/minify/v2 v2.23.8/go.mod h1:VW3ISUd3gDOZuQ/jwZr4sCzsuX+Qvsx87FDMjk6Rvno= +github.com/tdewolff/parse/v2 v2.8.1 h1:J5GSHru6o3jF1uLlEKVXkDxxcVx6yzOlIVIotK4w2po= +github.com/tdewolff/parse/v2 v2.8.1/go.mod h1:Hwlni2tiVNKyzR1o6nUs4FOF07URA+JLBLd6dlIXYqo= github.com/tdewolff/test v1.0.11 h1:FdLbwQVHxqG16SlkGveC0JVyrJN62COWTRyUFzfbtBE= github.com/tdewolff/test v1.0.11/go.mod h1:XPuWBzvdUzhCuxWO1ojpXsyzsA5bFoS3tO/Q3kFuTG8= github.com/tetratelabs/wazero v1.9.0 h1:IcZ56OuxrtaEz8UYNRHBrUa9bYeX9oVY93KspZZBf/I= From e333836f49ed78f657b2b67679b04499a25a1bf1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Jun 2025 14:37:36 +0000 Subject: [PATCH 108/129] build(deps): bump github.com/yuin/goldmark from 1.7.11 to 1.7.12 Bumps [github.com/yuin/goldmark](https://github.com/yuin/goldmark) from 1.7.11 to 1.7.12. - [Release notes](https://github.com/yuin/goldmark/releases) - [Commits](https://github.com/yuin/goldmark/compare/v1.7.11...v1.7.12) --- updated-dependencies: - dependency-name: github.com/yuin/goldmark dependency-version: 1.7.12 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 4619f42e1..47f4ab099 100644 --- a/go.mod +++ b/go.mod @@ -69,7 +69,7 @@ require ( github.com/tdewolff/minify/v2 v2.23.8 github.com/tdewolff/parse/v2 v2.8.1 github.com/tetratelabs/wazero v1.9.0 - github.com/yuin/goldmark v1.7.11 + github.com/yuin/goldmark v1.7.12 github.com/yuin/goldmark-emoji v1.0.6 go.uber.org/automaxprocs v1.5.3 gocloud.dev v0.40.0 diff --git a/go.sum b/go.sum index 1070d6b4b..2fb7b5b6b 100644 --- a/go.sum +++ b/go.sum @@ -471,8 +471,8 @@ github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/yuin/goldmark v1.7.11 h1:ZCxLyDMtz0nT2HFfsYG8WZ47Trip2+JyLysKcMYE5bo= -github.com/yuin/goldmark v1.7.11/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= +github.com/yuin/goldmark v1.7.12 h1:YwGP/rrea2/CnCtUHgjuolG/PnMxdQtPMO5PvaE2/nY= +github.com/yuin/goldmark v1.7.12/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= github.com/yuin/goldmark-emoji v1.0.6 h1:QWfF2FYaXwL74tfGOW5izeiZepUDroDJfWubQI9HTHs= github.com/yuin/goldmark-emoji v1.0.6/go.mod h1:ukxJDKFpdFb5x0a5HqbdlcKtebh086iJpI31LTKmWuA= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= From 54065b7ef8199d39f1451e9cf878322b896e4bcf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Jun 2025 14:38:21 +0000 Subject: [PATCH 109/129] build(deps): bump golang.org/x/net from 0.39.0 to 0.40.0 Bumps [golang.org/x/net](https://github.com/golang/net) from 0.39.0 to 0.40.0. - [Commits](https://github.com/golang/net/compare/v0.39.0...v0.40.0) --- updated-dependencies: - dependency-name: golang.org/x/net dependency-version: 0.40.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 6 +++--- go.sum | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index 47f4ab099..501e09830 100644 --- a/go.mod +++ b/go.mod @@ -76,7 +76,7 @@ require ( golang.org/x/exp v0.0.0-20221031165847-c99f073a8326 golang.org/x/image v0.27.0 golang.org/x/mod v0.24.0 - golang.org/x/net v0.39.0 + golang.org/x/net v0.40.0 golang.org/x/sync v0.14.0 golang.org/x/text v0.25.0 golang.org/x/tools v0.32.0 @@ -159,9 +159,9 @@ require ( go.opentelemetry.io/otel v1.34.0 // indirect go.opentelemetry.io/otel/metric v1.34.0 // indirect go.opentelemetry.io/otel/trace v1.34.0 // indirect - golang.org/x/crypto v0.37.0 // indirect + golang.org/x/crypto v0.38.0 // indirect golang.org/x/oauth2 v0.26.0 // indirect - golang.org/x/sys v0.32.0 // indirect + golang.org/x/sys v0.33.0 // indirect golang.org/x/time v0.10.0 // indirect golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9 // indirect google.golang.org/genproto v0.0.0-20241104194629-dd2ea8efbc28 // indirect diff --git a/go.sum b/go.sum index 2fb7b5b6b..13e8756d4 100644 --- a/go.sum +++ b/go.sum @@ -514,8 +514,8 @@ golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= -golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE= -golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc= +golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8= +golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -600,8 +600,8 @@ golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= -golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY= -golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E= +golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY= +golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -677,8 +677,8 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20= -golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= +golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= From 7a4a4790e53848747bc7717ea08f2c9b7684d1f8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 3 Jun 2025 08:08:36 +0000 Subject: [PATCH 110/129] build(deps): bump github.com/niklasfasching/go-org from 1.7.0 to 1.8.0 Bumps [github.com/niklasfasching/go-org](https://github.com/niklasfasching/go-org) from 1.7.0 to 1.8.0. - [Commits](https://github.com/niklasfasching/go-org/compare/v1.7.0...v1.8.0) --- updated-dependencies: - dependency-name: github.com/niklasfasching/go-org dependency-version: 1.8.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 501e09830..e905899e6 100644 --- a/go.mod +++ b/go.mod @@ -54,7 +54,7 @@ require ( github.com/mattn/go-isatty v0.0.20 github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c github.com/muesli/smartcrop v0.3.0 - github.com/niklasfasching/go-org v1.7.0 + github.com/niklasfasching/go-org v1.8.0 github.com/olekukonko/tablewriter v1.0.7 github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 github.com/pelletier/go-toml/v2 v2.2.4 diff --git a/go.sum b/go.sum index 13e8756d4..c489aa9b2 100644 --- a/go.sum +++ b/go.sum @@ -388,8 +388,8 @@ github.com/muesli/smartcrop v0.3.0/go.mod h1:i2fCI/UorTfgEpPPLWiFBv4pye+YAG78Rwc github.com/neurosnap/sentences v1.0.6/go.mod h1:pg1IapvYpWCJJm/Etxeh0+gtMf1rI1STY9S7eUCPbDc= github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ= github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= -github.com/niklasfasching/go-org v1.7.0 h1:vyMdcMWWTe/XmANk19F4k8XGBYg0GQ/gJGMimOjGMek= -github.com/niklasfasching/go-org v1.7.0/go.mod h1:WuVm4d45oePiE0eX25GqTDQIt/qPW1T9DGkRscqLW5o= +github.com/niklasfasching/go-org v1.8.0 h1:WyGLaajLLp8JbQzkmapZ1y0MOzKuKV47HkZRloi+HGY= +github.com/niklasfasching/go-org v1.8.0/go.mod h1:e2A9zJs7cdONrEGs3gvxCcaAEpwwPNPG7csDpXckMNg= github.com/oasdiff/yaml v0.0.0-20250309154309-f31be36b4037 h1:G7ERwszslrBzRxj//JalHPu/3yz+De2J+4aLtSRlHiY= github.com/oasdiff/yaml v0.0.0-20250309154309-f31be36b4037/go.mod h1:2bpvgLBZEtENV5scfDFEtB/5+1M4hkQhDQrccEJ/qGw= github.com/oasdiff/yaml3 v0.0.0-20250309153720-d2182401db90 h1:bQx3WeLcUWy+RletIKwUIt4x3t8n2SxavmoclizMb8c= From 21a4a9acd7ed54a9d5c990add59a27719e7c8a22 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 3 Jun 2025 08:08:29 +0000 Subject: [PATCH 111/129] build(deps): bump github.com/evanw/esbuild from 0.25.3 to 0.25.5 Bumps [github.com/evanw/esbuild](https://github.com/evanw/esbuild) from 0.25.3 to 0.25.5. - [Release notes](https://github.com/evanw/esbuild/releases) - [Changelog](https://github.com/evanw/esbuild/blob/main/CHANGELOG.md) - [Commits](https://github.com/evanw/esbuild/compare/v0.25.3...v0.25.5) --- updated-dependencies: - dependency-name: github.com/evanw/esbuild dependency-version: 0.25.5 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index e905899e6..ebc188f08 100644 --- a/go.mod +++ b/go.mod @@ -26,7 +26,7 @@ require ( github.com/clbanning/mxj/v2 v2.7.0 github.com/disintegration/gift v1.2.1 github.com/dustin/go-humanize v1.0.1 - github.com/evanw/esbuild v0.25.3 + github.com/evanw/esbuild v0.25.5 github.com/fatih/color v1.18.0 github.com/fortytw2/leaktest v1.3.0 github.com/frankban/quicktest v1.14.6 diff --git a/go.sum b/go.sum index c489aa9b2..fe4bf5dcc 100644 --- a/go.sum +++ b/go.sum @@ -186,8 +186,8 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/evanw/esbuild v0.25.3 h1:4JKyUsm/nHDhpxis4IyWXAi8GiyTwG1WdEp6OhGVE8U= -github.com/evanw/esbuild v0.25.3/go.mod h1:D2vIQZqV/vIf/VRHtViaUtViZmG7o+kKmlBfVQuRi48= +github.com/evanw/esbuild v0.25.5 h1:E+JpeY5S/1LFmnX1vtuZqUKT7qDVcfXdhzMhM3uIKFs= +github.com/evanw/esbuild v0.25.5/go.mod h1:D2vIQZqV/vIf/VRHtViaUtViZmG7o+kKmlBfVQuRi48= github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= From f37412a575f74f8cf9b5ba98b3cd6f9a892263cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Wed, 4 Jun 2025 16:52:17 +0200 Subject: [PATCH 112/129] dockerfile: Update Go version FIxes #13780 --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 6d1bf78c4..6f3a70f16 100755 --- a/Dockerfile +++ b/Dockerfile @@ -2,7 +2,7 @@ # Twitter: https://twitter.com/gohugoio # Website: https://gohugo.io/ -ARG GO_VERSION="1.23.2" +ARG GO_VERSION="1.24.0" ARG ALPINE_VERSION="3.20" ARG DART_SASS_VERSION="1.79.3" From 8e61f1fe1273a933de7276e7720eb458adcdd116 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Fri, 6 Jun 2025 08:16:30 +0200 Subject: [PATCH 113/129] dockerfile: Update Alpine Closes #13783 --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 6f3a70f16..e35fd4958 100755 --- a/Dockerfile +++ b/Dockerfile @@ -3,7 +3,7 @@ # Website: https://gohugo.io/ ARG GO_VERSION="1.24.0" -ARG ALPINE_VERSION="3.20" +ARG ALPINE_VERSION="3.22" ARG DART_SASS_VERSION="1.79.3" FROM --platform=$BUILDPLATFORM tonistiigi/xx:1.5.0 AS xx From 01241d5dc9b5781e7dd73fa20bf8f9a372dd99de Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Fri, 6 Jun 2025 13:21:41 -0700 Subject: [PATCH 114/129] hugolib: Emit ignorable warning when home page is a leaf bundle Closes #13538 --- Dockerfile | 6 +++--- common/constants/constants.go | 1 + hugolib/page__new.go | 9 +++++++++ hugolib/page_test.go | 32 ++++++++++++++++++++++++++++++++ 4 files changed, 45 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index e35fd4958..a0e34353f 100755 --- a/Dockerfile +++ b/Dockerfile @@ -2,7 +2,7 @@ # Twitter: https://twitter.com/gohugoio # Website: https://gohugo.io/ -ARG GO_VERSION="1.24.0" +ARG GO_VERSION="1.24" ARG ALPINE_VERSION="3.22" ARG DART_SASS_VERSION="1.79.3" @@ -19,7 +19,7 @@ RUN apk add clang lld COPY --from=xx / / ARG TARGETPLATFORM -RUN xx-apk add musl-dev gcc g++ +RUN xx-apk add musl-dev gcc g++ # Optionally set HUGO_BUILD_TAGS to "none" or "withdeploy" when building like so: # docker build --build-arg HUGO_BUILD_TAGS=withdeploy . @@ -72,7 +72,7 @@ RUN mkdir -p /var/hugo/bin /cache && \ adduser -Sg hugo -u 1000 -h /var/hugo hugo && \ chown -R hugo: /var/hugo /cache && \ # For the Hugo's Git integration to work. - runuser -u hugo -- git config --global --add safe.directory /project && \ + runuser -u hugo -- git config --global --add safe.directory /project && \ # See https://github.com/gohugoio/hugo/issues/9810 runuser -u hugo -- git config --global core.quotepath false diff --git a/common/constants/constants.go b/common/constants/constants.go index 3f48f3e4a..c7bbaa541 100644 --- a/common/constants/constants.go +++ b/common/constants/constants.go @@ -24,6 +24,7 @@ const ( WarnRenderShortcodesInHTML = "warning-rendershortcodes-in-html" WarnGoldmarkRawHTML = "warning-goldmark-raw-html" WarnPartialSuperfluousPrefix = "warning-partial-superfluous-prefix" + WarnHomePageIsLeafBundle = "warning-home-page-is-leaf-bundle" ) // Field/method names with special meaning. diff --git a/hugolib/page__new.go b/hugolib/page__new.go index 9d05abea6..80115cc72 100644 --- a/hugolib/page__new.go +++ b/hugolib/page__new.go @@ -21,6 +21,7 @@ import ( "github.com/gohugoio/hugo/hugofs/files" "github.com/gohugoio/hugo/resources" + "github.com/gohugoio/hugo/common/constants" "github.com/gohugoio/hugo/common/maps" "github.com/gohugoio/hugo/common/paths" @@ -39,6 +40,14 @@ func (h *HugoSites) newPage(m *pageMeta) (*pageState, *paths.Path, error) { // Make sure that any partially created page part is marked as stale. m.MarkStale() } + + if p != nil && pth != nil && p.IsHome() && pth.IsLeafBundle() { + msg := "Using %s in your content's root directory is usually incorrect for your home page. " + msg += "You should use %s instead. If you don't rename this file, your home page will be " + msg += "treated as a leaf bundle, meaning it won't be able to have any child pages or sections." + h.Log.Warnidf(constants.WarnHomePageIsLeafBundle, msg, pth.PathNoLeadingSlash(), strings.ReplaceAll(pth.PathNoLeadingSlash(), "index", "_index")) + } + return p, pth, err } diff --git a/hugolib/page_test.go b/hugolib/page_test.go index 0fec397e0..1da67e58f 100644 --- a/hugolib/page_test.go +++ b/hugolib/page_test.go @@ -1968,3 +1968,35 @@ Title: {{ .Title }} "deprecated: path in front matter was deprecated", ) } + +// Issue 13538 +func TestHomePageIsLeafBundle(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +defaultContentLanguage = 'de' +defaultContentLanguageInSubdir = true +[languages.de] +weight = 1 +[languages.en] +weight = 2 +-- layouts/all.html -- +{{ .Title }} +-- content/index.de.md -- +--- +title: home de +--- +-- content/index.en.org -- +--- +title: home en +--- +` + + b := Test(t, files, TestOptWarn()) + + b.AssertFileContent("public/de/index.html", "home de") + b.AssertFileContent("public/en/index.html", "home en") + b.AssertLogContains("Using index.de.md in your content's root directory is usually incorrect for your home page. You should use _index.de.md instead.") + b.AssertLogContains("Using index.en.org in your content's root directory is usually incorrect for your home page. You should use _index.en.org instead.") +} From 10da2bd765d227761641f94d713d094e88b920ae Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Sat, 7 Jun 2025 12:59:52 +0000 Subject: [PATCH 115/129] releaser: Bump versions for release of 0.147.8 [ci skip] --- common/hugo/version_current.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/common/hugo/version_current.go b/common/hugo/version_current.go index ba367ceb5..53517177e 100644 --- a/common/hugo/version_current.go +++ b/common/hugo/version_current.go @@ -17,7 +17,7 @@ package hugo // This should be the only one. var CurrentVersion = Version{ Major: 0, - Minor: 148, - PatchLevel: 0, - Suffix: "-DEV", + Minor: 147, + PatchLevel: 8, + Suffix: "", } From fad57964aa22879f697ddd2def0d304d750fa1f4 Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Sat, 7 Jun 2025 13:13:56 +0000 Subject: [PATCH 116/129] releaser: Prepare repository for 0.148.0-DEV [ci skip] --- common/hugo/version_current.go | 6 +++--- hugoreleaser.env | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/common/hugo/version_current.go b/common/hugo/version_current.go index 53517177e..ba367ceb5 100644 --- a/common/hugo/version_current.go +++ b/common/hugo/version_current.go @@ -17,7 +17,7 @@ package hugo // This should be the only one. var CurrentVersion = Version{ Major: 0, - Minor: 147, - PatchLevel: 8, - Suffix: "", + Minor: 148, + PatchLevel: 0, + Suffix: "-DEV", } diff --git a/hugoreleaser.env b/hugoreleaser.env index 6d0f1d69f..fe49380b0 100644 --- a/hugoreleaser.env +++ b/hugoreleaser.env @@ -1,7 +1,8 @@ # Release env. # These will be replaced by script before release. -HUGORELEASER_TAG=v0.147.7 -HUGORELEASER_COMMITISH=189453612e4bedc4f27495a7b1145321c8d89807 +HUGORELEASER_TAG=v0.147.8 +HUGORELEASER_COMMITISH=10da2bd765d227761641f94d713d094e88b920ae + From 4217fee4b0455dac0c711708afb27c6506fa3339 Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Sun, 8 Jun 2025 16:48:49 -0700 Subject: [PATCH 117/129] common/terminal: Enable color output on windows Closes #8209 --- common/terminal/colors.go | 5 ----- 1 file changed, 5 deletions(-) diff --git a/common/terminal/colors.go b/common/terminal/colors.go index 8aa0e1af2..fef6efce8 100644 --- a/common/terminal/colors.go +++ b/common/terminal/colors.go @@ -17,7 +17,6 @@ package terminal import ( "fmt" "os" - "runtime" "strings" isatty "github.com/mattn/go-isatty" @@ -41,10 +40,6 @@ func PrintANSIColors(f *os.File) bool { // IsTerminal return true if the file descriptor is terminal and the TERM // environment variable isn't a dumb one. func IsTerminal(f *os.File) bool { - if runtime.GOOS == "windows" { - return false - } - fd := f.Fd() return os.Getenv("TERM") != "dumb" && (isatty.IsTerminal(fd) || isatty.IsCygwinTerminal(fd)) } From b5c0383bdac0dec7e5fae22d5aa64eafe6274108 Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Tue, 10 Jun 2025 13:44:43 -0700 Subject: [PATCH 118/129] deps: Upgrade github.com/spf13/cast v1.8.0 => v1.9.2 --- go.mod | 2 +- go.sum | 4 ++-- hugolib/config_test.go | 2 +- tpl/math/math_test.go | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index ebc188f08..67e37c0e3 100644 --- a/go.mod +++ b/go.mod @@ -62,7 +62,7 @@ require ( github.com/rogpeppe/go-internal v1.14.1 github.com/sanity-io/litter v1.5.8 github.com/spf13/afero v1.14.0 - github.com/spf13/cast v1.8.0 + github.com/spf13/cast v1.9.2 github.com/spf13/cobra v1.9.1 github.com/spf13/fsync v0.10.1 github.com/spf13/pflag v1.0.6 diff --git a/go.sum b/go.sum index fe4bf5dcc..ab4b617ec 100644 --- a/go.sum +++ b/go.sum @@ -434,8 +434,8 @@ github.com/shogo82148/go-shuffle v0.0.0-20180218125048-27e6095f230d/go.mod h1:2h github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= github.com/spf13/afero v1.14.0 h1:9tH6MapGnn/j0eb0yIXiLjERO8RB6xIVZRDCX7PtqWA= github.com/spf13/afero v1.14.0/go.mod h1:acJQ8t0ohCGuMN3O+Pv0V0hgMxNYDlvdk+VTfyZmbYo= -github.com/spf13/cast v1.8.0 h1:gEN9K4b8Xws4EX0+a0reLmhq8moKn7ntRlQYgjPeCDk= -github.com/spf13/cast v1.8.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= +github.com/spf13/cast v1.9.2 h1:SsGfm7M8QOFtEzumm7UZrZdLLquNdzFYfIbEXntcFbE= +github.com/spf13/cast v1.9.2/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo= github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= github.com/spf13/fsync v0.10.1 h1:JRnB7G72b+gIBaBcpn5ibJSd7ww1iEahXSX2B8G6dSE= diff --git a/hugolib/config_test.go b/hugolib/config_test.go index 4275fb02a..635283836 100644 --- a/hugolib/config_test.go +++ b/hugolib/config_test.go @@ -1406,7 +1406,7 @@ home = ["html"] "home": {"html"}, "page": {"html"}, "rss": {"rss"}, - "section": nil, + "section": {}, "taxonomy": {"html", "rss"}, "term": {"html", "rss"}, }) diff --git a/tpl/math/math_test.go b/tpl/math/math_test.go index cc4fe31eb..228570509 100644 --- a/tpl/math/math_test.go +++ b/tpl/math/math_test.go @@ -258,7 +258,7 @@ func TestMod(t *testing.T) { {int32(3), int32(2), int64(1)}, {int64(3), int64(2), int64(1)}, {"3", "2", int64(1)}, - {"3.1", "2", false}, + {"3.1", "2", int64(1)}, {"aaa", "0", false}, {"3", "aaa", false}, } { @@ -304,7 +304,7 @@ func TestModBool(t *testing.T) { {int64(3), int64(2), false}, {"3", "3", true}, {"3", "2", false}, - {"3.1", "2", nil}, + {"3.1", "2", false}, {"aaa", "0", nil}, {"3", "aaa", nil}, } { From 4d3ebe4d21d68c22548df1b96412e7d81ae9d121 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 12 Jun 2025 08:15:10 +0000 Subject: [PATCH 119/129] build(deps): bump golang.org/x/image from 0.27.0 to 0.28.0 Bumps [golang.org/x/image](https://github.com/golang/image) from 0.27.0 to 0.28.0. - [Commits](https://github.com/golang/image/compare/v0.27.0...v0.28.0) --- updated-dependencies: - dependency-name: golang.org/x/image dependency-version: 0.28.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 10 +++++----- go.sum | 20 ++++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/go.mod b/go.mod index 67e37c0e3..01c918dc0 100644 --- a/go.mod +++ b/go.mod @@ -74,12 +74,12 @@ require ( go.uber.org/automaxprocs v1.5.3 gocloud.dev v0.40.0 golang.org/x/exp v0.0.0-20221031165847-c99f073a8326 - golang.org/x/image v0.27.0 - golang.org/x/mod v0.24.0 + golang.org/x/image v0.28.0 + golang.org/x/mod v0.25.0 golang.org/x/net v0.40.0 - golang.org/x/sync v0.14.0 - golang.org/x/text v0.25.0 - golang.org/x/tools v0.32.0 + golang.org/x/sync v0.15.0 + golang.org/x/text v0.26.0 + golang.org/x/tools v0.33.0 google.golang.org/api v0.221.0 gopkg.in/yaml.v2 v2.4.0 rsc.io/qr v0.2.0 diff --git a/go.sum b/go.sum index ab4b617ec..680d094df 100644 --- a/go.sum +++ b/go.sum @@ -531,8 +531,8 @@ golang.org/x/exp v0.0.0-20221031165847-c99f073a8326/go.mod h1:CxIveKay+FTh1D0yPZ golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20210220032944-ac19c3e999fb/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.27.0 h1:C8gA4oWU/tKkdCfYT6T2u4faJu3MeNS5O8UPWlPF61w= -golang.org/x/image v0.27.0/go.mod h1:xbdrClrAUway1MUTEZDq9mz/UpRwYAkFFNUslZtcB+g= +golang.org/x/image v0.28.0 h1:gdem5JW1OLS4FbkWgLO+7ZeFzYtL3xClb97GaUzYMFE= +golang.org/x/image v0.28.0/go.mod h1:GUJYXtnGKEUgggyzh+Vxt+AviiCcyiwpsl8iQ8MvwGY= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -559,8 +559,8 @@ golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91 golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/mod v0.24.0 h1:ZfthKaKaT4NrhGVZHO1/WDTwGES4De8KtWO0SIbNJMU= -golang.org/x/mod v0.24.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= +golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w= +golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -628,8 +628,8 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ= -golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= +golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -697,8 +697,8 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4= -golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA= +golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= +golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -756,8 +756,8 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= -golang.org/x/tools v0.32.0 h1:Q7N1vhpkQv7ybVzLFtTjvQya2ewbwNDZzUgfXGqtMWU= -golang.org/x/tools v0.32.0/go.mod h1:ZxrU41P/wAbZD8EDa6dDCa6XfpkhJ7HFMjHJXfBDu8s= +golang.org/x/tools v0.33.0 h1:4qz2S3zmRxbGIhDIAgjxvFutSvH5EfnsYrRBj0UI0bc= +golang.org/x/tools v0.33.0/go.mod h1:CIJMaWEY88juyUfo7UbgPqbC8rU2OqfAV1h2Qp0oMYI= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= From 34e83789f76bd212652e940eb8adab2895f35d9c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 13 Jun 2025 08:06:58 +0000 Subject: [PATCH 120/129] build(deps): bump github.com/aws/aws-sdk-go-v2 from 1.36.1 to 1.36.4 Bumps [github.com/aws/aws-sdk-go-v2](https://github.com/aws/aws-sdk-go-v2) from 1.36.1 to 1.36.4. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/main/changelog-template.json) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/v1.36.1...v1.36.4) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2 dependency-version: 1.36.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 01c918dc0..6535d1a12 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ require ( github.com/BurntSushi/locker v0.0.0-20171006230638-a6e239ea1c69 github.com/alecthomas/chroma/v2 v2.18.0 github.com/armon/go-radix v1.0.1-0.20221118154546-54df44f2176c - github.com/aws/aws-sdk-go-v2 v1.36.1 + github.com/aws/aws-sdk-go-v2 v1.36.4 github.com/aws/aws-sdk-go-v2/service/cloudfront v1.44.10 github.com/bep/clocks v0.5.0 github.com/bep/debounce v1.2.0 diff --git a/go.sum b/go.sum index 680d094df..2ed678f41 100644 --- a/go.sum +++ b/go.sum @@ -81,8 +81,8 @@ github.com/armon/go-radix v1.0.1-0.20221118154546-54df44f2176c h1:651/eoCRnQ7YtS github.com/armon/go-radix v1.0.1-0.20221118154546-54df44f2176c/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU= github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= -github.com/aws/aws-sdk-go-v2 v1.36.1 h1:iTDl5U6oAhkNPba0e1t1hrwAo02ZMqbrGq4k5JBWM5E= -github.com/aws/aws-sdk-go-v2 v1.36.1/go.mod h1:5PMILGVKiW32oDzjj6RU52yrNrDPUHcbZQYr1sM7qmM= +github.com/aws/aws-sdk-go-v2 v1.36.4 h1:GySzjhVvx0ERP6eyfAbAuAXLtAda5TEy19E5q5W8I9E= +github.com/aws/aws-sdk-go-v2 v1.36.4/go.mod h1:LLXuLpgzEbD766Z5ECcRmi8AzSwfZItDtmABVkRLGzg= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.3 h1:tW1/Rkad38LA15X4UQtjXZXNKsCgkshC3EbmcUmghTg= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.3/go.mod h1:UbnqO+zjqk3uIt9yCACHJ9IVNhyhOCnYk8yA19SAWrM= github.com/aws/aws-sdk-go-v2/config v1.27.27 h1:HdqgGt1OAP0HkEDDShEl0oSYa9ZZBSOmKpdpsDMdO90= From 4ef57201415e204791183582386a8f57d1c258a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Fri, 13 Jun 2025 12:17:06 +0200 Subject: [PATCH 121/129] hugolib: Remove test for deprecated future --- hugolib/params_test.go | 38 -------------------------------------- 1 file changed, 38 deletions(-) diff --git a/hugolib/params_test.go b/hugolib/params_test.go index ed8aa37bc..94b832b3e 100644 --- a/hugolib/params_test.go +++ b/hugolib/params_test.go @@ -94,44 +94,6 @@ a/b pages: {{ range $ab.RegularPages }}{{ .Path }}|{{ .RelPermalink }}|{{ end }} ) } -func TestFrontMatterParamsLang(t *testing.T) { - t.Parallel() - - files := ` --- hugo.toml -- -baseURL = "https://example.org/" -disableKinds = ["taxonomy", "term"] -defaultContentLanguage = "en" -defaultContentLanguageInSubdir = true -[languages] -[languages.en] -weight = 1 -[languages.nn] -weight = 2 --- content/p1.md -- ---- -title: "P1 nn" -lang: "nn" ---- --- content/p2.md -- ---- -title: "P2" ---- --- layouts/index.html -- -RegularPages: {{ range site.RegularPages }}{{ .Path }}|{{ .RelPermalink }}|{{ .Title }}|{{ end }}$ - -` - - b := Test(t, files) - - b.AssertFileContent("public/en/index.html", - "RegularPages: /p2|/en/p2/|P2|$", - ) - b.AssertFileContent("public/nn/index.html", - "RegularPages: /p1|/nn/p1/|P1 nn|$", - ) -} - func TestFrontMatterTitleOverrideWarn(t *testing.T) { t.Parallel() From 621ea42f3ce3e7078294edc1c3ef7ae16fe8e699 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 13 Jun 2025 10:19:20 +0000 Subject: [PATCH 122/129] build(deps): bump google.golang.org/api from 0.221.0 to 0.237.0 Bumps [google.golang.org/api](https://github.com/googleapis/google-api-go-client) from 0.221.0 to 0.237.0. - [Release notes](https://github.com/googleapis/google-api-go-client/releases) - [Changelog](https://github.com/googleapis/google-api-go-client/blob/main/CHANGES.md) - [Commits](https://github.com/googleapis/google-api-go-client/compare/v0.221.0...v0.237.0) --- updated-dependencies: - dependency-name: google.golang.org/api dependency-version: 0.237.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 61 +++++++++++++++---------- go.sum | 142 ++++++++++++++++++++++++++++++++++++--------------------- 2 files changed, 128 insertions(+), 75 deletions(-) diff --git a/go.mod b/go.mod index 6535d1a12..1fa93cb5c 100644 --- a/go.mod +++ b/go.mod @@ -76,22 +76,24 @@ require ( golang.org/x/exp v0.0.0-20221031165847-c99f073a8326 golang.org/x/image v0.28.0 golang.org/x/mod v0.25.0 - golang.org/x/net v0.40.0 + golang.org/x/net v0.41.0 golang.org/x/sync v0.15.0 golang.org/x/text v0.26.0 golang.org/x/tools v0.33.0 - google.golang.org/api v0.221.0 + google.golang.org/api v0.237.0 gopkg.in/yaml.v2 v2.4.0 rsc.io/qr v0.2.0 ) require ( - cloud.google.com/go v0.116.0 // indirect - cloud.google.com/go/auth v0.14.1 // indirect - cloud.google.com/go/auth/oauth2adapt v0.2.7 // indirect - cloud.google.com/go/compute/metadata v0.6.0 // indirect - cloud.google.com/go/iam v1.2.2 // indirect - cloud.google.com/go/storage v1.43.0 // indirect + cel.dev/expr v0.23.0 // indirect + cloud.google.com/go v0.120.0 // indirect + cloud.google.com/go/auth v0.16.2 // indirect + cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect + cloud.google.com/go/compute/metadata v0.7.0 // indirect + cloud.google.com/go/iam v1.5.2 // indirect + cloud.google.com/go/monitoring v1.24.2 // indirect + cloud.google.com/go/storage v1.50.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/azcore v1.14.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 // indirect @@ -99,6 +101,9 @@ require ( github.com/Azure/go-autorest v14.2.0+incompatible // indirect github.com/Azure/go-autorest/autorest/to v0.4.0 // indirect github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.50.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.50.0 // indirect github.com/aws/aws-sdk-go v1.55.5 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.3 // indirect github.com/aws/aws-sdk-go-v2/config v1.27.27 // indirect @@ -118,9 +123,13 @@ require ( github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.4 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.30.3 // indirect github.com/aws/smithy-go v1.22.2 // indirect + github.com/cncf/xds/go v0.0.0-20250326154945-ae57f3c0d45f // indirect github.com/cpuguy83/go-md2man/v2 v2.0.6 // indirect github.com/dlclark/regexp2 v1.11.5 // indirect + github.com/envoyproxy/go-control-plane/envoy v1.32.4 // indirect + github.com/envoyproxy/protoc-gen-validate v1.2.1 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/go-jose/go-jose/v4 v4.0.5 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-openapi/jsonpointer v0.21.0 // indirect @@ -130,8 +139,8 @@ require ( github.com/google/s2a-go v0.1.9 // indirect github.com/google/uuid v1.6.0 // indirect github.com/google/wire v0.6.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.4 // indirect - github.com/googleapis/gax-go/v2 v2.14.1 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.6 // indirect + github.com/googleapis/gax-go/v2 v2.14.2 // indirect github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect @@ -150,25 +159,31 @@ require ( github.com/olekukonko/ll v0.0.8 // indirect github.com/perimeterx/marshmallow v1.1.5 // indirect github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect github.com/rivo/uniseg v0.2.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect + github.com/spiffe/go-spiffe/v2 v2.5.0 // indirect + github.com/zeebo/errs v1.4.0 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.58.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0 // indirect - go.opentelemetry.io/otel v1.34.0 // indirect - go.opentelemetry.io/otel/metric v1.34.0 // indirect - go.opentelemetry.io/otel/trace v1.34.0 // indirect - golang.org/x/crypto v0.38.0 // indirect - golang.org/x/oauth2 v0.26.0 // indirect + go.opentelemetry.io/contrib/detectors/gcp v1.35.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 // indirect + go.opentelemetry.io/otel v1.36.0 // indirect + go.opentelemetry.io/otel/metric v1.36.0 // indirect + go.opentelemetry.io/otel/sdk v1.36.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.36.0 // indirect + go.opentelemetry.io/otel/trace v1.36.0 // indirect + golang.org/x/crypto v0.39.0 // indirect + golang.org/x/oauth2 v0.30.0 // indirect golang.org/x/sys v0.33.0 // indirect - golang.org/x/time v0.10.0 // indirect + golang.org/x/time v0.12.0 // indirect golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9 // indirect - google.golang.org/genproto v0.0.0-20241104194629-dd2ea8efbc28 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20241209162323-e6fa225c2576 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250207221924-e9438ea467c6 // indirect - google.golang.org/grpc v1.70.0 // indirect - google.golang.org/protobuf v1.36.5 // indirect + google.golang.org/genproto v0.0.0-20250505200425-f936aa4a68b2 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250505200425-f936aa4a68b2 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 // indirect + google.golang.org/grpc v1.73.0 // indirect + google.golang.org/protobuf v1.36.6 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect howett.net/plist v1.0.0 // indirect software.sslmate.com/src/go-pkcs12 v0.2.0 // indirect diff --git a/go.sum b/go.sum index 2ed678f41..4328b73b9 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,5 @@ +cel.dev/expr v0.23.0 h1:wUb94w6OYQS4uXraxo9U+wUAs9jT47Xvl4iPgAwM2ss= +cel.dev/expr v0.23.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= @@ -17,26 +19,30 @@ cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHOb cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.116.0 h1:B3fRrSDkLRt5qSHWe40ERJvhvnQwdZiHu0bJOpldweE= -cloud.google.com/go v0.116.0/go.mod h1:cEPSRWPzZEswwdr9BxE6ChEn01dWlTaF05LiC2Xs70U= -cloud.google.com/go/auth v0.14.1 h1:AwoJbzUdxA/whv1qj3TLKwh3XX5sikny2fc40wUl+h0= -cloud.google.com/go/auth v0.14.1/go.mod h1:4JHUxlGXisL0AW8kXPtUF6ztuOksyfUQNFjfsOCXkPM= -cloud.google.com/go/auth/oauth2adapt v0.2.7 h1:/Lc7xODdqcEw8IrZ9SvwnlLX6j9FHQM74z6cBk9Rw6M= -cloud.google.com/go/auth/oauth2adapt v0.2.7/go.mod h1:NTbTTzfvPl1Y3V1nPpOgl2w6d/FjO7NNUQaWSox6ZMc= +cloud.google.com/go v0.120.0 h1:wc6bgG9DHyKqF5/vQvX1CiZrtHnxJjBlKUyF9nP6meA= +cloud.google.com/go v0.120.0/go.mod h1:/beW32s8/pGRuj4IILWQNd4uuebeT4dkOhKmkfit64Q= +cloud.google.com/go/auth v0.16.2 h1:QvBAGFPLrDeoiNjyfVunhQ10HKNYuOwZ5noee0M5df4= +cloud.google.com/go/auth v0.16.2/go.mod h1:sRBas2Y1fB1vZTdurouM0AzuYQBMZinrUYL8EufhtEA= +cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= +cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute/metadata v0.6.0 h1:A6hENjEsCDtC1k8byVsgwvVcioamEHvZ4j01OwKxG9I= -cloud.google.com/go/compute/metadata v0.6.0/go.mod h1:FjyFAW1MW0C203CEOMDTu3Dk1FlqW3Rga40jzHL4hfg= +cloud.google.com/go/compute/metadata v0.7.0 h1:PBWF+iiAerVNe8UCHxdOt6eHLVc3ydFeOCw78U8ytSU= +cloud.google.com/go/compute/metadata v0.7.0/go.mod h1:j5MvL9PprKL39t166CoB1uVHfQMs4tFQZZcKwksXUjo= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/iam v1.2.2 h1:ozUSofHUGf/F4tCNy/mu9tHLTaxZFLOUiKzjcgWHGIA= -cloud.google.com/go/iam v1.2.2/go.mod h1:0Ys8ccaZHdI1dEUilwzqng/6ps2YB6vRsjIe00/+6JY= -cloud.google.com/go/longrunning v0.6.2 h1:xjDfh1pQcWPEvnfjZmwjKQEcHnpz6lHjfy7Fo0MK+hc= -cloud.google.com/go/longrunning v0.6.2/go.mod h1:k/vIs83RN4bE3YCswdXC5PFfWVILjm3hpEUlSko4PiI= +cloud.google.com/go/iam v1.5.2 h1:qgFRAGEmd8z6dJ/qyEchAuL9jpswyODjA2lS+w234g8= +cloud.google.com/go/iam v1.5.2/go.mod h1:SE1vg0N81zQqLzQEwxL2WI6yhetBdbNQuTvIKCSkUHE= +cloud.google.com/go/logging v1.13.0 h1:7j0HgAp0B94o1YRDqiqm26w4q1rDMH7XNRU34lJXHYc= +cloud.google.com/go/logging v1.13.0/go.mod h1:36CoKh6KA/M0PbhPKMq6/qety2DCAErbhXT62TuXALA= +cloud.google.com/go/longrunning v0.6.7 h1:IGtfDWHhQCgCjwQjV9iiLnUta9LBCo8R9QmAFsS/PrE= +cloud.google.com/go/longrunning v0.6.7/go.mod h1:EAFV3IZAKmM56TyiE6VAP3VoTzhZzySwI/YI1s/nRsY= +cloud.google.com/go/monitoring v1.24.2 h1:5OTsoJ1dXYIiMiuL+sYscLc9BumrL3CarVLL7dd7lHM= +cloud.google.com/go/monitoring v1.24.2/go.mod h1:x7yzPWcgDRnPEv3sI+jJGBkwl5qINf+6qY4eq0I9B4U= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= @@ -47,8 +53,10 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -cloud.google.com/go/storage v1.43.0 h1:CcxnSohZwizt4LCzQHWvBf1/kvtHUn7gk9QERXPyXFs= -cloud.google.com/go/storage v1.43.0/go.mod h1:ajvxEa7WmZS1PxvKRq4bq0tFT3vMd502JwstCcYv0Q0= +cloud.google.com/go/storage v1.50.0 h1:3TbVkzTooBvnZsk7WaAQfOsNrdoM8QHusXA1cpk6QJs= +cloud.google.com/go/storage v1.50.0/go.mod h1:l7XeiD//vx5lfqE3RavfmU9yvk5Pp0Zhcv482poyafY= +cloud.google.com/go/trace v1.11.6 h1:2O2zjPzqPYAHrn3OKl029qlqG6W8ZdYaOWRyr8NgMT4= +cloud.google.com/go/trace v1.11.6/go.mod h1:GA855OeDEBiBMzcckLPE2kDunIpC72N+Pq8WFieFjnI= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.14.0 h1:nyQWyZvwGTvunIMxi1Y9uXkcyr+I7TeNrr/foo4Kpk8= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.14.0/go.mod h1:l38EPgmsp71HHLq9j7De57JcKOWPyhrsW1Awm1JS6K0= @@ -71,6 +79,14 @@ github.com/BurntSushi/locker v0.0.0-20171006230638-a6e239ea1c69/go.mod h1:L1AbZd github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0 h1:ErKg/3iS1AKcTkf3yixlZ54f9U1rljCkQyEXWUnIUxc= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0/go.mod h1:yAZHSGnqScoU556rBOVkwLze6WP5N+U11RHuWaGVxwY= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.50.0 h1:5IT7xOdq17MtcdtL/vtl6mGfzhaq4m4vpollPRmlsBQ= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.50.0/go.mod h1:ZV4VOm0/eHR06JLrXWe09068dHpr3TRpY9Uo7T+anuA= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.50.0 h1:nNMpRpnkWDAaqcpxMJvxa/Ud98gjbYwayJY4/9bdjiU= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.50.0/go.mod h1:SZiPHWGOOk3bl8tkevxkoiwPgsIl6CwrWcbwjfHZpdM= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.50.0 h1:ig/FpDD2JofP/NExKQUbn7uOSZzJAQqogfqluZK4ed4= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.50.0/go.mod h1:otE2jQekW/PqXk1Awf5lmfokJx4uwuqcj1ab5SpGeW0= github.com/alecthomas/assert/v2 v2.11.0 h1:2Q9r3ki8+JYXvGsDyBXwH3LcJ+WK5D0gc5E8vS6K3D0= github.com/alecthomas/assert/v2 v2.11.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k= github.com/alecthomas/chroma/v2 v2.18.0 h1:6h53Q4hW83SuF+jcsp7CVhLsMozzvQvO8HBbKQW+gn4= @@ -167,6 +183,8 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/xds/go v0.0.0-20250326154945-ae57f3c0d45f h1:C5bqEmzEPLsHm9Mv73lSE9e9bKV23aB1vxOsmZrkl3k= +github.com/cncf/xds/go v0.0.0-20250326154945-ae57f3c0d45f/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= github.com/cpuguy83/go-md2man/v2 v2.0.6 h1:XJtiaUW6dEEqVuZiMTn1ldk455QWwEIsMIJlo5vtkx0= github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= @@ -185,7 +203,15 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.13.4 h1:zEqyPVyku6IvWCFwux4x9RxkLOMUL+1vC9xUFv5l2/M= +github.com/envoyproxy/go-control-plane v0.13.4/go.mod h1:kDfuBlDVsSj2MjrLEtRWtHlsWIFcGyB2RMO44Dc5GZA= +github.com/envoyproxy/go-control-plane/envoy v1.32.4 h1:jb83lalDRZSpPWW2Z7Mck/8kXZ5CQAFYVjQcdVIr83A= +github.com/envoyproxy/go-control-plane/envoy v1.32.4/go.mod h1:Gzjc5k8JcJswLjAx1Zm+wSYE20UrLtt7JZMWiWQXQEw= +github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an9lx6VBE2cnb8wp1vEGNYGI= +github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v1.2.1 h1:DEo3O99U8j4hBFwbJfrz9VtgcDfUKS7KJ7spH3d86P8= +github.com/envoyproxy/protoc-gen-validate v1.2.1/go.mod h1:d/C80l/jxXLdfEIhX1W2TmLfsJ31lvEjwamM4DxlWXU= github.com/evanw/esbuild v0.25.5 h1:E+JpeY5S/1LFmnX1vtuZqUKT7qDVcfXdhzMhM3uIKFs= github.com/evanw/esbuild v0.25.5/go.mod h1:D2vIQZqV/vIf/VRHtViaUtViZmG7o+kKmlBfVQuRi48= github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= @@ -208,6 +234,8 @@ github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeME github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-jose/go-jose/v4 v4.0.5 h1:M6T8+mKZl/+fNNuFHvGIzDz7BTLQPIounk/b9dw3AaE= +github.com/go-jose/go-jose/v4 v4.0.5/go.mod h1:s3P1lRrkT8igV8D9OjyL4WRyHvjB6a4JSllnOrmmBOA= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= @@ -317,12 +345,12 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/wire v0.6.0 h1:HBkoIh4BdSxoyo9PveV8giw7ZsaBOvzWKfcg/6MrVwI= github.com/google/wire v0.6.0/go.mod h1:F4QhpQ9EDIdJ1Mbop/NZBRB+5yrR6qg3BnctaoUk6NA= -github.com/googleapis/enterprise-certificate-proxy v0.3.4 h1:XYIDZApgAnrN1c855gTgghdIA6Stxb52D5RnLI1SLyw= -github.com/googleapis/enterprise-certificate-proxy v0.3.4/go.mod h1:YKe7cfqYXjKGpGvmSg28/fFvhNzinZQm8DGnaburhGA= +github.com/googleapis/enterprise-certificate-proxy v0.3.6 h1:GW/XbdyBFQ8Qe+YAmFU9uHLo7OnF5tL52HFAgMmyrf4= +github.com/googleapis/enterprise-certificate-proxy v0.3.6/go.mod h1:MkHOF77EYAE7qfSuSS9PU6g4Nt4e11cnsDUowfwewLA= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.14.1 h1:hb0FFeiPaQskmvakKu5EbCbpntQn48jyHuvrkurSS/Q= -github.com/googleapis/gax-go/v2 v2.14.1/go.mod h1:Hb/NubMaVM88SrNkvl8X/o8XWwDJEPqouaLeN2IUxoA= +github.com/googleapis/gax-go/v2 v2.14.2 h1:eBLnkZ9635krYIPD+ag1USrOAI0Nr0QYF3+/3GqO0k0= +github.com/googleapis/gax-go/v2 v2.14.2/go.mod h1:ON64QhlJkhVtSqp4v1uaK92VyZ2gmvDQsweuyLV+8+w= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= @@ -412,6 +440,8 @@ github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsK github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -442,6 +472,8 @@ github.com/spf13/fsync v0.10.1 h1:JRnB7G72b+gIBaBcpn5ibJSd7ww1iEahXSX2B8G6dSE= github.com/spf13/fsync v0.10.1/go.mod h1:y+B41vYq5i6Boa3Z+BVoPbDeOvxVkNU5OBXhoT8i4TQ= github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spiffe/go-spiffe/v2 v2.5.0 h1:N2I01KCUkv1FAjZXJMwh95KK1ZIQLYbPfhaxw8WS0hE= +github.com/spiffe/go-spiffe/v2 v2.5.0/go.mod h1:P+NxobPc6wXhVtINNtFjNWGBTreew1GBUCwT2wPmb7g= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= @@ -475,6 +507,8 @@ github.com/yuin/goldmark v1.7.12 h1:YwGP/rrea2/CnCtUHgjuolG/PnMxdQtPMO5PvaE2/nY= github.com/yuin/goldmark v1.7.12/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= github.com/yuin/goldmark-emoji v1.0.6 h1:QWfF2FYaXwL74tfGOW5izeiZepUDroDJfWubQI9HTHs= github.com/yuin/goldmark-emoji v1.0.6/go.mod h1:ukxJDKFpdFb5x0a5HqbdlcKtebh086iJpI31LTKmWuA= +github.com/zeebo/errs v1.4.0 h1:XNdoD/RRMKP7HD0UhJnIzUy74ISdGGxURlYG8HSWSfM= +github.com/zeebo/errs v1.4.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -485,20 +519,24 @@ go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.58.0 h1:PS8wXpbyaDJQ2VDHHncMe9Vct0Zn1fEjpsjrLxGJoSc= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.58.0/go.mod h1:HDBUsEjOuRC0EzKZ1bSaRGZWUBAzo+MhAcUUORSr4D0= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0 h1:yd02MEjBdJkG3uabWP9apV+OuWRIXGDuJEUJbOHmCFU= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0/go.mod h1:umTcuxiv1n/s/S6/c2AT/g2CQ7u5C59sHDNmfSwgz7Q= -go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY= -go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI= -go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ= -go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE= -go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A= -go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU= -go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= -go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= -go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k= -go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE= +go.opentelemetry.io/contrib/detectors/gcp v1.35.0 h1:bGvFt68+KTiAKFlacHW6AhA56GF2rS0bdD3aJYEnmzA= +go.opentelemetry.io/contrib/detectors/gcp v1.35.0/go.mod h1:qGWP8/+ILwMRIUf9uIVLloR1uo5ZYAslM4O6OqUi1DA= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0 h1:q4XOmH/0opmeuJtPsbFNivyl7bCt7yRBbeEm2sC/XtQ= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0/go.mod h1:snMWehoOh2wsEwnvvwtDyFCxVeDAODenXHtn5vzrKjo= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 h1:F7Jx+6hwnZ41NSFTO5q4LYDtJRXBf2PD0rNBkeB/lus= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0/go.mod h1:UHB22Z8QsdRDrnAtX4PntOl36ajSxcdUMt1sF7Y6E7Q= +go.opentelemetry.io/otel v1.36.0 h1:UumtzIklRBY6cI/lllNZlALOF5nNIzJVb16APdvgTXg= +go.opentelemetry.io/otel v1.36.0/go.mod h1:/TcFMXYjyRNh8khOAO9ybYkqaDBb/70aVwkNML4pP8E= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.29.0 h1:WDdP9acbMYjbKIyJUhTvtzj601sVJOqgWdUxSdR/Ysc= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.29.0/go.mod h1:BLbf7zbNIONBLPwvFnwNHGj4zge8uTCM/UPIVW1Mq2I= +go.opentelemetry.io/otel/metric v1.36.0 h1:MoWPKVhQvJ+eeXWHFBOPoBOi20jh6Iq2CcCREuTYufE= +go.opentelemetry.io/otel/metric v1.36.0/go.mod h1:zC7Ks+yeyJt4xig9DEw9kuUFe5C3zLbVjV2PzT6qzbs= +go.opentelemetry.io/otel/sdk v1.36.0 h1:b6SYIuLRs88ztox4EyrvRti80uXIFy+Sqzoh9kFULbs= +go.opentelemetry.io/otel/sdk v1.36.0/go.mod h1:+lC+mTgD+MUWfjJubi2vvXWcVxyr9rmlshZni72pXeY= +go.opentelemetry.io/otel/sdk/metric v1.36.0 h1:r0ntwwGosWGaa0CrSt8cuNuTcccMXERFwHX4dThiPis= +go.opentelemetry.io/otel/sdk/metric v1.36.0/go.mod h1:qTNOhFDfKRwX0yXOqJYegL5WRaW376QbB7P4Pb0qva4= +go.opentelemetry.io/otel/trace v1.36.0 h1:ahxWNuqZjpdiFAyrIoQ4GIiAIhxAunQR6MUoKrsNd4w= +go.opentelemetry.io/otel/trace v1.36.0/go.mod h1:gQ+OnDZzrybY4k4seLzPAWNwVBBVlF2szhehOBB/tGA= go.uber.org/automaxprocs v1.5.3 h1:kWazyxZUrS3Gs4qUpbwo5kEIMGe/DAvi5Z4tl2NW4j8= go.uber.org/automaxprocs v1.5.3/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0= gocloud.dev v0.40.0 h1:f8LgP+4WDqOG/RXoUcyLpeIAGOcAbZrZbDQCUee10ng= @@ -514,8 +552,8 @@ golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= -golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8= -golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw= +golang.org/x/crypto v0.39.0 h1:SHs+kF4LP+f+p14esP5jAoDpHU8Gu/v9lFRK6IT5imM= +golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -600,8 +638,8 @@ golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= -golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY= -golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds= +golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw= +golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -611,8 +649,8 @@ golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.26.0 h1:afQXWNNaeC4nvZ0Ed9XvCCzXM6UHJG7iCg0W4fPqSBE= -golang.org/x/oauth2 v0.26.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= +golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -702,8 +740,8 @@ golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.10.0 h1:3usCWA8tQn0L8+hFJQNgzpWbd89begxN66o1Ojdn5L4= -golang.org/x/time v0.10.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -783,8 +821,8 @@ google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz513 google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.221.0 h1:qzaJfLhDsbMeFee8zBRdt/Nc+xmOuafD/dbdgGfutOU= -google.golang.org/api v0.221.0/go.mod h1:7sOU2+TL4TxUTdbi0gWgAIg7tH5qBXxoyhtL+9x3biQ= +google.golang.org/api v0.237.0 h1:MP7XVsGZesOsx3Q8WVa4sUdbrsTvDSOERd3Vh4xj/wc= +google.golang.org/api v0.237.0/go.mod h1:cOVEm2TpdAGHL2z+UwyS+kmlGr3bVWQQ6sYEqkKje50= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -828,12 +866,12 @@ google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20241104194629-dd2ea8efbc28 h1:KJjNNclfpIkVqrZlTWcgOOaVQ00LdBnoEaRfkUx760s= -google.golang.org/genproto v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:mt9/MofW7AWQ+Gy179ChOnvmJatV8YHUmrcedo9CIFI= -google.golang.org/genproto/googleapis/api v0.0.0-20241209162323-e6fa225c2576 h1:CkkIfIt50+lT6NHAVoRYEyAvQGFM7xEwXUUywFvEb3Q= -google.golang.org/genproto/googleapis/api v0.0.0-20241209162323-e6fa225c2576/go.mod h1:1R3kvZ1dtP3+4p4d3G8uJ8rFk/fWlScl38vanWACI08= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250207221924-e9438ea467c6 h1:2duwAxN2+k0xLNpjnHTXoMUgnv6VPSp5fiqTuwSxjmI= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250207221924-e9438ea467c6/go.mod h1:8BS3B93F/U1juMFq9+EDk+qOT5CO1R9IzXxG3PTqiRk= +google.golang.org/genproto v0.0.0-20250505200425-f936aa4a68b2 h1:1tXaIXCracvtsRxSBsYDiSBN0cuJvM7QYW+MrpIRY78= +google.golang.org/genproto v0.0.0-20250505200425-f936aa4a68b2/go.mod h1:49MsLSx0oWMOZqcpB3uL8ZOkAh1+TndpJ8ONoCBWiZk= +google.golang.org/genproto/googleapis/api v0.0.0-20250505200425-f936aa4a68b2 h1:vPV0tzlsK6EzEDHNNH5sa7Hs9bd7iXR7B1tSiPepkV0= +google.golang.org/genproto/googleapis/api v0.0.0-20250505200425-f936aa4a68b2/go.mod h1:pKLAc5OolXC3ViWGI62vvC0n10CpwAtRcTNCFwTKBEw= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 h1:fc6jSaCT0vBduLYZHYrBBNY4dsWuvgyff9noRNDdBeE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -850,8 +888,8 @@ google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.70.0 h1:pWFv03aZoHzlRKHWicjsZytKAiYCtNS0dHbXnIdq7jQ= -google.golang.org/grpc v1.70.0/go.mod h1:ofIJqVKDXx/JiXrwr2IG4/zwdH9txy3IlF40RmcJSQw= +google.golang.org/grpc v1.73.0 h1:VIWSmpI2MegBtTuFt5/JWy2oXxtjJ/e89Z70ImfD2ok= +google.golang.org/grpc v1.73.0/go.mod h1:50sbHOUqWoCQGI8V2HQLJM0B+LMlIUjNSZmow7EVBQc= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -862,8 +900,8 @@ google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM= -google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= +google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= From b6c8dfa9dc4e446bae7d50088fb568939f6ccd4a Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Tue, 17 Jun 2025 07:35:14 -0700 Subject: [PATCH 123/129] tpl/tplimpl: Change resources.GetRemote errors to suppressible warnings Closes #13803 --- tpl/tplimpl/embedded/templates/_shortcodes/twitter.html | 2 +- tpl/tplimpl/embedded/templates/_shortcodes/twitter_simple.html | 2 +- tpl/tplimpl/embedded/templates/_shortcodes/vimeo_simple.html | 2 +- tpl/tplimpl/embedded/templates/_shortcodes/x.html | 2 +- tpl/tplimpl/embedded/templates/_shortcodes/x_simple.html | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tpl/tplimpl/embedded/templates/_shortcodes/twitter.html b/tpl/tplimpl/embedded/templates/_shortcodes/twitter.html index 849bad99e..c6200ffd2 100644 --- a/tpl/tplimpl/embedded/templates/_shortcodes/twitter.html +++ b/tpl/tplimpl/embedded/templates/_shortcodes/twitter.html @@ -20,7 +20,7 @@ {{- $request := printf "https://publish.twitter.com/oembed?%s" $query -}} {{- with try (resources.GetRemote $request) -}} {{- with .Err -}} - {{- errorf "%s" . -}} + {{- warnidf "shortcode-twitter-getremote" "The %q shortcode was unable to retrieve the remote data: %s. See %s" $.ctx.Name . $.ctx.Position -}} {{- else with .Value -}} {{- (. | transform.Unmarshal).html | safeHTML -}} {{- else -}} diff --git a/tpl/tplimpl/embedded/templates/_shortcodes/twitter_simple.html b/tpl/tplimpl/embedded/templates/_shortcodes/twitter_simple.html index e9dcc76ba..34150393d 100644 --- a/tpl/tplimpl/embedded/templates/_shortcodes/twitter_simple.html +++ b/tpl/tplimpl/embedded/templates/_shortcodes/twitter_simple.html @@ -16,7 +16,7 @@ {{- $request := printf "https://publish.twitter.com/oembed?%s" $query -}} {{- with try (resources.GetRemote $request) -}} {{- with .Err -}} - {{- errorf "%s" . -}} + {{- warnidf "shortcode-twitter-simple-getremote" "The %q shortcode was unable to retrieve the remote data: %s. See %s" $.ctx.Name . $.ctx.Position -}} {{- else with .Value -}} {{- if not site.Config.Services.Twitter.DisableInlineCSS }} {{- template "__h_simple_twitter_css" (dict "ctx" $.ctx) }} diff --git a/tpl/tplimpl/embedded/templates/_shortcodes/vimeo_simple.html b/tpl/tplimpl/embedded/templates/_shortcodes/vimeo_simple.html index 2e5f88282..a00f3e7f6 100644 --- a/tpl/tplimpl/embedded/templates/_shortcodes/vimeo_simple.html +++ b/tpl/tplimpl/embedded/templates/_shortcodes/vimeo_simple.html @@ -25,7 +25,7 @@ {{- $request := printf "https://vimeo.com/api/oembed.json?%s" $query -}} {{- with try (resources.GetRemote $request) -}} {{- with .Err -}} - {{- errorf "%s" . -}} + {{- warnidf "shortcode-vimeo-simple" "The %q shortcode was unable to retrieve the remote data: %s. See %s" $.ctx.Name . $.ctx.Position -}} {{- else with .Value -}} {{- with . | transform.Unmarshal -}} {{- $class := printf "%s %s" "s_video_simple" "__h_video" -}} diff --git a/tpl/tplimpl/embedded/templates/_shortcodes/x.html b/tpl/tplimpl/embedded/templates/_shortcodes/x.html index 87455530c..38bf0f7b6 100644 --- a/tpl/tplimpl/embedded/templates/_shortcodes/x.html +++ b/tpl/tplimpl/embedded/templates/_shortcodes/x.html @@ -19,7 +19,7 @@ {{- $request := printf "https://publish.x.com/oembed?%s" $query -}} {{- with try (resources.GetRemote $request) -}} {{- with .Err -}} - {{- errorf "%s" . -}} + {{- warnidf "shortcode-x-getremote" "The %q shortcode was unable to retrieve the remote data: %s. See %s" $.ctx.Name . $.ctx.Position -}} {{- else with .Value -}} {{- (. | transform.Unmarshal).html | safeHTML -}} {{- else -}} diff --git a/tpl/tplimpl/embedded/templates/_shortcodes/x_simple.html b/tpl/tplimpl/embedded/templates/_shortcodes/x_simple.html index be7830668..1e22835f6 100644 --- a/tpl/tplimpl/embedded/templates/_shortcodes/x_simple.html +++ b/tpl/tplimpl/embedded/templates/_shortcodes/x_simple.html @@ -15,7 +15,7 @@ {{- $request := printf "https://publish.x.com/oembed?%s" $query -}} {{- with try (resources.GetRemote $request) -}} {{- with .Err -}} - {{- errorf "%s" . -}} + {{- warnidf "shortcode-x-simple-getremote" "The %q shortcode was unable to retrieve the remote data: %s. See %s" $.ctx.Name . $.ctx.Position -}} {{- else with .Value -}} {{- if not site.Config.Services.X.DisableInlineCSS }} {{- template "__h_simple_x_css" (dict "ctx" $.ctx) }} From 18a9ca7d7a03f3162a1b950fa3ba2a5e578fccc7 Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Fri, 20 Jun 2025 10:42:56 -0700 Subject: [PATCH 124/129] tpl/tplimpl: Copy embedded HTML table render hook to each output format Closes #13351 --- tpl/tplimpl/templatestore.go | 19 +++++++-- tpl/tplimpl/templatestore_integration_test.go | 40 +++++++++++++++++++ 2 files changed, 56 insertions(+), 3 deletions(-) diff --git a/tpl/tplimpl/templatestore.go b/tpl/tplimpl/templatestore.go index bbb7f27cc..23c821cac 100644 --- a/tpl/tplimpl/templatestore.go +++ b/tpl/tplimpl/templatestore.go @@ -1018,7 +1018,7 @@ func (s *TemplateStore) allRawTemplates() iter.Seq[tpl.Template] { } func (s *TemplateStore) insertEmbedded() error { - return fs.WalkDir(embeddedTemplatesFs, ".", func(path string, d fs.DirEntry, err error) error { + return fs.WalkDir(embeddedTemplatesFs, ".", func(tpath string, d fs.DirEntry, err error) error { if err != nil { return err } @@ -1026,7 +1026,7 @@ func (s *TemplateStore) insertEmbedded() error { return nil } - templb, err := embeddedTemplatesFs.ReadFile(path) + templb, err := embeddedTemplatesFs.ReadFile(tpath) if err != nil { return err } @@ -1034,7 +1034,7 @@ func (s *TemplateStore) insertEmbedded() error { // Get the newlines on Windows in line with how we had it back when we used Go Generate // to write the templates to Go files. templ := string(bytes.ReplaceAll(templb, []byte("\r\n"), []byte("\n"))) - name := strings.TrimPrefix(filepath.ToSlash(path), "embedded/templates/") + name := strings.TrimPrefix(filepath.ToSlash(tpath), "embedded/templates/") insertOne := func(name, content string) error { pi := s.opts.PathParser.Parse(files.ComponentFolderLayouts, name) @@ -1064,6 +1064,19 @@ func (s *TemplateStore) insertEmbedded() error { return nil } + // Copy the embedded HTML table render hook to each output format. + // See https://github.com/gohugoio/hugo/issues/13351. + if name == path.Join(containerMarkup, "render-table.html") { + for _, of := range s.opts.OutputFormats { + path := paths.TrimExt(name) + "." + of.Name + of.MediaType.FirstSuffix.FullSuffix + if err := insertOne(path, templ); err != nil { + return err + } + } + + return nil + } + if err := insertOne(name, templ); err != nil { return err } diff --git a/tpl/tplimpl/templatestore_integration_test.go b/tpl/tplimpl/templatestore_integration_test.go index 0b3ce7a56..9da959350 100644 --- a/tpl/tplimpl/templatestore_integration_test.go +++ b/tpl/tplimpl/templatestore_integration_test.go @@ -1508,3 +1508,43 @@ mytexts|safeHTML: {{ partial "mytext.txt" . | safeHTML }} "mytexts|safeHTML:
mytext
", ) } + +func TestIssue13351(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +disableKinds = ['page','rss','section','sitemap','taxonomy','term'] +[outputs] +home = ['html','json'] +[outputFormats.html] +weight = 1 +[outputFormats.json] +weight = 2 +-- content/_index.md -- +--- +title: home +--- +a|b +:--|:-- +1|2 +-- layouts/index.html -- +{{ .Content }} +-- layouts/index.json -- +{{ .Content }} +` + + b := hugolib.Test(t, files) + b.AssertFileContent("public/index.html", "") + b.AssertFileContent("public/index.json", "
") + + f := strings.ReplaceAll(files, "weight = 1", "weight = 0") + b = hugolib.Test(t, f) + b.AssertFileContent("public/index.html", "
") + b.AssertFileContent("public/index.json", "
") + + f = strings.ReplaceAll(files, "weight = 1", "") + b = hugolib.Test(t, f) + b.AssertFileContent("public/index.html", "
") + b.AssertFileContent("public/index.json", "
") +} From 36f6f987a9962cb838198d98b1601a88b66281dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Thu, 19 Jun 2025 19:52:08 +0200 Subject: [PATCH 125/129] resources/page: Make sure a map is always initialized Fixes #13810 --- resources/page/page_matcher.go | 6 +++--- resources/page/page_matcher_test.go | 4 +++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/resources/page/page_matcher.go b/resources/page/page_matcher.go index 306c2d03c..858def5ef 100644 --- a/resources/page/page_matcher.go +++ b/resources/page/page_matcher.go @@ -174,6 +174,9 @@ func DecodeCascade(logger loggers.Logger, handleLegacyFormat bool, in any) (*map func mapToPageMatcherParamsConfig(m map[string]any) (PageMatcherParamsConfig, error) { var pcfg PageMatcherParamsConfig + if pcfg.Fields == nil { + pcfg.Fields = make(maps.Params) + } for k, v := range m { switch strings.ToLower(k) { case "_target", "target": @@ -193,9 +196,6 @@ func mapToPageMatcherParamsConfig(m map[string]any) (PageMatcherParamsConfig, er } } default: - if pcfg.Fields == nil { - pcfg.Fields = make(maps.Params) - } pcfg.Fields[k] = v } diff --git a/resources/page/page_matcher_test.go b/resources/page/page_matcher_test.go index ad35da43c..7f441d3ab 100644 --- a/resources/page/page_matcher_test.go +++ b/resources/page/page_matcher_test.go @@ -99,6 +99,7 @@ func TestPageMatcher(t *testing.T) { Params: maps.Params{ "foo": "bar", }, + Fields: maps.Params{}, Target: PageMatcher{Path: "", Kind: "page", Lang: "", Environment: ""}, }) }) @@ -136,9 +137,10 @@ func TestDecodeCascadeConfig(t *testing.T) { c.Assert(got.SourceStructure, qt.DeepEquals, []PageMatcherParamsConfig{ { Params: maps.Params{"a": string("av")}, + Fields: maps.Params{}, Target: PageMatcher{Kind: "page", Environment: "production"}, }, - {Params: maps.Params{"b": string("bv")}, Target: PageMatcher{Kind: "page"}}, + {Params: maps.Params{"b": string("bv")}, Fields: maps.Params{}, Target: PageMatcher{Kind: "page"}}, }) got, err = DecodeCascadeConfig(loggers.NewDefault(), true, nil) From 6a4a3ab8f8d867eaa2ed832c2e10d75b334538c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Sun, 22 Jun 2025 13:07:34 +0200 Subject: [PATCH 126/129] Remove WARN with false negatives Fixes #13806 --- hugolib/cascade_test.go | 27 +++++++++++++++++++++++++++ hugolib/page__meta.go | 4 ---- hugolib/params_test.go | 22 ---------------------- 3 files changed, 27 insertions(+), 26 deletions(-) diff --git a/hugolib/cascade_test.go b/hugolib/cascade_test.go index fb9dffd15..3e3e471b7 100644 --- a/hugolib/cascade_test.go +++ b/hugolib/cascade_test.go @@ -938,3 +938,30 @@ path = '/p1' b.AssertFileContent("public/p1/index.html", "p1|bar") // actual content is "p1|" } + +func TestCascadeWarnOverrideIssue13806(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +disableKinds = ['home','rss','section','sitemap','taxonomy','term'] +[[cascade]] +[cascade.params] +searchable = true +[cascade.target] +kind = 'page' +-- content/something.md -- +--- +title: Something +params: + searchable: false +--- +-- layouts/all.html -- +All. + +` + + b := Test(t, files, TestOptWarn()) + + b.AssertLogContains("! WARN") +} diff --git a/hugolib/page__meta.go b/hugolib/page__meta.go index 0d6d22e9a..1af489f18 100644 --- a/hugolib/page__meta.go +++ b/hugolib/page__meta.go @@ -29,7 +29,6 @@ import ( "github.com/gohugoio/hugo/source" - "github.com/gohugoio/hugo/common/constants" "github.com/gohugoio/hugo/common/hashing" "github.com/gohugoio/hugo/common/hugo" "github.com/gohugoio/hugo/common/loggers" @@ -647,9 +646,6 @@ params: } for k, v := range userParams { - if _, found := params[k]; found { - p.s.Log.Warnidf(constants.WarnFrontMatterParamsOverrides, "Hugo front matter key %q is overridden in params section.", k) - } params[strings.ToLower(k)] = v } diff --git a/hugolib/params_test.go b/hugolib/params_test.go index 94b832b3e..7f7566024 100644 --- a/hugolib/params_test.go +++ b/hugolib/params_test.go @@ -94,28 +94,6 @@ a/b pages: {{ range $ab.RegularPages }}{{ .Path }}|{{ .RelPermalink }}|{{ end }} ) } -func TestFrontMatterTitleOverrideWarn(t *testing.T) { - t.Parallel() - - files := ` --- hugo.toml -- -baseURL = "https://example.org/" -disableKinds = ["taxonomy", "term"] --- content/p1.md -- ---- -title: "My title" -params: - title: "My title from params" ---- - - -` - - b := Test(t, files, TestOptWarn()) - - b.AssertLogContains("ARN Hugo front matter key \"title\" is overridden in params section", "You can suppress this warning") -} - func TestFrontMatterParamsLangNoCascade(t *testing.T) { t.Parallel() From 29bdbde19c288d190e889294a862103c6efb70bf Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Mon, 23 Jun 2025 08:22:20 +0000 Subject: [PATCH 127/129] releaser: Bump versions for release of 0.147.9 [ci skip] --- common/hugo/version_current.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/common/hugo/version_current.go b/common/hugo/version_current.go index ba367ceb5..ccd0666ab 100644 --- a/common/hugo/version_current.go +++ b/common/hugo/version_current.go @@ -17,7 +17,7 @@ package hugo // This should be the only one. var CurrentVersion = Version{ Major: 0, - Minor: 148, - PatchLevel: 0, - Suffix: "-DEV", + Minor: 147, + PatchLevel: 9, + Suffix: "", } From 762417617c80f6ccd8b3d283c89d7b2406be6b23 Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Mon, 23 Jun 2025 08:38:21 +0000 Subject: [PATCH 128/129] releaser: Prepare repository for 0.148.0-DEV [ci skip] --- common/hugo/version_current.go | 6 +++--- hugoreleaser.env | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/common/hugo/version_current.go b/common/hugo/version_current.go index ccd0666ab..ba367ceb5 100644 --- a/common/hugo/version_current.go +++ b/common/hugo/version_current.go @@ -17,7 +17,7 @@ package hugo // This should be the only one. var CurrentVersion = Version{ Major: 0, - Minor: 147, - PatchLevel: 9, - Suffix: "", + Minor: 148, + PatchLevel: 0, + Suffix: "-DEV", } diff --git a/hugoreleaser.env b/hugoreleaser.env index fe49380b0..6da749524 100644 --- a/hugoreleaser.env +++ b/hugoreleaser.env @@ -1,7 +1,8 @@ # Release env. # These will be replaced by script before release. -HUGORELEASER_TAG=v0.147.8 -HUGORELEASER_COMMITISH=10da2bd765d227761641f94d713d094e88b920ae +HUGORELEASER_TAG=v0.147.9 +HUGORELEASER_COMMITISH=29bdbde19c288d190e889294a862103c6efb70bf + From dd6e2c87241d5b5f3bd581c1bd7d3ae282f7bc62 Mon Sep 17 00:00:00 2001 From: David Jones Date: Sun, 29 Jun 2025 15:41:56 +0100 Subject: [PATCH 129/129] deploy: walkLocal worker pool for performance --- deploy/deploy.go | 83 +++++++++++++++++++++++++------------------ deploy/deploy_test.go | 13 +++---- 2 files changed, 56 insertions(+), 40 deletions(-) diff --git a/deploy/deploy.go b/deploy/deploy.go index 4b90881a6..57e1f41a2 100644 --- a/deploy/deploy.go +++ b/deploy/deploy.go @@ -36,6 +36,7 @@ import ( "github.com/dustin/go-humanize" "github.com/gobwas/glob" "github.com/gohugoio/hugo/common/loggers" + "github.com/gohugoio/hugo/common/para" "github.com/gohugoio/hugo/config" "github.com/gohugoio/hugo/deploy/deployconfig" "github.com/gohugoio/hugo/media" @@ -487,7 +488,12 @@ func knownHiddenDirectory(name string) bool { // walkLocal walks the source directory and returns a flat list of files, // using localFile.SlashPath as the map keys. func (d *Deployer) walkLocal(fs afero.Fs, matchers []*deployconfig.Matcher, include, exclude glob.Glob, mediaTypes media.Types, mappath func(string) string) (map[string]*localFile, error) { - retval := map[string]*localFile{} + retval := make(map[string]*localFile) + var mu sync.Mutex + + workers := para.New(d.cfg.Workers) + g, _ := workers.Start(context.Background()) + err := afero.Walk(fs, "", func(path string, info os.FileInfo, err error) error { if err != nil { return err @@ -508,45 +514,54 @@ func (d *Deployer) walkLocal(fs afero.Fs, matchers []*deployconfig.Matcher, incl return nil } - // When a file system is HFS+, its filepath is in NFD form. - if runtime.GOOS == "darwin" { - path = norm.NFC.String(path) - } - - // Check include/exclude matchers. - slashpath := filepath.ToSlash(path) - if include != nil && !include.Match(slashpath) { - d.logger.Infof(" dropping %q due to include\n", slashpath) - return nil - } - if exclude != nil && exclude.Match(slashpath) { - d.logger.Infof(" dropping %q due to exclude\n", slashpath) - return nil - } - - // Find the first matching matcher (if any). - var m *deployconfig.Matcher - for _, cur := range matchers { - if cur.Matches(slashpath) { - m = cur - break + // Process each file in a worker + g.Run(func() error { + // When a file system is HFS+, its filepath is in NFD form. + if runtime.GOOS == "darwin" { + path = norm.NFC.String(path) } - } - // Apply any additional modifications to the local path, to map it to - // the remote path. - if mappath != nil { - slashpath = mappath(slashpath) - } - lf, err := newLocalFile(fs, path, slashpath, m, mediaTypes) - if err != nil { - return err - } - retval[lf.SlashPath] = lf + + // Check include/exclude matchers. + slashpath := filepath.ToSlash(path) + if include != nil && !include.Match(slashpath) { + d.logger.Infof(" dropping %q due to include\n", slashpath) + return nil + } + if exclude != nil && exclude.Match(slashpath) { + d.logger.Infof(" dropping %q due to exclude\n", slashpath) + return nil + } + + // Find the first matching matcher (if any). + var m *deployconfig.Matcher + for _, cur := range matchers { + if cur.Matches(slashpath) { + m = cur + break + } + } + // Apply any additional modifications to the local path, to map it to + // the remote path. + if mappath != nil { + slashpath = mappath(slashpath) + } + lf, err := newLocalFile(fs, path, slashpath, m, mediaTypes) + if err != nil { + return err + } + mu.Lock() + retval[lf.SlashPath] = lf + mu.Unlock() + return nil + }) return nil }) if err != nil { return nil, err } + if err := g.Wait(); err != nil { + return nil, err + } return retval, nil } diff --git a/deploy/deploy_test.go b/deploy/deploy_test.go index 3bbc9ff70..bdc8299a0 100644 --- a/deploy/deploy_test.go +++ b/deploy/deploy_test.go @@ -623,7 +623,7 @@ func TestEndToEndSync(t *testing.T) { localFs: test.fs, bucket: test.bucket, mediaTypes: media.DefaultTypes, - cfg: deployconfig.DeployConfig{MaxDeletes: -1}, + cfg: deployconfig.DeployConfig{Workers: 2, MaxDeletes: -1}, } // Initial deployment should sync remote with local. @@ -706,7 +706,7 @@ func TestMaxDeletes(t *testing.T) { localFs: test.fs, bucket: test.bucket, mediaTypes: media.DefaultTypes, - cfg: deployconfig.DeployConfig{MaxDeletes: -1}, + cfg: deployconfig.DeployConfig{Workers: 2, MaxDeletes: -1}, } // Sync remote with local. @@ -836,7 +836,7 @@ func TestIncludeExclude(t *testing.T) { } deployer := &Deployer{ localFs: fsTest.fs, - cfg: deployconfig.DeployConfig{MaxDeletes: -1}, bucket: fsTest.bucket, + cfg: deployconfig.DeployConfig{Workers: 2, MaxDeletes: -1}, bucket: fsTest.bucket, target: tgt, mediaTypes: media.DefaultTypes, } @@ -893,7 +893,7 @@ func TestIncludeExcludeRemoteDelete(t *testing.T) { } deployer := &Deployer{ localFs: fsTest.fs, - cfg: deployconfig.DeployConfig{MaxDeletes: -1}, bucket: fsTest.bucket, + cfg: deployconfig.DeployConfig{Workers: 2, MaxDeletes: -1}, bucket: fsTest.bucket, mediaTypes: media.DefaultTypes, } @@ -945,7 +945,7 @@ func TestCompression(t *testing.T) { deployer := &Deployer{ localFs: test.fs, bucket: test.bucket, - cfg: deployconfig.DeployConfig{MaxDeletes: -1, Matchers: []*deployconfig.Matcher{{Pattern: ".*", Gzip: true, Re: regexp.MustCompile(".*")}}}, + cfg: deployconfig.DeployConfig{Workers: 2, MaxDeletes: -1, Matchers: []*deployconfig.Matcher{{Pattern: ".*", Gzip: true, Re: regexp.MustCompile(".*")}}}, mediaTypes: media.DefaultTypes, } @@ -1000,7 +1000,7 @@ func TestMatching(t *testing.T) { deployer := &Deployer{ localFs: test.fs, bucket: test.bucket, - cfg: deployconfig.DeployConfig{MaxDeletes: -1, Matchers: []*deployconfig.Matcher{{Pattern: "^subdir/aaa$", Force: true, Re: regexp.MustCompile("^subdir/aaa$")}}}, + cfg: deployconfig.DeployConfig{Workers: 2, MaxDeletes: -1, Matchers: []*deployconfig.Matcher{{Pattern: "^subdir/aaa$", Force: true, Re: regexp.MustCompile("^subdir/aaa$")}}}, mediaTypes: media.DefaultTypes, } @@ -1097,5 +1097,6 @@ func verifyRemote(ctx context.Context, bucket *blob.Bucket, local []*fileData) ( func newDeployer() *Deployer { return &Deployer{ logger: loggers.NewDefault(), + cfg: deployconfig.DeployConfig{Workers: 2}, } }

<4KwIRrT$>hDLtO2G_5 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≦09$^QHAh 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 diff --git a/resources/images/testdata/images_golden/filters/text/text_alignx-right.jpg b/resources/images/testdata/images_golden/filters/text/text_alignx-right.jpg index 3b727234a7ea5ff6f1912da81324a03111cfb323..207e88a496db130a73e762a9ff870d0a0096e591 100644 GIT binary patch delta 37874 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 Date: Mon, 14 Apr 2025 14:47:05 +0200 Subject: [PATCH 045/129] tpl: Remove some unreached code branches --- tpl/tplimpl/templatestore.go | 44 +++++++++--------------------------- 1 file changed, 11 insertions(+), 33 deletions(-) diff --git a/tpl/tplimpl/templatestore.go b/tpl/tplimpl/templatestore.go index dba897608..e6cd49c66 100644 --- a/tpl/tplimpl/templatestore.go +++ b/tpl/tplimpl/templatestore.go @@ -738,16 +738,8 @@ func (t *TemplateStore) UnusedTemplates() []*TemplInfo { // Skip inline partials and internal templates. continue } - if vv.noBaseOf { - if vv.executionCounter.Load() == 0 { - unused = append(unused, vv) - } - } else { - for vvv := range vv.BaseVariantsSeq() { - if vvv.Template.executionCounter.Load() == 0 { - unused = append(unused, vvv.Template) - } - } + if vv.executionCounter.Load() == 0 { + unused = append(unused, vv) } } @@ -1543,6 +1535,9 @@ func (s *TemplateStore) resolveOutputFormatAndOrMediaType(ofs, mns string) (outp return outputFormat, mediaType } +// templates iterates over all templates in the store. +// Note that for templates with one or more base templates applied, +// we will yield the variants, e.g. the templates that's actually in use. func (s *TemplateStore) templates() iter.Seq[*TemplInfo] { return func(yield func(*TemplInfo) bool) { for _, v := range s.treeMain.All() { @@ -1697,31 +1692,14 @@ func (s *TemplateStore) transformTemplates() error { if vv.category == CategoryBaseof { continue } - if !vv.noBaseOf { - // TODO(bep) I don't think this branch is ever called. - for vvv := range vv.BaseVariantsSeq() { - tctx, err := applyTemplateTransformers(vvv.Template, lookup) - if err != nil { - return err - } - - for name, node := range tctx.deferNodes { - if err := s.addDeferredTemplate(vvv.Overlay, name, node); err != nil { - return err - } - } - } - } else { - tctx, err := applyTemplateTransformers(vv, lookup) - if err != nil { + tctx, err := applyTemplateTransformers(vv, lookup) + if err != nil { + return err + } + for name, node := range tctx.deferNodes { + if err := s.addDeferredTemplate(vv, name, node); err != nil { return err } - - for name, node := range tctx.deferNodes { - if err := s.addDeferredTemplate(vv, name, node); err != nil { - return err - } - } } } From 75b219db896cd0ae962f062b39fd67c38dfc8e5b Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Thu, 24 Apr 2025 07:48:30 -0700 Subject: [PATCH 046/129] create/skeletons: Adjust template names in theme skeleton --- create/skeletons/theme/layouts/{single.html => page.html} | 0 create/skeletons/theme/layouts/{list.html => section.html} | 0 testscripts/commands/new.txt | 4 ++-- 3 files changed, 2 insertions(+), 2 deletions(-) rename create/skeletons/theme/layouts/{single.html => page.html} (100%) rename create/skeletons/theme/layouts/{list.html => section.html} (100%) diff --git a/create/skeletons/theme/layouts/single.html b/create/skeletons/theme/layouts/page.html similarity index 100% rename from create/skeletons/theme/layouts/single.html rename to create/skeletons/theme/layouts/page.html diff --git a/create/skeletons/theme/layouts/list.html b/create/skeletons/theme/layouts/section.html similarity index 100% rename from create/skeletons/theme/layouts/list.html rename to create/skeletons/theme/layouts/section.html diff --git a/testscripts/commands/new.txt b/testscripts/commands/new.txt index 433e238bf..cd338203f 100644 --- a/testscripts/commands/new.txt +++ b/testscripts/commands/new.txt @@ -36,8 +36,8 @@ checkfile content/posts/post-3/bryce-canyon.jpg checkfile content/posts/post-3/index.md checkfile layouts/baseof.html checkfile layouts/home.html -checkfile layouts/list.html -checkfile layouts/single.html +checkfile layouts/section.html +checkfile layouts/page.html checkfile layouts/taxonomy.html checkfile layouts/term.html checkfile layouts/_partials/footer.html From 5c491409d36d31f77cdc0407ed29ae2dca71363b Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Thu, 24 Apr 2025 14:14:46 -0700 Subject: [PATCH 047/129] tpl/tplimpl: Fix allowFullScreen option in Vimeo and YouTube shortcodes Closes #13650 --- .../embedded/templates/_shortcodes/vimeo.html | 20 +++++------ .../templates/_shortcodes/youtube.html | 35 +++++++++++-------- tpl/tplimpl/shortcodes_integration_test.go | 10 +++--- 3 files changed, 36 insertions(+), 29 deletions(-) diff --git a/tpl/tplimpl/embedded/templates/_shortcodes/vimeo.html b/tpl/tplimpl/embedded/templates/_shortcodes/vimeo.html index 3ce470c6e..2588ac86c 100644 --- a/tpl/tplimpl/embedded/templates/_shortcodes/vimeo.html +++ b/tpl/tplimpl/embedded/templates/_shortcodes/vimeo.html @@ -4,11 +4,11 @@ Renders an embedded Vimeo video. Accepts named or positional arguments. If positional, order is id, class, title, then loading. -@param {string} [id] The video id. Optional if the id is provided as first positional argument. +@param {bool} [allowFullScreen=true] Whether the iframe element can activate full screen mode. @param {string} [class] The class attribute of the wrapping div element. When specified, removes the style attributes from the iframe element and its wrapping div element. +@param {string} [id] The video id. Optional if the id is the first and only positional argument. @param {string} [loading=eager] The loading attribute of the iframe element. @param {string} [title=Vimeo video] The title attribute of the iframe element. -@param {bool} [allowFullScreen=true] Whether the iframe element can activate full screen mode. @returns {template.HTML} @@ -22,16 +22,16 @@ title, then loading. {{- else }} {{- $dnt := cond $pc.EnableDNT 1 0 }} - {{- $id := or (.Get "id") (.Get 0) "" }} - {{- $class := or (.Get "class") (.Get 1) "" }} - {{- $title := or (.Get "title") (.Get 2) "Vimeo video" }} - {{- $loading := or (.Get "loading") (.Get 3) "eager" }} - {{- $allowFullScreen := or (.Get "allowFullScreen") (.Get 4) true }} + {{- $allowFullScreen := true }} + {{- $class := or (.Get "class") }} + {{- $id := or (.Get "id") (.Get 0) }} + {{- $loading := or (.Get "loading") }} + {{- $title := or (.Get "title") }} - {{- if in (slice "false" false 0) ($.Get "allowFullScreen") }} - {{- $allowFullScreen = false }} - {{- else if in (slice "true" true 1) ($.Get "allowFullScreen") }} + {{- if in (slice "true" true 1) (.Get "allowFullScreen") }} {{- $allowFullScreen = true }} + {{- else if in (slice "false" false 0) (.Get "allowFullScreen") }} + {{- $allowFullScreen = false }} {{- end }} {{- $iframeAllowList := "" }} diff --git a/tpl/tplimpl/embedded/templates/_shortcodes/youtube.html b/tpl/tplimpl/embedded/templates/_shortcodes/youtube.html index cebe50626..18b086944 100644 --- a/tpl/tplimpl/embedded/templates/_shortcodes/youtube.html +++ b/tpl/tplimpl/embedded/templates/_shortcodes/youtube.html @@ -6,7 +6,7 @@ Renders an embedded YouTube video. @param {string} [class] The class attribute of the wrapping div element. When specified, removes the style attributes from the iframe element and its wrapping div element. @param {bool} [controls=true] Whether to display the video controls. @param {int} [end] The time, measured in seconds from the start of the video, when the player should stop playing the video. -@param {string} [id] The video id. Optional if the id is provided as first positional argument. +@param {string} [id] The video id. Optional if the id is the first and only positional argument. @param {string} [loading=eager] The loading attribute of the iframe element. @param {bool} [loop=false] Whether to indefinitely repeat the video. Ignores the start and end arguments after the first play. @param {bool} [mute=false] Whether to mute the video. Always true when autoplay is true. @@ -41,27 +41,29 @@ Renders an embedded YouTube video. {{- /* Get arguments. */}} {{- if in (slice "true" true 1) ($.Get "allowFullScreen") }} - {{- $iframeAllowList = printf "%s; fullscreen" $iframeAllowList }} + {{- $allowFullScreen = true }} + {{- else if in (slice "false" false 0) ($.Get "allowFullScreen") }} + {{- $allowFullScreen = false }} {{- end }} - {{- if in (slice "false" false 0) ($.Get "autoplay") }} - {{- $autoplay = 0 }} - {{- else if in (slice "true" true 1) ($.Get "autoplay") }} + {{- if in (slice "true" true 1) ($.Get "autoplay") }} {{- $autoplay = 1 }} + {{- else if in (slice "false" false 0) ($.Get "autoplay") }} + {{- $autoplay = 0 }} {{- end }} - {{- if in (slice "false" false 0) ($.Get "controls") }} - {{- $controls = 0 }} - {{- else if in (slice "true" true 1) ($.Get "controls") }} + {{- if in (slice "true" true 1) ($.Get "controls") }} {{- $controls = 1 }} + {{- else if in (slice "false" false 0) ($.Get "controls") }} + {{- $controls = 0 }} {{- end }} - {{- if in (slice "false" false 0) ($.Get "loop") }} - {{- $loop = 0 }} - {{- else if in (slice "true" true 1) ($.Get "loop") }} + {{- if in (slice "true" true 1) ($.Get "loop") }} {{- $loop = 1 }} + {{- else if in (slice "false" false 0) ($.Get "loop") }} + {{- $loop = 0 }} {{- end }} - {{- if in (slice "false" false 0) ($.Get "mute") }} - {{- $mute = 0 }} - {{- else if or (in (slice "true" true 1) ($.Get "mute")) $autoplay }} + {{- if or (in (slice "true" true 1) ($.Get "mute")) $autoplay }} {{- $mute = 1 }} + {{- else if in (slice "false" false 0) ($.Get "mute") }} + {{- $mute = 0 }} {{- end }} {{- $class := or ($.Get "class") $class }} {{- $end := or ($.Get "end") $end }} @@ -69,6 +71,11 @@ Renders an embedded YouTube video. {{- $start := or ($.Get "start") $start }} {{- $title := or ($.Get "title") $title }} + {{- /* Adjust iframeAllowList. */}} + {{- if $allowFullScreen }} + {{- $iframeAllowList = printf "%s; fullscreen" $iframeAllowList }} + {{- end }} + {{- /* Define src attribute. */}} {{- $host := cond $pc.PrivacyEnhanced "www.youtube-nocookie.com" "www.youtube.com" }} {{- $src := printf "https://%s/embed/%s" $host $id }} diff --git a/tpl/tplimpl/shortcodes_integration_test.go b/tpl/tplimpl/shortcodes_integration_test.go index 9c541a1e2..9d7af4a3d 100644 --- a/tpl/tplimpl/shortcodes_integration_test.go +++ b/tpl/tplimpl/shortcodes_integration_test.go @@ -488,9 +488,9 @@ Content: {{ .Content }} // Regular mode b := hugolib.Test(t, files) - b.AssertFileContent("public/p1/index.html", "f7687b0c4e85b7d4") - b.AssertFileContent("public/p2/index.html", "f7687b0c4e85b7d4") - b.AssertFileContent("public/p3/index.html", "caca499bdc7f1e1e") + b.AssertFileContent("public/p1/index.html", "82566e6b8d04b53e") + b.AssertFileContent("public/p2/index.html", "82566e6b8d04b53e") + b.AssertFileContent("public/p3/index.html", "2b5f9cc3167d1336") // Simple mode files = strings.ReplaceAll(files, "privacy.vimeo.simple = false", "privacy.vimeo.simple = true") @@ -687,12 +687,12 @@ title: p2 b := hugolib.Test(t, files) - b.AssertFileContent("public/p1/index.html", "5156322adda11844") + b.AssertFileContent("public/p1/index.html", "4b54bf9bd03946ec") b.AssertFileContent("public/p2/index.html", "289c655e727e596c") files = strings.ReplaceAll(files, "privacy.youtube.privacyEnhanced = false", "privacy.youtube.privacyEnhanced = true") b = hugolib.Test(t, files) - b.AssertFileContent("public/p1/index.html", "599174706edf963a") + b.AssertFileContent("public/p1/index.html", "78eb19b5c6f3768f") b.AssertFileContent("public/p2/index.html", "a6db910a9cf54bc1") } From 07983e04e29986a683c7a9f15d48b83e90aff09c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Fri, 25 Apr 2025 08:31:26 +0200 Subject: [PATCH 048/129] tpl: Fix it so we always prefer internal codeblock rendering over render-codeblock-foo.html and similar Fixes #13651 --- tpl/tplimpl/templatedescriptor.go | 13 +++------ tpl/tplimpl/templatestore_integration_test.go | 29 +++++++++++++++++++ 2 files changed, 33 insertions(+), 9 deletions(-) diff --git a/tpl/tplimpl/templatedescriptor.go b/tpl/tplimpl/templatedescriptor.go index f65ad3943..ea47afc88 100644 --- a/tpl/tplimpl/templatedescriptor.go +++ b/tpl/tplimpl/templatedescriptor.go @@ -130,17 +130,12 @@ func (this TemplateDescriptor) doCompare(category Category, isEmbedded bool, def // One example of variant1 and 2 is for render codeblocks: // variant1=codeblock, variant2=go (language). - if other.Variant1 != "" && other.Variant1 != this.Variant1 { - return w - } - - if isEmbedded { - if other.Variant2 != "" && other.Variant2 != this.Variant2 { + if other.Variant1 != "" { + if other.Variant1 != this.Variant1 { return w } - } else { - // If both are set and different, no match. - if other.Variant2 != "" && this.Variant2 != "" && other.Variant2 != this.Variant2 { + + if other.Variant2 != "" && other.Variant2 != this.Variant2 { return w } } diff --git a/tpl/tplimpl/templatestore_integration_test.go b/tpl/tplimpl/templatestore_integration_test.go index bd00f82b7..638341581 100644 --- a/tpl/tplimpl/templatestore_integration_test.go +++ b/tpl/tplimpl/templatestore_integration_test.go @@ -1038,6 +1038,35 @@ _markup/render-codeblock-goat.html b.AssertFileContent("public/index.html", "_markup/render-codeblock.html_markup/render-codeblock-goat.html") } +func TestLookupCodeblockIssue13651(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +-- layouts/all.html -- +{{ .Content }}| +-- layouts/_markup/render-codeblock-foo.html -- +render-codeblock-foo.html +-- content/_index.md -- +--- +--- + +§§§ +printf "Hello, world!" +§§§ + +§§§ foo +printf "Hello, world again!" +§§§ +` + + b := hugolib.Test(t, files) + + content := b.FileContent("public/index.html") + fooCount := strings.Count(content, "render-codeblock-foo.html") + b.Assert(fooCount, qt.Equals, 1) +} + // Issue #13515 func TestPrintPathWarningOnDotRemoval(t *testing.T) { t.Parallel() From 7d0039b86ddd6397816cc3383cb0cfa481b15f32 Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Fri, 25 Apr 2025 15:26:28 +0000 Subject: [PATCH 049/129] releaser: Bump versions for release of 0.147.0 [ci skip] --- common/hugo/version_current.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/hugo/version_current.go b/common/hugo/version_current.go index 141b88d57..7b6bd52ef 100644 --- a/common/hugo/version_current.go +++ b/common/hugo/version_current.go @@ -19,5 +19,5 @@ var CurrentVersion = Version{ Major: 0, Minor: 147, PatchLevel: 0, - Suffix: "-DEV", + Suffix: "", } From 5857b60cbc14395a8d8d54bfbdb0ddcba6e6c732 Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Fri, 25 Apr 2025 15:41:01 +0000 Subject: [PATCH 050/129] releaser: Prepare repository for 0.148.0-DEV [ci skip] --- common/hugo/version_current.go | 4 ++-- hugoreleaser.env | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/common/hugo/version_current.go b/common/hugo/version_current.go index 7b6bd52ef..ba367ceb5 100644 --- a/common/hugo/version_current.go +++ b/common/hugo/version_current.go @@ -17,7 +17,7 @@ package hugo // This should be the only one. var CurrentVersion = Version{ Major: 0, - Minor: 147, + Minor: 148, PatchLevel: 0, - Suffix: "", + Suffix: "-DEV", } diff --git a/hugoreleaser.env b/hugoreleaser.env index 901312a41..9d9a10112 100644 --- a/hugoreleaser.env +++ b/hugoreleaser.env @@ -1,7 +1,8 @@ # Release env. # These will be replaced by script before release. -HUGORELEASER_TAG=v0.146.7 -HUGORELEASER_COMMITISH=1ad3d39dc4693434505fc81f91eed57333017e93 +HUGORELEASER_TAG=v0.147.0 +HUGORELEASER_COMMITISH=7d0039b86ddd6397816cc3383cb0cfa481b15f32 + From 31db7edf6ded3961d76f7661b93794bf0a241060 Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Sat, 26 Apr 2025 07:04:50 -0700 Subject: [PATCH 051/129] hugolib: Use new build key in content placeholder Fixes #13655 --- hugolib/content_factory.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hugolib/content_factory.go b/hugolib/content_factory.go index 109e988b1..36cb29e63 100644 --- a/hugolib/content_factory.go +++ b/hugolib/content_factory.go @@ -114,7 +114,7 @@ func (f ContentFactory) CreateContentPlaceHolder(filename string, force bool) (s // the paths correct. placeholder := `--- title: "Content Placeholder" -_build: +build: render: never list: never publishResources: false From 673a4d00ebd1ae24d55b72a74f522f311ed018a7 Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Sun, 27 Apr 2025 05:50:51 -0700 Subject: [PATCH 052/129] commands/server: Display correct multihost language in console Fixes #12564 --- commands/server.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/commands/server.go b/commands/server.go index 11b43a80f..c8895b9a1 100644 --- a/commands/server.go +++ b/commands/server.go @@ -627,7 +627,7 @@ func (c *serverCommand) setServerInfoInConfig() error { panic("no server ports set") } return c.withConfE(func(conf *commonConfig) error { - for i, language := range conf.configs.Languages { + for i, language := range conf.configs.LanguagesDefaultFirst { isMultihost := conf.configs.IsMultihost var serverPort int if isMultihost { From a1cb15e1cf9b7606d36552dc31d2ade613318c55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Sun, 27 Apr 2025 18:58:25 +0200 Subject: [PATCH 053/129] Fix it so the owning taxonomy gets rerendered in server when new tags are added Updates #13648 --- hugolib/content_map_page.go | 11 +++++++++++ hugolib/hugo_sites_build.go | 8 ++++++++ hugolib/rebuild_test.go | 27 +++++++++++++++++++++++++++ 3 files changed, 46 insertions(+) diff --git a/hugolib/content_map_page.go b/hugolib/content_map_page.go index c51b4a17a..be834fbb6 100644 --- a/hugolib/content_map_page.go +++ b/hugolib/content_map_page.go @@ -1330,6 +1330,7 @@ func (h *HugoSites) resolveAndResetDependententPageOutputs(ctx context.Context, // This needs no reset, so no need to check it. return nil } + // First check the top level dependency manager. for _, id := range changes { checkedCounter.Add(1) @@ -1645,6 +1646,8 @@ func (sa *sitePagesAssembler) assembleTermsAndTranslations() error { views = sa.pageMap.cfg.taxonomyConfig.views ) + rebuild := sa.s.h.isRebuild() + lockType := doctree.LockTypeWrite w := &doctree.NodeShiftTreeWalker[contentNodeI]{ Tree: pages, @@ -1677,6 +1680,14 @@ func (sa *sitePagesAssembler) assembleTermsAndTranslations() error { pi := sa.Site.Conf.PathParser().Parse(files.ComponentFolderContent, viewTermKey+"/_index.md") term := pages.Get(pi.Base()) if term == nil { + if rebuild { + // A new tag was added in server mode. + taxonomy := pages.Get(viewName.pluralTreeKey) + if taxonomy != nil { + sa.assembleChanges.Add(taxonomy.GetIdentity()) + } + } + m := &pageMeta{ term: v, singular: viewName.singular, diff --git a/hugolib/hugo_sites_build.go b/hugolib/hugo_sites_build.go index ce4ca370c..ce8ddd143 100644 --- a/hugolib/hugo_sites_build.go +++ b/hugolib/hugo_sites_build.go @@ -324,6 +324,14 @@ func (h *HugoSites) assemble(ctx context.Context, l logg.LevelLogger, bcfg *Buil } } + // Handle new terms from assemblePagesStep2. + changes = bcfg.WhatChanged.Drain() + if len(changes) > 0 { + if err := h.resolveAndClearStateForIdentities(ctx, l, nil, changes); err != nil { + return err + } + } + h.renderFormats = output.Formats{} for _, s := range h.Sites { s.s.initRenderFormats() diff --git a/hugolib/rebuild_test.go b/hugolib/rebuild_test.go index 9d95a4b75..f5c0befcc 100644 --- a/hugolib/rebuild_test.go +++ b/hugolib/rebuild_test.go @@ -1865,3 +1865,30 @@ p1-content| b.EditFileReplaceAll("content/p1/index.md", "p1-content", "p1-content-foo").Build() b.AssertFileContent("public/p1/index.html", "p1-content-foo") } + +func TestRebuildEditTagIssue13648(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +baseURL = "https://example.com" +disableLiveReload = true +-- layouts/all.html -- +All. {{ range .Pages }}{{ .Title }}|{{ end }} +-- content/p1.md -- +--- +title: "P1" +tags: ["tag1"] +--- + +` + b := TestRunning(t, files) + + b.AssertFileContent("public/tags/index.html", "All. Tag1|") + b.EditFileReplaceAll("content/p1.md", "tag1", "tag2").Build() + + // Note that the below is still not correct, as this is effectively a rename, and + // Tag2 should be removed from the list. + // But that is a harder problem to tackle. + b.AssertFileContent("public/tags/index.html", "All. Tag1|Tag2|") +} From be93d5218bee67c3b94be884fef5a9080d4c4080 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Wed, 30 Apr 2025 19:49:42 +0200 Subject: [PATCH 054/129] tpl: Fix overlapping layout sections Fixes #13672 --- tpl/tplimpl/templatestore.go | 16 ++++++++++++++++ tpl/tplimpl/templatestore_integration_test.go | 16 ++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/tpl/tplimpl/templatestore.go b/tpl/tplimpl/templatestore.go index e6cd49c66..4adf76b29 100644 --- a/tpl/tplimpl/templatestore.go +++ b/tpl/tplimpl/templatestore.go @@ -323,6 +323,9 @@ func (ti *TemplInfo) findBestMatchBaseof(s *TemplateStore, d1 TemplateDescriptor } ti.baseVariants.WalkPath(k1, func(k2 string, v map[TemplateDescriptor]*TemplWithBaseApplied) (bool, error) { + if !s.inPath(k1, k2) { + return false, nil + } slashCountK2 := strings.Count(k2, "/") distance := slashCountK1 - slashCountK2 @@ -615,6 +618,9 @@ func (s *TemplateStore) LookupShortcode(q TemplateQuery) *TemplInfo { defer s.putBest(best) s.treeShortcodes.WalkPath(k1, func(k2 string, m map[string]map[TemplateDescriptor]*TemplInfo) (bool, error) { + if !s.inPath(k1, k2) { + return false, nil + } slashCountK2 := strings.Count(k2, "/") distance := slashCountK1 - slashCountK2 @@ -780,8 +786,18 @@ func (s *TemplateStore) findBestMatchGet(key string, category Category, consider } } +func (s *TemplateStore) inPath(k1, k2 string) bool { + if k1 != k2 && !strings.HasPrefix(k1, k2+"/") { + return false + } + return true +} + func (s *TemplateStore) findBestMatchWalkPath(q TemplateQuery, k1 string, slashCountK1 int, best *bestMatch) { s.treeMain.WalkPath(k1, func(k2 string, v map[nodeKey]*TemplInfo) (bool, error) { + if !s.inPath(k1, k2) { + return false, nil + } slashCountK2 := strings.Count(k2, "/") distance := slashCountK1 - slashCountK2 diff --git a/tpl/tplimpl/templatestore_integration_test.go b/tpl/tplimpl/templatestore_integration_test.go index 638341581..8d3e52468 100644 --- a/tpl/tplimpl/templatestore_integration_test.go +++ b/tpl/tplimpl/templatestore_integration_test.go @@ -1396,3 +1396,19 @@ layouts/taxononmy.html.html b.AssertFileExists("public/p1/index.html", false) } } + +func TestTemplateLoopBlogVsBlogrollIssue13672(t *testing.T) { + t.Parallel() + files := ` +-- hugo.toml -- +-- layouts/blog/all.html -- +blog/all.html +-- layouts/blogroll/all.html -- +blogroll/all.html +-- content/blogroll/p1.md -- +` + + b := hugolib.Test(t, files) + + b.AssertFileContent("public/blogroll/p1/index.html", "blogroll/all.html") +} From 927d1ec6c152bcfc569397fb243d5acdb983686b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 28 Apr 2025 08:25:13 +0000 Subject: [PATCH 055/129] build(deps): bump github.com/yuin/goldmark from 1.7.10 to 1.7.11 Bumps [github.com/yuin/goldmark](https://github.com/yuin/goldmark) from 1.7.10 to 1.7.11. - [Release notes](https://github.com/yuin/goldmark/releases) - [Commits](https://github.com/yuin/goldmark/compare/v1.7.10...v1.7.11) --- updated-dependencies: - dependency-name: github.com/yuin/goldmark dependency-version: 1.7.11 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index fba76335f..b2134802a 100644 --- a/go.mod +++ b/go.mod @@ -69,7 +69,7 @@ require ( github.com/tdewolff/minify/v2 v2.20.37 github.com/tdewolff/parse/v2 v2.7.15 github.com/tetratelabs/wazero v1.9.0 - github.com/yuin/goldmark v1.7.10 + github.com/yuin/goldmark v1.7.11 github.com/yuin/goldmark-emoji v1.0.6 go.uber.org/automaxprocs v1.5.3 gocloud.dev v0.40.0 diff --git a/go.sum b/go.sum index b432e1d6b..2d97b5ff0 100644 --- a/go.sum +++ b/go.sum @@ -466,8 +466,8 @@ github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/yuin/goldmark v1.7.10 h1:S+LrtBjRmqMac2UdtB6yyCEJm+UILZ2fefI4p7o0QpI= -github.com/yuin/goldmark v1.7.10/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= +github.com/yuin/goldmark v1.7.11 h1:ZCxLyDMtz0nT2HFfsYG8WZ47Trip2+JyLysKcMYE5bo= +github.com/yuin/goldmark v1.7.11/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= github.com/yuin/goldmark-emoji v1.0.6 h1:QWfF2FYaXwL74tfGOW5izeiZepUDroDJfWubQI9HTHs= github.com/yuin/goldmark-emoji v1.0.6/go.mod h1:ukxJDKFpdFb5x0a5HqbdlcKtebh086iJpI31LTKmWuA= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= From 5fec7829b1de5e2953e80230139da05ee36f1ec0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Thu, 1 May 2025 09:36:03 +0200 Subject: [PATCH 056/129] tpl: Add some more test cases See #13672 See #13668 --- tpl/tplimpl/templatestore_integration_test.go | 53 +++++++++++++++++-- 1 file changed, 50 insertions(+), 3 deletions(-) diff --git a/tpl/tplimpl/templatestore_integration_test.go b/tpl/tplimpl/templatestore_integration_test.go index 8d3e52468..75ec0376f 100644 --- a/tpl/tplimpl/templatestore_integration_test.go +++ b/tpl/tplimpl/templatestore_integration_test.go @@ -1401,14 +1401,61 @@ func TestTemplateLoopBlogVsBlogrollIssue13672(t *testing.T) { t.Parallel() files := ` -- hugo.toml -- +-- layouts/blog/_shortcodes/myshortcode.html -- +layouts/blog/_shortcodes/myshortcode.html +-- layouts/blog/baseof.html -- +blog/baseof.html {{ block "main" . }}{{ end }} -- layouts/blog/all.html -- -blog/all.html +{{ define "main" }}blog/all.html|{{ .Content}}{{ end }} +-- layouts/blogroll/_shortcodes/myshortcode.html -- +layouts/blogroll/myshortcode.html +-- layouts/blogroll/baseof.html -- +{{ block "main" . }}blogroll/baseof.html{{ end }} -- layouts/blogroll/all.html -- -blogroll/all.html +{{ define "main" }}blogroll/all.html|{{ .Content}}{{ end }} +-- content/blog/p1.md -- +--- +title: p1 +--- +{{< myshortcode >}} -- content/blogroll/p1.md -- +--- +title: p1 +--- +{{< myshortcode >}} ` b := hugolib.Test(t, files) - b.AssertFileContent("public/blogroll/p1/index.html", "blogroll/all.html") + b.AssertFileContent("public/blog/p1/index.html", "blog/baseof.html blog/all.html|layouts/blog/_shortcodes/myshortcode.html") + b.AssertFileContent("public/blogroll/p1/index.html", "blogroll/all.html|layouts/blogroll/myshortcode.html") +} + +// See issue #13668. +func TestPartialPlainTextVsHTML(t *testing.T) { + t.Parallel() + + /* + Note that in the below, there's no output format named txt, + so the isPlainText is fetched from the only output format with that extension. + */ + files := ` +-- hugo.toml -- +-- layouts/_partials/myhtml.html -- +