From 84ee00bbc24328295237695a39e6e876ed186312 Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Thu, 5 Sep 2024 10:32:40 +0000 Subject: [PATCH 001/526] releaser: Prepare repository for 0.135.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 9017027d9..21442b238 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: 134, - PatchLevel: 1, - Suffix: "", + Minor: 135, + PatchLevel: 0, + Suffix: "-DEV", } diff --git a/hugoreleaser.env b/hugoreleaser.env index 1c0d4a820..9880a7785 100644 --- a/hugoreleaser.env +++ b/hugoreleaser.env @@ -1,7 +1,8 @@ # Release env. # These will be replaced by script before release. -HUGORELEASER_TAG=v0.134.0 -HUGORELEASER_COMMITISH=77df7bbbff8ce6b56ed693270088de973a87d5ce +HUGORELEASER_TAG=v0.134.1 +HUGORELEASER_COMMITISH=2f89169baa87a9db47e288b60705f4e99e21a945 + From 3d6baedaec306300f2c6f7ed471e774dca0f112a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Tue, 10 Sep 2024 08:54:03 +0200 Subject: [PATCH 002/526] Don't count HTML markup in auto summaries This commit also fixes a bug where a `` end tag was wrongly used to detect a end paragraph. This should be very rare, though. Closes #12837 --- hugolib/page_test.go | 2 +- resources/page/page_markup.go | 20 ++++++++++- resources/page/page_markup_test.go | 57 ++++++++++++++++++++++++++++++ 3 files changed, 77 insertions(+), 2 deletions(-) diff --git a/hugolib/page_test.go b/hugolib/page_test.go index 66afd7d96..429ab2659 100644 --- a/hugolib/page_test.go +++ b/hugolib/page_test.go @@ -593,7 +593,7 @@ func TestPageSummary(t *testing.T) { // Source is not Asciidoctor- or RST-compatible so don't test them if ext != "ad" && ext != "rst" { checkPageContent(t, p, normalizeExpected(ext, "

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

\n\n

Additional text.

\n\n

Further text.

\n"), ext) - checkPageSummary(t, p, normalizeExpected(ext, "

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

"), ext) + checkPageSummary(t, p, normalizeExpected(ext, "

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Additional text.

"), ext) } checkPageType(t, p, "page") } diff --git a/resources/page/page_markup.go b/resources/page/page_markup.go index ef4a56e3a..44980e8b0 100644 --- a/resources/page/page_markup.go +++ b/resources/page/page_markup.go @@ -161,6 +161,16 @@ func (s *HtmlSummary) resolveParagraphTagAndSetWrapper(mt media.Type) tagReStart return ptag } +// Avoid counting words that are most likely HTML tokens. +var ( + isProbablyHTMLTag = regexp.MustCompile(`^<\/?[A-Za-z]+>?$`) + isProablyHTMLAttribute = regexp.MustCompile(`^[A-Za-z]+=["']`) +) + +func isProbablyHTMLToken(s string) bool { + return s == ">" || isProbablyHTMLTag.MatchString(s) || isProablyHTMLAttribute.MatchString(s) +} + // ExtractSummaryFromHTML extracts a summary from the given HTML content. func ExtractSummaryFromHTML(mt media.Type, input string, numWords int, isCJK bool) (result HtmlSummary) { result.source = input @@ -173,6 +183,14 @@ func ExtractSummaryFromHTML(mt media.Type, input string, numWords int, isCJK boo var count int countWord := func(word string) int { + word = strings.TrimSpace(word) + if len(word) == 0 { + return 0 + } + if isProbablyHTMLToken(word) { + return 0 + } + if isCJK { word = tpl.StripHTML(word) runeCount := utf8.RuneCountInString(word) @@ -193,7 +211,7 @@ func ExtractSummaryFromHTML(mt media.Type, input string, numWords int, isCJK boo for j := result.WrapperStart.High; j < high; { s := input[j:] - closingIndex := strings.Index(s, "") if closingIndex == -1 { break diff --git a/resources/page/page_markup_test.go b/resources/page/page_markup_test.go index b7d363f8f..43eaae6f6 100644 --- a/resources/page/page_markup_test.go +++ b/resources/page/page_markup_test.go @@ -49,6 +49,46 @@ func TestExtractSummaryFromHTML(t *testing.T) { } } +// See https://discourse.gohugo.io/t/automatic-summarys-summarylength-seems-broken-in-the-case-of-plainify/51466/4 +// Also issue 12837 +func TestExtractSummaryFromHTMLLotsOfHTMLInSummary(t *testing.T) { + c := qt.New(t) + + input := ` +

+

+ + 1 + + + 2 + + + 3 + + + 4 + + + 5 + +
+

+

+This is a story about a cat. +

+

+The cat was white and fluffy. +

+

+And it liked milk. +

+` + + summary := ExtractSummaryFromHTML(media.Builtin.MarkdownType, input, 10, false) + c.Assert(strings.HasSuffix(summary.Summary(), "

\nThis is a story about a cat.\n

\n

\nThe cat was white and fluffy.\n

"), qt.IsTrue) +} + func TestExtractSummaryFromHTMLWithDivider(t *testing.T) { c := qt.New(t) @@ -114,6 +154,23 @@ func TestExpandDivider(t *testing.T) { } } +func TestIsProbablyHTMLToken(t *testing.T) { + c := qt.New(t) + + for i, test := range []struct { + input string + expect bool + }{ + {"

", true}, + {"Æøå", false}, + } { + c.Assert(isProbablyHTMLToken(test.input), qt.Equals, test.expect, qt.Commentf("[%d] Test.expect %q", i, test.input)) + } +} + func BenchmarkSummaryFromHTML(b *testing.B) { b.StopTimer() input := "

First paragraph

Second paragraph

" From 1c74abd26070b0c12849550c974a9f3f1e7afb06 Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Tue, 10 Sep 2024 10:46:33 +0000 Subject: [PATCH 003/526] releaser: Bump versions for release of 0.134.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 21442b238..45d3e917c 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: 135, - PatchLevel: 0, - Suffix: "-DEV", + Minor: 134, + PatchLevel: 2, + Suffix: "", } From fe7e137e28de66fb68af1089c6248b01fb318b49 Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Tue, 10 Sep 2024 11:00:15 +0000 Subject: [PATCH 004/526] releaser: Prepare repository for 0.135.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 45d3e917c..21442b238 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: 134, - PatchLevel: 2, - Suffix: "", + Minor: 135, + PatchLevel: 0, + Suffix: "-DEV", } diff --git a/hugoreleaser.env b/hugoreleaser.env index 9880a7785..6bb01efa1 100644 --- a/hugoreleaser.env +++ b/hugoreleaser.env @@ -1,7 +1,8 @@ # Release env. # These will be replaced by script before release. -HUGORELEASER_TAG=v0.134.1 -HUGORELEASER_COMMITISH=2f89169baa87a9db47e288b60705f4e99e21a945 +HUGORELEASER_TAG=v0.134.2 +HUGORELEASER_COMMITISH=1c74abd26070b0c12849550c974a9f3f1e7afb06 + From 28f621d4a73ca7e97e23b33cbf3780ddab188d24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Thu, 12 Sep 2024 09:13:47 +0200 Subject: [PATCH 005/526] internal/warpc: Improve the JS plugin API * Move the error handling into commons and make sure the error returned also returns message errors * Make the protocol version an int so it can be more easily compared --- internal/warpc/js/common.js | 14 +++++-- internal/warpc/js/greet.bundle.js | 4 +- internal/warpc/js/renderkatex.bundle.js | 10 ++--- internal/warpc/js/renderkatex.js | 10 ++--- internal/warpc/warpc.go | 16 ++++++-- internal/warpc/warpc_test.go | 52 ++++++++++++++++-------- internal/warpc/wasm/greet.wasm | Bin 2226 -> 2361 bytes internal/warpc/wasm/renderkatex.wasm | Bin 472553 -> 472649 bytes tpl/transform/transform.go | 5 +-- 9 files changed, 68 insertions(+), 43 deletions(-) diff --git a/internal/warpc/js/common.js b/internal/warpc/js/common.js index 90ea1a1bc..49aba9b4b 100644 --- a/internal/warpc/js/common.js +++ b/internal/warpc/js/common.js @@ -41,13 +41,21 @@ export function readInput(handle) { if (currentLine[i] === 10) { const chunk = currentLine.splice(j, i + 1); const arr = new Uint8Array(chunk); - let json; + let message; try { - json = JSON.parse(new TextDecoder().decode(arr)); + message = JSON.parse(new TextDecoder().decode(arr)); } catch (e) { throw new Error(`Error parsing JSON '${new TextDecoder().decode(arr)}' from stdin: ${e.message}`); } - handle(json); + + try { + handle(message); + } catch (e) { + let header = message.header; + header.err = e.message; + writeOutput({ header: header }); + } + j = i + 1; } } diff --git a/internal/warpc/js/greet.bundle.js b/internal/warpc/js/greet.bundle.js index f6776cf53..c5aa4a13a 100644 --- a/internal/warpc/js/greet.bundle.js +++ b/internal/warpc/js/greet.bundle.js @@ -1,2 +1,2 @@ -(()=>{function s(r){let e=[],c=new Uint8Array(1024);for(;;){let n=0;try{n=Javy.IO.readSync(0,c)}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,...c.subarray(0,n)],!e.includes(10))continue;let t=0;for(let o=0;t{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 Ut(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 o=0;for(let h=0;o{function Ut(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 o=0;for(let h=0;o15?p="\u2026"+h.slice(n-15,n):p=h.slice(0,n);var g;s+15":">","<":"<",'"':""","'":"'"},za=/[&><"']/g;function Aa(r){return String(r).replace(za,e=>Ma[e])}var wr=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},Ta=function(e){var t=wr(e);return t.type==="mathord"||t.type==="textord"||t.type==="atom"},Ba=function(e){if(!e)throw new Error("Expected non-null, but got "+String(e));return e},Da=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"},N={contains:xa,deflt:wa,escape:Aa,hyphenate:Sa,getBaseElem:wr,isCharacterBox:Ta,protocolFromUrl:Da},qe={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 Ca(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 he=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 qe)if(qe.hasOwnProperty(t)){var a=qe[t];this[t]=e[t]!==void 0?a.processor?a.processor(e[t]):e[t]:Ca(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 M("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=N.protocolFromUrl(e.url);if(t==null)return!1;e.protocol=t}var a=typeof this.trust=="function"?this.trust(e):this.trust;return!!a}},x0=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 w0[qa[this.id]]}sub(){return w0[Na[this.id]]}fracNum(){return w0[Ea[this.id]]}fracDen(){return w0[Ra[this.id]]}cramp(){return w0[Ia[this.id]]}text(){return w0[Oa[this.id]]}isTight(){return this.size>=2}},kt=0,Ee=1,te=2,C0=3,me=4,f0=5,re=6,n0=7,w0=[new x0(kt,0,!1),new x0(Ee,0,!0),new x0(te,1,!1),new x0(C0,1,!0),new x0(me,2,!1),new x0(f0,2,!0),new x0(re,3,!1),new x0(n0,3,!0)],qa=[me,f0,me,f0,re,n0,re,n0],Na=[f0,f0,f0,f0,n0,n0,n0,n0],Ea=[te,C0,me,f0,re,n0,re,n0],Ra=[C0,C0,f0,f0,n0,n0,n0,n0],Ia=[Ee,Ee,C0,C0,f0,f0,n0,n0],Oa=[kt,Ee,te,C0,te,C0,te,C0],R={DISPLAY:w0[kt],TEXT:w0[te],SCRIPT:w0[me],SCRIPTSCRIPT:w0[re]},ht=[{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 Ne=[];ht.forEach(r=>r.blocks.forEach(e=>Ne.push(...e)));function kr(r){for(var e=0;e=Ne[e]&&r<=Ne[e+1])return!0;return!1}var ee=80,Fa=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 @@ -253,10 +253,10 @@ c-55.7,194.7,-131.8,370.3,-228.5,527c-20.7,34.7,-41.7,66.3,-63,95c-2,3.3,-4,7,-6 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.")}},X0=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 N.contains(this.classes,e)}toNode(){for(var e=document.createDocumentFragment(),t=0;tt.toText();return this.children.map(e).join("")}},k0={"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]}},xe={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]},Yt={\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){k0[r]=e}function St(r,e,t){if(!k0[e])throw new Error("Font metrics not found for font: "+e+".");var a=r.charCodeAt(0),n=k0[e][a];if(!n&&r[0]in Yt&&(a=Yt[r[0]].charCodeAt(0),n=k0[e][a]),!n&&t==="text"&&kr(a)&&(n=k0[e][77]),n)return{depth:n[0],height:n[1],italic:n[2],skew:n[3],width:n[4]}}var Qe={};function Za(r){var e;if(r>=5?e=0:r>=3?e=1:e=2,!Qe[e]){var t=Qe[e]={cssEmPerMu:xe.quad[e]/18};for(var a in xe)xe.hasOwnProperty(a)&&(t[a]=xe[a][e])}return Qe[e]}var Ka=[[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]],Xt=[.5,.6,.7,.8,.9,1,1.2,1.44,1.728,2.074,2.488],Wt=function(e,t){return t.size<2?e:Ka[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=Xt[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:Wt(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:Xt[e-1]})}havingBaseStyle(e){e=e||this.style.text();var t=Wt(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=Za(this.size)),this._fontMetrics}getColor(){return this.phantom?"transparent":this.color}};Re.BASESIZE=6;var mt={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},Ja={ex:!0,em:!0,mu:!0},Sr=function(e){return typeof e!="string"&&(e=e.unit),e in mt||e in Ja||e==="ex"},J=function(e,t){var a;if(e.unit in mt)a=mt[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 M("Invalid unit: '"+e.unit+"'");n!==t&&(a*=n.sizeMultiplier/t.sizeMultiplier)}return Math.min(e.number*a,t.maxSize)},A=function(e){return+e.toFixed(4)+"em"},P0=function(e){return e.filter(t=>t).join(" ")},Mr=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)}},zr=function(e){var t=document.createElement(e);t.className=P0(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",t},W0=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,Mr.call(this,e,a,n),this.children=t||[]}setAttribute(e,t){this.attributes[e]=t}hasClass(e){return N.contains(this.classes,e)}toNode(){return zr.call(this,"span")}toMarkup(){return Ar.call(this,"span")}},ce=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,Mr.call(this,t,n),this.children=a||[],this.setAttribute("href",e)}setAttribute(e,t){this.attributes[e]=t}hasClass(e){return N.contains(this.classes,e)}toNode(){return zr.call(this,"a")}toMarkup(){return Ar.call(this,"a")}},ct=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 N.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=''+N.escape(this.alt)+'0&&(t=document.createElement("span"),t.style.marginRight=A(this.italic)),this.classes.length>0&&(t=t||document.createElement("span"),t.className=P0(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+=N.hyphenate(n)+":"+this.style[n]+";");a&&(e=!0,t+=' style="'+N.escape(a)+'"');var s=N.escape(this.text);return e?(t+=">",t+=s,t+="",t):s}},y0=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':''}},de=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 e1={bin:1,close:1,inner:1,open:1,punct:1,rel:1},t1={"accent-token":1,mathord:1,"op-token":1,spacing:1,textord:1},X={math:{},text:{}};function i(r,e,t,a,n,s){X[r][n]={font:e,group:t,replace:a},s&&a&&(X[r][a]=X[r][n])}var l="math",k="text",u="main",d="ams",W="accent-token",D="bin",i0="close",ae="inner",E="mathord",_="op-token",c0="open",Ge="punct",f="rel",R0="spacing",v="textord";i(l,u,f,"\u2261","\\equiv",!0);i(l,u,f,"\u227A","\\prec",!0);i(l,u,f,"\u227B","\\succ",!0);i(l,u,f,"\u223C","\\sim",!0);i(l,u,f,"\u22A5","\\perp");i(l,u,f,"\u2AAF","\\preceq",!0);i(l,u,f,"\u2AB0","\\succeq",!0);i(l,u,f,"\u2243","\\simeq",!0);i(l,u,f,"\u2223","\\mid",!0);i(l,u,f,"\u226A","\\ll",!0);i(l,u,f,"\u226B","\\gg",!0);i(l,u,f,"\u224D","\\asymp",!0);i(l,u,f,"\u2225","\\parallel");i(l,u,f,"\u22C8","\\bowtie",!0);i(l,u,f,"\u2323","\\smile",!0);i(l,u,f,"\u2291","\\sqsubseteq",!0);i(l,u,f,"\u2292","\\sqsupseteq",!0);i(l,u,f,"\u2250","\\doteq",!0);i(l,u,f,"\u2322","\\frown",!0);i(l,u,f,"\u220B","\\ni",!0);i(l,u,f,"\u221D","\\propto",!0);i(l,u,f,"\u22A2","\\vdash",!0);i(l,u,f,"\u22A3","\\dashv",!0);i(l,u,f,"\u220B","\\owns");i(l,u,Ge,".","\\ldotp");i(l,u,Ge,"\u22C5","\\cdotp");i(l,u,v,"#","\\#");i(k,u,v,"#","\\#");i(l,u,v,"&","\\&");i(k,u,v,"&","\\&");i(l,u,v,"\u2135","\\aleph",!0);i(l,u,v,"\u2200","\\forall",!0);i(l,u,v,"\u210F","\\hbar",!0);i(l,u,v,"\u2203","\\exists",!0);i(l,u,v,"\u2207","\\nabla",!0);i(l,u,v,"\u266D","\\flat",!0);i(l,u,v,"\u2113","\\ell",!0);i(l,u,v,"\u266E","\\natural",!0);i(l,u,v,"\u2663","\\clubsuit",!0);i(l,u,v,"\u2118","\\wp",!0);i(l,u,v,"\u266F","\\sharp",!0);i(l,u,v,"\u2662","\\diamondsuit",!0);i(l,u,v,"\u211C","\\Re",!0);i(l,u,v,"\u2661","\\heartsuit",!0);i(l,u,v,"\u2111","\\Im",!0);i(l,u,v,"\u2660","\\spadesuit",!0);i(l,u,v,"\xA7","\\S",!0);i(k,u,v,"\xA7","\\S");i(l,u,v,"\xB6","\\P",!0);i(k,u,v,"\xB6","\\P");i(l,u,v,"\u2020","\\dag");i(k,u,v,"\u2020","\\dag");i(k,u,v,"\u2020","\\textdagger");i(l,u,v,"\u2021","\\ddag");i(k,u,v,"\u2021","\\ddag");i(k,u,v,"\u2021","\\textdaggerdbl");i(l,u,i0,"\u23B1","\\rmoustache",!0);i(l,u,c0,"\u23B0","\\lmoustache",!0);i(l,u,i0,"\u27EF","\\rgroup",!0);i(l,u,c0,"\u27EE","\\lgroup",!0);i(l,u,D,"\u2213","\\mp",!0);i(l,u,D,"\u2296","\\ominus",!0);i(l,u,D,"\u228E","\\uplus",!0);i(l,u,D,"\u2293","\\sqcap",!0);i(l,u,D,"\u2217","\\ast");i(l,u,D,"\u2294","\\sqcup",!0);i(l,u,D,"\u25EF","\\bigcirc",!0);i(l,u,D,"\u2219","\\bullet",!0);i(l,u,D,"\u2021","\\ddagger");i(l,u,D,"\u2240","\\wr",!0);i(l,u,D,"\u2A3F","\\amalg");i(l,u,D,"&","\\And");i(l,u,f,"\u27F5","\\longleftarrow",!0);i(l,u,f,"\u21D0","\\Leftarrow",!0);i(l,u,f,"\u27F8","\\Longleftarrow",!0);i(l,u,f,"\u27F6","\\longrightarrow",!0);i(l,u,f,"\u21D2","\\Rightarrow",!0);i(l,u,f,"\u27F9","\\Longrightarrow",!0);i(l,u,f,"\u2194","\\leftrightarrow",!0);i(l,u,f,"\u27F7","\\longleftrightarrow",!0);i(l,u,f,"\u21D4","\\Leftrightarrow",!0);i(l,u,f,"\u27FA","\\Longleftrightarrow",!0);i(l,u,f,"\u21A6","\\mapsto",!0);i(l,u,f,"\u27FC","\\longmapsto",!0);i(l,u,f,"\u2197","\\nearrow",!0);i(l,u,f,"\u21A9","\\hookleftarrow",!0);i(l,u,f,"\u21AA","\\hookrightarrow",!0);i(l,u,f,"\u2198","\\searrow",!0);i(l,u,f,"\u21BC","\\leftharpoonup",!0);i(l,u,f,"\u21C0","\\rightharpoonup",!0);i(l,u,f,"\u2199","\\swarrow",!0);i(l,u,f,"\u21BD","\\leftharpoondown",!0);i(l,u,f,"\u21C1","\\rightharpoondown",!0);i(l,u,f,"\u2196","\\nwarrow",!0);i(l,u,f,"\u21CC","\\rightleftharpoons",!0);i(l,d,f,"\u226E","\\nless",!0);i(l,d,f,"\uE010","\\@nleqslant");i(l,d,f,"\uE011","\\@nleqq");i(l,d,f,"\u2A87","\\lneq",!0);i(l,d,f,"\u2268","\\lneqq",!0);i(l,d,f,"\uE00C","\\@lvertneqq");i(l,d,f,"\u22E6","\\lnsim",!0);i(l,d,f,"\u2A89","\\lnapprox",!0);i(l,d,f,"\u2280","\\nprec",!0);i(l,d,f,"\u22E0","\\npreceq",!0);i(l,d,f,"\u22E8","\\precnsim",!0);i(l,d,f,"\u2AB9","\\precnapprox",!0);i(l,d,f,"\u2241","\\nsim",!0);i(l,d,f,"\uE006","\\@nshortmid");i(l,d,f,"\u2224","\\nmid",!0);i(l,d,f,"\u22AC","\\nvdash",!0);i(l,d,f,"\u22AD","\\nvDash",!0);i(l,d,f,"\u22EA","\\ntriangleleft");i(l,d,f,"\u22EC","\\ntrianglelefteq",!0);i(l,d,f,"\u228A","\\subsetneq",!0);i(l,d,f,"\uE01A","\\@varsubsetneq");i(l,d,f,"\u2ACB","\\subsetneqq",!0);i(l,d,f,"\uE017","\\@varsubsetneqq");i(l,d,f,"\u226F","\\ngtr",!0);i(l,d,f,"\uE00F","\\@ngeqslant");i(l,d,f,"\uE00E","\\@ngeqq");i(l,d,f,"\u2A88","\\gneq",!0);i(l,d,f,"\u2269","\\gneqq",!0);i(l,d,f,"\uE00D","\\@gvertneqq");i(l,d,f,"\u22E7","\\gnsim",!0);i(l,d,f,"\u2A8A","\\gnapprox",!0);i(l,d,f,"\u2281","\\nsucc",!0);i(l,d,f,"\u22E1","\\nsucceq",!0);i(l,d,f,"\u22E9","\\succnsim",!0);i(l,d,f,"\u2ABA","\\succnapprox",!0);i(l,d,f,"\u2246","\\ncong",!0);i(l,d,f,"\uE007","\\@nshortparallel");i(l,d,f,"\u2226","\\nparallel",!0);i(l,d,f,"\u22AF","\\nVDash",!0);i(l,d,f,"\u22EB","\\ntriangleright");i(l,d,f,"\u22ED","\\ntrianglerighteq",!0);i(l,d,f,"\uE018","\\@nsupseteqq");i(l,d,f,"\u228B","\\supsetneq",!0);i(l,d,f,"\uE01B","\\@varsupsetneq");i(l,d,f,"\u2ACC","\\supsetneqq",!0);i(l,d,f,"\uE019","\\@varsupsetneqq");i(l,d,f,"\u22AE","\\nVdash",!0);i(l,d,f,"\u2AB5","\\precneqq",!0);i(l,d,f,"\u2AB6","\\succneqq",!0);i(l,d,f,"\uE016","\\@nsubseteqq");i(l,d,D,"\u22B4","\\unlhd");i(l,d,D,"\u22B5","\\unrhd");i(l,d,f,"\u219A","\\nleftarrow",!0);i(l,d,f,"\u219B","\\nrightarrow",!0);i(l,d,f,"\u21CD","\\nLeftarrow",!0);i(l,d,f,"\u21CF","\\nRightarrow",!0);i(l,d,f,"\u21AE","\\nleftrightarrow",!0);i(l,d,f,"\u21CE","\\nLeftrightarrow",!0);i(l,d,f,"\u25B3","\\vartriangle");i(l,d,v,"\u210F","\\hslash");i(l,d,v,"\u25BD","\\triangledown");i(l,d,v,"\u25CA","\\lozenge");i(l,d,v,"\u24C8","\\circledS");i(l,d,v,"\xAE","\\circledR");i(k,d,v,"\xAE","\\circledR");i(l,d,v,"\u2221","\\measuredangle",!0);i(l,d,v,"\u2204","\\nexists");i(l,d,v,"\u2127","\\mho");i(l,d,v,"\u2132","\\Finv",!0);i(l,d,v,"\u2141","\\Game",!0);i(l,d,v,"\u2035","\\backprime");i(l,d,v,"\u25B2","\\blacktriangle");i(l,d,v,"\u25BC","\\blacktriangledown");i(l,d,v,"\u25A0","\\blacksquare");i(l,d,v,"\u29EB","\\blacklozenge");i(l,d,v,"\u2605","\\bigstar");i(l,d,v,"\u2222","\\sphericalangle",!0);i(l,d,v,"\u2201","\\complement",!0);i(l,d,v,"\xF0","\\eth",!0);i(k,u,v,"\xF0","\xF0");i(l,d,v,"\u2571","\\diagup");i(l,d,v,"\u2572","\\diagdown");i(l,d,v,"\u25A1","\\square");i(l,d,v,"\u25A1","\\Box");i(l,d,v,"\u25CA","\\Diamond");i(l,d,v,"\xA5","\\yen",!0);i(k,d,v,"\xA5","\\yen",!0);i(l,d,v,"\u2713","\\checkmark",!0);i(k,d,v,"\u2713","\\checkmark");i(l,d,v,"\u2136","\\beth",!0);i(l,d,v,"\u2138","\\daleth",!0);i(l,d,v,"\u2137","\\gimel",!0);i(l,d,v,"\u03DD","\\digamma",!0);i(l,d,v,"\u03F0","\\varkappa");i(l,d,c0,"\u250C","\\@ulcorner",!0);i(l,d,i0,"\u2510","\\@urcorner",!0);i(l,d,c0,"\u2514","\\@llcorner",!0);i(l,d,i0,"\u2518","\\@lrcorner",!0);i(l,d,f,"\u2266","\\leqq",!0);i(l,d,f,"\u2A7D","\\leqslant",!0);i(l,d,f,"\u2A95","\\eqslantless",!0);i(l,d,f,"\u2272","\\lesssim",!0);i(l,d,f,"\u2A85","\\lessapprox",!0);i(l,d,f,"\u224A","\\approxeq",!0);i(l,d,D,"\u22D6","\\lessdot");i(l,d,f,"\u22D8","\\lll",!0);i(l,d,f,"\u2276","\\lessgtr",!0);i(l,d,f,"\u22DA","\\lesseqgtr",!0);i(l,d,f,"\u2A8B","\\lesseqqgtr",!0);i(l,d,f,"\u2251","\\doteqdot");i(l,d,f,"\u2253","\\risingdotseq",!0);i(l,d,f,"\u2252","\\fallingdotseq",!0);i(l,d,f,"\u223D","\\backsim",!0);i(l,d,f,"\u22CD","\\backsimeq",!0);i(l,d,f,"\u2AC5","\\subseteqq",!0);i(l,d,f,"\u22D0","\\Subset",!0);i(l,d,f,"\u228F","\\sqsubset",!0);i(l,d,f,"\u227C","\\preccurlyeq",!0);i(l,d,f,"\u22DE","\\curlyeqprec",!0);i(l,d,f,"\u227E","\\precsim",!0);i(l,d,f,"\u2AB7","\\precapprox",!0);i(l,d,f,"\u22B2","\\vartriangleleft");i(l,d,f,"\u22B4","\\trianglelefteq");i(l,d,f,"\u22A8","\\vDash",!0);i(l,d,f,"\u22AA","\\Vvdash",!0);i(l,d,f,"\u2323","\\smallsmile");i(l,d,f,"\u2322","\\smallfrown");i(l,d,f,"\u224F","\\bumpeq",!0);i(l,d,f,"\u224E","\\Bumpeq",!0);i(l,d,f,"\u2267","\\geqq",!0);i(l,d,f,"\u2A7E","\\geqslant",!0);i(l,d,f,"\u2A96","\\eqslantgtr",!0);i(l,d,f,"\u2273","\\gtrsim",!0);i(l,d,f,"\u2A86","\\gtrapprox",!0);i(l,d,D,"\u22D7","\\gtrdot");i(l,d,f,"\u22D9","\\ggg",!0);i(l,d,f,"\u2277","\\gtrless",!0);i(l,d,f,"\u22DB","\\gtreqless",!0);i(l,d,f,"\u2A8C","\\gtreqqless",!0);i(l,d,f,"\u2256","\\eqcirc",!0);i(l,d,f,"\u2257","\\circeq",!0);i(l,d,f,"\u225C","\\triangleq",!0);i(l,d,f,"\u223C","\\thicksim");i(l,d,f,"\u2248","\\thickapprox");i(l,d,f,"\u2AC6","\\supseteqq",!0);i(l,d,f,"\u22D1","\\Supset",!0);i(l,d,f,"\u2290","\\sqsupset",!0);i(l,d,f,"\u227D","\\succcurlyeq",!0);i(l,d,f,"\u22DF","\\curlyeqsucc",!0);i(l,d,f,"\u227F","\\succsim",!0);i(l,d,f,"\u2AB8","\\succapprox",!0);i(l,d,f,"\u22B3","\\vartriangleright");i(l,d,f,"\u22B5","\\trianglerighteq");i(l,d,f,"\u22A9","\\Vdash",!0);i(l,d,f,"\u2223","\\shortmid");i(l,d,f,"\u2225","\\shortparallel");i(l,d,f,"\u226C","\\between",!0);i(l,d,f,"\u22D4","\\pitchfork",!0);i(l,d,f,"\u221D","\\varpropto");i(l,d,f,"\u25C0","\\blacktriangleleft");i(l,d,f,"\u2234","\\therefore",!0);i(l,d,f,"\u220D","\\backepsilon");i(l,d,f,"\u25B6","\\blacktriangleright");i(l,d,f,"\u2235","\\because",!0);i(l,d,f,"\u22D8","\\llless");i(l,d,f,"\u22D9","\\gggtr");i(l,d,D,"\u22B2","\\lhd");i(l,d,D,"\u22B3","\\rhd");i(l,d,f,"\u2242","\\eqsim",!0);i(l,u,f,"\u22C8","\\Join");i(l,d,f,"\u2251","\\Doteq",!0);i(l,d,D,"\u2214","\\dotplus",!0);i(l,d,D,"\u2216","\\smallsetminus");i(l,d,D,"\u22D2","\\Cap",!0);i(l,d,D,"\u22D3","\\Cup",!0);i(l,d,D,"\u2A5E","\\doublebarwedge",!0);i(l,d,D,"\u229F","\\boxminus",!0);i(l,d,D,"\u229E","\\boxplus",!0);i(l,d,D,"\u22C7","\\divideontimes",!0);i(l,d,D,"\u22C9","\\ltimes",!0);i(l,d,D,"\u22CA","\\rtimes",!0);i(l,d,D,"\u22CB","\\leftthreetimes",!0);i(l,d,D,"\u22CC","\\rightthreetimes",!0);i(l,d,D,"\u22CF","\\curlywedge",!0);i(l,d,D,"\u22CE","\\curlyvee",!0);i(l,d,D,"\u229D","\\circleddash",!0);i(l,d,D,"\u229B","\\circledast",!0);i(l,d,D,"\u22C5","\\centerdot");i(l,d,D,"\u22BA","\\intercal",!0);i(l,d,D,"\u22D2","\\doublecap");i(l,d,D,"\u22D3","\\doublecup");i(l,d,D,"\u22A0","\\boxtimes",!0);i(l,d,f,"\u21E2","\\dashrightarrow",!0);i(l,d,f,"\u21E0","\\dashleftarrow",!0);i(l,d,f,"\u21C7","\\leftleftarrows",!0);i(l,d,f,"\u21C6","\\leftrightarrows",!0);i(l,d,f,"\u21DA","\\Lleftarrow",!0);i(l,d,f,"\u219E","\\twoheadleftarrow",!0);i(l,d,f,"\u21A2","\\leftarrowtail",!0);i(l,d,f,"\u21AB","\\looparrowleft",!0);i(l,d,f,"\u21CB","\\leftrightharpoons",!0);i(l,d,f,"\u21B6","\\curvearrowleft",!0);i(l,d,f,"\u21BA","\\circlearrowleft",!0);i(l,d,f,"\u21B0","\\Lsh",!0);i(l,d,f,"\u21C8","\\upuparrows",!0);i(l,d,f,"\u21BF","\\upharpoonleft",!0);i(l,d,f,"\u21C3","\\downharpoonleft",!0);i(l,u,f,"\u22B6","\\origof",!0);i(l,u,f,"\u22B7","\\imageof",!0);i(l,d,f,"\u22B8","\\multimap",!0);i(l,d,f,"\u21AD","\\leftrightsquigarrow",!0);i(l,d,f,"\u21C9","\\rightrightarrows",!0);i(l,d,f,"\u21C4","\\rightleftarrows",!0);i(l,d,f,"\u21A0","\\twoheadrightarrow",!0);i(l,d,f,"\u21A3","\\rightarrowtail",!0);i(l,d,f,"\u21AC","\\looparrowright",!0);i(l,d,f,"\u21B7","\\curvearrowright",!0);i(l,d,f,"\u21BB","\\circlearrowright",!0);i(l,d,f,"\u21B1","\\Rsh",!0);i(l,d,f,"\u21CA","\\downdownarrows",!0);i(l,d,f,"\u21BE","\\upharpoonright",!0);i(l,d,f,"\u21C2","\\downharpoonright",!0);i(l,d,f,"\u21DD","\\rightsquigarrow",!0);i(l,d,f,"\u21DD","\\leadsto");i(l,d,f,"\u21DB","\\Rrightarrow",!0);i(l,d,f,"\u21BE","\\restriction");i(l,u,v,"\u2018","`");i(l,u,v,"$","\\$");i(k,u,v,"$","\\$");i(k,u,v,"$","\\textdollar");i(l,u,v,"%","\\%");i(k,u,v,"%","\\%");i(l,u,v,"_","\\_");i(k,u,v,"_","\\_");i(k,u,v,"_","\\textunderscore");i(l,u,v,"\u2220","\\angle",!0);i(l,u,v,"\u221E","\\infty",!0);i(l,u,v,"\u2032","\\prime");i(l,u,v,"\u25B3","\\triangle");i(l,u,v,"\u0393","\\Gamma",!0);i(l,u,v,"\u0394","\\Delta",!0);i(l,u,v,"\u0398","\\Theta",!0);i(l,u,v,"\u039B","\\Lambda",!0);i(l,u,v,"\u039E","\\Xi",!0);i(l,u,v,"\u03A0","\\Pi",!0);i(l,u,v,"\u03A3","\\Sigma",!0);i(l,u,v,"\u03A5","\\Upsilon",!0);i(l,u,v,"\u03A6","\\Phi",!0);i(l,u,v,"\u03A8","\\Psi",!0);i(l,u,v,"\u03A9","\\Omega",!0);i(l,u,v,"A","\u0391");i(l,u,v,"B","\u0392");i(l,u,v,"E","\u0395");i(l,u,v,"Z","\u0396");i(l,u,v,"H","\u0397");i(l,u,v,"I","\u0399");i(l,u,v,"K","\u039A");i(l,u,v,"M","\u039C");i(l,u,v,"N","\u039D");i(l,u,v,"O","\u039F");i(l,u,v,"P","\u03A1");i(l,u,v,"T","\u03A4");i(l,u,v,"X","\u03A7");i(l,u,v,"\xAC","\\neg",!0);i(l,u,v,"\xAC","\\lnot");i(l,u,v,"\u22A4","\\top");i(l,u,v,"\u22A5","\\bot");i(l,u,v,"\u2205","\\emptyset");i(l,d,v,"\u2205","\\varnothing");i(l,u,E,"\u03B1","\\alpha",!0);i(l,u,E,"\u03B2","\\beta",!0);i(l,u,E,"\u03B3","\\gamma",!0);i(l,u,E,"\u03B4","\\delta",!0);i(l,u,E,"\u03F5","\\epsilon",!0);i(l,u,E,"\u03B6","\\zeta",!0);i(l,u,E,"\u03B7","\\eta",!0);i(l,u,E,"\u03B8","\\theta",!0);i(l,u,E,"\u03B9","\\iota",!0);i(l,u,E,"\u03BA","\\kappa",!0);i(l,u,E,"\u03BB","\\lambda",!0);i(l,u,E,"\u03BC","\\mu",!0);i(l,u,E,"\u03BD","\\nu",!0);i(l,u,E,"\u03BE","\\xi",!0);i(l,u,E,"\u03BF","\\omicron",!0);i(l,u,E,"\u03C0","\\pi",!0);i(l,u,E,"\u03C1","\\rho",!0);i(l,u,E,"\u03C3","\\sigma",!0);i(l,u,E,"\u03C4","\\tau",!0);i(l,u,E,"\u03C5","\\upsilon",!0);i(l,u,E,"\u03D5","\\phi",!0);i(l,u,E,"\u03C7","\\chi",!0);i(l,u,E,"\u03C8","\\psi",!0);i(l,u,E,"\u03C9","\\omega",!0);i(l,u,E,"\u03B5","\\varepsilon",!0);i(l,u,E,"\u03D1","\\vartheta",!0);i(l,u,E,"\u03D6","\\varpi",!0);i(l,u,E,"\u03F1","\\varrho",!0);i(l,u,E,"\u03C2","\\varsigma",!0);i(l,u,E,"\u03C6","\\varphi",!0);i(l,u,D,"\u2217","*",!0);i(l,u,D,"+","+");i(l,u,D,"\u2212","-",!0);i(l,u,D,"\u22C5","\\cdot",!0);i(l,u,D,"\u2218","\\circ",!0);i(l,u,D,"\xF7","\\div",!0);i(l,u,D,"\xB1","\\pm",!0);i(l,u,D,"\xD7","\\times",!0);i(l,u,D,"\u2229","\\cap",!0);i(l,u,D,"\u222A","\\cup",!0);i(l,u,D,"\u2216","\\setminus",!0);i(l,u,D,"\u2227","\\land");i(l,u,D,"\u2228","\\lor");i(l,u,D,"\u2227","\\wedge",!0);i(l,u,D,"\u2228","\\vee",!0);i(l,u,v,"\u221A","\\surd");i(l,u,c0,"\u27E8","\\langle",!0);i(l,u,c0,"\u2223","\\lvert");i(l,u,c0,"\u2225","\\lVert");i(l,u,i0,"?","?");i(l,u,i0,"!","!");i(l,u,i0,"\u27E9","\\rangle",!0);i(l,u,i0,"\u2223","\\rvert");i(l,u,i0,"\u2225","\\rVert");i(l,u,f,"=","=");i(l,u,f,":",":");i(l,u,f,"\u2248","\\approx",!0);i(l,u,f,"\u2245","\\cong",!0);i(l,u,f,"\u2265","\\ge");i(l,u,f,"\u2265","\\geq",!0);i(l,u,f,"\u2190","\\gets");i(l,u,f,">","\\gt",!0);i(l,u,f,"\u2208","\\in",!0);i(l,u,f,"\uE020","\\@not");i(l,u,f,"\u2282","\\subset",!0);i(l,u,f,"\u2283","\\supset",!0);i(l,u,f,"\u2286","\\subseteq",!0);i(l,u,f,"\u2287","\\supseteq",!0);i(l,d,f,"\u2288","\\nsubseteq",!0);i(l,d,f,"\u2289","\\nsupseteq",!0);i(l,u,f,"\u22A8","\\models");i(l,u,f,"\u2190","\\leftarrow",!0);i(l,u,f,"\u2264","\\le");i(l,u,f,"\u2264","\\leq",!0);i(l,u,f,"<","\\lt",!0);i(l,u,f,"\u2192","\\rightarrow",!0);i(l,u,f,"\u2192","\\to");i(l,d,f,"\u2271","\\ngeq",!0);i(l,d,f,"\u2270","\\nleq",!0);i(l,u,R0,"\xA0","\\ ");i(l,u,R0,"\xA0","\\space");i(l,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(l,u,R0,null,"\\nobreak");i(l,u,R0,null,"\\allowbreak");i(l,u,Ge,",",",");i(l,u,Ge,";",";");i(l,d,D,"\u22BC","\\barwedge",!0);i(l,d,D,"\u22BB","\\veebar",!0);i(l,u,D,"\u2299","\\odot",!0);i(l,u,D,"\u2295","\\oplus",!0);i(l,u,D,"\u2297","\\otimes",!0);i(l,u,v,"\u2202","\\partial",!0);i(l,u,D,"\u2298","\\oslash",!0);i(l,d,D,"\u229A","\\circledcirc",!0);i(l,d,D,"\u22A1","\\boxdot",!0);i(l,u,D,"\u25B3","\\bigtriangleup");i(l,u,D,"\u25BD","\\bigtriangledown");i(l,u,D,"\u2020","\\dagger");i(l,u,D,"\u22C4","\\diamond");i(l,u,D,"\u22C6","\\star");i(l,u,D,"\u25C3","\\triangleleft");i(l,u,D,"\u25B9","\\triangleright");i(l,u,c0,"{","\\{");i(k,u,v,"{","\\{");i(k,u,v,"{","\\textbraceleft");i(l,u,i0,"}","\\}");i(k,u,v,"}","\\}");i(k,u,v,"}","\\textbraceright");i(l,u,c0,"{","\\lbrace");i(l,u,i0,"}","\\rbrace");i(l,u,c0,"[","\\lbrack",!0);i(k,u,v,"[","\\lbrack",!0);i(l,u,i0,"]","\\rbrack",!0);i(k,u,v,"]","\\rbrack",!0);i(l,u,c0,"(","\\lparen",!0);i(l,u,i0,")","\\rparen",!0);i(k,u,v,"<","\\textless",!0);i(k,u,v,">","\\textgreater",!0);i(l,u,c0,"\u230A","\\lfloor",!0);i(l,u,i0,"\u230B","\\rfloor",!0);i(l,u,c0,"\u2308","\\lceil",!0);i(l,u,i0,"\u2309","\\rceil",!0);i(l,u,v,"\\","\\backslash");i(l,u,v,"\u2223","|");i(l,u,v,"\u2223","\\vert");i(k,u,v,"|","\\textbar",!0);i(l,u,v,"\u2225","\\|");i(l,u,v,"\u2225","\\Vert");i(k,u,v,"\u2225","\\textbardbl");i(k,u,v,"~","\\textasciitilde");i(k,u,v,"\\","\\textbackslash");i(k,u,v,"^","\\textasciicircum");i(l,u,f,"\u2191","\\uparrow",!0);i(l,u,f,"\u21D1","\\Uparrow",!0);i(l,u,f,"\u2193","\\downarrow",!0);i(l,u,f,"\u21D3","\\Downarrow",!0);i(l,u,f,"\u2195","\\updownarrow",!0);i(l,u,f,"\u21D5","\\Updownarrow",!0);i(l,u,_,"\u2210","\\coprod");i(l,u,_,"\u22C1","\\bigvee");i(l,u,_,"\u22C0","\\bigwedge");i(l,u,_,"\u2A04","\\biguplus");i(l,u,_,"\u22C2","\\bigcap");i(l,u,_,"\u22C3","\\bigcup");i(l,u,_,"\u222B","\\int");i(l,u,_,"\u222B","\\intop");i(l,u,_,"\u222C","\\iint");i(l,u,_,"\u222D","\\iiint");i(l,u,_,"\u220F","\\prod");i(l,u,_,"\u2211","\\sum");i(l,u,_,"\u2A02","\\bigotimes");i(l,u,_,"\u2A01","\\bigoplus");i(l,u,_,"\u2A00","\\bigodot");i(l,u,_,"\u222E","\\oint");i(l,u,_,"\u222F","\\oiint");i(l,u,_,"\u2230","\\oiiint");i(l,u,_,"\u2A06","\\bigsqcup");i(l,u,_,"\u222B","\\smallint");i(k,u,ae,"\u2026","\\textellipsis");i(l,u,ae,"\u2026","\\mathellipsis");i(k,u,ae,"\u2026","\\ldots",!0);i(l,u,ae,"\u2026","\\ldots",!0);i(l,u,ae,"\u22EF","\\@cdots",!0);i(l,u,ae,"\u22F1","\\ddots",!0);i(l,u,v,"\u22EE","\\varvdots");i(l,u,W,"\u02CA","\\acute");i(l,u,W,"\u02CB","\\grave");i(l,u,W,"\xA8","\\ddot");i(l,u,W,"~","\\tilde");i(l,u,W,"\u02C9","\\bar");i(l,u,W,"\u02D8","\\breve");i(l,u,W,"\u02C7","\\check");i(l,u,W,"^","\\hat");i(l,u,W,"\u20D7","\\vec");i(l,u,W,"\u02D9","\\dot");i(l,u,W,"\u02DA","\\mathring");i(l,u,E,"\uE131","\\@imath");i(l,u,E,"\uE237","\\@jmath");i(l,u,v,"\u0131","\u0131");i(l,u,v,"\u0237","\u0237");i(k,u,v,"\u0131","\\i",!0);i(k,u,v,"\u0237","\\j",!0);i(k,u,v,"\xDF","\\ss",!0);i(k,u,v,"\xE6","\\ae",!0);i(k,u,v,"\u0153","\\oe",!0);i(k,u,v,"\xF8","\\o",!0);i(k,u,v,"\xC6","\\AE",!0);i(k,u,v,"\u0152","\\OE",!0);i(k,u,v,"\xD8","\\O",!0);i(k,u,W,"\u02CA","\\'");i(k,u,W,"\u02CB","\\`");i(k,u,W,"\u02C6","\\^");i(k,u,W,"\u02DC","\\~");i(k,u,W,"\u02C9","\\=");i(k,u,W,"\u02D8","\\u");i(k,u,W,"\u02D9","\\.");i(k,u,W,"\xB8","\\c");i(k,u,W,"\u02DA","\\r");i(k,u,W,"\u02C7","\\v");i(k,u,W,"\xA8",'\\"');i(k,u,W,"\u02DD","\\H");i(k,u,W,"\u25EF","\\textcircled");var Tr={"--":!0,"---":!0,"``":!0,"''":!0};i(k,u,v,"\u2013","--",!0);i(k,u,v,"\u2013","\\textendash");i(k,u,v,"\u2014","---",!0);i(k,u,v,"\u2014","\\textemdash");i(k,u,v,"\u2018","`",!0);i(k,u,v,"\u2018","\\textquoteleft");i(k,u,v,"\u2019","'",!0);i(k,u,v,"\u2019","\\textquoteright");i(k,u,v,"\u201C","``",!0);i(k,u,v,"\u201C","\\textquotedblleft");i(k,u,v,"\u201D","''",!0);i(k,u,v,"\u201D","\\textquotedblright");i(l,u,v,"\xB0","\\degree",!0);i(k,u,v,"\xB0","\\degree");i(k,u,v,"\xB0","\\textdegree",!0);i(l,u,v,"\xA3","\\pounds");i(l,u,v,"\xA3","\\mathsterling",!0);i(k,u,v,"\xA3","\\pounds");i(k,u,v,"\xA3","\\textsterling",!0);i(l,d,v,"\u2720","\\maltese");i(k,d,v,"\u2720","\\maltese");var Zt='0123456789/@."';for(we=0;we0)return b0(s,p,n,t,o.concat(g));if(c){var b,w;if(c==="boldsymbol"){var x=n1(s,n,t,o,a);b=x.fontName,w=[x.fontClass]}else h?(b=Cr[c].fontName,w=[c]):(b=Ae(c,t.fontWeight,t.fontShape),w=[c,t.fontWeight,t.fontShape]);if(Ve(s,b,n).metrics)return b0(s,b,n,t,o.concat(w));if(Tr.hasOwnProperty(s)&&b.slice(0,10)==="Typewriter"){for(var z=[],T=0;T{if(P0(r.classes)!==P0(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},l1=r=>{for(var e=0;et&&(t=o.height),o.depth>a&&(a=o.depth),o.maxFontSize>n&&(n=o.maxFontSize)}e.height=t,e.depth=a,e.maxFontSize=n},l0=function(e,t,a,n){var s=new W0(e,t,a,n);return Mt(s),s},Br=(r,e,t,a)=>new W0(r,e,t,a),o1=function(e,t,a){var n=l0([e],[],t);return n.height=Math.max(a||t.fontMetrics().defaultRuleThickness,t.minRuleThickness),n.style.borderBottomWidth=A(n.height),n.maxFontSize=1,n},u1=function(e,t,a,n){var s=new ce(e,t,a,n);return Mt(s),s},Dr=function(e){var t=new X0(e);return Mt(t),t},h1=function(e,t){return e instanceof X0?l0([],[e],t):e},m1=function(e){if(e.positionType==="individualShift"){for(var t=e.children,a=[t[0]],n=-t[0].shift-t[0].elem.depth,s=n,o=1;o{var t=l0(["mspace"],[],e),a=J(r,e);return t.style.marginRight=A(a),t},Ae=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},Cr={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"},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"}},qr={vec:["vec",.471,.714],oiintSize1:["oiintSize1",.957,.499],oiintSize2:["oiintSize2",1.472,.659],oiiintSize1:["oiiintSize1",1.304,.499],oiiintSize2:["oiiintSize2",1.98,.659]},f1=function(e,t){var[a,n,s]=qr[e],o=new S0(a),h=new y0([o],{width:A(n),height:A(s),style:"width:"+A(n),viewBox:"0 0 "+1e3*n+" "+1e3*s,preserveAspectRatio:"xMinYMin"}),c=Br(["overlay"],[h],t);return c.height=s,c.style.height=A(s),c.style.width=A(n),c},y={fontMap:Cr,makeSymbol:b0,mathsym:a1,makeSpan:l0,makeSvgSpan:Br,makeLineSpan:o1,makeAnchor:u1,makeFragment:Dr,wrapFragment:h1,makeVList:c1,makeOrd:i1,makeGlue:d1,staticSvg:f1,svgData:qr,tryCombineChars:l1},K={number:3,unit:"mu"},$0={number:4,unit:"mu"},D0={number:5,unit:"mu"},p1={mord:{mop:K,mbin:$0,mrel:D0,minner:K},mop:{mord:K,mop:K,mrel:D0,minner:K},mbin:{mord:$0,mop:$0,mopen:$0,minner:$0},mrel:{mord:D0,mop:D0,mopen:D0,minner:D0},mopen:{},mclose:{mop:K,mbin:$0,mrel:D0,minner:K},mpunct:{mord:K,mop:K,mrel:D0,mopen:K,mclose:K,mpunct:K,minner:K},minner:{mord:K,mop:K,mbin:$0,mrel:D0,mopen:K,mpunct:K,minner:K}},v1={mord:{mop:K},mop:{mord:K,mop:K},mbin:{},mrel:{},mopen:{},mclose:{mop:K},mpunct:{},minner:{mop:K}},Nr={},Oe={},He={};function B(r){for(var{type:e,names:t,props:a,handler:n,htmlBuilder:s,mathmlBuilder:o}=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 C=T.classes[0],q=z.classes[0];C==="mbin"&&N.contains(b1,q)?T.classes[0]="mord":q==="mbin"&&N.contains(g1,C)&&(z.classes[0]="mord")},{node:b},w,x),Qt(s,(z,T)=>{var C=ft(T),q=ft(z),O=C&&q?z.hasClass("mtight")?v1[C][q]:p1[C][q]:null;if(O)return y.makeGlue(O,p)},{node:b},w,x),s},Qt=function r(e,t,a,n,s){n&&e.push(n);for(var o=0;ow=>{e.splice(b+1,0,w),o++})(o)}n&&e.pop()},Er=function(e){return e instanceof X0||e instanceof ce||e instanceof W0&&e.hasClass("enclosing")?e:null},w1=function r(e,t){var a=Er(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},ft=function(e,t){return e?(t&&(e=w1(e,t)),x1[e.classes[0]]||null):null},fe=function(e,t){var a=["nulldelimiter"].concat(e.baseSizingClasses());return N0(t.concat(a))},P=function(e,t,a){if(!e)return N0();if(Oe[e.type]){var n=Oe[e.type](e,t);if(a&&t.size!==a.size){n=N0(t.sizingClasses(a),[n],t);var s=t.sizeMultiplier/a.sizeMultiplier;n.height*=s,n.depth*=s}return n}else throw new M("Got group of unknown type: '"+e.type+"'")};function Te(r,e){var t=N0(["base"],r,e),a=N0(["strut"]);return a.style.height=A(t.height+t.depth),t.depth&&(a.style.verticalAlign=A(-t.depth)),t.children.unshift(a),t}function pt(r,e){var t=null;r.length===1&&r[0].type==="tag"&&(t=r[0].tag,r=r[0].body);var a=t0(r,e,"root"),n;a.length===2&&a[1].hasClass("tag")&&(n=a.pop());for(var s=[],o=[],h=0;h0&&(s.push(Te(o,e)),o=[]),s.push(a[h]));o.length>0&&s.push(Te(o,e));var p;t?(p=Te(t0(t,e,!0)),p.classes=["tag"],s.push(p)):n&&s.push(n);var g=N0(["katex-html"],s);if(g.setAttribute("aria-hidden","true"),p){var b=p.children[0];b.style.height=A(g.height+g.depth),g.depth&&(b.style.verticalAlign=A(-g.depth))}return g}function Rr(r){return new X0(r)}var o0=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=P0(this.classes));for(var a=0;a0&&(e+=' class ="'+N.escape(P0(this.classes))+'"'),e+=">";for(var a=0;a",e}toText(){return this.children.map(e=>e.toText()).join("")}},Y0=class{constructor(e){this.text=void 0,this.text=e}toNode(){return document.createTextNode(this.text)}toMarkup(){return N.escape(this.toText())}toText(){return this.text}},vt=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",A(this.width)),e}toMarkup(){return this.character?""+this.character+"":''}toText(){return this.character?this.character:" "}},S={MathNode:o0,TextNode:Y0,SpaceNode:vt,newDocumentFragment:Rr},v0=function(e,t,a){return X[t][e]&&X[t][e].replace&&e.charCodeAt(0)!==55349&&!(Tr.hasOwnProperty(e)&&a&&(a.fontFamily&&a.fontFamily.slice(4,6)==="tt"||a.font&&a.font.slice(4,6)==="tt"))&&(e=X[t][e].replace),new S.TextNode(e)},zt=function(e){return e.length===1?e[0]:new S.MathNode("mrow",e)},At=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==="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(N.contains(["\\imath","\\jmath"],s))return null;X[n][s]&&X[n][s].replace&&(s=X[n][s].replace);var o=y.fontMap[a].fontName;return St(s,o,n)?y.fontMap[a].variant:null},h0=function(e,t,a){if(e.length===1){var n=Y(e[0],t);return a&&n instanceof o0&&n.type==="mo"&&(n.setAttribute("lspace","0em"),n.setAttribute("rspace","0em")),[n]}for(var s=[],o,h=0;h0&&(b.text=b.text.slice(0,1)+"\u0338"+b.text.slice(1),s.pop())}}}s.push(c),o=c}return s},G0=function(e,t,a){return zt(h0(e,t,a))},Y=function(e,t){if(!e)return new S.MathNode("mrow");if(He[e.type]){var a=He[e.type](e,t);return a}else throw new M("Got group of unknown type: '"+e.type+"'")};function _t(r,e,t,a,n){var s=h0(r,t),o;s.length===1&&s[0]instanceof o0&&N.contains(["mrow","mtable"],s[0].type)?o=s[0]:o=new S.MathNode("mrow",s);var h=new S.MathNode("annotation",[new S.TextNode(e)]);h.setAttribute("encoding","application/x-tex");var c=new S.MathNode("semantics",[o,h]),p=new S.MathNode("math",[c]);p.setAttribute("xmlns","http://www.w3.org/1998/Math/MathML"),a&&p.setAttribute("display","block");var g=n?"katex":"katex-mathml";return y.makeSpan([g],[p])}var Ir=function(e){return new Re({style:e.displayMode?R.DISPLAY:R.TEXT,maxSize:e.maxSize,minRuleThickness:e.minRuleThickness})},Or=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},k1=function(e,t,a){var n=Ir(a),s;if(a.output==="mathml")return _t(e,t,n,a.displayMode,!0);if(a.output==="html"){var o=pt(e,n);s=y.makeSpan(["katex"],[o])}else{var h=_t(e,t,n,a.displayMode,!1),c=pt(e,n);s=y.makeSpan(["katex"],[h,c])}return Or(s,a)},S1=function(e,t,a){var n=Ir(a),s=pt(e,n),o=y.makeSpan(["katex"],[s]);return Or(o,a)},M1={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":"="},z1=function(e){var t=new S.MathNode("mo",[new S.TextNode(M1[e.replace(/^\\/,"")])]);return t.setAttribute("stretchy","true"),t},A1={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]},T1=function(e){return e.type==="ordgroup"?e.body.length:1},B1=function(e,t){function a(){var h=4e5,c=e.label.slice(1);if(N.contains(["widehat","widecheck","widetilde","utilde"],c)){var p=e,g=T1(p.base),b,w,x;if(g>5)c==="widehat"||c==="widecheck"?(b=420,h=2364,x=.42,w=c+"4"):(b=312,h=2340,x=.34,w="tilde4");else{var z=[1,1,2,2,3,3][g];c==="widehat"||c==="widecheck"?(h=[0,1062,2364,2364,2364][z],b=[0,239,300,360,420][z],x=[0,.24,.3,.3,.36,.42][z],w=c+z):(h=[0,600,1033,2339,2340][z],b=[0,260,286,306,312][z],x=[0,.26,.286,.3,.306,.34][z],w="tilde"+z)}var T=new S0(w),C=new y0([T],{width:"100%",height:A(x),viewBox:"0 0 "+h+" "+b,preserveAspectRatio:"none"});return{span:y.makeSvgSpan([],[C],t),minWidth:0,height:x}}else{var q=[],O=A1[c],[H,V,L]=O,U=L/1e3,G=H.length,j,$;if(G===1){var T0=O[3];j=["hide-tail"],$=[T0]}else if(G===2)j=["halfarrow-left","halfarrow-right"],$=["xMinYMin","xMaxYMin"];else if(G===3)j=["brace-left","brace-center","brace-right"],$=["xMinYMin","xMidYMin","xMaxYMin"];else throw new Error(`Correct katexImagesData or update code here to support - `+G+" children.");for(var a0=0;a00&&(n.style.minWidth=A(s)),n},D1=function(e,t,a,n,s){var o,h=e.height+e.depth+a+n;if(/fbox|color|angl/.test(t)){if(o=y.makeSpan(["stretchy",t],[],s),t==="fbox"){var c=s.color&&s.getColor();c&&(o.style.borderColor=c)}}else{var p=[];/^[bx]cancel$/.test(t)&&p.push(new de({x1:"0",y1:"0",x2:"100%",y2:"100%","stroke-width":"0.046em"})),/^x?cancel$/.test(t)&&p.push(new de({x1:"0",y1:"100%",x2:"100%",y2:"0","stroke-width":"0.046em"}));var g=new y0(p,{width:"100%",height:A(h)});o=y.makeSvgSpan([],[g],s)}return o.height=h,o.style.height=A(h),o},E0={encloseSpan:D1,mathMLnode:z1,svgSpan:B1};function F(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 Tt(r){var e=Ue(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 Ue(r){return r&&(r.type==="atom"||t1.hasOwnProperty(r.type))?r:null}var Bt=(r,e)=>{var t,a,n;r&&r.type==="supsub"?(a=F(r.base,"accent"),t=a.base,r.base=t,n=_a(P(r,e)),r.base=a):(a=F(r,"accent"),t=a.base);var s=P(t,e.havingCrampedStyle()),o=a.isShifty&&N.isCharacterBox(t),h=0;if(o){var c=N.getBaseElem(t),p=P(c,e.havingCrampedStyle());h=jt(p).skew}var g=a.label==="\\c",b=g?s.height+s.depth:Math.min(s.height,e.fontMetrics().xHeight),w;if(a.isStretchy)w=E0.svgSpan(a,e),w=y.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:s},{type:"elem",elem:w,wrapperClasses:["svg-align"],wrapperStyle:h>0?{width:"calc(100% - "+A(2*h)+")",marginLeft:A(2*h)}:void 0}]},e);else{var x,z;a.label==="\\vec"?(x=y.staticSvg("vec",e),z=y.svgData.vec[1]):(x=y.makeOrd({mode:a.mode,text:a.label},e,"textord"),x=jt(x),x.italic=0,z=x.width,g&&(b+=x.depth)),w=y.makeSpan(["accent-body"],[x]);var T=a.label==="\\textcircled";T&&(w.classes.push("accent-full"),b=s.height);var C=h;T||(C-=z/2),w.style.left=A(C),a.label==="\\textcircled"&&(w.style.top=".2em"),w=y.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:s},{type:"kern",size:-b},{type:"elem",elem:w}]},e)}var q=y.makeSpan(["mord","accent"],[w],e);return n?(n.children[0]=q,n.height=Math.max(q.height,n.height),n.classes[0]="mord",n):q},Hr=(r,e)=>{var t=r.isStretchy?E0.mathMLnode(r.label):new S.MathNode("mo",[v0(r.label,r.mode)]),a=new S.MathNode("mover",[Y(r.base,e),t]);return a.setAttribute("accent","true"),a},C1=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=Fe(e[0]),a=!C1.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:Bt,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:Bt,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=P(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 S.MathNode("munder",[Y(r.base,e),t]);return a.setAttribute("accentunder","true"),a}});var Be=r=>{var e=new S.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(P(r.body,a,e),e),s=r.label.slice(0,2)==="\\x"?"x":"cd";n.classes.push(s+"-arrow-pad");var o;r.below&&(a=e.havingStyle(t.sub()),o=y.wrapFragment(P(r.below,a,e),e),o.classes.push(s+"-arrow-pad"));var h=E0.svgSpan(r,e),c=-e.fontMetrics().axisHeight+.5*h.height,p=-e.fontMetrics().axisHeight-.5*h.height-.111;(n.depth>.25||r.label==="\\xleftequilibrium")&&(p-=n.depth);var g;if(o){var b=-e.fontMetrics().axisHeight+o.height+.5*h.height+.111;g=y.makeVList({positionType:"individualShift",children:[{type:"elem",elem:n,shift:p},{type:"elem",elem:h,shift:c},{type:"elem",elem:o,shift:b}]},e)}else g=y.makeVList({positionType:"individualShift",children:[{type:"elem",elem:n,shift:p},{type:"elem",elem:h,shift:c}]},e);return g.children[0].children[0].children[1].classes.push("svg-align"),y.makeSpan(["mrel","x-arrow"],[g],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=Be(Y(r.body,e));if(r.below){var s=Be(Y(r.below,e));a=new S.MathNode("munderover",[t,s,n])}else a=new S.MathNode("mover",[t,n])}else if(r.below){var o=Be(Y(r.below,e));a=new S.MathNode("munder",[t,o])}else a=Be(),a=new S.MathNode("mover",[t,a]);return a}});var q1=y.makeSpan;function Fr(r,e){var t=t0(r.body,e,!0);return q1([r.mclass],t,e)}function Lr(r,e){var t,a=h0(r.body,e);return r.mclass==="minner"?t=new S.MathNode("mpadded",a):r.mclass==="mord"?r.isCharacterBox?(t=a[0],t.type="mi"):t=new S.MathNode("mi",a):(r.isCharacterBox?(t=a[0],t.type="mo"):t=new S.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:Q(n),isCharacterBox:N.isCharacterBox(n)}},htmlBuilder:Fr,mathmlBuilder:Lr});var $e=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:$e(e[0]),body:Q(e[1]),isCharacterBox:N.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],o;a!=="\\stackrel"?o=$e(n):o="mrel";var h={type:"op",mode:n.mode,limits:!0,alwaysHandleSupSub:!0,parentIsSupSub:!1,symbol:!1,suppressBaseShift:a!=="\\stackrel",body:Q(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:o,body:[c],isCharacterBox:N.isCharacterBox(c)}},htmlBuilder:Fr,mathmlBuilder:Lr});B({type:"pmb",names:["\\pmb"],props:{numArgs:1,allowedInText:!0},handler(r,e){var{parser:t}=r;return{type:"pmb",mode:t.mode,mclass:$e(e[0]),body:Q(e[0])}},htmlBuilder(r,e){var t=t0(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=h0(r.body,e),a=new S.MathNode("mstyle",t);return a.setAttribute("style","text-shadow: 0.02em 0.01em 0.04px"),a}});var N1={">":"\\\\cdrightarrow","<":"\\\\cdleftarrow","=":"\\\\cdlongequal",A:"\\uparrow",V:"\\downarrow","|":"\\Vert",".":"no arrow"},er=()=>({type:"styling",body:[],mode:"math",style:"display"}),tr=r=>r.type==="textord"&&r.text==="@",E1=(r,e)=>(r.type==="mathord"||r.type==="atom")&&r.text===e;function R1(r,e,t){var a=N1[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"},o=t.callFunction("\\Big",[s],[]),h=t.callFunction("\\\\cdright",[e[1]],[]),c={type:"ordgroup",mode:"math",body:[n,o,h]};return t.callFunction("\\\\cdparent",[c],[])}case"\\\\cdlongequal":return t.callFunction("\\\\cdlongequal",[],[]);case"\\Vert":{var p={type:"textord",text:"\\Vert",mode:"math"};return t.callFunction("\\Big",[p],[])}default:return{type:"textord",text:" ",mode:"math"}}}function I1(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 M("Expected \\\\ or \\cr or \\end",r.nextToken)}for(var a=[],n=[a],s=0;s-1))if("<>AV".indexOf(p)>-1)for(var b=0;b<2;b++){for(var w=!0,x=c+1;xAV=|." after @',o[c]);var z=R1(p,g,r),T={type:"styling",body:[z],mode:"math",style:"display"};a.push(T),h=er()}s%2===0?a.push(h):a.shift(),a=[],n.push(a)}r.gullet.endGroup(),r.gullet.endGroup();var C=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:C,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(P(r.label,t,e),e);return a.classes.push("cd-label-"+r.side),a.style.bottom=A(.8-a.depth),a.height=0,a.depth=0,a},mathmlBuilder(r,e){var t=new S.MathNode("mrow",[Y(r.label,e)]);return t=new S.MathNode("mpadded",[t]),t.setAttribute("width","0"),r.side==="left"&&t.setAttribute("lspace","-1width"),t.setAttribute("voffset","0.7em"),t=new S.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(P(r.fragment,e),e);return t.classes.push("cd-vert-arrow"),t},mathmlBuilder(r,e){return new S.MathNode("mrow",[Y(r.fragment,e)])}});B({type:"textord",names:["\\@char"],props:{numArgs:1,allowedInText:!0},handler(r,e){for(var{parser:t}=r,a=F(e[0],"ordgroup"),n=a.body,s="",o=0;o=1114111)throw new M("\\@char with invalid code point "+s);return c<=65535?p=String.fromCharCode(c):(c-=65536,p=String.fromCharCode((c>>10)+55296,(c&1023)+56320)),{type:"textord",mode:t.mode,text:p}}});var Pr=(r,e)=>{var t=t0(r.body,e.withColor(r.color),!1);return y.makeFragment(t)},Gr=(r,e)=>{var t=h0(r.body,e.withColor(r.color)),a=new S.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=F(e[0],"color-token").color,n=e[1];return{type:"color",mode:t.mode,color:a,body:Q(n)}},htmlBuilder:Pr,mathmlBuilder:Gr});B({type:"color",names:["\\color"],props:{numArgs:1,allowedInText:!0,argTypes:["color"]},handler(r,e){var{parser:t,breakOnTokenText:a}=r,n=F(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:Pr,mathmlBuilder:Gr});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&&F(n,"size").value}},htmlBuilder(r,e){var t=y.makeSpan(["mspace"],[],e);return r.newLine&&(t.classes.push("newline"),r.size&&(t.style.marginTop=A(J(r.size,e)))),t},mathmlBuilder(r,e){var t=new S.MathNode("mspace");return r.newLine&&(t.setAttribute("linebreak","newline"),r.size&&t.setAttribute("height",A(J(r.size,e)))),t}});var gt={"\\global":"\\global","\\long":"\\\\globallong","\\\\globallong":"\\\\globallong","\\def":"\\gdef","\\gdef":"\\gdef","\\edef":"\\xdef","\\xdef":"\\xdef","\\let":"\\\\globallet","\\futurelet":"\\\\globalfuture"},Vr=r=>{var e=r.text;if(/^(?:[\\{}$&#^_]|EOF)$/.test(e))throw new M("Expected a control sequence",r);return e},O1=r=>{var e=r.gullet.popToken();return e.text==="="&&(e=r.gullet.popToken(),e.text===" "&&(e=r.gullet.popToken())),e},Ur=(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(gt[a.text])return(t==="\\global"||t==="\\\\globallong")&&(a.text=gt[a.text]),F(e.parseFunction(),"internal");throw new M("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 M("Expected a control sequence",a);for(var s=0,o,h=[[]];e.gullet.future().text!=="{";)if(a=e.gullet.popToken(),a.text==="#"){if(e.gullet.future().text==="{"){o=e.gullet.future(),h[s].push("{");break}if(a=e.gullet.popToken(),!/^[1-9]$/.test(a.text))throw new M('Invalid argument number "'+a.text+'"');if(parseInt(a.text)!==s+1)throw new M('Argument number "'+a.text+'" out of order');s++,h.push([])}else{if(a.text==="EOF")throw new M("Expected a macro definition");h[s].push(a.text)}var{tokens:c}=e.gullet.consumeArg();return o&&c.unshift(o),(t==="\\edef"||t==="\\xdef")&&(c=e.gullet.expandTokens(c),c.reverse()),e.gullet.macros.set(n,{tokens:c,numArgs:s,delimiters:h},t===gt[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=Vr(e.gullet.popToken());e.gullet.consumeSpaces();var n=O1(e);return Ur(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=Vr(e.gullet.popToken()),n=e.gullet.popToken(),s=e.gullet.popToken();return Ur(e,a,s,t==="\\\\globalfuture"),e.gullet.pushToken(s),e.gullet.pushToken(n),{type:"internal",mode:e.mode}}});var oe=function(e,t,a){var n=X.math[e]&&X.math[e].replace,s=St(n||e,t,a);if(!s)throw new Error("Unsupported symbol "+e+" and font size "+t+".");return s},Dt=function(e,t,a,n){var s=a.havingBaseStyle(t),o=y.makeSpan(n.concat(s.sizingClasses(a)),[e],a),h=s.sizeMultiplier/a.sizeMultiplier;return o.height*=h,o.depth*=h,o.maxFontSize=s.sizeMultiplier,o},$r=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=A(s),e.height-=s,e.depth+=s},H1=function(e,t,a,n,s,o){var h=y.makeSymbol(e,"Main-Regular",s,n),c=Dt(h,t,n,o);return a&&$r(c,n,t),c},F1=function(e,t,a,n){return y.makeSymbol(e,"Size"+t+"-Regular",a,n)},Yr=function(e,t,a,n,s,o){var h=F1(e,t,s,n),c=Dt(y.makeSpan(["delimsizing","size"+t],[h],n),R.TEXT,n,o);return a&&$r(c,n,R.TEXT),c},tt=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}},rt=function(e,t,a){var n=k0["Size4-Regular"][e.charCodeAt(0)]?k0["Size4-Regular"][e.charCodeAt(0)][4]:k0["Size1-Regular"][e.charCodeAt(0)][4],s=new S0("inner",Xa(e,Math.round(1e3*t))),o=new y0([s],{width:A(n),height:A(t),style:"width:"+A(n),viewBox:"0 0 "+1e3*n+" "+Math.round(1e3*t),preserveAspectRatio:"xMinYMin"}),h=y.makeSvgSpan([],[o],a);return h.height=t,h.style.height=A(t),h.style.width=A(n),{type:"elem",elem:h}},bt=.008,De={type:"kern",size:-1*bt},L1=["|","\\lvert","\\rvert","\\vert"],P1=["\\|","\\lVert","\\rVert","\\Vert"],Xr=function(e,t,a,n,s,o){var h,c,p,g,b="",w=0;h=p=g=e,c=null;var x="Size1-Regular";e==="\\uparrow"?p=g="\u23D0":e==="\\Uparrow"?p=g="\u2016":e==="\\downarrow"?h=p="\u23D0":e==="\\Downarrow"?h=p="\u2016":e==="\\updownarrow"?(h="\\uparrow",p="\u23D0",g="\\downarrow"):e==="\\Updownarrow"?(h="\\Uparrow",p="\u2016",g="\\Downarrow"):N.contains(L1,e)?(p="\u2223",b="vert",w=333):N.contains(P1,e)?(p="\u2225",b="doublevert",w=556):e==="["||e==="\\lbrack"?(h="\u23A1",p="\u23A2",g="\u23A3",x="Size4-Regular",b="lbrack",w=667):e==="]"||e==="\\rbrack"?(h="\u23A4",p="\u23A5",g="\u23A6",x="Size4-Regular",b="rbrack",w=667):e==="\\lfloor"||e==="\u230A"?(p=h="\u23A2",g="\u23A3",x="Size4-Regular",b="lfloor",w=667):e==="\\lceil"||e==="\u2308"?(h="\u23A1",p=g="\u23A2",x="Size4-Regular",b="lceil",w=667):e==="\\rfloor"||e==="\u230B"?(p=h="\u23A5",g="\u23A6",x="Size4-Regular",b="rfloor",w=667):e==="\\rceil"||e==="\u2309"?(h="\u23A4",p=g="\u23A5",x="Size4-Regular",b="rceil",w=667):e==="("||e==="\\lparen"?(h="\u239B",p="\u239C",g="\u239D",x="Size4-Regular",b="lparen",w=875):e===")"||e==="\\rparen"?(h="\u239E",p="\u239F",g="\u23A0",x="Size4-Regular",b="rparen",w=875):e==="\\{"||e==="\\lbrace"?(h="\u23A7",c="\u23A8",g="\u23A9",p="\u23AA",x="Size4-Regular"):e==="\\}"||e==="\\rbrace"?(h="\u23AB",c="\u23AC",g="\u23AD",p="\u23AA",x="Size4-Regular"):e==="\\lgroup"||e==="\u27EE"?(h="\u23A7",g="\u23A9",p="\u23AA",x="Size4-Regular"):e==="\\rgroup"||e==="\u27EF"?(h="\u23AB",g="\u23AD",p="\u23AA",x="Size4-Regular"):e==="\\lmoustache"||e==="\u23B0"?(h="\u23A7",g="\u23AD",p="\u23AA",x="Size4-Regular"):(e==="\\rmoustache"||e==="\u23B1")&&(h="\u23AB",g="\u23A9",p="\u23AA",x="Size4-Regular");var z=oe(h,x,s),T=z.height+z.depth,C=oe(p,x,s),q=C.height+C.depth,O=oe(g,x,s),H=O.height+O.depth,V=0,L=1;if(c!==null){var U=oe(c,x,s);V=U.height+U.depth,L=2}var G=T+H+V,j=Math.max(0,Math.ceil((t-G)/(L*q))),$=G+j*L*q,T0=n.fontMetrics().axisHeight;a&&(T0*=n.sizeMultiplier);var a0=$/2-T0,e0=[];if(b.length>0){var U0=$-T-H,s0=Math.round($*1e3),g0=Wa(b,Math.round(U0*1e3)),I0=new S0(b,g0),Z0=(w/1e3).toFixed(3)+"em",K0=(s0/1e3).toFixed(3)+"em",We=new y0([I0],{width:Z0,height:K0,viewBox:"0 0 "+w+" "+s0}),O0=y.makeSvgSpan([],[We],n);O0.height=s0/1e3,O0.style.width=Z0,O0.style.height=K0,e0.push({type:"elem",elem:O0})}else{if(e0.push(tt(g,x,s)),e0.push(De),c===null){var H0=$-T-H+2*bt;e0.push(rt(p,H0,n))}else{var d0=($-T-H-V)/2+2*bt;e0.push(rt(p,d0,n)),e0.push(De),e0.push(tt(c,x,s)),e0.push(De),e0.push(rt(p,d0,n))}e0.push(De),e0.push(tt(h,x,s))}var ie=n.havingBaseStyle(R.TEXT),je=y.makeVList({positionType:"bottom",positionData:a0,children:e0},ie);return Dt(y.makeSpan(["delimsizing","mult"],[je],ie),R.TEXT,n,o)},at=80,nt=.08,it=function(e,t,a,n,s){var o=Ya(e,n,a),h=new S0(e,o),c=new y0([h],{width:"400em",height:A(t),viewBox:"0 0 400000 "+a,preserveAspectRatio:"xMinYMin slice"});return y.makeSvgSpan(["hide-tail"],[c],s)},G1=function(e,t){var a=t.havingBaseSizing(),n=Kr("\\surd",e*a.sizeMultiplier,Zr,a),s=a.sizeMultiplier,o=Math.max(0,t.minRuleThickness-t.fontMetrics().sqrtRuleThickness),h,c=0,p=0,g=0,b;return n.type==="small"?(g=1e3+1e3*o+at,e<1?s=1:e<1.4&&(s=.7),c=(1+o+nt)/s,p=(1+o)/s,h=it("sqrtMain",c,g,o,t),h.style.minWidth="0.853em",b=.833/s):n.type==="large"?(g=(1e3+at)*ue[n.size],p=(ue[n.size]+o)/s,c=(ue[n.size]+o+nt)/s,h=it("sqrtSize"+n.size,c,g,o,t),h.style.minWidth="1.02em",b=1/s):(c=e+o+nt,p=e+o,g=Math.floor(1e3*e+o)+at,h=it("sqrtTall",c,g,o,t),h.style.minWidth="0.742em",b=1.056),h.height=p,h.style.height=A(c),{span:h,advanceWidth:b,ruleWidth:(t.fontMetrics().sqrtRuleThickness+o)*s}},Wr=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","\u230A","\u230B","\\lceil","\\rceil","\u2308","\u2309","\\surd"],V1=["\\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"],ue=[0,1.2,1.8,2.4,3],U1=function(e,t,a,n,s){if(e==="<"||e==="\\lt"||e==="\u27E8"?e="\\langle":(e===">"||e==="\\gt"||e==="\u27E9")&&(e="\\rangle"),N.contains(Wr,e)||N.contains(jr,e))return Yr(e,t,!1,a,n,s);if(N.contains(V1,e))return Xr(e,ue[t],!1,a,n,s);throw new M("Illegal delimiter: '"+e+"'")},$1=[{type:"small",style:R.SCRIPTSCRIPT},{type:"small",style:R.SCRIPT},{type:"small",style:R.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4}],Y1=[{type:"small",style:R.SCRIPTSCRIPT},{type:"small",style:R.SCRIPT},{type:"small",style:R.TEXT},{type:"stack"}],Zr=[{type:"small",style:R.SCRIPTSCRIPT},{type:"small",style:R.SCRIPT},{type:"small",style:R.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4},{type:"stack"}],X1=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.")},Kr=function(e,t,a,n){for(var s=Math.min(2,3-n.style.size),o=s;ot)return a[o]}return a[a.length-1]},Jr=function(e,t,a,n,s,o){e==="<"||e==="\\lt"||e==="\u27E8"?e="\\langle":(e===">"||e==="\\gt"||e==="\u27E9")&&(e="\\rangle");var h;N.contains(jr,e)?h=$1:N.contains(Wr,e)?h=Zr:h=Y1;var c=Kr(e,t,h,n);return c.type==="small"?H1(e,c.style,a,n,s,o):c.type==="large"?Yr(e,c.size,a,n,s,o):Xr(e,t,a,n,s,o)},W1=function(e,t,a,n,s,o){var h=n.fontMetrics().axisHeight*n.sizeMultiplier,c=901,p=5/n.fontMetrics().ptPerEm,g=Math.max(t-h,a+h),b=Math.max(g/500*c,2*g-p);return Jr(e,b,!0,n,s,o)},q0={sqrtImage:G1,sizedDelim:U1,sizeToMaxHeight:ue,customSizedDelim:Jr,leftRightDelim:W1},rr={"\\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}},j1=["(","\\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=Ue(r);if(t&&N.contains(j1,t.text))return t;throw t?new M("Invalid delimiter '"+t.text+"' after '"+e.funcName+"'",r):new M("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:rr[r.funcName].size,mclass:rr[r.funcName].mclass,delim:t.text}},htmlBuilder:(r,e)=>r.delim==="."?y.makeSpan([r.mclass]):q0.sizedDelim(r.delim,r.size,e,r.mode,[r.mclass]),mathmlBuilder:r=>{var e=[];r.delim!=="."&&e.push(v0(r.delim,r.mode));var t=new S.MathNode("mo",e);r.mclass==="mopen"||r.mclass==="mclose"?t.setAttribute("fence","true"):t.setAttribute("fence","false"),t.setAttribute("stretchy","true");var a=A(q0.sizeToMaxHeight[r.size]);return t.setAttribute("minsize",a),t.setAttribute("maxsize",a),t}});function ar(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 M("\\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=F(a.parseFunction(),"leftright-right");return{type:"leftright",mode:a.mode,body:n,left:t.text,right:s.delim,rightColor:s.color}},htmlBuilder:(r,e)=>{ar(r);for(var t=t0(r.body,e,!0,["mopen","mclose"]),a=0,n=0,s=!1,o=0;o{ar(r);var t=h0(r.body,e);if(r.left!=="."){var a=new S.MathNode("mo",[v0(r.left,r.mode)]);a.setAttribute("fence","true"),t.unshift(a)}if(r.right!=="."){var n=new S.MathNode("mo",[v0(r.right,r.mode)]);n.setAttribute("fence","true"),r.rightColor&&n.setAttribute("mathcolor",r.rightColor),t.push(n)}return zt(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 M("\\middle without preceding \\left",t);return{type:"middle",mode:r.parser.mode,delim:t.text}},htmlBuilder:(r,e)=>{var t;if(r.delim===".")t=fe(e,[]);else{t=q0.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==="|"?v0("|","text"):v0(r.delim,r.mode),a=new S.MathNode("mo",[t]);return a.setAttribute("fence","true"),a.setAttribute("lspace","0.05em"),a.setAttribute("rspace","0.05em"),a}});var Ct=(r,e)=>{var t=y.wrapFragment(P(r.body,e),e),a=r.label.slice(1),n=e.sizeMultiplier,s,o=0,h=N.isCharacterBox(r.body);if(a==="sout")s=y.makeSpan(["stretchy","sout"]),s.height=e.fontMetrics().defaultRuleThickness/n,o=-.5*e.fontMetrics().xHeight;else if(a==="phase"){var c=J({number:.6,unit:"pt"},e),p=J({number:.35,unit:"ex"},e),g=e.havingBaseSizing();n=n/g.sizeMultiplier;var b=t.height+t.depth+c+p;t.style.paddingLeft=A(b/2+c);var w=Math.floor(1e3*b*n),x=Ua(w),z=new y0([new S0("phase",x)],{width:"400em",height:A(w/1e3),viewBox:"0 0 400000 "+w,preserveAspectRatio:"xMinYMin slice"});s=y.makeSvgSpan(["hide-tail"],[z],e),s.style.height=A(b),o=t.depth+c+p}else{/cancel/.test(a)?h||t.classes.push("cancel-pad"):a==="angl"?t.classes.push("anglpad"):t.classes.push("boxpad");var T=0,C=0,q=0;/box/.test(a)?(q=Math.max(e.fontMetrics().fboxrule,e.minRuleThickness),T=e.fontMetrics().fboxsep+(a==="colorbox"?0:q),C=T):a==="angl"?(q=Math.max(e.fontMetrics().defaultRuleThickness,e.minRuleThickness),T=4*q,C=Math.max(0,.25-t.depth)):(T=h?.2:0,C=T),s=E0.encloseSpan(t,a,T,C,e),/fbox|boxed|fcolorbox/.test(a)?(s.style.borderStyle="solid",s.style.borderWidth=A(q)):a==="angl"&&q!==.049&&(s.style.borderTopWidth=A(q),s.style.borderRightWidth=A(q)),o=t.depth+C,r.backgroundColor&&(s.style.backgroundColor=r.backgroundColor,r.borderColor&&(s.style.borderColor=r.borderColor))}var O;if(r.backgroundColor)O=y.makeVList({positionType:"individualShift",children:[{type:"elem",elem:s,shift:o},{type:"elem",elem:t,shift:0}]},e);else{var H=/cancel|phase/.test(a)?["svg-align"]:[];O=y.makeVList({positionType:"individualShift",children:[{type:"elem",elem:t,shift:0},{type:"elem",elem:s,shift:o,wrapperClasses:H}]},e)}return/cancel/.test(a)&&(O.height=t.height,O.depth=t.depth),/cancel/.test(a)&&!h?y.makeSpan(["mord","cancel-lap"],[O],e):y.makeSpan(["mord"],[O],e)},qt=(r,e)=>{var t=0,a=new S.MathNode(r.label.indexOf("colorbox")>-1?"mpadded":"menclose",[Y(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=F(e[0],"color-token").color,o=e[1];return{type:"enclose",mode:a.mode,label:n,backgroundColor:s,body:o}},htmlBuilder:Ct,mathmlBuilder:qt});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=F(e[0],"color-token").color,o=F(e[1],"color-token").color,h=e[2];return{type:"enclose",mode:a.mode,label:n,backgroundColor:o,borderColor:s,body:h}},htmlBuilder:Ct,mathmlBuilder:qt});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:Ct,mathmlBuilder:qt});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 Qr={};function M0(r){for(var{type:e,names:t,props:a,handler:n,htmlBuilder:s,mathmlBuilder:o}=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 M("{"+r.envName+"} can be used only in display mode.")};function Nt(r){if(r.indexOf("ed")===-1)return r.indexOf("*")===-1}function V0(r,e,t){var{hskipBeforeAndAfter:a,addJot:n,cols:s,arraystretch:o,colSeparationType:h,autoTag:c,singleRow:p,emptySingleRow:g,maxNumCols:b,leqno:w}=e;if(r.gullet.beginGroup(),p||r.gullet.macros.set("\\cr","\\\\\\relax"),!o){var x=r.gullet.expandMacroAsText("\\arraystretch");if(x==null)o=1;else if(o=parseFloat(x),!o||o<0)throw new M("Invalid \\arraystretch: "+x)}r.gullet.beginGroup();var z=[],T=[z],C=[],q=[],O=c!=null?[]:void 0;function H(){c&&r.gullet.macros.set("\\@eqnsw","1",!0)}function V(){O&&(r.gullet.macros.get("\\df@tag")?(O.push(r.subparse([new p0("\\df@tag")])),r.gullet.macros.set("\\df@tag",void 0,!0)):O.push(!!c&&r.gullet.macros.get("\\@eqnsw")==="1"))}for(H(),q.push(nr(r));;){var L=r.parseExpression(!1,p?"\\end":"\\\\");r.gullet.endGroup(),r.gullet.beginGroup(),L={type:"ordgroup",mode:r.mode,body:L},t&&(L={type:"styling",mode:r.mode,style:t,body:[L]}),z.push(L);var U=r.fetch().text;if(U==="&"){if(b&&z.length===b){if(p||h)throw new M("Too many tab characters: &",r.nextToken);r.settings.reportNonstrict("textEnv","Too few columns specified in the {array} column argument.")}r.consume()}else if(U==="\\end"){V(),z.length===1&&L.type==="styling"&&L.body[0].body.length===0&&(T.length>1||!g)&&T.pop(),q.length0&&(H+=.25),p.push({pos:H,isDashed:be[ye]})}for(V(o[0]),a=0;a0&&(a0+=O,Gbe))for(a=0;a=h)){var Q0=void 0;(n>0||e.hskipBeforeAndAfter)&&(Q0=N.deflt(d0.pregap,w),Q0!==0&&(g0=y.makeSpan(["arraycolsep"],[]),g0.style.width=A(Q0),s0.push(g0)));var _0=[];for(a=0;a0){for(var ba=y.makeLineSpan("hline",t,g),ya=y.makeLineSpan("hdashline",t,g),Ze=[{type:"elem",elem:c,shift:0}];p.length>0;){var Gt=p.pop(),Vt=Gt.pos-e0;Gt.isDashed?Ze.push({type:"elem",elem:ya,shift:Vt}):Ze.push({type:"elem",elem:ba,shift:Vt})}c=y.makeVList({positionType:"individualShift",children:Ze},t)}if(Z0.length===0)return y.makeSpan(["mord"],[c],t);var Ke=y.makeVList({positionType:"individualShift",children:Z0},t);return Ke=y.makeSpan(["tag"],[Ke],t),y.makeFragment([c,Ke])},Z1={c:"center ",l:"left ",r:"right "},A0=function(e,t){for(var a=[],n=new S.MathNode("mtd",[],["mtr-glue"]),s=new S.MathNode("mtd",[],["mml-eqn-num"]),o=0;o0){var z=e.cols,T="",C=!1,q=0,O=z.length;z[0].type==="separator"&&(w+="top ",q=1),z[z.length-1].type==="separator"&&(w+="bottom ",O-=1);for(var H=q;H0?"left ":"",w+=j[j.length-1].length>0?"right ":"";for(var $=1;$-1?"alignat":"align",s=e.envName==="split",o=V0(e.parser,{cols:a,addJot:!0,autoTag:s?void 0:Nt(e.envName),emptySingleRow:!0,colSeparationType:n,maxNumCols:s?2:void 0,leqno:e.parser.settings.leqno},"display"),h,c=0,p={type:"ordgroup",mode:e.mode,body:[]};if(t[0]&&t[0].type==="ordgroup"){for(var g="",b=0;b0&&x&&(C=1),a[z]={type:"align",align:T,pregap:C,postgap:0}}return o.colSeparationType=x?"align":"alignat",o};M0({type:"array",names:["array","darray"],props:{numArgs:1},handler(r,e){var t=Ue(e[0]),a=t?[e[0]]:F(e[0],"ordgroup").body,n=a.map(function(o){var h=Tt(o),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 M("Unknown column alignment: "+c,o)}),s={cols:n,hskipBeforeAndAfter:!0,maxNumCols:n.length};return V0(r.parser,s,Et(r.envName))},htmlBuilder:z0,mathmlBuilder:A0});M0({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 M("Expected l or c or r",n.nextToken);n.consume(),n.consumeSpaces(),n.expect("]"),n.consume(),a.cols=[{type:"align",align:t}]}}var s=V0(r.parser,a,Et(r.envName)),o=Math.max(0,...s.body.map(h=>h.length));return s.cols=new Array(o).fill({type:"align",align:t}),e?{type:"leftright",mode:r.mode,body:[s],left:e[0],right:e[1],rightColor:void 0}:s},htmlBuilder:z0,mathmlBuilder:A0});M0({type:"array",names:["smallmatrix"],props:{numArgs:0},handler(r){var e={arraystretch:.5},t=V0(r.parser,e,"script");return t.colSeparationType="small",t},htmlBuilder:z0,mathmlBuilder:A0});M0({type:"array",names:["subarray"],props:{numArgs:1},handler(r,e){var t=Ue(e[0]),a=t?[e[0]]:F(e[0],"ordgroup").body,n=a.map(function(o){var h=Tt(o),c=h.text;if("lc".indexOf(c)!==-1)return{type:"align",align:c};throw new M("Unknown column alignment: "+c,o)});if(n.length>1)throw new M("{subarray} can contain only one column");var s={cols:n,hskipBeforeAndAfter:!1,arraystretch:.5};if(s=V0(r.parser,s,"script"),s.body.length>0&&s.body[0].length>1)throw new M("{subarray} can contain only one column");return s},htmlBuilder:z0,mathmlBuilder:A0});M0({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=V0(r.parser,e,Et(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:z0,mathmlBuilder:A0});M0({type:"array",names:["align","align*","aligned","split"],props:{numArgs:0},handler:ea,htmlBuilder:z0,mathmlBuilder:A0});M0({type:"array",names:["gathered","gather","gather*"],props:{numArgs:0},handler(r){N.contains(["gather","gather*"],r.envName)&&Xe(r);var e={cols:[{type:"align",align:"c"}],addJot:!0,colSeparationType:"gather",autoTag:Nt(r.envName),emptySingleRow:!0,leqno:r.parser.settings.leqno};return V0(r.parser,e,"display")},htmlBuilder:z0,mathmlBuilder:A0});M0({type:"array",names:["alignat","alignat*","alignedat"],props:{numArgs:1},handler:ea,htmlBuilder:z0,mathmlBuilder:A0});M0({type:"array",names:["equation","equation*"],props:{numArgs:0},handler(r){Xe(r);var e={autoTag:Nt(r.envName),emptySingleRow:!0,singleRow:!0,maxNumCols:1,leqno:r.parser.settings.leqno};return V0(r.parser,e,"display")},htmlBuilder:z0,mathmlBuilder:A0});M0({type:"array",names:["CD"],props:{numArgs:0},handler(r){return Xe(r),I1(r.parser)},htmlBuilder:z0,mathmlBuilder:A0});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 M(r.funcName+" valid only within array environment")}});var ir=Qr;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 M("Invalid environment name",n);for(var s="",o=0;o{var t=r.font,a=e.withFont(t);return P(r.body,a)},ra=(r,e)=>{var t=r.font,a=e.withFont(t);return Y(r.body,a)},sr={"\\Bbb":"\\mathbb","\\bold":"\\mathbf","\\frak":"\\mathfrak","\\bm":"\\boldsymbol"};B({type:"font",names:["\\mathrm","\\mathit","\\mathbf","\\mathnormal","\\mathbb","\\mathcal","\\mathfrak","\\mathscr","\\mathsf","\\mathtt","\\Bbb","\\bold","\\frak"],props:{numArgs:1,allowedInArgument:!0},handler:(r,e)=>{var{parser:t,funcName:a}=r,n=Fe(e[0]),s=a;return s in sr&&(s=sr[s]),{type:"font",mode:t.mode,font:s.slice(1),body:n}},htmlBuilder:ta,mathmlBuilder:ra});B({type:"mclass",names:["\\boldsymbol","\\bm"],props:{numArgs:1},handler:(r,e)=>{var{parser:t}=r,a=e[0],n=N.isCharacterBox(a);return{type:"mclass",mode:t.mode,mclass:$e(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,o=t.parseExpression(!0,n),h="math"+a.slice(1);return{type:"font",mode:s,font:h,body:{type:"ordgroup",mode:t.mode,body:o}}},htmlBuilder:ta,mathmlBuilder:ra});var aa=(r,e)=>{var t=e;return r==="display"?t=t.id>=R.SCRIPT.id?t.text():R.DISPLAY:r==="text"&&t.size===R.DISPLAY.size?t=R.TEXT:r==="script"?t=R.SCRIPT:r==="scriptscript"&&(t=R.SCRIPTSCRIPT),t},Rt=(r,e)=>{var t=aa(r.size,e.style),a=t.fracNum(),n=t.fracDen(),s;s=e.havingStyle(a);var o=P(r.numer,s,e);if(r.continued){var h=8.5/e.fontMetrics().ptPerEm,c=3.5/e.fontMetrics().ptPerEm;o.height=o.height0?z=3*w:z=7*w,T=e.fontMetrics().denom1):(b>0?(x=e.fontMetrics().num2,z=w):(x=e.fontMetrics().num3,z=3*w),T=e.fontMetrics().denom2);var C;if(g){var O=e.fontMetrics().axisHeight;x-o.depth-(O+.5*b){var t=new S.MathNode("mfrac",[Y(r.numer,e),Y(r.denom,e)]);if(!r.hasBarLine)t.setAttribute("linethickness","0px");else if(r.barSize){var a=J(r.barSize,e);t.setAttribute("linethickness",A(a))}var n=aa(r.size,e.style);if(n.size!==e.style.size){t=new S.MathNode("mstyle",[t]);var s=n.size===R.DISPLAY.size?"true":"false";t.setAttribute("displaystyle",s),t.setAttribute("scriptlevel","0")}if(r.leftDelim!=null||r.rightDelim!=null){var o=[];if(r.leftDelim!=null){var h=new S.MathNode("mo",[new S.TextNode(r.leftDelim.replace("\\",""))]);h.setAttribute("fence","true"),o.push(h)}if(o.push(t),r.rightDelim!=null){var c=new S.MathNode("mo",[new S.TextNode(r.rightDelim.replace("\\",""))]);c.setAttribute("fence","true"),o.push(c)}return zt(o)}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],o,h=null,c=null,p="auto";switch(a){case"\\dfrac":case"\\frac":case"\\tfrac":o=!0;break;case"\\\\atopfrac":o=!1;break;case"\\dbinom":case"\\binom":case"\\tbinom":o=!1,h="(",c=")";break;case"\\\\bracefrac":o=!1,h="\\{",c="\\}";break;case"\\\\brackfrac":o=!1,h="[",c="]";break;default:throw new Error("Unrecognized genfrac command")}switch(a){case"\\dfrac":case"\\dbinom":p="display";break;case"\\tfrac":case"\\tbinom":p="text";break}return{type:"genfrac",mode:t.mode,continued:!1,numer:n,denom:s,hasBarLine:o,leftDelim:h,rightDelim:c,size:p,barSize:null}},htmlBuilder:Rt,mathmlBuilder:It});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 lr=["display","text","script","scriptscript"],or=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=Fe(e[0]),o=s.type==="atom"&&s.family==="open"?or(s.text):null,h=Fe(e[1]),c=h.type==="atom"&&h.family==="close"?or(h.text):null,p=F(e[2],"size"),g,b=null;p.isBlank?g=!0:(b=p.value,g=b.number>0);var w="auto",x=e[3];if(x.type==="ordgroup"){if(x.body.length>0){var z=F(x.body[0],"textord");w=lr[Number(z.text)]}}else x=F(x,"textord"),w=lr[Number(x.text)];return{type:"genfrac",mode:t.mode,numer:a,denom:n,continued:!1,hasBarLine:g,barSize:b,leftDelim:o,rightDelim:c,size:w}},htmlBuilder:Rt,mathmlBuilder:It});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:F(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=Ba(F(e[1],"infix").size),o=e[2],h=s.number>0;return{type:"genfrac",mode:t.mode,numer:n,denom:o,continued:!1,hasBarLine:h,barSize:s,leftDelim:null,rightDelim:null,size:"auto"}},htmlBuilder:Rt,mathmlBuilder:It});var na=(r,e)=>{var t=e.style,a,n;r.type==="supsub"?(a=r.sup?P(r.sup,e.havingStyle(t.sup()),e):P(r.sub,e.havingStyle(t.sub()),e),n=F(r.base,"horizBrace")):n=F(r,"horizBrace");var s=P(n.base,e.havingBaseStyle(R.DISPLAY)),o=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:o}]},e),h.children[0].children[0].children[1].classes.push("svg-align")):(h=y.makeVList({positionType:"bottom",positionData:s.depth+.1+o.height,children:[{type:"elem",elem:o},{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)},K1=(r,e)=>{var t=E0.mathMLnode(r.label);return new S.MathNode(r.isOver?"mover":"munder",[Y(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:na,mathmlBuilder:K1});B({type:"href",names:["\\href"],props:{numArgs:2,argTypes:["url","original"],allowedInText:!0},handler:(r,e)=>{var{parser:t}=r,a=e[1],n=F(e[0],"url").url;return t.settings.isTrusted({command:"\\href",url:n})?{type:"href",mode:t.mode,href:n,body:Q(a)}:t.formatUnsupportedCmd("\\href")},htmlBuilder:(r,e)=>{var t=t0(r.body,e,!1);return y.makeAnchor(r.href,[],t,e)},mathmlBuilder:(r,e)=>{var t=G0(r.body,e);return t instanceof o0||(t=new o0("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=F(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=F(e[0],"raw").string,o=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 p=s.split(","),g=0;g{var t=t0(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)=>G0(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:Q(e[0]),mathml:Q(e[1])}},htmlBuilder:(r,e)=>{var t=t0(r.html,e,!1);return y.makeFragment(t)},mathmlBuilder:(r,e)=>G0(r.mathml,e)});var st=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 M("Invalid size: '"+e+"' in \\includegraphics");var a={number:+(t[1]+t[2]),unit:t[3]};if(!Sr(a))throw new M("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"},o={number:0,unit:"em"},h="";if(t[0])for(var c=F(t[0],"raw").string,p=c.split(","),g=0;g{var t=J(r.height,e),a=0;r.totalheight.number>0&&(a=J(r.totalheight,e)-t);var n=0;r.width.number>0&&(n=J(r.width,e));var s={height:A(t+a)};n>0&&(s.width=A(n)),a>0&&(s.verticalAlign=A(-a));var o=new ct(r.src,r.alt,s);return o.height=t,o.depth=a,o},mathmlBuilder:(r,e)=>{var t=new S.MathNode("mglyph",[]);t.setAttribute("alt",r.alt);var a=J(r.height,e),n=0;if(r.totalheight.number>0&&(n=J(r.totalheight,e)-a,t.setAttribute("valign",A(-n))),t.setAttribute("height",A(a+n)),r.width.number>0){var s=J(r.width,e);t.setAttribute("width",A(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=F(e[0],"size");if(t.settings.strict){var s=a[1]==="m",o=n.value.unit==="mu";s?(o||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")):o&&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=J(r.dimension,e);return new S.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([],[P(r.body,e)]),t=y.makeSpan(["inner"],[t],e)):t=y.makeSpan(["inner"],[P(r.body,e)]);var a=y.makeSpan(["fix"],[]),n=y.makeSpan([r.alignment],[t,a],e),s=y.makeSpan(["strut"]);return s.style.height=A(n.height+n.depth),n.depth&&(s.style.verticalAlign=A(-n.depth)),n.children.unshift(s),n=y.makeSpan(["thinbox"],[n],e),y.makeSpan(["mord","vbox"],[n],e)},mathmlBuilder:(r,e)=>{var t=new S.MathNode("mpadded",[Y(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==="\\("?"\\)":"$",o=a.parseExpression(!1,s);return a.expect(s),a.switchMode(n),{type:"styling",mode:a.mode,style:"text",body:o}}});B({type:"text",names:["\\)","\\]"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler(r,e){throw new M("Mismatched "+r.funcName)}});var ur=(r,e)=>{switch(e.style.size){case R.DISPLAY.size:return r.display;case R.TEXT.size:return r.text;case R.SCRIPT.size:return r.script;case R.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:Q(e[0]),text:Q(e[1]),script:Q(e[2]),scriptscript:Q(e[3])}},htmlBuilder:(r,e)=>{var t=ur(r,e),a=t0(t,e,!1);return y.makeFragment(a)},mathmlBuilder:(r,e)=>{var t=ur(r,e);return G0(t,e)}});var ia=(r,e,t,a,n,s,o)=>{r=y.makeSpan([],[r]);var h=t&&N.isCharacterBox(t),c,p;if(e){var g=P(e,a.havingStyle(n.sup()),a);p={elem:g,kern:Math.max(a.fontMetrics().bigOpSpacing1,a.fontMetrics().bigOpSpacing3-g.depth)}}if(t){var b=P(t,a.havingStyle(n.sub()),a);c={elem:b,kern:Math.max(a.fontMetrics().bigOpSpacing2,a.fontMetrics().bigOpSpacing4-b.height)}}var w;if(p&&c){var x=a.fontMetrics().bigOpSpacing5+c.elem.height+c.elem.depth+c.kern+r.depth+o;w=y.makeVList({positionType:"bottom",positionData:x,children:[{type:"kern",size:a.fontMetrics().bigOpSpacing5},{type:"elem",elem:c.elem,marginLeft:A(-s)},{type:"kern",size:c.kern},{type:"elem",elem:r},{type:"kern",size:p.kern},{type:"elem",elem:p.elem,marginLeft:A(s)},{type:"kern",size:a.fontMetrics().bigOpSpacing5}]},a)}else if(c){var z=r.height-o;w=y.makeVList({positionType:"top",positionData:z,children:[{type:"kern",size:a.fontMetrics().bigOpSpacing5},{type:"elem",elem:c.elem,marginLeft:A(-s)},{type:"kern",size:c.kern},{type:"elem",elem:r}]},a)}else if(p){var T=r.depth+o;w=y.makeVList({positionType:"bottom",positionData:T,children:[{type:"elem",elem:r},{type:"kern",size:p.kern},{type:"elem",elem:p.elem,marginLeft:A(s)},{type:"kern",size:a.fontMetrics().bigOpSpacing5}]},a)}else return r;var C=[w];if(c&&s!==0&&!h){var q=y.makeSpan(["mspace"],[],a);q.style.marginRight=A(s),C.unshift(q)}return y.makeSpan(["mop","op-limits"],C,a)},sa=["\\smallint"],ne=(r,e)=>{var t,a,n=!1,s;r.type==="supsub"?(t=r.sup,a=r.sub,s=F(r.base,"op"),n=!0):s=F(r,"op");var o=e.style,h=!1;o.size===R.DISPLAY.size&&s.symbol&&!N.contains(sa,s.name)&&(h=!0);var c;if(s.symbol){var p=h?"Size2-Regular":"Size1-Regular",g="";if((s.name==="\\oiint"||s.name==="\\oiiint")&&(g=s.name.slice(1),s.name=g==="oiint"?"\\iint":"\\iiint"),c=y.makeSymbol(s.name,p,"math",e,["mop","op-symbol",h?"large-op":"small-op"]),g.length>0){var b=c.italic,w=y.staticSvg(g+"Size"+(h?"2":"1"),e);c=y.makeVList({positionType:"individualShift",children:[{type:"elem",elem:c,shift:0},{type:"elem",elem:w,shift:h?.08:0}]},e),s.name="\\"+g,c.classes.unshift("mop"),c.italic=b}}else if(s.body){var x=t0(s.body,e,!0);x.length===1&&x[0]instanceof u0?(c=x[0],c.classes[0]="mop"):c=y.makeSpan(["mop"],x,e)}else{for(var z=[],T=1;T{var t;if(r.symbol)t=new o0("mo",[v0(r.name,r.mode)]),N.contains(sa,r.name)&&t.setAttribute("largeop","false");else if(r.body)t=new o0("mo",h0(r.body,e));else{t=new o0("mi",[new Y0(r.name.slice(1))]);var a=new o0("mo",[v0("\u2061","text")]);r.parentIsSupSub?t=new o0("mrow",[t,a]):t=Rr([t,a])}return t},J1={"\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=J1[n]),{type:"op",mode:t.mode,limits:!0,parentIsSupSub:!1,symbol:!0,name:n}},htmlBuilder:ne,mathmlBuilder:pe});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:Q(a)}},htmlBuilder:ne,mathmlBuilder:pe});var Q1={"\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:ne,mathmlBuilder:pe});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:ne,mathmlBuilder:pe});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=Q1[a]),{type:"op",mode:e.mode,limits:!1,parentIsSupSub:!1,symbol:!0,name:a}},htmlBuilder:ne,mathmlBuilder:pe});var la=(r,e)=>{var t,a,n=!1,s;r.type==="supsub"?(t=r.sup,a=r.sub,s=F(r.base,"operatorname"),n=!0):s=F(r,"operatorname");var o;if(s.body.length>0){for(var h=s.body.map(b=>{var w=b.text;return typeof w=="string"?{type:"textord",mode:b.mode,text:w}:b}),c=t0(h,e.withFont("mathrm"),!0),p=0;p{for(var t=h0(r.body,e.withFont("mathrm")),a=!0,n=0;ng.toText()).join("");t=[new S.TextNode(h)]}var c=new S.MathNode("mi",t);c.setAttribute("mathvariant","normal");var p=new S.MathNode("mo",[v0("\u2061","text")]);return r.parentIsSupSub?new S.MathNode("mrow",[c,p]):S.newDocumentFragment([c,p])};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:Q(n),alwaysHandleSupSub:a==="\\operatornamewithlimits",limits:!1,parentIsSupSub:!1}},htmlBuilder:la,mathmlBuilder:_1});m("\\operatorname","\\@ifstar\\operatornamewithlimits\\operatorname@");j0({type:"ordgroup",htmlBuilder(r,e){return r.semisimple?y.makeFragment(t0(r.body,e,!1)):y.makeSpan(["mord"],t0(r.body,e,!0),e)},mathmlBuilder(r,e){return G0(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=P(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 S.MathNode("mo",[new S.TextNode("\u203E")]);t.setAttribute("stretchy","true");var a=new S.MathNode("mover",[Y(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:Q(a)}},htmlBuilder:(r,e)=>{var t=t0(r.body,e.withPhantom(),!1);return y.makeFragment(t)},mathmlBuilder:(r,e)=>{var t=h0(r.body,e);return new S.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([],[P(r.body,e.withPhantom())]);if(t.height=0,t.depth=0,t.children)for(var a=0;a{var t=h0(Q(r.body),e),a=new S.MathNode("mphantom",t),n=new S.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"],[P(r.body,e.withPhantom())]),a=y.makeSpan(["fix"],[]);return y.makeSpan(["mord","rlap"],[t,a],e)},mathmlBuilder:(r,e)=>{var t=h0(Q(r.body),e),a=new S.MathNode("mphantom",t),n=new S.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=F(e[0],"size").value,n=e[1];return{type:"raisebox",mode:t.mode,dy:a,body:n}},htmlBuilder(r,e){var t=P(r.body,e),a=J(r.dy,e);return y.makeVList({positionType:"shift",positionData:-a,children:[{type:"elem",elem:t}]},e)},mathmlBuilder(r,e){var t=new S.MathNode("mpadded",[Y(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,argTypes:["size","size","size"]},handler(r,e,t){var{parser:a}=r,n=t[0],s=F(e[0],"size"),o=F(e[1],"size");return{type:"rule",mode:a.mode,shift:n&&F(n,"size").value,width:s.value,height:o.value}},htmlBuilder(r,e){var t=y.makeSpan(["mord","rule"],[],e),a=J(r.width,e),n=J(r.height,e),s=r.shift?J(r.shift,e):0;return t.style.borderRightWidth=A(a),t.style.borderTopWidth=A(n),t.style.bottom=A(s),t.width=a,t.height=n+s,t.depth=-s,t.maxFontSize=n*1.125*e.sizeMultiplier,t},mathmlBuilder(r,e){var t=J(r.width,e),a=J(r.height,e),n=r.shift?J(r.shift,e):0,s=e.color&&e.getColor()||"black",o=new S.MathNode("mspace");o.setAttribute("mathbackground",s),o.setAttribute("width",A(t)),o.setAttribute("height",A(a));var h=new S.MathNode("mpadded",[o]);return n>=0?h.setAttribute("height",A(n)):(h.setAttribute("height",A(n)),h.setAttribute("depth",A(-n))),h.setAttribute("voffset",A(n)),h}});function oa(r,e,t){for(var a=t0(r,e,!1),n=e.sizeMultiplier/t.sizeMultiplier,s=0;s{var t=e.havingSize(r.size);return oa(r.body,t,e)};B({type:"sizing",names:hr,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:hr.indexOf(a)+1,body:s}},htmlBuilder:e4,mathmlBuilder:(r,e)=>{var t=e.havingSize(r.size),a=h0(r.body,t),n=new S.MathNode("mstyle",a);return n.setAttribute("mathsize",A(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,o=t[0]&&F(t[0],"ordgroup");if(o)for(var h="",c=0;c{var t=y.makeSpan([],[P(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 S.MathNode("mpadded",[Y(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=P(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+o&&(o=(o+b-t.height-t.depth)/2);var w=c.height-t.height-o-p;t.style.paddingLeft=A(g);var x=y.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:t,wrapperClasses:["svg-align"]},{type:"kern",size:-(t.height+w)},{type:"elem",elem:c},{type:"kern",size:p}]},e);if(r.index){var z=e.havingStyle(R.SCRIPTSCRIPT),T=P(r.index,z,e),C=.6*(x.height-x.depth),q=y.makeVList({positionType:"shift",positionData:-C,children:[{type:"elem",elem:T}]},e),O=y.makeSpan(["root"],[q]);return y.makeSpan(["mord","sqrt"],[O,x],e)}else return y.makeSpan(["mord","sqrt"],[x],e)},mathmlBuilder(r,e){var{body:t,index:a}=r;return a?new S.MathNode("mroot",[Y(t,e),Y(a,e)]):new S.MathNode("msqrt",[Y(t,e)])}});var mr={display:R.DISPLAY,text:R.TEXT,script:R.SCRIPT,scriptscript:R.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),o=a.slice(1,a.length-5);return{type:"styling",mode:n.mode,style:o,body:s}},htmlBuilder(r,e){var t=mr[r.style],a=e.havingStyle(t).withFont("");return oa(r.body,a,e)},mathmlBuilder(r,e){var t=mr[r.style],a=e.havingStyle(t),n=h0(r.body,a),s=new S.MathNode("mstyle",n),o={display:["0","true"],text:["0","false"],script:["1","false"],scriptscript:["2","false"]},h=o[r.style];return s.setAttribute("scriptlevel",h[0]),s.setAttribute("displaystyle",h[1]),s}});var t4=function(e,t){var a=e.base;if(a)if(a.type==="op"){var n=a.limits&&(t.style.size===R.DISPLAY.size||a.alwaysHandleSupSub);return n?ne:null}else if(a.type==="operatorname"){var s=a.alwaysHandleSupSub&&(t.style.size===R.DISPLAY.size||a.limits);return s?la:null}else{if(a.type==="accent")return N.isCharacterBox(a.base)?Bt:null;if(a.type==="horizBrace"){var o=!e.sub;return o===a.isOver?na:null}else return null}else return null};j0({type:"supsub",htmlBuilder(r,e){var t=t4(r,e);if(t)return t(r,e);var{base:a,sup:n,sub:s}=r,o=P(a,e),h,c,p=e.fontMetrics(),g=0,b=0,w=a&&N.isCharacterBox(a);if(n){var x=e.havingStyle(e.style.sup());h=P(n,x,e),w||(g=o.height-x.fontMetrics().supDrop*x.sizeMultiplier/e.sizeMultiplier)}if(s){var z=e.havingStyle(e.style.sub());c=P(s,z,e),w||(b=o.depth+z.fontMetrics().subDrop*z.sizeMultiplier/e.sizeMultiplier)}var T;e.style===R.DISPLAY?T=p.sup1:e.style.cramped?T=p.sup3:T=p.sup2;var C=e.sizeMultiplier,q=A(.5/p.ptPerEm/C),O=null;if(c){var H=r.base&&r.base.type==="op"&&r.base.name&&(r.base.name==="\\oiint"||r.base.name==="\\oiiint");(o instanceof u0||H)&&(O=A(-o.italic))}var V;if(h&&c){g=Math.max(g,T,h.depth+.25*p.xHeight),b=Math.max(b,p.sub2);var L=p.defaultRuleThickness,U=4*L;if(g-h.depth-(c.height-b)0&&(g+=G,b-=G)}var j=[{type:"elem",elem:c,shift:b,marginRight:q,marginLeft:O},{type:"elem",elem:h,shift:-g,marginRight:q}];V=y.makeVList({positionType:"individualShift",children:j},e)}else if(c){b=Math.max(b,p.sub1,c.height-.8*p.xHeight);var $=[{type:"elem",elem:c,marginLeft:O,marginRight:q}];V=y.makeVList({positionType:"shift",positionData:b,children:$},e)}else if(h)g=Math.max(g,T,h.depth+.25*p.xHeight),V=y.makeVList({positionType:"shift",positionData:-g,children:[{type:"elem",elem:h,marginRight:q}]},e);else throw new Error("supsub must have either sup or sub.");var T0=ft(o,"right")||"mord";return y.makeSpan([T0],[o,y.makeSpan(["msupsub"],[V])],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=[Y(r.base,e)];r.sub&&s.push(Y(r.sub,e)),r.sup&&s.push(Y(r.sup,e));var o;if(t)o=a?"mover":"munder";else if(r.sub)if(r.sup){var p=r.base;p&&p.type==="op"&&p.limits&&e.style===R.DISPLAY||p&&p.type==="operatorname"&&p.alwaysHandleSupSub&&(e.style===R.DISPLAY||p.limits)?o="munderover":o="msubsup"}else{var c=r.base;c&&c.type==="op"&&c.limits&&(e.style===R.DISPLAY||c.alwaysHandleSupSub)||c&&c.type==="operatorname"&&c.alwaysHandleSupSub&&(c.limits||e.style===R.DISPLAY)?o="munder":o="msub"}else{var h=r.base;h&&h.type==="op"&&h.limits&&(e.style===R.DISPLAY||h.alwaysHandleSupSub)||h&&h.type==="operatorname"&&h.alwaysHandleSupSub&&(h.limits||e.style===R.DISPLAY)?o="mover":o="msup"}return new S.MathNode(o,s)}});j0({type:"atom",htmlBuilder(r,e){return y.mathsym(r.text,r.mode,e,["m"+r.family])},mathmlBuilder(r,e){var t=new S.MathNode("mo",[v0(r.text,r.mode)]);if(r.family==="bin"){var a=At(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 ua={mi:"italic",mn:"normal",mtext:"normal"};j0({type:"mathord",htmlBuilder(r,e){return y.makeOrd(r,e,"mathord")},mathmlBuilder(r,e){var t=new S.MathNode("mi",[v0(r.text,r.mode,e)]),a=At(r,e)||"italic";return a!==ua[t.type]&&t.setAttribute("mathvariant",a),t}});j0({type:"textord",htmlBuilder(r,e){return y.makeOrd(r,e,"textord")},mathmlBuilder(r,e){var t=v0(r.text,r.mode,e),a=At(r,e)||"normal",n;return r.mode==="text"?n=new S.MathNode("mtext",[t]):/[0-9]/.test(r.text)?n=new S.MathNode("mn",[t]):r.text==="\\prime"?n=new S.MathNode("mo",[t]):n=new S.MathNode("mi",[t]),a!==ua[n.type]&&n.setAttribute("mathvariant",a),n}});var lt={"\\nobreak":"nobreak","\\allowbreak":"allowbreak"},ot={" ":{},"\\ ":{},"~":{className:"nobreak"},"\\space":{},"\\nobreakspace":{className:"nobreak"}};j0({type:"spacing",htmlBuilder(r,e){if(ot.hasOwnProperty(r.text)){var t=ot[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(lt.hasOwnProperty(r.text))return y.makeSpan(["mspace",lt[r.text]],[],e);throw new M('Unknown type of space "'+r.text+'"')}},mathmlBuilder(r,e){var t;if(ot.hasOwnProperty(r.text))t=new S.MathNode("mtext",[new S.TextNode("\xA0")]);else{if(lt.hasOwnProperty(r.text))return new S.MathNode("mspace");throw new M('Unknown type of space "'+r.text+'"')}return t}});var cr=()=>{var r=new S.MathNode("mtd",[]);return r.setAttribute("width","50%"),r};j0({type:"tag",mathmlBuilder(r,e){var t=new S.MathNode("mtable",[new S.MathNode("mtr",[cr(),new S.MathNode("mtd",[G0(r.body,e)]),cr(),new S.MathNode("mtd",[G0(r.tag,e)])])]);return t.setAttribute("width","100%"),t}});var dr={"\\text":void 0,"\\textrm":"textrm","\\textsf":"textsf","\\texttt":"texttt","\\textnormal":"textrm"},fr={"\\textbf":"textbf","\\textmd":"textmd"},r4={"\\textit":"textit","\\textup":"textup"},pr=(r,e)=>{var t=r.font;if(t){if(dr[t])return e.withTextFontFamily(dr[t]);if(fr[t])return e.withTextFontWeight(fr[t]);if(t==="\\emph")return e.fontShape==="textit"?e.withTextFontShape("textup"):e.withTextFontShape("textit")}else return e;return e.withTextFontShape(r4[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:Q(n),font:a}},htmlBuilder(r,e){var t=pr(r,e),a=t0(r.body,t,!0);return y.makeSpan(["mord","text"],a,t)},mathmlBuilder(r,e){var t=pr(r,e);return G0(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=P(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 S.MathNode("mo",[new S.TextNode("\u203E")]);t.setAttribute("stretchy","true");var a=new S.MathNode("munder",[Y(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=P(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 S.MathNode("mpadded",[Y(r.body,e)],["vcenter"])}});B({type:"verb",names:["\\verb"],props:{numArgs:0,allowedInText:!0},handler(r,e,t){throw new M("\\verb ended by end of line instead of matching delimiter")},htmlBuilder(r,e){for(var t=vr(r),a=[],n=e.havingStyle(e.style.text()),s=0;sr.body.replace(/ /g,r.star?"\u2423":"\xA0"),L0=Nr,ha=`[ \r +-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.")}},X0=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 N.contains(this.classes,e)}toNode(){for(var e=document.createDocumentFragment(),t=0;tt.toText();return this.children.map(e).join("")}},k0={"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]}},xe={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]},Yt={\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){k0[r]=e}function St(r,e,t){if(!k0[e])throw new Error("Font metrics not found for font: "+e+".");var a=r.charCodeAt(0),n=k0[e][a];if(!n&&r[0]in Yt&&(a=Yt[r[0]].charCodeAt(0),n=k0[e][a]),!n&&t==="text"&&kr(a)&&(n=k0[e][77]),n)return{depth:n[0],height:n[1],italic:n[2],skew:n[3],width:n[4]}}var Qe={};function Za(r){var e;if(r>=5?e=0:r>=3?e=1:e=2,!Qe[e]){var t=Qe[e]={cssEmPerMu:xe.quad[e]/18};for(var a in xe)xe.hasOwnProperty(a)&&(t[a]=xe[a][e])}return Qe[e]}var Ka=[[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]],Xt=[.5,.6,.7,.8,.9,1,1.2,1.44,1.728,2.074,2.488],Wt=function(e,t){return t.size<2?e:Ka[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=Xt[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:Wt(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:Xt[e-1]})}havingBaseStyle(e){e=e||this.style.text();var t=Wt(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=Za(this.size)),this._fontMetrics}getColor(){return this.phantom?"transparent":this.color}};Re.BASESIZE=6;var mt={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},Ja={ex:!0,em:!0,mu:!0},Sr=function(e){return typeof e!="string"&&(e=e.unit),e in mt||e in Ja||e==="ex"},J=function(e,t){var a;if(e.unit in mt)a=mt[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 M("Invalid unit: '"+e.unit+"'");n!==t&&(a*=n.sizeMultiplier/t.sizeMultiplier)}return Math.min(e.number*a,t.maxSize)},A=function(e){return+e.toFixed(4)+"em"},P0=function(e){return e.filter(t=>t).join(" ")},Mr=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)}},zr=function(e){var t=document.createElement(e);t.className=P0(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",t},W0=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,Mr.call(this,e,a,n),this.children=t||[]}setAttribute(e,t){this.attributes[e]=t}hasClass(e){return N.contains(this.classes,e)}toNode(){return zr.call(this,"span")}toMarkup(){return Ar.call(this,"span")}},ce=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,Mr.call(this,t,n),this.children=a||[],this.setAttribute("href",e)}setAttribute(e,t){this.attributes[e]=t}hasClass(e){return N.contains(this.classes,e)}toNode(){return zr.call(this,"a")}toMarkup(){return Ar.call(this,"a")}},ct=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 N.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=''+N.escape(this.alt)+'0&&(t=document.createElement("span"),t.style.marginRight=A(this.italic)),this.classes.length>0&&(t=t||document.createElement("span"),t.className=P0(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+=N.hyphenate(n)+":"+this.style[n]+";");a&&(e=!0,t+=' style="'+N.escape(a)+'"');var s=N.escape(this.text);return e?(t+=">",t+=s,t+="",t):s}},y0=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':''}},de=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 e1={bin:1,close:1,inner:1,open:1,punct:1,rel:1},t1={"accent-token":1,mathord:1,"op-token":1,spacing:1,textord:1},X={math:{},text:{}};function i(r,e,t,a,n,s){X[r][n]={font:e,group:t,replace:a},s&&a&&(X[r][a]=X[r][n])}var l="math",k="text",u="main",d="ams",W="accent-token",D="bin",i0="close",ae="inner",E="mathord",_="op-token",c0="open",Ge="punct",f="rel",R0="spacing",v="textord";i(l,u,f,"\u2261","\\equiv",!0);i(l,u,f,"\u227A","\\prec",!0);i(l,u,f,"\u227B","\\succ",!0);i(l,u,f,"\u223C","\\sim",!0);i(l,u,f,"\u22A5","\\perp");i(l,u,f,"\u2AAF","\\preceq",!0);i(l,u,f,"\u2AB0","\\succeq",!0);i(l,u,f,"\u2243","\\simeq",!0);i(l,u,f,"\u2223","\\mid",!0);i(l,u,f,"\u226A","\\ll",!0);i(l,u,f,"\u226B","\\gg",!0);i(l,u,f,"\u224D","\\asymp",!0);i(l,u,f,"\u2225","\\parallel");i(l,u,f,"\u22C8","\\bowtie",!0);i(l,u,f,"\u2323","\\smile",!0);i(l,u,f,"\u2291","\\sqsubseteq",!0);i(l,u,f,"\u2292","\\sqsupseteq",!0);i(l,u,f,"\u2250","\\doteq",!0);i(l,u,f,"\u2322","\\frown",!0);i(l,u,f,"\u220B","\\ni",!0);i(l,u,f,"\u221D","\\propto",!0);i(l,u,f,"\u22A2","\\vdash",!0);i(l,u,f,"\u22A3","\\dashv",!0);i(l,u,f,"\u220B","\\owns");i(l,u,Ge,".","\\ldotp");i(l,u,Ge,"\u22C5","\\cdotp");i(l,u,v,"#","\\#");i(k,u,v,"#","\\#");i(l,u,v,"&","\\&");i(k,u,v,"&","\\&");i(l,u,v,"\u2135","\\aleph",!0);i(l,u,v,"\u2200","\\forall",!0);i(l,u,v,"\u210F","\\hbar",!0);i(l,u,v,"\u2203","\\exists",!0);i(l,u,v,"\u2207","\\nabla",!0);i(l,u,v,"\u266D","\\flat",!0);i(l,u,v,"\u2113","\\ell",!0);i(l,u,v,"\u266E","\\natural",!0);i(l,u,v,"\u2663","\\clubsuit",!0);i(l,u,v,"\u2118","\\wp",!0);i(l,u,v,"\u266F","\\sharp",!0);i(l,u,v,"\u2662","\\diamondsuit",!0);i(l,u,v,"\u211C","\\Re",!0);i(l,u,v,"\u2661","\\heartsuit",!0);i(l,u,v,"\u2111","\\Im",!0);i(l,u,v,"\u2660","\\spadesuit",!0);i(l,u,v,"\xA7","\\S",!0);i(k,u,v,"\xA7","\\S");i(l,u,v,"\xB6","\\P",!0);i(k,u,v,"\xB6","\\P");i(l,u,v,"\u2020","\\dag");i(k,u,v,"\u2020","\\dag");i(k,u,v,"\u2020","\\textdagger");i(l,u,v,"\u2021","\\ddag");i(k,u,v,"\u2021","\\ddag");i(k,u,v,"\u2021","\\textdaggerdbl");i(l,u,i0,"\u23B1","\\rmoustache",!0);i(l,u,c0,"\u23B0","\\lmoustache",!0);i(l,u,i0,"\u27EF","\\rgroup",!0);i(l,u,c0,"\u27EE","\\lgroup",!0);i(l,u,D,"\u2213","\\mp",!0);i(l,u,D,"\u2296","\\ominus",!0);i(l,u,D,"\u228E","\\uplus",!0);i(l,u,D,"\u2293","\\sqcap",!0);i(l,u,D,"\u2217","\\ast");i(l,u,D,"\u2294","\\sqcup",!0);i(l,u,D,"\u25EF","\\bigcirc",!0);i(l,u,D,"\u2219","\\bullet",!0);i(l,u,D,"\u2021","\\ddagger");i(l,u,D,"\u2240","\\wr",!0);i(l,u,D,"\u2A3F","\\amalg");i(l,u,D,"&","\\And");i(l,u,f,"\u27F5","\\longleftarrow",!0);i(l,u,f,"\u21D0","\\Leftarrow",!0);i(l,u,f,"\u27F8","\\Longleftarrow",!0);i(l,u,f,"\u27F6","\\longrightarrow",!0);i(l,u,f,"\u21D2","\\Rightarrow",!0);i(l,u,f,"\u27F9","\\Longrightarrow",!0);i(l,u,f,"\u2194","\\leftrightarrow",!0);i(l,u,f,"\u27F7","\\longleftrightarrow",!0);i(l,u,f,"\u21D4","\\Leftrightarrow",!0);i(l,u,f,"\u27FA","\\Longleftrightarrow",!0);i(l,u,f,"\u21A6","\\mapsto",!0);i(l,u,f,"\u27FC","\\longmapsto",!0);i(l,u,f,"\u2197","\\nearrow",!0);i(l,u,f,"\u21A9","\\hookleftarrow",!0);i(l,u,f,"\u21AA","\\hookrightarrow",!0);i(l,u,f,"\u2198","\\searrow",!0);i(l,u,f,"\u21BC","\\leftharpoonup",!0);i(l,u,f,"\u21C0","\\rightharpoonup",!0);i(l,u,f,"\u2199","\\swarrow",!0);i(l,u,f,"\u21BD","\\leftharpoondown",!0);i(l,u,f,"\u21C1","\\rightharpoondown",!0);i(l,u,f,"\u2196","\\nwarrow",!0);i(l,u,f,"\u21CC","\\rightleftharpoons",!0);i(l,d,f,"\u226E","\\nless",!0);i(l,d,f,"\uE010","\\@nleqslant");i(l,d,f,"\uE011","\\@nleqq");i(l,d,f,"\u2A87","\\lneq",!0);i(l,d,f,"\u2268","\\lneqq",!0);i(l,d,f,"\uE00C","\\@lvertneqq");i(l,d,f,"\u22E6","\\lnsim",!0);i(l,d,f,"\u2A89","\\lnapprox",!0);i(l,d,f,"\u2280","\\nprec",!0);i(l,d,f,"\u22E0","\\npreceq",!0);i(l,d,f,"\u22E8","\\precnsim",!0);i(l,d,f,"\u2AB9","\\precnapprox",!0);i(l,d,f,"\u2241","\\nsim",!0);i(l,d,f,"\uE006","\\@nshortmid");i(l,d,f,"\u2224","\\nmid",!0);i(l,d,f,"\u22AC","\\nvdash",!0);i(l,d,f,"\u22AD","\\nvDash",!0);i(l,d,f,"\u22EA","\\ntriangleleft");i(l,d,f,"\u22EC","\\ntrianglelefteq",!0);i(l,d,f,"\u228A","\\subsetneq",!0);i(l,d,f,"\uE01A","\\@varsubsetneq");i(l,d,f,"\u2ACB","\\subsetneqq",!0);i(l,d,f,"\uE017","\\@varsubsetneqq");i(l,d,f,"\u226F","\\ngtr",!0);i(l,d,f,"\uE00F","\\@ngeqslant");i(l,d,f,"\uE00E","\\@ngeqq");i(l,d,f,"\u2A88","\\gneq",!0);i(l,d,f,"\u2269","\\gneqq",!0);i(l,d,f,"\uE00D","\\@gvertneqq");i(l,d,f,"\u22E7","\\gnsim",!0);i(l,d,f,"\u2A8A","\\gnapprox",!0);i(l,d,f,"\u2281","\\nsucc",!0);i(l,d,f,"\u22E1","\\nsucceq",!0);i(l,d,f,"\u22E9","\\succnsim",!0);i(l,d,f,"\u2ABA","\\succnapprox",!0);i(l,d,f,"\u2246","\\ncong",!0);i(l,d,f,"\uE007","\\@nshortparallel");i(l,d,f,"\u2226","\\nparallel",!0);i(l,d,f,"\u22AF","\\nVDash",!0);i(l,d,f,"\u22EB","\\ntriangleright");i(l,d,f,"\u22ED","\\ntrianglerighteq",!0);i(l,d,f,"\uE018","\\@nsupseteqq");i(l,d,f,"\u228B","\\supsetneq",!0);i(l,d,f,"\uE01B","\\@varsupsetneq");i(l,d,f,"\u2ACC","\\supsetneqq",!0);i(l,d,f,"\uE019","\\@varsupsetneqq");i(l,d,f,"\u22AE","\\nVdash",!0);i(l,d,f,"\u2AB5","\\precneqq",!0);i(l,d,f,"\u2AB6","\\succneqq",!0);i(l,d,f,"\uE016","\\@nsubseteqq");i(l,d,D,"\u22B4","\\unlhd");i(l,d,D,"\u22B5","\\unrhd");i(l,d,f,"\u219A","\\nleftarrow",!0);i(l,d,f,"\u219B","\\nrightarrow",!0);i(l,d,f,"\u21CD","\\nLeftarrow",!0);i(l,d,f,"\u21CF","\\nRightarrow",!0);i(l,d,f,"\u21AE","\\nleftrightarrow",!0);i(l,d,f,"\u21CE","\\nLeftrightarrow",!0);i(l,d,f,"\u25B3","\\vartriangle");i(l,d,v,"\u210F","\\hslash");i(l,d,v,"\u25BD","\\triangledown");i(l,d,v,"\u25CA","\\lozenge");i(l,d,v,"\u24C8","\\circledS");i(l,d,v,"\xAE","\\circledR");i(k,d,v,"\xAE","\\circledR");i(l,d,v,"\u2221","\\measuredangle",!0);i(l,d,v,"\u2204","\\nexists");i(l,d,v,"\u2127","\\mho");i(l,d,v,"\u2132","\\Finv",!0);i(l,d,v,"\u2141","\\Game",!0);i(l,d,v,"\u2035","\\backprime");i(l,d,v,"\u25B2","\\blacktriangle");i(l,d,v,"\u25BC","\\blacktriangledown");i(l,d,v,"\u25A0","\\blacksquare");i(l,d,v,"\u29EB","\\blacklozenge");i(l,d,v,"\u2605","\\bigstar");i(l,d,v,"\u2222","\\sphericalangle",!0);i(l,d,v,"\u2201","\\complement",!0);i(l,d,v,"\xF0","\\eth",!0);i(k,u,v,"\xF0","\xF0");i(l,d,v,"\u2571","\\diagup");i(l,d,v,"\u2572","\\diagdown");i(l,d,v,"\u25A1","\\square");i(l,d,v,"\u25A1","\\Box");i(l,d,v,"\u25CA","\\Diamond");i(l,d,v,"\xA5","\\yen",!0);i(k,d,v,"\xA5","\\yen",!0);i(l,d,v,"\u2713","\\checkmark",!0);i(k,d,v,"\u2713","\\checkmark");i(l,d,v,"\u2136","\\beth",!0);i(l,d,v,"\u2138","\\daleth",!0);i(l,d,v,"\u2137","\\gimel",!0);i(l,d,v,"\u03DD","\\digamma",!0);i(l,d,v,"\u03F0","\\varkappa");i(l,d,c0,"\u250C","\\@ulcorner",!0);i(l,d,i0,"\u2510","\\@urcorner",!0);i(l,d,c0,"\u2514","\\@llcorner",!0);i(l,d,i0,"\u2518","\\@lrcorner",!0);i(l,d,f,"\u2266","\\leqq",!0);i(l,d,f,"\u2A7D","\\leqslant",!0);i(l,d,f,"\u2A95","\\eqslantless",!0);i(l,d,f,"\u2272","\\lesssim",!0);i(l,d,f,"\u2A85","\\lessapprox",!0);i(l,d,f,"\u224A","\\approxeq",!0);i(l,d,D,"\u22D6","\\lessdot");i(l,d,f,"\u22D8","\\lll",!0);i(l,d,f,"\u2276","\\lessgtr",!0);i(l,d,f,"\u22DA","\\lesseqgtr",!0);i(l,d,f,"\u2A8B","\\lesseqqgtr",!0);i(l,d,f,"\u2251","\\doteqdot");i(l,d,f,"\u2253","\\risingdotseq",!0);i(l,d,f,"\u2252","\\fallingdotseq",!0);i(l,d,f,"\u223D","\\backsim",!0);i(l,d,f,"\u22CD","\\backsimeq",!0);i(l,d,f,"\u2AC5","\\subseteqq",!0);i(l,d,f,"\u22D0","\\Subset",!0);i(l,d,f,"\u228F","\\sqsubset",!0);i(l,d,f,"\u227C","\\preccurlyeq",!0);i(l,d,f,"\u22DE","\\curlyeqprec",!0);i(l,d,f,"\u227E","\\precsim",!0);i(l,d,f,"\u2AB7","\\precapprox",!0);i(l,d,f,"\u22B2","\\vartriangleleft");i(l,d,f,"\u22B4","\\trianglelefteq");i(l,d,f,"\u22A8","\\vDash",!0);i(l,d,f,"\u22AA","\\Vvdash",!0);i(l,d,f,"\u2323","\\smallsmile");i(l,d,f,"\u2322","\\smallfrown");i(l,d,f,"\u224F","\\bumpeq",!0);i(l,d,f,"\u224E","\\Bumpeq",!0);i(l,d,f,"\u2267","\\geqq",!0);i(l,d,f,"\u2A7E","\\geqslant",!0);i(l,d,f,"\u2A96","\\eqslantgtr",!0);i(l,d,f,"\u2273","\\gtrsim",!0);i(l,d,f,"\u2A86","\\gtrapprox",!0);i(l,d,D,"\u22D7","\\gtrdot");i(l,d,f,"\u22D9","\\ggg",!0);i(l,d,f,"\u2277","\\gtrless",!0);i(l,d,f,"\u22DB","\\gtreqless",!0);i(l,d,f,"\u2A8C","\\gtreqqless",!0);i(l,d,f,"\u2256","\\eqcirc",!0);i(l,d,f,"\u2257","\\circeq",!0);i(l,d,f,"\u225C","\\triangleq",!0);i(l,d,f,"\u223C","\\thicksim");i(l,d,f,"\u2248","\\thickapprox");i(l,d,f,"\u2AC6","\\supseteqq",!0);i(l,d,f,"\u22D1","\\Supset",!0);i(l,d,f,"\u2290","\\sqsupset",!0);i(l,d,f,"\u227D","\\succcurlyeq",!0);i(l,d,f,"\u22DF","\\curlyeqsucc",!0);i(l,d,f,"\u227F","\\succsim",!0);i(l,d,f,"\u2AB8","\\succapprox",!0);i(l,d,f,"\u22B3","\\vartriangleright");i(l,d,f,"\u22B5","\\trianglerighteq");i(l,d,f,"\u22A9","\\Vdash",!0);i(l,d,f,"\u2223","\\shortmid");i(l,d,f,"\u2225","\\shortparallel");i(l,d,f,"\u226C","\\between",!0);i(l,d,f,"\u22D4","\\pitchfork",!0);i(l,d,f,"\u221D","\\varpropto");i(l,d,f,"\u25C0","\\blacktriangleleft");i(l,d,f,"\u2234","\\therefore",!0);i(l,d,f,"\u220D","\\backepsilon");i(l,d,f,"\u25B6","\\blacktriangleright");i(l,d,f,"\u2235","\\because",!0);i(l,d,f,"\u22D8","\\llless");i(l,d,f,"\u22D9","\\gggtr");i(l,d,D,"\u22B2","\\lhd");i(l,d,D,"\u22B3","\\rhd");i(l,d,f,"\u2242","\\eqsim",!0);i(l,u,f,"\u22C8","\\Join");i(l,d,f,"\u2251","\\Doteq",!0);i(l,d,D,"\u2214","\\dotplus",!0);i(l,d,D,"\u2216","\\smallsetminus");i(l,d,D,"\u22D2","\\Cap",!0);i(l,d,D,"\u22D3","\\Cup",!0);i(l,d,D,"\u2A5E","\\doublebarwedge",!0);i(l,d,D,"\u229F","\\boxminus",!0);i(l,d,D,"\u229E","\\boxplus",!0);i(l,d,D,"\u22C7","\\divideontimes",!0);i(l,d,D,"\u22C9","\\ltimes",!0);i(l,d,D,"\u22CA","\\rtimes",!0);i(l,d,D,"\u22CB","\\leftthreetimes",!0);i(l,d,D,"\u22CC","\\rightthreetimes",!0);i(l,d,D,"\u22CF","\\curlywedge",!0);i(l,d,D,"\u22CE","\\curlyvee",!0);i(l,d,D,"\u229D","\\circleddash",!0);i(l,d,D,"\u229B","\\circledast",!0);i(l,d,D,"\u22C5","\\centerdot");i(l,d,D,"\u22BA","\\intercal",!0);i(l,d,D,"\u22D2","\\doublecap");i(l,d,D,"\u22D3","\\doublecup");i(l,d,D,"\u22A0","\\boxtimes",!0);i(l,d,f,"\u21E2","\\dashrightarrow",!0);i(l,d,f,"\u21E0","\\dashleftarrow",!0);i(l,d,f,"\u21C7","\\leftleftarrows",!0);i(l,d,f,"\u21C6","\\leftrightarrows",!0);i(l,d,f,"\u21DA","\\Lleftarrow",!0);i(l,d,f,"\u219E","\\twoheadleftarrow",!0);i(l,d,f,"\u21A2","\\leftarrowtail",!0);i(l,d,f,"\u21AB","\\looparrowleft",!0);i(l,d,f,"\u21CB","\\leftrightharpoons",!0);i(l,d,f,"\u21B6","\\curvearrowleft",!0);i(l,d,f,"\u21BA","\\circlearrowleft",!0);i(l,d,f,"\u21B0","\\Lsh",!0);i(l,d,f,"\u21C8","\\upuparrows",!0);i(l,d,f,"\u21BF","\\upharpoonleft",!0);i(l,d,f,"\u21C3","\\downharpoonleft",!0);i(l,u,f,"\u22B6","\\origof",!0);i(l,u,f,"\u22B7","\\imageof",!0);i(l,d,f,"\u22B8","\\multimap",!0);i(l,d,f,"\u21AD","\\leftrightsquigarrow",!0);i(l,d,f,"\u21C9","\\rightrightarrows",!0);i(l,d,f,"\u21C4","\\rightleftarrows",!0);i(l,d,f,"\u21A0","\\twoheadrightarrow",!0);i(l,d,f,"\u21A3","\\rightarrowtail",!0);i(l,d,f,"\u21AC","\\looparrowright",!0);i(l,d,f,"\u21B7","\\curvearrowright",!0);i(l,d,f,"\u21BB","\\circlearrowright",!0);i(l,d,f,"\u21B1","\\Rsh",!0);i(l,d,f,"\u21CA","\\downdownarrows",!0);i(l,d,f,"\u21BE","\\upharpoonright",!0);i(l,d,f,"\u21C2","\\downharpoonright",!0);i(l,d,f,"\u21DD","\\rightsquigarrow",!0);i(l,d,f,"\u21DD","\\leadsto");i(l,d,f,"\u21DB","\\Rrightarrow",!0);i(l,d,f,"\u21BE","\\restriction");i(l,u,v,"\u2018","`");i(l,u,v,"$","\\$");i(k,u,v,"$","\\$");i(k,u,v,"$","\\textdollar");i(l,u,v,"%","\\%");i(k,u,v,"%","\\%");i(l,u,v,"_","\\_");i(k,u,v,"_","\\_");i(k,u,v,"_","\\textunderscore");i(l,u,v,"\u2220","\\angle",!0);i(l,u,v,"\u221E","\\infty",!0);i(l,u,v,"\u2032","\\prime");i(l,u,v,"\u25B3","\\triangle");i(l,u,v,"\u0393","\\Gamma",!0);i(l,u,v,"\u0394","\\Delta",!0);i(l,u,v,"\u0398","\\Theta",!0);i(l,u,v,"\u039B","\\Lambda",!0);i(l,u,v,"\u039E","\\Xi",!0);i(l,u,v,"\u03A0","\\Pi",!0);i(l,u,v,"\u03A3","\\Sigma",!0);i(l,u,v,"\u03A5","\\Upsilon",!0);i(l,u,v,"\u03A6","\\Phi",!0);i(l,u,v,"\u03A8","\\Psi",!0);i(l,u,v,"\u03A9","\\Omega",!0);i(l,u,v,"A","\u0391");i(l,u,v,"B","\u0392");i(l,u,v,"E","\u0395");i(l,u,v,"Z","\u0396");i(l,u,v,"H","\u0397");i(l,u,v,"I","\u0399");i(l,u,v,"K","\u039A");i(l,u,v,"M","\u039C");i(l,u,v,"N","\u039D");i(l,u,v,"O","\u039F");i(l,u,v,"P","\u03A1");i(l,u,v,"T","\u03A4");i(l,u,v,"X","\u03A7");i(l,u,v,"\xAC","\\neg",!0);i(l,u,v,"\xAC","\\lnot");i(l,u,v,"\u22A4","\\top");i(l,u,v,"\u22A5","\\bot");i(l,u,v,"\u2205","\\emptyset");i(l,d,v,"\u2205","\\varnothing");i(l,u,E,"\u03B1","\\alpha",!0);i(l,u,E,"\u03B2","\\beta",!0);i(l,u,E,"\u03B3","\\gamma",!0);i(l,u,E,"\u03B4","\\delta",!0);i(l,u,E,"\u03F5","\\epsilon",!0);i(l,u,E,"\u03B6","\\zeta",!0);i(l,u,E,"\u03B7","\\eta",!0);i(l,u,E,"\u03B8","\\theta",!0);i(l,u,E,"\u03B9","\\iota",!0);i(l,u,E,"\u03BA","\\kappa",!0);i(l,u,E,"\u03BB","\\lambda",!0);i(l,u,E,"\u03BC","\\mu",!0);i(l,u,E,"\u03BD","\\nu",!0);i(l,u,E,"\u03BE","\\xi",!0);i(l,u,E,"\u03BF","\\omicron",!0);i(l,u,E,"\u03C0","\\pi",!0);i(l,u,E,"\u03C1","\\rho",!0);i(l,u,E,"\u03C3","\\sigma",!0);i(l,u,E,"\u03C4","\\tau",!0);i(l,u,E,"\u03C5","\\upsilon",!0);i(l,u,E,"\u03D5","\\phi",!0);i(l,u,E,"\u03C7","\\chi",!0);i(l,u,E,"\u03C8","\\psi",!0);i(l,u,E,"\u03C9","\\omega",!0);i(l,u,E,"\u03B5","\\varepsilon",!0);i(l,u,E,"\u03D1","\\vartheta",!0);i(l,u,E,"\u03D6","\\varpi",!0);i(l,u,E,"\u03F1","\\varrho",!0);i(l,u,E,"\u03C2","\\varsigma",!0);i(l,u,E,"\u03C6","\\varphi",!0);i(l,u,D,"\u2217","*",!0);i(l,u,D,"+","+");i(l,u,D,"\u2212","-",!0);i(l,u,D,"\u22C5","\\cdot",!0);i(l,u,D,"\u2218","\\circ",!0);i(l,u,D,"\xF7","\\div",!0);i(l,u,D,"\xB1","\\pm",!0);i(l,u,D,"\xD7","\\times",!0);i(l,u,D,"\u2229","\\cap",!0);i(l,u,D,"\u222A","\\cup",!0);i(l,u,D,"\u2216","\\setminus",!0);i(l,u,D,"\u2227","\\land");i(l,u,D,"\u2228","\\lor");i(l,u,D,"\u2227","\\wedge",!0);i(l,u,D,"\u2228","\\vee",!0);i(l,u,v,"\u221A","\\surd");i(l,u,c0,"\u27E8","\\langle",!0);i(l,u,c0,"\u2223","\\lvert");i(l,u,c0,"\u2225","\\lVert");i(l,u,i0,"?","?");i(l,u,i0,"!","!");i(l,u,i0,"\u27E9","\\rangle",!0);i(l,u,i0,"\u2223","\\rvert");i(l,u,i0,"\u2225","\\rVert");i(l,u,f,"=","=");i(l,u,f,":",":");i(l,u,f,"\u2248","\\approx",!0);i(l,u,f,"\u2245","\\cong",!0);i(l,u,f,"\u2265","\\ge");i(l,u,f,"\u2265","\\geq",!0);i(l,u,f,"\u2190","\\gets");i(l,u,f,">","\\gt",!0);i(l,u,f,"\u2208","\\in",!0);i(l,u,f,"\uE020","\\@not");i(l,u,f,"\u2282","\\subset",!0);i(l,u,f,"\u2283","\\supset",!0);i(l,u,f,"\u2286","\\subseteq",!0);i(l,u,f,"\u2287","\\supseteq",!0);i(l,d,f,"\u2288","\\nsubseteq",!0);i(l,d,f,"\u2289","\\nsupseteq",!0);i(l,u,f,"\u22A8","\\models");i(l,u,f,"\u2190","\\leftarrow",!0);i(l,u,f,"\u2264","\\le");i(l,u,f,"\u2264","\\leq",!0);i(l,u,f,"<","\\lt",!0);i(l,u,f,"\u2192","\\rightarrow",!0);i(l,u,f,"\u2192","\\to");i(l,d,f,"\u2271","\\ngeq",!0);i(l,d,f,"\u2270","\\nleq",!0);i(l,u,R0,"\xA0","\\ ");i(l,u,R0,"\xA0","\\space");i(l,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(l,u,R0,null,"\\nobreak");i(l,u,R0,null,"\\allowbreak");i(l,u,Ge,",",",");i(l,u,Ge,";",";");i(l,d,D,"\u22BC","\\barwedge",!0);i(l,d,D,"\u22BB","\\veebar",!0);i(l,u,D,"\u2299","\\odot",!0);i(l,u,D,"\u2295","\\oplus",!0);i(l,u,D,"\u2297","\\otimes",!0);i(l,u,v,"\u2202","\\partial",!0);i(l,u,D,"\u2298","\\oslash",!0);i(l,d,D,"\u229A","\\circledcirc",!0);i(l,d,D,"\u22A1","\\boxdot",!0);i(l,u,D,"\u25B3","\\bigtriangleup");i(l,u,D,"\u25BD","\\bigtriangledown");i(l,u,D,"\u2020","\\dagger");i(l,u,D,"\u22C4","\\diamond");i(l,u,D,"\u22C6","\\star");i(l,u,D,"\u25C3","\\triangleleft");i(l,u,D,"\u25B9","\\triangleright");i(l,u,c0,"{","\\{");i(k,u,v,"{","\\{");i(k,u,v,"{","\\textbraceleft");i(l,u,i0,"}","\\}");i(k,u,v,"}","\\}");i(k,u,v,"}","\\textbraceright");i(l,u,c0,"{","\\lbrace");i(l,u,i0,"}","\\rbrace");i(l,u,c0,"[","\\lbrack",!0);i(k,u,v,"[","\\lbrack",!0);i(l,u,i0,"]","\\rbrack",!0);i(k,u,v,"]","\\rbrack",!0);i(l,u,c0,"(","\\lparen",!0);i(l,u,i0,")","\\rparen",!0);i(k,u,v,"<","\\textless",!0);i(k,u,v,">","\\textgreater",!0);i(l,u,c0,"\u230A","\\lfloor",!0);i(l,u,i0,"\u230B","\\rfloor",!0);i(l,u,c0,"\u2308","\\lceil",!0);i(l,u,i0,"\u2309","\\rceil",!0);i(l,u,v,"\\","\\backslash");i(l,u,v,"\u2223","|");i(l,u,v,"\u2223","\\vert");i(k,u,v,"|","\\textbar",!0);i(l,u,v,"\u2225","\\|");i(l,u,v,"\u2225","\\Vert");i(k,u,v,"\u2225","\\textbardbl");i(k,u,v,"~","\\textasciitilde");i(k,u,v,"\\","\\textbackslash");i(k,u,v,"^","\\textasciicircum");i(l,u,f,"\u2191","\\uparrow",!0);i(l,u,f,"\u21D1","\\Uparrow",!0);i(l,u,f,"\u2193","\\downarrow",!0);i(l,u,f,"\u21D3","\\Downarrow",!0);i(l,u,f,"\u2195","\\updownarrow",!0);i(l,u,f,"\u21D5","\\Updownarrow",!0);i(l,u,_,"\u2210","\\coprod");i(l,u,_,"\u22C1","\\bigvee");i(l,u,_,"\u22C0","\\bigwedge");i(l,u,_,"\u2A04","\\biguplus");i(l,u,_,"\u22C2","\\bigcap");i(l,u,_,"\u22C3","\\bigcup");i(l,u,_,"\u222B","\\int");i(l,u,_,"\u222B","\\intop");i(l,u,_,"\u222C","\\iint");i(l,u,_,"\u222D","\\iiint");i(l,u,_,"\u220F","\\prod");i(l,u,_,"\u2211","\\sum");i(l,u,_,"\u2A02","\\bigotimes");i(l,u,_,"\u2A01","\\bigoplus");i(l,u,_,"\u2A00","\\bigodot");i(l,u,_,"\u222E","\\oint");i(l,u,_,"\u222F","\\oiint");i(l,u,_,"\u2230","\\oiiint");i(l,u,_,"\u2A06","\\bigsqcup");i(l,u,_,"\u222B","\\smallint");i(k,u,ae,"\u2026","\\textellipsis");i(l,u,ae,"\u2026","\\mathellipsis");i(k,u,ae,"\u2026","\\ldots",!0);i(l,u,ae,"\u2026","\\ldots",!0);i(l,u,ae,"\u22EF","\\@cdots",!0);i(l,u,ae,"\u22F1","\\ddots",!0);i(l,u,v,"\u22EE","\\varvdots");i(l,u,W,"\u02CA","\\acute");i(l,u,W,"\u02CB","\\grave");i(l,u,W,"\xA8","\\ddot");i(l,u,W,"~","\\tilde");i(l,u,W,"\u02C9","\\bar");i(l,u,W,"\u02D8","\\breve");i(l,u,W,"\u02C7","\\check");i(l,u,W,"^","\\hat");i(l,u,W,"\u20D7","\\vec");i(l,u,W,"\u02D9","\\dot");i(l,u,W,"\u02DA","\\mathring");i(l,u,E,"\uE131","\\@imath");i(l,u,E,"\uE237","\\@jmath");i(l,u,v,"\u0131","\u0131");i(l,u,v,"\u0237","\u0237");i(k,u,v,"\u0131","\\i",!0);i(k,u,v,"\u0237","\\j",!0);i(k,u,v,"\xDF","\\ss",!0);i(k,u,v,"\xE6","\\ae",!0);i(k,u,v,"\u0153","\\oe",!0);i(k,u,v,"\xF8","\\o",!0);i(k,u,v,"\xC6","\\AE",!0);i(k,u,v,"\u0152","\\OE",!0);i(k,u,v,"\xD8","\\O",!0);i(k,u,W,"\u02CA","\\'");i(k,u,W,"\u02CB","\\`");i(k,u,W,"\u02C6","\\^");i(k,u,W,"\u02DC","\\~");i(k,u,W,"\u02C9","\\=");i(k,u,W,"\u02D8","\\u");i(k,u,W,"\u02D9","\\.");i(k,u,W,"\xB8","\\c");i(k,u,W,"\u02DA","\\r");i(k,u,W,"\u02C7","\\v");i(k,u,W,"\xA8",'\\"');i(k,u,W,"\u02DD","\\H");i(k,u,W,"\u25EF","\\textcircled");var Tr={"--":!0,"---":!0,"``":!0,"''":!0};i(k,u,v,"\u2013","--",!0);i(k,u,v,"\u2013","\\textendash");i(k,u,v,"\u2014","---",!0);i(k,u,v,"\u2014","\\textemdash");i(k,u,v,"\u2018","`",!0);i(k,u,v,"\u2018","\\textquoteleft");i(k,u,v,"\u2019","'",!0);i(k,u,v,"\u2019","\\textquoteright");i(k,u,v,"\u201C","``",!0);i(k,u,v,"\u201C","\\textquotedblleft");i(k,u,v,"\u201D","''",!0);i(k,u,v,"\u201D","\\textquotedblright");i(l,u,v,"\xB0","\\degree",!0);i(k,u,v,"\xB0","\\degree");i(k,u,v,"\xB0","\\textdegree",!0);i(l,u,v,"\xA3","\\pounds");i(l,u,v,"\xA3","\\mathsterling",!0);i(k,u,v,"\xA3","\\pounds");i(k,u,v,"\xA3","\\textsterling",!0);i(l,d,v,"\u2720","\\maltese");i(k,d,v,"\u2720","\\maltese");var Zt='0123456789/@."';for(we=0;we0)return b0(s,p,n,t,o.concat(g));if(c){var b,x;if(c==="boldsymbol"){var w=n1(s,n,t,o,a);b=w.fontName,x=[w.fontClass]}else h?(b=Cr[c].fontName,x=[c]):(b=Ae(c,t.fontWeight,t.fontShape),x=[c,t.fontWeight,t.fontShape]);if(Ve(s,b,n).metrics)return b0(s,b,n,t,o.concat(x));if(Tr.hasOwnProperty(s)&&b.slice(0,10)==="Typewriter"){for(var z=[],T=0;T{if(P0(r.classes)!==P0(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},l1=r=>{for(var e=0;et&&(t=o.height),o.depth>a&&(a=o.depth),o.maxFontSize>n&&(n=o.maxFontSize)}e.height=t,e.depth=a,e.maxFontSize=n},l0=function(e,t,a,n){var s=new W0(e,t,a,n);return Mt(s),s},Br=(r,e,t,a)=>new W0(r,e,t,a),o1=function(e,t,a){var n=l0([e],[],t);return n.height=Math.max(a||t.fontMetrics().defaultRuleThickness,t.minRuleThickness),n.style.borderBottomWidth=A(n.height),n.maxFontSize=1,n},u1=function(e,t,a,n){var s=new ce(e,t,a,n);return Mt(s),s},Dr=function(e){var t=new X0(e);return Mt(t),t},h1=function(e,t){return e instanceof X0?l0([],[e],t):e},m1=function(e){if(e.positionType==="individualShift"){for(var t=e.children,a=[t[0]],n=-t[0].shift-t[0].elem.depth,s=n,o=1;o{var t=l0(["mspace"],[],e),a=J(r,e);return t.style.marginRight=A(a),t},Ae=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},Cr={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"},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"}},qr={vec:["vec",.471,.714],oiintSize1:["oiintSize1",.957,.499],oiintSize2:["oiintSize2",1.472,.659],oiiintSize1:["oiiintSize1",1.304,.499],oiiintSize2:["oiiintSize2",1.98,.659]},f1=function(e,t){var[a,n,s]=qr[e],o=new S0(a),h=new y0([o],{width:A(n),height:A(s),style:"width:"+A(n),viewBox:"0 0 "+1e3*n+" "+1e3*s,preserveAspectRatio:"xMinYMin"}),c=Br(["overlay"],[h],t);return c.height=s,c.style.height=A(s),c.style.width=A(n),c},y={fontMap:Cr,makeSymbol:b0,mathsym:a1,makeSpan:l0,makeSvgSpan:Br,makeLineSpan:o1,makeAnchor:u1,makeFragment:Dr,wrapFragment:h1,makeVList:c1,makeOrd:i1,makeGlue:d1,staticSvg:f1,svgData:qr,tryCombineChars:l1},K={number:3,unit:"mu"},$0={number:4,unit:"mu"},D0={number:5,unit:"mu"},p1={mord:{mop:K,mbin:$0,mrel:D0,minner:K},mop:{mord:K,mop:K,mrel:D0,minner:K},mbin:{mord:$0,mop:$0,mopen:$0,minner:$0},mrel:{mord:D0,mop:D0,mopen:D0,minner:D0},mopen:{},mclose:{mop:K,mbin:$0,mrel:D0,minner:K},mpunct:{mord:K,mop:K,mrel:D0,mopen:K,mclose:K,mpunct:K,minner:K},minner:{mord:K,mop:K,mbin:$0,mrel:D0,mopen:K,mpunct:K,minner:K}},v1={mord:{mop:K},mop:{mord:K,mop:K},mbin:{},mrel:{},mopen:{},mclose:{mop:K},mpunct:{},minner:{mop:K}},Nr={},Oe={},He={};function B(r){for(var{type:e,names:t,props:a,handler:n,htmlBuilder:s,mathmlBuilder:o}=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 C=T.classes[0],q=z.classes[0];C==="mbin"&&N.contains(b1,q)?T.classes[0]="mord":q==="mbin"&&N.contains(g1,C)&&(z.classes[0]="mord")},{node:b},x,w),Qt(s,(z,T)=>{var C=ft(T),q=ft(z),O=C&&q?z.hasClass("mtight")?v1[C][q]:p1[C][q]:null;if(O)return y.makeGlue(O,p)},{node:b},x,w),s},Qt=function r(e,t,a,n,s){n&&e.push(n);for(var o=0;ox=>{e.splice(b+1,0,x),o++})(o)}n&&e.pop()},Er=function(e){return e instanceof X0||e instanceof ce||e instanceof W0&&e.hasClass("enclosing")?e:null},w1=function r(e,t){var a=Er(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},ft=function(e,t){return e?(t&&(e=w1(e,t)),x1[e.classes[0]]||null):null},fe=function(e,t){var a=["nulldelimiter"].concat(e.baseSizingClasses());return N0(t.concat(a))},P=function(e,t,a){if(!e)return N0();if(Oe[e.type]){var n=Oe[e.type](e,t);if(a&&t.size!==a.size){n=N0(t.sizingClasses(a),[n],t);var s=t.sizeMultiplier/a.sizeMultiplier;n.height*=s,n.depth*=s}return n}else throw new M("Got group of unknown type: '"+e.type+"'")};function Te(r,e){var t=N0(["base"],r,e),a=N0(["strut"]);return a.style.height=A(t.height+t.depth),t.depth&&(a.style.verticalAlign=A(-t.depth)),t.children.unshift(a),t}function pt(r,e){var t=null;r.length===1&&r[0].type==="tag"&&(t=r[0].tag,r=r[0].body);var a=t0(r,e,"root"),n;a.length===2&&a[1].hasClass("tag")&&(n=a.pop());for(var s=[],o=[],h=0;h0&&(s.push(Te(o,e)),o=[]),s.push(a[h]));o.length>0&&s.push(Te(o,e));var p;t?(p=Te(t0(t,e,!0)),p.classes=["tag"],s.push(p)):n&&s.push(n);var g=N0(["katex-html"],s);if(g.setAttribute("aria-hidden","true"),p){var b=p.children[0];b.style.height=A(g.height+g.depth),g.depth&&(b.style.verticalAlign=A(-g.depth))}return g}function Rr(r){return new X0(r)}var o0=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=P0(this.classes));for(var a=0;a0&&(e+=' class ="'+N.escape(P0(this.classes))+'"'),e+=">";for(var a=0;a",e}toText(){return this.children.map(e=>e.toText()).join("")}},Y0=class{constructor(e){this.text=void 0,this.text=e}toNode(){return document.createTextNode(this.text)}toMarkup(){return N.escape(this.toText())}toText(){return this.text}},vt=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",A(this.width)),e}toMarkup(){return this.character?""+this.character+"":''}toText(){return this.character?this.character:" "}},S={MathNode:o0,TextNode:Y0,SpaceNode:vt,newDocumentFragment:Rr},v0=function(e,t,a){return X[t][e]&&X[t][e].replace&&e.charCodeAt(0)!==55349&&!(Tr.hasOwnProperty(e)&&a&&(a.fontFamily&&a.fontFamily.slice(4,6)==="tt"||a.font&&a.font.slice(4,6)==="tt"))&&(e=X[t][e].replace),new S.TextNode(e)},zt=function(e){return e.length===1?e[0]:new S.MathNode("mrow",e)},At=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==="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(N.contains(["\\imath","\\jmath"],s))return null;X[n][s]&&X[n][s].replace&&(s=X[n][s].replace);var o=y.fontMap[a].fontName;return St(s,o,n)?y.fontMap[a].variant:null},h0=function(e,t,a){if(e.length===1){var n=Y(e[0],t);return a&&n instanceof o0&&n.type==="mo"&&(n.setAttribute("lspace","0em"),n.setAttribute("rspace","0em")),[n]}for(var s=[],o,h=0;h0&&(b.text=b.text.slice(0,1)+"\u0338"+b.text.slice(1),s.pop())}}}s.push(c),o=c}return s},G0=function(e,t,a){return zt(h0(e,t,a))},Y=function(e,t){if(!e)return new S.MathNode("mrow");if(He[e.type]){var a=He[e.type](e,t);return a}else throw new M("Got group of unknown type: '"+e.type+"'")};function _t(r,e,t,a,n){var s=h0(r,t),o;s.length===1&&s[0]instanceof o0&&N.contains(["mrow","mtable"],s[0].type)?o=s[0]:o=new S.MathNode("mrow",s);var h=new S.MathNode("annotation",[new S.TextNode(e)]);h.setAttribute("encoding","application/x-tex");var c=new S.MathNode("semantics",[o,h]),p=new S.MathNode("math",[c]);p.setAttribute("xmlns","http://www.w3.org/1998/Math/MathML"),a&&p.setAttribute("display","block");var g=n?"katex":"katex-mathml";return y.makeSpan([g],[p])}var Ir=function(e){return new Re({style:e.displayMode?R.DISPLAY:R.TEXT,maxSize:e.maxSize,minRuleThickness:e.minRuleThickness})},Or=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},k1=function(e,t,a){var n=Ir(a),s;if(a.output==="mathml")return _t(e,t,n,a.displayMode,!0);if(a.output==="html"){var o=pt(e,n);s=y.makeSpan(["katex"],[o])}else{var h=_t(e,t,n,a.displayMode,!1),c=pt(e,n);s=y.makeSpan(["katex"],[h,c])}return Or(s,a)},S1=function(e,t,a){var n=Ir(a),s=pt(e,n),o=y.makeSpan(["katex"],[s]);return Or(o,a)},M1={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":"="},z1=function(e){var t=new S.MathNode("mo",[new S.TextNode(M1[e.replace(/^\\/,"")])]);return t.setAttribute("stretchy","true"),t},A1={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]},T1=function(e){return e.type==="ordgroup"?e.body.length:1},B1=function(e,t){function a(){var h=4e5,c=e.label.slice(1);if(N.contains(["widehat","widecheck","widetilde","utilde"],c)){var p=e,g=T1(p.base),b,x,w;if(g>5)c==="widehat"||c==="widecheck"?(b=420,h=2364,w=.42,x=c+"4"):(b=312,h=2340,w=.34,x="tilde4");else{var z=[1,1,2,2,3,3][g];c==="widehat"||c==="widecheck"?(h=[0,1062,2364,2364,2364][z],b=[0,239,300,360,420][z],w=[0,.24,.3,.3,.36,.42][z],x=c+z):(h=[0,600,1033,2339,2340][z],b=[0,260,286,306,312][z],w=[0,.26,.286,.3,.306,.34][z],x="tilde"+z)}var T=new S0(x),C=new y0([T],{width:"100%",height:A(w),viewBox:"0 0 "+h+" "+b,preserveAspectRatio:"none"});return{span:y.makeSvgSpan([],[C],t),minWidth:0,height:w}}else{var q=[],O=A1[c],[H,V,L]=O,U=L/1e3,G=H.length,j,$;if(G===1){var T0=O[3];j=["hide-tail"],$=[T0]}else if(G===2)j=["halfarrow-left","halfarrow-right"],$=["xMinYMin","xMaxYMin"];else if(G===3)j=["brace-left","brace-center","brace-right"],$=["xMinYMin","xMidYMin","xMaxYMin"];else throw new Error(`Correct katexImagesData or update code here to support + `+G+" children.");for(var a0=0;a00&&(n.style.minWidth=A(s)),n},D1=function(e,t,a,n,s){var o,h=e.height+e.depth+a+n;if(/fbox|color|angl/.test(t)){if(o=y.makeSpan(["stretchy",t],[],s),t==="fbox"){var c=s.color&&s.getColor();c&&(o.style.borderColor=c)}}else{var p=[];/^[bx]cancel$/.test(t)&&p.push(new de({x1:"0",y1:"0",x2:"100%",y2:"100%","stroke-width":"0.046em"})),/^x?cancel$/.test(t)&&p.push(new de({x1:"0",y1:"100%",x2:"100%",y2:"0","stroke-width":"0.046em"}));var g=new y0(p,{width:"100%",height:A(h)});o=y.makeSvgSpan([],[g],s)}return o.height=h,o.style.height=A(h),o},E0={encloseSpan:D1,mathMLnode:z1,svgSpan:B1};function F(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 Tt(r){var e=Ue(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 Ue(r){return r&&(r.type==="atom"||t1.hasOwnProperty(r.type))?r:null}var Bt=(r,e)=>{var t,a,n;r&&r.type==="supsub"?(a=F(r.base,"accent"),t=a.base,r.base=t,n=_a(P(r,e)),r.base=a):(a=F(r,"accent"),t=a.base);var s=P(t,e.havingCrampedStyle()),o=a.isShifty&&N.isCharacterBox(t),h=0;if(o){var c=N.getBaseElem(t),p=P(c,e.havingCrampedStyle());h=jt(p).skew}var g=a.label==="\\c",b=g?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% - "+A(2*h)+")",marginLeft:A(2*h)}:void 0}]},e);else{var w,z;a.label==="\\vec"?(w=y.staticSvg("vec",e),z=y.svgData.vec[1]):(w=y.makeOrd({mode:a.mode,text:a.label},e,"textord"),w=jt(w),w.italic=0,z=w.width,g&&(b+=w.depth)),x=y.makeSpan(["accent-body"],[w]);var T=a.label==="\\textcircled";T&&(x.classes.push("accent-full"),b=s.height);var C=h;T||(C-=z/2),x.style.left=A(C),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 q=y.makeSpan(["mord","accent"],[x],e);return n?(n.children[0]=q,n.height=Math.max(q.height,n.height),n.classes[0]="mord",n):q},Hr=(r,e)=>{var t=r.isStretchy?E0.mathMLnode(r.label):new S.MathNode("mo",[v0(r.label,r.mode)]),a=new S.MathNode("mover",[Y(r.base,e),t]);return a.setAttribute("accent","true"),a},C1=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=Fe(e[0]),a=!C1.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:Bt,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:Bt,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=P(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 S.MathNode("munder",[Y(r.base,e),t]);return a.setAttribute("accentunder","true"),a}});var Be=r=>{var e=new S.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(P(r.body,a,e),e),s=r.label.slice(0,2)==="\\x"?"x":"cd";n.classes.push(s+"-arrow-pad");var o;r.below&&(a=e.havingStyle(t.sub()),o=y.wrapFragment(P(r.below,a,e),e),o.classes.push(s+"-arrow-pad"));var h=E0.svgSpan(r,e),c=-e.fontMetrics().axisHeight+.5*h.height,p=-e.fontMetrics().axisHeight-.5*h.height-.111;(n.depth>.25||r.label==="\\xleftequilibrium")&&(p-=n.depth);var g;if(o){var b=-e.fontMetrics().axisHeight+o.height+.5*h.height+.111;g=y.makeVList({positionType:"individualShift",children:[{type:"elem",elem:n,shift:p},{type:"elem",elem:h,shift:c},{type:"elem",elem:o,shift:b}]},e)}else g=y.makeVList({positionType:"individualShift",children:[{type:"elem",elem:n,shift:p},{type:"elem",elem:h,shift:c}]},e);return g.children[0].children[0].children[1].classes.push("svg-align"),y.makeSpan(["mrel","x-arrow"],[g],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=Be(Y(r.body,e));if(r.below){var s=Be(Y(r.below,e));a=new S.MathNode("munderover",[t,s,n])}else a=new S.MathNode("mover",[t,n])}else if(r.below){var o=Be(Y(r.below,e));a=new S.MathNode("munder",[t,o])}else a=Be(),a=new S.MathNode("mover",[t,a]);return a}});var q1=y.makeSpan;function Fr(r,e){var t=t0(r.body,e,!0);return q1([r.mclass],t,e)}function Lr(r,e){var t,a=h0(r.body,e);return r.mclass==="minner"?t=new S.MathNode("mpadded",a):r.mclass==="mord"?r.isCharacterBox?(t=a[0],t.type="mi"):t=new S.MathNode("mi",a):(r.isCharacterBox?(t=a[0],t.type="mo"):t=new S.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:Q(n),isCharacterBox:N.isCharacterBox(n)}},htmlBuilder:Fr,mathmlBuilder:Lr});var $e=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:$e(e[0]),body:Q(e[1]),isCharacterBox:N.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],o;a!=="\\stackrel"?o=$e(n):o="mrel";var h={type:"op",mode:n.mode,limits:!0,alwaysHandleSupSub:!0,parentIsSupSub:!1,symbol:!1,suppressBaseShift:a!=="\\stackrel",body:Q(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:o,body:[c],isCharacterBox:N.isCharacterBox(c)}},htmlBuilder:Fr,mathmlBuilder:Lr});B({type:"pmb",names:["\\pmb"],props:{numArgs:1,allowedInText:!0},handler(r,e){var{parser:t}=r;return{type:"pmb",mode:t.mode,mclass:$e(e[0]),body:Q(e[0])}},htmlBuilder(r,e){var t=t0(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=h0(r.body,e),a=new S.MathNode("mstyle",t);return a.setAttribute("style","text-shadow: 0.02em 0.01em 0.04px"),a}});var N1={">":"\\\\cdrightarrow","<":"\\\\cdleftarrow","=":"\\\\cdlongequal",A:"\\uparrow",V:"\\downarrow","|":"\\Vert",".":"no arrow"},er=()=>({type:"styling",body:[],mode:"math",style:"display"}),tr=r=>r.type==="textord"&&r.text==="@",E1=(r,e)=>(r.type==="mathord"||r.type==="atom")&&r.text===e;function R1(r,e,t){var a=N1[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"},o=t.callFunction("\\Big",[s],[]),h=t.callFunction("\\\\cdright",[e[1]],[]),c={type:"ordgroup",mode:"math",body:[n,o,h]};return t.callFunction("\\\\cdparent",[c],[])}case"\\\\cdlongequal":return t.callFunction("\\\\cdlongequal",[],[]);case"\\Vert":{var p={type:"textord",text:"\\Vert",mode:"math"};return t.callFunction("\\Big",[p],[])}default:return{type:"textord",text:" ",mode:"math"}}}function I1(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 M("Expected \\\\ or \\cr or \\end",r.nextToken)}for(var a=[],n=[a],s=0;s-1))if("<>AV".indexOf(p)>-1)for(var b=0;b<2;b++){for(var x=!0,w=c+1;wAV=|." after @',o[c]);var z=R1(p,g,r),T={type:"styling",body:[z],mode:"math",style:"display"};a.push(T),h=er()}s%2===0?a.push(h):a.shift(),a=[],n.push(a)}r.gullet.endGroup(),r.gullet.endGroup();var C=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:C,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(P(r.label,t,e),e);return a.classes.push("cd-label-"+r.side),a.style.bottom=A(.8-a.depth),a.height=0,a.depth=0,a},mathmlBuilder(r,e){var t=new S.MathNode("mrow",[Y(r.label,e)]);return t=new S.MathNode("mpadded",[t]),t.setAttribute("width","0"),r.side==="left"&&t.setAttribute("lspace","-1width"),t.setAttribute("voffset","0.7em"),t=new S.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(P(r.fragment,e),e);return t.classes.push("cd-vert-arrow"),t},mathmlBuilder(r,e){return new S.MathNode("mrow",[Y(r.fragment,e)])}});B({type:"textord",names:["\\@char"],props:{numArgs:1,allowedInText:!0},handler(r,e){for(var{parser:t}=r,a=F(e[0],"ordgroup"),n=a.body,s="",o=0;o=1114111)throw new M("\\@char with invalid code point "+s);return c<=65535?p=String.fromCharCode(c):(c-=65536,p=String.fromCharCode((c>>10)+55296,(c&1023)+56320)),{type:"textord",mode:t.mode,text:p}}});var Pr=(r,e)=>{var t=t0(r.body,e.withColor(r.color),!1);return y.makeFragment(t)},Gr=(r,e)=>{var t=h0(r.body,e.withColor(r.color)),a=new S.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=F(e[0],"color-token").color,n=e[1];return{type:"color",mode:t.mode,color:a,body:Q(n)}},htmlBuilder:Pr,mathmlBuilder:Gr});B({type:"color",names:["\\color"],props:{numArgs:1,allowedInText:!0,argTypes:["color"]},handler(r,e){var{parser:t,breakOnTokenText:a}=r,n=F(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:Pr,mathmlBuilder:Gr});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&&F(n,"size").value}},htmlBuilder(r,e){var t=y.makeSpan(["mspace"],[],e);return r.newLine&&(t.classes.push("newline"),r.size&&(t.style.marginTop=A(J(r.size,e)))),t},mathmlBuilder(r,e){var t=new S.MathNode("mspace");return r.newLine&&(t.setAttribute("linebreak","newline"),r.size&&t.setAttribute("height",A(J(r.size,e)))),t}});var gt={"\\global":"\\global","\\long":"\\\\globallong","\\\\globallong":"\\\\globallong","\\def":"\\gdef","\\gdef":"\\gdef","\\edef":"\\xdef","\\xdef":"\\xdef","\\let":"\\\\globallet","\\futurelet":"\\\\globalfuture"},Vr=r=>{var e=r.text;if(/^(?:[\\{}$&#^_]|EOF)$/.test(e))throw new M("Expected a control sequence",r);return e},O1=r=>{var e=r.gullet.popToken();return e.text==="="&&(e=r.gullet.popToken(),e.text===" "&&(e=r.gullet.popToken())),e},Ur=(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(gt[a.text])return(t==="\\global"||t==="\\\\globallong")&&(a.text=gt[a.text]),F(e.parseFunction(),"internal");throw new M("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 M("Expected a control sequence",a);for(var s=0,o,h=[[]];e.gullet.future().text!=="{";)if(a=e.gullet.popToken(),a.text==="#"){if(e.gullet.future().text==="{"){o=e.gullet.future(),h[s].push("{");break}if(a=e.gullet.popToken(),!/^[1-9]$/.test(a.text))throw new M('Invalid argument number "'+a.text+'"');if(parseInt(a.text)!==s+1)throw new M('Argument number "'+a.text+'" out of order');s++,h.push([])}else{if(a.text==="EOF")throw new M("Expected a macro definition");h[s].push(a.text)}var{tokens:c}=e.gullet.consumeArg();return o&&c.unshift(o),(t==="\\edef"||t==="\\xdef")&&(c=e.gullet.expandTokens(c),c.reverse()),e.gullet.macros.set(n,{tokens:c,numArgs:s,delimiters:h},t===gt[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=Vr(e.gullet.popToken());e.gullet.consumeSpaces();var n=O1(e);return Ur(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=Vr(e.gullet.popToken()),n=e.gullet.popToken(),s=e.gullet.popToken();return Ur(e,a,s,t==="\\\\globalfuture"),e.gullet.pushToken(s),e.gullet.pushToken(n),{type:"internal",mode:e.mode}}});var oe=function(e,t,a){var n=X.math[e]&&X.math[e].replace,s=St(n||e,t,a);if(!s)throw new Error("Unsupported symbol "+e+" and font size "+t+".");return s},Dt=function(e,t,a,n){var s=a.havingBaseStyle(t),o=y.makeSpan(n.concat(s.sizingClasses(a)),[e],a),h=s.sizeMultiplier/a.sizeMultiplier;return o.height*=h,o.depth*=h,o.maxFontSize=s.sizeMultiplier,o},$r=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=A(s),e.height-=s,e.depth+=s},H1=function(e,t,a,n,s,o){var h=y.makeSymbol(e,"Main-Regular",s,n),c=Dt(h,t,n,o);return a&&$r(c,n,t),c},F1=function(e,t,a,n){return y.makeSymbol(e,"Size"+t+"-Regular",a,n)},Yr=function(e,t,a,n,s,o){var h=F1(e,t,s,n),c=Dt(y.makeSpan(["delimsizing","size"+t],[h],n),R.TEXT,n,o);return a&&$r(c,n,R.TEXT),c},tt=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}},rt=function(e,t,a){var n=k0["Size4-Regular"][e.charCodeAt(0)]?k0["Size4-Regular"][e.charCodeAt(0)][4]:k0["Size1-Regular"][e.charCodeAt(0)][4],s=new S0("inner",Xa(e,Math.round(1e3*t))),o=new y0([s],{width:A(n),height:A(t),style:"width:"+A(n),viewBox:"0 0 "+1e3*n+" "+Math.round(1e3*t),preserveAspectRatio:"xMinYMin"}),h=y.makeSvgSpan([],[o],a);return h.height=t,h.style.height=A(t),h.style.width=A(n),{type:"elem",elem:h}},bt=.008,De={type:"kern",size:-1*bt},L1=["|","\\lvert","\\rvert","\\vert"],P1=["\\|","\\lVert","\\rVert","\\Vert"],Xr=function(e,t,a,n,s,o){var h,c,p,g,b="",x=0;h=p=g=e,c=null;var w="Size1-Regular";e==="\\uparrow"?p=g="\u23D0":e==="\\Uparrow"?p=g="\u2016":e==="\\downarrow"?h=p="\u23D0":e==="\\Downarrow"?h=p="\u2016":e==="\\updownarrow"?(h="\\uparrow",p="\u23D0",g="\\downarrow"):e==="\\Updownarrow"?(h="\\Uparrow",p="\u2016",g="\\Downarrow"):N.contains(L1,e)?(p="\u2223",b="vert",x=333):N.contains(P1,e)?(p="\u2225",b="doublevert",x=556):e==="["||e==="\\lbrack"?(h="\u23A1",p="\u23A2",g="\u23A3",w="Size4-Regular",b="lbrack",x=667):e==="]"||e==="\\rbrack"?(h="\u23A4",p="\u23A5",g="\u23A6",w="Size4-Regular",b="rbrack",x=667):e==="\\lfloor"||e==="\u230A"?(p=h="\u23A2",g="\u23A3",w="Size4-Regular",b="lfloor",x=667):e==="\\lceil"||e==="\u2308"?(h="\u23A1",p=g="\u23A2",w="Size4-Regular",b="lceil",x=667):e==="\\rfloor"||e==="\u230B"?(p=h="\u23A5",g="\u23A6",w="Size4-Regular",b="rfloor",x=667):e==="\\rceil"||e==="\u2309"?(h="\u23A4",p=g="\u23A5",w="Size4-Regular",b="rceil",x=667):e==="("||e==="\\lparen"?(h="\u239B",p="\u239C",g="\u239D",w="Size4-Regular",b="lparen",x=875):e===")"||e==="\\rparen"?(h="\u239E",p="\u239F",g="\u23A0",w="Size4-Regular",b="rparen",x=875):e==="\\{"||e==="\\lbrace"?(h="\u23A7",c="\u23A8",g="\u23A9",p="\u23AA",w="Size4-Regular"):e==="\\}"||e==="\\rbrace"?(h="\u23AB",c="\u23AC",g="\u23AD",p="\u23AA",w="Size4-Regular"):e==="\\lgroup"||e==="\u27EE"?(h="\u23A7",g="\u23A9",p="\u23AA",w="Size4-Regular"):e==="\\rgroup"||e==="\u27EF"?(h="\u23AB",g="\u23AD",p="\u23AA",w="Size4-Regular"):e==="\\lmoustache"||e==="\u23B0"?(h="\u23A7",g="\u23AD",p="\u23AA",w="Size4-Regular"):(e==="\\rmoustache"||e==="\u23B1")&&(h="\u23AB",g="\u23A9",p="\u23AA",w="Size4-Regular");var z=oe(h,w,s),T=z.height+z.depth,C=oe(p,w,s),q=C.height+C.depth,O=oe(g,w,s),H=O.height+O.depth,V=0,L=1;if(c!==null){var U=oe(c,w,s);V=U.height+U.depth,L=2}var G=T+H+V,j=Math.max(0,Math.ceil((t-G)/(L*q))),$=G+j*L*q,T0=n.fontMetrics().axisHeight;a&&(T0*=n.sizeMultiplier);var a0=$/2-T0,e0=[];if(b.length>0){var U0=$-T-H,s0=Math.round($*1e3),g0=Wa(b,Math.round(U0*1e3)),I0=new S0(b,g0),Z0=(x/1e3).toFixed(3)+"em",K0=(s0/1e3).toFixed(3)+"em",We=new y0([I0],{width:Z0,height:K0,viewBox:"0 0 "+x+" "+s0}),O0=y.makeSvgSpan([],[We],n);O0.height=s0/1e3,O0.style.width=Z0,O0.style.height=K0,e0.push({type:"elem",elem:O0})}else{if(e0.push(tt(g,w,s)),e0.push(De),c===null){var H0=$-T-H+2*bt;e0.push(rt(p,H0,n))}else{var d0=($-T-H-V)/2+2*bt;e0.push(rt(p,d0,n)),e0.push(De),e0.push(tt(c,w,s)),e0.push(De),e0.push(rt(p,d0,n))}e0.push(De),e0.push(tt(h,w,s))}var ie=n.havingBaseStyle(R.TEXT),je=y.makeVList({positionType:"bottom",positionData:a0,children:e0},ie);return Dt(y.makeSpan(["delimsizing","mult"],[je],ie),R.TEXT,n,o)},at=80,nt=.08,it=function(e,t,a,n,s){var o=Ya(e,n,a),h=new S0(e,o),c=new y0([h],{width:"400em",height:A(t),viewBox:"0 0 400000 "+a,preserveAspectRatio:"xMinYMin slice"});return y.makeSvgSpan(["hide-tail"],[c],s)},G1=function(e,t){var a=t.havingBaseSizing(),n=Kr("\\surd",e*a.sizeMultiplier,Zr,a),s=a.sizeMultiplier,o=Math.max(0,t.minRuleThickness-t.fontMetrics().sqrtRuleThickness),h,c=0,p=0,g=0,b;return n.type==="small"?(g=1e3+1e3*o+at,e<1?s=1:e<1.4&&(s=.7),c=(1+o+nt)/s,p=(1+o)/s,h=it("sqrtMain",c,g,o,t),h.style.minWidth="0.853em",b=.833/s):n.type==="large"?(g=(1e3+at)*ue[n.size],p=(ue[n.size]+o)/s,c=(ue[n.size]+o+nt)/s,h=it("sqrtSize"+n.size,c,g,o,t),h.style.minWidth="1.02em",b=1/s):(c=e+o+nt,p=e+o,g=Math.floor(1e3*e+o)+at,h=it("sqrtTall",c,g,o,t),h.style.minWidth="0.742em",b=1.056),h.height=p,h.style.height=A(c),{span:h,advanceWidth:b,ruleWidth:(t.fontMetrics().sqrtRuleThickness+o)*s}},Wr=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","\u230A","\u230B","\\lceil","\\rceil","\u2308","\u2309","\\surd"],V1=["\\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"],ue=[0,1.2,1.8,2.4,3],U1=function(e,t,a,n,s){if(e==="<"||e==="\\lt"||e==="\u27E8"?e="\\langle":(e===">"||e==="\\gt"||e==="\u27E9")&&(e="\\rangle"),N.contains(Wr,e)||N.contains(jr,e))return Yr(e,t,!1,a,n,s);if(N.contains(V1,e))return Xr(e,ue[t],!1,a,n,s);throw new M("Illegal delimiter: '"+e+"'")},$1=[{type:"small",style:R.SCRIPTSCRIPT},{type:"small",style:R.SCRIPT},{type:"small",style:R.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4}],Y1=[{type:"small",style:R.SCRIPTSCRIPT},{type:"small",style:R.SCRIPT},{type:"small",style:R.TEXT},{type:"stack"}],Zr=[{type:"small",style:R.SCRIPTSCRIPT},{type:"small",style:R.SCRIPT},{type:"small",style:R.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4},{type:"stack"}],X1=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.")},Kr=function(e,t,a,n){for(var s=Math.min(2,3-n.style.size),o=s;ot)return a[o]}return a[a.length-1]},Jr=function(e,t,a,n,s,o){e==="<"||e==="\\lt"||e==="\u27E8"?e="\\langle":(e===">"||e==="\\gt"||e==="\u27E9")&&(e="\\rangle");var h;N.contains(jr,e)?h=$1:N.contains(Wr,e)?h=Zr:h=Y1;var c=Kr(e,t,h,n);return c.type==="small"?H1(e,c.style,a,n,s,o):c.type==="large"?Yr(e,c.size,a,n,s,o):Xr(e,t,a,n,s,o)},W1=function(e,t,a,n,s,o){var h=n.fontMetrics().axisHeight*n.sizeMultiplier,c=901,p=5/n.fontMetrics().ptPerEm,g=Math.max(t-h,a+h),b=Math.max(g/500*c,2*g-p);return Jr(e,b,!0,n,s,o)},q0={sqrtImage:G1,sizedDelim:U1,sizeToMaxHeight:ue,customSizedDelim:Jr,leftRightDelim:W1},rr={"\\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}},j1=["(","\\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=Ue(r);if(t&&N.contains(j1,t.text))return t;throw t?new M("Invalid delimiter '"+t.text+"' after '"+e.funcName+"'",r):new M("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:rr[r.funcName].size,mclass:rr[r.funcName].mclass,delim:t.text}},htmlBuilder:(r,e)=>r.delim==="."?y.makeSpan([r.mclass]):q0.sizedDelim(r.delim,r.size,e,r.mode,[r.mclass]),mathmlBuilder:r=>{var e=[];r.delim!=="."&&e.push(v0(r.delim,r.mode));var t=new S.MathNode("mo",e);r.mclass==="mopen"||r.mclass==="mclose"?t.setAttribute("fence","true"):t.setAttribute("fence","false"),t.setAttribute("stretchy","true");var a=A(q0.sizeToMaxHeight[r.size]);return t.setAttribute("minsize",a),t.setAttribute("maxsize",a),t}});function ar(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 M("\\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=F(a.parseFunction(),"leftright-right");return{type:"leftright",mode:a.mode,body:n,left:t.text,right:s.delim,rightColor:s.color}},htmlBuilder:(r,e)=>{ar(r);for(var t=t0(r.body,e,!0,["mopen","mclose"]),a=0,n=0,s=!1,o=0;o{ar(r);var t=h0(r.body,e);if(r.left!=="."){var a=new S.MathNode("mo",[v0(r.left,r.mode)]);a.setAttribute("fence","true"),t.unshift(a)}if(r.right!=="."){var n=new S.MathNode("mo",[v0(r.right,r.mode)]);n.setAttribute("fence","true"),r.rightColor&&n.setAttribute("mathcolor",r.rightColor),t.push(n)}return zt(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 M("\\middle without preceding \\left",t);return{type:"middle",mode:r.parser.mode,delim:t.text}},htmlBuilder:(r,e)=>{var t;if(r.delim===".")t=fe(e,[]);else{t=q0.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==="|"?v0("|","text"):v0(r.delim,r.mode),a=new S.MathNode("mo",[t]);return a.setAttribute("fence","true"),a.setAttribute("lspace","0.05em"),a.setAttribute("rspace","0.05em"),a}});var Ct=(r,e)=>{var t=y.wrapFragment(P(r.body,e),e),a=r.label.slice(1),n=e.sizeMultiplier,s,o=0,h=N.isCharacterBox(r.body);if(a==="sout")s=y.makeSpan(["stretchy","sout"]),s.height=e.fontMetrics().defaultRuleThickness/n,o=-.5*e.fontMetrics().xHeight;else if(a==="phase"){var c=J({number:.6,unit:"pt"},e),p=J({number:.35,unit:"ex"},e),g=e.havingBaseSizing();n=n/g.sizeMultiplier;var b=t.height+t.depth+c+p;t.style.paddingLeft=A(b/2+c);var x=Math.floor(1e3*b*n),w=Ua(x),z=new y0([new S0("phase",w)],{width:"400em",height:A(x/1e3),viewBox:"0 0 400000 "+x,preserveAspectRatio:"xMinYMin slice"});s=y.makeSvgSpan(["hide-tail"],[z],e),s.style.height=A(b),o=t.depth+c+p}else{/cancel/.test(a)?h||t.classes.push("cancel-pad"):a==="angl"?t.classes.push("anglpad"):t.classes.push("boxpad");var T=0,C=0,q=0;/box/.test(a)?(q=Math.max(e.fontMetrics().fboxrule,e.minRuleThickness),T=e.fontMetrics().fboxsep+(a==="colorbox"?0:q),C=T):a==="angl"?(q=Math.max(e.fontMetrics().defaultRuleThickness,e.minRuleThickness),T=4*q,C=Math.max(0,.25-t.depth)):(T=h?.2:0,C=T),s=E0.encloseSpan(t,a,T,C,e),/fbox|boxed|fcolorbox/.test(a)?(s.style.borderStyle="solid",s.style.borderWidth=A(q)):a==="angl"&&q!==.049&&(s.style.borderTopWidth=A(q),s.style.borderRightWidth=A(q)),o=t.depth+C,r.backgroundColor&&(s.style.backgroundColor=r.backgroundColor,r.borderColor&&(s.style.borderColor=r.borderColor))}var O;if(r.backgroundColor)O=y.makeVList({positionType:"individualShift",children:[{type:"elem",elem:s,shift:o},{type:"elem",elem:t,shift:0}]},e);else{var H=/cancel|phase/.test(a)?["svg-align"]:[];O=y.makeVList({positionType:"individualShift",children:[{type:"elem",elem:t,shift:0},{type:"elem",elem:s,shift:o,wrapperClasses:H}]},e)}return/cancel/.test(a)&&(O.height=t.height,O.depth=t.depth),/cancel/.test(a)&&!h?y.makeSpan(["mord","cancel-lap"],[O],e):y.makeSpan(["mord"],[O],e)},qt=(r,e)=>{var t=0,a=new S.MathNode(r.label.indexOf("colorbox")>-1?"mpadded":"menclose",[Y(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=F(e[0],"color-token").color,o=e[1];return{type:"enclose",mode:a.mode,label:n,backgroundColor:s,body:o}},htmlBuilder:Ct,mathmlBuilder:qt});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=F(e[0],"color-token").color,o=F(e[1],"color-token").color,h=e[2];return{type:"enclose",mode:a.mode,label:n,backgroundColor:o,borderColor:s,body:h}},htmlBuilder:Ct,mathmlBuilder:qt});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:Ct,mathmlBuilder:qt});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 Qr={};function M0(r){for(var{type:e,names:t,props:a,handler:n,htmlBuilder:s,mathmlBuilder:o}=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 M("{"+r.envName+"} can be used only in display mode.")};function Nt(r){if(r.indexOf("ed")===-1)return r.indexOf("*")===-1}function V0(r,e,t){var{hskipBeforeAndAfter:a,addJot:n,cols:s,arraystretch:o,colSeparationType:h,autoTag:c,singleRow:p,emptySingleRow:g,maxNumCols:b,leqno:x}=e;if(r.gullet.beginGroup(),p||r.gullet.macros.set("\\cr","\\\\\\relax"),!o){var w=r.gullet.expandMacroAsText("\\arraystretch");if(w==null)o=1;else if(o=parseFloat(w),!o||o<0)throw new M("Invalid \\arraystretch: "+w)}r.gullet.beginGroup();var z=[],T=[z],C=[],q=[],O=c!=null?[]:void 0;function H(){c&&r.gullet.macros.set("\\@eqnsw","1",!0)}function V(){O&&(r.gullet.macros.get("\\df@tag")?(O.push(r.subparse([new p0("\\df@tag")])),r.gullet.macros.set("\\df@tag",void 0,!0)):O.push(!!c&&r.gullet.macros.get("\\@eqnsw")==="1"))}for(H(),q.push(nr(r));;){var L=r.parseExpression(!1,p?"\\end":"\\\\");r.gullet.endGroup(),r.gullet.beginGroup(),L={type:"ordgroup",mode:r.mode,body:L},t&&(L={type:"styling",mode:r.mode,style:t,body:[L]}),z.push(L);var U=r.fetch().text;if(U==="&"){if(b&&z.length===b){if(p||h)throw new M("Too many tab characters: &",r.nextToken);r.settings.reportNonstrict("textEnv","Too few columns specified in the {array} column argument.")}r.consume()}else if(U==="\\end"){V(),z.length===1&&L.type==="styling"&&L.body[0].body.length===0&&(T.length>1||!g)&&T.pop(),q.length0&&(H+=.25),p.push({pos:H,isDashed:be[ye]})}for(V(o[0]),a=0;a0&&(a0+=O,Gbe))for(a=0;a=h)){var Q0=void 0;(n>0||e.hskipBeforeAndAfter)&&(Q0=N.deflt(d0.pregap,x),Q0!==0&&(g0=y.makeSpan(["arraycolsep"],[]),g0.style.width=A(Q0),s0.push(g0)));var _0=[];for(a=0;a0){for(var ba=y.makeLineSpan("hline",t,g),ya=y.makeLineSpan("hdashline",t,g),Ze=[{type:"elem",elem:c,shift:0}];p.length>0;){var Gt=p.pop(),Vt=Gt.pos-e0;Gt.isDashed?Ze.push({type:"elem",elem:ya,shift:Vt}):Ze.push({type:"elem",elem:ba,shift:Vt})}c=y.makeVList({positionType:"individualShift",children:Ze},t)}if(Z0.length===0)return y.makeSpan(["mord"],[c],t);var Ke=y.makeVList({positionType:"individualShift",children:Z0},t);return Ke=y.makeSpan(["tag"],[Ke],t),y.makeFragment([c,Ke])},Z1={c:"center ",l:"left ",r:"right "},A0=function(e,t){for(var a=[],n=new S.MathNode("mtd",[],["mtr-glue"]),s=new S.MathNode("mtd",[],["mml-eqn-num"]),o=0;o0){var z=e.cols,T="",C=!1,q=0,O=z.length;z[0].type==="separator"&&(x+="top ",q=1),z[z.length-1].type==="separator"&&(x+="bottom ",O-=1);for(var H=q;H0?"left ":"",x+=j[j.length-1].length>0?"right ":"";for(var $=1;$-1?"alignat":"align",s=e.envName==="split",o=V0(e.parser,{cols:a,addJot:!0,autoTag:s?void 0:Nt(e.envName),emptySingleRow:!0,colSeparationType:n,maxNumCols:s?2:void 0,leqno:e.parser.settings.leqno},"display"),h,c=0,p={type:"ordgroup",mode:e.mode,body:[]};if(t[0]&&t[0].type==="ordgroup"){for(var g="",b=0;b0&&w&&(C=1),a[z]={type:"align",align:T,pregap:C,postgap:0}}return o.colSeparationType=w?"align":"alignat",o};M0({type:"array",names:["array","darray"],props:{numArgs:1},handler(r,e){var t=Ue(e[0]),a=t?[e[0]]:F(e[0],"ordgroup").body,n=a.map(function(o){var h=Tt(o),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 M("Unknown column alignment: "+c,o)}),s={cols:n,hskipBeforeAndAfter:!0,maxNumCols:n.length};return V0(r.parser,s,Et(r.envName))},htmlBuilder:z0,mathmlBuilder:A0});M0({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 M("Expected l or c or r",n.nextToken);n.consume(),n.consumeSpaces(),n.expect("]"),n.consume(),a.cols=[{type:"align",align:t}]}}var s=V0(r.parser,a,Et(r.envName)),o=Math.max(0,...s.body.map(h=>h.length));return s.cols=new Array(o).fill({type:"align",align:t}),e?{type:"leftright",mode:r.mode,body:[s],left:e[0],right:e[1],rightColor:void 0}:s},htmlBuilder:z0,mathmlBuilder:A0});M0({type:"array",names:["smallmatrix"],props:{numArgs:0},handler(r){var e={arraystretch:.5},t=V0(r.parser,e,"script");return t.colSeparationType="small",t},htmlBuilder:z0,mathmlBuilder:A0});M0({type:"array",names:["subarray"],props:{numArgs:1},handler(r,e){var t=Ue(e[0]),a=t?[e[0]]:F(e[0],"ordgroup").body,n=a.map(function(o){var h=Tt(o),c=h.text;if("lc".indexOf(c)!==-1)return{type:"align",align:c};throw new M("Unknown column alignment: "+c,o)});if(n.length>1)throw new M("{subarray} can contain only one column");var s={cols:n,hskipBeforeAndAfter:!1,arraystretch:.5};if(s=V0(r.parser,s,"script"),s.body.length>0&&s.body[0].length>1)throw new M("{subarray} can contain only one column");return s},htmlBuilder:z0,mathmlBuilder:A0});M0({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=V0(r.parser,e,Et(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:z0,mathmlBuilder:A0});M0({type:"array",names:["align","align*","aligned","split"],props:{numArgs:0},handler:ea,htmlBuilder:z0,mathmlBuilder:A0});M0({type:"array",names:["gathered","gather","gather*"],props:{numArgs:0},handler(r){N.contains(["gather","gather*"],r.envName)&&Xe(r);var e={cols:[{type:"align",align:"c"}],addJot:!0,colSeparationType:"gather",autoTag:Nt(r.envName),emptySingleRow:!0,leqno:r.parser.settings.leqno};return V0(r.parser,e,"display")},htmlBuilder:z0,mathmlBuilder:A0});M0({type:"array",names:["alignat","alignat*","alignedat"],props:{numArgs:1},handler:ea,htmlBuilder:z0,mathmlBuilder:A0});M0({type:"array",names:["equation","equation*"],props:{numArgs:0},handler(r){Xe(r);var e={autoTag:Nt(r.envName),emptySingleRow:!0,singleRow:!0,maxNumCols:1,leqno:r.parser.settings.leqno};return V0(r.parser,e,"display")},htmlBuilder:z0,mathmlBuilder:A0});M0({type:"array",names:["CD"],props:{numArgs:0},handler(r){return Xe(r),I1(r.parser)},htmlBuilder:z0,mathmlBuilder:A0});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 M(r.funcName+" valid only within array environment")}});var ir=Qr;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 M("Invalid environment name",n);for(var s="",o=0;o{var t=r.font,a=e.withFont(t);return P(r.body,a)},ra=(r,e)=>{var t=r.font,a=e.withFont(t);return Y(r.body,a)},sr={"\\Bbb":"\\mathbb","\\bold":"\\mathbf","\\frak":"\\mathfrak","\\bm":"\\boldsymbol"};B({type:"font",names:["\\mathrm","\\mathit","\\mathbf","\\mathnormal","\\mathbb","\\mathcal","\\mathfrak","\\mathscr","\\mathsf","\\mathtt","\\Bbb","\\bold","\\frak"],props:{numArgs:1,allowedInArgument:!0},handler:(r,e)=>{var{parser:t,funcName:a}=r,n=Fe(e[0]),s=a;return s in sr&&(s=sr[s]),{type:"font",mode:t.mode,font:s.slice(1),body:n}},htmlBuilder:ta,mathmlBuilder:ra});B({type:"mclass",names:["\\boldsymbol","\\bm"],props:{numArgs:1},handler:(r,e)=>{var{parser:t}=r,a=e[0],n=N.isCharacterBox(a);return{type:"mclass",mode:t.mode,mclass:$e(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,o=t.parseExpression(!0,n),h="math"+a.slice(1);return{type:"font",mode:s,font:h,body:{type:"ordgroup",mode:t.mode,body:o}}},htmlBuilder:ta,mathmlBuilder:ra});var aa=(r,e)=>{var t=e;return r==="display"?t=t.id>=R.SCRIPT.id?t.text():R.DISPLAY:r==="text"&&t.size===R.DISPLAY.size?t=R.TEXT:r==="script"?t=R.SCRIPT:r==="scriptscript"&&(t=R.SCRIPTSCRIPT),t},Rt=(r,e)=>{var t=aa(r.size,e.style),a=t.fracNum(),n=t.fracDen(),s;s=e.havingStyle(a);var o=P(r.numer,s,e);if(r.continued){var h=8.5/e.fontMetrics().ptPerEm,c=3.5/e.fontMetrics().ptPerEm;o.height=o.height0?z=3*x:z=7*x,T=e.fontMetrics().denom1):(b>0?(w=e.fontMetrics().num2,z=x):(w=e.fontMetrics().num3,z=3*x),T=e.fontMetrics().denom2);var C;if(g){var O=e.fontMetrics().axisHeight;w-o.depth-(O+.5*b){var t=new S.MathNode("mfrac",[Y(r.numer,e),Y(r.denom,e)]);if(!r.hasBarLine)t.setAttribute("linethickness","0px");else if(r.barSize){var a=J(r.barSize,e);t.setAttribute("linethickness",A(a))}var n=aa(r.size,e.style);if(n.size!==e.style.size){t=new S.MathNode("mstyle",[t]);var s=n.size===R.DISPLAY.size?"true":"false";t.setAttribute("displaystyle",s),t.setAttribute("scriptlevel","0")}if(r.leftDelim!=null||r.rightDelim!=null){var o=[];if(r.leftDelim!=null){var h=new S.MathNode("mo",[new S.TextNode(r.leftDelim.replace("\\",""))]);h.setAttribute("fence","true"),o.push(h)}if(o.push(t),r.rightDelim!=null){var c=new S.MathNode("mo",[new S.TextNode(r.rightDelim.replace("\\",""))]);c.setAttribute("fence","true"),o.push(c)}return zt(o)}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],o,h=null,c=null,p="auto";switch(a){case"\\dfrac":case"\\frac":case"\\tfrac":o=!0;break;case"\\\\atopfrac":o=!1;break;case"\\dbinom":case"\\binom":case"\\tbinom":o=!1,h="(",c=")";break;case"\\\\bracefrac":o=!1,h="\\{",c="\\}";break;case"\\\\brackfrac":o=!1,h="[",c="]";break;default:throw new Error("Unrecognized genfrac command")}switch(a){case"\\dfrac":case"\\dbinom":p="display";break;case"\\tfrac":case"\\tbinom":p="text";break}return{type:"genfrac",mode:t.mode,continued:!1,numer:n,denom:s,hasBarLine:o,leftDelim:h,rightDelim:c,size:p,barSize:null}},htmlBuilder:Rt,mathmlBuilder:It});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 lr=["display","text","script","scriptscript"],or=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=Fe(e[0]),o=s.type==="atom"&&s.family==="open"?or(s.text):null,h=Fe(e[1]),c=h.type==="atom"&&h.family==="close"?or(h.text):null,p=F(e[2],"size"),g,b=null;p.isBlank?g=!0:(b=p.value,g=b.number>0);var x="auto",w=e[3];if(w.type==="ordgroup"){if(w.body.length>0){var z=F(w.body[0],"textord");x=lr[Number(z.text)]}}else w=F(w,"textord"),x=lr[Number(w.text)];return{type:"genfrac",mode:t.mode,numer:a,denom:n,continued:!1,hasBarLine:g,barSize:b,leftDelim:o,rightDelim:c,size:x}},htmlBuilder:Rt,mathmlBuilder:It});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:F(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=Ba(F(e[1],"infix").size),o=e[2],h=s.number>0;return{type:"genfrac",mode:t.mode,numer:n,denom:o,continued:!1,hasBarLine:h,barSize:s,leftDelim:null,rightDelim:null,size:"auto"}},htmlBuilder:Rt,mathmlBuilder:It});var na=(r,e)=>{var t=e.style,a,n;r.type==="supsub"?(a=r.sup?P(r.sup,e.havingStyle(t.sup()),e):P(r.sub,e.havingStyle(t.sub()),e),n=F(r.base,"horizBrace")):n=F(r,"horizBrace");var s=P(n.base,e.havingBaseStyle(R.DISPLAY)),o=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:o}]},e),h.children[0].children[0].children[1].classes.push("svg-align")):(h=y.makeVList({positionType:"bottom",positionData:s.depth+.1+o.height,children:[{type:"elem",elem:o},{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)},K1=(r,e)=>{var t=E0.mathMLnode(r.label);return new S.MathNode(r.isOver?"mover":"munder",[Y(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:na,mathmlBuilder:K1});B({type:"href",names:["\\href"],props:{numArgs:2,argTypes:["url","original"],allowedInText:!0},handler:(r,e)=>{var{parser:t}=r,a=e[1],n=F(e[0],"url").url;return t.settings.isTrusted({command:"\\href",url:n})?{type:"href",mode:t.mode,href:n,body:Q(a)}:t.formatUnsupportedCmd("\\href")},htmlBuilder:(r,e)=>{var t=t0(r.body,e,!1);return y.makeAnchor(r.href,[],t,e)},mathmlBuilder:(r,e)=>{var t=G0(r.body,e);return t instanceof o0||(t=new o0("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=F(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=F(e[0],"raw").string,o=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 p=s.split(","),g=0;g{var t=t0(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)=>G0(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:Q(e[0]),mathml:Q(e[1])}},htmlBuilder:(r,e)=>{var t=t0(r.html,e,!1);return y.makeFragment(t)},mathmlBuilder:(r,e)=>G0(r.mathml,e)});var st=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 M("Invalid size: '"+e+"' in \\includegraphics");var a={number:+(t[1]+t[2]),unit:t[3]};if(!Sr(a))throw new M("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"},o={number:0,unit:"em"},h="";if(t[0])for(var c=F(t[0],"raw").string,p=c.split(","),g=0;g{var t=J(r.height,e),a=0;r.totalheight.number>0&&(a=J(r.totalheight,e)-t);var n=0;r.width.number>0&&(n=J(r.width,e));var s={height:A(t+a)};n>0&&(s.width=A(n)),a>0&&(s.verticalAlign=A(-a));var o=new ct(r.src,r.alt,s);return o.height=t,o.depth=a,o},mathmlBuilder:(r,e)=>{var t=new S.MathNode("mglyph",[]);t.setAttribute("alt",r.alt);var a=J(r.height,e),n=0;if(r.totalheight.number>0&&(n=J(r.totalheight,e)-a,t.setAttribute("valign",A(-n))),t.setAttribute("height",A(a+n)),r.width.number>0){var s=J(r.width,e);t.setAttribute("width",A(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=F(e[0],"size");if(t.settings.strict){var s=a[1]==="m",o=n.value.unit==="mu";s?(o||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")):o&&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=J(r.dimension,e);return new S.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([],[P(r.body,e)]),t=y.makeSpan(["inner"],[t],e)):t=y.makeSpan(["inner"],[P(r.body,e)]);var a=y.makeSpan(["fix"],[]),n=y.makeSpan([r.alignment],[t,a],e),s=y.makeSpan(["strut"]);return s.style.height=A(n.height+n.depth),n.depth&&(s.style.verticalAlign=A(-n.depth)),n.children.unshift(s),n=y.makeSpan(["thinbox"],[n],e),y.makeSpan(["mord","vbox"],[n],e)},mathmlBuilder:(r,e)=>{var t=new S.MathNode("mpadded",[Y(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==="\\("?"\\)":"$",o=a.parseExpression(!1,s);return a.expect(s),a.switchMode(n),{type:"styling",mode:a.mode,style:"text",body:o}}});B({type:"text",names:["\\)","\\]"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler(r,e){throw new M("Mismatched "+r.funcName)}});var ur=(r,e)=>{switch(e.style.size){case R.DISPLAY.size:return r.display;case R.TEXT.size:return r.text;case R.SCRIPT.size:return r.script;case R.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:Q(e[0]),text:Q(e[1]),script:Q(e[2]),scriptscript:Q(e[3])}},htmlBuilder:(r,e)=>{var t=ur(r,e),a=t0(t,e,!1);return y.makeFragment(a)},mathmlBuilder:(r,e)=>{var t=ur(r,e);return G0(t,e)}});var ia=(r,e,t,a,n,s,o)=>{r=y.makeSpan([],[r]);var h=t&&N.isCharacterBox(t),c,p;if(e){var g=P(e,a.havingStyle(n.sup()),a);p={elem:g,kern:Math.max(a.fontMetrics().bigOpSpacing1,a.fontMetrics().bigOpSpacing3-g.depth)}}if(t){var b=P(t,a.havingStyle(n.sub()),a);c={elem:b,kern:Math.max(a.fontMetrics().bigOpSpacing2,a.fontMetrics().bigOpSpacing4-b.height)}}var x;if(p&&c){var w=a.fontMetrics().bigOpSpacing5+c.elem.height+c.elem.depth+c.kern+r.depth+o;x=y.makeVList({positionType:"bottom",positionData:w,children:[{type:"kern",size:a.fontMetrics().bigOpSpacing5},{type:"elem",elem:c.elem,marginLeft:A(-s)},{type:"kern",size:c.kern},{type:"elem",elem:r},{type:"kern",size:p.kern},{type:"elem",elem:p.elem,marginLeft:A(s)},{type:"kern",size:a.fontMetrics().bigOpSpacing5}]},a)}else if(c){var z=r.height-o;x=y.makeVList({positionType:"top",positionData:z,children:[{type:"kern",size:a.fontMetrics().bigOpSpacing5},{type:"elem",elem:c.elem,marginLeft:A(-s)},{type:"kern",size:c.kern},{type:"elem",elem:r}]},a)}else if(p){var T=r.depth+o;x=y.makeVList({positionType:"bottom",positionData:T,children:[{type:"elem",elem:r},{type:"kern",size:p.kern},{type:"elem",elem:p.elem,marginLeft:A(s)},{type:"kern",size:a.fontMetrics().bigOpSpacing5}]},a)}else return r;var C=[x];if(c&&s!==0&&!h){var q=y.makeSpan(["mspace"],[],a);q.style.marginRight=A(s),C.unshift(q)}return y.makeSpan(["mop","op-limits"],C,a)},sa=["\\smallint"],ne=(r,e)=>{var t,a,n=!1,s;r.type==="supsub"?(t=r.sup,a=r.sub,s=F(r.base,"op"),n=!0):s=F(r,"op");var o=e.style,h=!1;o.size===R.DISPLAY.size&&s.symbol&&!N.contains(sa,s.name)&&(h=!0);var c;if(s.symbol){var p=h?"Size2-Regular":"Size1-Regular",g="";if((s.name==="\\oiint"||s.name==="\\oiiint")&&(g=s.name.slice(1),s.name=g==="oiint"?"\\iint":"\\iiint"),c=y.makeSymbol(s.name,p,"math",e,["mop","op-symbol",h?"large-op":"small-op"]),g.length>0){var b=c.italic,x=y.staticSvg(g+"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="\\"+g,c.classes.unshift("mop"),c.italic=b}}else if(s.body){var w=t0(s.body,e,!0);w.length===1&&w[0]instanceof u0?(c=w[0],c.classes[0]="mop"):c=y.makeSpan(["mop"],w,e)}else{for(var z=[],T=1;T{var t;if(r.symbol)t=new o0("mo",[v0(r.name,r.mode)]),N.contains(sa,r.name)&&t.setAttribute("largeop","false");else if(r.body)t=new o0("mo",h0(r.body,e));else{t=new o0("mi",[new Y0(r.name.slice(1))]);var a=new o0("mo",[v0("\u2061","text")]);r.parentIsSupSub?t=new o0("mrow",[t,a]):t=Rr([t,a])}return t},J1={"\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=J1[n]),{type:"op",mode:t.mode,limits:!0,parentIsSupSub:!1,symbol:!0,name:n}},htmlBuilder:ne,mathmlBuilder:pe});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:Q(a)}},htmlBuilder:ne,mathmlBuilder:pe});var Q1={"\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:ne,mathmlBuilder:pe});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:ne,mathmlBuilder:pe});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=Q1[a]),{type:"op",mode:e.mode,limits:!1,parentIsSupSub:!1,symbol:!0,name:a}},htmlBuilder:ne,mathmlBuilder:pe});var la=(r,e)=>{var t,a,n=!1,s;r.type==="supsub"?(t=r.sup,a=r.sub,s=F(r.base,"operatorname"),n=!0):s=F(r,"operatorname");var o;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=t0(h,e.withFont("mathrm"),!0),p=0;p{for(var t=h0(r.body,e.withFont("mathrm")),a=!0,n=0;ng.toText()).join("");t=[new S.TextNode(h)]}var c=new S.MathNode("mi",t);c.setAttribute("mathvariant","normal");var p=new S.MathNode("mo",[v0("\u2061","text")]);return r.parentIsSupSub?new S.MathNode("mrow",[c,p]):S.newDocumentFragment([c,p])};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:Q(n),alwaysHandleSupSub:a==="\\operatornamewithlimits",limits:!1,parentIsSupSub:!1}},htmlBuilder:la,mathmlBuilder:_1});m("\\operatorname","\\@ifstar\\operatornamewithlimits\\operatorname@");j0({type:"ordgroup",htmlBuilder(r,e){return r.semisimple?y.makeFragment(t0(r.body,e,!1)):y.makeSpan(["mord"],t0(r.body,e,!0),e)},mathmlBuilder(r,e){return G0(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=P(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 S.MathNode("mo",[new S.TextNode("\u203E")]);t.setAttribute("stretchy","true");var a=new S.MathNode("mover",[Y(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:Q(a)}},htmlBuilder:(r,e)=>{var t=t0(r.body,e.withPhantom(),!1);return y.makeFragment(t)},mathmlBuilder:(r,e)=>{var t=h0(r.body,e);return new S.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([],[P(r.body,e.withPhantom())]);if(t.height=0,t.depth=0,t.children)for(var a=0;a{var t=h0(Q(r.body),e),a=new S.MathNode("mphantom",t),n=new S.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"],[P(r.body,e.withPhantom())]),a=y.makeSpan(["fix"],[]);return y.makeSpan(["mord","rlap"],[t,a],e)},mathmlBuilder:(r,e)=>{var t=h0(Q(r.body),e),a=new S.MathNode("mphantom",t),n=new S.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=F(e[0],"size").value,n=e[1];return{type:"raisebox",mode:t.mode,dy:a,body:n}},htmlBuilder(r,e){var t=P(r.body,e),a=J(r.dy,e);return y.makeVList({positionType:"shift",positionData:-a,children:[{type:"elem",elem:t}]},e)},mathmlBuilder(r,e){var t=new S.MathNode("mpadded",[Y(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,argTypes:["size","size","size"]},handler(r,e,t){var{parser:a}=r,n=t[0],s=F(e[0],"size"),o=F(e[1],"size");return{type:"rule",mode:a.mode,shift:n&&F(n,"size").value,width:s.value,height:o.value}},htmlBuilder(r,e){var t=y.makeSpan(["mord","rule"],[],e),a=J(r.width,e),n=J(r.height,e),s=r.shift?J(r.shift,e):0;return t.style.borderRightWidth=A(a),t.style.borderTopWidth=A(n),t.style.bottom=A(s),t.width=a,t.height=n+s,t.depth=-s,t.maxFontSize=n*1.125*e.sizeMultiplier,t},mathmlBuilder(r,e){var t=J(r.width,e),a=J(r.height,e),n=r.shift?J(r.shift,e):0,s=e.color&&e.getColor()||"black",o=new S.MathNode("mspace");o.setAttribute("mathbackground",s),o.setAttribute("width",A(t)),o.setAttribute("height",A(a));var h=new S.MathNode("mpadded",[o]);return n>=0?h.setAttribute("height",A(n)):(h.setAttribute("height",A(n)),h.setAttribute("depth",A(-n))),h.setAttribute("voffset",A(n)),h}});function oa(r,e,t){for(var a=t0(r,e,!1),n=e.sizeMultiplier/t.sizeMultiplier,s=0;s{var t=e.havingSize(r.size);return oa(r.body,t,e)};B({type:"sizing",names:hr,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:hr.indexOf(a)+1,body:s}},htmlBuilder:e4,mathmlBuilder:(r,e)=>{var t=e.havingSize(r.size),a=h0(r.body,t),n=new S.MathNode("mstyle",a);return n.setAttribute("mathsize",A(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,o=t[0]&&F(t[0],"ordgroup");if(o)for(var h="",c=0;c{var t=y.makeSpan([],[P(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 S.MathNode("mpadded",[Y(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=P(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+o&&(o=(o+b-t.height-t.depth)/2);var x=c.height-t.height-o-p;t.style.paddingLeft=A(g);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:p}]},e);if(r.index){var z=e.havingStyle(R.SCRIPTSCRIPT),T=P(r.index,z,e),C=.6*(w.height-w.depth),q=y.makeVList({positionType:"shift",positionData:-C,children:[{type:"elem",elem:T}]},e),O=y.makeSpan(["root"],[q]);return y.makeSpan(["mord","sqrt"],[O,w],e)}else return y.makeSpan(["mord","sqrt"],[w],e)},mathmlBuilder(r,e){var{body:t,index:a}=r;return a?new S.MathNode("mroot",[Y(t,e),Y(a,e)]):new S.MathNode("msqrt",[Y(t,e)])}});var mr={display:R.DISPLAY,text:R.TEXT,script:R.SCRIPT,scriptscript:R.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),o=a.slice(1,a.length-5);return{type:"styling",mode:n.mode,style:o,body:s}},htmlBuilder(r,e){var t=mr[r.style],a=e.havingStyle(t).withFont("");return oa(r.body,a,e)},mathmlBuilder(r,e){var t=mr[r.style],a=e.havingStyle(t),n=h0(r.body,a),s=new S.MathNode("mstyle",n),o={display:["0","true"],text:["0","false"],script:["1","false"],scriptscript:["2","false"]},h=o[r.style];return s.setAttribute("scriptlevel",h[0]),s.setAttribute("displaystyle",h[1]),s}});var t4=function(e,t){var a=e.base;if(a)if(a.type==="op"){var n=a.limits&&(t.style.size===R.DISPLAY.size||a.alwaysHandleSupSub);return n?ne:null}else if(a.type==="operatorname"){var s=a.alwaysHandleSupSub&&(t.style.size===R.DISPLAY.size||a.limits);return s?la:null}else{if(a.type==="accent")return N.isCharacterBox(a.base)?Bt:null;if(a.type==="horizBrace"){var o=!e.sub;return o===a.isOver?na:null}else return null}else return null};j0({type:"supsub",htmlBuilder(r,e){var t=t4(r,e);if(t)return t(r,e);var{base:a,sup:n,sub:s}=r,o=P(a,e),h,c,p=e.fontMetrics(),g=0,b=0,x=a&&N.isCharacterBox(a);if(n){var w=e.havingStyle(e.style.sup());h=P(n,w,e),x||(g=o.height-w.fontMetrics().supDrop*w.sizeMultiplier/e.sizeMultiplier)}if(s){var z=e.havingStyle(e.style.sub());c=P(s,z,e),x||(b=o.depth+z.fontMetrics().subDrop*z.sizeMultiplier/e.sizeMultiplier)}var T;e.style===R.DISPLAY?T=p.sup1:e.style.cramped?T=p.sup3:T=p.sup2;var C=e.sizeMultiplier,q=A(.5/p.ptPerEm/C),O=null;if(c){var H=r.base&&r.base.type==="op"&&r.base.name&&(r.base.name==="\\oiint"||r.base.name==="\\oiiint");(o instanceof u0||H)&&(O=A(-o.italic))}var V;if(h&&c){g=Math.max(g,T,h.depth+.25*p.xHeight),b=Math.max(b,p.sub2);var L=p.defaultRuleThickness,U=4*L;if(g-h.depth-(c.height-b)0&&(g+=G,b-=G)}var j=[{type:"elem",elem:c,shift:b,marginRight:q,marginLeft:O},{type:"elem",elem:h,shift:-g,marginRight:q}];V=y.makeVList({positionType:"individualShift",children:j},e)}else if(c){b=Math.max(b,p.sub1,c.height-.8*p.xHeight);var $=[{type:"elem",elem:c,marginLeft:O,marginRight:q}];V=y.makeVList({positionType:"shift",positionData:b,children:$},e)}else if(h)g=Math.max(g,T,h.depth+.25*p.xHeight),V=y.makeVList({positionType:"shift",positionData:-g,children:[{type:"elem",elem:h,marginRight:q}]},e);else throw new Error("supsub must have either sup or sub.");var T0=ft(o,"right")||"mord";return y.makeSpan([T0],[o,y.makeSpan(["msupsub"],[V])],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=[Y(r.base,e)];r.sub&&s.push(Y(r.sub,e)),r.sup&&s.push(Y(r.sup,e));var o;if(t)o=a?"mover":"munder";else if(r.sub)if(r.sup){var p=r.base;p&&p.type==="op"&&p.limits&&e.style===R.DISPLAY||p&&p.type==="operatorname"&&p.alwaysHandleSupSub&&(e.style===R.DISPLAY||p.limits)?o="munderover":o="msubsup"}else{var c=r.base;c&&c.type==="op"&&c.limits&&(e.style===R.DISPLAY||c.alwaysHandleSupSub)||c&&c.type==="operatorname"&&c.alwaysHandleSupSub&&(c.limits||e.style===R.DISPLAY)?o="munder":o="msub"}else{var h=r.base;h&&h.type==="op"&&h.limits&&(e.style===R.DISPLAY||h.alwaysHandleSupSub)||h&&h.type==="operatorname"&&h.alwaysHandleSupSub&&(h.limits||e.style===R.DISPLAY)?o="mover":o="msup"}return new S.MathNode(o,s)}});j0({type:"atom",htmlBuilder(r,e){return y.mathsym(r.text,r.mode,e,["m"+r.family])},mathmlBuilder(r,e){var t=new S.MathNode("mo",[v0(r.text,r.mode)]);if(r.family==="bin"){var a=At(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 ua={mi:"italic",mn:"normal",mtext:"normal"};j0({type:"mathord",htmlBuilder(r,e){return y.makeOrd(r,e,"mathord")},mathmlBuilder(r,e){var t=new S.MathNode("mi",[v0(r.text,r.mode,e)]),a=At(r,e)||"italic";return a!==ua[t.type]&&t.setAttribute("mathvariant",a),t}});j0({type:"textord",htmlBuilder(r,e){return y.makeOrd(r,e,"textord")},mathmlBuilder(r,e){var t=v0(r.text,r.mode,e),a=At(r,e)||"normal",n;return r.mode==="text"?n=new S.MathNode("mtext",[t]):/[0-9]/.test(r.text)?n=new S.MathNode("mn",[t]):r.text==="\\prime"?n=new S.MathNode("mo",[t]):n=new S.MathNode("mi",[t]),a!==ua[n.type]&&n.setAttribute("mathvariant",a),n}});var lt={"\\nobreak":"nobreak","\\allowbreak":"allowbreak"},ot={" ":{},"\\ ":{},"~":{className:"nobreak"},"\\space":{},"\\nobreakspace":{className:"nobreak"}};j0({type:"spacing",htmlBuilder(r,e){if(ot.hasOwnProperty(r.text)){var t=ot[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(lt.hasOwnProperty(r.text))return y.makeSpan(["mspace",lt[r.text]],[],e);throw new M('Unknown type of space "'+r.text+'"')}},mathmlBuilder(r,e){var t;if(ot.hasOwnProperty(r.text))t=new S.MathNode("mtext",[new S.TextNode("\xA0")]);else{if(lt.hasOwnProperty(r.text))return new S.MathNode("mspace");throw new M('Unknown type of space "'+r.text+'"')}return t}});var cr=()=>{var r=new S.MathNode("mtd",[]);return r.setAttribute("width","50%"),r};j0({type:"tag",mathmlBuilder(r,e){var t=new S.MathNode("mtable",[new S.MathNode("mtr",[cr(),new S.MathNode("mtd",[G0(r.body,e)]),cr(),new S.MathNode("mtd",[G0(r.tag,e)])])]);return t.setAttribute("width","100%"),t}});var dr={"\\text":void 0,"\\textrm":"textrm","\\textsf":"textsf","\\texttt":"texttt","\\textnormal":"textrm"},fr={"\\textbf":"textbf","\\textmd":"textmd"},r4={"\\textit":"textit","\\textup":"textup"},pr=(r,e)=>{var t=r.font;if(t){if(dr[t])return e.withTextFontFamily(dr[t]);if(fr[t])return e.withTextFontWeight(fr[t]);if(t==="\\emph")return e.fontShape==="textit"?e.withTextFontShape("textup"):e.withTextFontShape("textit")}else return e;return e.withTextFontShape(r4[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:Q(n),font:a}},htmlBuilder(r,e){var t=pr(r,e),a=t0(r.body,t,!0);return y.makeSpan(["mord","text"],a,t)},mathmlBuilder(r,e){var t=pr(r,e);return G0(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=P(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 S.MathNode("mo",[new S.TextNode("\u203E")]);t.setAttribute("stretchy","true");var a=new S.MathNode("munder",[Y(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=P(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 S.MathNode("mpadded",[Y(r.body,e)],["vcenter"])}});B({type:"verb",names:["\\verb"],props:{numArgs:0,allowedInText:!0},handler(r,e,t){throw new M("\\verb ended by end of line instead of matching delimiter")},htmlBuilder(r,e){for(var t=vr(r),a=[],n=e.havingStyle(e.style.text()),s=0;sr.body.replace(/ /g,r.star?"\u2423":"\xA0"),L0=Nr,ha=`[ \r ]`,a4="\\\\[a-zA-Z@]+",n4="\\\\[^\uD800-\uDFFF]",i4="("+a4+")"+ha+"*",s4=`\\\\( |[ \r ]+ ?)[ \r ]*`,yt="[\u0300-\u036F]",l4=new RegExp(yt+"+$"),o4="("+ha+"+)|"+(s4+"|")+"([!-\\[\\]-\u2027\u202A-\uD7FF\uF900-\uFFFF]"+(yt+"*")+"|[\uD800-\uDBFF][\uDC00-\uDFFF]"+(yt+"*")+"|\\\\verb\\*([^]).*?\\4|\\\\verb([^*a-zA-Z]).*?\\5"+("|"+i4)+("|"+n4+")"),Le=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(o4,"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 p0("EOF",new m0(this,t,t));var a=this.tokenRegex.exec(e);if(a===null||a.index!==t)throw new M("Unexpected character: '"+e[t]+"'",new p0(e[t],new m0(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 p0(n,new m0(this,t,this.tokenRegex.lastIndex))}},xt=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 M("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}},u4=_r;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 gr={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 M("\\char` missing argument");a=e.text.charCodeAt(0)}else t=10;if(t){if(a=gr[e.text],a==null||a>=t)throw new M("Invalid base-"+t+" digit "+e.text);for(var n;(n=gr[r.future().text])!=null&&n{var a=r.consumeArg().tokens;if(a.length!==1)throw new M("\\newcommand's first argument must be a macro name");var n=a[0].text,s=r.isDefined(n);if(s&&!e)throw new M("\\newcommand{"+n+"} attempting to redefine "+(n+"; use \\renewcommand"));if(!s&&!t)throw new M("\\renewcommand{"+n+"} when command "+n+" does not yet exist; use \\newcommand");var o=0;if(a=r.consumeArg().tokens,a.length===1&&a[0].text==="["){for(var h="",c=r.expandNextToken();c.text!=="]"&&c.text!=="EOF";)h+=c.text,c=r.expandNextToken();if(!h.match(/^\s*[0-9]+\s*$/))throw new M("Invalid number of arguments: "+h);o=parseInt(h),a=r.consumeArg().tokens}return r.macros.set(n,{tokens:a,numArgs:o}),""};m("\\newcommand",r=>Ot(r,!1,!0));m("\\renewcommand",r=>Ot(r,!0,!1));m("\\providecommand",r=>Ot(r,!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),L0[t],X.math[t],X.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","\\mathord{\\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\\;");var br={",":"\\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 br?e=br[t]:(t.slice(0,4)==="\\not"||t in X.math&&N.contains(["bin","rel"],X.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 M("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 ma=A(k0["Main-Regular"][84][1]-.7*k0["Main-Regular"][65][1]);m("\\LaTeX","\\textrm{\\html@mathml{"+("L\\kern-.36em\\raisebox{"+ma+"}{\\scriptstyle A}")+"\\kern-.15em\\TeX}{LaTeX}}");m("\\KaTeX","\\textrm{\\html@mathml{"+("K\\kern-.17em\\raisebox{"+ma+"}{\\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 ca=r=>e=>{var t=e.consumeArg().tokens,a=e.consumeArg().tokens,n=e.consumeArg().tokens,s=e.consumeArg().tokens,o=e.macros.get("|"),h=e.macros.get("\\|");e.macros.beginGroup();var c=b=>w=>{r&&(w.macros.set("|",o),n.length&&w.macros.set("\\|",h));var x=b;if(!b&&n.length){var z=w.future();z.text==="|"&&(w.popToken(),x=!0)}return{tokens:x?n:a,numArgs:0}};e.macros.set("|",c(!1)),n.length&&e.macros.set("\\|",c(!0));var p=e.consumeArg().tokens,g=e.expandTokens([...s,...p,...t]);return e.macros.endGroup(),{tokens:g.reverse(),numArgs:0}};m("\\bra@ket",ca(!1));m("\\bra@set",ca(!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 da={"^":!0,_:!0,"\\limits":!0,"\\nolimits":!0},wt=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 xt(u4,t.macros),this.mode=a,this.stack=[]}feed(e){this.lexer=new Le(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 p0("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,o=0,h=0;do{if(s=this.popToken(),t.push(s),s.text==="{")++o;else if(s.text==="}"){if(--o,o===-1)throw new M("Extra }",s)}else if(s.text==="EOF")throw new M("Unexpected end of input in a macro argument, expected '"+(e&&a?e[h]:"}")+"'",s);if(e&&a)if((o===0||o===1&&e[h]==="{")&&s.text===e[h]){if(++h,h===e.length){t.splice(-h,h);break}}else h=0}while(o!==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 M("The length of delimiters doesn't match the number of args!");for(var a=t[0],n=0;nthis.settings.maxExpand)throw new M("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 M("Undefined control sequence: "+a);return this.pushToken(t),!1}this.countExpansion(1);var s=n.tokens,o=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 M("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,...o[+c.text-1]);else throw new M("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 p0(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 o=n.replace(/##/g,"");o.indexOf("#"+(s+1))!==-1;)++s;for(var h=new Le(n,this.settings),c=[],p=h.lex();p.text!=="EOF";)c.push(p),p=h.lex();c.reverse();var g={tokens:c,numArgs:s};return g}return n}isDefined(e){return this.macros.has(e)||L0.hasOwnProperty(e)||X.math.hasOwnProperty(e)||X.text.hasOwnProperty(e)||da.hasOwnProperty(e)}isExpandable(e){var t=this.macros.get(e);return t!=null?typeof t=="string"||typeof t=="function"||!t.unexpandable:L0.hasOwnProperty(e)&&!L0[e].primitive}},yr=/^[₊₋₌₍₎₀₁₂₃₄₅₆₇₈₉ₐₑₕᵢⱼₖₗₘₙₒₚᵣₛₜᵤᵥₓᵦᵧᵨᵩᵪ]/,Ce=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"}),ut={"\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"}},xr={\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"},Pe=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 wt(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 M("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 p0("}")),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&&L0[n.text]&&L0[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=X[this.mode][t].group,c=m0.range(e),p;if(e1.hasOwnProperty(h)){var g=h;p={type:"atom",mode:this.mode,family:g,loc:c,text:t}}else p={type:h,mode:this.mode,loc:c,text:t};o=p}else if(t.charCodeAt(0)>=128)this.settings.strict&&(kr(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)),o={type:"textord",mode:"text",loc:m0.range(e),text:t};else return null;if(this.consume(),s)for(var b=0;b0;)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}},u4=_r;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 gr={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 M("\\char` missing argument");a=e.text.charCodeAt(0)}else t=10;if(t){if(a=gr[e.text],a==null||a>=t)throw new M("Invalid base-"+t+" digit "+e.text);for(var n;(n=gr[r.future().text])!=null&&n{var a=r.consumeArg().tokens;if(a.length!==1)throw new M("\\newcommand's first argument must be a macro name");var n=a[0].text,s=r.isDefined(n);if(s&&!e)throw new M("\\newcommand{"+n+"} attempting to redefine "+(n+"; use \\renewcommand"));if(!s&&!t)throw new M("\\renewcommand{"+n+"} when command "+n+" does not yet exist; use \\newcommand");var o=0;if(a=r.consumeArg().tokens,a.length===1&&a[0].text==="["){for(var h="",c=r.expandNextToken();c.text!=="]"&&c.text!=="EOF";)h+=c.text,c=r.expandNextToken();if(!h.match(/^\s*[0-9]+\s*$/))throw new M("Invalid number of arguments: "+h);o=parseInt(h),a=r.consumeArg().tokens}return r.macros.set(n,{tokens:a,numArgs:o}),""};m("\\newcommand",r=>Ot(r,!1,!0));m("\\renewcommand",r=>Ot(r,!0,!1));m("\\providecommand",r=>Ot(r,!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),L0[t],X.math[t],X.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","\\mathord{\\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\\;");var br={",":"\\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 br?e=br[t]:(t.slice(0,4)==="\\not"||t in X.math&&N.contains(["bin","rel"],X.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 M("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 ma=A(k0["Main-Regular"][84][1]-.7*k0["Main-Regular"][65][1]);m("\\LaTeX","\\textrm{\\html@mathml{"+("L\\kern-.36em\\raisebox{"+ma+"}{\\scriptstyle A}")+"\\kern-.15em\\TeX}{LaTeX}}");m("\\KaTeX","\\textrm{\\html@mathml{"+("K\\kern-.17em\\raisebox{"+ma+"}{\\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 ca=r=>e=>{var t=e.consumeArg().tokens,a=e.consumeArg().tokens,n=e.consumeArg().tokens,s=e.consumeArg().tokens,o=e.macros.get("|"),h=e.macros.get("\\|");e.macros.beginGroup();var c=b=>x=>{r&&(x.macros.set("|",o),n.length&&x.macros.set("\\|",h));var w=b;if(!b&&n.length){var z=x.future();z.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 p=e.consumeArg().tokens,g=e.expandTokens([...s,...p,...t]);return e.macros.endGroup(),{tokens:g.reverse(),numArgs:0}};m("\\bra@ket",ca(!1));m("\\bra@set",ca(!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 da={"^":!0,_:!0,"\\limits":!0,"\\nolimits":!0},wt=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 xt(u4,t.macros),this.mode=a,this.stack=[]}feed(e){this.lexer=new Le(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 p0("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,o=0,h=0;do{if(s=this.popToken(),t.push(s),s.text==="{")++o;else if(s.text==="}"){if(--o,o===-1)throw new M("Extra }",s)}else if(s.text==="EOF")throw new M("Unexpected end of input in a macro argument, expected '"+(e&&a?e[h]:"}")+"'",s);if(e&&a)if((o===0||o===1&&e[h]==="{")&&s.text===e[h]){if(++h,h===e.length){t.splice(-h,h);break}}else h=0}while(o!==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 M("The length of delimiters doesn't match the number of args!");for(var a=t[0],n=0;nthis.settings.maxExpand)throw new M("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 M("Undefined control sequence: "+a);return this.pushToken(t),!1}this.countExpansion(1);var s=n.tokens,o=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 M("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,...o[+c.text-1]);else throw new M("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 p0(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 o=n.replace(/##/g,"");o.indexOf("#"+(s+1))!==-1;)++s;for(var h=new Le(n,this.settings),c=[],p=h.lex();p.text!=="EOF";)c.push(p),p=h.lex();c.reverse();var g={tokens:c,numArgs:s};return g}return n}isDefined(e){return this.macros.has(e)||L0.hasOwnProperty(e)||X.math.hasOwnProperty(e)||X.text.hasOwnProperty(e)||da.hasOwnProperty(e)}isExpandable(e){var t=this.macros.get(e);return t!=null?typeof t=="string"||typeof t=="function"||!t.unexpandable:L0.hasOwnProperty(e)&&!L0[e].primitive}},yr=/^[₊₋₌₍₎₀₁₂₃₄₅₆₇₈₉ₐₑₕᵢⱼₖₗₘₙₒₚᵣₛₜᵤᵥₓᵦᵧᵨᵩᵪ]/,Ce=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"}),ut={"\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"}},xr={\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"},Pe=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 wt(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 M("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 p0("}")),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&&L0[n.text]&&L0[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=X[this.mode][t].group,c=m0.range(e),p;if(e1.hasOwnProperty(h)){var g=h;p={type:"atom",mode:this.mode,family:g,loc:c,text:t}}else p={type:h,mode:this.mode,loc:c,text:t};o=p}else if(t.charCodeAt(0)>=128)this.settings.strict&&(kr(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)),o={type:"textord",mode:"text",loc:m0.range(e),text:t};else return null;if(this.consume(),s)for(var b=0;bCh5{lIsK%Z9;|`Gn>+YCIZ3GI3OU*OHYPoROA8q!Sh*_0w66 z+(2X!Swt>TKqM0;B8kXj{ZWZRl4>?2nXP=Y)hf;gvJ>b_p#%vLOp#Ky ziU?yS$R|YPB_&)`&5^&xq0;|0uy$NgEfNrvU{9(Md>EAhfdT)B06Sa%5qv@jKZnyqi7*=G z@{2L3!N3*HKHy2c|2rd%g)SrFuCWE1M6P2zR>2P-z7wm;3K$ba|koUA;n$*jyIp`>D_?8abKcS_ZrhTEbKT@^dN zjeBsYV&IEA?uMheLzmQJmNEO%8;NIo8Yd{bbFg50mUAxd;I7Nw*|+w;2|EjaY+YFu ze6aY*t9`nvs*SwJgwe=`6Kj4?f0augQ1Ge`EsX9YEALj5@3k>0wq--n>+TCVBTi>a zwr7_jWSL**?O6Rjw0x^i<8+D7Mn9kN;6F7!%~##pQnvPmp2?SEc4ahqUMf64rWB5& z=T0|!Tu(e{ZS@=O{eyZo-)MGc_Sk=SlZx!*LeqX{x zkt@%{hWdFiDwnVA)a)ML`^9Q|!--U{>cAMCa-TvucI>bE$h)5R6kQ%eEd}1l;cnWY z6Y4HT(7g87BIl!L?swc=d1+qjib!1P?jCrnG_X>0=9NHUdT~?yzK;6Rduw%5K_Blf z*gLKcyLR(HY`?!IBBW$Y`A+ zw&>zV{t~I{;o!8z*?vT4uZcUA@o27NaJwNsayqSJytBnI()hLcc3VQkUa{vwGHbFO Y7EHE==2d>S)PH#4-16~=Zsj}hH+zR`F#rGn delta 1100 zcmZ8edrVt(6h6P-y_C{hD}`+0HlZjGsJs@atHn85WD{h{!)Q7krY#Ukcq}ax7lcY8 z#bhi2?;hA~We7urImsSj8_b~tLBMUwL|$Qr5Oo8_AmJfn;OY3oWdD5m&iCDO&Ufzb zipP0rWqZUp=MFD|8r0+5st`ctB<_UcCOAUIxfr=uMnSG2-L=swdz_L295Nkvs^!nIlKBR~_l}ml4>15&Q^DGm;>s9l4ZULG&dM7N)1r zT0ianlG_lgNu;;qyY*q`F zIw9y>K__tPnpOUHCfNNk%E~nasV{2lz)M+QD-h(VPdPZs)ft&3=ytk2xy6s!h&-Sd z!kh$GU3N$fE|`LaFAOY5X2aHL2qi86iOe8_VQnk{*$_jBOh-V62VuQ& zkP8xJEncD#ARBPTcSYhr(x+^8o{jnNulFnee?K99a9OhPfI%3P^mVg*iNKHEa^vd- z+XLOuPjCXqiVz3X9HLr@!yK#_sUzVT!~~9iEHGLxFqXca15s%GCKYbspb#A8L2V zUr|)2mPXZ2z42~Op!8_<%JZ_8-iE)lZT7v2Pp&5l%A4vYc57uS`oRhKbCYM)-06@N z@1=*|d>oXteCm52k0h;^Ru}tPeDO)Mpt(KRniSH1<*G)Z7@Rz^S~_3*dYa9|oSXC? z-Tw#4;65aqGjDg?jjf9g=(HSJ&k9LHWAH)k?!m+7 z6+3_W=kpfTXl26K(c0m_eJR({+V@^#%1x$lbyq`DW@1!u*Jw~%qWsuSqb0_pZ_hc~ zLltNGE%e6F{gA?vvNMLo!&*!1Tu$tp$A2C9^6v2QuU^u3HrBjjnz$9J9y^f2-MsU+ Otw>zJZM}2j0Q?8^-dmag diff --git a/internal/warpc/wasm/renderkatex.wasm b/internal/warpc/wasm/renderkatex.wasm index 0afa10852b78e6bc86220a6978eb337af719e04e..1db68b8150a781893f94cebfbdca4bddebcc6058 100644 GIT binary patch delta 104226 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�G#)G;}hGXnvJ-??Go2y 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 z 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

B>q-KWsds0Xl8lkT39mvHwXSN2l9bcFVF5lm$m z=i*rF24T4Hoqx$j4ad{RT&nPvL4fXZ!w}v@A@#E>Mdv4y1PD^%DfLHPyJ&0?aUPtE zdv&;#aS5YmT4$67){)Luy!a4eqXL2a4G2-hEO1jMSbO)uUP=f5?fAn$fLqxRfudDB zH^$aRaQio13Bpwt8uoE+^?lW%32R*n_OU#+rFFd$zJDVyeb;UJ=mD^@VNu~F*W`w(A2-*q+)P;LEool2__3>#FX3q#HYWYT;W= z6&I&>DEeNz@{gqw$dDU4nSVu$ekJf+-lLq4RF=yRV>5~0H2)XdxD5jqC<4pPw;xFe zIPV=3h!kLb*uR`lY;U&CDKj@=6$izREQeyCeSc${^A8EQHDX8cl|@2i&Oc5c`?nRM z=lHfo9W_uQ|I8rg7chr2y3D>NyH9UfR9%EMAHm?9SQc35hK;cP0wRV0Bylh^{v5&x z6q}z%>`zC?Zdlk8J%)eG4%G1nCg70&glH_TQtNv~;b~c;J=g-LKFEH_LxqakXfeNI z5r6sIj1>t`rOhcLJ!<}Y45VW{6>8x&kD?g2&cL08`yt5V0gO3Lq>fh9Lvi118N2+S zql)F3c<8LZ-Sf|x-BmQiWynbjUxQd!rw*P-SBvTfAl)yXQ?rVA80w z<1+-0-dL%8Yy( zA-tr4j-URH%AG6Z;?LU3JfIhUjl^m9k}f�@Y3*FkJ~e#{YTCF2hKE$~Q{Z+ah!q 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 diff --git a/tpl/transform/transform.go b/tpl/transform/transform.go index 843351702..c9af141ed 100644 --- a/tpl/transform/transform.go +++ b/tpl/transform/transform.go @@ -235,7 +235,7 @@ func (ns *Namespace) ToMath(ctx context.Context, args ...any) (types.Result[temp _, r, err := fileCache.GetOrCreate(key, func() (io.ReadCloser, error) { message := warpc.Message[warpc.KatexInput]{ Header: warpc.Header{ - Version: "v1", + Version: 1, ID: ns.id.Add(1), }, Data: katexInput, @@ -249,9 +249,6 @@ func (ns *Namespace) ToMath(ctx context.Context, args ...any) (types.Result[temp if err != nil { return nil, err } - if result.Header.Err != "" { - return nil, errors.New(result.Header.Err) - } return hugio.NewReadSeekerNoOpCloserFromString(result.Data.Output), nil }) if err != nil { From 2bc27657d8b75eabdeaf4df8b354efed8e079169 Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Fri, 13 Sep 2024 15:54:23 -0700 Subject: [PATCH 006/526] dartsass: Resolve directory paths to directory index files Closes #12849 --- .../dartsass/dartsass_integration_test.go | 40 +++++++++++++++++++ .../tocss/dartsass/transform.go | 6 ++- 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/resources/resource_transformers/tocss/dartsass/dartsass_integration_test.go b/resources/resource_transformers/tocss/dartsass/dartsass_integration_test.go index 4d48b3b6a..7b2b03dc0 100644 --- a/resources/resource_transformers/tocss/dartsass/dartsass_integration_test.go +++ b/resources/resource_transformers/tocss/dartsass/dartsass_integration_test.go @@ -562,3 +562,43 @@ Styles: {{ $r.RelPermalink }} b.AssertFileContent("public/index.html", "Styles: /scss/main.css") } + +// Issue 12849 +func TestDirectoryIndexes(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +disableKinds = ['page','section','rss','sitemap','taxonomy','term'] + +[[module.mounts]] +source = 'assets' +target = 'assets' + +[[module.imports]] +path = "github.com/gohugoio/hugoTestModule2" + +[[module.imports.mounts]] +source = "miscellaneous/sass" +target = "assets/sass" +-- go.mod -- +module hugo-github-issue-12849 +-- layouts/index.html -- +{{ $opts := dict "transpiler" "dartsass" "outputStyle" "compressed" }} +{{ (resources.Get "sass/main.scss" | toCSS $opts).Content }} +-- assets/sass/main.scss -- +@use "foo"; // directory with index file from OS file system +@use "bar"; // directory with index file from module mount +-- assets/sass/foo/_index.scss -- +.foo {color: red;} +` + + b := hugolib.NewIntegrationTestBuilder( + hugolib.IntegrationTestConfig{ + T: t, + NeedsOsFS: true, + TxtarString: files, + }).Build() + + b.AssertFileContent("public/index.html", ".foo{color:red}.bar{color:green}") +} diff --git a/resources/resource_transformers/tocss/dartsass/transform.go b/resources/resource_transformers/tocss/dartsass/transform.go index 99a5c3f68..ddf28723b 100644 --- a/resources/resource_transformers/tocss/dartsass/transform.go +++ b/resources/resource_transformers/tocss/dartsass/transform.go @@ -165,7 +165,11 @@ func (t importResolver) CanonicalizeURL(url string) (string, error) { } else if strings.HasPrefix(name, "_") { namePatterns = []string{"_%s.scss", "_%s.sass", "_%s.css"} } else { - namePatterns = []string{"_%s.scss", "%s.scss", "_%s.sass", "%s.sass", "_%s.css", "%s.css"} + namePatterns = []string{ + "_%s.scss", "%s.scss", "%s/_index.scss", + "_%s.sass", "%s.sass", "%s/_index.sass", + "_%s.css", "%s.css", + } } name = strings.TrimPrefix(name, "_") From 5b442b3ccef28a5fcf2e14289f5005c303880393 Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Sun, 15 Sep 2024 15:10:37 -0700 Subject: [PATCH 007/526] libsass: Resolve directory paths to directory index files Closes #12851 --- .../dartsass/dartsass_integration_test.go | 3 ++ .../tocss/dartsass/transform.go | 5 +- .../tocss/scss/scss_integration_test.go | 47 ++++++++++++++++++- .../resource_transformers/tocss/scss/tocss.go | 6 ++- 4 files changed, 56 insertions(+), 5 deletions(-) diff --git a/resources/resource_transformers/tocss/dartsass/dartsass_integration_test.go b/resources/resource_transformers/tocss/dartsass/dartsass_integration_test.go index 7b2b03dc0..2aac2c5fb 100644 --- a/resources/resource_transformers/tocss/dartsass/dartsass_integration_test.go +++ b/resources/resource_transformers/tocss/dartsass/dartsass_integration_test.go @@ -566,6 +566,9 @@ Styles: {{ $r.RelPermalink }} // Issue 12849 func TestDirectoryIndexes(t *testing.T) { t.Parallel() + if !dartsass.Supports() { + t.Skip() + } files := ` -- hugo.toml -- diff --git a/resources/resource_transformers/tocss/dartsass/transform.go b/resources/resource_transformers/tocss/dartsass/transform.go index ddf28723b..f0bd6634a 100644 --- a/resources/resource_transformers/tocss/dartsass/transform.go +++ b/resources/resource_transformers/tocss/dartsass/transform.go @@ -166,9 +166,10 @@ func (t importResolver) CanonicalizeURL(url string) (string, error) { namePatterns = []string{"_%s.scss", "_%s.sass", "_%s.css"} } else { namePatterns = []string{ - "_%s.scss", "%s.scss", "%s/_index.scss", - "_%s.sass", "%s.sass", "%s/_index.sass", + "_%s.scss", "%s.scss", + "_%s.sass", "%s.sass", "_%s.css", "%s.css", + "%s/_index.scss", "%s/_index.sass", } } diff --git a/resources/resource_transformers/tocss/scss/scss_integration_test.go b/resources/resource_transformers/tocss/scss/scss_integration_test.go index 469463872..bd140cc88 100644 --- a/resources/resource_transformers/tocss/scss/scss_integration_test.go +++ b/resources/resource_transformers/tocss/scss/scss_integration_test.go @@ -111,7 +111,7 @@ moo { @import "another.css"; /* foo */ - + `) } @@ -262,7 +262,7 @@ body { body { background: url($image) no-repeat center/cover; font-family: $font; - } + } } p { @@ -417,3 +417,46 @@ h3 { b.AssertFileContent("public/index.html", `b.46b2d77c7ffe37ee191678f72df991ecb1319f849957151654362f09b0ef467f.css`) } + +// Issue 12851 +func TestDirectoryIndexes(t *testing.T) { + t.Parallel() + if !scss.Supports() { + t.Skip() + } + + files := ` +-- hugo.toml -- +disableKinds = ['page','section','rss','sitemap','taxonomy','term'] + +[[module.mounts]] +source = 'assets' +target = 'assets' + +[[module.imports]] +path = "github.com/gohugoio/hugoTestModule2" + +[[module.imports.mounts]] +source = "miscellaneous/sass" +target = "assets/sass" +-- go.mod -- +module hugo-github-issue-12849 +-- layouts/index.html -- +{{ $opts := dict "transpiler" "libsass" "outputStyle" "compressed" }} +{{ (resources.Get "sass/main.scss" | toCSS $opts).Content }} +-- assets/sass/main.scss -- +@import "foo"; // directory with index file from OS file system +@import "bar"; // directory with index file from module mount +-- assets/sass/foo/_index.scss -- +.foo {color: red;} +` + + b := hugolib.NewIntegrationTestBuilder( + hugolib.IntegrationTestConfig{ + T: t, + NeedsOsFS: true, + TxtarString: files, + }).Build() + + b.AssertFileContent("public/index.html", ".foo{color:red}.bar{color:green}") +} diff --git a/resources/resource_transformers/tocss/scss/tocss.go b/resources/resource_transformers/tocss/scss/tocss.go index 3a46e6016..36ef2a77d 100644 --- a/resources/resource_transformers/tocss/scss/tocss.go +++ b/resources/resource_transformers/tocss/scss/tocss.go @@ -105,7 +105,11 @@ func (t *toCSSTransformation) Transform(ctx *resources.ResourceTransformationCtx } else if strings.HasPrefix(name, "_") { namePatterns = []string{"_%s.scss", "_%s.sass"} } else { - namePatterns = []string{"_%s.scss", "%s.scss", "_%s.sass", "%s.sass"} + namePatterns = []string{ + "_%s.scss", "%s.scss", + "_%s.sass", "%s.sass", + "%s/_index.scss", "%s/_index.sass", + } } name = strings.TrimPrefix(name, "_") From e079145373ed71707b9ed6e462f3dfd91ca85687 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Tue, 17 Sep 2024 10:14:51 +0200 Subject: [PATCH 008/526] hugolib: Move hugolib/site_new.go into hugolib/site.go --- hugolib/site.go | 569 +++++++++++++++++++++++++++++++++++++++++ hugolib/site_new.go | 603 -------------------------------------------- 2 files changed, 569 insertions(+), 603 deletions(-) delete mode 100644 hugolib/site_new.go diff --git a/hugolib/site.go b/hugolib/site.go index d0546e910..d0a3bd370 100644 --- a/hugolib/site.go +++ b/hugolib/site.go @@ -15,7 +15,9 @@ package hugolib import ( "context" + "errors" "fmt" + "html/template" "io" "mime" "net/url" @@ -28,10 +30,24 @@ import ( "time" "github.com/bep/logg" + "github.com/gohugoio/hugo/cache/dynacache" "github.com/gohugoio/hugo/common/htime" "github.com/gohugoio/hugo/common/hugio" + "github.com/gohugoio/hugo/common/hugo" + "github.com/gohugoio/hugo/common/loggers" + "github.com/gohugoio/hugo/common/maps" + "github.com/gohugoio/hugo/common/para" "github.com/gohugoio/hugo/common/types" + "github.com/gohugoio/hugo/config" + "github.com/gohugoio/hugo/config/allconfig" + "github.com/gohugoio/hugo/deps" "github.com/gohugoio/hugo/hugolib/doctree" + "github.com/gohugoio/hugo/hugolib/pagesfromdata" + "github.com/gohugoio/hugo/internal/warpc" + "github.com/gohugoio/hugo/langs/i18n" + "github.com/gohugoio/hugo/modules" + "github.com/gohugoio/hugo/resources" + "github.com/gohugoio/hugo/tpl/tplimpl" "golang.org/x/text/unicode/norm" "github.com/gohugoio/hugo/common/paths" @@ -50,6 +66,9 @@ import ( "github.com/gohugoio/hugo/resources/kinds" "github.com/gohugoio/hugo/resources/page" + "github.com/gohugoio/hugo/resources/page/pagemeta" + "github.com/gohugoio/hugo/resources/page/siteidentities" + "github.com/gohugoio/hugo/resources/resource" "github.com/gohugoio/hugo/lazy" @@ -61,6 +80,556 @@ import ( "github.com/gohugoio/hugo/tpl" ) +var _ page.Site = (*Site)(nil) + +type siteState int + +const ( + siteStateInit siteState = iota + siteStateReady +) + +type Site struct { + state siteState + conf *allconfig.Config + language *langs.Language + languagei int + pageMap *pageMap + + // The owning container. + h *HugoSites + + *deps.Deps + + // Page navigation. + *pageFinder + taxonomies page.TaxonomyList + menus navigation.Menus + + // Shortcut to the home page. Note that this may be nil if + // home page, for some odd reason, is disabled. + home *pageState + + // The last modification date of this site. + lastmod time.Time + + relatedDocsHandler *page.RelatedDocsHandler + siteRefLinker + publisher publisher.Publisher + frontmatterHandler pagemeta.FrontMatterHandler + + // The output formats that we need to render this site in. This slice + // will be fixed once set. + // This will be the union of Site.Pages' outputFormats. + // This slice will be sorted. + renderFormats output.Formats + + // Lazily loaded site dependencies + init *siteInit +} + +func (s *Site) Debug() { + fmt.Println("Debugging site", s.Lang(), "=>") + // fmt.Println(s.pageMap.testDump()) +} + +// NewHugoSites creates HugoSites from the given config. +func NewHugoSites(cfg deps.DepsCfg) (*HugoSites, error) { + conf := cfg.Configs.GetFirstLanguageConfig() + + var logger loggers.Logger + if cfg.TestLogger != nil { + logger = cfg.TestLogger + } else { + var logHookLast func(e *logg.Entry) error + if cfg.Configs.Base.PanicOnWarning { + logHookLast = loggers.PanicOnWarningHook + } + if cfg.LogOut == nil { + cfg.LogOut = os.Stdout + } + if cfg.LogLevel == 0 { + cfg.LogLevel = logg.LevelWarn + } + + logOpts := loggers.Options{ + Level: cfg.LogLevel, + DistinctLevel: logg.LevelWarn, // This will drop duplicate log warning and errors. + HandlerPost: logHookLast, + Stdout: cfg.LogOut, + Stderr: cfg.LogOut, + StoreErrors: conf.Watching(), + SuppressStatements: conf.IgnoredLogs(), + } + logger = loggers.New(logOpts) + + } + + memCache := dynacache.New(dynacache.Options{Watching: conf.Watching(), Log: logger}) + + var h *HugoSites + onSignalRebuild := func(ids ...identity.Identity) { + // This channel is buffered, but make sure we do this in a non-blocking way. + if cfg.ChangesFromBuild != nil { + go func() { + cfg.ChangesFromBuild <- ids + }() + } + } + + firstSiteDeps := &deps.Deps{ + Fs: cfg.Fs, + Log: logger, + Conf: conf, + BuildState: &deps.BuildState{ + OnSignalRebuild: onSignalRebuild, + }, + MemCache: memCache, + TemplateProvider: tplimpl.DefaultTemplateProvider, + TranslationProvider: i18n.NewTranslationProvider(), + WasmDispatchers: warpc.AllDispatchers( + warpc.Options{ + CompilationCacheDir: filepath.Join(conf.Dirs().CacheDir, "_warpc"), + + // Katex is relatively slow. + PoolSize: 8, + Infof: logger.InfoCommand("wasm").Logf, + }, + ), + } + + if err := firstSiteDeps.Init(); err != nil { + return nil, err + } + + confm := cfg.Configs + if err := confm.Validate(logger); err != nil { + return nil, err + } + var sites []*Site + + ns := &contentNodeShifter{ + numLanguages: len(confm.Languages), + } + + treeConfig := doctree.Config[contentNodeI]{ + Shifter: ns, + } + + pageTrees := &pageTrees{ + treePages: doctree.New( + treeConfig, + ), + treeResources: doctree.New( + treeConfig, + ), + treeTaxonomyEntries: doctree.NewTreeShiftTree[*weightedContentNode](doctree.DimensionLanguage.Index(), len(confm.Languages)), + treePagesFromTemplateAdapters: doctree.NewTreeShiftTree[*pagesfromdata.PagesFromTemplate](doctree.DimensionLanguage.Index(), len(confm.Languages)), + } + + pageTrees.createMutableTrees() + + for i, confp := range confm.ConfigLangs() { + language := confp.Language() + if language.Disabled { + continue + } + k := language.Lang + conf := confm.LanguageConfigMap[k] + frontmatterHandler, err := pagemeta.NewFrontmatterHandler(firstSiteDeps.Log, conf.Frontmatter) + if err != nil { + return nil, err + } + + langs.SetParams(language, conf.Params) + + s := &Site{ + conf: conf, + language: language, + languagei: i, + frontmatterHandler: frontmatterHandler, + } + + if i == 0 { + firstSiteDeps.Site = s + s.Deps = firstSiteDeps + } else { + d, err := firstSiteDeps.Clone(s, confp) + if err != nil { + return nil, err + } + s.Deps = d + } + + s.pageMap = newPageMap(i, s, memCache, pageTrees) + + s.pageFinder = newPageFinder(s.pageMap) + s.siteRefLinker, err = newSiteRefLinker(s) + if err != nil { + return nil, err + } + // Set up the main publishing chain. + pub, err := publisher.NewDestinationPublisher( + firstSiteDeps.ResourceSpec, + s.conf.OutputFormats.Config, + s.conf.MediaTypes.Config, + ) + if err != nil { + return nil, err + } + + s.publisher = pub + s.relatedDocsHandler = page.NewRelatedDocsHandler(s.conf.Related) + // Site deps end. + + s.prepareInits() + sites = append(sites, s) + } + + if len(sites) == 0 { + return nil, errors.New("no sites to build") + } + + // Pull the default content language to the top, then sort the sites by language weight (if set) or lang. + defaultContentLanguage := confm.Base.DefaultContentLanguage + sort.Slice(sites, func(i, j int) bool { + li := sites[i].language + lj := sites[j].language + if li.Lang == defaultContentLanguage { + return true + } + + if lj.Lang == defaultContentLanguage { + return false + } + + if li.Weight != lj.Weight { + return li.Weight < lj.Weight + } + return li.Lang < lj.Lang + }) + + var err error + h, err = newHugoSites(cfg, firstSiteDeps, pageTrees, sites) + if err == nil && h == nil { + panic("hugo: newHugoSitesNew returned nil error and nil HugoSites") + } + + return h, err +} + +func newHugoSites(cfg deps.DepsCfg, d *deps.Deps, pageTrees *pageTrees, sites []*Site) (*HugoSites, error) { + numWorkers := config.GetNumWorkerMultiplier() + numWorkersSite := numWorkers + if numWorkersSite > len(sites) { + numWorkersSite = len(sites) + } + workersSite := para.New(numWorkersSite) + + h := &HugoSites{ + Sites: sites, + Deps: sites[0].Deps, + Configs: cfg.Configs, + workersSite: workersSite, + numWorkersSites: numWorkers, + numWorkers: numWorkers, + pageTrees: pageTrees, + cachePages: dynacache.GetOrCreatePartition[string, + page.Pages](d.MemCache, "/pags/all", + dynacache.OptionsPartition{Weight: 10, ClearWhen: dynacache.ClearOnRebuild}, + ), + cacheContentSource: dynacache.GetOrCreatePartition[string, *resources.StaleValue[[]byte]](d.MemCache, "/cont/src", dynacache.OptionsPartition{Weight: 70, ClearWhen: dynacache.ClearOnChange}), + translationKeyPages: maps.NewSliceCache[page.Page](), + currentSite: sites[0], + skipRebuildForFilenames: make(map[string]bool), + init: &hugoSitesInit{ + data: lazy.New(), + layouts: lazy.New(), + gitInfo: lazy.New(), + }, + } + + // Assemble dependencies to be used in hugo.Deps. + var dependencies []*hugo.Dependency + var depFromMod func(m modules.Module) *hugo.Dependency + depFromMod = func(m modules.Module) *hugo.Dependency { + dep := &hugo.Dependency{ + Path: m.Path(), + Version: m.Version(), + Time: m.Time(), + Vendor: m.Vendor(), + } + + // These are pointers, but this all came from JSON so there's no recursive navigation, + // so just create new values. + if m.Replace() != nil { + dep.Replace = depFromMod(m.Replace()) + } + if m.Owner() != nil { + dep.Owner = depFromMod(m.Owner()) + } + return dep + } + for _, m := range d.Paths.AllModules() { + dependencies = append(dependencies, depFromMod(m)) + } + + h.hugoInfo = hugo.NewInfo(h.Configs.GetFirstLanguageConfig(), dependencies) + + var prototype *deps.Deps + for i, s := range sites { + s.h = h + if err := s.Deps.Compile(prototype); err != nil { + return nil, err + } + if i == 0 { + prototype = s.Deps + } + } + + h.fatalErrorHandler = &fatalErrorHandler{ + h: h, + donec: make(chan bool), + } + + h.init.data.Add(func(context.Context) (any, error) { + err := h.loadData() + if err != nil { + return nil, fmt.Errorf("failed to load data: %w", err) + } + return nil, nil + }) + + h.init.layouts.Add(func(context.Context) (any, error) { + for _, s := range h.Sites { + if err := s.Tmpl().(tpl.TemplateManager).MarkReady(); err != nil { + return nil, err + } + } + return nil, nil + }) + + h.init.gitInfo.Add(func(context.Context) (any, error) { + err := h.loadGitInfo() + if err != nil { + return nil, fmt.Errorf("failed to load Git info: %w", err) + } + return nil, nil + }) + + return h, nil +} + +// Deprecated: Use hugo.IsServer instead. +func (s *Site) IsServer() bool { + hugo.Deprecate(".Site.IsServer", "Use hugo.IsServer instead.", "v0.120.0") + return s.conf.Internal.Running +} + +// Returns the server port. +func (s *Site) ServerPort() int { + return s.conf.C.BaseURL.Port() +} + +// Returns the configured title for this Site. +func (s *Site) Title() string { + return s.conf.Title +} + +func (s *Site) Copyright() string { + return s.conf.Copyright +} + +// Deprecated: Use .Site.Home.OutputFormats.Get "rss" instead. +func (s *Site) RSSLink() template.URL { + hugo.Deprecate(".Site.RSSLink", "Use the Output Format's Permalink method instead, e.g. .OutputFormats.Get \"RSS\".Permalink", "v0.114.0") + rssOutputFormat := s.home.OutputFormats().Get("rss") + return template.URL(rssOutputFormat.Permalink()) +} + +func (s *Site) Config() page.SiteConfig { + return page.SiteConfig{ + Privacy: s.conf.Privacy, + Services: s.conf.Services, + } +} + +func (s *Site) LanguageCode() string { + return s.Language().LanguageCode() +} + +// Returns all Sites for all languages. +func (s *Site) Sites() page.Sites { + sites := make(page.Sites, len(s.h.Sites)) + for i, s := range s.h.Sites { + sites[i] = s.Site() + } + return sites +} + +// Returns Site currently rendering. +func (s *Site) Current() page.Site { + return s.h.currentSite +} + +// MainSections returns the list of main sections. +func (s *Site) MainSections() []string { + s.CheckReady() + return s.conf.C.MainSections +} + +// Returns a struct with some information about the build. +func (s *Site) Hugo() hugo.HugoInfo { + if s.h == nil || s.h.hugoInfo.Environment == "" { + panic("site: hugo: hugoInfo not initialized") + } + return s.h.hugoInfo +} + +// Returns the BaseURL for this Site. +func (s *Site) BaseURL() string { + return s.conf.C.BaseURL.WithPath +} + +// Deprecated: Use .Site.Lastmod instead. +func (s *Site) LastChange() time.Time { + s.CheckReady() + hugo.Deprecate(".Site.LastChange", "Use .Site.Lastmod instead.", "v0.123.0") + return s.lastmod +} + +// Returns the last modification date of the content. +func (s *Site) Lastmod() time.Time { + return s.lastmod +} + +// Returns the Params configured for this site. +func (s *Site) Params() maps.Params { + return s.conf.Params +} + +// Deprecated: Use taxonomies instead. +func (s *Site) Author() map[string]any { + if len(s.conf.Author) != 0 { + hugo.Deprecate(".Site.Author", "Use taxonomies instead.", "v0.124.0") + } + return s.conf.Author +} + +// Deprecated: Use taxonomies instead. +func (s *Site) Authors() page.AuthorList { + hugo.Deprecate(".Site.Authors", "Use taxonomies instead.", "v0.124.0") + return page.AuthorList{} +} + +// Deprecated: Use .Site.Params instead. +func (s *Site) Social() map[string]string { + hugo.Deprecate(".Site.Social", "Use .Site.Params instead.", "v0.124.0") + return s.conf.Social +} + +// Deprecated: Use .Site.Config.Services.Disqus.Shortname instead. +func (s *Site) DisqusShortname() string { + hugo.Deprecate(".Site.DisqusShortname", "Use .Site.Config.Services.Disqus.Shortname instead.", "v0.120.0") + return s.Config().Services.Disqus.Shortname +} + +// Deprecated: Use .Site.Config.Services.GoogleAnalytics.ID instead. +func (s *Site) GoogleAnalytics() string { + hugo.Deprecate(".Site.GoogleAnalytics", "Use .Site.Config.Services.GoogleAnalytics.ID instead.", "v0.120.0") + return s.Config().Services.GoogleAnalytics.ID +} + +func (s *Site) Param(key any) (any, error) { + return resource.Param(s, nil, key) +} + +// Returns a map of all the data inside /data. +func (s *Site) Data() map[string]any { + return s.s.h.Data() +} + +func (s *Site) BuildDrafts() bool { + return s.conf.BuildDrafts +} + +// Deprecated: Use hugo.IsMultilingual instead. +func (s *Site) IsMultiLingual() bool { + hugo.Deprecate(".Site.IsMultiLingual", "Use hugo.IsMultilingual instead.", "v0.124.0") + return s.h.isMultilingual() +} + +func (s *Site) LanguagePrefix() string { + prefix := s.GetLanguagePrefix() + if prefix == "" { + return "" + } + return "/" + prefix +} + +func (s *Site) Site() page.Site { + return page.WrapSite(s) +} + +func (s *Site) ForEeachIdentityByName(name string, f func(identity.Identity) bool) { + if id, found := siteidentities.FromString(name); found { + if f(id) { + return + } + } +} + +// Pages returns all pages. +// This is for the current language only. +func (s *Site) Pages() page.Pages { + s.CheckReady() + return s.pageMap.getPagesInSection( + pageMapQueryPagesInSection{ + pageMapQueryPagesBelowPath: pageMapQueryPagesBelowPath{ + Path: "", + KeyPart: "global", + Include: pagePredicates.ShouldListGlobal, + }, + Recursive: true, + IncludeSelf: true, + }, + ) +} + +// RegularPages returns all the regular pages. +// This is for the current language only. +func (s *Site) RegularPages() page.Pages { + s.CheckReady() + return s.pageMap.getPagesInSection( + pageMapQueryPagesInSection{ + pageMapQueryPagesBelowPath: pageMapQueryPagesBelowPath{ + Path: "", + KeyPart: "global", + Include: pagePredicates.ShouldListGlobal.And(pagePredicates.KindPage), + }, + Recursive: true, + }, + ) +} + +// AllPages returns all pages for all sites. +func (s *Site) AllPages() page.Pages { + s.CheckReady() + return s.h.Pages() +} + +// AllRegularPages returns all regular pages for all sites. +func (s *Site) AllRegularPages() page.Pages { + s.CheckReady() + return s.h.RegularPages() +} + +func (s *Site) CheckReady() { + if s.state != siteStateReady { + panic("this method cannot be called before the site is fully initialized") + } +} + func (s *Site) Taxonomies() page.TaxonomyList { s.CheckReady() s.init.taxonomies.Do(context.Background()) diff --git a/hugolib/site_new.go b/hugolib/site_new.go deleted file mode 100644 index 19a7e42d7..000000000 --- a/hugolib/site_new.go +++ /dev/null @@ -1,603 +0,0 @@ -// Copyright 2024 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. -// 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 hugolib - -import ( - "context" - "errors" - "fmt" - "html/template" - "os" - "path/filepath" - "sort" - "time" - - "github.com/bep/logg" - "github.com/gohugoio/hugo/cache/dynacache" - "github.com/gohugoio/hugo/common/hugo" - "github.com/gohugoio/hugo/common/loggers" - "github.com/gohugoio/hugo/common/maps" - "github.com/gohugoio/hugo/common/para" - "github.com/gohugoio/hugo/config" - "github.com/gohugoio/hugo/config/allconfig" - "github.com/gohugoio/hugo/deps" - "github.com/gohugoio/hugo/hugolib/doctree" - "github.com/gohugoio/hugo/hugolib/pagesfromdata" - "github.com/gohugoio/hugo/identity" - "github.com/gohugoio/hugo/internal/warpc" - "github.com/gohugoio/hugo/langs" - "github.com/gohugoio/hugo/langs/i18n" - "github.com/gohugoio/hugo/lazy" - "github.com/gohugoio/hugo/modules" - "github.com/gohugoio/hugo/navigation" - "github.com/gohugoio/hugo/output" - "github.com/gohugoio/hugo/publisher" - "github.com/gohugoio/hugo/resources" - "github.com/gohugoio/hugo/resources/page" - "github.com/gohugoio/hugo/resources/page/pagemeta" - "github.com/gohugoio/hugo/resources/page/siteidentities" - "github.com/gohugoio/hugo/resources/resource" - "github.com/gohugoio/hugo/tpl" - "github.com/gohugoio/hugo/tpl/tplimpl" -) - -var _ page.Site = (*Site)(nil) - -type siteState int - -const ( - siteStateInit siteState = iota - siteStateReady -) - -type Site struct { - state siteState - conf *allconfig.Config - language *langs.Language - languagei int - pageMap *pageMap - - // The owning container. - h *HugoSites - - *deps.Deps - - // Page navigation. - *pageFinder - taxonomies page.TaxonomyList - menus navigation.Menus - - // Shortcut to the home page. Note that this may be nil if - // home page, for some odd reason, is disabled. - home *pageState - - // The last modification date of this site. - lastmod time.Time - - relatedDocsHandler *page.RelatedDocsHandler - siteRefLinker - publisher publisher.Publisher - frontmatterHandler pagemeta.FrontMatterHandler - - // The output formats that we need to render this site in. This slice - // will be fixed once set. - // This will be the union of Site.Pages' outputFormats. - // This slice will be sorted. - renderFormats output.Formats - - // Lazily loaded site dependencies - init *siteInit -} - -func (s *Site) Debug() { - fmt.Println("Debugging site", s.Lang(), "=>") - // fmt.Println(s.pageMap.testDump()) -} - -// NewHugoSites creates HugoSites from the given config. -func NewHugoSites(cfg deps.DepsCfg) (*HugoSites, error) { - conf := cfg.Configs.GetFirstLanguageConfig() - - var logger loggers.Logger - if cfg.TestLogger != nil { - logger = cfg.TestLogger - } else { - var logHookLast func(e *logg.Entry) error - if cfg.Configs.Base.PanicOnWarning { - logHookLast = loggers.PanicOnWarningHook - } - if cfg.LogOut == nil { - cfg.LogOut = os.Stdout - } - if cfg.LogLevel == 0 { - cfg.LogLevel = logg.LevelWarn - } - - logOpts := loggers.Options{ - Level: cfg.LogLevel, - DistinctLevel: logg.LevelWarn, // This will drop duplicate log warning and errors. - HandlerPost: logHookLast, - Stdout: cfg.LogOut, - Stderr: cfg.LogOut, - StoreErrors: conf.Watching(), - SuppressStatements: conf.IgnoredLogs(), - } - logger = loggers.New(logOpts) - - } - - memCache := dynacache.New(dynacache.Options{Watching: conf.Watching(), Log: logger}) - - var h *HugoSites - onSignalRebuild := func(ids ...identity.Identity) { - // This channel is buffered, but make sure we do this in a non-blocking way. - if cfg.ChangesFromBuild != nil { - go func() { - cfg.ChangesFromBuild <- ids - }() - } - } - - firstSiteDeps := &deps.Deps{ - Fs: cfg.Fs, - Log: logger, - Conf: conf, - BuildState: &deps.BuildState{ - OnSignalRebuild: onSignalRebuild, - }, - MemCache: memCache, - TemplateProvider: tplimpl.DefaultTemplateProvider, - TranslationProvider: i18n.NewTranslationProvider(), - WasmDispatchers: warpc.AllDispatchers( - warpc.Options{ - CompilationCacheDir: filepath.Join(conf.Dirs().CacheDir, "_warpc"), - - // Katex is relatively slow. - PoolSize: 8, - Infof: logger.InfoCommand("wasm").Logf, - }, - ), - } - - if err := firstSiteDeps.Init(); err != nil { - return nil, err - } - - confm := cfg.Configs - if err := confm.Validate(logger); err != nil { - return nil, err - } - var sites []*Site - - ns := &contentNodeShifter{ - numLanguages: len(confm.Languages), - } - - treeConfig := doctree.Config[contentNodeI]{ - Shifter: ns, - } - - pageTrees := &pageTrees{ - treePages: doctree.New( - treeConfig, - ), - treeResources: doctree.New( - treeConfig, - ), - treeTaxonomyEntries: doctree.NewTreeShiftTree[*weightedContentNode](doctree.DimensionLanguage.Index(), len(confm.Languages)), - treePagesFromTemplateAdapters: doctree.NewTreeShiftTree[*pagesfromdata.PagesFromTemplate](doctree.DimensionLanguage.Index(), len(confm.Languages)), - } - - pageTrees.createMutableTrees() - - for i, confp := range confm.ConfigLangs() { - language := confp.Language() - if language.Disabled { - continue - } - k := language.Lang - conf := confm.LanguageConfigMap[k] - frontmatterHandler, err := pagemeta.NewFrontmatterHandler(firstSiteDeps.Log, conf.Frontmatter) - if err != nil { - return nil, err - } - - langs.SetParams(language, conf.Params) - - s := &Site{ - conf: conf, - language: language, - languagei: i, - frontmatterHandler: frontmatterHandler, - } - - if i == 0 { - firstSiteDeps.Site = s - s.Deps = firstSiteDeps - } else { - d, err := firstSiteDeps.Clone(s, confp) - if err != nil { - return nil, err - } - s.Deps = d - } - - s.pageMap = newPageMap(i, s, memCache, pageTrees) - - s.pageFinder = newPageFinder(s.pageMap) - s.siteRefLinker, err = newSiteRefLinker(s) - if err != nil { - return nil, err - } - // Set up the main publishing chain. - pub, err := publisher.NewDestinationPublisher( - firstSiteDeps.ResourceSpec, - s.conf.OutputFormats.Config, - s.conf.MediaTypes.Config, - ) - if err != nil { - return nil, err - } - - s.publisher = pub - s.relatedDocsHandler = page.NewRelatedDocsHandler(s.conf.Related) - // Site deps end. - - s.prepareInits() - sites = append(sites, s) - } - - if len(sites) == 0 { - return nil, errors.New("no sites to build") - } - - // Pull the default content language to the top, then sort the sites by language weight (if set) or lang. - defaultContentLanguage := confm.Base.DefaultContentLanguage - sort.Slice(sites, func(i, j int) bool { - li := sites[i].language - lj := sites[j].language - if li.Lang == defaultContentLanguage { - return true - } - - if lj.Lang == defaultContentLanguage { - return false - } - - if li.Weight != lj.Weight { - return li.Weight < lj.Weight - } - return li.Lang < lj.Lang - }) - - var err error - h, err = newHugoSites(cfg, firstSiteDeps, pageTrees, sites) - if err == nil && h == nil { - panic("hugo: newHugoSitesNew returned nil error and nil HugoSites") - } - - return h, err -} - -func newHugoSites(cfg deps.DepsCfg, d *deps.Deps, pageTrees *pageTrees, sites []*Site) (*HugoSites, error) { - numWorkers := config.GetNumWorkerMultiplier() - numWorkersSite := numWorkers - if numWorkersSite > len(sites) { - numWorkersSite = len(sites) - } - workersSite := para.New(numWorkersSite) - - h := &HugoSites{ - Sites: sites, - Deps: sites[0].Deps, - Configs: cfg.Configs, - workersSite: workersSite, - numWorkersSites: numWorkers, - numWorkers: numWorkers, - pageTrees: pageTrees, - cachePages: dynacache.GetOrCreatePartition[string, - page.Pages](d.MemCache, "/pags/all", - dynacache.OptionsPartition{Weight: 10, ClearWhen: dynacache.ClearOnRebuild}, - ), - cacheContentSource: dynacache.GetOrCreatePartition[string, *resources.StaleValue[[]byte]](d.MemCache, "/cont/src", dynacache.OptionsPartition{Weight: 70, ClearWhen: dynacache.ClearOnChange}), - translationKeyPages: maps.NewSliceCache[page.Page](), - currentSite: sites[0], - skipRebuildForFilenames: make(map[string]bool), - init: &hugoSitesInit{ - data: lazy.New(), - layouts: lazy.New(), - gitInfo: lazy.New(), - }, - } - - // Assemble dependencies to be used in hugo.Deps. - var dependencies []*hugo.Dependency - var depFromMod func(m modules.Module) *hugo.Dependency - depFromMod = func(m modules.Module) *hugo.Dependency { - dep := &hugo.Dependency{ - Path: m.Path(), - Version: m.Version(), - Time: m.Time(), - Vendor: m.Vendor(), - } - - // These are pointers, but this all came from JSON so there's no recursive navigation, - // so just create new values. - if m.Replace() != nil { - dep.Replace = depFromMod(m.Replace()) - } - if m.Owner() != nil { - dep.Owner = depFromMod(m.Owner()) - } - return dep - } - for _, m := range d.Paths.AllModules() { - dependencies = append(dependencies, depFromMod(m)) - } - - h.hugoInfo = hugo.NewInfo(h.Configs.GetFirstLanguageConfig(), dependencies) - - var prototype *deps.Deps - for i, s := range sites { - s.h = h - if err := s.Deps.Compile(prototype); err != nil { - return nil, err - } - if i == 0 { - prototype = s.Deps - } - } - - h.fatalErrorHandler = &fatalErrorHandler{ - h: h, - donec: make(chan bool), - } - - h.init.data.Add(func(context.Context) (any, error) { - err := h.loadData() - if err != nil { - return nil, fmt.Errorf("failed to load data: %w", err) - } - return nil, nil - }) - - h.init.layouts.Add(func(context.Context) (any, error) { - for _, s := range h.Sites { - if err := s.Tmpl().(tpl.TemplateManager).MarkReady(); err != nil { - return nil, err - } - } - return nil, nil - }) - - h.init.gitInfo.Add(func(context.Context) (any, error) { - err := h.loadGitInfo() - if err != nil { - return nil, fmt.Errorf("failed to load Git info: %w", err) - } - return nil, nil - }) - - return h, nil -} - -// Deprecated: Use hugo.IsServer instead. -func (s *Site) IsServer() bool { - hugo.Deprecate(".Site.IsServer", "Use hugo.IsServer instead.", "v0.120.0") - return s.conf.Internal.Running -} - -// Returns the server port. -func (s *Site) ServerPort() int { - return s.conf.C.BaseURL.Port() -} - -// Returns the configured title for this Site. -func (s *Site) Title() string { - return s.conf.Title -} - -func (s *Site) Copyright() string { - return s.conf.Copyright -} - -// Deprecated: Use .Site.Home.OutputFormats.Get "rss" instead. -func (s *Site) RSSLink() template.URL { - hugo.Deprecate(".Site.RSSLink", "Use the Output Format's Permalink method instead, e.g. .OutputFormats.Get \"RSS\".Permalink", "v0.114.0") - rssOutputFormat := s.home.OutputFormats().Get("rss") - return template.URL(rssOutputFormat.Permalink()) -} - -func (s *Site) Config() page.SiteConfig { - return page.SiteConfig{ - Privacy: s.conf.Privacy, - Services: s.conf.Services, - } -} - -func (s *Site) LanguageCode() string { - return s.Language().LanguageCode() -} - -// Returns all Sites for all languages. -func (s *Site) Sites() page.Sites { - sites := make(page.Sites, len(s.h.Sites)) - for i, s := range s.h.Sites { - sites[i] = s.Site() - } - return sites -} - -// Returns Site currently rendering. -func (s *Site) Current() page.Site { - return s.h.currentSite -} - -// MainSections returns the list of main sections. -func (s *Site) MainSections() []string { - s.CheckReady() - return s.conf.C.MainSections -} - -// Returns a struct with some information about the build. -func (s *Site) Hugo() hugo.HugoInfo { - if s.h == nil || s.h.hugoInfo.Environment == "" { - panic("site: hugo: hugoInfo not initialized") - } - return s.h.hugoInfo -} - -// Returns the BaseURL for this Site. -func (s *Site) BaseURL() string { - return s.conf.C.BaseURL.WithPath -} - -// Deprecated: Use .Site.Lastmod instead. -func (s *Site) LastChange() time.Time { - s.CheckReady() - hugo.Deprecate(".Site.LastChange", "Use .Site.Lastmod instead.", "v0.123.0") - return s.lastmod -} - -// Returns the last modification date of the content. -func (s *Site) Lastmod() time.Time { - return s.lastmod -} - -// Returns the Params configured for this site. -func (s *Site) Params() maps.Params { - return s.conf.Params -} - -// Deprecated: Use taxonomies instead. -func (s *Site) Author() map[string]any { - if len(s.conf.Author) != 0 { - hugo.Deprecate(".Site.Author", "Use taxonomies instead.", "v0.124.0") - } - return s.conf.Author -} - -// Deprecated: Use taxonomies instead. -func (s *Site) Authors() page.AuthorList { - hugo.Deprecate(".Site.Authors", "Use taxonomies instead.", "v0.124.0") - return page.AuthorList{} -} - -// Deprecated: Use .Site.Params instead. -func (s *Site) Social() map[string]string { - hugo.Deprecate(".Site.Social", "Use .Site.Params instead.", "v0.124.0") - return s.conf.Social -} - -// Deprecated: Use .Site.Config.Services.Disqus.Shortname instead. -func (s *Site) DisqusShortname() string { - hugo.Deprecate(".Site.DisqusShortname", "Use .Site.Config.Services.Disqus.Shortname instead.", "v0.120.0") - return s.Config().Services.Disqus.Shortname -} - -// Deprecated: Use .Site.Config.Services.GoogleAnalytics.ID instead. -func (s *Site) GoogleAnalytics() string { - hugo.Deprecate(".Site.GoogleAnalytics", "Use .Site.Config.Services.GoogleAnalytics.ID instead.", "v0.120.0") - return s.Config().Services.GoogleAnalytics.ID -} - -func (s *Site) Param(key any) (any, error) { - return resource.Param(s, nil, key) -} - -// Returns a map of all the data inside /data. -func (s *Site) Data() map[string]any { - return s.s.h.Data() -} - -func (s *Site) BuildDrafts() bool { - return s.conf.BuildDrafts -} - -// Deprecated: Use hugo.IsMultilingual instead. -func (s *Site) IsMultiLingual() bool { - hugo.Deprecate(".Site.IsMultiLingual", "Use hugo.IsMultilingual instead.", "v0.124.0") - return s.h.isMultilingual() -} - -func (s *Site) LanguagePrefix() string { - prefix := s.GetLanguagePrefix() - if prefix == "" { - return "" - } - return "/" + prefix -} - -func (s *Site) Site() page.Site { - return page.WrapSite(s) -} - -func (s *Site) ForEeachIdentityByName(name string, f func(identity.Identity) bool) { - if id, found := siteidentities.FromString(name); found { - if f(id) { - return - } - } -} - -// Pages returns all pages. -// This is for the current language only. -func (s *Site) Pages() page.Pages { - s.CheckReady() - return s.pageMap.getPagesInSection( - pageMapQueryPagesInSection{ - pageMapQueryPagesBelowPath: pageMapQueryPagesBelowPath{ - Path: "", - KeyPart: "global", - Include: pagePredicates.ShouldListGlobal, - }, - Recursive: true, - IncludeSelf: true, - }, - ) -} - -// RegularPages returns all the regular pages. -// This is for the current language only. -func (s *Site) RegularPages() page.Pages { - s.CheckReady() - return s.pageMap.getPagesInSection( - pageMapQueryPagesInSection{ - pageMapQueryPagesBelowPath: pageMapQueryPagesBelowPath{ - Path: "", - KeyPart: "global", - Include: pagePredicates.ShouldListGlobal.And(pagePredicates.KindPage), - }, - Recursive: true, - }, - ) -} - -// AllPages returns all pages for all sites. -func (s *Site) AllPages() page.Pages { - s.CheckReady() - return s.h.Pages() -} - -// AllRegularPages returns all regular pages for all sites. -func (s *Site) AllRegularPages() page.Pages { - s.CheckReady() - return s.h.RegularPages() -} - -func (s *Site) CheckReady() { - if s.state != siteStateReady { - panic("this method cannot be called before the site is fully initialized") - } -} From c260cb28a9fe3d391530ecd9011ce6ed927f57f8 Mon Sep 17 00:00:00 2001 From: David Else <12832280+David-Else@users.noreply.github.com> Date: Wed, 18 Sep 2024 09:53:18 +0100 Subject: [PATCH 009/526] Add exclusion for helix .bck files Updates #12677 --- commands/hugobuilder.go | 1 + 1 file changed, 1 insertion(+) diff --git a/commands/hugobuilder.go b/commands/hugobuilder.go index 15373d8c6..d15d47326 100644 --- a/commands/hugobuilder.go +++ b/commands/hugobuilder.go @@ -779,6 +779,7 @@ func (c *hugoBuilder) handleEvents(watcher *watcher.Batcher, istemp := strings.HasSuffix(ext, "~") || (ext == ".swp") || // vim (ext == ".swx") || // vim + (ext == ".bck") || // helix (ext == ".tmp") || // generic temp file (ext == ".DS_Store") || // OSX Thumbnail baseName == "4913" || // vim From e363964f2fcbeabe4264eaa9d7f803c9989ad096 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Thu, 19 Sep 2024 10:53:39 +0200 Subject: [PATCH 010/526] commands: Ignore "module does not exist" errors in hugo mod init Closes #11458 --- commands/commandeer.go | 59 +++++++++++++++++++------------ commands/config.go | 4 +-- commands/hugobuilder.go | 4 +-- commands/mod.go | 18 ++++++---- commands/new.go | 4 +-- config/allconfig/allconfig.go | 2 +- config/allconfig/load.go | 30 +++++++++------- modules/client.go | 3 ++ modules/collect.go | 3 ++ testscripts/commands/mod_init.txt | 15 ++++++++ 10 files changed, 92 insertions(+), 50 deletions(-) create mode 100644 testscripts/commands/mod_init.txt diff --git a/commands/commandeer.go b/commands/commandeer.go index f18a95bb9..e8cde2114 100644 --- a/commands/commandeer.go +++ b/commands/commandeer.go @@ -88,6 +88,11 @@ type commonConfig struct { fs *hugofs.Fs } +type configKey struct { + counter int32 + ignoreModulesDoesNotExists bool +} + // This is the root command. type rootCommand struct { Printf func(format string, v ...interface{}) @@ -101,8 +106,8 @@ type rootCommand struct { // Some, but not all commands need access to these. // Some needs more than one, so keep them in a small cache. - commonConfigs *lazycache.Cache[int32, *commonConfig] - hugoSites *lazycache.Cache[int32, *hugolib.HugoSites] + commonConfigs *lazycache.Cache[configKey, *commonConfig] + hugoSites *lazycache.Cache[configKey, *hugolib.HugoSites] // changesFromBuild received from Hugo in watch mode. changesFromBuild chan []identity.Identity @@ -160,17 +165,18 @@ func (r *rootCommand) Commands() []simplecobra.Commander { return r.commands } -func (r *rootCommand) ConfigFromConfig(key int32, oldConf *commonConfig) (*commonConfig, error) { - cc, _, err := r.commonConfigs.GetOrCreate(key, func(key int32) (*commonConfig, error) { +func (r *rootCommand) ConfigFromConfig(key configKey, oldConf *commonConfig) (*commonConfig, error) { + cc, _, err := r.commonConfigs.GetOrCreate(key, func(key configKey) (*commonConfig, error) { fs := oldConf.fs configs, err := allconfig.LoadConfig( allconfig.ConfigSourceDescriptor{ - Flags: oldConf.cfg, - Fs: fs.Source, - Filename: r.cfgFile, - ConfigDir: r.cfgDir, - Logger: r.logger, - Environment: r.environment, + Flags: oldConf.cfg, + Fs: fs.Source, + Filename: r.cfgFile, + ConfigDir: r.cfgDir, + Logger: r.logger, + Environment: r.environment, + IgnoreModuleDoesNotExist: key.ignoreModulesDoesNotExists, }, ) if err != nil { @@ -193,11 +199,11 @@ func (r *rootCommand) ConfigFromConfig(key int32, oldConf *commonConfig) (*commo return cc, err } -func (r *rootCommand) ConfigFromProvider(key int32, cfg config.Provider) (*commonConfig, error) { +func (r *rootCommand) ConfigFromProvider(key configKey, cfg config.Provider) (*commonConfig, error) { if cfg == nil { panic("cfg must be set") } - cc, _, err := r.commonConfigs.GetOrCreate(key, func(key int32) (*commonConfig, error) { + cc, _, err := r.commonConfigs.GetOrCreate(key, func(key configKey) (*commonConfig, error) { var dir string if r.source != "" { dir, _ = filepath.Abs(r.source) @@ -220,12 +226,13 @@ func (r *rootCommand) ConfigFromProvider(key int32, cfg config.Provider) (*commo // Load the config first to allow publishDir to be configured in config file. configs, err := allconfig.LoadConfig( allconfig.ConfigSourceDescriptor{ - Flags: cfg, - Fs: hugofs.Os, - Filename: r.cfgFile, - ConfigDir: r.cfgDir, - Environment: r.environment, - Logger: r.logger, + Flags: cfg, + Fs: hugofs.Os, + Filename: r.cfgFile, + ConfigDir: r.cfgDir, + Environment: r.environment, + Logger: r.logger, + IgnoreModuleDoesNotExist: key.ignoreModulesDoesNotExists, }, ) if err != nil { @@ -307,7 +314,8 @@ func (r *rootCommand) ConfigFromProvider(key int32, cfg config.Provider) (*commo } func (r *rootCommand) HugFromConfig(conf *commonConfig) (*hugolib.HugoSites, error) { - h, _, err := r.hugoSites.GetOrCreate(r.configVersionID.Load(), func(key int32) (*hugolib.HugoSites, error) { + k := configKey{counter: r.configVersionID.Load()} + h, _, err := r.hugoSites.GetOrCreate(k, func(key configKey) (*hugolib.HugoSites, error) { depsCfg := r.newDepsConfig(conf) return hugolib.NewHugoSites(depsCfg) }) @@ -315,7 +323,12 @@ func (r *rootCommand) HugFromConfig(conf *commonConfig) (*hugolib.HugoSites, err } func (r *rootCommand) Hugo(cfg config.Provider) (*hugolib.HugoSites, error) { - h, _, err := r.hugoSites.GetOrCreate(r.configVersionID.Load(), func(key int32) (*hugolib.HugoSites, error) { + return r.getOrCreateHugo(cfg, false) +} + +func (r *rootCommand) getOrCreateHugo(cfg config.Provider, ignoreModuleDoesNotExist bool) (*hugolib.HugoSites, error) { + k := configKey{counter: r.configVersionID.Load(), ignoreModulesDoesNotExists: ignoreModuleDoesNotExist} + h, _, err := r.hugoSites.GetOrCreate(k, func(key configKey) (*hugolib.HugoSites, error) { conf, err := r.ConfigFromProvider(key, cfg) if err != nil { return nil, err @@ -418,11 +431,11 @@ func (r *rootCommand) PreRun(cd, runner *simplecobra.Commandeer) error { r.changesFromBuild = make(chan []identity.Identity, 10) - r.commonConfigs = lazycache.New(lazycache.Options[int32, *commonConfig]{MaxEntries: 5}) + r.commonConfigs = lazycache.New(lazycache.Options[configKey, *commonConfig]{MaxEntries: 5}) // We don't want to keep stale HugoSites in memory longer than needed. - r.hugoSites = lazycache.New(lazycache.Options[int32, *hugolib.HugoSites]{ + r.hugoSites = lazycache.New(lazycache.Options[configKey, *hugolib.HugoSites]{ MaxEntries: 1, - OnEvict: func(key int32, value *hugolib.HugoSites) { + OnEvict: func(key configKey, value *hugolib.HugoSites) { value.Close() runtime.GC() }, diff --git a/commands/config.go b/commands/config.go index adf6bbe2b..c3d08ae22 100644 --- a/commands/config.go +++ b/commands/config.go @@ -58,7 +58,7 @@ func (c *configCommand) Name() string { } func (c *configCommand) Run(ctx context.Context, cd *simplecobra.Commandeer, args []string) error { - conf, err := c.r.ConfigFromProvider(c.r.configVersionID.Load(), flagsToCfg(cd, nil)) + conf, err := c.r.ConfigFromProvider(configKey{counter: c.r.configVersionID.Load()}, flagsToCfg(cd, nil)) if err != nil { return err } @@ -209,7 +209,7 @@ func (c *configMountsCommand) Name() string { func (c *configMountsCommand) Run(ctx context.Context, cd *simplecobra.Commandeer, args []string) error { r := c.configCmd.r - conf, err := r.ConfigFromProvider(r.configVersionID.Load(), flagsToCfg(cd, nil)) + conf, err := r.ConfigFromProvider(configKey{counter: c.r.configVersionID.Load()}, flagsToCfg(cd, nil)) if err != nil { return err } diff --git a/commands/hugobuilder.go b/commands/hugobuilder.go index d15d47326..42bf68a37 100644 --- a/commands/hugobuilder.go +++ b/commands/hugobuilder.go @@ -1047,7 +1047,7 @@ func (c *hugoBuilder) loadConfig(cd *simplecobra.Commandeer, running bool) error "fastRenderMode": c.fastRenderMode, }) - conf, err := c.r.ConfigFromProvider(c.r.configVersionID.Load(), flagsToCfg(cd, cfg)) + conf, err := c.r.ConfigFromProvider(configKey{counter: c.r.configVersionID.Load()}, flagsToCfg(cd, cfg)) if err != nil { return err } @@ -1116,7 +1116,7 @@ func (c *hugoBuilder) reloadConfig() error { if err := c.withConfE(func(conf *commonConfig) error { oldConf := conf - newConf, err := c.r.ConfigFromConfig(c.r.configVersionID.Load(), conf) + newConf, err := c.r.ConfigFromConfig(configKey{counter: c.r.configVersionID.Load()}, conf) if err != nil { return err } diff --git a/commands/mod.go b/commands/mod.go index 0fa83e5c0..a9c8c459d 100644 --- a/commands/mod.go +++ b/commands/mod.go @@ -94,7 +94,7 @@ so this may/will change in future versions of Hugo. applyLocalFlagsBuildConfig(cmd, r) }, run: func(ctx context.Context, cd *simplecobra.Commandeer, r *rootCommand, args []string) error { - h, err := r.Hugo(flagsToCfg(cd, nil)) + h, err := r.getOrCreateHugo(flagsToCfg(cd, nil), true) if err != nil { return err } @@ -102,7 +102,11 @@ so this may/will change in future versions of Hugo. if len(args) >= 1 { initPath = args[0] } - return h.Configs.ModulesClient.Init(initPath) + c := h.Configs.ModulesClient + if err := c.Init(initPath); err != nil { + return err + } + return nil }, }, &simpleCommand{ @@ -115,7 +119,7 @@ so this may/will change in future versions of Hugo. cmd.Flags().BoolVarP(&clean, "clean", "", false, "delete module cache for dependencies that fail verification") }, run: func(ctx context.Context, cd *simplecobra.Commandeer, r *rootCommand, args []string) error { - conf, err := r.ConfigFromProvider(r.configVersionID.Load(), flagsToCfg(cd, nil)) + conf, err := r.ConfigFromProvider(configKey{counter: r.configVersionID.Load()}, flagsToCfg(cd, nil)) if err != nil { return err } @@ -135,7 +139,7 @@ Note that for vendored modules, that is the version listed and not the one from cmd.Flags().BoolVarP(&clean, "clean", "", false, "delete module cache for dependencies that fail verification") }, run: func(ctx context.Context, cd *simplecobra.Commandeer, r *rootCommand, args []string) error { - conf, err := r.ConfigFromProvider(r.configVersionID.Load(), flagsToCfg(cd, nil)) + conf, err := r.ConfigFromProvider(configKey{counter: r.configVersionID.Load()}, flagsToCfg(cd, nil)) if err != nil { return err } @@ -271,7 +275,7 @@ Run "go help get" for more information. All flags available for "go get" is also cfg := config.New() cfg.Set("workingDir", dir) - conf, err := r.ConfigFromProvider(r.configVersionID.Add(1), flagsToCfg(cd, cfg)) + conf, err := r.ConfigFromProvider(configKey{counter: r.configVersionID.Add(1)}, flagsToCfg(cd, cfg)) if err != nil { return err } @@ -284,7 +288,7 @@ Run "go help get" for more information. All flags available for "go get" is also }) return nil } else { - conf, err := r.ConfigFromProvider(r.configVersionID.Load(), flagsToCfg(cd, nil)) + conf, err := r.ConfigFromProvider(configKey{counter: r.configVersionID.Load()}, flagsToCfg(cd, nil)) if err != nil { return err } @@ -313,7 +317,7 @@ func (c *modCommands) Name() string { } func (c *modCommands) Run(ctx context.Context, cd *simplecobra.Commandeer, args []string) error { - _, err := c.r.ConfigFromProvider(c.r.configVersionID.Load(), nil) + _, err := c.r.ConfigFromProvider(configKey{counter: c.r.configVersionID.Load()}, nil) if err != nil { return err } diff --git a/commands/new.go b/commands/new.go index 4bad0059f..f6bb09e00 100644 --- a/commands/new.go +++ b/commands/new.go @@ -93,7 +93,7 @@ Use ` + "`hugo new [contentPath]`" + ` to create new content.`, cfg.Set("workingDir", createpath) cfg.Set("publishDir", "public") - conf, err := r.ConfigFromProvider(r.configVersionID.Load(), flagsToCfg(cd, cfg)) + conf, err := r.ConfigFromProvider(configKey{counter: r.configVersionID.Load()}, flagsToCfg(cd, cfg)) if err != nil { return err } @@ -136,7 +136,7 @@ according to your needs.`, cfg := config.New() cfg.Set("publishDir", "public") - conf, err := r.ConfigFromProvider(r.configVersionID.Load(), flagsToCfg(cd, cfg)) + conf, err := r.ConfigFromProvider(configKey{counter: r.configVersionID.Load()}, flagsToCfg(cd, cfg)) if err != nil { return err } diff --git a/config/allconfig/allconfig.go b/config/allconfig/allconfig.go index f6dfa7260..35517ece2 100644 --- a/config/allconfig/allconfig.go +++ b/config/allconfig/allconfig.go @@ -809,7 +809,7 @@ func (c *Configs) Init() error { } if len(c.Modules) == 0 { - return errors.New("no modules loaded (ned at least the main module)") + return errors.New("no modules loaded (need at least the main module)") } // Apply default project mounts. diff --git a/config/allconfig/load.go b/config/allconfig/load.go index 84419cb2e..16e2019cf 100644 --- a/config/allconfig/load.go +++ b/config/allconfig/load.go @@ -64,7 +64,7 @@ func LoadConfig(d ConfigSourceDescriptor) (*Configs, error) { return nil, fmt.Errorf("failed to create config from result: %w", err) } - moduleConfig, modulesClient, err := l.loadModules(configs) + moduleConfig, modulesClient, err := l.loadModules(configs, d.IgnoreModuleDoesNotExist) if err != nil { return nil, fmt.Errorf("failed to load modules: %w", err) } @@ -116,6 +116,9 @@ type ConfigSourceDescriptor struct { // Defaults to os.Environ if not set. Environ []string + + // If set, this will be used to ignore the module does not exist error. + IgnoreModuleDoesNotExist bool } func (d ConfigSourceDescriptor) configFilenames() []string { @@ -453,7 +456,7 @@ func (l *configLoader) loadConfigMain(d ConfigSourceDescriptor) (config.LoadConf return res, l.ModulesConfig, err } -func (l *configLoader) loadModules(configs *Configs) (modules.ModulesConfig, *modules.Client, error) { +func (l *configLoader) loadModules(configs *Configs, ignoreModuleDoesNotExist bool) (modules.ModulesConfig, *modules.Client, error) { bcfg := configs.LoadingInfo.BaseConfig conf := configs.Base workingDir := bcfg.WorkingDir @@ -487,17 +490,18 @@ func (l *configLoader) loadModules(configs *Configs) (modules.ModulesConfig, *mo } modulesClient := modules.NewClient(modules.ClientConfig{ - Fs: l.Fs, - Logger: l.Logger, - Exec: ex, - HookBeforeFinalize: hook, - WorkingDir: workingDir, - ThemesDir: themesDir, - PublishDir: publishDir, - Environment: l.Environment, - CacheDir: conf.Caches.CacheDirModules(), - ModuleConfig: conf.Module, - IgnoreVendor: ignoreVendor, + Fs: l.Fs, + Logger: l.Logger, + Exec: ex, + HookBeforeFinalize: hook, + WorkingDir: workingDir, + ThemesDir: themesDir, + PublishDir: publishDir, + Environment: l.Environment, + CacheDir: conf.Caches.CacheDirModules(), + ModuleConfig: conf.Module, + IgnoreVendor: ignoreVendor, + IgnoreModuleDoesNotExist: ignoreModuleDoesNotExist, }) moduleConfig, err := modulesClient.Collect() diff --git a/modules/client.go b/modules/client.go index dce40d2db..70b3ac485 100644 --- a/modules/client.go +++ b/modules/client.go @@ -742,6 +742,9 @@ type ClientConfig struct { // This can be nil. IgnoreVendor glob.Glob + // Ignore any module not found errors. + IgnoreModuleDoesNotExist bool + // Absolute path to the project dir. WorkingDir string diff --git a/modules/collect.go b/modules/collect.go index cfb6d9249..4eb12a1a6 100644 --- a/modules/collect.go +++ b/modules/collect.go @@ -699,6 +699,9 @@ func (c *collector) normalizeMounts(owner *moduleAdapter, mounts []Mount) ([]Mou } func (c *collector) wrapModuleNotFound(err error) error { + if c.Client.ccfg.IgnoreModuleDoesNotExist { + return nil + } err = fmt.Errorf(err.Error()+": %w", ErrNotExist) if c.GoModulesFilename == "" { return err diff --git a/testscripts/commands/mod_init.txt b/testscripts/commands/mod_init.txt new file mode 100644 index 000000000..c09e71a23 --- /dev/null +++ b/testscripts/commands/mod_init.txt @@ -0,0 +1,15 @@ +# Test the hugo init command. +dostounix golden/go.mod.testsubmod + +hugo mod init testsubmod +cmpenv go.mod $WORK/golden/go.mod.testsubmod + +-- hugo.toml -- +title = "Hugo Modules Test" +[module] +[[module.imports]] +path="github.com/bep/empty-hugo-module" +-- golden/go.mod.testsubmod -- +module testsubmod + +go ${GOVERSION} \ No newline at end of file From 22a9f3fc98b4c6ebcade7ad11bd231e978aa58cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Thu, 19 Sep 2024 11:40:48 +0200 Subject: [PATCH 011/526] modules: Improve console output on hugo mod init Replace some of the stderr output from the Go command to match the Hugo commands needed: ``` go: creating new go.mod: module github.com/bep/foo hugo: to add module requirements and sums: hugo mod tidy ``` See #11458 --- modules/client.go | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/modules/client.go b/modules/client.go index 70b3ac485..404605c8c 100644 --- a/modules/client.go +++ b/modules/client.go @@ -633,7 +633,7 @@ func (c *Client) runGo( argsv := collections.StringSliceToInterfaceSlice(args) argsv = append(argsv, hexec.WithEnviron(c.environ)) - argsv = append(argsv, hexec.WithStderr(io.MultiWriter(stderr, os.Stderr))) + argsv = append(argsv, hexec.WithStderr(goOutputReplacerWriter{w: io.MultiWriter(stderr, os.Stderr)})) argsv = append(argsv, hexec.WithStdout(stdout)) argsv = append(argsv, hexec.WithDir(c.ccfg.WorkingDir)) argsv = append(argsv, hexec.WithContext(ctx)) @@ -679,6 +679,24 @@ If you then run 'hugo mod graph' it should resolve itself to the most recent ver return nil } +var goOutputReplacer = strings.NewReplacer( + "go: to add module requirements and sums:", "hugo: to add module requirements and sums:", + "go mod tidy", "hugo mod tidy", +) + +type goOutputReplacerWriter struct { + w io.Writer +} + +func (w goOutputReplacerWriter) Write(p []byte) (n int, err error) { + s := goOutputReplacer.Replace(string(p)) + _, err = w.w.Write([]byte(s)) + if err != nil { + return 0, err + } + return len(p), nil +} + func (c *Client) tidy(mods Modules, goModOnly bool) error { isGoMod := make(map[string]bool) for _, m := range mods { From e07028cb90901931cd71a210f9d0b237d1bcc99f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Thu, 19 Sep 2024 13:00:39 +0200 Subject: [PATCH 012/526] tpl: Remove RSS deprecation site.Author check The check itself creates a warning which I guess was not intended. We could possibly make that work, but it has been deprecated since Hugo 0.98, so just remove the usage. --- tpl/tplimpl/embedded/templates/_default/rss.xml | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/tpl/tplimpl/embedded/templates/_default/rss.xml b/tpl/tplimpl/embedded/templates/_default/rss.xml index 2e505f1bc..2df2cae6e 100644 --- a/tpl/tplimpl/embedded/templates/_default/rss.xml +++ b/tpl/tplimpl/embedded/templates/_default/rss.xml @@ -1,4 +1,3 @@ -{{- /* Deprecate site.Author.email in favor of site.Params.author.email */}} {{- $authorEmail := "" }} {{- with site.Params.author }} {{- if reflect.IsMap . }} @@ -6,14 +5,8 @@ {{- $authorEmail = . }} {{- end }} {{- end }} -{{- else }} - {{- with site.Author.email }} - {{- $authorEmail = . }} - {{- warnf "The author key in site configuration is deprecated. Use params.author.email instead." }} - {{- end }} {{- end }} -{{- /* Deprecate site.Author.name in favor of site.Params.author.name */}} {{- $authorName := "" }} {{- with site.Params.author }} {{- if reflect.IsMap . }} @@ -23,11 +16,6 @@ {{- else }} {{- $authorName = . }} {{- end }} -{{- else }} - {{- with site.Author.name }} - {{- $authorName = . }} - {{- warnf "The author key in site configuration is deprecated. Use params.author.name instead." }} - {{- end }} {{- end }} {{- $pctx := . }} From 5fb333b9f5ff4ec018f9d78910177d0bec1befb0 Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Thu, 19 Sep 2024 14:28:20 +0000 Subject: [PATCH 013/526] releaser: Bump versions for release of 0.134.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 21442b238..15d08dd62 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: 135, - PatchLevel: 0, - Suffix: "-DEV", + Minor: 134, + PatchLevel: 3, + Suffix: "", } From a619deec1827ea2d601a9b3708d1375c1eca3c5c Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Thu, 19 Sep 2024 14:42:46 +0000 Subject: [PATCH 014/526] releaser: Prepare repository for 0.135.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 15d08dd62..21442b238 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: 134, - PatchLevel: 3, - Suffix: "", + Minor: 135, + PatchLevel: 0, + Suffix: "-DEV", } diff --git a/hugoreleaser.env b/hugoreleaser.env index 6bb01efa1..b5ebdc174 100644 --- a/hugoreleaser.env +++ b/hugoreleaser.env @@ -1,7 +1,8 @@ # Release env. # These will be replaced by script before release. -HUGORELEASER_TAG=v0.134.2 -HUGORELEASER_COMMITISH=1c74abd26070b0c12849550c974a9f3f1e7afb06 +HUGORELEASER_TAG=v0.134.3 +HUGORELEASER_COMMITISH=5fb333b9f5ff4ec018f9d78910177d0bec1befb0 + From 1e690c0f2311ae657fa024eae3f3b8a111e2e4c3 Mon Sep 17 00:00:00 2001 From: Khayyam Saleem Date: Sat, 21 Sep 2024 11:47:37 -0400 Subject: [PATCH 015/526] deps: Upgrade github.com/gobuffalo/flect v1.0.2 => v1.0.3 Closes #12827 --- go.mod | 2 +- go.sum | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 353f3b872..129bbd291 100644 --- a/go.mod +++ b/go.mod @@ -34,7 +34,7 @@ require ( github.com/fsnotify/fsnotify v1.7.0 github.com/getkin/kin-openapi v0.123.0 github.com/ghodss/yaml v1.0.0 - github.com/gobuffalo/flect v1.0.2 + github.com/gobuffalo/flect v1.0.3 github.com/gobwas/glob v0.2.3 github.com/gohugoio/go-i18n/v2 v2.1.3-0.20230805085216-e63c13218d0e github.com/gohugoio/hashstructure v0.1.0 diff --git a/go.sum b/go.sum index 77c8f8849..1ed247307 100644 --- a/go.sum +++ b/go.sum @@ -133,8 +133,6 @@ github.com/bep/godartsass v1.2.0 h1:E2VvQrxAHAFwbjyOIExAMmogTItSKodoKuijNrGm5yU= github.com/bep/godartsass v1.2.0/go.mod h1:6LvK9RftsXMxGfsA0LDV12AGc4Jylnu6NgHL+Q5/pE8= github.com/bep/godartsass/v2 v2.1.0 h1:fq5Y1xYf4diu4tXABiekZUCA+5l/dmNjGKCeQwdy+s0= github.com/bep/godartsass/v2 v2.1.0/go.mod h1:AcP8QgC+OwOXEq6im0WgDRYK7scDsmZCEW62o1prQLo= -github.com/bep/golibsass v1.1.1 h1:xkaet75ygImMYjM+FnHIT3xJn7H0xBA9UxSOJjk8Khw= -github.com/bep/golibsass v1.1.1/go.mod h1:DL87K8Un/+pWUS75ggYv41bliGiolxzDKWJAq3eJ1MA= github.com/bep/golibsass v1.2.0 h1:nyZUkKP/0psr8nT6GR2cnmt99xS93Ji82ZD9AgOK6VI= github.com/bep/golibsass v1.2.0/go.mod h1:DL87K8Un/+pWUS75ggYv41bliGiolxzDKWJAq3eJ1MA= github.com/bep/gowebp v0.3.0 h1:MhmMrcf88pUY7/PsEhMgEP0T6fDUnRTMpN8OclDrbrY= @@ -225,8 +223,8 @@ github.com/go-openapi/swag v0.22.8 h1:/9RjDSQ0vbFR+NyjGMkFTsA1IA0fmhKSThmfGZjicb github.com/go-openapi/swag v0.22.8/go.mod h1:6QT22icPLEqAM/z/TChgb4WAveCHF92+2gF0CNjHpPI= github.com/go-test/deep v1.0.8 h1:TDsG77qcSprGbC6vTN8OuXp5g+J+b5Pcguhf7Zt61VM= github.com/go-test/deep v1.0.8/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= -github.com/gobuffalo/flect v1.0.2 h1:eqjPGSo2WmjgY2XlpGwo2NXgL3RucAKo4k4qQMNA5sA= -github.com/gobuffalo/flect v1.0.2/go.mod h1:A5msMlrHtLqh9umBSnvabjsMrCcCpAyzglnDvkbYKHs= +github.com/gobuffalo/flect v1.0.3 h1:xeWBM2nui+qnVvNM4S3foBhCAL2XgPU+a7FdpelbTq4= +github.com/gobuffalo/flect v1.0.3/go.mod h1:A5msMlrHtLqh9umBSnvabjsMrCcCpAyzglnDvkbYKHs= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/gohugoio/go-i18n/v2 v2.1.3-0.20230805085216-e63c13218d0e h1:QArsSubW7eDh8APMXkByjQWvuljwPGAGQpJEFn0F0wY= From 0ea796dad11e5d9f5b4c96a8e65f8272c9e4ccb5 Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Fri, 20 Sep 2024 13:13:02 -0700 Subject: [PATCH 016/526] tpl/compare: Use any data type for compare.Conditional condition Improves #5792 --- tpl/compare/compare.go | 4 ++-- tpl/compare/compare_test.go | 34 ++++++++++++++++++++++++++++------ 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/tpl/compare/compare.go b/tpl/compare/compare.go index d6a764c6a..d32f3df95 100644 --- a/tpl/compare/compare.go +++ b/tpl/compare/compare.go @@ -231,8 +231,8 @@ func (n *Namespace) checkComparisonArgCount(min int, others ...any) bool { // Conditional can be used as a ternary operator. // // It returns v1 if cond is true, else v2. -func (n *Namespace) Conditional(cond bool, v1, v2 any) any { - if cond { +func (n *Namespace) Conditional(cond any, v1, v2 any) any { + if hreflect.IsTruthful(cond) { return v1 } return v2 diff --git a/tpl/compare/compare_test.go b/tpl/compare/compare_test.go index 6c3f43028..0ebebef4b 100644 --- a/tpl/compare/compare_test.go +++ b/tpl/compare/compare_test.go @@ -21,10 +21,9 @@ import ( "testing" "time" - "github.com/gohugoio/hugo/htesting/hqt" - qt "github.com/frankban/quicktest" "github.com/gohugoio/hugo/common/hugo" + "github.com/gohugoio/hugo/htesting/hqt" "github.com/spf13/cast" ) @@ -447,12 +446,35 @@ func TestTimeUnix(t *testing.T) { } func TestConditional(t *testing.T) { + t.Parallel() c := qt.New(t) - n := New(time.UTC, false) - a, b := "a", "b" + ns := New(time.UTC, false) - c.Assert(n.Conditional(true, a, b), qt.Equals, a) - c.Assert(n.Conditional(false, a, b), qt.Equals, b) + type args struct { + cond any + v1 any + v2 any + } + tests := []struct { + name string + args args + want any + }{ + {"a", args{cond: true, v1: "true", v2: "false"}, "true"}, + {"b", args{cond: false, v1: "true", v2: "false"}, "false"}, + {"c", args{cond: 1, v1: "true", v2: "false"}, "true"}, + {"d", args{cond: 0, v1: "true", v2: "false"}, "false"}, + {"e", args{cond: "foo", v1: "true", v2: "false"}, "true"}, + {"f", args{cond: "", v1: "true", v2: "false"}, "false"}, + {"g", args{cond: []int{6, 7}, v1: "true", v2: "false"}, "true"}, + {"h", args{cond: []int{}, v1: "true", v2: "false"}, "false"}, + {"i", args{cond: nil, v1: "true", v2: "false"}, "false"}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + c.Assert(ns.Conditional(tt.args.cond, tt.args.v1, tt.args.v2), qt.Equals, tt.want) + }) + } } // Issue 9462 From da72ac2db990d5acea98b0f02ef7c35966ed9167 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Fri, 27 Sep 2024 10:35:47 +0200 Subject: [PATCH 017/526] tailwind: Pin Tailwind 4 test to alpha 24 See #12880 --- .../cssjs/tailwindcss_integration_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/resource_transformers/cssjs/tailwindcss_integration_test.go b/resources/resource_transformers/cssjs/tailwindcss_integration_test.go index ddd78b62f..c6bffd81a 100644 --- a/resources/resource_transformers/cssjs/tailwindcss_integration_test.go +++ b/resources/resource_transformers/cssjs/tailwindcss_integration_test.go @@ -36,8 +36,8 @@ func TestTailwindV4Basic(t *testing.T) { "url": "https://github.com/bep/hugo-starter-tailwind-basic.git" }, "devDependencies": { - "@tailwindcss/cli": "^4.0.0-alpha.16", - "tailwindcss": "^4.0.0-alpha.16" + "@tailwindcss/cli": "4.0.0-alpha.24", + "tailwindcss": "4.0.0-alpha.24" }, "name": "hugo-starter-tailwind-basic", "version": "0.1.0" From 0d390d7eb8daa95d1e1ec2d97fea24d9e6740ee2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Fri, 27 Sep 2024 10:59:45 +0200 Subject: [PATCH 018/526] github: Trigger image workflow on release.published Updates #12753 --- .github/workflows/image.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/image.yml b/.github/workflows/image.yml index 114a0ca2a..be128d6fd 100644 --- a/.github/workflows/image.yml +++ b/.github/workflows/image.yml @@ -1,10 +1,8 @@ name: Build Docker image on: - push: - tags: - - "*" - workflow_dispatch: + release: + types: [published] permissions: packages: write From 578442f8923d624f2937d0c09acb1a6f93d5bba5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 19 Sep 2024 09:55:58 +0000 Subject: [PATCH 019/526] build(deps): bump golang.org/x/image from 0.19.0 to 0.20.0 Bumps [golang.org/x/image](https://github.com/golang/image) from 0.19.0 to 0.20.0. - [Commits](https://github.com/golang/image/compare/v0.19.0...v0.20.0) --- updated-dependencies: - dependency-name: golang.org/x/image 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 129bbd291..53bc16e38 100644 --- a/go.mod +++ b/go.mod @@ -75,11 +75,11 @@ require ( go.uber.org/automaxprocs v1.5.3 gocloud.dev v0.39.0 golang.org/x/exp v0.0.0-20221031165847-c99f073a8326 - golang.org/x/image v0.19.0 + golang.org/x/image v0.20.0 golang.org/x/mod v0.19.0 golang.org/x/net v0.28.0 golang.org/x/sync v0.8.0 - golang.org/x/text v0.17.0 + golang.org/x/text v0.18.0 golang.org/x/tools v0.23.0 google.golang.org/api v0.191.0 gopkg.in/yaml.v2 v2.4.0 diff --git a/go.sum b/go.sum index 1ed247307..513b2065e 100644 --- a/go.sum +++ b/go.sum @@ -526,8 +526,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.19.0 h1:D9FX4QWkLfkeqaC62SonffIIuYdOk/UE2XKUBgRIBIQ= -golang.org/x/image v0.19.0/go.mod h1:y0zrRqlQRWQ5PXaYCOMLTW2fpsxZ8Qh9I/ohnInJEys= +golang.org/x/image v0.20.0 h1:7cVCUjQwfL18gyBJOmYvptfSHS8Fb3YUDtfLIZ7Nbpw= +golang.org/x/image v0.20.0/go.mod h1:0a88To4CYVBAHp5FXJm8o7QbUl37Vd85ply1vyD8auM= 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= @@ -692,8 +692,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.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc= -golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= 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 4c02a52f7c4de651394d01ff4d57d0d380c7b81a Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Mon, 23 Sep 2024 14:53:07 -0700 Subject: [PATCH 020/526] resources/page: Validate predefined front matter dates Closes #10717 --- hugolib/content_map_test.go | 45 ++++++++++----------- hugolib/page__meta.go | 1 + resources/page/pagemeta/page_frontmatter.go | 5 ++- 3 files changed, 27 insertions(+), 24 deletions(-) diff --git a/hugolib/content_map_test.go b/hugolib/content_map_test.go index 80a336f0a..bf9920071 100644 --- a/hugolib/content_map_test.go +++ b/hugolib/content_map_test.go @@ -28,8 +28,8 @@ func TestContentMapSite(t *testing.T) { pageTempl := ` --- title: "Page %d" -date: "2019-06-0%d" -lastMod: "2019-06-0%d" +date: "2019-06-%02d" +lastMod: "2019-06-%02d" categories: [%q] --- @@ -55,7 +55,6 @@ draft: true title: "Hugo Home" cascade: description: "Common Description" - --- Home Content. @@ -64,24 +63,24 @@ Home Content. b.WithContent("blog/page1.md", createPage(1)) b.WithContent("blog/page2.md", createPage(2)) b.WithContent("blog/page3.md", createPage(3)) - b.WithContent("blog/bundle/index.md", createPage(12)) + b.WithContent("blog/bundle/index.md", createPage(4)) b.WithContent("blog/bundle/data.json", "data") - b.WithContent("blog/bundle/page.md", createPage(99)) - b.WithContent("blog/subsection/_index.md", createPage(3)) + b.WithContent("blog/bundle/page.md", createPage(5)) + b.WithContent("blog/subsection/_index.md", createPage(6)) b.WithContent("blog/subsection/subdata.json", "data") - b.WithContent("blog/subsection/page4.md", createPage(8)) - b.WithContent("blog/subsection/page5.md", createPage(10)) + b.WithContent("blog/subsection/page4.md", createPage(7)) + b.WithContent("blog/subsection/page5.md", createPage(8)) b.WithContent("blog/subsection/draft/index.md", draftTemplate) b.WithContent("blog/subsection/draft/data.json", "data") b.WithContent("blog/draftsection/_index.md", draftTemplate) - b.WithContent("blog/draftsection/page/index.md", createPage(12)) + b.WithContent("blog/draftsection/page/index.md", createPage(9)) b.WithContent("blog/draftsection/page/folder/data.json", "data") - b.WithContent("blog/draftsection/sub/_index.md", createPage(12)) - b.WithContent("blog/draftsection/sub/page.md", createPage(13)) - b.WithContent("docs/page6.md", createPage(11)) - b.WithContent("tags/_index.md", createPageInCategory(32, "sad")) - b.WithContent("overlap/_index.md", createPageInCategory(33, "sad")) - b.WithContent("overlap2/_index.md", createPage(34)) + b.WithContent("blog/draftsection/sub/_index.md", createPage(10)) + b.WithContent("blog/draftsection/sub/page.md", createPage(11)) + b.WithContent("docs/page6.md", createPage(12)) + b.WithContent("tags/_index.md", createPageInCategory(13, "sad")) + b.WithContent("overlap/_index.md", createPageInCategory(14, "sad")) + b.WithContent("overlap2/_index.md", createPage(15)) b.WithTemplatesAdded("layouts/index.html", ` Num Regular: {{ len .Site.RegularPages }}|{{ range .Site.RegularPages }}{{ .RelPermalink }}|{{ end }}$ @@ -118,7 +117,7 @@ Pages: {{ range $blog.Pages }}{{ .RelPermalink }}|{{ end }} Sections: {{ range $home.Sections }}{{ .RelPermalink }}|{{ end }}:END Categories: {{ range .Site.Taxonomies.categories }}{{ .Page.RelPermalink }}; {{ .Page.Title }}; {{ .Count }}|{{ end }}:END Category Terms: {{ $categories.Kind}}: {{ range $categories.Data.Terms.Alphabetical }}{{ .Page.RelPermalink }}; {{ .Page.Title }}; {{ .Count }}|{{ end }}:END -Category Funny: {{ $funny.Kind}}; {{ $funny.Data.Term }}: {{ range $funny.Pages }}{{ .RelPermalink }};|{{ end }}:END +Category Funny: {{ $funny.Kind}}; {{ $funny.Data.Term }}: {{ range $funny.Pages }}{{ .RelPermalink }}|{{ end }}:END Pag Num Pages: {{ len .Paginator.Pages }} Pag Blog Num Pages: {{ len $blog.Paginator.Pages }} Blog Num RegularPages: {{ len $blog.RegularPages }}|{{ range $blog.RegularPages }}P: {{ .RelPermalink }}|{{ end }} @@ -142,11 +141,11 @@ Draft5: {{ if (.Site.GetPage "blog/draftsection/sub/page") }}FOUND{{ end }}| Main Sections: [blog] Pag Num Pages: 9 - Home: Hugo Home|/|2019-06-08|Current Section: /|Resources: - Blog Section: Blogs|/blog/|2019-06-08|Current Section: /blog|Resources: - Blog Sub Section: Page 3|/blog/subsection/|2019-06-03|Current Section: /blog/subsection|Resources: application: /blog/subsection/subdata.json| + Home: Hugo Home|/|2019-06-15|Current Section: /|Resources: + Blog Section: Blogs|/blog/|2019-06-11|Current Section: /blog|Resources: + Blog Sub Section: Page 6|/blog/subsection/|2019-06-06|Current Section: /blog/subsection|Resources: application: /blog/subsection/subdata.json| Page: Page 1|/blog/page1/|2019-06-01|Current Section: /blog|Resources: - Bundle: Page 12|/blog/bundle/|0001-01-01|Current Section: /blog|Resources: application: /blog/bundle/data.json|page: | + Bundle: Page 4|/blog/bundle/|2019-06-04|Current Section: /blog|Resources: application: /blog/bundle/data.json|page: | IsDescendant: true: true true: true true: true true: true true: true false: false false: false IsAncestor: true: true true: true true: true true: true true: true true: true false: false false: false false: false false: false IsDescendant overlap1: false: false @@ -157,11 +156,11 @@ Draft5: {{ if (.Site.GetPage "blog/draftsection/sub/page") }}FOUND{{ end }}| InSection: true: true false: false Next: /blog/page3/ NextInSection: /blog/page3/ - Pages: /blog/page3/|/blog/subsection/|/blog/page2/|/blog/page1/|/blog/bundle/| - Sections: /blog/|/docs/|/overlap/|/overlap2/|:END + Pages: /blog/subsection/|/blog/bundle/|/blog/page3/|/blog/page2/|/blog/page1/| + Sections: /overlap2/|/overlap/|/docs/|/blog/|:END Categories: /categories/funny/; Funny; 12|/categories/sad/; Sad; 2|:END Category Terms: taxonomy: /categories/funny/; Funny; 12|/categories/sad/; Sad; 2|:END - Category Funny: term; funny: /blog/subsection/page4/;|/blog/page3/;|/blog/subsection/;|/blog/page2/;|/blog/page1/;|/blog/subsection/page5/;|/docs/page6/;|/blog/bundle/;|/blog/draftsection/page/;|/blog/draftsection/sub/;|/blog/draftsection/sub/page/;|/overlap2/;|:END + Category Funny: term; funny: /overlap2/|/docs/page6/|/blog/draftsection/sub/page/|/blog/draftsection/sub/|/blog/draftsection/page/|/blog/subsection/page5/|/blog/subsection/page4/|/blog/subsection/|/blog/bundle/|/blog/page3/|/blog/page2/|/blog/page1/|:END Pag Num Pages: 9 Pag Blog Num Pages: 4 Blog Num RegularPages: 4 diff --git a/hugolib/page__meta.go b/hugolib/page__meta.go index 56e26ecdb..97a716b43 100644 --- a/hugolib/page__meta.go +++ b/hugolib/page__meta.go @@ -425,6 +425,7 @@ func (p *pageState) setMetaPostParams() error { ModTime: mtime, GitAuthorDate: gitAuthorDate, Location: langs.GetLocation(pm.s.Language()), + PathOrTitle: p.pathOrTitle(), } // Handle the date separately diff --git a/resources/page/pagemeta/page_frontmatter.go b/resources/page/pagemeta/page_frontmatter.go index 0e0650934..9491bf1bc 100644 --- a/resources/page/pagemeta/page_frontmatter.go +++ b/resources/page/pagemeta/page_frontmatter.go @@ -330,6 +330,9 @@ type FrontMatterDescriptor struct { // if page is a leaf bundle, the bundle folder name (ContentBaseName). BaseFilename string + // The Page's path if the page is backed by a file, else its title. + PathOrTitle string + // The content file's mod time. ModTime time.Time @@ -736,7 +739,7 @@ func (f *frontmatterFieldHandlers) newDateFieldHandler(key string, setter func(d var err error date, err = htime.ToTimeInDefaultLocationE(v, d.Location) if err != nil { - return false, nil + return false, fmt.Errorf("invalid front matter: %s: %s: see %s", key, v, d.PathOrTitle) } d.PageConfig.Params[key] = date } From e56ea406664ab237bc37542f9f98edbeedc18e4f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 27 Sep 2024 09:08:42 +0000 Subject: [PATCH 021/526] build(deps): bump golang.org/x/net from 0.28.0 to 0.29.0 Bumps [golang.org/x/net](https://github.com/golang/net) from 0.28.0 to 0.29.0. - [Commits](https://github.com/golang/net/compare/v0.28.0...v0.29.0) --- updated-dependencies: - dependency-name: golang.org/x/net 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 53bc16e38..5a17aa5cf 100644 --- a/go.mod +++ b/go.mod @@ -77,7 +77,7 @@ require ( golang.org/x/exp v0.0.0-20221031165847-c99f073a8326 golang.org/x/image v0.20.0 golang.org/x/mod v0.19.0 - golang.org/x/net v0.28.0 + golang.org/x/net v0.29.0 golang.org/x/sync v0.8.0 golang.org/x/text v0.18.0 golang.org/x/tools v0.23.0 @@ -154,9 +154,9 @@ require ( go.opentelemetry.io/otel v1.28.0 // indirect go.opentelemetry.io/otel/metric v1.28.0 // indirect go.opentelemetry.io/otel/trace v1.28.0 // indirect - golang.org/x/crypto v0.26.0 // indirect + golang.org/x/crypto v0.27.0 // indirect golang.org/x/oauth2 v0.22.0 // indirect - golang.org/x/sys v0.24.0 // indirect + golang.org/x/sys v0.25.0 // indirect golang.org/x/time v0.6.0 // indirect golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9 // indirect google.golang.org/genproto v0.0.0-20240812133136-8ffd90a71988 // indirect diff --git a/go.sum b/go.sum index 513b2065e..17c3db86c 100644 --- a/go.sum +++ b/go.sum @@ -509,8 +509,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.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw= -golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54= +golang.org/x/crypto v0.27.0 h1:GXm2NjJrPaiv/h1tb2UH8QfgC/hOf/+z0p6PT8o1w7A= +golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70= 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= @@ -595,8 +595,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.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE= -golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= 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= @@ -672,8 +672,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.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg= -golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= +golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 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 47b055589cc8fdb575cb2ee779168aa1ce84e35d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 20 Sep 2024 08:02:05 +0000 Subject: [PATCH 022/526] build(deps): bump github.com/bep/helpers from 0.4.0 to 0.5.0 Bumps [github.com/bep/helpers](https://github.com/bep/helpers) from 0.4.0 to 0.5.0. - [Release notes](https://github.com/bep/helpers/releases) - [Commits](https://github.com/bep/helpers/compare/v0.4.0...v0.5.0) --- updated-dependencies: - dependency-name: github.com/bep/helpers 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 5a17aa5cf..5662cda59 100644 --- a/go.mod +++ b/go.mod @@ -14,7 +14,7 @@ require ( github.com/bep/godartsass/v2 v2.1.0 github.com/bep/golibsass v1.2.0 github.com/bep/gowebp v0.3.0 - github.com/bep/helpers v0.4.0 + github.com/bep/helpers v0.5.0 github.com/bep/imagemeta v0.8.1 github.com/bep/lazycache v0.4.0 github.com/bep/logg v0.4.0 diff --git a/go.sum b/go.sum index 17c3db86c..d5d0acf91 100644 --- a/go.sum +++ b/go.sum @@ -137,8 +137,8 @@ github.com/bep/golibsass v1.2.0 h1:nyZUkKP/0psr8nT6GR2cnmt99xS93Ji82ZD9AgOK6VI= github.com/bep/golibsass v1.2.0/go.mod h1:DL87K8Un/+pWUS75ggYv41bliGiolxzDKWJAq3eJ1MA= 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.4.0 h1:ab9veaAiWY4ST48Oxp5usaqivDmYdB744fz+tcZ3Ifs= -github.com/bep/helpers v0.4.0/go.mod h1:/QpHdmcPagDw7+RjkLFCvnlUc8lQ5kg4KDrEkb2Yyco= +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.8.1 h1:tjZLPRftjxU7PTI87o5e5WKOFQ4S9S0engiP1OTpJTI= github.com/bep/imagemeta v0.8.1/go.mod h1:5piPAq5Qomh07m/dPPCLN3mDJyFusvUG7VwdRD/vX0s= github.com/bep/lazycache v0.4.0 h1:X8yVyWNVupPd4e1jV7efi3zb7ZV/qcjKQgIQ5aPbkYI= From 12c9ce34bb34247d5d750fcf79737308bd270e9d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 27 Sep 2024 11:02:06 +0000 Subject: [PATCH 023/526] build(deps): bump golang.org/x/mod from 0.19.0 to 0.21.0 Bumps [golang.org/x/mod](https://github.com/golang/mod) from 0.19.0 to 0.21.0. - [Commits](https://github.com/golang/mod/compare/v0.19.0...v0.21.0) --- updated-dependencies: - dependency-name: golang.org/x/mod 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 5662cda59..b049672bf 100644 --- a/go.mod +++ b/go.mod @@ -76,7 +76,7 @@ require ( gocloud.dev v0.39.0 golang.org/x/exp v0.0.0-20221031165847-c99f073a8326 golang.org/x/image v0.20.0 - golang.org/x/mod v0.19.0 + golang.org/x/mod v0.21.0 golang.org/x/net v0.29.0 golang.org/x/sync v0.8.0 golang.org/x/text v0.18.0 diff --git a/go.sum b/go.sum index d5d0acf91..17a2e2708 100644 --- a/go.sum +++ b/go.sum @@ -554,8 +554,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.19.0 h1:fEdghXQSo20giMthA7cd28ZC+jts4amQ3YMXiP5oMQ8= -golang.org/x/mod v0.19.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0= +golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= 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= From f30603c47f5205e30ef83c70419f57d7eb7175ab Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Fri, 27 Sep 2024 13:17:08 +0000 Subject: [PATCH 024/526] releaser: Bump versions for release of 0.135.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 21442b238..209136fba 100644 --- a/common/hugo/version_current.go +++ b/common/hugo/version_current.go @@ -19,5 +19,5 @@ var CurrentVersion = Version{ Major: 0, Minor: 135, PatchLevel: 0, - Suffix: "-DEV", + Suffix: "", } From d0dca656250d0a04f3a5051ec067022df4b37738 Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Fri, 27 Sep 2024 13:32:22 +0000 Subject: [PATCH 025/526] releaser: Prepare repository for 0.136.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 209136fba..dee1e710e 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: 135, + Minor: 136, PatchLevel: 0, - Suffix: "", + Suffix: "-DEV", } diff --git a/hugoreleaser.env b/hugoreleaser.env index b5ebdc174..ce37f346c 100644 --- a/hugoreleaser.env +++ b/hugoreleaser.env @@ -1,7 +1,8 @@ # Release env. # These will be replaced by script before release. -HUGORELEASER_TAG=v0.134.3 -HUGORELEASER_COMMITISH=5fb333b9f5ff4ec018f9d78910177d0bec1befb0 +HUGORELEASER_TAG=v0.135.0 +HUGORELEASER_COMMITISH=f30603c47f5205e30ef83c70419f57d7eb7175ab + From d1ba52f3c3bdc31c2067f986fdb57088d875c01e Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Sat, 28 Sep 2024 13:15:53 -0700 Subject: [PATCH 026/526] tests: Address deprecation warnings and errors --- .../allconfig/allconfig_integration_test.go | 26 +------------------ hugolib/config_test.go | 26 ++++++------------- hugolib/embedded_templates_test.go | 2 +- hugolib/hugo_sites_multihost_test.go | 4 ++- hugolib/hugo_smoke_test.go | 13 ++++++---- hugolib/paginator_test.go | 11 +++++--- hugolib/rebuild_test.go | 5 ++-- hugolib/securitypolicies_test.go | 12 ++++----- hugolib/shortcode_test.go | 5 ++-- hugolib/site_output_test.go | 15 +++++++---- hugolib/site_sections_test.go | 2 +- hugolib/site_stats_test.go | 4 ++- hugolib/site_url_test.go | 2 +- hugolib/taxonomy_test.go | 3 ++- hugolib/template_test.go | 6 ++--- hugolib/testhelpers_test.go | 10 ++++--- .../tocss/scss/scss_integration_test.go | 2 +- tpl/page/page_integration_test.go | 5 ++-- 18 files changed, 71 insertions(+), 82 deletions(-) diff --git a/config/allconfig/allconfig_integration_test.go b/config/allconfig/allconfig_integration_test.go index 7dc0d230e..debdff650 100644 --- a/config/allconfig/allconfig_integration_test.go +++ b/config/allconfig/allconfig_integration_test.go @@ -103,31 +103,7 @@ suffixes = ["html", "xhtml"] b.Assert(contentTypes.Markdown.Suffixes(), qt.DeepEquals, []string{"md", "mdown", "markdown"}) } -func TestPaginationConfigOld(t *testing.T) { - files := ` --- hugo.toml -- - [languages.en] - weight = 1 - paginatePath = "page-en" - - [languages.de] - weight = 2 - paginatePath = "page-de" - paginate = 20 -` - - b := hugolib.Test(t, files) - - confEn := b.H.Sites[0].Conf.Pagination() - confDe := b.H.Sites[1].Conf.Pagination() - - b.Assert(confEn.Path, qt.Equals, "page-en") - b.Assert(confEn.PagerSize, qt.Equals, 10) - b.Assert(confDe.Path, qt.Equals, "page-de") - b.Assert(confDe.PagerSize, qt.Equals, 20) -} - -func TestPaginationConfigNew(t *testing.T) { +func TestPaginationConfig(t *testing.T) { files := ` -- hugo.toml -- [languages.en] diff --git a/hugolib/config_test.go b/hugolib/config_test.go index aaba534f5..c9db0d2f0 100644 --- a/hugolib/config_test.go +++ b/hugolib/config_test.go @@ -276,11 +276,13 @@ func TestLoadMultiConfig(t *testing.T) { // Add a random config variable for testing. // side = page in Norwegian. configContentBase := ` - Paginate = 32 - PaginatePath = "side" + [pagination] + pagerSize = 32 + path = "side" ` configContentSub := ` - PaginatePath = "top" + [pagination] + path = "top" ` mm := afero.NewMemMapFs() @@ -292,8 +294,8 @@ func TestLoadMultiConfig(t *testing.T) { c.Assert(err, qt.IsNil) cfg := all.Base - c.Assert(cfg.PaginatePath, qt.Equals, "top") - c.Assert(cfg.Paginate, qt.Equals, 32) + c.Assert(cfg.Pagination.Path, qt.Equals, "top") + c.Assert(cfg.Pagination.PagerSize, qt.Equals, 32) } func TestLoadConfigFromThemes(t *testing.T) { @@ -698,10 +700,6 @@ func TestHugoConfig(t *testing.T) { filesTemplate := ` -- hugo.toml -- theme = "mytheme" -[social] -twitter = "bepsays" -[author] -name = "bep" [params] rootparam = "rootvalue" -- config/_default/hugo.toml -- @@ -718,9 +716,6 @@ rootparam: {{ site.Params.rootparam }} rootconfigparam: {{ site.Params.rootconfigparam }} themeparam: {{ site.Params.themeparam }} themeconfigdirparam: {{ site.Params.themeconfigdirparam }} -social: {{ site.Social }} -author: {{ site.Author }} - ` @@ -744,8 +739,6 @@ author: {{ site.Author }} "rootconfigparam: rootconfigvalue", "themeparam: themevalue", "themeconfigdirparam: themeconfigdirvalue", - "social: map[twitter:bepsays]", - "author: map[name:bep]", ) }) } @@ -918,11 +911,9 @@ title: "My Swedish Section" -- layouts/index.html -- LanguageCode: {{ eq site.LanguageCode site.Language.LanguageCode }}|{{ site.Language.LanguageCode }}| {{ range $i, $e := (slice site .Site) }} -{{ $i }}|AllPages: {{ len .AllPages }}|Sections: {{ if .Sections }}true{{ end }}| Author: {{ .Authors }}|BuildDrafts: {{ .BuildDrafts }}|IsMultilingual: {{ .IsMultiLingual }}|Param: {{ .Language.Params.myparam }}|Language string: {{ .Language }}|Languages: {{ .Languages }} +{{ $i }}|AllPages: {{ len .AllPages }}|Sections: {{ if .Sections }}true{{ end }}|BuildDrafts: {{ .BuildDrafts }}|Param: {{ .Language.Params.myparam }}|Language string: {{ .Language }}|Languages: {{ .Languages }} {{ end }} - - ` b := NewIntegrationTestBuilder( IntegrationTestConfig{ @@ -940,7 +931,6 @@ AllPages: 4| Sections: true| Param: enParamValue Param: enParamValue -IsMultilingual: true LanguageCode: true|en-US| `) diff --git a/hugolib/embedded_templates_test.go b/hugolib/embedded_templates_test.go index d9575a45f..ec59751f3 100644 --- a/hugolib/embedded_templates_test.go +++ b/hugolib/embedded_templates_test.go @@ -100,7 +100,7 @@ func TestEmbeddedPaginationTemplate(t *testing.T) { test := func(variant string, expectedOutput string) { b := newTestSitesBuilder(t) - b.WithConfigFile("toml", `paginate = 1`) + b.WithConfigFile("toml", `pagination.pagerSize = 1`) b.WithContent( "s1/p01.md", "---\ntitle: p01\n---", "s1/p02.md", "---\ntitle: p02\n---", diff --git a/hugolib/hugo_sites_multihost_test.go b/hugolib/hugo_sites_multihost_test.go index ce3944a38..39504202b 100644 --- a/hugolib/hugo_sites_multihost_test.go +++ b/hugolib/hugo_sites_multihost_test.go @@ -11,12 +11,14 @@ func TestMultihost(t *testing.T) { files := ` -- hugo.toml -- -paginate = 1 defaultContentLanguage = "fr" defaultContentLanguageInSubdir = false staticDir = ["s1", "s2"] enableRobotsTXT = true +[pagination] +pagerSize = 1 + [permalinks] other = "/somewhere/else/:filename" diff --git a/hugolib/hugo_smoke_test.go b/hugolib/hugo_smoke_test.go index a4a5b7cbd..c43ba7293 100644 --- a/hugolib/hugo_smoke_test.go +++ b/hugolib/hugo_smoke_test.go @@ -107,10 +107,13 @@ func TestSmoke(t *testing.T) { baseURL = "https://example.com" title = "Smoke Site" rssLimit = 3 -paginate = 1 defaultContentLanguage = "en" defaultContentLanguageInSubdir = true enableRobotsTXT = true + +[pagination] +pagerSize = 1 + [taxonomies] category = 'categories' tag = 'tags' @@ -434,10 +437,10 @@ func TestDataRace(t *testing.T) { --- title: "The Page" outputs: ["HTML", "JSON"] ---- +--- The content. - + ` @@ -450,10 +453,10 @@ The content. --- title: "The Home" outputs: ["HTML", "JSON", "CSV", "RSS"] ---- +--- The content. - + `) diff --git a/hugolib/paginator_test.go b/hugolib/paginator_test.go index fb592bed1..dcee6e38e 100644 --- a/hugolib/paginator_test.go +++ b/hugolib/paginator_test.go @@ -24,8 +24,10 @@ import ( func TestPaginator(t *testing.T) { configFile := ` baseURL = "https://example.com/foo/" -paginate = 3 -paginatepath = "thepage" + +[pagination] +pagerSize = 3 +path = "thepage" [languages.en] weight = 1 @@ -161,10 +163,11 @@ Len Pag: {{ len $pag.Pages }} func TestPaginatorNodePagesOnly(t *testing.T) { files := ` -- hugo.toml -- -paginate = 1 +[pagination] +pagerSize = 1 -- content/p1.md -- -- layouts/_default/single.html -- -Paginator: {{ .Paginator }} +Paginator: {{ .Paginator }} ` b, err := TestE(t, files) b.Assert(err, qt.IsNotNil) diff --git a/hugolib/rebuild_test.go b/hugolib/rebuild_test.go index 0db418ee1..2219fe812 100644 --- a/hugolib/rebuild_test.go +++ b/hugolib/rebuild_test.go @@ -559,7 +559,8 @@ baseURL = "https://example.com" disableKinds = ["term", "taxonomy"] disableLiveReload = true defaultContentLanguage = "nn" -paginate = 20 +[pagination] +pagerSize = 20 [security] enableInlineShortcodes = true [languages] @@ -1431,7 +1432,7 @@ title: "My Sect" --- title: "P%d" --- -P%d Content. +P%d Content. ` for i := 0; i < count; i++ { diff --git a/hugolib/securitypolicies_test.go b/hugolib/securitypolicies_test.go index 3ddda7d6a..facda80eb 100644 --- a/hugolib/securitypolicies_test.go +++ b/hugolib/securitypolicies_test.go @@ -123,7 +123,7 @@ func TestSecurityPolicies(t *testing.T) { c.Skip() } cb := func(b *sitesBuilder) { - b.WithTemplatesAdded("index.html", `{{ $scss := "body { color: #333; }" | resources.FromString "foo.scss" | resources.ToCSS (dict "transpiler" "dartsass") }}`) + b.WithTemplatesAdded("index.html", `{{ $scss := "body { color: #333; }" | resources.FromString "foo.scss" | css.Sass (dict "transpiler" "dartsass") }}`) } testVariant(c, cb, "") }) @@ -137,10 +137,10 @@ func TestSecurityPolicies(t *testing.T) { b.WithConfigFile("toml", ` [security] [security.exec] -allow="none" - +allow="none" + `) - b.WithTemplatesAdded("index.html", `{{ $scss := "body { color: #333; }" | resources.FromString "foo.scss" | resources.ToCSS (dict "transpiler" "dartsass") }}`) + b.WithTemplatesAdded("index.html", `{{ $scss := "body { color: #333; }" | resources.FromString "foo.scss" | css.Sass (dict "transpiler" "dartsass") }}`) } testVariant(c, cb, `(?s).*sass(-embedded)?" is not whitelisted in policy "security\.exec\.allow".*`) }) @@ -160,7 +160,7 @@ allow="none" httpTestVariant(c, `{{ $json := resources.GetRemote "%[1]s/fruits.json" }}{{ $json.Content }}`, `(?s).*is not whitelisted in policy "security\.http\.urls".*`, func(b *sitesBuilder) { b.WithConfigFile("toml", ` -[security] +[security] [security.http] urls="none" `) @@ -181,7 +181,7 @@ urls="none" httpTestVariant(c, `{{ $json := resources.GetRemote "%[1]s/fakejson.json" }}{{ $json.Content }}`, ``, func(b *sitesBuilder) { b.WithConfigFile("toml", ` -[security] +[security] [security.http] mediaTypes=["application/json"] diff --git a/hugolib/shortcode_test.go b/hugolib/shortcode_test.go index 21436d980..92812bf66 100644 --- a/hugolib/shortcode_test.go +++ b/hugolib/shortcode_test.go @@ -126,10 +126,11 @@ func TestShortcodeMultipleOutputFormats(t *testing.T) { siteConfig := ` baseURL = "http://example.com/blog" -paginate = 1 - disableKinds = ["section", "term", "taxonomy", "RSS", "sitemap", "robotsTXT", "404"] +[pagination] +pagerSize = 1 + [outputs] home = [ "HTML", "AMP", "Calendar" ] page = [ "HTML", "AMP", "JSON" ] diff --git a/hugolib/site_output_test.go b/hugolib/site_output_test.go index 3d95709c5..37ebce730 100644 --- a/hugolib/site_output_test.go +++ b/hugolib/site_output_test.go @@ -15,7 +15,6 @@ package hugolib import ( "fmt" - "html/template" "strings" "testing" @@ -45,11 +44,13 @@ func doTestSiteWithPageOutputs(t *testing.T, outputs []string) { siteConfig := ` baseURL = "http://example.com/blog" -paginate = 1 defaultContentLanguage = "en" disableKinds = ["section", "term", "taxonomy", "RSS", "sitemap", "robotsTXT", "404"] +[pagination] +pagerSize = 1 + [Taxonomies] tag = "tags" category = "categories" @@ -221,11 +222,13 @@ func TestRedefineRSSOutputFormat(t *testing.T) { siteConfig := ` baseURL = "http://example.com/blog" -paginate = 1 defaultContentLanguage = "en" disableKinds = ["page", "section", "term", "taxonomy", "sitemap", "robotsTXT", "404"] +[pagination] +pagerSize = 1 + [outputFormats] [outputFormats.RSS] mediatype = "application/rss" @@ -249,7 +252,7 @@ baseName = "feed" s := h.Sites[0] // Issue #3450 - c.Assert(s.RSSLink(), qt.Equals, template.URL("http://example.com/blog/feed.xml")) + c.Assert(s.Home().OutputFormats().Get("rss").Permalink(), qt.Equals, "http://example.com/blog/feed.xml") } // Issue #3614 @@ -257,11 +260,13 @@ func TestDotLessOutputFormat(t *testing.T) { siteConfig := ` baseURL = "http://example.com/blog" -paginate = 1 defaultContentLanguage = "en" disableKinds = ["page", "section", "term", "taxonomy", "sitemap", "robotsTXT", "404"] +[pagination] +pagerSize = 1 + [mediaTypes] [mediaTypes."text/nodot"] delimiter = "" diff --git a/hugolib/site_sections_test.go b/hugolib/site_sections_test.go index 7fa15fb66..0bf166092 100644 --- a/hugolib/site_sections_test.go +++ b/hugolib/site_sections_test.go @@ -115,7 +115,7 @@ PAG|{{ .Title }}|{{ $sect.InSection . }} {{ $sections := (.Site.GetPage "section" .Section).Sections.ByWeight }} `) - cfg.Set("paginate", 2) + cfg.Set("pagination.pagerSize", 2) th, configs := newTestHelperFromProvider(cfg, fs, t) diff --git a/hugolib/site_stats_test.go b/hugolib/site_stats_test.go index 7fd68ff44..da09ec368 100644 --- a/hugolib/site_stats_test.go +++ b/hugolib/site_stats_test.go @@ -32,9 +32,11 @@ func TestSiteStats(t *testing.T) { siteConfig := ` baseURL = "http://example.com/blog" -paginate = 1 defaultContentLanguage = "nn" +[pagination] +pagerSize = 1 + [languages] [languages.nn] languageName = "Nynorsk" diff --git a/hugolib/site_url_test.go b/hugolib/site_url_test.go index 8efaae3a2..29170118f 100644 --- a/hugolib/site_url_test.go +++ b/hugolib/site_url_test.go @@ -91,7 +91,7 @@ Do not go gentle into that good night. ` cfg, fs := newTestCfg() - cfg.Set("paginate", 1) + cfg.Set("pagination.pagerSize", 1) th, configs := newTestHelperFromProvider(cfg, fs, t) writeSource(t, fs, filepath.Join("content", "sect1", "_index.md"), fmt.Sprintf(st, "/ss1/")) diff --git a/hugolib/taxonomy_test.go b/hugolib/taxonomy_test.go index e96b82d39..26148dd1b 100644 --- a/hugolib/taxonomy_test.go +++ b/hugolib/taxonomy_test.go @@ -80,8 +80,9 @@ func doTestTaxonomiesWithAndWithoutContentFile(t *testing.T, uglyURLs bool) { baseURL = "http://example.com/blog" titleCaseStyle = "firstupper" uglyURLs = %t -paginate = 1 defaultContentLanguage = "en" +[pagination] +pagerSize = 1 [Taxonomies] tag = "tags" category = "categories" diff --git a/hugolib/template_test.go b/hugolib/template_test.go index a610b4d59..055d9593c 100644 --- a/hugolib/template_test.go +++ b/hugolib/template_test.go @@ -377,7 +377,7 @@ func TestTemplateFuncs(t *testing.T) { b := newTestSitesBuilder(t).WithDefaultMultiSiteConfig() homeTpl := `Site: {{ site.Language.Lang }} / {{ .Site.Language.Lang }} / {{ site.BaseURL }} -Sites: {{ site.Sites.First.Home.Language.Lang }} +Sites: {{ site.Sites.Default.Home.Language.Lang }} Hugo: {{ hugo.Generator }} ` @@ -460,7 +460,7 @@ complex: 80: 80 func TestPartialWithZeroedArgs(t *testing.T) { b := newTestSitesBuilder(t) b.WithTemplatesAdded("index.html", - ` + ` X{{ partial "retval" dict }}X X{{ partial "retval" slice }}X X{{ partial "retval" "" }}X @@ -696,7 +696,7 @@ func TestApplyWithNamespace(t *testing.T) { b.WithTemplates( "index.html", ` -{{ $b := slice " a " " b " " c" }} +{{ $b := slice " a " " b " " c" }} {{ $a := apply $b "strings.Trim" "." " " }} a: {{ $a }} `, diff --git a/hugolib/testhelpers_test.go b/hugolib/testhelpers_test.go index 746f4c26e..08eb21787 100644 --- a/hugolib/testhelpers_test.go +++ b/hugolib/testhelpers_test.go @@ -292,11 +292,13 @@ func (s *sitesBuilder) WithDefaultMultiSiteConfig() *sitesBuilder { defaultMultiSiteConfig := ` baseURL = "http://example.com/blog" -paginate = 1 disablePathToLower = true defaultContentLanguage = "en" defaultContentLanguageInSubdir = true +[pagination] +pagerSize = 1 + [permalinks] other = "/somewhere/else/:filename" @@ -324,7 +326,8 @@ plaque = "plaques" weight = 30 title = "På nynorsk" languageName = "Nynorsk" -paginatePath = "side" +[Languages.nn.pagination] +path = "side" [Languages.nn.Taxonomies] lag = "lag" [[Languages.nn.menu.main]] @@ -336,7 +339,8 @@ weight = 1 weight = 40 title = "På bokmål" languageName = "Bokmål" -paginatePath = "side" +[Languages.nb.pagination] +path = "side" [Languages.nb.Taxonomies] lag = "lag" ` + commonConfigSections diff --git a/resources/resource_transformers/tocss/scss/scss_integration_test.go b/resources/resource_transformers/tocss/scss/scss_integration_test.go index bd140cc88..10309ad20 100644 --- a/resources/resource_transformers/tocss/scss/scss_integration_test.go +++ b/resources/resource_transformers/tocss/scss/scss_integration_test.go @@ -396,7 +396,7 @@ h3 { {{ range $stylesheets }} - {{ with . | resources.ToCSS | fingerprint }} + {{ with . | css.Sass | fingerprint }} {{ end }} {{ end }} diff --git a/tpl/page/page_integration_test.go b/tpl/page/page_integration_test.go index 22f6323dd..0f48ecd28 100644 --- a/tpl/page/page_integration_test.go +++ b/tpl/page/page_integration_test.go @@ -29,8 +29,9 @@ func TestThatPageIsAvailableEverywhere(t *testing.T) { baseURL = 'http://example.com/' disableKinds = ["taxonomy", "term"] enableInlineShortcodes = true -paginate = 1 enableRobotsTXT = true +[pagination] +pagerSize = 1 LANG_CONFIG -- content/_index.md -- --- @@ -191,7 +192,7 @@ title: "P1" # Heading 1 -- layouts/shortcodes/toc.html -- -{{ page.TableOfContents }} +{{ page.TableOfContents }} -- layouts/_default/single.html -- {{ .Content }} ` From 1158e6307212fd3ff96f29db0baf79463e0c031e Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Sat, 28 Sep 2024 12:06:09 -0700 Subject: [PATCH 027/526] markup/goldmark: Change default cell alignment in table render hook Change the default table cell alignment from "left" to an empty string. Closes #12886 --- markup/goldmark/tables/tables.go | 2 +- markup/goldmark/tables/tables_integration_test.go | 6 +++--- .../templates/_default/_markup/render-table.html | 12 ++++++++++-- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/markup/goldmark/tables/tables.go b/markup/goldmark/tables/tables.go index 0aa6ee269..a7dfb8ee6 100644 --- a/markup/goldmark/tables/tables.go +++ b/markup/goldmark/tables/tables.go @@ -129,7 +129,7 @@ func (r *htmlRenderer) renderCell(w util.BufWriter, source []byte, node ast.Node case gast.AlignCenter: alignment = "center" default: - alignment = "left" + alignment = "" } cell := hooks.TableCell{Text: hstring.HTML(text), Alignment: alignment} diff --git a/markup/goldmark/tables/tables_integration_test.go b/markup/goldmark/tables/tables_integration_test.go index dadce5c81..85cf81c9d 100644 --- a/markup/goldmark/tables/tables_integration_test.go +++ b/markup/goldmark/tables/tables_integration_test.go @@ -32,7 +32,7 @@ title = true | Item | In Stock | Price | | :---------------- | :------: | ----: | | Python Hat | True | 23.99 | -| SQL **Hat** | True | 23.99 | +| SQL **Hat** | True | 23.99 | | Codecademy Tee | False | 19.99 | | Codecademy Hoodie | False | 42.99 | {.foo foo="bar"} @@ -65,8 +65,8 @@ Attributes: {{ .Attributes }}| ) b.AssertFileContent("public/p1/index.html", - "table-1-thead: 0: 0: left: Month| 1: left: Savings|$", - "table-1-tbody: 0: 0: left: January| 1: left: $250| 1: 0: left: February| 1: left: $80| 2: 0: left: March| 1: left: $420|$", + "table-1-thead: 0: 0: : Month| 1: : Savings|$", + "table-1-tbody: 0: 0: : January| 1: : $250| 1: 0: : February| 1: : $80| 2: 0: : March| 1: : $420|$", ) } diff --git a/tpl/tplimpl/embedded/templates/_default/_markup/render-table.html b/tpl/tplimpl/embedded/templates/_default/_markup/render-table.html index a0b0cc34d..5fdd79ddb 100644 --- a/tpl/tplimpl/embedded/templates/_default/_markup/render-table.html +++ b/tpl/tplimpl/embedded/templates/_default/_markup/render-table.html @@ -8,7 +8,11 @@ {{- range .THead }} {{- range . }} - + {{- .Text -}} {{- end }} @@ -19,7 +23,11 @@ {{- range .TBody }} {{- range . }} - + {{- .Text -}} {{- end }} From 0450d69fc6ec2e3369d106547b6e49c539081cdc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Mon, 30 Sep 2024 09:11:24 +0200 Subject: [PATCH 028/526] commands: Add "hugo build" as an alias for "hugo" Closes #11391 --- commands/commandeer.go | 16 ++++-- commands/commands.go | 33 ++++++++++++ docs/content/en/commands/hugo.md | 1 + docs/content/en/commands/hugo_build.md | 74 ++++++++++++++++++++++++++ testscripts/commands/gen.txt | 2 +- testscripts/commands/hugo_build.txt | 20 +++++++ 6 files changed, 142 insertions(+), 4 deletions(-) create mode 100644 docs/content/en/commands/hugo_build.md create mode 100644 testscripts/commands/hugo_build.txt diff --git a/commands/commandeer.go b/commands/commandeer.go index e8cde2114..841e8d81c 100644 --- a/commands/commandeer.go +++ b/commands/commandeer.go @@ -499,16 +499,26 @@ func (r *rootCommand) IsTestRun() bool { } func (r *rootCommand) Init(cd *simplecobra.Commandeer) error { + return r.initRootCommand("", cd) +} + +func (r *rootCommand) initRootCommand(subCommandName string, cd *simplecobra.Commandeer) error { cmd := cd.CobraCommand - cmd.Use = "hugo [flags]" - cmd.Short = "hugo builds your site" - cmd.Long = `hugo is the main command, used to build your Hugo site. + commandName := "hugo" + if subCommandName != "" { + commandName = subCommandName + } + cmd.Use = fmt.Sprintf("%s [flags]", commandName) + cmd.Short = fmt.Sprintf("%s builds your site", commandName) + cmd.Long = `COMMAND_NAME is the main command, used to build your Hugo site. Hugo is a Fast and Flexible Static Site Generator built with love by spf13 and friends in Go. Complete documentation is available at https://gohugo.io/.` + cmd.Long = strings.ReplaceAll(cmd.Long, "COMMAND_NAME", commandName) + // Configure persistent flags cmd.PersistentFlags().StringVarP(&r.source, "source", "s", "", "filesystem path to read files relative from") _ = cmd.MarkFlagDirname("source") diff --git a/commands/commands.go b/commands/commands.go index e21d743ab..10ab106e2 100644 --- a/commands/commands.go +++ b/commands/commands.go @@ -14,6 +14,8 @@ package commands import ( + "context" + "github.com/bep/simplecobra" ) @@ -21,6 +23,7 @@ import ( func newExec() (*simplecobra.Exec, error) { rootCmd := &rootCommand{ commands: []simplecobra.Commander{ + newHugoBuildCmd(), newVersionCmd(), newEnvCommand(), newServerCommand(), @@ -38,3 +41,33 @@ func newExec() (*simplecobra.Exec, error) { return simplecobra.New(rootCmd) } + +func newHugoBuildCmd() simplecobra.Commander { + return &hugoBuildCommand{} +} + +// hugoBuildCommand just delegates to the rootCommand. +type hugoBuildCommand struct { + rootCmd *rootCommand +} + +func (c *hugoBuildCommand) Commands() []simplecobra.Commander { + return nil +} + +func (c *hugoBuildCommand) Name() string { + return "build" +} + +func (c *hugoBuildCommand) Init(cd *simplecobra.Commandeer) error { + c.rootCmd = cd.Root.Command.(*rootCommand) + return c.rootCmd.initRootCommand("build", cd) +} + +func (c *hugoBuildCommand) PreRun(cd, runner *simplecobra.Commandeer) error { + return c.rootCmd.PreRun(cd, runner) +} + +func (c *hugoBuildCommand) Run(ctx context.Context, cd *simplecobra.Commandeer, args []string) error { + return c.rootCmd.Run(ctx, cd, args) +} diff --git a/docs/content/en/commands/hugo.md b/docs/content/en/commands/hugo.md index cfbe66053..badd6d7ea 100644 --- a/docs/content/en/commands/hugo.md +++ b/docs/content/en/commands/hugo.md @@ -70,6 +70,7 @@ hugo [flags] ### SEE ALSO +* [hugo build](/commands/hugo_build/) - build builds your site * [hugo completion](/commands/hugo_completion/) - Generate the autocompletion script for the specified shell * [hugo config](/commands/hugo_config/) - Print the site configuration * [hugo convert](/commands/hugo_convert/) - Convert your content to different formats diff --git a/docs/content/en/commands/hugo_build.md b/docs/content/en/commands/hugo_build.md new file mode 100644 index 000000000..72686cb9b --- /dev/null +++ b/docs/content/en/commands/hugo_build.md @@ -0,0 +1,74 @@ +--- +title: "hugo build" +slug: hugo_build +url: /commands/hugo_build/ +--- +## hugo build + +build builds your site + +### Synopsis + +build is the main command, used to build your Hugo site. + +Hugo is a Fast and Flexible Static Site Generator +built with love by spf13 and friends in Go. + +Complete documentation is available at https://gohugo.io/. + +``` +hugo build [flags] +``` + +### Options + +``` + -b, --baseURL string hostname (and path) to the root, e.g. https://spf13.com/ + -D, --buildDrafts include content marked as draft + -E, --buildExpired include expired content + -F, --buildFuture include content with publishdate in the future + --cacheDir string filesystem path to cache directory + --cleanDestinationDir remove files from destination not found in static directories + --clock string set the clock used by Hugo, e.g. --clock 2021-11-06T22:30:00.00+09:00 + --config string config file (default is hugo.yaml|json|toml) + --configDir string config dir (default "config") + -c, --contentDir string filesystem path to content directory + --debug debug output + -d, --destination string filesystem path to write files to + --disableKinds strings disable different kind of pages (home, RSS etc.) + --enableGitInfo add Git revision, date, author, and CODEOWNERS info to the pages + -e, --environment string build environment + --forceSyncStatic copy all files when static is changed. + --gc enable to run some cleanup tasks (remove unused cache files) after the build + -h, --help help for build + --ignoreCache ignores the cache directory + --ignoreVendorPaths string ignores any _vendor for module paths matching the given Glob pattern + -l, --layoutDir string filesystem path to layout directory + --logLevel string log level (debug|info|warn|error) + --minify minify any supported output format (HTML, XML etc.) + --noBuildLock don't create .hugo_build.lock file + --noChmod don't sync permission mode of files + --noTimes don't sync modification time of files + --panicOnWarning panic on first WARNING log + --poll string set this to a poll interval, e.g --poll 700ms, to use a poll based approach to watch for file system changes + --printI18nWarnings print missing translations + --printMemoryUsage print memory usage to screen at intervals + --printPathWarnings print warnings on duplicate target paths etc. + --printUnusedTemplates print warnings on unused templates. + --quiet build in quiet mode + --renderSegments strings named segments to render (configured in the segments config) + -M, --renderToMemory render to memory (mostly useful when running the server) + -s, --source string filesystem path to read files relative from + --templateMetrics display metrics about template executions + --templateMetricsHints calculate some improvement hints when combined with --templateMetrics + -t, --theme strings themes to use (located in /themes/THEMENAME/) + --themesDir string filesystem path to themes directory + --trace file write trace to file (not useful in general) + -v, --verbose verbose output + -w, --watch watch filesystem for changes and recreate as needed +``` + +### SEE ALSO + +* [hugo](/commands/hugo/) - hugo builds your site + diff --git a/testscripts/commands/gen.txt b/testscripts/commands/gen.txt index 22a936b41..16db9fe4a 100644 --- a/testscripts/commands/gen.txt +++ b/testscripts/commands/gen.txt @@ -1,6 +1,6 @@ # Test the gen commands. # Note that adding new commands will require updating the NUM_COMMANDS value. -env NUM_COMMANDS=43 +env NUM_COMMANDS=44 hugo gen -h stdout 'A collection of several useful generators\.' diff --git a/testscripts/commands/hugo_build.txt b/testscripts/commands/hugo_build.txt new file mode 100644 index 000000000..0bcbcba7a --- /dev/null +++ b/testscripts/commands/hugo_build.txt @@ -0,0 +1,20 @@ +# Test the hugo build command (alias for hugo) + +hugo build +stdout 'Pages.*|1' +stdout 'Total in' +checkfile public/index.html +checkfile public/p1/index.html +grep 'IsServer: false;IsProduction: true' public/index.html + +-- hugo.toml -- +baseURL = "http://example.org/" +disableKinds = ["RSS", "sitemap", "robotsTXT", "404", "taxonomy", "term"] +-- layouts/index.html -- +Home|IsServer: {{ hugo.IsServer }};IsProduction: {{ hugo.IsProduction }}| +-- layouts/_default/single.html -- +Title: {{ .Title }} +-- content/p1.md -- +--- +title: "P1" +--- From ab03588db95c885e30173fb23c3b69d3ed528201 Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Fri, 4 Oct 2024 18:10:51 -0700 Subject: [PATCH 029/526] resources/page: Improve front matter date validation Improve the error message and treat empty strings as zero dates. Closes #12898 --- resources/page/pagemeta/page_frontmatter.go | 4 +- .../pagemeta/pagemeta_integration_test.go | 53 +++++++++++++++++++ 2 files changed, 55 insertions(+), 2 deletions(-) diff --git a/resources/page/pagemeta/page_frontmatter.go b/resources/page/pagemeta/page_frontmatter.go index 9491bf1bc..686f0d44d 100644 --- a/resources/page/pagemeta/page_frontmatter.go +++ b/resources/page/pagemeta/page_frontmatter.go @@ -728,7 +728,7 @@ func (f *frontmatterFieldHandlers) newDateFieldHandler(key string, setter func(d return func(d *FrontMatterDescriptor) (bool, error) { v, found := d.PageConfig.Params[key] - if !found { + if !found || v == "" { return false, nil } @@ -739,7 +739,7 @@ func (f *frontmatterFieldHandlers) newDateFieldHandler(key string, setter func(d var err error date, err = htime.ToTimeInDefaultLocationE(v, d.Location) if err != nil { - return false, fmt.Errorf("invalid front matter: %s: %s: see %s", key, v, d.PathOrTitle) + return false, fmt.Errorf("the %q front matter field is not a parsable date: see %s", key, d.PathOrTitle) } d.PageConfig.Params[key] = date } diff --git a/resources/page/pagemeta/pagemeta_integration_test.go b/resources/page/pagemeta/pagemeta_integration_test.go index 4d195b7f0..9d8f1b92f 100644 --- a/resources/page/pagemeta/pagemeta_integration_test.go +++ b/resources/page/pagemeta/pagemeta_integration_test.go @@ -14,6 +14,7 @@ package pagemeta_test import ( + "strings" "testing" "github.com/gohugoio/hugo/hugolib" @@ -43,3 +44,55 @@ Lastmod: 2024-03-13 06:00:00 +0000 GMT Eq: true `) } + +func TestDateValidation(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +disableKinds = ['page','rss','section','sitemap','taxonomy','term'] +-- content/_index.md -- ++++ +date = DATE ++++ +-- layouts/index.html -- +{{ .Date.UTC.Format "2006-01-02" }} +-- +` + errorMsg := `ERROR the "date" front matter field is not a parsable date` + + // Valid (TOML) + f := strings.ReplaceAll(files, "DATE", "2024-10-01") + b := hugolib.Test(t, f) + b.AssertFileContent("public/index.html", "2024-10-01") + + // Valid (string) + f = strings.ReplaceAll(files, "DATE", `"2024-10-01"`) + b = hugolib.Test(t, f) + b.AssertFileContent("public/index.html", "2024-10-01") + + // Valid (empty string) + f = strings.ReplaceAll(files, "DATE", `""`) + b = hugolib.Test(t, f) + b.AssertFileContent("public/index.html", "0001-01-01") + + // Valid (int) + f = strings.ReplaceAll(files, "DATE", "0") + b = hugolib.Test(t, f) + b.AssertFileContent("public/index.html", "1970-01-01") + + // Invalid (string) + f = strings.ReplaceAll(files, "DATE", `"2024-42-42"`) + b, _ = hugolib.TestE(t, f) + b.AssertLogContains(errorMsg) + + // Invalid (bool) + f = strings.ReplaceAll(files, "DATE", "true") + b, _ = hugolib.TestE(t, f) + b.AssertLogContains(errorMsg) + + // Invalid (float) + f = strings.ReplaceAll(files, "DATE", "6.7") + b, _ = hugolib.TestE(t, f) + b.AssertLogContains(errorMsg) +} From 3f6830914837f6a0c253cb104ac8b091a2080acc Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Sun, 6 Oct 2024 11:02:19 -0700 Subject: [PATCH 030/526] resources/page: Treat null dates as zero dates Closes #12906 --- resources/page/pagemeta/page_frontmatter.go | 2 +- .../pagemeta/pagemeta_integration_test.go | 78 +++++++++++++++---- 2 files changed, 62 insertions(+), 18 deletions(-) diff --git a/resources/page/pagemeta/page_frontmatter.go b/resources/page/pagemeta/page_frontmatter.go index 686f0d44d..d5d612609 100644 --- a/resources/page/pagemeta/page_frontmatter.go +++ b/resources/page/pagemeta/page_frontmatter.go @@ -728,7 +728,7 @@ func (f *frontmatterFieldHandlers) newDateFieldHandler(key string, setter func(d return func(d *FrontMatterDescriptor) (bool, error) { v, found := d.PageConfig.Params[key] - if !found || v == "" { + if !found || v == "" || v == nil { return false, nil } diff --git a/resources/page/pagemeta/pagemeta_integration_test.go b/resources/page/pagemeta/pagemeta_integration_test.go index 9d8f1b92f..d0c550b2e 100644 --- a/resources/page/pagemeta/pagemeta_integration_test.go +++ b/resources/page/pagemeta/pagemeta_integration_test.go @@ -52,47 +52,91 @@ func TestDateValidation(t *testing.T) { -- hugo.toml -- disableKinds = ['page','rss','section','sitemap','taxonomy','term'] -- content/_index.md -- -+++ -date = DATE -+++ +FRONT_MATTER -- layouts/index.html -- {{ .Date.UTC.Format "2006-01-02" }} -- ` errorMsg := `ERROR the "date" front matter field is not a parsable date` - // Valid (TOML) - f := strings.ReplaceAll(files, "DATE", "2024-10-01") + // TOML: unquoted date/time (valid) + f := strings.ReplaceAll(files, "FRONT_MATTER", ` ++++ +date = 2024-10-01 ++++ + `) b := hugolib.Test(t, f) b.AssertFileContent("public/index.html", "2024-10-01") - // Valid (string) - f = strings.ReplaceAll(files, "DATE", `"2024-10-01"`) + // TOML: string (valid) + f = strings.ReplaceAll(files, "FRONT_MATTER", ` ++++ +date = "2024-10-01" ++++ + `) b = hugolib.Test(t, f) b.AssertFileContent("public/index.html", "2024-10-01") - // Valid (empty string) - f = strings.ReplaceAll(files, "DATE", `""`) + // TOML: empty string (valid) + f = strings.ReplaceAll(files, "FRONT_MATTER", ` ++++ +date = "" ++++ + `) b = hugolib.Test(t, f) b.AssertFileContent("public/index.html", "0001-01-01") - // Valid (int) - f = strings.ReplaceAll(files, "DATE", "0") + // TOML: int (valid) + f = strings.ReplaceAll(files, "FRONT_MATTER", ` ++++ +date = 0 ++++ + `) b = hugolib.Test(t, f) b.AssertFileContent("public/index.html", "1970-01-01") - // Invalid (string) - f = strings.ReplaceAll(files, "DATE", `"2024-42-42"`) + // TOML: string (invalid) + f = strings.ReplaceAll(files, "FRONT_MATTER", ` ++++ +date = "2024-42-42" ++++ + `) b, _ = hugolib.TestE(t, f) b.AssertLogContains(errorMsg) - // Invalid (bool) - f = strings.ReplaceAll(files, "DATE", "true") + // TOML: bool (invalid) + f = strings.ReplaceAll(files, "FRONT_MATTER", ` ++++ +date = true ++++ + `) b, _ = hugolib.TestE(t, f) b.AssertLogContains(errorMsg) - // Invalid (float) - f = strings.ReplaceAll(files, "DATE", "6.7") + // TOML: float (invalid) + f = strings.ReplaceAll(files, "FRONT_MATTER", ` ++++ +date = 6.7 ++++ + `) b, _ = hugolib.TestE(t, f) b.AssertLogContains(errorMsg) + + // JSON: null (valid) + f = strings.ReplaceAll(files, "FRONT_MATTER", ` +{ + "date": null +} + `) + b = hugolib.Test(t, f) + b.AssertFileContent("public/index.html", "0001-01-01") + + // YAML: null (valid) + f = strings.ReplaceAll(files, "FRONT_MATTER", ` +--- +date: +--- + `) + b = hugolib.Test(t, f) + b.AssertFileContent("public/index.html", "0001-01-01") } From 5b0b663ec321454c747fd58a4d0d8cc92e32a746 Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Sun, 6 Oct 2024 11:40:14 -0700 Subject: [PATCH 031/526] tailwind: Pin Tailwind 4 test to alpha 26 or later --- .../cssjs/tailwindcss_integration_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/resource_transformers/cssjs/tailwindcss_integration_test.go b/resources/resource_transformers/cssjs/tailwindcss_integration_test.go index c6bffd81a..c0d6d3dff 100644 --- a/resources/resource_transformers/cssjs/tailwindcss_integration_test.go +++ b/resources/resource_transformers/cssjs/tailwindcss_integration_test.go @@ -36,8 +36,8 @@ func TestTailwindV4Basic(t *testing.T) { "url": "https://github.com/bep/hugo-starter-tailwind-basic.git" }, "devDependencies": { - "@tailwindcss/cli": "4.0.0-alpha.24", - "tailwindcss": "4.0.0-alpha.24" + "@tailwindcss/cli": "^4.0.0-alpha.26", + "tailwindcss": "^4.0.0-alpha.26" }, "name": "hugo-starter-tailwind-basic", "version": "0.1.0" From ffb41d11118ab3a43f2ee42d9656fc46cb873828 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 Sep 2024 08:51:51 +0000 Subject: [PATCH 032/526] build(deps): bump github.com/hairyhenderson/go-codeowners Bumps [github.com/hairyhenderson/go-codeowners](https://github.com/hairyhenderson/go-codeowners) from 0.5.0 to 0.6.0. - [Release notes](https://github.com/hairyhenderson/go-codeowners/releases) - [Changelog](https://github.com/hairyhenderson/go-codeowners/blob/main/CHANGELOG.md) - [Commits](https://github.com/hairyhenderson/go-codeowners/compare/v0.5.0...v0.6.0) --- updated-dependencies: - dependency-name: github.com/hairyhenderson/go-codeowners 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 b049672bf..ee52e1e41 100644 --- a/go.mod +++ b/go.mod @@ -46,7 +46,7 @@ require ( github.com/gohugoio/testmodBuilder/mods v0.0.0-20190520184928-c56af20f2e95 github.com/google/go-cmp v0.6.0 github.com/gorilla/websocket v1.5.3 - github.com/hairyhenderson/go-codeowners v0.5.0 + github.com/hairyhenderson/go-codeowners v0.6.0 github.com/jdkato/prose v1.2.1 github.com/kylelemons/godebug v1.1.0 github.com/kyokomi/emoji/v2 v2.2.13 diff --git a/go.sum b/go.sum index 17a2e2708..06a32e97c 100644 --- a/go.sum +++ b/go.sum @@ -329,8 +329,8 @@ github.com/googleapis/gax-go/v2 v2.13.0/go.mod h1:Z/fvTZXF8/uw7Xu5GuslPw+bplx6SS 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= -github.com/hairyhenderson/go-codeowners v0.5.0 h1:dpQB+hVHiRc2VVvc2BHxkuM+tmu9Qej/as3apqUbsWc= -github.com/hairyhenderson/go-codeowners v0.5.0/go.mod h1:R3uW1OQXEj2Gu6/OvZ7bt6hr0qdkLvUWPiqNaWnexpo= +github.com/hairyhenderson/go-codeowners v0.6.0 h1:cRCtmNf9Ni1GIeiAAlHX5IEEB2gr61813Kx5JmXxAAk= +github.com/hairyhenderson/go-codeowners v0.6.0/go.mod h1:RFWbGcjlXhRKNezt7AQHmJucY0alk4osN0+RKOsIAa8= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= From bc6fc47727a39051786003cd7de4946b4736427e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 Sep 2024 08:51:59 +0000 Subject: [PATCH 033/526] build(deps): bump github.com/evanw/esbuild from 0.23.1 to 0.24.0 Bumps [github.com/evanw/esbuild](https://github.com/evanw/esbuild) from 0.23.1 to 0.24.0. - [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.23.1...v0.24.0) --- updated-dependencies: - dependency-name: github.com/evanw/esbuild 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 ee52e1e41..75b6300a9 100644 --- a/go.mod +++ b/go.mod @@ -27,7 +27,7 @@ require ( github.com/cli/safeexec v1.0.1 github.com/disintegration/gift v1.2.1 github.com/dustin/go-humanize v1.0.1 - github.com/evanw/esbuild v0.23.1 + github.com/evanw/esbuild v0.24.0 github.com/fatih/color v1.17.0 github.com/fortytw2/leaktest v1.3.0 github.com/frankban/quicktest v1.14.6 diff --git a/go.sum b/go.sum index 06a32e97c..7646f3cd4 100644 --- a/go.sum +++ b/go.sum @@ -189,8 +189,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.23.1 h1:ociewhY6arjTarKLdrXfDTgy25oxhTZmzP8pfuBTfTA= -github.com/evanw/esbuild v0.23.1/go.mod h1:D2vIQZqV/vIf/VRHtViaUtViZmG7o+kKmlBfVQuRi48= +github.com/evanw/esbuild v0.24.0 h1:GZ78naTLp7FKr+K7eNuM/SLs5maeiHYRPsTg6kmdsSE= +github.com/evanw/esbuild v0.24.0/go.mod h1:D2vIQZqV/vIf/VRHtViaUtViZmG7o+kKmlBfVQuRi48= github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4= github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= From 3223a65c9b56be98c96b995db995c0d37562a4e5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 Sep 2024 08:52:04 +0000 Subject: [PATCH 034/526] build(deps): bump github.com/rogpeppe/go-internal from 1.12.0 to 1.13.1 Bumps [github.com/rogpeppe/go-internal](https://github.com/rogpeppe/go-internal) from 1.12.0 to 1.13.1. - [Release notes](https://github.com/rogpeppe/go-internal/releases) - [Commits](https://github.com/rogpeppe/go-internal/compare/v1.12.0...v1.13.1) --- updated-dependencies: - dependency-name: github.com/rogpeppe/go-internal 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 75b6300a9..7898ac5f3 100644 --- a/go.mod +++ b/go.mod @@ -60,7 +60,7 @@ require ( github.com/olekukonko/tablewriter v0.0.5 github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 github.com/pelletier/go-toml/v2 v2.2.3 - github.com/rogpeppe/go-internal v1.12.0 + github.com/rogpeppe/go-internal v1.13.1 github.com/sanity-io/litter v1.5.5 github.com/spf13/afero v1.11.0 github.com/spf13/cast v1.7.0 diff --git a/go.sum b/go.sum index 7646f3cd4..55d9f8c7b 100644 --- a/go.sum +++ b/go.sum @@ -419,8 +419,8 @@ github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1: github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= -github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd h1:CmH9+J6ZSsIjUK3dcGsnCnO41eRBOnY12zwkn5qVwgc= From 9b635522e28e507c49e558e537157c932398981c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 10 Oct 2024 08:26:16 +0000 Subject: [PATCH 035/526] build(deps): bump golang.org/x/tools from 0.23.0 to 0.26.0 Bumps [golang.org/x/tools](https://github.com/golang/tools) from 0.23.0 to 0.26.0. - [Release notes](https://github.com/golang/tools/releases) - [Commits](https://github.com/golang/tools/compare/v0.23.0...v0.26.0) --- updated-dependencies: - dependency-name: golang.org/x/tools 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 7898ac5f3..e694a015a 100644 --- a/go.mod +++ b/go.mod @@ -77,10 +77,10 @@ require ( golang.org/x/exp v0.0.0-20221031165847-c99f073a8326 golang.org/x/image v0.20.0 golang.org/x/mod v0.21.0 - golang.org/x/net v0.29.0 + golang.org/x/net v0.30.0 golang.org/x/sync v0.8.0 - golang.org/x/text v0.18.0 - golang.org/x/tools v0.23.0 + golang.org/x/text v0.19.0 + golang.org/x/tools v0.26.0 google.golang.org/api v0.191.0 gopkg.in/yaml.v2 v2.4.0 ) @@ -154,9 +154,9 @@ require ( go.opentelemetry.io/otel v1.28.0 // indirect go.opentelemetry.io/otel/metric v1.28.0 // indirect go.opentelemetry.io/otel/trace v1.28.0 // indirect - golang.org/x/crypto v0.27.0 // indirect + golang.org/x/crypto v0.28.0 // indirect golang.org/x/oauth2 v0.22.0 // indirect - golang.org/x/sys v0.25.0 // indirect + golang.org/x/sys v0.26.0 // indirect golang.org/x/time v0.6.0 // indirect golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9 // indirect google.golang.org/genproto v0.0.0-20240812133136-8ffd90a71988 // indirect diff --git a/go.sum b/go.sum index 55d9f8c7b..cbe96a587 100644 --- a/go.sum +++ b/go.sum @@ -509,8 +509,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.27.0 h1:GXm2NjJrPaiv/h1tb2UH8QfgC/hOf/+z0p6PT8o1w7A= -golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70= +golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw= +golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U= 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= @@ -595,8 +595,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.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= -golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= +golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= +golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= 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= @@ -672,8 +672,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.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= -golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= +golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 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= @@ -692,8 +692,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.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= -golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= +golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= 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= @@ -751,8 +751,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.23.0 h1:SGsXPZ+2l4JsgaCKkx+FQ9YZ5XEtA1GZYuoDjenLjvg= -golang.org/x/tools v0.23.0/go.mod h1:pnu6ufv6vQkll6szChhK3C3L/ruaIv5eBeztNG8wtsI= +golang.org/x/tools v0.26.0 h1:v/60pFQmzmT9ExmjDv2gGIfi3OqfKoEP6I5+umXlbnQ= +golang.org/x/tools v0.26.0/go.mod h1:TPVVj70c7JJ3WCazhD8OdXcZg/og+b9+tH/KxylGwH0= 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 039845804fd545de18a3c4f17f8f7b3ad3bf615b Mon Sep 17 00:00:00 2001 From: Patrice Chalin Date: Sat, 12 Oct 2024 16:41:42 -0400 Subject: [PATCH 036/526] tpl/tplimpl: Trim descriptions rather than just chomp --- tpl/tplimpl/embedded/templates/opengraph.html | 4 ++-- tpl/tplimpl/embedded/templates/schema.html | 4 ++-- tpl/tplimpl/embedded/templates/twitter_cards.html | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/tpl/tplimpl/embedded/templates/opengraph.html b/tpl/tplimpl/embedded/templates/opengraph.html index 59e63d6be..9f40aedf0 100644 --- a/tpl/tplimpl/embedded/templates/opengraph.html +++ b/tpl/tplimpl/embedded/templates/opengraph.html @@ -8,8 +8,8 @@ {{- end }} -{{- with or .Description .Summary site.Params.description | plainify | htmlUnescape | chomp }} - +{{- with or .Description .Summary site.Params.description | plainify | htmlUnescape }} + {{- end }} {{- with or .Params.locale site.Language.LanguageCode }} diff --git a/tpl/tplimpl/embedded/templates/schema.html b/tpl/tplimpl/embedded/templates/schema.html index 2b3c5425a..36c01178b 100644 --- a/tpl/tplimpl/embedded/templates/schema.html +++ b/tpl/tplimpl/embedded/templates/schema.html @@ -2,8 +2,8 @@ {{- end }} -{{- with or .Description .Summary site.Params.description | plainify | htmlUnescape | chomp }} - +{{- with or .Description .Summary site.Params.description | plainify | htmlUnescape }} + {{- end }} {{- $ISO8601 := "2006-01-02T15:04:05-07:00" }} diff --git a/tpl/tplimpl/embedded/templates/twitter_cards.html b/tpl/tplimpl/embedded/templates/twitter_cards.html index 6f156c7a7..8af0e986c 100644 --- a/tpl/tplimpl/embedded/templates/twitter_cards.html +++ b/tpl/tplimpl/embedded/templates/twitter_cards.html @@ -10,8 +10,8 @@ {{- end }} -{{- with or .Description .Summary site.Params.description | plainify | htmlUnescape | chomp }} - +{{- with or .Description .Summary site.Params.description | plainify | htmlUnescape }} + {{- end }} {{- $twitterSite := "" }} From 4a79956276e735a4a21e09d134527b3a0247180d Mon Sep 17 00:00:00 2001 From: David Karlsson <35727626+dvdksn@users.noreply.github.com> Date: Sun, 29 Sep 2024 19:30:04 +0200 Subject: [PATCH 037/526] ci: Build multi-platform image with cross-compilation The previous build workflow used emulation to build the Docker image, which results in a somewhat complicated push-by-digest and merge workflow to create a multi-platform image. This commit changes the Docker build to use cross-compilation instead, resulting in a faster and more straightforward build. Signed-off-by: David Karlsson <35727626+dvdksn@users.noreply.github.com> --- .github/workflows/image.yml | 83 ++++--------------------------------- Dockerfile | 30 ++++++++++---- 2 files changed, 29 insertions(+), 84 deletions(-) diff --git a/.github/workflows/image.yml b/.github/workflows/image.yml index be128d6fd..95a4ad0b6 100644 --- a/.github/workflows/image.yml +++ b/.github/workflows/image.yml @@ -3,6 +3,7 @@ name: Build Docker image on: release: types: [published] + pull_request: permissions: packages: write @@ -12,18 +13,8 @@ env: jobs: build: runs-on: ubuntu-latest - strategy: - fail-fast: false - matrix: - platform: - - linux/amd64 - - linux/arm64 - steps: - - name: Prepare - run: | - platform=${{ matrix.platform }} - echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV + steps: - name: Checkout uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 @@ -33,9 +24,6 @@ jobs: with: images: ${{ env.REGISTRY_IMAGE }} - - name: Set up QEMU - uses: docker/setup-qemu-action@49b3bc8e6bdd4a60e6116a5414239cba5943d3cf # v3.2.0 - - name: Set up Docker Buildx uses: docker/setup-buildx-action@988b5a0280414f521da01fcc63a27aeeb4b104db # v3.6.1 @@ -47,69 +35,14 @@ jobs: username: ${{ github.repository_owner }} password: ${{ secrets.GITHUB_TOKEN }} - - name: Build and push by digest + - name: Build and push id: build uses: docker/build-push-action@16ebe778df0e7752d2cfcbd924afdbbd89c1a755 # v6.6.1 with: context: . - push: ${{ startsWith(github.ref, 'refs/tags') }} - platforms: ${{ matrix.platform }} + provenance: mode=max + sbom: true + push: ${{ github.event_name != 'pull_request' }} + platforms: linux/amd64,linux/arm64 + tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} - outputs: type=image,name=${{ env.REGISTRY_IMAGE }},push-by-digest=true,name-canonical=true,push=true - - - name: Export digest - run: | - mkdir -p /tmp/digests - digest="${{ steps.build.outputs.digest }}" - touch "/tmp/digests/${digest#sha256:}" - - - name: Upload digest - uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 - with: - name: digests-${{ env.PLATFORM_PAIR }} - path: /tmp/digests/* - if-no-files-found: error - retention-days: 1 - - merge: - runs-on: ubuntu-latest - needs: - - build - steps: - - name: Download digests - uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 - with: - path: /tmp/digests - pattern: digests-* - merge-multiple: true - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@988b5a0280414f521da01fcc63a27aeeb4b104db # v3.6.1 - - - name: Docker meta - id: meta - uses: docker/metadata-action@8e5442c4ef9f78752691e2d8f8d19755c6f78e81 # v5.5.1 - with: - images: ${{ env.REGISTRY_IMAGE }} - - flavor: | - latest=false - - - name: Login to GHCR - uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567 # v3.3.0 - with: - registry: ghcr.io - username: ${{ github.repository_owner }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Create manifest list and push - if: ${{ startsWith(github.ref, 'refs/tags') }} - working-directory: /tmp/digests - run: | - docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ - $(printf '${{ env.REGISTRY_IMAGE }}@sha256:%s ' *) - - - name: Inspect image - if: ${{ startsWith(github.ref, 'refs/tags') }} - run: | - docker buildx imagetools inspect ${{ env.REGISTRY_IMAGE }}:${{ steps.meta.outputs.version }} diff --git a/Dockerfile b/Dockerfile index fb72b77f1..afe5cf132 100755 --- a/Dockerfile +++ b/Dockerfile @@ -2,11 +2,17 @@ # Twitter: https://twitter.com/gohugoio # Website: https://gohugo.io/ -FROM golang:1.22.6-alpine AS build +FROM --platform=$BUILDPLATFORM tonistiigi/xx:1.5.0 AS xx + +FROM --platform=$BUILDPLATFORM golang:1.22.6-alpine AS build + +# Set up cross-compilation helpers +COPY --from=xx / / +RUN apk add clang lld # Optionally set HUGO_BUILD_TAGS to "extended" or "nodeploy" when building like so: # docker build --build-arg HUGO_BUILD_TAGS=extended . -ARG HUGO_BUILD_TAGS +ARG HUGO_BUILD_TAGS="none" ARG CGO=1 ENV CGO_ENABLED=${CGO} @@ -15,20 +21,26 @@ ENV GO111MODULE=on WORKDIR /go/src/github.com/gohugoio/hugo -COPY . /go/src/github.com/gohugoio/hugo/ +RUN --mount=src=go.mod,target=go.mod \ + --mount=src=go.sum,target=go.sum \ + --mount=type=cache,target=/go/pkg/mod \ + go mod download +ARG TARGETPLATFORM # gcc/g++ are required to build SASS libraries for extended version -RUN apk update && \ - apk add --no-cache gcc g++ musl-dev git && \ - go install github.com/magefile/mage - -RUN mage hugo && mage install +RUN xx-apk add --no-scripts --no-cache gcc g++ musl-dev git +RUN --mount=target=. \ + --mount=type=cache,target=/go/pkg/mod < Date: Wed, 9 Oct 2024 11:39:36 +0200 Subject: [PATCH 038/526] Upgrade to latest Go version + Some Docker image improvements (note) * Rename /site to /project * Add ldflags * Add go and node to the default image * Add Dart Sass to the default image * Build the extended version by default * Add "npm i" install support with custom entry script override * Adjust cache logic to speed up CGO rebuilds Closes #12920 See #12885 --- .circleci/config.yml | 4 +- Dockerfile | 98 +++++++++++++------ scripts/docker/entrypoint.sh | 21 ++++ scripts/docker/install_runtimedeps_default.sh | 20 ++++ 4 files changed, 111 insertions(+), 32 deletions(-) create mode 100755 scripts/docker/entrypoint.sh create mode 100755 scripts/docker/install_runtimedeps_default.sh diff --git a/.circleci/config.yml b/.circleci/config.yml index 0ff955936..6a82e96b7 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -4,7 +4,7 @@ parameters: defaults: &defaults resource_class: large docker: - - image: bepsays/ci-hugoreleaser:1.22300.20000 + - image: bepsays/ci-hugoreleaser:1.22300.20200 environment: &buildenv GOMODCACHE: /root/project/gomodcache version: 2 @@ -60,7 +60,7 @@ jobs: environment: <<: [*buildenv] docker: - - image: bepsays/ci-hugoreleaser-linux-arm64:1.22300.20000 + - image: bepsays/ci-hugoreleaser-linux-arm64:1.22300.20200 steps: - *restore-cache - &attach-workspace diff --git a/Dockerfile b/Dockerfile index afe5cf132..394133aed 100755 --- a/Dockerfile +++ b/Dockerfile @@ -2,56 +2,94 @@ # Twitter: https://twitter.com/gohugoio # Website: https://gohugo.io/ -FROM --platform=$BUILDPLATFORM tonistiigi/xx:1.5.0 AS xx +ARG GO_VERSION="1.23.2" +ARG ALPINE_VERSION=3.20 -FROM --platform=$BUILDPLATFORM golang:1.22.6-alpine AS build +FROM --platform=$BUILDPLATFORM tonistiigi/xx:1.5.0 AS xx +FROM --platform=$BUILDPLATFORM golang:${GO_VERSION}-alpine${ALPINE_VERSION} AS gobuild +FROM golang:${GO_VERSION}-alpine${ALPINE_VERSION} AS gorun + + +FROM gobuild AS build + +RUN apk add clang lld # Set up cross-compilation helpers COPY --from=xx / / -RUN apk add clang lld -# Optionally set HUGO_BUILD_TAGS to "extended" or "nodeploy" when building like so: -# docker build --build-arg HUGO_BUILD_TAGS=extended . -ARG HUGO_BUILD_TAGS="none" +ARG TARGETPLATFORM +RUN xx-apk add musl-dev gcc g++ -ARG CGO=1 -ENV CGO_ENABLED=${CGO} -ENV GOOS=linux -ENV GO111MODULE=on +# Optionally set HUGO_BUILD_TAGS to "none" or "nodeploy" when building like so: +# docker build --build-arg HUGO_BUILD_TAGS=nodeploy . +# +# We build the extended version by default. +ARG HUGO_BUILD_TAGS="extended" +ENV CGO_ENABLED=1 +ENV GOPROXY=https://proxy.golang.org +ENV GOCACHE=/root/.cache/go-build +ENV GOMODCACHE=/go/pkg/mod +ARG TARGETPLATFORM WORKDIR /go/src/github.com/gohugoio/hugo -RUN --mount=src=go.mod,target=go.mod \ - --mount=src=go.sum,target=go.sum \ - --mount=type=cache,target=/go/pkg/mod \ - go mod download - -ARG TARGETPLATFORM -# gcc/g++ are required to build SASS libraries for extended version -RUN xx-apk add --no-scripts --no-cache gcc g++ musl-dev git +# For --mount=type=cache the value of target is the default cache id, so +# for the go mod cache it would be good if we could share it with other Go images using the same setup, +# but the go build cache needs to be per platform. +# See this comment: https://github.com/moby/buildkit/issues/1706#issuecomment-702238282 RUN --mount=target=. \ - --mount=type=cache,target=/go/pkg/mod < Date: Sun, 13 Oct 2024 17:48:30 -0400 Subject: [PATCH 039/526] hugolib: Make .Site.Author deprecation warning clearer Fixes #12269 --- hugolib/site.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/hugolib/site.go b/hugolib/site.go index d0a3bd370..08031390b 100644 --- a/hugolib/site.go +++ b/hugolib/site.go @@ -511,20 +511,20 @@ func (s *Site) Params() maps.Params { // Deprecated: Use taxonomies instead. func (s *Site) Author() map[string]any { if len(s.conf.Author) != 0 { - hugo.Deprecate(".Site.Author", "Use taxonomies instead.", "v0.124.0") + hugo.Deprecate(".Site.Author", "Implement taxonomy 'author' or use .Site.Params.Author instead.", "v0.124.0") } return s.conf.Author } // Deprecated: Use taxonomies instead. func (s *Site) Authors() page.AuthorList { - hugo.Deprecate(".Site.Authors", "Use taxonomies instead.", "v0.124.0") + hugo.Deprecate(".Site.Authors", "Implement taxonomy 'authors' or use .Site.Params.Author instead.", "v0.124.0") return page.AuthorList{} } // Deprecated: Use .Site.Params instead. func (s *Site) Social() map[string]string { - hugo.Deprecate(".Site.Social", "Use .Site.Params instead.", "v0.124.0") + hugo.Deprecate(".Site.Social", "Implement taxonomy 'social' or use .Site.Params.Social instead.", "v0.124.0") return s.conf.Social } From 57151a5e911cd4a951925b231d67e62b19a54a47 Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Sat, 12 Oct 2024 12:11:08 -0700 Subject: [PATCH 040/526] create/skeletons: Honor --format flag when creating default archetype Closes #12666 --- create/skeletons/site/archetypes/default.md | 5 ----- create/skeletons/skeletons.go | 21 +++++++++++++++++++++ 2 files changed, 21 insertions(+), 5 deletions(-) delete mode 100644 create/skeletons/site/archetypes/default.md diff --git a/create/skeletons/site/archetypes/default.md b/create/skeletons/site/archetypes/default.md deleted file mode 100644 index c6f3fcef6..000000000 --- a/create/skeletons/site/archetypes/default.md +++ /dev/null @@ -1,5 +0,0 @@ -+++ -title = '{{ replace .File.ContentBaseName "-" " " | title }}' -date = {{ .Date }} -draft = true -+++ diff --git a/create/skeletons/skeletons.go b/create/skeletons/skeletons.go index aec79c149..802b15fb0 100644 --- a/create/skeletons/skeletons.go +++ b/create/skeletons/skeletons.go @@ -76,6 +76,11 @@ func CreateSite(createpath string, sourceFs afero.Fs, force bool, format string) return err } + err = newSiteCreateArchetype(sourceFs, createpath, format) + if err != nil { + return err + } + return copyFiles(createpath, sourceFs, siteFs) } @@ -109,3 +114,19 @@ func newSiteCreateConfig(fs afero.Fs, createpath string, format string) (err err return helpers.WriteToDisk(filepath.Join(createpath, "hugo."+format), &buf, fs) } + +func newSiteCreateArchetype(fs afero.Fs, createpath string, format string) (err error) { + in := map[string]any{ + "title": "{{ replace .File.ContentBaseName \"-\" \" \" | title }}", + "date": "{{ .Date }}", + "draft": true, + } + + var buf bytes.Buffer + err = parser.InterfaceToConfig(in, metadecoders.FormatFromString(format), &buf) + if err != nil { + return err + } + + return helpers.WriteToDisk(filepath.Join(createpath, "archetypes", "default.md"), &buf, fs) +} From ea633dd809233d9f59b605bfe1955bcc1417c3fe Mon Sep 17 00:00:00 2001 From: Akkuman Date: Sat, 12 Oct 2024 15:48:19 +0800 Subject: [PATCH 041/526] config: Fix uglyurls map parse Fixes #12926 --- config/allconfig/allconfig_integration_test.go | 18 ++++++++++++++++++ config/allconfig/alldecoders.go | 2 ++ 2 files changed, 20 insertions(+) diff --git a/config/allconfig/allconfig_integration_test.go b/config/allconfig/allconfig_integration_test.go index debdff650..1b677884f 100644 --- a/config/allconfig/allconfig_integration_test.go +++ b/config/allconfig/allconfig_integration_test.go @@ -160,3 +160,21 @@ title: "p3" b.AssertFileExists("public/page/1/index.html", false) b.AssertFileContent("public/page/2/index.html", "pagination-default") } + + +func TestMapUglyURLs(t *testing.T) { + files := ` +-- hugo.toml -- +[uglyurls] + posts = true +` + + b := hugolib.Test(t, files) + + c := b.H.Configs.Base + + mapUglyURLs, isMap := c.UglyURLs.(map[string]bool) + + b.Assert(isMap, qt.Equals, true) + b.Assert(mapUglyURLs["posts"], qt.Equals, true) +} diff --git a/config/allconfig/alldecoders.go b/config/allconfig/alldecoders.go index 45cdd0de6..60e571999 100644 --- a/config/allconfig/alldecoders.go +++ b/config/allconfig/alldecoders.go @@ -419,6 +419,8 @@ var allDecoderSetups = map[string]decodeWeight{ p.c.UglyURLs = vv case string: p.c.UglyURLs = vv == "true" + case maps.Params: + p.c.UglyURLs = cast.ToStringMapBool(maps.CleanConfigStringMap(vv)) default: p.c.UglyURLs = cast.ToStringMapBool(v) } From 21366e04111592a585a2c6754c00b84ab5048a13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Mon, 14 Oct 2024 09:28:18 +0200 Subject: [PATCH 042/526] config: Imrove uglyurls section test Updates #12926 --- config/allconfig/allconfig_integration_test.go | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/config/allconfig/allconfig_integration_test.go b/config/allconfig/allconfig_integration_test.go index 1b677884f..38e763b70 100644 --- a/config/allconfig/allconfig_integration_test.go +++ b/config/allconfig/allconfig_integration_test.go @@ -161,7 +161,6 @@ title: "p3" b.AssertFileContent("public/page/2/index.html", "pagination-default") } - func TestMapUglyURLs(t *testing.T) { files := ` -- hugo.toml -- @@ -173,8 +172,6 @@ func TestMapUglyURLs(t *testing.T) { c := b.H.Configs.Base - mapUglyURLs, isMap := c.UglyURLs.(map[string]bool) - - b.Assert(isMap, qt.Equals, true) - b.Assert(mapUglyURLs["posts"], qt.Equals, true) + b.Assert(c.C.IsUglyURLSection("posts"), qt.IsTrue) + b.Assert(c.C.IsUglyURLSection("blog"), qt.IsFalse) } From 05bbd2c51549bb0d229347861829b8285f7065e2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Oct 2024 08:43:12 +0000 Subject: [PATCH 043/526] build(deps): bump github.com/yuin/goldmark-emoji from 1.0.3 to 1.0.4 Bumps [github.com/yuin/goldmark-emoji](https://github.com/yuin/goldmark-emoji) from 1.0.3 to 1.0.4. - [Release notes](https://github.com/yuin/goldmark-emoji/releases) - [Commits](https://github.com/yuin/goldmark-emoji/compare/v1.0.3...v1.0.4) --- updated-dependencies: - dependency-name: github.com/yuin/goldmark-emoji 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 e694a015a..bc9aba3bc 100644 --- a/go.mod +++ b/go.mod @@ -71,7 +71,7 @@ require ( github.com/tdewolff/parse/v2 v2.7.15 github.com/tetratelabs/wazero v1.8.0 github.com/yuin/goldmark v1.7.4 - github.com/yuin/goldmark-emoji v1.0.3 + github.com/yuin/goldmark-emoji v1.0.4 go.uber.org/automaxprocs v1.5.3 gocloud.dev v0.39.0 golang.org/x/exp v0.0.0-20221031165847-c99f073a8326 diff --git a/go.sum b/go.sum index cbe96a587..6672e8e1d 100644 --- a/go.sum +++ b/go.sum @@ -472,8 +472,8 @@ github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5t github.com/yuin/goldmark v1.7.1/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= github.com/yuin/goldmark v1.7.4 h1:BDXOHExt+A7gwPCJgPIIq7ENvceR7we7rOS9TNoLZeg= github.com/yuin/goldmark v1.7.4/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= -github.com/yuin/goldmark-emoji v1.0.3 h1:aLRkLHOuBR2czCY4R8olwMjID+tENfhyFDMCRhbIQY4= -github.com/yuin/goldmark-emoji v1.0.3/go.mod h1:tTkZEbwu5wkPmgTcitqddVxY9osFZiavD+r4AzQrh1U= +github.com/yuin/goldmark-emoji v1.0.4 h1:vCwMkPZSNefSUnOW2ZKRUjBSD5Ok3W78IXhGxxAEF90= +github.com/yuin/goldmark-emoji v1.0.4/go.mod h1:tTkZEbwu5wkPmgTcitqddVxY9osFZiavD+r4AzQrh1U= 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 db653a848529ddd51045502e073d3fcbaa174173 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Oct 2024 08:43:25 +0000 Subject: [PATCH 044/526] build(deps): bump golang.org/x/image from 0.20.0 to 0.21.0 Bumps [golang.org/x/image](https://github.com/golang/image) from 0.20.0 to 0.21.0. - [Commits](https://github.com/golang/image/compare/v0.20.0...v0.21.0) --- updated-dependencies: - dependency-name: golang.org/x/image 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 bc9aba3bc..7389e6bde 100644 --- a/go.mod +++ b/go.mod @@ -75,7 +75,7 @@ require ( go.uber.org/automaxprocs v1.5.3 gocloud.dev v0.39.0 golang.org/x/exp v0.0.0-20221031165847-c99f073a8326 - golang.org/x/image v0.20.0 + golang.org/x/image v0.21.0 golang.org/x/mod v0.21.0 golang.org/x/net v0.30.0 golang.org/x/sync v0.8.0 diff --git a/go.sum b/go.sum index 6672e8e1d..b7782c6cf 100644 --- a/go.sum +++ b/go.sum @@ -526,8 +526,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.20.0 h1:7cVCUjQwfL18gyBJOmYvptfSHS8Fb3YUDtfLIZ7Nbpw= -golang.org/x/image v0.20.0/go.mod h1:0a88To4CYVBAHp5FXJm8o7QbUl37Vd85ply1vyD8auM= +golang.org/x/image v0.21.0 h1:c5qV36ajHpdj4Qi0GnE0jUc/yuo33OLFaa0d+crTD5s= +golang.org/x/image v0.21.0/go.mod h1:vUbsLavqK/W303ZroQQVKQ+Af3Yl6Uz1Ppu5J/cLz78= 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 4985be1a4af34dd835e7882605e429cd5ffb1912 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Oct 2024 12:55:19 +0000 Subject: [PATCH 045/526] build(deps): bump github.com/tetratelabs/wazero from 1.8.0 to 1.8.1 Bumps [github.com/tetratelabs/wazero](https://github.com/tetratelabs/wazero) from 1.8.0 to 1.8.1. - [Release notes](https://github.com/tetratelabs/wazero/releases) - [Commits](https://github.com/tetratelabs/wazero/compare/v1.8.0...v1.8.1) --- updated-dependencies: - dependency-name: github.com/tetratelabs/wazero 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 7389e6bde..392119e17 100644 --- a/go.mod +++ b/go.mod @@ -69,7 +69,7 @@ require ( github.com/spf13/pflag v1.0.5 github.com/tdewolff/minify/v2 v2.20.37 github.com/tdewolff/parse/v2 v2.7.15 - github.com/tetratelabs/wazero v1.8.0 + github.com/tetratelabs/wazero v1.8.1 github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-emoji v1.0.4 go.uber.org/automaxprocs v1.5.3 diff --git a/go.sum b/go.sum index b7782c6cf..6f3e61e89 100644 --- a/go.sum +++ b/go.sum @@ -459,8 +459,8 @@ github.com/tdewolff/parse/v2 v2.7.15/go.mod h1:3FbJWZp3XT9OWVN3Hmfp0p/a08v4h8J9W 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/tetratelabs/wazero v1.8.0 h1:iEKu0d4c2Pd+QSRieYbnQC9yiFlMS9D+Jr0LsRmcF4g= -github.com/tetratelabs/wazero v1.8.0/go.mod h1:yAI0XTsMBhREkM/YDAK/zNou3GoiAce1P6+rp/wQhjs= +github.com/tetratelabs/wazero v1.8.1 h1:NrcgVbWfkWvVc4UtT4LRLDf91PsOzDzefMdwhLfA550= +github.com/tetratelabs/wazero v1.8.1/go.mod h1:yAI0XTsMBhREkM/YDAK/zNou3GoiAce1P6+rp/wQhjs= github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0= github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= From 6b5e117a1213eecf1320aad292a0979c67f5179d Mon Sep 17 00:00:00 2001 From: Rohan Hasabe Date: Sun, 13 Oct 2024 22:10:38 -0400 Subject: [PATCH 046/526] commands: Use consistent style when describing subcommands Closes #12897 Change-Id: Ib27a4a7b540d45243e6252db769d4b9fb7447718 Signed-off-by: Rohan Hasabe --- commands/commandeer.go | 2 +- commands/config.go | 4 ++-- commands/convert.go | 4 ++-- commands/deploy.go | 4 ++-- commands/env.go | 8 ++++---- commands/gen.go | 3 ++- commands/import.go | 4 ++-- commands/list.go | 4 ++-- commands/mod.go | 2 +- commands/new.go | 4 ++-- commands/server.go | 2 +- testscripts/commands/config.txt | 2 +- testscripts/commands/convert.txt | 2 +- testscripts/commands/deploy.txt | 2 +- testscripts/commands/gen.txt | 2 +- testscripts/commands/import_jekyll.txt | 4 ++-- 16 files changed, 27 insertions(+), 26 deletions(-) diff --git a/commands/commandeer.go b/commands/commandeer.go index 841e8d81c..06565d45d 100644 --- a/commands/commandeer.go +++ b/commands/commandeer.go @@ -509,7 +509,7 @@ func (r *rootCommand) initRootCommand(subCommandName string, cd *simplecobra.Com commandName = subCommandName } cmd.Use = fmt.Sprintf("%s [flags]", commandName) - cmd.Short = fmt.Sprintf("%s builds your site", commandName) + cmd.Short = "Build your site" cmd.Long = `COMMAND_NAME is the main command, used to build your Hugo site. Hugo is a Fast and Flexible Static Site Generator diff --git a/commands/config.go b/commands/config.go index c3d08ae22..b250fc329 100644 --- a/commands/config.go +++ b/commands/config.go @@ -110,8 +110,8 @@ func (c *configCommand) Run(ctx context.Context, cd *simplecobra.Commandeer, arg func (c *configCommand) Init(cd *simplecobra.Commandeer) error { c.r = cd.Root.Command.(*rootCommand) cmd := cd.CobraCommand - cmd.Short = "Print the site configuration" - cmd.Long = `Print the site configuration, both default and custom settings.` + cmd.Short = "Display site configuration" + cmd.Long = `Display site configuration, both default and custom settings.` cmd.Flags().StringVar(&c.format, "format", "toml", "preferred file format (toml, yaml or json)") _ = cmd.RegisterFlagCompletionFunc("format", cobra.FixedCompletions([]string{"toml", "yaml", "json"}, cobra.ShellCompDirectiveNoFileComp)) cmd.Flags().StringVar(&c.lang, "lang", "", "the language to display config for. Defaults to the first language defined.") diff --git a/commands/convert.go b/commands/convert.go index 4e1ceb7d1..ebf81cfb3 100644 --- a/commands/convert.go +++ b/commands/convert.go @@ -105,8 +105,8 @@ func (c *convertCommand) Run(ctx context.Context, cd *simplecobra.Commandeer, ar func (c *convertCommand) Init(cd *simplecobra.Commandeer) error { cmd := cd.CobraCommand - cmd.Short = "Convert your content to different formats" - cmd.Long = `Convert your content (e.g. front matter) to different formats. + cmd.Short = "Convert front matter to another format" + cmd.Long = `Convert front matter to another format. See convert's subcommands toJSON, toTOML and toYAML for more information.` diff --git a/commands/deploy.go b/commands/deploy.go index 873da14a4..f0bc670ca 100644 --- a/commands/deploy.go +++ b/commands/deploy.go @@ -42,8 +42,8 @@ import ( func newDeployCommand() simplecobra.Commander { return &simpleCommand{ name: "deploy", - short: "Deploy your site to a Cloud provider.", - long: `Deploy your site to a Cloud provider. + short: "Deploy your site to a cloud provider", + long: `Deploy your site to a cloud provider See https://gohugo.io/hosting-and-deployment/hugo-deploy/ for detailed documentation. diff --git a/commands/env.go b/commands/env.go index 843fc49d1..753522560 100644 --- a/commands/env.go +++ b/commands/env.go @@ -25,8 +25,8 @@ import ( func newEnvCommand() simplecobra.Commander { return &simpleCommand{ name: "env", - short: "Print Hugo version and environment info", - long: "Print Hugo version and environment info. This is useful in Hugo bug reports", + short: "Display version and environment info", + long: "Display version and environment info. This is useful in Hugo bug reports", run: func(ctx context.Context, cd *simplecobra.Commandeer, r *rootCommand, args []string) error { r.Printf("%s\n", hugo.BuildVersionString()) r.Printf("GOOS=%q\n", runtime.GOOS) @@ -61,8 +61,8 @@ func newVersionCmd() simplecobra.Commander { r.Println(hugo.BuildVersionString()) return nil }, - short: "Print Hugo version and environment info", - long: "Print Hugo version and environment info. This is useful in Hugo bug reports.", + short: "Display version", + long: "Display version and environment info. This is useful in Hugo bug reports.", withc: func(cmd *cobra.Command, r *rootCommand) { cmd.ValidArgsFunction = cobra.NoFileCompletions }, diff --git a/commands/gen.go b/commands/gen.go index b6ace80d9..83b4d637c 100644 --- a/commands/gen.go +++ b/commands/gen.go @@ -273,7 +273,8 @@ func (c *genCommand) Run(ctx context.Context, cd *simplecobra.Commandeer, args [ func (c *genCommand) Init(cd *simplecobra.Commandeer) error { cmd := cd.CobraCommand - cmd.Short = "A collection of several useful generators." + cmd.Short = "Generate documentation and syntax highlighting styles" + cmd.Long = "Generate documentation for your project using Hugo's documentation engine, including syntax highlighting for various programming languages." cmd.RunE = nil return nil diff --git a/commands/import.go b/commands/import.go index c2d574aa1..37a6b0dbf 100644 --- a/commands/import.go +++ b/commands/import.go @@ -90,8 +90,8 @@ func (c *importCommand) Run(ctx context.Context, cd *simplecobra.Commandeer, arg func (c *importCommand) Init(cd *simplecobra.Commandeer) error { cmd := cd.CobraCommand - cmd.Short = "Import your site from others." - cmd.Long = `Import your site from other web site generators like Jekyll. + cmd.Short = "Import a site from another system" + cmd.Long = `Import a site from another system. Import requires a subcommand, e.g. ` + "`hugo import jekyll jekyll_root_path target_path`." diff --git a/commands/list.go b/commands/list.go index c2f9c2d87..f362e22f1 100644 --- a/commands/list.go +++ b/commands/list.go @@ -199,8 +199,8 @@ func (c *listCommand) Run(ctx context.Context, cd *simplecobra.Commandeer, args func (c *listCommand) Init(cd *simplecobra.Commandeer) error { cmd := cd.CobraCommand - cmd.Short = "Listing out various types of content" - cmd.Long = `Listing out various types of content. + cmd.Short = "List content" + cmd.Long = `List content. List requires a subcommand, e.g. hugo list drafts` diff --git a/commands/mod.go b/commands/mod.go index a9c8c459d..dda7840cc 100644 --- a/commands/mod.go +++ b/commands/mod.go @@ -328,7 +328,7 @@ func (c *modCommands) Run(ctx context.Context, cd *simplecobra.Commandeer, args func (c *modCommands) Init(cd *simplecobra.Commandeer) error { cmd := cd.CobraCommand - cmd.Short = "Various Hugo Modules helpers." + cmd.Short = "Manage modules" cmd.Long = `Various helpers to help manage the modules in your project's dependency graph. Most operations here requires a Go version installed on your system (>= Go 1.12) and the relevant VCS client (typically Git). This is not needed if you only operate on modules inside /themes or if you have vendored them via "hugo mod vendor". diff --git a/commands/new.go b/commands/new.go index f6bb09e00..901ea02d6 100644 --- a/commands/new.go +++ b/commands/new.go @@ -40,7 +40,7 @@ func newNewCommand() *newCommand { &simpleCommand{ name: "content", use: "content [path]", - short: "Create new content for your site", + short: "Create new content", long: `Create a new content file and automatically set the date and title. It will guess which kind of file to create based on the path provided. @@ -181,7 +181,7 @@ func (c *newCommand) Run(ctx context.Context, cd *simplecobra.Commandeer, args [ func (c *newCommand) Init(cd *simplecobra.Commandeer) error { cmd := cd.CobraCommand - cmd.Short = "Create new content for your site" + cmd.Short = "Create new content" cmd.Long = `Create a new content file and automatically set the date and title. It will guess which kind of file to create based on the path provided. diff --git a/commands/server.go b/commands/server.go index 680c73a13..b16bf3148 100644 --- a/commands/server.go +++ b/commands/server.go @@ -508,7 +508,7 @@ func (c *serverCommand) Run(ctx context.Context, cd *simplecobra.Commandeer, arg func (c *serverCommand) Init(cd *simplecobra.Commandeer) error { cmd := cd.CobraCommand - cmd.Short = "A high performance webserver" + cmd.Short = "Start the embedded web server" cmd.Long = `Hugo provides its own webserver which builds and serves the site. While hugo server is high performance, it is a webserver with limited options. diff --git a/testscripts/commands/config.txt b/testscripts/commands/config.txt index b1dba8d11..46386eb92 100644 --- a/testscripts/commands/config.txt +++ b/testscripts/commands/config.txt @@ -1,7 +1,7 @@ # Test the config command. hugo config -h -stdout 'Print the site configuration' +stdout 'Display site configuration' hugo config diff --git a/testscripts/commands/convert.txt b/testscripts/commands/convert.txt index 1cf756215..811aeecc8 100644 --- a/testscripts/commands/convert.txt +++ b/testscripts/commands/convert.txt @@ -1,7 +1,7 @@ # Test the convert commands. hugo convert -h -stdout 'Convert your content' +stdout 'Convert front matter to another format' hugo convert toJSON -h stdout 'to use JSON for the front matter' hugo convert toTOML -h diff --git a/testscripts/commands/deploy.txt b/testscripts/commands/deploy.txt index 0afe1fc44..2586f8b8f 100644 --- a/testscripts/commands/deploy.txt +++ b/testscripts/commands/deploy.txt @@ -1,7 +1,7 @@ # Test the deploy command. hugo deploy -h -stdout 'Deploy your site to a Cloud provider\.' +stdout 'Deploy your site to a cloud provider' mkdir mybucket hugo deploy --target mydeployment --invalidateCDN=false grep 'hello' mybucket/index.html diff --git a/testscripts/commands/gen.txt b/testscripts/commands/gen.txt index 16db9fe4a..b8fe9d2dc 100644 --- a/testscripts/commands/gen.txt +++ b/testscripts/commands/gen.txt @@ -3,7 +3,7 @@ env NUM_COMMANDS=44 hugo gen -h -stdout 'A collection of several useful generators\.' +stdout 'Generate documentation for your project using Hugo''s documentation engine, including syntax highlighting for various programming languages\.' hugo gen doc --dir clidocs checkfilecount $NUM_COMMANDS clidocs diff --git a/testscripts/commands/import_jekyll.txt b/testscripts/commands/import_jekyll.txt index 8d229ba2e..953349acf 100644 --- a/testscripts/commands/import_jekyll.txt +++ b/testscripts/commands/import_jekyll.txt @@ -1,7 +1,7 @@ -# Test the import jekyll command. +# Test the import + import jekyll command. hugo import -h -stdout 'Import your site from other web site generators like Jekyll\.' +stdout 'Import a site from another system' hugo import jekyll -h stdout 'hugo import from Jekyll\.' From e7d0757f95b3a258282129a74946cd9904070721 Mon Sep 17 00:00:00 2001 From: n1xx1 Date: Mon, 14 Oct 2024 12:08:31 +0200 Subject: [PATCH 047/526] resources/page: Allow colons in permalinks to be escaped Updates #12918 --- resources/page/permalinks.go | 22 +++++++++++++++++----- resources/page/permalinks_test.go | 7 +++++++ 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/resources/page/permalinks.go b/resources/page/permalinks.go index 05911f0ea..d4b60bb9a 100644 --- a/resources/page/permalinks.go +++ b/resources/page/permalinks.go @@ -107,6 +107,10 @@ func NewPermalinkExpander(urlize func(uri string) string, patterns map[string]ma return p, nil } +func (l PermalinkExpander) normalizeEscapeSequences(result string) string { + return strings.ReplaceAll(result, "\\:", ":") +} + // ExpandPattern expands the path in p with the specified expand pattern. func (l PermalinkExpander) ExpandPattern(pattern string, p Page) (string, error) { expander, err := l.getOrParsePattern(pattern) @@ -114,7 +118,11 @@ func (l PermalinkExpander) ExpandPattern(pattern string, p Page) (string, error) return "", err } - return expander(p) + result, err := expander(p) + if err != nil { + return "", err + } + return l.normalizeEscapeSequences(result), nil } // Expand expands the path in p according to the rules defined for the given key. @@ -132,7 +140,11 @@ func (l PermalinkExpander) Expand(key string, p Page) (string, error) { return "", nil } - return expand(p) + result, err := expand(p) + if err != nil { + return "", err + } + return l.normalizeEscapeSequences(result), nil } // Allow " " and / to represent the root section. @@ -154,7 +166,7 @@ func (l PermalinkExpander) getOrParsePattern(pattern string) (func(Page) (string callbacks := make([]pageToPermaAttribute, len(matches)) replacements := make([]string, len(matches)) for i, m := range matches { - replacement := m[0] + replacement := m[1] attr := replacement[1:] replacements[i] = replacement callback, ok := l.callback(attr) @@ -210,7 +222,7 @@ func (l PermalinkExpander) parse(patterns map[string]string) (map[string]func(Pa // can return a string to go in that position in the page (or an error) type pageToPermaAttribute func(Page, string) (string, error) -var attributeRegexp = regexp.MustCompile(`:\w+(\[.+?\])?`) +var attributeRegexp = regexp.MustCompile(`(?:^|[^\\])(:\w+(?:\[.+?])?)`) // validate determines if a PathPattern is well-formed func (l PermalinkExpander) validate(pp string) bool { @@ -234,7 +246,7 @@ func (l PermalinkExpander) validate(pp string) bool { } for _, match := range matches { - k := match[0][1:] + k := match[1][1:] if _, ok := l.callback(k); !ok { return false } diff --git a/resources/page/permalinks_test.go b/resources/page/permalinks_test.go index a3a45bb88..9a8ac51f2 100644 --- a/resources/page/permalinks_test.go +++ b/resources/page/permalinks_test.go @@ -44,6 +44,8 @@ var testdataPermalinks = []struct { {"/:sections/", true, "/a/b/c/"}, // Sections {"/:sections[last]/", true, "/c/"}, // Sections {"/:sections[0]/:sections[last]/", true, "/a/c/"}, // Sections + {"/\\:filename", true, "/:filename"}, // Escape sequence + {"/special\\::slug/", true, "/special:the-slug/"}, // Escape sequence // Failures {"/blog/:fred", false, ""}, @@ -117,6 +119,7 @@ func TestPermalinkExpansionMultiSection(t *testing.T) { "posts": "/:slug", "blog": "/:section/:year", "recipes": "/:slugorfilename", + "special": "/special\\::slug", }, } expander, err := NewPermalinkExpander(urlize, permalinksConfig) @@ -137,6 +140,10 @@ func TestPermalinkExpansionMultiSection(t *testing.T) { expanded, err = expander.Expand("recipes", page_slug_fallback) c.Assert(err, qt.IsNil) c.Assert(expanded, qt.Equals, "/page-filename") + + expanded, err = expander.Expand("special", page) + c.Assert(err, qt.IsNil) + c.Assert(expanded, qt.Equals, "/special:the-slug") } func TestPermalinkExpansionConcurrent(t *testing.T) { From 6e1c5b61b3aa4cc4c973fb62bc419e9acf06ded2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Tue, 15 Oct 2024 09:13:26 +0200 Subject: [PATCH 048/526] resources/page: Adjust the permalinks colon implementation a little Mostly to get back to an attribute regexp that's reasonably simle to read/understand. Updates #12918 --- resources/page/permalinks.go | 54 ++++++++++++++++++------------- resources/page/permalinks_test.go | 4 +++ 2 files changed, 36 insertions(+), 22 deletions(-) diff --git a/resources/page/permalinks.go b/resources/page/permalinks.go index d4b60bb9a..fe9d9f78d 100644 --- a/resources/page/permalinks.go +++ b/resources/page/permalinks.go @@ -107,44 +107,42 @@ func NewPermalinkExpander(urlize func(uri string) string, patterns map[string]ma return p, nil } -func (l PermalinkExpander) normalizeEscapeSequences(result string) string { - return strings.ReplaceAll(result, "\\:", ":") +// Escape sequence for colons in permalink patterns. +const escapePlaceholderColon = "\x00" + +func (l PermalinkExpander) normalizeEscapeSequencesIn(s string) (string, bool) { + s2 := strings.ReplaceAll(s, "\\:", escapePlaceholderColon) + return s2, s2 != s +} + +func (l PermalinkExpander) normalizeEscapeSequencesOut(result string) string { + return strings.ReplaceAll(result, escapePlaceholderColon, ":") } // ExpandPattern expands the path in p with the specified expand pattern. func (l PermalinkExpander) ExpandPattern(pattern string, p Page) (string, error) { - expander, err := l.getOrParsePattern(pattern) + expand, err := l.getOrParsePattern(pattern) if err != nil { return "", err } - result, err := expander(p) - if err != nil { - return "", err - } - return l.normalizeEscapeSequences(result), nil + return expand(p) } // Expand expands the path in p according to the rules defined for the given key. // If no rules are found for the given key, an empty string is returned. func (l PermalinkExpander) Expand(key string, p Page) (string, error) { expanders, found := l.expanders[p.Kind()] - if !found { return "", nil } expand, found := expanders[key] - if !found { return "", nil } - result, err := expand(p) - if err != nil { - return "", err - } - return l.normalizeEscapeSequences(result), nil + return expand(p) } // Allow " " and / to represent the root section. @@ -161,12 +159,24 @@ func (l PermalinkExpander) getOrParsePattern(pattern string) (func(Page) (string if !l.validate(pattern) { return nil, &permalinkExpandError{pattern: pattern, err: errPermalinkIllFormed} } + var normalized bool + pattern, normalized = l.normalizeEscapeSequencesIn(pattern) + matches := attributeRegexp.FindAllStringSubmatch(pattern, -1) + if matches == nil { + result := pattern + if normalized { + result = l.normalizeEscapeSequencesOut(result) + } + return func(p Page) (string, error) { + return result, nil + }, nil + } callbacks := make([]pageToPermaAttribute, len(matches)) replacements := make([]string, len(matches)) for i, m := range matches { - replacement := m[1] + replacement := m[0] attr := replacement[1:] replacements[i] = replacement callback, ok := l.callback(attr) @@ -179,10 +189,6 @@ func (l PermalinkExpander) getOrParsePattern(pattern string) (func(Page) (string } return func(p Page) (string, error) { - if matches == nil { - return pattern, nil - } - newField := pattern for i, replacement := range replacements { @@ -196,6 +202,10 @@ func (l PermalinkExpander) getOrParsePattern(pattern string) (func(Page) (string newField = strings.Replace(newField, replacement, newAttr, 1) } + if normalized { + newField = l.normalizeEscapeSequencesOut(newField) + } + return newField, nil }, nil }) @@ -222,7 +232,7 @@ func (l PermalinkExpander) parse(patterns map[string]string) (map[string]func(Pa // can return a string to go in that position in the page (or an error) type pageToPermaAttribute func(Page, string) (string, error) -var attributeRegexp = regexp.MustCompile(`(?:^|[^\\])(:\w+(?:\[.+?])?)`) +var attributeRegexp = regexp.MustCompile(`:\w+(\[.+?\])?`) // validate determines if a PathPattern is well-formed func (l PermalinkExpander) validate(pp string) bool { @@ -246,7 +256,7 @@ func (l PermalinkExpander) validate(pp string) bool { } for _, match := range matches { - k := match[1][1:] + k := match[0][1:] if _, ok := l.callback(k); !ok { return false } diff --git a/resources/page/permalinks_test.go b/resources/page/permalinks_test.go index 9a8ac51f2..808521f42 100644 --- a/resources/page/permalinks_test.go +++ b/resources/page/permalinks_test.go @@ -92,6 +92,10 @@ func TestPermalinkExpansion(t *testing.T) { expanded, err := expander.Expand("posts", page) c.Assert(err, qt.IsNil) c.Assert(expanded, qt.Equals, item.expandsTo) + + expanded, err = expander.ExpandPattern(item.spec, page) + c.Assert(err, qt.IsNil) + c.Assert(expanded, qt.Equals, item.expandsTo) }) } From b7d62d76c5b97d440910c6a40e1e86e7bbad4d82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Tue, 15 Oct 2024 10:30:35 +0200 Subject: [PATCH 049/526] docs: Regen CLI docs --- docs/content/en/commands/hugo.md | 26 +++++++++---------- docs/content/en/commands/hugo_build.md | 4 +-- docs/content/en/commands/hugo_completion.md | 2 +- docs/content/en/commands/hugo_config.md | 6 ++--- .../content/en/commands/hugo_config_mounts.md | 2 +- docs/content/en/commands/hugo_convert.md | 6 ++--- .../en/commands/hugo_convert_toJSON.md | 2 +- .../en/commands/hugo_convert_toTOML.md | 2 +- .../en/commands/hugo_convert_toYAML.md | 2 +- docs/content/en/commands/hugo_deploy.md | 6 ++--- docs/content/en/commands/hugo_env.md | 6 ++--- docs/content/en/commands/hugo_gen.md | 8 ++++-- .../en/commands/hugo_gen_chromastyles.md | 2 +- docs/content/en/commands/hugo_gen_doc.md | 2 +- docs/content/en/commands/hugo_gen_man.md | 2 +- docs/content/en/commands/hugo_import.md | 6 ++--- .../content/en/commands/hugo_import_jekyll.md | 2 +- docs/content/en/commands/hugo_list.md | 6 ++--- docs/content/en/commands/hugo_list_all.md | 2 +- docs/content/en/commands/hugo_list_drafts.md | 2 +- docs/content/en/commands/hugo_list_expired.md | 2 +- docs/content/en/commands/hugo_list_future.md | 2 +- .../en/commands/hugo_list_published.md | 2 +- docs/content/en/commands/hugo_mod.md | 4 +-- docs/content/en/commands/hugo_mod_clean.md | 2 +- docs/content/en/commands/hugo_mod_get.md | 2 +- docs/content/en/commands/hugo_mod_graph.md | 2 +- docs/content/en/commands/hugo_mod_init.md | 2 +- docs/content/en/commands/hugo_mod_npm.md | 2 +- docs/content/en/commands/hugo_mod_tidy.md | 2 +- docs/content/en/commands/hugo_mod_vendor.md | 2 +- docs/content/en/commands/hugo_mod_verify.md | 2 +- docs/content/en/commands/hugo_new.md | 6 ++--- docs/content/en/commands/hugo_new_content.md | 4 +-- docs/content/en/commands/hugo_new_site.md | 2 +- docs/content/en/commands/hugo_new_theme.md | 2 +- docs/content/en/commands/hugo_server.md | 4 +-- docs/content/en/commands/hugo_server_trust.md | 2 +- docs/content/en/commands/hugo_version.md | 6 ++--- 39 files changed, 76 insertions(+), 72 deletions(-) diff --git a/docs/content/en/commands/hugo.md b/docs/content/en/commands/hugo.md index badd6d7ea..c23b3e4ba 100644 --- a/docs/content/en/commands/hugo.md +++ b/docs/content/en/commands/hugo.md @@ -5,7 +5,7 @@ url: /commands/hugo/ --- ## hugo -hugo builds your site +Build your site ### Synopsis @@ -70,17 +70,17 @@ hugo [flags] ### SEE ALSO -* [hugo build](/commands/hugo_build/) - build builds your site +* [hugo build](/commands/hugo_build/) - Build your site * [hugo completion](/commands/hugo_completion/) - Generate the autocompletion script for the specified shell -* [hugo config](/commands/hugo_config/) - Print the site configuration -* [hugo convert](/commands/hugo_convert/) - Convert your content to different formats -* [hugo deploy](/commands/hugo_deploy/) - Deploy your site to a Cloud provider. -* [hugo env](/commands/hugo_env/) - Print Hugo version and environment info -* [hugo gen](/commands/hugo_gen/) - A collection of several useful generators. -* [hugo import](/commands/hugo_import/) - Import your site from others. -* [hugo list](/commands/hugo_list/) - Listing out various types of content -* [hugo mod](/commands/hugo_mod/) - Various Hugo Modules helpers. -* [hugo new](/commands/hugo_new/) - Create new content for your site -* [hugo server](/commands/hugo_server/) - A high performance webserver -* [hugo version](/commands/hugo_version/) - Print Hugo version and environment info +* [hugo config](/commands/hugo_config/) - Display site configuration +* [hugo convert](/commands/hugo_convert/) - Convert front matter to another format +* [hugo deploy](/commands/hugo_deploy/) - Deploy your site to a cloud provider +* [hugo env](/commands/hugo_env/) - Display version and environment info +* [hugo gen](/commands/hugo_gen/) - Generate documentation and syntax highlighting styles +* [hugo import](/commands/hugo_import/) - Import a site from another system +* [hugo list](/commands/hugo_list/) - List content +* [hugo mod](/commands/hugo_mod/) - Manage modules +* [hugo new](/commands/hugo_new/) - Create new content +* [hugo server](/commands/hugo_server/) - Start the embedded web server +* [hugo version](/commands/hugo_version/) - Display version diff --git a/docs/content/en/commands/hugo_build.md b/docs/content/en/commands/hugo_build.md index 72686cb9b..c0abecfa9 100644 --- a/docs/content/en/commands/hugo_build.md +++ b/docs/content/en/commands/hugo_build.md @@ -5,7 +5,7 @@ url: /commands/hugo_build/ --- ## hugo build -build builds your site +Build your site ### Synopsis @@ -70,5 +70,5 @@ hugo build [flags] ### SEE ALSO -* [hugo](/commands/hugo/) - hugo builds your site +* [hugo](/commands/hugo/) - Build your site diff --git a/docs/content/en/commands/hugo_completion.md b/docs/content/en/commands/hugo_completion.md index 21635e81e..171018fee 100644 --- a/docs/content/en/commands/hugo_completion.md +++ b/docs/content/en/commands/hugo_completion.md @@ -39,7 +39,7 @@ See each sub-command's help for details on how to use the generated script. ### SEE ALSO -* [hugo](/commands/hugo/) - hugo builds your site +* [hugo](/commands/hugo/) - Build your site * [hugo completion bash](/commands/hugo_completion_bash/) - Generate the autocompletion script for bash * [hugo completion fish](/commands/hugo_completion_fish/) - Generate the autocompletion script for fish * [hugo completion powershell](/commands/hugo_completion_powershell/) - Generate the autocompletion script for powershell diff --git a/docs/content/en/commands/hugo_config.md b/docs/content/en/commands/hugo_config.md index fac513dce..96f84a531 100644 --- a/docs/content/en/commands/hugo_config.md +++ b/docs/content/en/commands/hugo_config.md @@ -5,11 +5,11 @@ url: /commands/hugo_config/ --- ## hugo config -Print the site configuration +Display site configuration ### Synopsis -Print the site configuration, both default and custom settings. +Display site configuration, both default and custom settings. ``` hugo config [command] [flags] @@ -48,6 +48,6 @@ hugo config [command] [flags] ### SEE ALSO -* [hugo](/commands/hugo/) - hugo builds your site +* [hugo](/commands/hugo/) - Build your site * [hugo config mounts](/commands/hugo_config_mounts/) - Print the configured file mounts diff --git a/docs/content/en/commands/hugo_config_mounts.md b/docs/content/en/commands/hugo_config_mounts.md index 42c8b29aa..6fa30c016 100644 --- a/docs/content/en/commands/hugo_config_mounts.md +++ b/docs/content/en/commands/hugo_config_mounts.md @@ -42,5 +42,5 @@ hugo config mounts [flags] [args] ### SEE ALSO -* [hugo config](/commands/hugo_config/) - Print the site configuration +* [hugo config](/commands/hugo_config/) - Display site configuration diff --git a/docs/content/en/commands/hugo_convert.md b/docs/content/en/commands/hugo_convert.md index 7b18ee6f8..53d4d992c 100644 --- a/docs/content/en/commands/hugo_convert.md +++ b/docs/content/en/commands/hugo_convert.md @@ -5,11 +5,11 @@ url: /commands/hugo_convert/ --- ## hugo convert -Convert your content to different formats +Convert front matter to another format ### Synopsis -Convert your content (e.g. front matter) to different formats. +Convert front matter to another format. See convert's subcommands toJSON, toTOML and toYAML for more information. @@ -41,7 +41,7 @@ See convert's subcommands toJSON, toTOML and toYAML for more information. ### SEE ALSO -* [hugo](/commands/hugo/) - hugo builds your site +* [hugo](/commands/hugo/) - Build your site * [hugo convert toJSON](/commands/hugo_convert_tojson/) - Convert front matter to JSON * [hugo convert toTOML](/commands/hugo_convert_totoml/) - Convert front matter to TOML * [hugo convert toYAML](/commands/hugo_convert_toyaml/) - Convert front matter to YAML diff --git a/docs/content/en/commands/hugo_convert_toJSON.md b/docs/content/en/commands/hugo_convert_toJSON.md index 1dfb33aa0..9546788b5 100644 --- a/docs/content/en/commands/hugo_convert_toJSON.md +++ b/docs/content/en/commands/hugo_convert_toJSON.md @@ -44,5 +44,5 @@ hugo convert toJSON [flags] [args] ### SEE ALSO -* [hugo convert](/commands/hugo_convert/) - Convert your content to different formats +* [hugo convert](/commands/hugo_convert/) - Convert front matter to another format diff --git a/docs/content/en/commands/hugo_convert_toTOML.md b/docs/content/en/commands/hugo_convert_toTOML.md index ddd6b8270..3bd703f60 100644 --- a/docs/content/en/commands/hugo_convert_toTOML.md +++ b/docs/content/en/commands/hugo_convert_toTOML.md @@ -44,5 +44,5 @@ hugo convert toTOML [flags] [args] ### SEE ALSO -* [hugo convert](/commands/hugo_convert/) - Convert your content to different formats +* [hugo convert](/commands/hugo_convert/) - Convert front matter to another format diff --git a/docs/content/en/commands/hugo_convert_toYAML.md b/docs/content/en/commands/hugo_convert_toYAML.md index bddbb88a5..563375486 100644 --- a/docs/content/en/commands/hugo_convert_toYAML.md +++ b/docs/content/en/commands/hugo_convert_toYAML.md @@ -44,5 +44,5 @@ hugo convert toYAML [flags] [args] ### SEE ALSO -* [hugo convert](/commands/hugo_convert/) - Convert your content to different formats +* [hugo convert](/commands/hugo_convert/) - Convert front matter to another format diff --git a/docs/content/en/commands/hugo_deploy.md b/docs/content/en/commands/hugo_deploy.md index a606083fc..a6fc53658 100644 --- a/docs/content/en/commands/hugo_deploy.md +++ b/docs/content/en/commands/hugo_deploy.md @@ -5,11 +5,11 @@ url: /commands/hugo_deploy/ --- ## hugo deploy -Deploy your site to a Cloud provider. +Deploy your site to a cloud provider ### Synopsis -Deploy your site to a Cloud provider. +Deploy your site to a cloud provider See https://gohugo.io/hosting-and-deployment/hugo-deploy/ for detailed documentation. @@ -52,5 +52,5 @@ hugo deploy [flags] [args] ### SEE ALSO -* [hugo](/commands/hugo/) - hugo builds your site +* [hugo](/commands/hugo/) - Build your site diff --git a/docs/content/en/commands/hugo_env.md b/docs/content/en/commands/hugo_env.md index 9b73cea5f..50a7bc92f 100644 --- a/docs/content/en/commands/hugo_env.md +++ b/docs/content/en/commands/hugo_env.md @@ -5,11 +5,11 @@ url: /commands/hugo_env/ --- ## hugo env -Print Hugo version and environment info +Display version and environment info ### Synopsis -Print Hugo version and environment info. This is useful in Hugo bug reports +Display version and environment info. This is useful in Hugo bug reports ``` hugo env [flags] [args] @@ -41,5 +41,5 @@ hugo env [flags] [args] ### SEE ALSO -* [hugo](/commands/hugo/) - hugo builds your site +* [hugo](/commands/hugo/) - Build your site diff --git a/docs/content/en/commands/hugo_gen.md b/docs/content/en/commands/hugo_gen.md index ea1696db9..20d829178 100644 --- a/docs/content/en/commands/hugo_gen.md +++ b/docs/content/en/commands/hugo_gen.md @@ -5,7 +5,11 @@ url: /commands/hugo_gen/ --- ## hugo gen -A collection of several useful generators. +Generate documentation and syntax highlighting styles + +### Synopsis + +Generate documentation for your project using Hugo's documentation engine, including syntax highlighting for various programming languages. ### Options @@ -33,7 +37,7 @@ A collection of several useful generators. ### SEE ALSO -* [hugo](/commands/hugo/) - hugo builds your site +* [hugo](/commands/hugo/) - Build your site * [hugo gen chromastyles](/commands/hugo_gen_chromastyles/) - Generate CSS stylesheet for the Chroma code highlighter * [hugo gen doc](/commands/hugo_gen_doc/) - Generate Markdown documentation for the Hugo CLI. * [hugo gen man](/commands/hugo_gen_man/) - Generate man pages for the Hugo CLI diff --git a/docs/content/en/commands/hugo_gen_chromastyles.md b/docs/content/en/commands/hugo_gen_chromastyles.md index cc244878c..1c0ac7235 100644 --- a/docs/content/en/commands/hugo_gen_chromastyles.md +++ b/docs/content/en/commands/hugo_gen_chromastyles.md @@ -47,5 +47,5 @@ hugo gen chromastyles [flags] [args] ### SEE ALSO -* [hugo gen](/commands/hugo_gen/) - A collection of several useful generators. +* [hugo gen](/commands/hugo_gen/) - Generate documentation and syntax highlighting styles diff --git a/docs/content/en/commands/hugo_gen_doc.md b/docs/content/en/commands/hugo_gen_doc.md index 84493ab98..5d2fffa4f 100644 --- a/docs/content/en/commands/hugo_gen_doc.md +++ b/docs/content/en/commands/hugo_gen_doc.md @@ -47,5 +47,5 @@ hugo gen doc [flags] [args] ### SEE ALSO -* [hugo gen](/commands/hugo_gen/) - A collection of several useful generators. +* [hugo gen](/commands/hugo_gen/) - Generate documentation and syntax highlighting styles diff --git a/docs/content/en/commands/hugo_gen_man.md b/docs/content/en/commands/hugo_gen_man.md index 40267def2..f05b06298 100644 --- a/docs/content/en/commands/hugo_gen_man.md +++ b/docs/content/en/commands/hugo_gen_man.md @@ -44,5 +44,5 @@ hugo gen man [flags] [args] ### SEE ALSO -* [hugo gen](/commands/hugo_gen/) - A collection of several useful generators. +* [hugo gen](/commands/hugo_gen/) - Generate documentation and syntax highlighting styles diff --git a/docs/content/en/commands/hugo_import.md b/docs/content/en/commands/hugo_import.md index 71af58f8b..7de28e4cb 100644 --- a/docs/content/en/commands/hugo_import.md +++ b/docs/content/en/commands/hugo_import.md @@ -5,11 +5,11 @@ url: /commands/hugo_import/ --- ## hugo import -Import your site from others. +Import a site from another system ### Synopsis -Import your site from other web site generators like Jekyll. +Import a site from another system. Import requires a subcommand, e.g. `hugo import jekyll jekyll_root_path target_path`. @@ -39,6 +39,6 @@ Import requires a subcommand, e.g. `hugo import jekyll jekyll_root_path target_p ### SEE ALSO -* [hugo](/commands/hugo/) - hugo builds your site +* [hugo](/commands/hugo/) - Build your site * [hugo import jekyll](/commands/hugo_import_jekyll/) - hugo import from Jekyll diff --git a/docs/content/en/commands/hugo_import_jekyll.md b/docs/content/en/commands/hugo_import_jekyll.md index 729413671..33c91d24c 100644 --- a/docs/content/en/commands/hugo_import_jekyll.md +++ b/docs/content/en/commands/hugo_import_jekyll.md @@ -44,5 +44,5 @@ hugo import jekyll [flags] [args] ### SEE ALSO -* [hugo import](/commands/hugo_import/) - Import your site from others. +* [hugo import](/commands/hugo_import/) - Import a site from another system diff --git a/docs/content/en/commands/hugo_list.md b/docs/content/en/commands/hugo_list.md index 9fab42ca9..070a44d84 100644 --- a/docs/content/en/commands/hugo_list.md +++ b/docs/content/en/commands/hugo_list.md @@ -5,11 +5,11 @@ url: /commands/hugo_list/ --- ## hugo list -Listing out various types of content +List content ### Synopsis -Listing out various types of content. +List content. List requires a subcommand, e.g. hugo list drafts @@ -39,7 +39,7 @@ List requires a subcommand, e.g. hugo list drafts ### SEE ALSO -* [hugo](/commands/hugo/) - hugo builds your site +* [hugo](/commands/hugo/) - Build your site * [hugo list all](/commands/hugo_list_all/) - List all content * [hugo list drafts](/commands/hugo_list_drafts/) - List draft content * [hugo list expired](/commands/hugo_list_expired/) - List expired content diff --git a/docs/content/en/commands/hugo_list_all.md b/docs/content/en/commands/hugo_list_all.md index d8dc10c9e..5dd29904e 100644 --- a/docs/content/en/commands/hugo_list_all.md +++ b/docs/content/en/commands/hugo_list_all.md @@ -41,5 +41,5 @@ hugo list all [flags] [args] ### SEE ALSO -* [hugo list](/commands/hugo_list/) - Listing out various types of content +* [hugo list](/commands/hugo_list/) - List content diff --git a/docs/content/en/commands/hugo_list_drafts.md b/docs/content/en/commands/hugo_list_drafts.md index f1015bbb5..4dff70886 100644 --- a/docs/content/en/commands/hugo_list_drafts.md +++ b/docs/content/en/commands/hugo_list_drafts.md @@ -41,5 +41,5 @@ hugo list drafts [flags] [args] ### SEE ALSO -* [hugo list](/commands/hugo_list/) - Listing out various types of content +* [hugo list](/commands/hugo_list/) - List content diff --git a/docs/content/en/commands/hugo_list_expired.md b/docs/content/en/commands/hugo_list_expired.md index 35f6636e1..7b874a105 100644 --- a/docs/content/en/commands/hugo_list_expired.md +++ b/docs/content/en/commands/hugo_list_expired.md @@ -41,5 +41,5 @@ hugo list expired [flags] [args] ### SEE ALSO -* [hugo list](/commands/hugo_list/) - Listing out various types of content +* [hugo list](/commands/hugo_list/) - List content diff --git a/docs/content/en/commands/hugo_list_future.md b/docs/content/en/commands/hugo_list_future.md index bef162441..f558acd52 100644 --- a/docs/content/en/commands/hugo_list_future.md +++ b/docs/content/en/commands/hugo_list_future.md @@ -41,5 +41,5 @@ hugo list future [flags] [args] ### SEE ALSO -* [hugo list](/commands/hugo_list/) - Listing out various types of content +* [hugo list](/commands/hugo_list/) - List content diff --git a/docs/content/en/commands/hugo_list_published.md b/docs/content/en/commands/hugo_list_published.md index d53f6d941..9fc75694b 100644 --- a/docs/content/en/commands/hugo_list_published.md +++ b/docs/content/en/commands/hugo_list_published.md @@ -41,5 +41,5 @@ hugo list published [flags] [args] ### SEE ALSO -* [hugo list](/commands/hugo_list/) - Listing out various types of content +* [hugo list](/commands/hugo_list/) - List content diff --git a/docs/content/en/commands/hugo_mod.md b/docs/content/en/commands/hugo_mod.md index 7fe9dc18d..d4e305ff1 100644 --- a/docs/content/en/commands/hugo_mod.md +++ b/docs/content/en/commands/hugo_mod.md @@ -5,7 +5,7 @@ url: /commands/hugo_mod/ --- ## hugo mod -Various Hugo Modules helpers. +Manage modules ### Synopsis @@ -48,7 +48,7 @@ See https://gohugo.io/hugo-modules/ for more information. ### SEE ALSO -* [hugo](/commands/hugo/) - hugo builds your site +* [hugo](/commands/hugo/) - Build your site * [hugo mod clean](/commands/hugo_mod_clean/) - Delete the Hugo Module cache for the current project. * [hugo mod get](/commands/hugo_mod_get/) - Resolves dependencies in your current Hugo Project. * [hugo mod graph](/commands/hugo_mod_graph/) - Print a module dependency graph. diff --git a/docs/content/en/commands/hugo_mod_clean.md b/docs/content/en/commands/hugo_mod_clean.md index e7d933da7..80a983a66 100644 --- a/docs/content/en/commands/hugo_mod_clean.md +++ b/docs/content/en/commands/hugo_mod_clean.md @@ -48,5 +48,5 @@ hugo mod clean [flags] [args] ### SEE ALSO -* [hugo mod](/commands/hugo_mod/) - Various Hugo Modules helpers. +* [hugo mod](/commands/hugo_mod/) - Manage modules diff --git a/docs/content/en/commands/hugo_mod_get.md b/docs/content/en/commands/hugo_mod_get.md index 0b8a622f6..de6b01a24 100644 --- a/docs/content/en/commands/hugo_mod_get.md +++ b/docs/content/en/commands/hugo_mod_get.md @@ -72,5 +72,5 @@ hugo mod get [flags] [args] ### SEE ALSO -* [hugo mod](/commands/hugo_mod/) - Various Hugo Modules helpers. +* [hugo mod](/commands/hugo_mod/) - Manage modules diff --git a/docs/content/en/commands/hugo_mod_graph.md b/docs/content/en/commands/hugo_mod_graph.md index 506bff278..f20e26b6f 100644 --- a/docs/content/en/commands/hugo_mod_graph.md +++ b/docs/content/en/commands/hugo_mod_graph.md @@ -49,5 +49,5 @@ hugo mod graph [flags] [args] ### SEE ALSO -* [hugo mod](/commands/hugo_mod/) - Various Hugo Modules helpers. +* [hugo mod](/commands/hugo_mod/) - Manage modules diff --git a/docs/content/en/commands/hugo_mod_init.md b/docs/content/en/commands/hugo_mod_init.md index dcea44b4b..1d7bc4ac0 100644 --- a/docs/content/en/commands/hugo_mod_init.md +++ b/docs/content/en/commands/hugo_mod_init.md @@ -53,5 +53,5 @@ hugo mod init [flags] [args] ### SEE ALSO -* [hugo mod](/commands/hugo_mod/) - Various Hugo Modules helpers. +* [hugo mod](/commands/hugo_mod/) - Manage modules diff --git a/docs/content/en/commands/hugo_mod_npm.md b/docs/content/en/commands/hugo_mod_npm.md index 763b3c247..eeb684e51 100644 --- a/docs/content/en/commands/hugo_mod_npm.md +++ b/docs/content/en/commands/hugo_mod_npm.md @@ -41,6 +41,6 @@ hugo mod npm [command] [flags] ### SEE ALSO -* [hugo mod](/commands/hugo_mod/) - Various Hugo Modules helpers. +* [hugo mod](/commands/hugo_mod/) - Manage modules * [hugo mod npm pack](/commands/hugo_mod_npm_pack/) - Experimental: Prepares and writes a composite package.json file for your project. diff --git a/docs/content/en/commands/hugo_mod_tidy.md b/docs/content/en/commands/hugo_mod_tidy.md index 6d024564f..be0f92657 100644 --- a/docs/content/en/commands/hugo_mod_tidy.md +++ b/docs/content/en/commands/hugo_mod_tidy.md @@ -42,5 +42,5 @@ hugo mod tidy [flags] [args] ### SEE ALSO -* [hugo mod](/commands/hugo_mod/) - Various Hugo Modules helpers. +* [hugo mod](/commands/hugo_mod/) - Manage modules diff --git a/docs/content/en/commands/hugo_mod_vendor.md b/docs/content/en/commands/hugo_mod_vendor.md index 6f96caec2..d33b2a673 100644 --- a/docs/content/en/commands/hugo_mod_vendor.md +++ b/docs/content/en/commands/hugo_mod_vendor.md @@ -48,5 +48,5 @@ hugo mod vendor [flags] [args] ### SEE ALSO -* [hugo mod](/commands/hugo_mod/) - Various Hugo Modules helpers. +* [hugo mod](/commands/hugo_mod/) - Manage modules diff --git a/docs/content/en/commands/hugo_mod_verify.md b/docs/content/en/commands/hugo_mod_verify.md index d3f639fea..c5e755e3c 100644 --- a/docs/content/en/commands/hugo_mod_verify.md +++ b/docs/content/en/commands/hugo_mod_verify.md @@ -47,5 +47,5 @@ hugo mod verify [flags] [args] ### SEE ALSO -* [hugo mod](/commands/hugo_mod/) - Various Hugo Modules helpers. +* [hugo mod](/commands/hugo_mod/) - Manage modules diff --git a/docs/content/en/commands/hugo_new.md b/docs/content/en/commands/hugo_new.md index 2146f85fc..cfe6cc1cd 100644 --- a/docs/content/en/commands/hugo_new.md +++ b/docs/content/en/commands/hugo_new.md @@ -5,7 +5,7 @@ url: /commands/hugo_new/ --- ## hugo new -Create new content for your site +Create new content ### Synopsis @@ -44,8 +44,8 @@ Ensure you run this within the root directory of your site. ### SEE ALSO -* [hugo](/commands/hugo/) - hugo builds your site -* [hugo new content](/commands/hugo_new_content/) - Create new content for your site +* [hugo](/commands/hugo/) - Build your site +* [hugo new content](/commands/hugo_new_content/) - Create new content * [hugo new site](/commands/hugo_new_site/) - Create a new site (skeleton) * [hugo new theme](/commands/hugo_new_theme/) - Create a new theme (skeleton) diff --git a/docs/content/en/commands/hugo_new_content.md b/docs/content/en/commands/hugo_new_content.md index f0ea64ab7..c1e3ffa30 100644 --- a/docs/content/en/commands/hugo_new_content.md +++ b/docs/content/en/commands/hugo_new_content.md @@ -5,7 +5,7 @@ url: /commands/hugo_new_content/ --- ## hugo new content -Create new content for your site +Create new content ### Synopsis @@ -56,5 +56,5 @@ hugo new content [path] [flags] ### SEE ALSO -* [hugo new](/commands/hugo_new/) - Create new content for your site +* [hugo new](/commands/hugo_new/) - Create new content diff --git a/docs/content/en/commands/hugo_new_site.md b/docs/content/en/commands/hugo_new_site.md index a79e6f85a..9df879103 100644 --- a/docs/content/en/commands/hugo_new_site.md +++ b/docs/content/en/commands/hugo_new_site.md @@ -45,5 +45,5 @@ hugo new site [path] [flags] ### SEE ALSO -* [hugo new](/commands/hugo_new/) - Create new content for your site +* [hugo new](/commands/hugo_new/) - Create new content diff --git a/docs/content/en/commands/hugo_new_theme.md b/docs/content/en/commands/hugo_new_theme.md index c3003200d..6ab98f6b9 100644 --- a/docs/content/en/commands/hugo_new_theme.md +++ b/docs/content/en/commands/hugo_new_theme.md @@ -44,5 +44,5 @@ hugo new theme [name] [flags] ### SEE ALSO -* [hugo new](/commands/hugo_new/) - Create new content for your site +* [hugo new](/commands/hugo_new/) - Create new content diff --git a/docs/content/en/commands/hugo_server.md b/docs/content/en/commands/hugo_server.md index dada8c43e..b79b7f374 100644 --- a/docs/content/en/commands/hugo_server.md +++ b/docs/content/en/commands/hugo_server.md @@ -5,7 +5,7 @@ url: /commands/hugo_server/ --- ## hugo server -A high performance webserver +Start the embedded web server ### Synopsis @@ -94,6 +94,6 @@ hugo server [command] [flags] ### SEE ALSO -* [hugo](/commands/hugo/) - hugo builds your site +* [hugo](/commands/hugo/) - Build your site * [hugo server trust](/commands/hugo_server_trust/) - Install the local CA in the system trust store. diff --git a/docs/content/en/commands/hugo_server_trust.md b/docs/content/en/commands/hugo_server_trust.md index c4cf750fa..fb242d88c 100644 --- a/docs/content/en/commands/hugo_server_trust.md +++ b/docs/content/en/commands/hugo_server_trust.md @@ -38,5 +38,5 @@ hugo server trust [flags] [args] ### SEE ALSO -* [hugo server](/commands/hugo_server/) - A high performance webserver +* [hugo server](/commands/hugo_server/) - Start the embedded web server diff --git a/docs/content/en/commands/hugo_version.md b/docs/content/en/commands/hugo_version.md index 471edd2bb..bbc961093 100644 --- a/docs/content/en/commands/hugo_version.md +++ b/docs/content/en/commands/hugo_version.md @@ -5,11 +5,11 @@ url: /commands/hugo_version/ --- ## hugo version -Print Hugo version and environment info +Display version ### Synopsis -Print Hugo version and environment info. This is useful in Hugo bug reports. +Display version and environment info. This is useful in Hugo bug reports. ``` hugo version [flags] [args] @@ -41,5 +41,5 @@ hugo version [flags] [args] ### SEE ALSO -* [hugo](/commands/hugo/) - hugo builds your site +* [hugo](/commands/hugo/) - Build your site From 5db27b19c1011e6cb96440ab3bbbe076be0a070f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Tue, 15 Oct 2024 15:15:12 +0200 Subject: [PATCH 050/526] circleci: Use default docker image --- .circleci/config.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 6a82e96b7..3ab2dd4ce 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -14,9 +14,7 @@ jobs: environment: &buildenv GOMODCACHE: /root/project/gomodcache steps: - - &remote-docker - setup_remote_docker: - version: 20.10.14 + - setup_remote_docker - checkout: path: hugo - &git-config From 2939270a3bb78b3799973345c0dab7fa239cef9d Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Tue, 15 Oct 2024 13:17:24 +0000 Subject: [PATCH 051/526] releaser: Bump versions for release of 0.136.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 dee1e710e..942a8e019 100644 --- a/common/hugo/version_current.go +++ b/common/hugo/version_current.go @@ -19,5 +19,5 @@ var CurrentVersion = Version{ Major: 0, Minor: 136, PatchLevel: 0, - Suffix: "-DEV", + Suffix: "", } From 1cfe9741b93cb7db175c0a6cc094400f638db4ab Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Tue, 15 Oct 2024 13:31:16 +0000 Subject: [PATCH 052/526] releaser: Prepare repository for 0.137.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 942a8e019..870719dcb 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: 136, + Minor: 137, PatchLevel: 0, - Suffix: "", + Suffix: "-DEV", } diff --git a/hugoreleaser.env b/hugoreleaser.env index ce37f346c..927ff97e7 100644 --- a/hugoreleaser.env +++ b/hugoreleaser.env @@ -1,7 +1,8 @@ # Release env. # These will be replaced by script before release. -HUGORELEASER_TAG=v0.135.0 -HUGORELEASER_COMMITISH=f30603c47f5205e30ef83c70419f57d7eb7175ab +HUGORELEASER_TAG=v0.136.0 +HUGORELEASER_COMMITISH=2939270a3bb78b3799973345c0dab7fa239cef9d + From b1b3bbcdbd585cdac67c1d8fca4c98be11e086d6 Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Tue, 15 Oct 2024 10:05:06 -0700 Subject: [PATCH 053/526] create/skeletons: Add delimiters to archetype front matter Fixes #12945 --- create/skeletons/skeletons.go | 2 +- testscripts/commands/new.txt | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/create/skeletons/skeletons.go b/create/skeletons/skeletons.go index 802b15fb0..54b669522 100644 --- a/create/skeletons/skeletons.go +++ b/create/skeletons/skeletons.go @@ -123,7 +123,7 @@ func newSiteCreateArchetype(fs afero.Fs, createpath string, format string) (err } var buf bytes.Buffer - err = parser.InterfaceToConfig(in, metadecoders.FormatFromString(format), &buf) + err = parser.InterfaceToFrontMatter(in, metadecoders.FormatFromString(format), &buf) if err != nil { return err } diff --git a/testscripts/commands/new.txt b/testscripts/commands/new.txt index 4ac264eb1..9057f9972 100644 --- a/testscripts/commands/new.txt +++ b/testscripts/commands/new.txt @@ -65,6 +65,20 @@ cd myexistingsite hugo new post/foo.md -t mytheme grep 'Dummy content' content/post/foo.md +cd $WORK + +# In the three archetype format tests below, skip Windows testing to avoid +# newline differences when comparing to golden. + +hugo new site json-site --format json +[!windows] cmp json-site/archetypes/default.md archetype-golden-json.md + +hugo new site toml-site --format toml +[!windows] cmp toml-site/archetypes/default.md archetype-golden-toml.md + +hugo new site yaml-site --format yaml +[!windows] cmp yaml-site/archetypes/default.md archetype-golden-yaml.md + -- myexistingsite/hugo.toml -- theme = "mytheme" -- myexistingsite/content/p1.md -- @@ -80,3 +94,22 @@ draft: true --- Dummy content. + +-- archetype-golden-json.md -- +{ + "date": "{{ .Date }}", + "draft": true, + "title": "{{ replace .File.ContentBaseName \"-\" \" \" | title }}" +} +-- archetype-golden-toml.md -- ++++ +date = '{{ .Date }}' +draft = true +title = '{{ replace .File.ContentBaseName "-" " " | title }}' ++++ +-- archetype-golden-yaml.md -- +--- +date: '{{ .Date }}' +draft: true +title: '{{ replace .File.ContentBaseName "-" " " | title }}' +--- From a2f666b586b0df063ad240910b28a73dc3aa2673 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Wed, 16 Oct 2024 08:53:45 +0200 Subject: [PATCH 054/526] Remove erroneously permalink validation Fixes #12948 --- resources/page/permalinks.go | 39 +------------------ resources/page/permalinks_integration_test.go | 36 +++++++++++++++++ 2 files changed, 37 insertions(+), 38 deletions(-) diff --git a/resources/page/permalinks.go b/resources/page/permalinks.go index fe9d9f78d..ece10bb40 100644 --- a/resources/page/permalinks.go +++ b/resources/page/permalinks.go @@ -156,9 +156,6 @@ func init() { func (l PermalinkExpander) getOrParsePattern(pattern string) (func(Page) (string, error), error) { return l.patternCache.GetOrCreate(pattern, func() (func(Page) (string, error), error) { - if !l.validate(pattern) { - return nil, &permalinkExpandError{pattern: pattern, err: errPermalinkIllFormed} - } var normalized bool pattern, normalized = l.normalizeEscapeSequencesIn(pattern) @@ -234,37 +231,6 @@ type pageToPermaAttribute func(Page, string) (string, error) var attributeRegexp = regexp.MustCompile(`:\w+(\[.+?\])?`) -// validate determines if a PathPattern is well-formed -func (l PermalinkExpander) validate(pp string) bool { - if len(pp) == 0 { - return false - } - fragments := strings.Split(pp[1:], "/") - bail := false - for i := range fragments { - if bail { - return false - } - if len(fragments[i]) == 0 { - bail = true - continue - } - - matches := attributeRegexp.FindAllStringSubmatch(fragments[i], -1) - if matches == nil { - continue - } - - for _, match := range matches { - k := match[0][1:] - if _, ok := l.callback(k); !ok { - return false - } - } - } - return true -} - type permalinkExpandError struct { pattern string err error @@ -274,10 +240,7 @@ func (pee *permalinkExpandError) Error() string { return fmt.Sprintf("error expanding %q: %s", pee.pattern, pee.err) } -var ( - errPermalinkIllFormed = errors.New("permalink ill-formed") - errPermalinkAttributeUnknown = errors.New("permalink attribute not recognised") -) +var errPermalinkAttributeUnknown = errors.New("permalink attribute not recognised") func (l PermalinkExpander) pageToPermalinkDate(p Page, dateField string) (string, error) { // a Page contains a Node which provides a field Date, time.Time diff --git a/resources/page/permalinks_integration_test.go b/resources/page/permalinks_integration_test.go index 2b9e878b1..4188c70ca 100644 --- a/resources/page/permalinks_integration_test.go +++ b/resources/page/permalinks_integration_test.go @@ -18,6 +18,7 @@ import ( "github.com/bep/logg" qt "github.com/frankban/quicktest" + "github.com/gohugoio/hugo/htesting" "github.com/gohugoio/hugo/hugolib" ) @@ -232,3 +233,38 @@ slug: custom-recipe-2 b.AssertFileContent("public/delicious-recipe/recipe-1/index.html", "Single|page|/delicious-recipe/recipe-1/") b.AssertFileContent("public/delicious-recipe/custom-recipe-2/index.html", "Single|page|/delicious-recipe/custom-recipe-2/") } + +// Issue 12948. +func TestPermalinksWithEscapedColons(t *testing.T) { + t.Parallel() + + if htesting.IsWindows() { + t.Skip("Windows does not support colons in paths") + } + + files := ` +-- hugo.toml -- +disableKinds = ['home','rss','section','sitemap','taxonomy','term'] +[permalinks.page] +s2 = "/c\\:d/:slug/" +-- content/s1/p1.md -- +--- +title: p1 +url: "/a\\:b/:slug/" +--- +-- content/s2/p2.md -- +--- +title: p2 +--- +-- layouts/_default/single.html -- +{{ .Title }} +` + + b := hugolib.Test(t, files) + + b.AssertFileExists("public/a:b/p1/index.html", true) + + // The above URL comes from the URL front matter field where everything is allowed. + // We strip colons from paths constructed by Hugo (they are not supported on Windows). + b.AssertFileExists("public/cd/p2/index.html", true) +} From e4ad0c52713f228397e37416060f78f08a9265cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Wed, 16 Oct 2024 16:59:12 +0200 Subject: [PATCH 055/526] Never sanitize when url set in front matter Fixes #12954 --- resources/page/page_paths.go | 2 +- resources/page/permalinks_integration_test.go | 13 +++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/resources/page/page_paths.go b/resources/page/page_paths.go index 4826ed5f9..ea22eab81 100644 --- a/resources/page/page_paths.go +++ b/resources/page/page_paths.go @@ -254,7 +254,7 @@ func CreateTargetPaths(d TargetPathDescriptor) (tp TargetPaths) { // if page URL is explicitly set in frontmatter, // preserve its value without sanitization - if d.Kind != kinds.KindPage || d.URL == "" { + if d.URL == "" { // Note: MakePathSanitized will lower case the path if // disablePathToLower isn't set. pb.Sanitize() diff --git a/resources/page/permalinks_integration_test.go b/resources/page/permalinks_integration_test.go index 4188c70ca..52bcd6860 100644 --- a/resources/page/permalinks_integration_test.go +++ b/resources/page/permalinks_integration_test.go @@ -235,6 +235,7 @@ slug: custom-recipe-2 } // Issue 12948. +// Issue 12954. func TestPermalinksWithEscapedColons(t *testing.T) { t.Parallel() @@ -244,9 +245,14 @@ func TestPermalinksWithEscapedColons(t *testing.T) { files := ` -- hugo.toml -- -disableKinds = ['home','rss','section','sitemap','taxonomy','term'] +disableKinds = ['home','rss','sitemap','taxonomy','term'] [permalinks.page] s2 = "/c\\:d/:slug/" +-- content/s1/_index.md -- +--- +title: s1 +url: "/a\\:b/:slug/" +--- -- content/s1/p1.md -- --- title: p1 @@ -258,13 +264,16 @@ title: p2 --- -- layouts/_default/single.html -- {{ .Title }} +-- layouts/_default/list.html -- +{{ .Title }} ` b := hugolib.Test(t, files) b.AssertFileExists("public/a:b/p1/index.html", true) + b.AssertFileExists("public/a:b/s1/index.html", true) - // The above URL comes from the URL front matter field where everything is allowed. + // The above URLs come from the URL front matter field where everything is allowed. // We strip colons from paths constructed by Hugo (they are not supported on Windows). b.AssertFileExists("public/cd/p2/index.html", true) } From 64d1865c1e21c66feb96ffedda44a9eba2365af9 Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Wed, 16 Oct 2024 16:05:18 +0000 Subject: [PATCH 056/526] releaser: Bump versions for release of 0.136.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 870719dcb..39e4dc2de 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: 137, - PatchLevel: 0, - Suffix: "-DEV", + Minor: 136, + PatchLevel: 1, + Suffix: "", } From b5801d8b6add72b3fdead267237874b3a73298ce Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Wed, 16 Oct 2024 16:18:44 +0000 Subject: [PATCH 057/526] releaser: Prepare repository for 0.137.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 39e4dc2de..870719dcb 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: 136, - PatchLevel: 1, - Suffix: "", + Minor: 137, + PatchLevel: 0, + Suffix: "-DEV", } diff --git a/hugoreleaser.env b/hugoreleaser.env index 927ff97e7..d3d21ba3d 100644 --- a/hugoreleaser.env +++ b/hugoreleaser.env @@ -1,7 +1,8 @@ # Release env. # These will be replaced by script before release. -HUGORELEASER_TAG=v0.136.0 -HUGORELEASER_COMMITISH=2939270a3bb78b3799973345c0dab7fa239cef9d +HUGORELEASER_TAG=v0.136.1 +HUGORELEASER_COMMITISH=64d1865c1e21c66feb96ffedda44a9eba2365af9 + From b5852d0e685d95ce70e03ec2b4da753b82d121cf Mon Sep 17 00:00:00 2001 From: David Karlsson <35727626+dvdksn@users.noreply.github.com> Date: Thu, 17 Oct 2024 15:42:41 +0200 Subject: [PATCH 058/526] docker: Fix Dart Sass ARM64 arch mismatch, /cache permissions Also improve the final build step. Closes #12956 Closes #12957 Closes #12960 --- Dockerfile | 24 +++++++++++-------- scripts/docker/install_runtimedeps_default.sh | 20 ---------------- 2 files changed, 14 insertions(+), 30 deletions(-) delete mode 100755 scripts/docker/install_runtimedeps_default.sh diff --git a/Dockerfile b/Dockerfile index 394133aed..01e82dbf4 100755 --- a/Dockerfile +++ b/Dockerfile @@ -3,7 +3,8 @@ # Website: https://gohugo.io/ ARG GO_VERSION="1.23.2" -ARG ALPINE_VERSION=3.20 +ARG ALPINE_VERSION="3.20" +ARG DART_SASS_VERSION="1.79.3" FROM --platform=$BUILDPLATFORM tonistiigi/xx:1.5.0 AS xx FROM --platform=$BUILDPLATFORM golang:${GO_VERSION}-alpine${ALPINE_VERSION} AS gobuild @@ -45,6 +46,15 @@ RUN --mount=target=. \ xx-verify /usr/bin/hugo EOT +# dart-sass downloads the dart-sass runtime dependency +FROM alpine:${ALPINE_VERSION} AS dart-sass +ARG TARGETARCH +ARG DART_SASS_VERSION +ARG DART_ARCH=${TARGETARCH/amd64/x64} +WORKDIR /out +ADD https://github.com/sass/dart-sass/releases/download/${DART_SASS_VERSION}/dart-sass-${DART_SASS_VERSION}-linux-${DART_ARCH}.tar.gz . +RUN tar -xf dart-sass-${DART_SASS_VERSION}-linux-${DART_ARCH}.tar.gz + FROM gorun AS final COPY --from=build /usr/bin/hugo /usr/bin/hugo @@ -54,14 +64,13 @@ RUN apk add --no-cache \ libc6-compat \ git \ runuser \ - curl \ nodejs \ npm -RUN mkdir -p /var/hugo/bin && \ +RUN mkdir -p /var/hugo/bin /cache && \ addgroup -Sg 1000 hugo && \ adduser -Sg hugo -u 1000 -h /var/hugo hugo && \ - chown -R hugo: /var/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 && \ # See https://github.com/gohugoio/hugo/issues/9810 @@ -71,15 +80,11 @@ VOLUME /project WORKDIR /project USER hugo:hugo ENV HUGO_CACHEDIR=/cache -ARG BUILDARCH -ENV BUILDARCH=${BUILDARCH} ENV PATH="/var/hugo/bin:$PATH" -COPY scripts/docker scripts/docker COPY scripts/docker/entrypoint.sh /entrypoint.sh +COPY --link --from=dart-sass /out/dart-sass /var/hugo/bin/dart-sass -# Install default dependencies. -RUN scripts/docker/install_runtimedeps_default.sh # Update PATH to reflect the new dependencies. # For more complex setups, we should probably find a way to # delegate this to the script itself, but this will have to do for now. @@ -92,4 +97,3 @@ EXPOSE 1313 ENTRYPOINT ["/entrypoint.sh"] CMD ["--help"] - diff --git a/scripts/docker/install_runtimedeps_default.sh b/scripts/docker/install_runtimedeps_default.sh deleted file mode 100755 index 0b6c2c617..000000000 --- a/scripts/docker/install_runtimedeps_default.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/sh - -set -ex - -export DART_SASS_VERSION=1.79.3 - -# If $BUILDARCH=arm64, then we need to install the arm64 version of Dart Sass, -# otherwise we install the x64 version. -ARCH="x64" -if [ "$BUILDARCH" = "arm64" ]; then - ARCH="arm64" -fi - -cd /tmp -curl -LJO https://github.com/sass/dart-sass/releases/download/${DART_SASS_VERSION}/dart-sass-${DART_SASS_VERSION}-linux-${ARCH}.tar.gz -ls -ltr -tar -xf dart-sass-${DART_SASS_VERSION}-linux-${ARCH}.tar.gz -rm dart-sass-${DART_SASS_VERSION}-linux-${ARCH}.tar.gz && \ -# The dart-sass folder is added to the PATH by the caller. -mv dart-sass /var/hugo/bin \ No newline at end of file From ad985550a4faff6bc40ce4c88b11215a9330a74e Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Thu, 17 Oct 2024 14:30:05 +0000 Subject: [PATCH 059/526] releaser: Bump versions for release of 0.136.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 870719dcb..74c0976ca 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: 137, - PatchLevel: 0, - Suffix: "-DEV", + Minor: 136, + PatchLevel: 2, + Suffix: "", } From e971b7d866d8834022f0038b094dce4352338f74 Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Thu, 17 Oct 2024 14:44:10 +0000 Subject: [PATCH 060/526] releaser: Prepare repository for 0.137.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 74c0976ca..870719dcb 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: 136, - PatchLevel: 2, - Suffix: "", + Minor: 137, + PatchLevel: 0, + Suffix: "-DEV", } diff --git a/hugoreleaser.env b/hugoreleaser.env index d3d21ba3d..613eb2de0 100644 --- a/hugoreleaser.env +++ b/hugoreleaser.env @@ -1,7 +1,8 @@ # Release env. # These will be replaced by script before release. -HUGORELEASER_TAG=v0.136.1 -HUGORELEASER_COMMITISH=64d1865c1e21c66feb96ffedda44a9eba2365af9 +HUGORELEASER_TAG=v0.136.2 +HUGORELEASER_COMMITISH=ad985550a4faff6bc40ce4c88b11215a9330a74e + From 42f37b4e98e6f9621af4f1da40e831525f65fc0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Fri, 18 Oct 2024 10:30:36 +0200 Subject: [PATCH 061/526] tpl/transform: Don't fail on "no data to transform" Fixes #12964 --- tpl/transform/unmarshal.go | 3 ++- tpl/transform/unmarshal_test.go | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/tpl/transform/unmarshal.go b/tpl/transform/unmarshal.go index 898085661..0068947f6 100644 --- a/tpl/transform/unmarshal.go +++ b/tpl/transform/unmarshal.go @@ -112,9 +112,10 @@ func (ns *Namespace) Unmarshal(args ...any) (any, error) { if err != nil { return nil, fmt.Errorf("type %T not supported", data) } + dataStr = strings.TrimSpace(dataStr) if dataStr == "" { - return nil, errors.New("no data to transform") + return nil, nil } key := hashing.MD5FromStringHexEncoded(dataStr) diff --git a/tpl/transform/unmarshal_test.go b/tpl/transform/unmarshal_test.go index 1b976c449..d65f05fd4 100644 --- a/tpl/transform/unmarshal_test.go +++ b/tpl/transform/unmarshal_test.go @@ -139,6 +139,8 @@ func TestUnmarshal(t *testing.T) { a;b;c`, mime: media.Builtin.CSVType}, map[string]any{"DElimiter": ";", "Comment": "%"}, func(r [][]string) { b.Assert([][]string{{"a", "b", "c"}}, qt.DeepEquals, r) }}, + {``, nil, nil}, + {` `, nil, nil}, // errors {"thisisnotavaliddataformat", nil, false}, {testContentResource{key: "r1", content: `invalid&toml"`, mime: media.Builtin.TOMLType}, nil, false}, From f5e54d9c7d6642ba5435e7342761f684c84f4b1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Sat, 19 Oct 2024 10:00:01 +0200 Subject: [PATCH 062/526] common/herrors: Fix the deferred error message cleaner regexp Make it less gready. --- common/herrors/errors.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/herrors/errors.go b/common/herrors/errors.go index e7f91462e..40833e55c 100644 --- a/common/herrors/errors.go +++ b/common/herrors/errors.go @@ -137,7 +137,7 @@ var nilPointerErrRe = regexp.MustCompile(`at <(.*)>: error calling (.*?): runtim const deferredPrefix = "__hdeferred/" -var deferredStringToRemove = regexp.MustCompile(`executing "__hdeferred/.*" `) +var deferredStringToRemove = regexp.MustCompile(`executing "__hdeferred/.*?" `) // ImproveRenderErr improves the error message for rendering errors. func ImproveRenderErr(inErr error) (outErr error) { From d37606d2c2174e20cfba5150812da83378078f09 Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Sat, 19 Oct 2024 11:13:20 -0700 Subject: [PATCH 063/526] tpl/strings: Add TrimSpace function Closes #12962 --- tpl/strings/strings.go | 11 +++++++++++ tpl/strings/strings_test.go | 27 +++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/tpl/strings/strings.go b/tpl/strings/strings.go index 02f9a2b1e..eb5aee3cb 100644 --- a/tpl/strings/strings.go +++ b/tpl/strings/strings.go @@ -450,6 +450,17 @@ func (ns *Namespace) Trim(s, cutset any) (string, error) { return strings.Trim(ss, sc), nil } +// TrimSpace returns the given string, removing leading and trailing whitespace +// as defined by Unicode. +func (ns *Namespace) TrimSpace(s any) (string, error) { + ss, err := cast.ToStringE(s) + if err != nil { + return "", err + } + + return strings.TrimSpace(ss), nil +} + // TrimLeft returns a slice of the string s with all leading characters // contained in cutset removed. func (ns *Namespace) TrimLeft(cutset, s any) (string, error) { diff --git a/tpl/strings/strings_test.go b/tpl/strings/strings_test.go index 4fcd3b59a..0e6039ba1 100644 --- a/tpl/strings/strings_test.go +++ b/tpl/strings/strings_test.go @@ -854,3 +854,30 @@ func TestDiff(t *testing.T) { } } + +func TestTrimSpace(t *testing.T) { + t.Parallel() + c := qt.New(t) + + for _, test := range []struct { + s any + expect any + }{ + {"\n\r test \n\r", "test"}, + {template.HTML("\n\r test \n\r"), "test"}, + {[]byte("\n\r test \n\r"), "test"}, + // errors + {tstNoStringer{}, false}, + } { + + result, err := ns.TrimSpace(test.s) + + if b, ok := test.expect.(bool); ok && !b { + c.Assert(err, qt.Not(qt.IsNil)) + continue + } + + c.Assert(err, qt.IsNil) + c.Assert(result, qt.Equals, test.expect) + } +} From 352be5ba8702017997587b3b99c42e66857b0627 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Sun, 20 Oct 2024 11:25:16 +0200 Subject: [PATCH 064/526] Make sure that HugoSites is always closed when done Including all the integration tests. --- commands/commandeer.go | 19 +++++++++++++++++++ commands/server.go | 4 ---- deps/deps.go | 7 +++++++ hugolib/integrationtest_builder.go | 6 ++++++ 4 files changed, 32 insertions(+), 4 deletions(-) diff --git a/commands/commandeer.go b/commands/commandeer.go index 06565d45d..ad2adf3a2 100644 --- a/commands/commandeer.go +++ b/commands/commandeer.go @@ -42,6 +42,7 @@ import ( "github.com/gohugoio/hugo/common/hugo" "github.com/gohugoio/hugo/common/loggers" "github.com/gohugoio/hugo/common/paths" + "github.com/gohugoio/hugo/common/types" "github.com/gohugoio/hugo/config" "github.com/gohugoio/hugo/config/allconfig" "github.com/gohugoio/hugo/deps" @@ -66,6 +67,12 @@ func Execute(args []string) error { } args = mapLegacyArgs(args) cd, err := x.Execute(context.Background(), args) + if cd != nil { + if closer, ok := cd.Root.Command.(types.Closer); ok { + closer.Close() + } + } + if err != nil { if err == errHelp { cd.CobraCommand.Help() @@ -149,6 +156,18 @@ func (r *rootCommand) isVerbose() bool { return r.logger.Level() <= logg.LevelInfo } +func (r *rootCommand) Close() error { + if r.hugoSites != nil { + r.hugoSites.DeleteFunc(func(key configKey, value *hugolib.HugoSites) bool { + if value != nil { + value.Close() + } + return false + }) + } + return nil +} + func (r *rootCommand) Build(cd *simplecobra.Commandeer, bcfg hugolib.BuildCfg, cfg config.Provider) (*hugolib.HugoSites, error) { h, err := r.Hugo(cfg) if err != nil { diff --git a/commands/server.go b/commands/server.go index b16bf3148..84d4165f0 100644 --- a/commands/server.go +++ b/commands/server.go @@ -1012,10 +1012,6 @@ func (c *serverCommand) serve() error { c.r.Println("Error:", err) } - if h := c.hugoTry(); h != nil { - h.Close() - } - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() wg2, ctx := errgroup.WithContext(ctx) diff --git a/deps/deps.go b/deps/deps.go index e137aed7b..4389036cb 100644 --- a/deps/deps.go +++ b/deps/deps.go @@ -98,6 +98,8 @@ type Deps struct { // TODO(bep) rethink this re. a plugin setup, but this will have to do for now. WasmDispatchers *warpc.Dispatchers + isClosed bool + *globalErrHandler } @@ -345,6 +347,11 @@ func (d *Deps) TextTmpl() tpl.TemplateParseFinder { } func (d *Deps) Close() error { + if d.isClosed { + return nil + } + d.isClosed = true + if d.MemCache != nil { d.MemCache.Stop() } diff --git a/hugolib/integrationtest_builder.go b/hugolib/integrationtest_builder.go index 551b807db..b45defb42 100644 --- a/hugolib/integrationtest_builder.go +++ b/hugolib/integrationtest_builder.go @@ -421,6 +421,12 @@ func (s *IntegrationTestBuilder) Build() *IntegrationTestBuilder { s.Assert(err, qt.IsNil) } + s.Cleanup(func() { + if h := s.H; h != nil { + s.Assert(h.Close(), qt.IsNil) + } + }) + return s } From 88d598a0493882f0361b007980569814c0be2a77 Mon Sep 17 00:00:00 2001 From: David Karlsson <35727626+dvdksn@users.noreply.github.com> Date: Mon, 21 Oct 2024 15:28:36 +0200 Subject: [PATCH 065/526] docker: Fix permission issues in Dockerfile Closes #12971 Closes #12970 --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 01e82dbf4..65c4dbfb9 100755 --- a/Dockerfile +++ b/Dockerfile @@ -76,14 +76,14 @@ RUN mkdir -p /var/hugo/bin /cache && \ # See https://github.com/gohugoio/hugo/issues/9810 runuser -u hugo -- git config --global core.quotepath false +USER hugo:hugo VOLUME /project WORKDIR /project -USER hugo:hugo ENV HUGO_CACHEDIR=/cache ENV PATH="/var/hugo/bin:$PATH" COPY scripts/docker/entrypoint.sh /entrypoint.sh -COPY --link --from=dart-sass /out/dart-sass /var/hugo/bin/dart-sass +COPY --from=dart-sass /out/dart-sass /var/hugo/bin/dart-sass # Update PATH to reflect the new dependencies. # For more complex setups, we should probably find a way to From bfa2fd683e7f0874c7f7e2198ec407a037dadf14 Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Mon, 21 Oct 2024 13:31:54 +0000 Subject: [PATCH 066/526] releaser: Bump versions for release of 0.136.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 870719dcb..823797501 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: 137, - PatchLevel: 0, - Suffix: "-DEV", + Minor: 136, + PatchLevel: 3, + Suffix: "", } From 31d19b505d658e35ff4b1e4390c1e0fa9e41f811 Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Mon, 21 Oct 2024 13:46:41 +0000 Subject: [PATCH 067/526] releaser: Prepare repository for 0.137.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 823797501..870719dcb 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: 136, - PatchLevel: 3, - Suffix: "", + Minor: 137, + PatchLevel: 0, + Suffix: "-DEV", } diff --git a/hugoreleaser.env b/hugoreleaser.env index 613eb2de0..66d5d0cc3 100644 --- a/hugoreleaser.env +++ b/hugoreleaser.env @@ -1,7 +1,8 @@ # Release env. # These will be replaced by script before release. -HUGORELEASER_TAG=v0.136.2 -HUGORELEASER_COMMITISH=ad985550a4faff6bc40ce4c88b11215a9330a74e +HUGORELEASER_TAG=v0.136.3 +HUGORELEASER_COMMITISH=bfa2fd683e7f0874c7f7e2198ec407a037dadf14 + From 5bbe95f9c5442898cdfb100bff4f1aac52fce5ad Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Mon, 21 Oct 2024 17:46:53 -0700 Subject: [PATCH 068/526] tpl/transform: Revert unmarshal whitespace removal Fixes #12977 --- tpl/transform/transform_integration_test.go | 20 +++++++++++++++++++- tpl/transform/unmarshal.go | 3 +-- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/tpl/transform/transform_integration_test.go b/tpl/transform/transform_integration_test.go index da8290e17..5f34ff81b 100644 --- a/tpl/transform/transform_integration_test.go +++ b/tpl/transform/transform_integration_test.go @@ -248,7 +248,7 @@ func TestToMathMacros(t *testing.T) { -- hugo.toml -- disableKinds = ['page','rss','section','sitemap','taxonomy','term'] -- layouts/index.html -- -{{ $macros := dict +{{ $macros := dict "\\addBar" "\\bar{#1}" "\\bold" "\\mathbf{#1}" }} @@ -261,3 +261,21 @@ disableKinds = ['page','rss','section','sitemap','taxonomy','term'] y `) } + +// Issue #12977 +func TestUnmarshalWithIndentedYAML(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +disableKinds = ['page','rss','section','sitemap','taxonomy','term'] +-- layouts/index.html -- +{{ $yaml := "\n a:\n b: 1\n c:\n d: 2\n" }} +{{ $yaml | transform.Unmarshal | encoding.Jsonify }} +` + + b := hugolib.Test(t, files) + + b.AssertFileExists("public/index.html", true) + b.AssertFileContent("public/index.html", `{"a":{"b":1},"c":{"d":2}}`) +} diff --git a/tpl/transform/unmarshal.go b/tpl/transform/unmarshal.go index 0068947f6..a3a9c040a 100644 --- a/tpl/transform/unmarshal.go +++ b/tpl/transform/unmarshal.go @@ -112,9 +112,8 @@ func (ns *Namespace) Unmarshal(args ...any) (any, error) { if err != nil { return nil, fmt.Errorf("type %T not supported", data) } - dataStr = strings.TrimSpace(dataStr) - if dataStr == "" { + if strings.TrimSpace(dataStr) == "" { return nil, nil } From cb6e27b32a1d09956027b8e45bae0c18c1593d5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Wed, 23 Oct 2024 19:26:13 +0200 Subject: [PATCH 069/526] hugolib/commands: Fix stuck server error issues Fixes #11378 --- commands/commandeer.go | 2 +- commands/hugobuilder.go | 58 +++++++++++-------- commands/server.go | 20 ++++--- hugolib/hugo_sites.go | 3 - hugolib/hugo_sites_build.go | 10 ---- hugolib/integrationtest_builder.go | 5 -- hugolib/page__new.go | 13 +++-- hugolib/site.go | 10 ---- .../server__error_recovery_edit_config.txt | 42 ++++++++++++++ .../server__error_recovery_edit_content.txt | 42 ++++++++++++++ tpl/template.go | 1 - tpl/tplimpl/template.go | 21 ++----- 12 files changed, 143 insertions(+), 84 deletions(-) create mode 100644 testscripts/commands/server__error_recovery_edit_config.txt create mode 100644 testscripts/commands/server__error_recovery_edit_content.txt diff --git a/commands/commandeer.go b/commands/commandeer.go index ad2adf3a2..69077ad73 100644 --- a/commands/commandeer.go +++ b/commands/commandeer.go @@ -507,7 +507,7 @@ func (r *rootCommand) createLogger(running bool) (loggers.Logger, error) { return loggers.New(optsLogger), nil } -func (r *rootCommand) Reset() { +func (r *rootCommand) resetLogs() { r.logger.Reset() loggers.Log().Reset() } diff --git a/commands/hugobuilder.go b/commands/hugobuilder.go index 42bf68a37..95129018f 100644 --- a/commands/hugobuilder.go +++ b/commands/hugobuilder.go @@ -27,7 +27,6 @@ import ( "sync/atomic" "time" - "github.com/bep/logg" "github.com/bep/simplecobra" "github.com/fsnotify/fsnotify" "github.com/gohugoio/hugo/common/herrors" @@ -136,10 +135,6 @@ func (e *hugoBuilderErrState) wasErr() bool { return e.waserr } -func (c *hugoBuilder) errCount() int { - return c.r.logger.LoggCount(logg.LevelError) + loggers.Log().LoggCount(logg.LevelError) -} - // getDirList provides NewWatcher() with a list of directories to watch for changes. func (c *hugoBuilder) getDirList() ([]string, error) { h, err := c.hugo() @@ -345,7 +340,6 @@ func (c *hugoBuilder) newWatcher(pollIntervalStr string, dirList ...string) (*wa for { select { case changes := <-c.r.changesFromBuild: - c.errState.setBuildErr(nil) unlock, err := h.LockBuild() if err != nil { c.r.logger.Errorln("Failed to acquire a build lock: %s", err) @@ -358,7 +352,7 @@ func (c *hugoBuilder) newWatcher(pollIntervalStr string, dirList ...string) (*wa } if c.s != nil && c.s.doLiveReload { doReload := c.changeDetector == nil || len(c.changeDetector.changed()) > 0 - doReload = doReload || c.showErrorInBrowser && c.errCount() > 0 + doReload = doReload || c.showErrorInBrowser && c.errState.buildErr() != nil if doReload { livereload.ForceRefresh() } @@ -372,7 +366,7 @@ func (c *hugoBuilder) newWatcher(pollIntervalStr string, dirList ...string) (*wa return } c.handleEvents(watcher, staticSyncer, evs, configSet) - if c.showErrorInBrowser && c.errCount() > 0 { + if c.showErrorInBrowser && c.errState.buildErr() != nil { // Need to reload browser to show the error livereload.ForceRefresh() } @@ -419,11 +413,17 @@ func (c *hugoBuilder) build() error { } func (c *hugoBuilder) buildSites(noBuildLock bool) (err error) { - h, err := c.hugo() + defer func() { + c.errState.setBuildErr(err) + }() + + var h *hugolib.HugoSites + h, err = c.hugo() if err != nil { - return err + return } - return h.Build(hugolib.BuildCfg{NoBuildLock: noBuildLock}) + err = h.Build(hugolib.BuildCfg{NoBuildLock: noBuildLock}) + return } func (c *hugoBuilder) copyStatic() (map[string]uint64, error) { @@ -619,6 +619,9 @@ func (c *hugoBuilder) fullRebuild(changeType string) { // Set the processing on pause until the state is recovered. c.errState.setPaused(true) c.handleBuildErr(err, "Failed to reload config") + if c.s.doLiveReload { + livereload.ForceRefresh() + } } else { c.errState.setPaused(false) } @@ -1081,37 +1084,44 @@ func (c *hugoBuilder) printChangeDetected(typ string) { c.r.logger.Println(htime.Now().Format(layout)) } -func (c *hugoBuilder) rebuildSites(events []fsnotify.Event) error { +func (c *hugoBuilder) rebuildSites(events []fsnotify.Event) (err error) { + defer func() { + c.errState.setBuildErr(err) + }() if err := c.errState.buildErr(); err != nil { ferrs := herrors.UnwrapFileErrorsWithErrorContext(err) for _, err := range ferrs { events = append(events, fsnotify.Event{Name: err.Position().Filename, Op: fsnotify.Write}) } } - c.errState.setBuildErr(nil) - h, err := c.hugo() + var h *hugolib.HugoSites + h, err = c.hugo() if err != nil { - return err + return } - - return h.Build(hugolib.BuildCfg{NoBuildLock: true, RecentlyVisited: c.visitedURLs, ErrRecovery: c.errState.wasErr()}, events...) + err = h.Build(hugolib.BuildCfg{NoBuildLock: true, RecentlyVisited: c.visitedURLs, ErrRecovery: c.errState.wasErr()}, events...) + return } -func (c *hugoBuilder) rebuildSitesForChanges(ids []identity.Identity) error { - c.errState.setBuildErr(nil) - h, err := c.hugo() +func (c *hugoBuilder) rebuildSitesForChanges(ids []identity.Identity) (err error) { + defer func() { + c.errState.setBuildErr(err) + }() + + var h *hugolib.HugoSites + h, err = c.hugo() if err != nil { - return err + return } whatChanged := &hugolib.WhatChanged{} whatChanged.Add(ids...) err = h.Build(hugolib.BuildCfg{NoBuildLock: true, WhatChanged: whatChanged, RecentlyVisited: c.visitedURLs, ErrRecovery: c.errState.wasErr()}) - c.errState.setBuildErr(err) - return err + + return } func (c *hugoBuilder) reloadConfig() error { - c.r.Reset() + c.r.resetLogs() c.r.configVersionID.Add(1) if err := c.withConfE(func(conf *commonConfig) error { diff --git a/commands/server.go b/commands/server.go index 84d4165f0..6b801b158 100644 --- a/commands/server.go +++ b/commands/server.go @@ -648,9 +648,8 @@ func (c *serverCommand) setServerInfoInConfig() error { } func (c *serverCommand) getErrorWithContext() any { - errCount := c.errCount() - - if errCount == 0 { + buildErr := c.errState.buildErr() + if buildErr == nil { return nil } @@ -659,7 +658,7 @@ func (c *serverCommand) getErrorWithContext() any { m["Error"] = cleanErrorLog(c.r.logger.Errors()) m["Version"] = hugo.BuildVersionString() - ferrors := herrors.UnwrapFileErrorsWithErrorContext(c.errState.buildErr()) + ferrors := herrors.UnwrapFileErrorsWithErrorContext(buildErr) m["Files"] = ferrors return m @@ -830,22 +829,25 @@ func (c *serverCommand) fixURL(baseURLFromConfig, baseURLFromFlag string, port i return u.String(), nil } -func (c *serverCommand) partialReRender(urls ...string) error { +func (c *serverCommand) partialReRender(urls ...string) (err error) { defer func() { c.errState.setWasErr(false) }() - c.errState.setBuildErr(nil) visited := types.NewEvictingStringQueue(len(urls)) for _, url := range urls { visited.Add(url) } - h, err := c.hugo() + var h *hugolib.HugoSites + h, err = c.hugo() if err != nil { - return err + return } + // Note: We do not set NoBuildLock as the file lock is not acquired at this stage. - return h.Build(hugolib.BuildCfg{NoBuildLock: false, RecentlyVisited: visited, PartialReRender: true, ErrRecovery: c.errState.wasErr()}) + err = h.Build(hugolib.BuildCfg{NoBuildLock: false, RecentlyVisited: visited, PartialReRender: true, ErrRecovery: c.errState.wasErr()}) + + return } func (c *serverCommand) serve() error { diff --git a/hugolib/hugo_sites.go b/hugolib/hugo_sites.go index 659a772f2..a5186fd44 100644 --- a/hugolib/hugo_sites.go +++ b/hugolib/hugo_sites.go @@ -179,9 +179,6 @@ type hugoSitesInit struct { // Loads the data from all of the /data folders. data *lazy.Init - // Performs late initialization (before render) of the templates. - layouts *lazy.Init - // Loads the Git info and CODEOWNERS for all the pages if enabled. gitInfo *lazy.Init } diff --git a/hugolib/hugo_sites_build.go b/hugolib/hugo_sites_build.go index 65ce946e9..dd548be51 100644 --- a/hugolib/hugo_sites_build.go +++ b/hugolib/hugo_sites_build.go @@ -250,10 +250,6 @@ func (h *HugoSites) process(ctx context.Context, l logg.LevelLogger, config *Bui l = l.WithField("step", "process") defer loggers.TimeTrackf(l, time.Now(), nil, "") - if _, err := h.init.layouts.Do(ctx); err != nil { - return err - } - if len(events) > 0 { // This is a rebuild triggered from file events. return h.processPartialFileEvents(ctx, l, config, init, events) @@ -1067,8 +1063,6 @@ func (h *HugoSites) processPartialFileEvents(ctx context.Context, l logg.LevelLo } if tmplChanged || i18nChanged { - // TODO(bep) we should split this, but currently the loading of i18n and layout files are tied together. See #12048. - h.init.layouts.Reset() if err := loggers.TimeTrackfn(func() (logg.LevelLogger, error) { // TODO(bep) this could probably be optimized to somehow // only load the changed templates and its dependencies, but that is non-trivial. @@ -1141,10 +1135,6 @@ func (s *Site) handleContentAdapterChanges(bi pagesfromdata.BuildInfo, buildConf } func (h *HugoSites) processContentAdaptersOnRebuild(ctx context.Context, buildConfig *BuildCfg) error { - // Make sure the layouts are initialized. - if _, err := h.init.layouts.Do(context.Background()); err != nil { - return err - } g := rungroup.Run[*pagesfromdata.PagesFromTemplate](ctx, rungroup.Config[*pagesfromdata.PagesFromTemplate]{ NumWorkers: h.numWorkers, Handle: func(ctx context.Context, p *pagesfromdata.PagesFromTemplate) error { diff --git a/hugolib/integrationtest_builder.go b/hugolib/integrationtest_builder.go index b45defb42..b806ad7c1 100644 --- a/hugolib/integrationtest_builder.go +++ b/hugolib/integrationtest_builder.go @@ -246,11 +246,6 @@ func (s *IntegrationTestBuilder) AssertBuildCountGitInfo(count int) { s.Assert(s.H.init.gitInfo.InitCount(), qt.Equals, count) } -func (s *IntegrationTestBuilder) AssertBuildCountLayouts(count int) { - s.Helper() - s.Assert(s.H.init.layouts.InitCount(), qt.Equals, count) -} - func (s *IntegrationTestBuilder) AssertFileCount(dirname string, expected int) { s.Helper() fs := s.fs.WorkingDirReadOnly diff --git a/hugolib/page__new.go b/hugolib/page__new.go index b7d9b10f2..9a4972d07 100644 --- a/hugolib/page__new.go +++ b/hugolib/page__new.go @@ -34,6 +34,15 @@ import ( var pageIDCounter atomic.Uint64 func (h *HugoSites) newPage(m *pageMeta) (*pageState, *paths.Path, error) { + p, pth, err := h.doNewPage(m) + if err != nil { + // Make sure that any partially created page part is marked as stale. + m.MarkStale() + } + return p, pth, err +} + +func (h *HugoSites) doNewPage(m *pageMeta) (*pageState, *paths.Path, error) { m.Staler = &resources.AtomicStaler{} if m.pageMetaParams == nil { m.pageMetaParams = &pageMetaParams{ @@ -231,10 +240,6 @@ func (h *HugoSites) newPage(m *pageMeta) (*pageState, *paths.Path, error) { } return ps, nil }() - // Make sure to evict any cached and now stale data. - if err != nil { - m.MarkStale() - } if ps == nil { return nil, nil, err diff --git a/hugolib/site.go b/hugolib/site.go index 08031390b..24ee5dcc5 100644 --- a/hugolib/site.go +++ b/hugolib/site.go @@ -344,7 +344,6 @@ func newHugoSites(cfg deps.DepsCfg, d *deps.Deps, pageTrees *pageTrees, sites [] skipRebuildForFilenames: make(map[string]bool), init: &hugoSitesInit{ data: lazy.New(), - layouts: lazy.New(), gitInfo: lazy.New(), }, } @@ -400,15 +399,6 @@ func newHugoSites(cfg deps.DepsCfg, d *deps.Deps, pageTrees *pageTrees, sites [] return nil, nil }) - h.init.layouts.Add(func(context.Context) (any, error) { - for _, s := range h.Sites { - if err := s.Tmpl().(tpl.TemplateManager).MarkReady(); err != nil { - return nil, err - } - } - return nil, nil - }) - h.init.gitInfo.Add(func(context.Context) (any, error) { err := h.loadGitInfo() if err != nil { diff --git a/testscripts/commands/server__error_recovery_edit_config.txt b/testscripts/commands/server__error_recovery_edit_config.txt new file mode 100644 index 000000000..664d99272 --- /dev/null +++ b/testscripts/commands/server__error_recovery_edit_config.txt @@ -0,0 +1,42 @@ +# Test the hugo server command when adding an error to a config file +# and then fixing it. + +hugo server & + +waitServer + +httpget ${HUGOTEST_BASEURL_0}p1/ 'Title: P1' + +replace $WORK/hugo.toml 'title =' 'titlefoo' +httpget ${HUGOTEST_BASEURL_0}p1/ 'failed' + +replace $WORK/hugo.toml 'titlefoo' 'title =' +httpget ${HUGOTEST_BASEURL_0}p1/ 'Title: P1' + +stopServer + +-- hugo.toml -- +title = "Hugo Server Test" +baseURL = "https://example.org/" +disableKinds = ["taxonomy", "term", "sitemap"] +-- layouts/index.html -- +Title: {{ .Title }}|BaseURL: {{ site.BaseURL }}| +-- layouts/_default/single.html -- +Title: {{ .Title }}|BaseURL: {{ site.BaseURL }}| +-- content/_index.md -- +--- +title: Hugo Home +--- +-- content/p1/index.md -- +--- +title: P1 +--- +-- content/p2/index.md -- +--- +title: P2 +--- +-- static/staticfiles/static.txt -- +static + + + diff --git a/testscripts/commands/server__error_recovery_edit_content.txt b/testscripts/commands/server__error_recovery_edit_content.txt new file mode 100644 index 000000000..f5ea7e94b --- /dev/null +++ b/testscripts/commands/server__error_recovery_edit_content.txt @@ -0,0 +1,42 @@ +# Test the hugo server command when adding a front matter error to a content file +# and then fixing it. + +hugo server & + +waitServer + +httpget ${HUGOTEST_BASEURL_0}p1/ 'Title: P1' + +replace $WORK/content/p1/index.md 'title:' 'titlecolon' +httpget ${HUGOTEST_BASEURL_0}p1/ 'failed' + +replace $WORK/content/p1/index.md 'titlecolon' 'title:' +httpget ${HUGOTEST_BASEURL_0}p1/ 'Title: P1' + +stopServer + +-- hugo.toml -- +title = "Hugo Server Test" +baseURL = "https://example.org/" +disableKinds = ["taxonomy", "term", "sitemap"] +-- layouts/index.html -- +Title: {{ .Title }}|BaseURL: {{ site.BaseURL }}| +-- layouts/_default/single.html -- +Title: {{ .Title }}|BaseURL: {{ site.BaseURL }}| +-- content/_index.md -- +--- +title: Hugo Home +--- +-- content/p1/index.md -- +--- +title: P1 +--- +-- content/p2/index.md -- +--- +title: P2 +--- +-- static/staticfiles/static.txt -- +static + + + diff --git a/tpl/template.go b/tpl/template.go index cb8d2b321..18a31e231 100644 --- a/tpl/template.go +++ b/tpl/template.go @@ -40,7 +40,6 @@ type TemplateManager interface { TemplateHandler TemplateFuncGetter AddTemplate(name, tpl string) error - MarkReady() error } // TemplateVariants describes the possible variants of a template. diff --git a/tpl/tplimpl/template.go b/tpl/tplimpl/template.go index 04ccdaad2..fd07db68e 100644 --- a/tpl/tplimpl/template.go +++ b/tpl/tplimpl/template.go @@ -168,6 +168,10 @@ func newTemplateHandlers(d *deps.Deps) (*tpl.TemplateHandlers, error) { return nil, err } + if err := h.main.createPrototypes(); err != nil { + return nil, err + } + e := &templateExec{ d: d, executor: exec, @@ -312,28 +316,11 @@ func (t *templateExec) GetFunc(name string) (reflect.Value, bool) { return v, found } -func (t *templateExec) MarkReady() error { - var err error - t.readyInit.Do(func() { - // We only need the clones if base templates are in use. - if len(t.needsBaseof) > 0 { - err = t.main.createPrototypes() - if err != nil { - return - } - } - }) - - return err -} - type templateHandler struct { main *templateNamespace needsBaseof map[string]templateInfo baseof map[string]templateInfo - readyInit sync.Once - // This is the filesystem to load the templates from. All the templates are // stored in the root of this filesystem. layoutsFs afero.Fs From 46cccb021bc6425455f4eec093f5cc4a32f1d12c Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Thu, 24 Oct 2024 12:26:27 +0000 Subject: [PATCH 070/526] releaser: Bump versions for release of 0.136.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 870719dcb..095a94c50 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: 137, - PatchLevel: 0, - Suffix: "-DEV", + Minor: 136, + PatchLevel: 5, + Suffix: "", } From ec3890affe55af1fa196901f446cc0e7df059da8 Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Thu, 24 Oct 2024 12:41:02 +0000 Subject: [PATCH 071/526] releaser: Prepare repository for 0.137.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 095a94c50..870719dcb 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: 136, - PatchLevel: 5, - Suffix: "", + Minor: 137, + PatchLevel: 0, + Suffix: "-DEV", } diff --git a/hugoreleaser.env b/hugoreleaser.env index 66d5d0cc3..590267381 100644 --- a/hugoreleaser.env +++ b/hugoreleaser.env @@ -1,7 +1,8 @@ # Release env. # These will be replaced by script before release. -HUGORELEASER_TAG=v0.136.3 -HUGORELEASER_COMMITISH=bfa2fd683e7f0874c7f7e2198ec407a037dadf14 +HUGORELEASER_TAG=v0.136.5 +HUGORELEASER_COMMITISH=46cccb021bc6425455f4eec093f5cc4a32f1d12c + From e10915f80af18cbe24b0f5e22922b87ce0bc74ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Sat, 26 Oct 2024 15:36:02 +0200 Subject: [PATCH 072/526] dynacache: Fix potential deadlocks on panics in GetOrCreate --- cache/dynacache/dynacache_test.go | 25 +++++++++++++++++++++++++ go.mod | 2 +- go.sum | 2 ++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/cache/dynacache/dynacache_test.go b/cache/dynacache/dynacache_test.go index a58a8d94b..9a932729b 100644 --- a/cache/dynacache/dynacache_test.go +++ b/cache/dynacache/dynacache_test.go @@ -14,8 +14,10 @@ package dynacache import ( + "fmt" "path/filepath" "testing" + "time" qt "github.com/frankban/quicktest" "github.com/gohugoio/hugo/common/loggers" @@ -165,6 +167,29 @@ func TestClear(t *testing.T) { cache.adjustCurrentMaxSize() } +func TestPanicInCreate(t *testing.T) { + t.Parallel() + c := qt.New(t) + cache := newTestCache(t) + + p1 := GetOrCreatePartition[string, testItem](cache, "/aaaa/bbbb", OptionsPartition{Weight: 30, ClearWhen: ClearOnRebuild}) + + for i := 0; i < 3; i++ { + for j := 0; j < 3; j++ { + _, err := p1.GetOrCreate(fmt.Sprintf("panic1-%d", i), func(string) (testItem, error) { + panic("failed") + }) + + c.Assert(err, qt.Not(qt.IsNil)) + + _, err = p1.GetOrCreateWitTimeout(fmt.Sprintf("panic2-%d", i), 10*time.Second, func(string) (testItem, error) { + panic("failed") + }) + c.Assert(err, qt.Not(qt.IsNil)) + } + } +} + func TestAdjustCurrentMaxSize(t *testing.T) { t.Parallel() c := qt.New(t) diff --git a/go.mod b/go.mod index 392119e17..3f5d4a707 100644 --- a/go.mod +++ b/go.mod @@ -16,7 +16,7 @@ require ( github.com/bep/gowebp v0.3.0 github.com/bep/helpers v0.5.0 github.com/bep/imagemeta v0.8.1 - github.com/bep/lazycache v0.4.0 + github.com/bep/lazycache v0.6.0 github.com/bep/logg v0.4.0 github.com/bep/mclib v1.20400.20402 github.com/bep/overlayfs v0.9.2 diff --git a/go.sum b/go.sum index 6f3e61e89..6346fb099 100644 --- a/go.sum +++ b/go.sum @@ -143,6 +143,8 @@ github.com/bep/imagemeta v0.8.1 h1:tjZLPRftjxU7PTI87o5e5WKOFQ4S9S0engiP1OTpJTI= github.com/bep/imagemeta v0.8.1/go.mod h1:5piPAq5Qomh07m/dPPCLN3mDJyFusvUG7VwdRD/vX0s= github.com/bep/lazycache v0.4.0 h1:X8yVyWNVupPd4e1jV7efi3zb7ZV/qcjKQgIQ5aPbkYI= github.com/bep/lazycache v0.4.0/go.mod h1:NmRm7Dexh3pmR1EignYR8PjO2cWybFQ68+QgY3VMCSc= +github.com/bep/lazycache v0.6.0 h1:0vCgFo7TBtMQpSx64jnH1sagmw0ZougIFRpsqPHTa5U= +github.com/bep/lazycache v0.6.0/go.mod h1:NmRm7Dexh3pmR1EignYR8PjO2cWybFQ68+QgY3VMCSc= github.com/bep/logg v0.4.0 h1:luAo5mO4ZkhA5M1iDVDqDqnBBnlHjmtZF6VAyTp+nCQ= github.com/bep/logg v0.4.0/go.mod h1:Ccp9yP3wbR1mm++Kpxet91hAZBEQgmWgFgnXX3GkIV0= github.com/bep/mclib v1.20400.20402 h1:olpCE2WSPpOAbFE1R4hnftSEmQ34+xzy2HRzd0m69rA= From 62567d38205a61134a6822d37a534520772419f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Sun, 27 Oct 2024 10:31:59 +0100 Subject: [PATCH 073/526] deps: Upgrade github.com/bep/lazycache v0.6.0 => v0.7.0 --- cache/dynacache/dynacache.go | 25 +++++++++++++---- cache/dynacache/dynacache_test.go | 46 +++++++++++++++++++++++++------ go.mod | 2 +- go.sum | 2 ++ 4 files changed, 60 insertions(+), 15 deletions(-) diff --git a/cache/dynacache/dynacache.go b/cache/dynacache/dynacache.go index 5007e27ba..a906a0dd3 100644 --- a/cache/dynacache/dynacache.go +++ b/cache/dynacache/dynacache.go @@ -430,12 +430,25 @@ func (p *Partition[K, V]) doGetOrCreateWitTimeout(key K, duration time.Duration, errch := make(chan error, 1) go func() { - v, _, err := p.c.GetOrCreate(key, create) - if err != nil { - errch <- err - return - } - resultch <- v + var ( + v V + err error + ) + defer func() { + if r := recover(); r != nil { + if rerr, ok := r.(error); ok { + err = rerr + } else { + err = fmt.Errorf("panic: %v", r) + } + } + if err != nil { + errch <- err + } else { + resultch <- v + } + }() + v, _, err = p.c.GetOrCreate(key, create) }() select { diff --git a/cache/dynacache/dynacache_test.go b/cache/dynacache/dynacache_test.go index 9a932729b..87239479b 100644 --- a/cache/dynacache/dynacache_test.go +++ b/cache/dynacache/dynacache_test.go @@ -14,6 +14,7 @@ package dynacache import ( + "errors" "fmt" "path/filepath" "testing" @@ -174,18 +175,47 @@ func TestPanicInCreate(t *testing.T) { p1 := GetOrCreatePartition[string, testItem](cache, "/aaaa/bbbb", OptionsPartition{Weight: 30, ClearWhen: ClearOnRebuild}) + willPanic := func(i int) func() { + return func() { + p1.GetOrCreate(fmt.Sprintf("panic-%d", i), func(key string) (testItem, error) { + panic(errors.New(key)) + }) + } + } + + // GetOrCreateWitTimeout needs to recover from panics in the create func. + willErr := func(i int) error { + _, err := p1.GetOrCreateWitTimeout(fmt.Sprintf("error-%d", i), 10*time.Second, func(key string) (testItem, error) { + return testItem{}, errors.New(key) + }) + return err + } + for i := 0; i < 3; i++ { for j := 0; j < 3; j++ { - _, err := p1.GetOrCreate(fmt.Sprintf("panic1-%d", i), func(string) (testItem, error) { - panic("failed") - }) + c.Assert(willPanic(i), qt.PanicMatches, fmt.Sprintf("panic-%d", i)) + c.Assert(willErr(i), qt.ErrorMatches, fmt.Sprintf("error-%d", i)) + } + } - c.Assert(err, qt.Not(qt.IsNil)) - - _, err = p1.GetOrCreateWitTimeout(fmt.Sprintf("panic2-%d", i), 10*time.Second, func(string) (testItem, error) { - panic("failed") + // Test the same keys again without the panic. + for i := 0; i < 3; i++ { + for j := 0; j < 3; j++ { + v, err := p1.GetOrCreate(fmt.Sprintf("panic-%d", i), func(key string) (testItem, error) { + return testItem{ + name: key, + }, nil }) - c.Assert(err, qt.Not(qt.IsNil)) + c.Assert(err, qt.IsNil) + c.Assert(v.name, qt.Equals, fmt.Sprintf("panic-%d", i)) + + v, err = p1.GetOrCreateWitTimeout(fmt.Sprintf("error-%d", i), 10*time.Second, func(key string) (testItem, error) { + return testItem{ + name: key, + }, nil + }) + c.Assert(err, qt.IsNil) + c.Assert(v.name, qt.Equals, fmt.Sprintf("error-%d", i)) } } } diff --git a/go.mod b/go.mod index 3f5d4a707..108241dc5 100644 --- a/go.mod +++ b/go.mod @@ -16,7 +16,7 @@ require ( github.com/bep/gowebp v0.3.0 github.com/bep/helpers v0.5.0 github.com/bep/imagemeta v0.8.1 - github.com/bep/lazycache v0.6.0 + github.com/bep/lazycache v0.7.0 github.com/bep/logg v0.4.0 github.com/bep/mclib v1.20400.20402 github.com/bep/overlayfs v0.9.2 diff --git a/go.sum b/go.sum index 6346fb099..cfc34880b 100644 --- a/go.sum +++ b/go.sum @@ -145,6 +145,8 @@ github.com/bep/lazycache v0.4.0 h1:X8yVyWNVupPd4e1jV7efi3zb7ZV/qcjKQgIQ5aPbkYI= github.com/bep/lazycache v0.4.0/go.mod h1:NmRm7Dexh3pmR1EignYR8PjO2cWybFQ68+QgY3VMCSc= github.com/bep/lazycache v0.6.0 h1:0vCgFo7TBtMQpSx64jnH1sagmw0ZougIFRpsqPHTa5U= github.com/bep/lazycache v0.6.0/go.mod h1:NmRm7Dexh3pmR1EignYR8PjO2cWybFQ68+QgY3VMCSc= +github.com/bep/lazycache v0.7.0 h1:VM257SkkjcR9z55eslXTkUIX8QMNKoqQRNKV/4xIkCY= +github.com/bep/lazycache v0.7.0/go.mod h1:NmRm7Dexh3pmR1EignYR8PjO2cWybFQ68+QgY3VMCSc= github.com/bep/logg v0.4.0 h1:luAo5mO4ZkhA5M1iDVDqDqnBBnlHjmtZF6VAyTp+nCQ= github.com/bep/logg v0.4.0/go.mod h1:Ccp9yP3wbR1mm++Kpxet91hAZBEQgmWgFgnXX3GkIV0= github.com/bep/mclib v1.20400.20402 h1:olpCE2WSPpOAbFE1R4hnftSEmQ34+xzy2HRzd0m69rA= From 89bd025ebfd2c559039826641702941fc35a7fdb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Wed, 30 Oct 2024 09:29:38 +0100 Subject: [PATCH 074/526] Build without the deploy feature by default Build tags setup changed to: * !nodeploy => withdeploy * nodeploy => !withdeploy Also move the deploy feature out into its own release archives. See #12994 for the primary motivation for this change. But this also greatly reduces the number of dependencies in Hugo when you don't need this feature and cuts the binary size greatly. Fixes #12994 --- .github/workflows/test.yml | 6 ++-- .gitignore | 4 ++- Dockerfile | 4 +-- commands/deploy.go | 17 ++--------- commands/deploy_off.go | 7 +++-- deploy/cloudfront.go | 4 +-- deploy/deploy.go | 4 +-- deploy/deploy_azure.go | 4 +-- deploy/deploy_test.go | 4 +-- deploy/deployconfig/deployConfig_test.go | 4 +-- deploy/google.go | 4 +-- hugoreleaser.toml | 22 ++++++++++++++ magefile.go | 2 +- main_withdeploy_test.go | 29 +++++++++++++++++++ testscripts/commands/gen.txt | 5 ---- .../{commands => withdeploy}/deploy.txt | 0 16 files changed, 78 insertions(+), 42 deletions(-) create mode 100644 main_withdeploy_test.go rename testscripts/{commands => withdeploy}/deploy.txt (100%) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index b513863c5..05d9d23a2 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -112,17 +112,17 @@ jobs: sass --version; mage -v check; env: - HUGO_BUILD_TAGS: extended + HUGO_BUILD_TAGS: extended,withdeploy - if: matrix.os == 'windows-latest' # See issue #11052. We limit the build to regular test (no -race flag) on Windows for now. name: Test run: | mage -v test; env: - HUGO_BUILD_TAGS: extended + HUGO_BUILD_TAGS: extended,withdeploy - name: Build tags run: | - go install -tags extended,nodeploy + go install -tags extended - if: matrix.os == 'ubuntu-latest' name: Build for dragonfly run: | diff --git a/.gitignore b/.gitignore index b170fe204..a1fa54656 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ *.test -imports.* \ No newline at end of file +imports.* +dist/ +public/ diff --git a/Dockerfile b/Dockerfile index 65c4dbfb9..6d1bf78c4 100755 --- a/Dockerfile +++ b/Dockerfile @@ -21,8 +21,8 @@ COPY --from=xx / / ARG TARGETPLATFORM RUN xx-apk add musl-dev gcc g++ -# Optionally set HUGO_BUILD_TAGS to "none" or "nodeploy" when building like so: -# docker build --build-arg HUGO_BUILD_TAGS=nodeploy . +# Optionally set HUGO_BUILD_TAGS to "none" or "withdeploy" when building like so: +# docker build --build-arg HUGO_BUILD_TAGS=withdeploy . # # We build the extended version by default. ARG HUGO_BUILD_TAGS="extended" diff --git a/commands/deploy.go b/commands/deploy.go index f0bc670ca..f9c22be48 100644 --- a/commands/deploy.go +++ b/commands/deploy.go @@ -11,21 +11,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -//go:build !nodeploy -// +build !nodeploy - -// Copyright 2024 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. -// 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. +//go:build withdeploy +// +build withdeploy package commands diff --git a/commands/deploy_off.go b/commands/deploy_off.go index 8a481bd96..7eb6429c5 100644 --- a/commands/deploy_off.go +++ b/commands/deploy_off.go @@ -11,8 +11,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -//go:build nodeploy -// +build nodeploy +//go:build !withdeploy +// +build !withdeploy // Copyright 2024 The Hugo Authors. All rights reserved. // @@ -31,6 +31,7 @@ package commands import ( "context" + "errors" "github.com/bep/simplecobra" "github.com/spf13/cobra" @@ -40,7 +41,7 @@ func newDeployCommand() simplecobra.Commander { return &simpleCommand{ name: "deploy", run: func(ctx context.Context, cd *simplecobra.Commandeer, r *rootCommand, args []string) error { - return nil + return errors.New("deploy not supported in this version of Hugo; install a release with 'withdeploy' in the archive filename or build yourself with the 'withdeploy' build tag. Also see https://github.com/gohugoio/hugo/pull/12995") }, withc: func(cmd *cobra.Command, r *rootCommand) { cmd.Hidden = true diff --git a/deploy/cloudfront.go b/deploy/cloudfront.go index 4481eb52a..29c0a7f8c 100644 --- a/deploy/cloudfront.go +++ b/deploy/cloudfront.go @@ -11,8 +11,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -//go:build !nodeploy -// +build !nodeploy +//go:build withdeploy +// +build withdeploy package deploy diff --git a/deploy/deploy.go b/deploy/deploy.go index a69e974b7..0c379ffb8 100644 --- a/deploy/deploy.go +++ b/deploy/deploy.go @@ -11,8 +11,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -//go:build !nodeploy -// +build !nodeploy +//go:build withdeploy +// +build withdeploy package deploy diff --git a/deploy/deploy_azure.go b/deploy/deploy_azure.go index fc7daca3b..521d8f094 100644 --- a/deploy/deploy_azure.go +++ b/deploy/deploy_azure.go @@ -11,8 +11,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -//go:build !solaris && !nodeploy -// +build !solaris,!nodeploy +//go:build !solaris && withdeploy +// +build !solaris,withdeploy package deploy diff --git a/deploy/deploy_test.go b/deploy/deploy_test.go index 17dffc25a..f290d6c81 100644 --- a/deploy/deploy_test.go +++ b/deploy/deploy_test.go @@ -11,8 +11,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -//go:build !nodeploy -// +build !nodeploy +//go:build withdeploy +// +build withdeploy package deploy diff --git a/deploy/deployconfig/deployConfig_test.go b/deploy/deployconfig/deployConfig_test.go index 0b92a5cb1..8a3ad2d8a 100644 --- a/deploy/deployconfig/deployConfig_test.go +++ b/deploy/deployconfig/deployConfig_test.go @@ -11,8 +11,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -//go:build !nodeploy -// +build !nodeploy +//go:build withdeploy +// +build withdeploy package deployconfig diff --git a/deploy/google.go b/deploy/google.go index 6e492bc01..e4683aa81 100644 --- a/deploy/google.go +++ b/deploy/google.go @@ -11,8 +11,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -//go:build !nodeploy -// +build !nodeploy +//go:build withdeploy +// +build withdeploy package deploy diff --git a/hugoreleaser.toml b/hugoreleaser.toml index d516bd34b..8c3693739 100644 --- a/hugoreleaser.toml +++ b/hugoreleaser.toml @@ -119,6 +119,24 @@ archive_alias_replacements = { "linux-amd64.tar.gz" = "Linux-64bit.tar.gz" } [[builds.os.archs]] goarch = "amd64" +[[builds]] + path = "container1/unix/extended-withdeploy" + + [builds.build_settings] + flags = ["-buildmode", "exe", "-tags", "extended,withdeploy"] + env = ["CGO_ENABLED=1"] + + [[builds.os]] + goos = "darwin" + [builds.os.build_settings] + env = ["CGO_ENABLED=1", "CC=o64-clang", "CXX=o64-clang++"] + [[builds.os.archs]] + goarch = "universal" + [[builds.os]] + goos = "linux" + [[builds.os.archs]] + goarch = "amd64" + [[builds]] path = "container2/linux/extended" @@ -173,6 +191,10 @@ archive_alias_replacements = { "linux-amd64.tar.gz" = "Linux-64bit.tar.gz" } paths = ["builds/container1/unix/extended/**"] [archives.archive_settings] name_template = "{{ .Project }}_extended_{{ .Tag | trimPrefix `v` }}_{{ .Goos }}-{{ .Goarch }}" +[[archives]] + paths = ["builds/container1/unix/extended-withdeploy/**"] + [archives.archive_settings] + name_template = "{{ .Project }}_extended_withdeploy_{{ .Tag | trimPrefix `v` }}_{{ .Goos }}-{{ .Goarch }}" [[archives]] # Only extended builds in container2. paths = ["builds/container2/**"] diff --git a/magefile.go b/magefile.go index 142b9160a..9919e0185 100644 --- a/magefile.go +++ b/magefile.go @@ -334,7 +334,7 @@ func buildFlags() []string { func buildTags() string { // To build the extended Hugo SCSS/SASS enabled version, build with // HUGO_BUILD_TAGS=extended mage install etc. - // To build without `hugo deploy` for smaller binary, use HUGO_BUILD_TAGS=nodeploy + // To build with `hugo deploy`, use HUGO_BUILD_TAGS=withdeploy if envtags := os.Getenv("HUGO_BUILD_TAGS"); envtags != "" { return envtags } diff --git a/main_withdeploy_test.go b/main_withdeploy_test.go new file mode 100644 index 000000000..de50313c3 --- /dev/null +++ b/main_withdeploy_test.go @@ -0,0 +1,29 @@ +// Copyright 2024 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. +// 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. + +//go:build withdeploy +// +build withdeploy + +package main + +import ( + "testing" + + "github.com/rogpeppe/go-internal/testscript" +) + +func TestWithdeploy(t *testing.T) { + p := commonTestScriptsParam + p.Dir = "testscripts/withdeploy" + testscript.Run(t, p) +} diff --git a/testscripts/commands/gen.txt b/testscripts/commands/gen.txt index b8fe9d2dc..092b4e129 100644 --- a/testscripts/commands/gen.txt +++ b/testscripts/commands/gen.txt @@ -1,17 +1,12 @@ # Test the gen commands. -# Note that adding new commands will require updating the NUM_COMMANDS value. -env NUM_COMMANDS=44 hugo gen -h stdout 'Generate documentation for your project using Hugo''s documentation engine, including syntax highlighting for various programming languages\.' - hugo gen doc --dir clidocs -checkfilecount $NUM_COMMANDS clidocs hugo gen man -h stdout 'up-to-date man pages' hugo gen man --dir manpages -checkfilecount $NUM_COMMANDS manpages hugo gen chromastyles -h stdout 'Generate CSS stylesheet for the Chroma code highlighter' diff --git a/testscripts/commands/deploy.txt b/testscripts/withdeploy/deploy.txt similarity index 100% rename from testscripts/commands/deploy.txt rename to testscripts/withdeploy/deploy.txt From 1ec6fa36c0d3d8599bb37d7b033fefce4650ddf9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Fri, 1 Nov 2024 10:16:05 +0100 Subject: [PATCH 075/526] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index b9ad14d01..b1beabb0f 100644 --- a/README.md +++ b/README.md @@ -68,6 +68,8 @@ See the [features] section of the documentation for a comprehensive summary of H Linode     Route Planning & Route Optimization Software +     + The complete IDE crafted for professional Go developers.

## Installation From e3304db61756e8563ab0a3326ea93846676dc42e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Fri, 1 Nov 2024 11:43:36 +0100 Subject: [PATCH 076/526] deps: Upgrade github.com/bep/godartsass/v2 v2.1.0 => v2.2.0 --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 108241dc5..4b1d53a1b 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,7 @@ require ( github.com/bep/gitmap v1.6.0 github.com/bep/goat v0.5.0 github.com/bep/godartsass v1.2.0 - github.com/bep/godartsass/v2 v2.1.0 + github.com/bep/godartsass/v2 v2.2.0 github.com/bep/golibsass v1.2.0 github.com/bep/gowebp v0.3.0 github.com/bep/helpers v0.5.0 diff --git a/go.sum b/go.sum index cfc34880b..cc8b23683 100644 --- a/go.sum +++ b/go.sum @@ -133,6 +133,8 @@ github.com/bep/godartsass v1.2.0 h1:E2VvQrxAHAFwbjyOIExAMmogTItSKodoKuijNrGm5yU= github.com/bep/godartsass v1.2.0/go.mod h1:6LvK9RftsXMxGfsA0LDV12AGc4Jylnu6NgHL+Q5/pE8= github.com/bep/godartsass/v2 v2.1.0 h1:fq5Y1xYf4diu4tXABiekZUCA+5l/dmNjGKCeQwdy+s0= github.com/bep/godartsass/v2 v2.1.0/go.mod h1:AcP8QgC+OwOXEq6im0WgDRYK7scDsmZCEW62o1prQLo= +github.com/bep/godartsass/v2 v2.2.0 h1:3hO9Dt4BOnxkKmRxc+OpoKVFrDvBycpSCXEdElVAMVI= +github.com/bep/godartsass/v2 v2.2.0/go.mod h1:AcP8QgC+OwOXEq6im0WgDRYK7scDsmZCEW62o1prQLo= github.com/bep/golibsass v1.2.0 h1:nyZUkKP/0psr8nT6GR2cnmt99xS93Ji82ZD9AgOK6VI= github.com/bep/golibsass v1.2.0/go.mod h1:DL87K8Un/+pWUS75ggYv41bliGiolxzDKWJAq3eJ1MA= github.com/bep/gowebp v0.3.0 h1:MhmMrcf88pUY7/PsEhMgEP0T6fDUnRTMpN8OclDrbrY= From 72352f205afeef8310dcc276fc7a72db311a1621 Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Sat, 19 Oct 2024 10:28:37 -0700 Subject: [PATCH 077/526] github: Adjust test workflow to install Dart Sass v1.80.3 --- .github/workflows/test.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 05d9d23a2..fb9d71f06 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -6,10 +6,10 @@ name: Test env: GOPROXY: https://proxy.golang.org GO111MODULE: on - SASS_VERSION: 1.63.2 - DART_SASS_SHA_LINUX: 3ea33c95ad5c35fda6e9a0956199eef38a398f496cfb8750e02479d7d1dd42af - DART_SASS_SHA_MACOS: 11c70f259836b250b44a9cb57fed70e030f21f45069b467d371685855f1eb4f0 - DART_SASS_SHA_WINDOWS: cd8cd36a619dd8e27f93d3186c52d70eb7d69472aa6c85f5094b29693e773f64 + SASS_VERSION: 1.80.3 + DART_SASS_SHA_LINUX: 7c933edbad0a7d389192c5b79393485c088bd2c4398e32f5754c32af006a9ffd + DART_SASS_SHA_MACOS: 79e060b0e131c3bb3c16926bafc371dc33feab122bfa8c01aa337a072097967b + DART_SASS_SHA_WINDOWS: 0bc4708b37cd1bac4740e83ac5e3176e66b774f77fd5dd364da5b5cfc9bfb469 permissions: contents: read jobs: From 889308dd854b0907069d7bc6dd44ed760bc6e819 Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Fri, 18 Oct 2024 16:10:46 -0700 Subject: [PATCH 078/526] resources: Address Dart Sass deprecation of global built-in functions See https://github.com/sass/dart-sass/releases/tag/1.80.0 Fixes #12961 --- .../tocss/dartsass/transform.go | 4 +- .../tocss/{internal => }/sass/helpers.go | 21 +++++++-- .../tocss/{internal => }/sass/helpers_test.go | 0 .../resource_transformers/tocss/scss/tocss.go | 4 +- tpl/css/css.go | 17 +++---- tpl/resources/resources_integration_test.go | 44 +++++++++++++++++++ 6 files changed, 71 insertions(+), 19 deletions(-) rename resources/resource_transformers/tocss/{internal => }/sass/helpers.go (75%) rename resources/resource_transformers/tocss/{internal => }/sass/helpers_test.go (100%) diff --git a/resources/resource_transformers/tocss/dartsass/transform.go b/resources/resource_transformers/tocss/dartsass/transform.go index f0bd6634a..d8b6ae5b4 100644 --- a/resources/resource_transformers/tocss/dartsass/transform.go +++ b/resources/resource_transformers/tocss/dartsass/transform.go @@ -29,7 +29,7 @@ import ( "github.com/gohugoio/hugo/resources" "github.com/gohugoio/hugo/resources/internal" - "github.com/gohugoio/hugo/resources/resource_transformers/tocss/internal/sass" + "github.com/gohugoio/hugo/resources/resource_transformers/tocss/sass" "github.com/spf13/afero" @@ -85,7 +85,7 @@ func (t *transform) Transform(ctx *resources.ResourceTransformationCtx) error { c: t.c, dependencyManager: ctx.DependencyManager, - varsStylesheet: godartsass.Import{Content: sass.CreateVarsStyleSheet(opts.Vars)}, + varsStylesheet: godartsass.Import{Content: sass.CreateVarsStyleSheet(sass.TranspilerDart, opts.Vars)}, }, OutputStyle: godartsass.ParseOutputStyle(opts.OutputStyle), EnableSourceMap: opts.EnableSourceMap, diff --git a/resources/resource_transformers/tocss/internal/sass/helpers.go b/resources/resource_transformers/tocss/sass/helpers.go similarity index 75% rename from resources/resource_transformers/tocss/internal/sass/helpers.go rename to resources/resource_transformers/tocss/sass/helpers.go index c1cef141e..d4091a39c 100644 --- a/resources/resource_transformers/tocss/internal/sass/helpers.go +++ b/resources/resource_transformers/tocss/sass/helpers.go @@ -24,9 +24,14 @@ import ( const ( HugoVarsNamespace = "hugo:vars" + // Transpiler implementation can be controlled from the client by + // setting the 'transpiler' option. + // Default is currently 'libsass', but that may change. + TranspilerDart = "dartsass" + TranspilerLibSass = "libsass" ) -func CreateVarsStyleSheet(vars map[string]any) string { +func CreateVarsStyleSheet(transpiler string, vars map[string]any) string { if vars == nil { return "" } @@ -49,12 +54,22 @@ func CreateVarsStyleSheet(vars map[string]any) string { varsSlice = append(varsSlice, fmt.Sprintf("%s%s: %v;", prefix, k, v)) } else { // unquote will preserve quotes around URLs etc. if needed. - varsSlice = append(varsSlice, fmt.Sprintf("%s%s: unquote(%q);", prefix, k, v)) + if transpiler == TranspilerDart { + varsSlice = append(varsSlice, fmt.Sprintf("%s%s: string.unquote(%q);", prefix, k, v)) + } else { + varsSlice = append(varsSlice, fmt.Sprintf("%s%s: unquote(%q);", prefix, k, v)) + } } } } sort.Strings(varsSlice) - varsStylesheet = strings.Join(varsSlice, "\n") + + if transpiler == TranspilerDart { + varsStylesheet = `@use "sass:string";` + "\n" + strings.Join(varsSlice, "\n") + } else { + varsStylesheet = strings.Join(varsSlice, "\n") + } + return varsStylesheet } diff --git a/resources/resource_transformers/tocss/internal/sass/helpers_test.go b/resources/resource_transformers/tocss/sass/helpers_test.go similarity index 100% rename from resources/resource_transformers/tocss/internal/sass/helpers_test.go rename to resources/resource_transformers/tocss/sass/helpers_test.go diff --git a/resources/resource_transformers/tocss/scss/tocss.go b/resources/resource_transformers/tocss/scss/tocss.go index 36ef2a77d..4b9c51ce0 100644 --- a/resources/resource_transformers/tocss/scss/tocss.go +++ b/resources/resource_transformers/tocss/scss/tocss.go @@ -31,7 +31,7 @@ import ( "github.com/gohugoio/hugo/identity" "github.com/gohugoio/hugo/media" "github.com/gohugoio/hugo/resources" - "github.com/gohugoio/hugo/resources/resource_transformers/tocss/internal/sass" + "github.com/gohugoio/hugo/resources/resource_transformers/tocss/sass" ) // Used in tests. This feature requires Hugo to be built with the extended tag. @@ -64,7 +64,7 @@ func (t *toCSSTransformation) Transform(ctx *resources.ResourceTransformationCtx } } - varsStylesheet := sass.CreateVarsStyleSheet(options.from.Vars) + varsStylesheet := sass.CreateVarsStyleSheet(sass.TranspilerLibSass, options.from.Vars) // To allow for overrides of SCSS files anywhere in the project/theme hierarchy, we need // to help libsass revolve the filename by looking in the composite filesystem first. diff --git a/tpl/css/css.go b/tpl/css/css.go index 48a526c17..199deda69 100644 --- a/tpl/css/css.go +++ b/tpl/css/css.go @@ -15,6 +15,7 @@ import ( "github.com/gohugoio/hugo/resources/resource_transformers/babel" "github.com/gohugoio/hugo/resources/resource_transformers/cssjs" "github.com/gohugoio/hugo/resources/resource_transformers/tocss/dartsass" + "github.com/gohugoio/hugo/resources/resource_transformers/tocss/sass" "github.com/gohugoio/hugo/resources/resource_transformers/tocss/scss" "github.com/gohugoio/hugo/tpl/internal" "github.com/gohugoio/hugo/tpl/internal/resourcehelpers" @@ -84,21 +85,13 @@ func (ns *Namespace) Sass(args ...any) (resource.Resource, error) { return nil, errors.New("must not provide more arguments than resource object and options") } - const ( - // Transpiler implementation can be controlled from the client by - // setting the 'transpiler' option. - // Default is currently 'libsass', but that may change. - transpilerDart = "dartsass" - transpilerLibSass = "libsass" - ) - var ( r resources.ResourceTransformer m map[string]any targetPath string err error ok bool - transpiler = transpilerLibSass + transpiler = sass.TranspilerLibSass ) r, targetPath, ok = resourcehelpers.ResolveIfFirstArgIsString(args) @@ -113,15 +106,15 @@ func (ns *Namespace) Sass(args ...any) (resource.Resource, error) { if m != nil { if t, _, found := maps.LookupEqualFold(m, "transpiler"); found { switch t { - case transpilerDart, transpilerLibSass: + case sass.TranspilerDart, sass.TranspilerLibSass: transpiler = cast.ToString(t) default: - return nil, fmt.Errorf("unsupported transpiler %q; valid values are %q or %q", t, transpilerLibSass, transpilerDart) + return nil, fmt.Errorf("unsupported transpiler %q; valid values are %q or %q", t, sass.TranspilerLibSass, sass.TranspilerDart) } } } - if transpiler == transpilerLibSass { + if transpiler == sass.TranspilerLibSass { var options scss.Options if targetPath != "" { options.TargetPath = paths.ToSlashTrimLeading(targetPath) diff --git a/tpl/resources/resources_integration_test.go b/tpl/resources/resources_integration_test.go index cfd03dc73..563b3c455 100644 --- a/tpl/resources/resources_integration_test.go +++ b/tpl/resources/resources_integration_test.go @@ -18,6 +18,8 @@ import ( qt "github.com/frankban/quicktest" "github.com/gohugoio/hugo/hugolib" + "github.com/gohugoio/hugo/resources/resource_transformers/tocss/dartsass" + "github.com/gohugoio/hugo/resources/resource_transformers/tocss/scss" ) func TestCopy(t *testing.T) { @@ -238,3 +240,45 @@ match /files/C*: 2| b.AssertFileContent("public/files/b.txt", "I am b.txt") b.AssertFileContent("public/files/C.txt", "I am C.txt") } + +// Issue #12961 +func TestDartSassVars(t *testing.T) { + t.Parallel() + + if !scss.Supports() || !dartsass.Supports() { + t.Skip() + } + + files := ` +-- hugo.toml -- +disableKinds = ['page','section','rss','sitemap','taxonomy','term'] +-- layouts/index.html -- +{{ $opts := dict "transpiler" "dartsass" "outputStyle" "compressed" "vars" (dict "color" "red") }} +{{ with resources.Get "dartsass.scss" | css.Sass $opts }} + {{ .Content }} +{{ end }} + +{{ $opts := dict "transpiler" "libsass" "outputStyle" "compressed" "vars" (dict "color" "blue") }} +{{ with resources.Get "libsass.scss" | css.Sass $opts }} + {{ .Content }} +{{ end }} +-- assets/dartsass.scss -- +@use "hugo:vars" as v; +.dartsass { + color: v.$color; +} +-- assets/libsass.scss -- +@import "hugo:vars"; +.libsass { + color: $color; +} +` + + b := hugolib.Test(t, files, hugolib.TestOptWarn()) + + b.AssertFileContent("public/index.html", + ".dartsass{color:red}", + ".libsass{color:blue}", + ) + b.AssertLogContains("! WARN Dart Sass: hugo:vars") +} From 5fc16390355f32b336836163907fc215034f5b73 Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Fri, 1 Nov 2024 21:10:52 -0700 Subject: [PATCH 079/526] Update README.md --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index b1beabb0f..97afe32fd 100644 --- a/README.md +++ b/README.md @@ -33,8 +33,7 @@ A fast and flexible static site generator built with love by [bep], [spf13], and [![Tests on Linux, MacOS and Windows](https://github.com/gohugoio/hugo/workflows/Test/badge.svg)](https://github.com/gohugoio/hugo/actions?query=workflow%3ATest) [![Go Report Card](https://goreportcard.com/badge/github.com/gohugoio/hugo)](https://goreportcard.com/report/github.com/gohugoio/hugo) -[Website] | [Installation] | [Documentation] | [Support] | [Contributing] | Mastodon | X - +[Website] | [Installation] | [Documentation] | [Support] | [Contributing] | Mastodon ## Overview Hugo is a [static site generator] written in [Go], optimized for speed and designed for flexibility. With its advanced templating system and fast asset pipelines, Hugo renders a complete site in seconds, often less. From 1f23b4949c70a2a8f2084fa937e19e93a9fe890a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Wed, 30 Oct 2024 18:10:09 +0100 Subject: [PATCH 080/526] Fix some RenderShortcodes error cases This issue fixes two cases where `{{__hugo_ctx` artifacts were left in the rendered output: 1. Inclusion when `.RenderShortcodes` is wrapped in HTML. 2. Inclusion of Markdown file without a trailing newline in some cases. Closes #12854 Updates #12998 --- common/constants/constants.go | 1 + hugolib/collections_test.go | 16 +-- hugolib/integrationtest_builder.go | 23 ++++ hugolib/menu_test.go | 124 +++--------------- hugolib/page.go | 19 ++- hugolib/rendershortcodes_test.go | 112 ++++++++++++++++ hugolib/shortcode_page.go | 4 + markup/goldmark/convert.go | 2 +- markup/goldmark/goldmark_integration_test.go | 2 +- markup/goldmark/hugocontext/hugocontext.go | 111 +++++++++++++--- .../goldmark/hugocontext/hugocontext_test.go | 2 +- resources/page/page.go | 2 + .../page/page_markup_integration_test.go | 6 +- 13 files changed, 283 insertions(+), 141 deletions(-) diff --git a/common/constants/constants.go b/common/constants/constants.go index f8f057e05..752aef72c 100644 --- a/common/constants/constants.go +++ b/common/constants/constants.go @@ -21,6 +21,7 @@ const ( ErrRemoteGetCSV = "error-remote-getcsv" WarnFrontMatterParamsOverrides = "warning-frontmatter-params-overrides" + WarnRenderShortcodesInHTML = "warning-rendershortcodes-in-html" ) // Field/method names with special meaning. diff --git a/hugolib/collections_test.go b/hugolib/collections_test.go index fff57337f..a8c817bec 100644 --- a/hugolib/collections_test.go +++ b/hugolib/collections_test.go @@ -71,9 +71,9 @@ tags_weight: %d {{ $pageGroups := slice $cool $blue }} {{ $weighted := slice $wp1 $wp2 }} -{{ printf "pages:%d:%T:%v/%v" (len $pages) $pages (index $pages 0) (index $pages 1) }} -{{ printf "pageGroups:%d:%T:%v/%v" (len $pageGroups) $pageGroups (index (index $pageGroups 0).Pages 0) (index (index $pageGroups 1).Pages 0)}} -{{ printf "weightedPages:%d::%T:%v" (len $weighted) $weighted $weighted | safeHTML }} +{{ printf "pages:%d:%T:%s|%s" (len $pages) $pages (index $pages 0).Path (index $pages 1).Path }} +{{ printf "pageGroups:%d:%T:%s|%s" (len $pageGroups) $pageGroups (index (index $pageGroups 0).Pages 0).Path (index (index $pageGroups 1).Pages 0).Path}} +{{ printf "weightedPages:%d:%T" (len $weighted) $weighted | safeHTML }} `) b.CreateSites().Build(BuildCfg{}) @@ -82,9 +82,9 @@ tags_weight: %d c.Assert(len(b.H.Sites[0].RegularPages()), qt.Equals, 2) b.AssertFileContent("public/index.html", - "pages:2:page.Pages:Page(/page1)/Page(/page2)", - "pageGroups:2:page.PagesGroup:Page(/page1)/Page(/page2)", - `weightedPages:2::page.WeightedPages:[WeightedPage(10,"Page") WeightedPage(20,"Page")]`) + "pages:2:page.Pages:/page1|/page2", + "pageGroups:2:page.PagesGroup:/page1|/page2", + `weightedPages:2:page.WeightedPages`) } func TestUnionFunc(t *testing.T) { @@ -189,7 +189,7 @@ tags_weight: %d {{ $appendStrings := slice "a" "b" | append "c" "d" "e" }} {{ $appendStringsSlice := slice "a" "b" "c" | append (slice "c" "d") }} -{{ printf "pages:%d:%T:%v/%v" (len $pages) $pages (index $pages 0) (index $pages 1) }} +{{ printf "pages:%d:%T:%s|%s" (len $pages) $pages (index $pages 0).Path (index $pages 1).Path }} {{ printf "appendPages:%d:%T:%v/%v" (len $appendPages) $appendPages (index $appendPages 0).Kind (index $appendPages 8).Kind }} {{ printf "appendStrings:%T:%v" $appendStrings $appendStrings }} {{ printf "appendStringsSlice:%T:%v" $appendStringsSlice $appendStringsSlice }} @@ -207,7 +207,7 @@ tags_weight: %d c.Assert(len(b.H.Sites[0].RegularPages()), qt.Equals, 2) b.AssertFileContent("public/index.html", - "pages:2:page.Pages:Page(/page2)/Page(/page1)", + "pages:2:page.Pages:/page2|/page1", "appendPages:9:page.Pages:home/page", "appendStrings:[]string:[a b c d e]", "appendStringsSlice:[]string:[a b c c d]", diff --git a/hugolib/integrationtest_builder.go b/hugolib/integrationtest_builder.go index b806ad7c1..5dc13592f 100644 --- a/hugolib/integrationtest_builder.go +++ b/hugolib/integrationtest_builder.go @@ -2,6 +2,7 @@ package hugolib import ( "bytes" + "context" "encoding/base64" "errors" "fmt" @@ -32,6 +33,7 @@ import ( "github.com/gohugoio/hugo/htesting" "github.com/gohugoio/hugo/hugofs" "github.com/spf13/afero" + "github.com/spf13/cast" "golang.org/x/text/unicode/norm" "golang.org/x/tools/txtar" ) @@ -294,6 +296,12 @@ func (s *IntegrationTestBuilder) AssertFileContent(filename string, matches ...s } } +func (s *IntegrationTestBuilder) AssertFileContentEquals(filename string, match string) { + s.Helper() + content := s.FileContent(filename) + s.Assert(content, qt.Equals, match, qt.Commentf(match)) +} + func (s *IntegrationTestBuilder) AssertFileContentExact(filename string, matches ...string) { s.Helper() content := s.FileContent(filename) @@ -302,6 +310,16 @@ func (s *IntegrationTestBuilder) AssertFileContentExact(filename string, matches } } +func (s *IntegrationTestBuilder) AssertNoRenderShortcodesArtifacts() { + s.Helper() + for _, p := range s.H.Pages() { + content, err := p.Content(context.Background()) + s.Assert(err, qt.IsNil) + comment := qt.Commentf("Page: %s\n%s", p.Path(), content) + s.Assert(strings.Contains(cast.ToString(content), "__hugo_ctx"), qt.IsFalse, comment) + } +} + func (s *IntegrationTestBuilder) AssertPublishDir(matches ...string) { s.AssertFs(s.fs.PublishDir, matches...) } @@ -835,6 +853,11 @@ 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. + // - §§§ 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. + // - filenames with a .png or .jpg extension will be treated as binary and base64 decoded. TxtarString string // COnfig to use as the base. We will also read the config from the txtar. diff --git a/hugolib/menu_test.go b/hugolib/menu_test.go index 304b4fbf4..6ee62771b 100644 --- a/hugolib/menu_test.go +++ b/hugolib/menu_test.go @@ -105,94 +105,6 @@ Menu Main: {{ partial "menu.html" (dict "page" . "menu" "main") }}`, "/sect3/|Sect3s|Sect3s|0|-|-|") } -// related issue #7594 -func TestMenusSort(t *testing.T) { - b := newTestSitesBuilder(t).WithSimpleConfigFile() - - b.WithTemplatesAdded("index.html", ` -{{ range $k, $v := .Site.Menus.main }} -Default1|{{ $k }}|{{ $v.Weight }}|{{ $v.Name }}|{{ .URL }}|{{ $v.Page }}{{ end }} -{{ range $k, $v := .Site.Menus.main.ByWeight }} -ByWeight|{{ $k }}|{{ $v.Weight }}|{{ $v.Name }}|{{ .URL }}|{{ $v.Page }}{{ end }} -{{ range $k, $v := (.Site.Menus.main.ByWeight).Reverse }} -Reverse|{{ $k }}|{{ $v.Weight }}|{{ $v.Name }}|{{ .URL }}|{{ $v.Page }}{{ end }} -{{ range $k, $v := .Site.Menus.main }} -Default2|{{ $k }}|{{ $v.Weight }}|{{ $v.Name }}|{{ .URL }}|{{ $v.Page }}{{ end }} -{{ range $k, $v := .Site.Menus.main.ByWeight }} -ByWeight|{{ $k }}|{{ $v.Weight }}|{{ $v.Name }}|{{ .URL }}|{{ $v.Page }}{{ end }} -{{ range $k, $v := .Site.Menus.main }} -Default3|{{ $k }}|{{ $v.Weight }}|{{ $v.Name }}|{{ .URL }}|{{ $v.Page }}{{ end }} -`) - - b.WithContent("_index.md", ` ---- -title: Home -menu: - main: - weight: 100 ----`) - - b.WithContent("blog/A.md", ` ---- -title: "A" -menu: - main: - weight: 10 ---- -`) - - b.WithContent("blog/B.md", ` ---- -title: "B" -menu: - main: - weight: 20 ---- -`) - b.WithContent("blog/C.md", ` ---- -title: "C" -menu: - main: - weight: 30 ---- -`) - - b.Build(BuildCfg{}) - - b.AssertFileContent("public/index.html", - `Default1|0|10|A|/blog/a/|Page(/blog/a) - Default1|1|20|B|/blog/b/|Page(/blog/b) - Default1|2|30|C|/blog/c/|Page(/blog/c) - Default1|3|100|Home|/|Page(/) - - ByWeight|0|10|A|/blog/a/|Page(/blog/a) - ByWeight|1|20|B|/blog/b/|Page(/blog/b) - ByWeight|2|30|C|/blog/c/|Page(/blog/c) - ByWeight|3|100|Home|/|Page(/) - - Reverse|0|100|Home|/|Page(/) - Reverse|1|30|C|/blog/c/|Page(/blog/c) - Reverse|2|20|B|/blog/b/|Page(/blog/b) - Reverse|3|10|A|/blog/a/|Page(/blog/a) - - Default2|0|10|A|/blog/a/|Page(/blog/a) - Default2|1|20|B|/blog/b/|Page(/blog/b) - Default2|2|30|C|/blog/c/|Page(/blog/c) - Default2|3|100|Home|/|Page(/) - - ByWeight|0|10|A|/blog/a/|Page(/blog/a) - ByWeight|1|20|B|/blog/b/|Page(/blog/b) - ByWeight|2|30|C|/blog/c/|Page(/blog/c) - ByWeight|3|100|Home|/|Page(/) - - Default3|0|10|A|/blog/a/|Page(/blog/a) - Default3|1|20|B|/blog/b/|Page(/blog/b) - Default3|2|30|C|/blog/c/|Page(/blog/c) - Default3|3|100|Home|/|Page(/)`, - ) -} - func TestMenusFrontMatter(t *testing.T) { b := newTestSitesBuilder(t).WithSimpleConfigFile() @@ -437,8 +349,8 @@ url = "/blog/post3" commonTempl := ` Main: {{ len .Site.Menus.main }} {{ range .Site.Menus.main }} -{{ .Title }}|HasMenuCurrent: {{ $.HasMenuCurrent "main" . }}|Page: {{ .Page }} -{{ .Title }}|IsMenuCurrent: {{ $.IsMenuCurrent "main" . }}|Page: {{ .Page }} +{{ .Title }}|HasMenuCurrent: {{ $.HasMenuCurrent "main" . }}|Page: {{ .Page.Path }} +{{ .Title }}|IsMenuCurrent: {{ $.IsMenuCurrent "main" . }}|Page: {{ .Page.Path }} {{ end }} ` @@ -494,34 +406,34 @@ title: "Contact: With No Menu Defined" b.AssertFileContent("public/index.html", ` Main: 5 -Home|HasMenuCurrent: false|Page: Page(/) -Blog|HasMenuCurrent: false|Page: Page(/blog) -My Post 2: With Menu Defined|HasMenuCurrent: false|Page: Page(/blog/post2) -My Post 3|HasMenuCurrent: false|Page: Page(/blog/post3) -Contact Us|HasMenuCurrent: false|Page: Page(/contact) +Home|HasMenuCurrent: false|Page: / +Blog|HasMenuCurrent: false|Page: /blog +My Post 2: With Menu Defined|HasMenuCurrent: false|Page: /blog/post2 +My Post 3|HasMenuCurrent: false|Page: /blog/post3 +Contact Us|HasMenuCurrent: false|Page: /contact `) b.AssertFileContent("public/blog/post1/index.html", ` -Home|HasMenuCurrent: false|Page: Page(/) -Blog|HasMenuCurrent: true|Page: Page(/blog) +Home|HasMenuCurrent: false|Page: / +Blog|HasMenuCurrent: true|Page: /blog `) b.AssertFileContent("public/blog/post2/index.html", ` -Home|HasMenuCurrent: false|Page: Page(/) -Blog|HasMenuCurrent: true|Page: Page(/blog) -Blog|IsMenuCurrent: false|Page: Page(/blog) +Home|HasMenuCurrent: false|Page: / +Blog|HasMenuCurrent: true|Page: /blog +Blog|IsMenuCurrent: false|Page: /blog `) b.AssertFileContent("public/blog/post3/index.html", ` -Home|HasMenuCurrent: false|Page: Page(/) -Blog|HasMenuCurrent: true|Page: Page(/blog) +Home|HasMenuCurrent: false|Page: / +Blog|HasMenuCurrent: true|Page: /blog `) b.AssertFileContent("public/contact/index.html", ` -Contact Us|HasMenuCurrent: false|Page: Page(/contact) -Contact Us|IsMenuCurrent: true|Page: Page(/contact) -Blog|HasMenuCurrent: false|Page: Page(/blog) -Blog|IsMenuCurrent: false|Page: Page(/blog) +Contact Us|HasMenuCurrent: false|Page: /contact +Contact Us|IsMenuCurrent: true|Page: /contact +Blog|HasMenuCurrent: false|Page: /blog +Blog|IsMenuCurrent: false|Page: /blog `) } diff --git a/hugolib/page.go b/hugolib/page.go index 7525ab672..2bc1da044 100644 --- a/hugolib/page.go +++ b/hugolib/page.go @@ -16,7 +16,9 @@ package hugolib import ( "context" "fmt" + "path/filepath" "strconv" + "strings" "sync" "sync/atomic" @@ -358,7 +360,22 @@ func (p *pageState) Site() page.Site { } func (p *pageState) String() string { - return fmt.Sprintf("Page(%s)", p.Path()) + var sb strings.Builder + if p.File() != nil { + // The forward slashes even on Windows is motivated by + // getting stable tests. + // This information is meant for getting positional information in logs, + // so the direction of the slashes should not matter. + sb.WriteString(filepath.ToSlash(p.File().Filename())) + if p.File().IsContentAdapter() { + // Also include the path. + sb.WriteString(":") + sb.WriteString(p.Path()) + } + } else { + sb.WriteString(p.Path()) + } + return sb.String() } // IsTranslated returns whether this content file is translated to diff --git a/hugolib/rendershortcodes_test.go b/hugolib/rendershortcodes_test.go index 313c80a73..9a31b6536 100644 --- a/hugolib/rendershortcodes_test.go +++ b/hugolib/rendershortcodes_test.go @@ -14,6 +14,7 @@ package hugolib import ( + "path/filepath" "strings" "testing" ) @@ -69,6 +70,7 @@ Content: {{ .Content }}| b := Test(t, files) + b.AssertNoRenderShortcodesArtifacts() b.AssertFileContent("public/p1/index.html", "Fragments: [p1-h1 p2-h1 p2-h2 p2-h3 p2-withmarkdown p3-h1 p3-h2 p3-withmarkdown]|", "HasShortcode Level 1: true|", @@ -115,6 +117,7 @@ JSON: {{ .Content }} b := Test(t, files) + b.AssertNoRenderShortcodesArtifacts() b.AssertFileContent("public/p1/index.html", "Myshort HTML") b.AssertFileContent("public/p1/index.json", "Myshort JSON") } @@ -147,9 +150,11 @@ Myshort Original. {{ .Content }} ` b := TestRunning(t, files) + b.AssertNoRenderShortcodesArtifacts() b.AssertFileContent("public/p1/index.html", "Myshort Original.") b.EditFileReplaceAll("layouts/shortcodes/myshort.html", "Original", "Edited").Build() + b.AssertNoRenderShortcodesArtifacts() b.AssertFileContent("public/p1/index.html", "Myshort Edited.") } @@ -192,12 +197,14 @@ Myshort Original. }, ).Build() + b.AssertNoRenderShortcodesArtifacts() b.AssertFileContent("public/p1/index.html", "Original") b.EditFileReplaceFunc("content/p2.md", func(s string) string { return strings.Replace(s, "Original", "Edited", 1) }) b.Build() + b.AssertNoRenderShortcodesArtifacts() b.AssertFileContent("public/p1/index.html", "Edited") } @@ -233,8 +240,10 @@ Myshort Original. ` b := TestRunning(t, files) + b.AssertNoRenderShortcodesArtifacts() b.AssertFileContent("public/mysection/index.html", "p1-h1") b.EditFileReplaceAll("content/mysection/_index.md", "p1-h1", "p1-h1 Edited").Build() + b.AssertNoRenderShortcodesArtifacts() b.AssertFileContent("public/mysection/index.html", "p1-h1 Edited") } @@ -314,6 +323,8 @@ iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAA b := Test(t, files) + b.AssertNoRenderShortcodesArtifacts() + b.AssertFileContent("public/markdown/index.html", // Images. "Image: /posts/p1/pixel1.png|\nImage: /posts/p1/pixel2.png|\n|\nImage: /markdown/pixel3.png|

\n|", @@ -333,3 +344,104 @@ iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAA b.AssertFileContent("public/html/index.html", "! hugo_ctx") } + +// Issue 12854. +func TestRenderShortcodesWithHTML(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +disableLiveReload = true +disableKinds = ["home", "taxonomy", "term"] +markup.goldmark.renderer.unsafe = true +-- content/p1.md -- +--- +title: "p1" +--- +{{% include "p2" %}} +-- content/p2.md -- +--- +title: "p2" +--- +Hello world. Some **bold** text. Some Unicode: 神真美好. +-- layouts/shortcodes/include.html -- +{{ with site.GetPage (.Get 0) }} +
{{ .RenderShortcodes }}
+{{ end }} +-- layouts/_default/single.html -- +{{ .Content }} +` + + b := TestRunning(t, files, TestOptWarn()) + + b.AssertNoRenderShortcodesArtifacts() + b.AssertLogContains(filepath.ToSlash("WARN .RenderShortcodes detected inside HTML block in \"/content/p1.md\"; this may not be what you intended, see https://gohugo.io/methods/page/rendershortcodes/#limitations\nYou can suppress this warning by adding the following to your site configuration:\nignoreLogs = ['warning-rendershortcodes-in-html']")) + b.AssertFileContent("public/p1/index.html", "
Hello world. Some **bold** text. Some Unicode: 神真美好.\n
") + b.EditFileReplaceAll("content/p2.md", "Hello", "Hello Edited").Build() + b.AssertNoRenderShortcodesArtifacts() + b.AssertFileContent("public/p1/index.html", "
Hello Edited world. Some **bold** text. Some Unicode: 神真美好.\n
") +} + +func TestRenderShortcodesIncludeMarkdownFileWithoutTrailingNewline(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +disableLiveReload = true +disableKinds = ["home", "taxonomy", "term"] +markup.goldmark.renderer.unsafe = true +-- content/p1.md -- +--- +title: "p1" +--- +Content p1 id-1000.{{% include "p2" %}}{{% include "p3" %}} + +§§§ go +code_p1 +§§§ +§§§ go +code_p1_2 +§§§ + +§§§ go +code_p1_3 +§§§ +-- content/p2.md -- +--- +title: "p2" +--- +§§§ bash +code_p2 +§§§ +Foo. +-- content/p3.md -- +--- +title: "p3" +--- +§§§ php +code_p3 +§§§ +-- layouts/shortcodes/include.html -- +{{ with site.GetPage (.Get 0) -}} +{{ .RenderShortcodes -}} +{{ end -}} +-- layouts/_default/single.html -- +{{ .Content }} +-- layouts/_default/_markup/render-codeblock.html -- +{{ .Inner | safeHTML }} +` + + b := TestRunning(t, files, TestOptWarn()) + + b.AssertNoRenderShortcodesArtifacts() + b.AssertFileContentEquals("public/p1/index.html", "

Content p1 id-1000.

\ncode_p2

Foo.\n

\ncode_p3

\ncode_p1code_p1_2code_p1_3") + b.EditFileReplaceAll("content/p1.md", "id-1000.", "id-100.").Build() + b.AssertNoRenderShortcodesArtifacts() + b.AssertFileContentEquals("public/p1/index.html", "

Content p1 id-100.

\ncode_p2

Foo.\n

\ncode_p3

\ncode_p1code_p1_2code_p1_3") + b.EditFileReplaceAll("content/p2.md", "code_p2", "codep2").Build() + b.AssertNoRenderShortcodesArtifacts() + b.AssertFileContentEquals("public/p1/index.html", "

Content p1 id-100.

\ncodep2

Foo.\n

\ncode_p3

\ncode_p1code_p1_2code_p1_3") + b.EditFileReplaceAll("content/p3.md", "code_p3", "code_p3_edited").Build() + b.AssertNoRenderShortcodesArtifacts() + b.AssertFileContentEquals("public/p1/index.html", "

Content p1 id-100.

\ncodep2

Foo.\n

\ncode_p3_edited

\ncode_p1code_p1_2code_p1_3") +} diff --git a/hugolib/shortcode_page.go b/hugolib/shortcode_page.go index 8030b0285..3d27cc93c 100644 --- a/hugolib/shortcode_page.go +++ b/hugolib/shortcode_page.go @@ -125,3 +125,7 @@ func newPageForRenderHook(p *pageState) page.Page { func (p *pageForRenderHooks) Unwrapv() any { return p.p } + +func (p *pageForRenderHooks) String() string { + return p.p.String() +} diff --git a/markup/goldmark/convert.go b/markup/goldmark/convert.go index 5c31eee40..ea3bbc4ae 100644 --- a/markup/goldmark/convert.go +++ b/markup/goldmark/convert.go @@ -106,7 +106,7 @@ func newMarkdown(pcfg converter.ProviderConfig) goldmark.Markdown { renderer.WithNodeRenderers(util.Prioritized(emoji.NewHTMLRenderer(), 200))) var ( extensions = []goldmark.Extender{ - hugocontext.New(), + hugocontext.New(pcfg.Logger), newLinks(cfg), newTocExtension(tocRendererOptions), blockquotes.New(), diff --git a/markup/goldmark/goldmark_integration_test.go b/markup/goldmark/goldmark_integration_test.go index c691435ee..19b18692e 100644 --- a/markup/goldmark/goldmark_integration_test.go +++ b/markup/goldmark/goldmark_integration_test.go @@ -575,7 +575,7 @@ sc3_begin|{{ .Inner }}|sc3_end // Issue #7332 ":x:\n", // Issue #11587 - "

✔️

", + "

✔️\n

", // Should not be converted to emoji "sc1_begin|:smiley:|sc1_end", // Should be converted to emoji diff --git a/markup/goldmark/hugocontext/hugocontext.go b/markup/goldmark/hugocontext/hugocontext.go index b9c548dac..223c30c91 100644 --- a/markup/goldmark/hugocontext/hugocontext.go +++ b/markup/goldmark/hugocontext/hugocontext.go @@ -16,20 +16,24 @@ package hugocontext import ( "bytes" "fmt" + "regexp" "strconv" "github.com/gohugoio/hugo/bufferpool" + "github.com/gohugoio/hugo/common/constants" + "github.com/gohugoio/hugo/common/loggers" "github.com/gohugoio/hugo/markup/goldmark/internal/render" "github.com/yuin/goldmark" "github.com/yuin/goldmark/ast" "github.com/yuin/goldmark/parser" "github.com/yuin/goldmark/renderer" + "github.com/yuin/goldmark/renderer/html" "github.com/yuin/goldmark/text" "github.com/yuin/goldmark/util" ) -func New() goldmark.Extender { - return &hugoContextExtension{} +func New(logger loggers.Logger) goldmark.Extender { + return &hugoContextExtension{logger: logger} } // Wrap wraps the given byte slice in a Hugo context that used to determine the correct Page @@ -37,14 +41,19 @@ func New() goldmark.Extender { func Wrap(b []byte, pid uint64) string { buf := bufferpool.GetBuffer() defer bufferpool.PutBuffer(buf) - buf.Write(prefix) + buf.Write(hugoCtxPrefix) buf.WriteString(" pid=") buf.WriteString(strconv.FormatUint(pid, 10)) - buf.Write(endDelim) + buf.Write(hugoCtxEndDelim) buf.WriteByte('\n') buf.Write(b) - buf.Write(prefix) - buf.Write(closingDelimAndNewline) + // To make sure that we're able to parse it, make sure it ends with a newline. + if len(b) > 0 && b[len(b)-1] != '\n' { + buf.WriteByte('\n') + } + buf.Write(hugoCtxPrefix) + buf.Write(hugoCtxClosingDelim) + buf.WriteByte('\n') return buf.String() } @@ -89,45 +98,100 @@ func (h *HugoContext) Kind() ast.NodeKind { } var ( - prefix = []byte("{{__hugo_ctx") - endDelim = []byte("}}") - closingDelimAndNewline = []byte("/}}\n") + hugoCtxPrefix = []byte("{{__hugo_ctx") + hugoCtxEndDelim = []byte("}}") + hugoCtxClosingDelim = []byte("/}}") + hugoCtxRe = regexp.MustCompile(`{{__hugo_ctx( pid=\d+)?/?}}\n?`) ) var _ parser.InlineParser = (*hugoContextParser)(nil) type hugoContextParser struct{} -func (s *hugoContextParser) Parse(parent ast.Node, block text.Reader, pc parser.Context) ast.Node { - line, _ := block.PeekLine() - if !bytes.HasPrefix(line, prefix) { +func (a *hugoContextParser) Trigger() []byte { + return []byte{'{'} +} + +func (s *hugoContextParser) Parse(parent ast.Node, reader text.Reader, pc parser.Context) ast.Node { + line, _ := reader.PeekLine() + if !bytes.HasPrefix(line, hugoCtxPrefix) { return nil } - end := bytes.Index(line, endDelim) + end := bytes.Index(line, hugoCtxEndDelim) if end == -1 { return nil } - block.Advance(end + len(endDelim) + 1) // +1 for the newline + reader.Advance(end + len(hugoCtxEndDelim) + 1) // +1 for the newline if line[end-1] == '/' { return &HugoContext{Closing: true} } - attrBytes := line[len(prefix)+1 : end] + attrBytes := line[len(hugoCtxPrefix)+1 : end] h := &HugoContext{} h.parseAttrs(attrBytes) return h } -func (a *hugoContextParser) Trigger() []byte { - return []byte{'{'} +type hugoContextRenderer struct { + logger loggers.Logger + html.Config } -type hugoContextRenderer struct{} +func (r *hugoContextRenderer) SetOption(name renderer.OptionName, value any) { + r.Config.SetOption(name, value) +} func (r *hugoContextRenderer) RegisterFuncs(reg renderer.NodeRendererFuncRegisterer) { reg.Register(kindHugoContext, r.handleHugoContext) + reg.Register(ast.KindHTMLBlock, r.renderHTMLBlock) +} + +func (r *hugoContextRenderer) stripHugoCtx(b []byte) ([]byte, bool) { + if !bytes.Contains(b, hugoCtxPrefix) { + return b, false + } + return hugoCtxRe.ReplaceAll(b, nil), true +} + +func (r *hugoContextRenderer) renderHTMLBlock( + w util.BufWriter, source []byte, node ast.Node, entering bool, +) (ast.WalkStatus, error) { + n := node.(*ast.HTMLBlock) + if entering { + if r.Unsafe { + l := n.Lines().Len() + for i := 0; i < l; i++ { + line := n.Lines().At(i) + linev := line.Value(source) + var stripped bool + linev, stripped = r.stripHugoCtx(linev) + if stripped { + var p any + ctx, ok := w.(*render.Context) + if ok { + p, _ = render.GetPageAndPageInner(ctx) + } + r.logger.Warnidf(constants.WarnRenderShortcodesInHTML, ".RenderShortcodes detected inside HTML block in %q; this may not be what you intended, see https://gohugo.io/methods/page/rendershortcodes/#limitations", p) + } + + r.Writer.SecureWrite(w, linev) + } + } else { + _, _ = w.WriteString("\n") + } + } else { + if n.HasClosure() { + if r.Unsafe { + closure := n.ClosureLine + r.Writer.SecureWrite(w, closure.Value(source)) + } else { + _, _ = w.WriteString("\n") + } + } + } + return ast.WalkContinue, nil } func (r *hugoContextRenderer) handleHugoContext(w util.BufWriter, source []byte, node ast.Node, entering bool) (ast.WalkStatus, error) { @@ -148,7 +212,9 @@ func (r *hugoContextRenderer) handleHugoContext(w util.BufWriter, source []byte, return ast.WalkContinue, nil } -type hugoContextExtension struct{} +type hugoContextExtension struct { + logger loggers.Logger +} func (a *hugoContextExtension) Extend(m goldmark.Markdown) { m.Parser().AddOptions( @@ -159,7 +225,12 @@ func (a *hugoContextExtension) Extend(m goldmark.Markdown) { m.Renderer().AddOptions( renderer.WithNodeRenderers( - util.Prioritized(&hugoContextRenderer{}, 50), + util.Prioritized(&hugoContextRenderer{ + logger: a.logger, + Config: html.Config{ + Writer: html.DefaultWriter, + }, + }, 50), ), ) } diff --git a/markup/goldmark/hugocontext/hugocontext_test.go b/markup/goldmark/hugocontext/hugocontext_test.go index 4a6eb80f5..62769f4d0 100644 --- a/markup/goldmark/hugocontext/hugocontext_test.go +++ b/markup/goldmark/hugocontext/hugocontext_test.go @@ -24,7 +24,7 @@ func TestWrap(t *testing.T) { b := []byte("test") - c.Assert(Wrap(b, 42), qt.Equals, "{{__hugo_ctx pid=42}}\ntest{{__hugo_ctx/}}\n") + c.Assert(Wrap(b, 42), qt.Equals, "{{__hugo_ctx pid=42}}\ntest\n{{__hugo_ctx/}}\n") } func BenchmarkWrap(b *testing.B) { diff --git a/resources/page/page.go b/resources/page/page.go index 4cda8d31f..20525669c 100644 --- a/resources/page/page.go +++ b/resources/page/page.go @@ -17,6 +17,7 @@ package page import ( "context" + "fmt" "html/template" "github.com/gohugoio/hugo/markup/converter" @@ -180,6 +181,7 @@ type Page interface { ContentProvider TableOfContentsProvider PageWithoutContent + fmt.Stringer } type PageFragment interface { diff --git a/resources/page/page_markup_integration_test.go b/resources/page/page_markup_integration_test.go index 010a9d729..425099215 100644 --- a/resources/page/page_markup_integration_test.go +++ b/resources/page/page_markup_integration_test.go @@ -161,13 +161,13 @@ includecontent: {{ hugo.Context.MarkupScope }}|{{ $p.Markup.Render.Content }}| b := hugolib.Test(t, files) - b.AssertFileContent("public/p1/index.html", "Render heading: title: P1 scope: |", "Foo scope: |") + b.AssertFileContentExact("public/p1/index.html", "Render heading: title: P1 scope: |", "Foo scope: |") - b.AssertFileContent("public/index.html", + b.AssertFileContentExact("public/index.html", + "Begin:\nincludecontent: home|Render heading: title: P3 scope: home|Foo scope: home|\n|\n:End", "Render heading: title: P1 scope: home|", "Foo scope: home|", "Begin:\nincluderendershortcodes: home|

\nRender heading: title: P2 scope: home|

|:End", - "Begin:\nincludecontent: home|Render heading: title: P3 scope: home|Foo scope: home|\n|\n:End", ) } From 30d9aea8607e8143968d73d11a8c1c0e51d34343 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Sun, 3 Nov 2024 10:41:34 +0100 Subject: [PATCH 081/526] Fix stale pages on rebuilds in GetPage with short refs Fixes #13004 --- hugolib/content_map_page.go | 12 +++++++---- hugolib/rendershortcodes_test.go | 35 ++++++++++++++++++++++++++++++++ hugolib/site.go | 1 + lazy/init.go | 2 +- lazy/once.go | 12 +++++------ 5 files changed, 51 insertions(+), 11 deletions(-) diff --git a/hugolib/content_map_page.go b/hugolib/content_map_page.go index c3f06a592..5e8646b21 100644 --- a/hugolib/content_map_page.go +++ b/hugolib/content_map_page.go @@ -37,6 +37,7 @@ import ( "github.com/gohugoio/hugo/hugolib/doctree" "github.com/gohugoio/hugo/hugolib/pagesfromdata" "github.com/gohugoio/hugo/identity" + "github.com/gohugoio/hugo/lazy" "github.com/gohugoio/hugo/media" "github.com/gohugoio/hugo/output" "github.com/gohugoio/hugo/resources" @@ -109,6 +110,11 @@ type pageMap struct { cfg contentMapConfig } +// Invoked on rebuilds. +func (m *pageMap) Reset() { + m.pageReverseIndex.Reset() +} + // pageTrees holds pages and resources in a tree structure for all sites/languages. // Each site gets its own tree set via the Shape method. type pageTrees struct { @@ -958,9 +964,7 @@ type contentTreeReverseIndex struct { } func (c *contentTreeReverseIndex) Reset() { - c.contentTreeReverseIndexMap = &contentTreeReverseIndexMap{ - m: make(map[any]contentNodeI), - } + c.init.ResetWithLock().Unlock() } func (c *contentTreeReverseIndex) Get(key any) contentNodeI { @@ -972,7 +976,7 @@ func (c *contentTreeReverseIndex) Get(key any) contentNodeI { } type contentTreeReverseIndexMap struct { - init sync.Once + init lazy.OnceMore m map[any]contentNodeI } diff --git a/hugolib/rendershortcodes_test.go b/hugolib/rendershortcodes_test.go index 9a31b6536..0eebf46eb 100644 --- a/hugolib/rendershortcodes_test.go +++ b/hugolib/rendershortcodes_test.go @@ -445,3 +445,38 @@ code_p3 b.AssertNoRenderShortcodesArtifacts() b.AssertFileContentEquals("public/p1/index.html", "

Content p1 id-100.

\ncodep2

Foo.\n

\ncode_p3_edited

\ncode_p1code_p1_2code_p1_3") } + +// Issue 13004. +func TestRenderShortcodesIncludeShortRefEdit(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +disableLiveReload = true +disableKinds = ["home", "taxonomy", "term", "section", "rss", "sitemap", "robotsTXT", "404"] +-- content/first/p1.md -- +--- +title: "p1" +--- +## p1-h1 +{{% include "p2" %}} +-- content/second/p2.md -- +--- +title: "p2" +--- +### p2-h1 + +This is some **markup**. +-- layouts/shortcodes/include.html -- +{{ $p := site.GetPage (.Get 0) -}} +{{ $p.RenderShortcodes -}} +-- layouts/_default/single.html -- +{{ .Content }} +` + b := TestRunning(t, files) + b.AssertNoRenderShortcodesArtifacts() + b.AssertFileContentEquals("public/first/p1/index.html", "

p1-h1

\n

\n

p2-h1

\n

This is some markup.\n

\n") + b.EditFileReplaceAll("content/second/p2.md", "p2-h1", "p2-h1-edited").Build() + b.AssertNoRenderShortcodesArtifacts() + b.AssertFileContentEquals("public/first/p1/index.html", "

p1-h1

\n

\n

p2-h1-edited

\n

This is some markup.\n

\n") +} diff --git a/hugolib/site.go b/hugolib/site.go index 24ee5dcc5..c5a4956e2 100644 --- a/hugolib/site.go +++ b/hugolib/site.go @@ -1351,6 +1351,7 @@ func (s *Site) getLanguagePermalinkLang(alwaysInSubDir bool) string { func (s *Site) resetBuildState(sourceChanged bool) { s.relatedDocsHandler = s.relatedDocsHandler.Clone() s.init.Reset() + s.pageMap.Reset() } func (s *Site) errorCollator(results <-chan error, errs chan<- error) { diff --git a/lazy/init.go b/lazy/init.go index 7b88a5351..bef3867a9 100644 --- a/lazy/init.go +++ b/lazy/init.go @@ -36,7 +36,7 @@ type Init struct { prev *Init children []*Init - init onceMore + init OnceMore out any err error f func(context.Context) (any, error) diff --git a/lazy/once.go b/lazy/once.go index c6abcd884..dac689df3 100644 --- a/lazy/once.go +++ b/lazy/once.go @@ -18,19 +18,19 @@ import ( "sync/atomic" ) -// onceMore is similar to sync.Once. +// OnceMore is similar to sync.Once. // // Additional features are: // * it can be reset, so the action can be repeated if needed // * it has methods to check if it's done or in progress -type onceMore struct { +type OnceMore struct { mu sync.Mutex lock uint32 done uint32 } -func (t *onceMore) Do(f func()) { +func (t *OnceMore) Do(f func()) { if atomic.LoadUint32(&t.done) == 1 { return } @@ -53,15 +53,15 @@ func (t *onceMore) Do(f func()) { f() } -func (t *onceMore) InProgress() bool { +func (t *OnceMore) InProgress() bool { return atomic.LoadUint32(&t.lock) == 1 } -func (t *onceMore) Done() bool { +func (t *OnceMore) Done() bool { return atomic.LoadUint32(&t.done) == 1 } -func (t *onceMore) ResetWithLock() *sync.Mutex { +func (t *OnceMore) ResetWithLock() *sync.Mutex { t.mu.Lock() defer atomic.StoreUint32(&t.done, 0) return &t.mu From 62a96cef7fbe496271e8cca0f234193f6106a771 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Sun, 3 Nov 2024 13:37:11 +0100 Subject: [PATCH 082/526] markup/goldmark: Add warning (using Warnidf) on Goldmark Fixes #12997 --- common/constants/constants.go | 1 + markup/goldmark/goldmark_integration_test.go | 25 ++++++++++++++++++++ markup/goldmark/hugocontext/hugocontext.go | 13 ++++++---- 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/common/constants/constants.go b/common/constants/constants.go index 752aef72c..48813e79b 100644 --- a/common/constants/constants.go +++ b/common/constants/constants.go @@ -22,6 +22,7 @@ const ( WarnFrontMatterParamsOverrides = "warning-frontmatter-params-overrides" WarnRenderShortcodesInHTML = "warning-rendershortcodes-in-html" + WarnGoldmarkRawHTML = "warning-goldmark-raw-html" ) // Field/method names with special meaning. diff --git a/markup/goldmark/goldmark_integration_test.go b/markup/goldmark/goldmark_integration_test.go index 19b18692e..8b7cc5a54 100644 --- a/markup/goldmark/goldmark_integration_test.go +++ b/markup/goldmark/goldmark_integration_test.go @@ -802,3 +802,28 @@ H~2~0 "

1st

", ) } + +// Issue 12997. +func TestGoldmarkRawHTMLWarning(t *testing.T) { + files := ` +-- hugo.toml -- +disableKinds = ['home','rss','section','sitemap','taxonomy','term'] +markup.goldmark.renderer.unsafe = false +-- content/p1.md -- +--- +title: "p1" +--- +
Some raw HTML
+-- layouts/_default/single.html -- +{{ .Content }} +` + + b := hugolib.Test(t, files, hugolib.TestOptWarn()) + + b.AssertFileContent("public/p1/index.html", "") + b.AssertLogContains("WARN Raw HTML omitted from \"/content/p1.md\"; see https://gohugo.io/getting-started/configuration-markup/#rendererunsafe\nYou can suppress this warning by adding the following to your site configuration:\nignoreLogs = ['warning-goldmark-raw-html']") + + b = hugolib.Test(t, strings.ReplaceAll(files, "markup.goldmark.renderer.unsafe = false", "markup.goldmark.renderer.unsafe = true"), hugolib.TestOptWarn()) + b.AssertFileContent("public/p1/index.html", "! ") + b.AssertLogContains("! WARN") +} diff --git a/markup/goldmark/hugocontext/hugocontext.go b/markup/goldmark/hugocontext/hugocontext.go index 223c30c91..912e9eb3c 100644 --- a/markup/goldmark/hugocontext/hugocontext.go +++ b/markup/goldmark/hugocontext/hugocontext.go @@ -159,6 +159,14 @@ func (r *hugoContextRenderer) renderHTMLBlock( w util.BufWriter, source []byte, node ast.Node, entering bool, ) (ast.WalkStatus, error) { n := node.(*ast.HTMLBlock) + var p any + ctx, ok := w.(*render.Context) + if ok { + p, _ = render.GetPageAndPageInner(ctx) + } + if !r.Unsafe { + r.logger.Warnidf(constants.WarnGoldmarkRawHTML, "Raw HTML omitted from %q; see https://gohugo.io/getting-started/configuration-markup/#rendererunsafe", p) + } if entering { if r.Unsafe { l := n.Lines().Len() @@ -168,11 +176,6 @@ func (r *hugoContextRenderer) renderHTMLBlock( var stripped bool linev, stripped = r.stripHugoCtx(linev) if stripped { - var p any - ctx, ok := w.(*render.Context) - if ok { - p, _ = render.GetPageAndPageInner(ctx) - } r.logger.Warnidf(constants.WarnRenderShortcodesInHTML, ".RenderShortcodes detected inside HTML block in %q; this may not be what you intended, see https://gohugo.io/methods/page/rendershortcodes/#limitations", p) } From 6cf23bf8824758b0d2c4d855f0241e72aef77206 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Mon, 4 Nov 2024 09:27:17 +0100 Subject: [PATCH 083/526] markup/goldmark: Only log Raw HTML omitted WARN on block entering Updates #12997 --- markup/goldmark/hugocontext/hugocontext.go | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/markup/goldmark/hugocontext/hugocontext.go b/markup/goldmark/hugocontext/hugocontext.go index 912e9eb3c..4971456be 100644 --- a/markup/goldmark/hugocontext/hugocontext.go +++ b/markup/goldmark/hugocontext/hugocontext.go @@ -159,15 +159,12 @@ func (r *hugoContextRenderer) renderHTMLBlock( w util.BufWriter, source []byte, node ast.Node, entering bool, ) (ast.WalkStatus, error) { n := node.(*ast.HTMLBlock) - var p any - ctx, ok := w.(*render.Context) - if ok { - p, _ = render.GetPageAndPageInner(ctx) - } - if !r.Unsafe { - r.logger.Warnidf(constants.WarnGoldmarkRawHTML, "Raw HTML omitted from %q; see https://gohugo.io/getting-started/configuration-markup/#rendererunsafe", p) - } if entering { + var p any + ctx, ok := w.(*render.Context) + if ok { + p, _ = render.GetPageAndPageInner(ctx) + } if r.Unsafe { l := n.Lines().Len() for i := 0; i < l; i++ { @@ -178,10 +175,10 @@ func (r *hugoContextRenderer) renderHTMLBlock( if stripped { r.logger.Warnidf(constants.WarnRenderShortcodesInHTML, ".RenderShortcodes detected inside HTML block in %q; this may not be what you intended, see https://gohugo.io/methods/page/rendershortcodes/#limitations", p) } - r.Writer.SecureWrite(w, linev) } } else { + r.logger.Warnidf(constants.WarnGoldmarkRawHTML, "Raw HTML omitted from %q; see https://gohugo.io/getting-started/configuration-markup/#rendererunsafe", p) _, _ = w.WriteString("\n") } } else { From fcdc454cc58e9f26ba29389100adfc09cb383448 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Mon, 4 Nov 2024 10:31:59 +0100 Subject: [PATCH 084/526] Do not watch directories with no mounted files in it Fixes #12912 Fixes #13007 --- hugofs/rootmapping_fs.go | 10 ++++----- hugolib/filesystems/basefs_test.go | 33 +++++++++++++++++++++++++++--- 2 files changed, 35 insertions(+), 8 deletions(-) diff --git a/hugofs/rootmapping_fs.go b/hugofs/rootmapping_fs.go index 2ecd88e9e..02e541a05 100644 --- a/hugofs/rootmapping_fs.go +++ b/hugofs/rootmapping_fs.go @@ -246,11 +246,11 @@ func (fs *RootMappingFs) Mounts(base string) ([]FileMetaInfo, error) { return nil, nil } - fss := make([]FileMetaInfo, len(roots)) - for i, r := range roots { + fss := make([]FileMetaInfo, 0, len(roots)) + for _, r := range roots { if r.fiSingleFile != nil { // A single file mount. - fss[i] = r.fiSingleFile + fss = append(fss, r.fiSingleFile) continue } bfs := NewBasePathFs(fs.Fs, r.To) @@ -261,9 +261,9 @@ func (fs *RootMappingFs) Mounts(base string) ([]FileMetaInfo, error) { fs = decorateDirs(fs, r.Meta) fi, err := fs.Stat("") if err != nil { - return nil, fmt.Errorf("RootMappingFs.Dirs: %w", err) + continue } - fss[i] = fi.(FileMetaInfo) + fss = append(fss, fi.(FileMetaInfo)) } return fss, nil diff --git a/hugolib/filesystems/basefs_test.go b/hugolib/filesystems/basefs_test.go index e39709386..3f189c860 100644 --- a/hugolib/filesystems/basefs_test.go +++ b/hugolib/filesystems/basefs_test.go @@ -220,6 +220,18 @@ target = 'content' source = 'content2' target = 'content/c2' [[module.mounts]] +source = 'content3' +target = 'content/watchdisabled' +disableWatch = true +[[module.mounts]] +source = 'content4' +target = 'content/excludedsome' +excludeFiles = 'p1.md' +[[module.mounts]] +source = 'content5' +target = 'content/excludedall' +excludeFiles = '/**' +[[module.mounts]] source = "hugo_stats.json" target = "assets/watching/hugo_stats.json" -- hugo_stats.json -- @@ -230,12 +242,27 @@ foo -- themes/t1/layouts/_default/single.html -- {{ .Content }} -- themes/t1/static/f1.txt -- +-- content3/p1.md -- +-- content4/p1.md -- +-- content4/p2.md -- +-- content5/p3.md -- +-- content5/p4.md -- ` b := hugolib.Test(t, files) bfs := b.H.BaseFs - watchFilenames := bfs.WatchFilenames() - // []string{"/hugo_stats.json", "/content", "/content2", "/themes/t1/layouts", "/themes/t1/layouts/_default", "/themes/t1/static"} - b.Assert(watchFilenames, qt.HasLen, 6) + watchFilenames := toSlashes(bfs.WatchFilenames()) + + // content3 has disableWatch = true + // content5 has excludeFiles = '/**' + b.Assert(watchFilenames, qt.DeepEquals, []string{"/hugo_stats.json", "/content", "/content2", "/content4", "/themes/t1/layouts", "/themes/t1/layouts/_default", "/themes/t1/static"}) +} + +func toSlashes(in []string) []string { + out := make([]string, len(in)) + for i, s := range in { + out[i] = filepath.ToSlash(s) + } + return out } func TestNoSymlinks(t *testing.T) { From 59c115813595cba1b1c0e70b867e734992648d1b Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Mon, 4 Nov 2024 16:04:06 +0000 Subject: [PATCH 085/526] releaser: Bump versions for release of 0.137.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 870719dcb..991b54ac4 100644 --- a/common/hugo/version_current.go +++ b/common/hugo/version_current.go @@ -19,5 +19,5 @@ var CurrentVersion = Version{ Major: 0, Minor: 137, PatchLevel: 0, - Suffix: "-DEV", + Suffix: "", } From b7861e586eb3e35c56ff0580de244f939596f7f4 Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Mon, 4 Nov 2024 16:19:39 +0000 Subject: [PATCH 086/526] releaser: Prepare repository for 0.138.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 991b54ac4..b265b6983 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: 137, + Minor: 138, PatchLevel: 0, - Suffix: "", + Suffix: "-DEV", } diff --git a/hugoreleaser.env b/hugoreleaser.env index 590267381..e19674c16 100644 --- a/hugoreleaser.env +++ b/hugoreleaser.env @@ -1,7 +1,8 @@ # Release env. # These will be replaced by script before release. -HUGORELEASER_TAG=v0.136.5 -HUGORELEASER_COMMITISH=46cccb021bc6425455f4eec093f5cc4a32f1d12c +HUGORELEASER_TAG=v0.137.0 +HUGORELEASER_COMMITISH=59c115813595cba1b1c0e70b867e734992648d1b + From 801035bb7a38beae214105e872a4cdc49ac610ce Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Mon, 4 Nov 2024 11:11:46 -0800 Subject: [PATCH 087/526] tpl/tplimpl: Create an embedded comment shortcode Closes #13010 --- .../embedded/templates/shortcodes/comment.html | 1 + tpl/tplimpl/tplimpl_integration_test.go | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) create mode 100644 tpl/tplimpl/embedded/templates/shortcodes/comment.html diff --git a/tpl/tplimpl/embedded/templates/shortcodes/comment.html b/tpl/tplimpl/embedded/templates/shortcodes/comment.html new file mode 100644 index 000000000..cb3293401 --- /dev/null +++ b/tpl/tplimpl/embedded/templates/shortcodes/comment.html @@ -0,0 +1 @@ +{{- $noop := .Inner -}} diff --git a/tpl/tplimpl/tplimpl_integration_test.go b/tpl/tplimpl/tplimpl_integration_test.go index a8599bbad..c7e118e82 100644 --- a/tpl/tplimpl/tplimpl_integration_test.go +++ b/tpl/tplimpl/tplimpl_integration_test.go @@ -584,3 +584,19 @@ title: p5 ``, ) } + +func TestCommentShortcode(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +disableKinds = ['page','rss','section','sitemap','taxonomy','term'] +-- layouts/index.html -- +{{ .Content }} +-- content/_index.md -- +a{{< comment >}}b{{< /comment >}}c +` + + b := hugolib.Test(t, files) + b.AssertFileContent("public/index.html", "

ac

") +} From 2b0b3b8584f5b6554f61b15fbe25dc664d9bcc7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Tue, 5 Nov 2024 09:14:19 +0100 Subject: [PATCH 088/526] commands: Print the "deploy not available" error message even if flags provided Fixes #13012 --- commands/deploy.go | 13 +-------- commands/deploy_flags.go | 33 +++++++++++++++++++++++ commands/deploy_off.go | 1 + main_withdeploy_off_test.go | 29 ++++++++++++++++++++ testscripts/withdeploy-off/deploy_off.txt | 3 +++ 5 files changed, 67 insertions(+), 12 deletions(-) create mode 100644 commands/deploy_flags.go create mode 100644 main_withdeploy_off_test.go create mode 100644 testscripts/withdeploy-off/deploy_off.txt diff --git a/commands/deploy.go b/commands/deploy.go index f9c22be48..eb419daba 100644 --- a/commands/deploy.go +++ b/commands/deploy.go @@ -20,7 +20,6 @@ import ( "context" "github.com/gohugoio/hugo/deploy" - "github.com/gohugoio/hugo/deploy/deployconfig" "github.com/bep/simplecobra" "github.com/spf13/cobra" @@ -47,17 +46,7 @@ documentation. return deployer.Deploy(ctx) }, withc: func(cmd *cobra.Command, r *rootCommand) { - cmd.ValidArgsFunction = cobra.NoFileCompletions - cmd.Flags().String("target", "", "target deployment from deployments section in config file; defaults to the first one") - _ = cmd.RegisterFlagCompletionFunc("target", cobra.NoFileCompletions) - cmd.Flags().Bool("confirm", false, "ask for confirmation before making changes to the target") - cmd.Flags().Bool("dryRun", false, "dry run") - cmd.Flags().Bool("force", false, "force upload of all files") - cmd.Flags().Bool("invalidateCDN", deployconfig.DefaultConfig.InvalidateCDN, "invalidate the CDN cache listed in the deployment target") - cmd.Flags().Int("maxDeletes", deployconfig.DefaultConfig.MaxDeletes, "maximum # of files to delete, or -1 to disable") - _ = cmd.RegisterFlagCompletionFunc("maxDeletes", cobra.NoFileCompletions) - cmd.Flags().Int("workers", deployconfig.DefaultConfig.Workers, "number of workers to transfer files. defaults to 10") - _ = cmd.RegisterFlagCompletionFunc("workers", cobra.NoFileCompletions) + applyDeployFlags(cmd, r) }, } } diff --git a/commands/deploy_flags.go b/commands/deploy_flags.go new file mode 100644 index 000000000..d4326547a --- /dev/null +++ b/commands/deploy_flags.go @@ -0,0 +1,33 @@ +// Copyright 2024 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. +// 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 commands + +import ( + "github.com/gohugoio/hugo/deploy/deployconfig" + "github.com/spf13/cobra" +) + +func applyDeployFlags(cmd *cobra.Command, r *rootCommand) { + cmd.ValidArgsFunction = cobra.NoFileCompletions + cmd.Flags().String("target", "", "target deployment from deployments section in config file; defaults to the first one") + _ = cmd.RegisterFlagCompletionFunc("target", cobra.NoFileCompletions) + cmd.Flags().Bool("confirm", false, "ask for confirmation before making changes to the target") + cmd.Flags().Bool("dryRun", false, "dry run") + cmd.Flags().Bool("force", false, "force upload of all files") + cmd.Flags().Bool("invalidateCDN", deployconfig.DefaultConfig.InvalidateCDN, "invalidate the CDN cache listed in the deployment target") + cmd.Flags().Int("maxDeletes", deployconfig.DefaultConfig.MaxDeletes, "maximum # of files to delete, or -1 to disable") + _ = cmd.RegisterFlagCompletionFunc("maxDeletes", cobra.NoFileCompletions) + cmd.Flags().Int("workers", deployconfig.DefaultConfig.Workers, "number of workers to transfer files. defaults to 10") + _ = cmd.RegisterFlagCompletionFunc("workers", cobra.NoFileCompletions) +} diff --git a/commands/deploy_off.go b/commands/deploy_off.go index 7eb6429c5..32a08da2e 100644 --- a/commands/deploy_off.go +++ b/commands/deploy_off.go @@ -44,6 +44,7 @@ func newDeployCommand() simplecobra.Commander { return errors.New("deploy not supported in this version of Hugo; install a release with 'withdeploy' in the archive filename or build yourself with the 'withdeploy' build tag. Also see https://github.com/gohugoio/hugo/pull/12995") }, withc: func(cmd *cobra.Command, r *rootCommand) { + applyDeployFlags(cmd, r) cmd.Hidden = true }, } diff --git a/main_withdeploy_off_test.go b/main_withdeploy_off_test.go new file mode 100644 index 000000000..490ccd693 --- /dev/null +++ b/main_withdeploy_off_test.go @@ -0,0 +1,29 @@ +// Copyright 2024 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. +// 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. + +//go:build !withdeploy +// +build !withdeploy + +package main + +import ( + "testing" + + "github.com/rogpeppe/go-internal/testscript" +) + +func TestWithdeploy(t *testing.T) { + p := commonTestScriptsParam + p.Dir = "testscripts/withdeploy-off" + testscript.Run(t, p) +} diff --git a/testscripts/withdeploy-off/deploy_off.txt b/testscripts/withdeploy-off/deploy_off.txt new file mode 100644 index 000000000..5e6c65d27 --- /dev/null +++ b/testscripts/withdeploy-off/deploy_off.txt @@ -0,0 +1,3 @@ +! hugo deploy --force +# Issue 13012 +stderr 'deploy not supported in this version of Hugo' \ No newline at end of file From 94b46c36b4c808e47ac0727f4fbaae74705f4483 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Tue, 5 Nov 2024 09:19:16 +0100 Subject: [PATCH 089/526] build: Add missing withdeploy archive for Windows Fixes #13009 --- hugoreleaser.toml | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/hugoreleaser.toml b/hugoreleaser.toml index 8c3693739..2cb8e3665 100644 --- a/hugoreleaser.toml +++ b/hugoreleaser.toml @@ -185,6 +185,25 @@ archive_alias_replacements = { "linux-amd64.tar.gz" = "Linux-64bit.tar.gz" } [[builds.os.archs]] goarch = "amd64" +[[builds]] + path = "container1/windows/extended-withdeploy" + + [builds.build_settings] + flags = ["-buildmode", "exe", "-tags", "extended,withdeploy"] + env = [ + "CGO_ENABLED=1", + "CC=x86_64-w64-mingw32-gcc", + "CXX=x86_64-w64-mingw32-g++", + ] + ldflags = "-s -w -X github.com/gohugoio/hugo/common/hugo.vendorInfo=gohugoio -extldflags '-static'" + + [[builds.os]] + goos = "windows" + [builds.os.build_settings] + binary = "hugo.exe" + [[builds.os.archs]] + goarch = "amd64" + [[archives]] paths = ["builds/container1/unix/regular/**"] [[archives]] @@ -212,6 +231,13 @@ archive_alias_replacements = { "linux-amd64.tar.gz" = "Linux-64bit.tar.gz" } [archives.archive_settings.type] format = "zip" extension = ".zip" +[[archives]] + paths = ["builds/**/windows/extended-withdeploy/**"] + [archives.archive_settings] + name_template = "{{ .Project }}_extended_withdeploy_{{ .Tag | trimPrefix `v` }}_{{ .Goos }}-{{ .Goarch }}" + [archives.archive_settings.type] + format = "zip" + extension = ".zip" [[archives]] paths = ["builds/**/regular/linux/{arm64,amd64}"] [archives.archive_settings] From 4faaaf9c2ffb8ceab0630a66136da852d88e651f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Tue, 5 Nov 2024 09:29:10 +0100 Subject: [PATCH 090/526] markup: Goldmark log "Raw HTML omitted" warning also for inline HTML Fixes #13013 --- markup/goldmark/goldmark_integration_test.go | 26 +++++++++++- markup/goldmark/hugocontext/hugocontext.go | 44 ++++++++++++++++---- 2 files changed, 62 insertions(+), 8 deletions(-) diff --git a/markup/goldmark/goldmark_integration_test.go b/markup/goldmark/goldmark_integration_test.go index 8b7cc5a54..82579069b 100644 --- a/markup/goldmark/goldmark_integration_test.go +++ b/markup/goldmark/goldmark_integration_test.go @@ -804,7 +804,7 @@ H~2~0 } // Issue 12997. -func TestGoldmarkRawHTMLWarning(t *testing.T) { +func TestGoldmarkRawHTMLWarningBlocks(t *testing.T) { files := ` -- hugo.toml -- disableKinds = ['home','rss','section','sitemap','taxonomy','term'] @@ -827,3 +827,27 @@ title: "p1" b.AssertFileContent("public/p1/index.html", "! ") b.AssertLogContains("! WARN") } + +func TestGoldmarkRawHTMLWarningInline(t *testing.T) { + files := ` +-- hugo.toml -- +disableKinds = ['home','rss','section','sitemap','taxonomy','term'] +markup.goldmark.renderer.unsafe = false +-- content/p1.md -- +--- +title: "p1" +--- +raw HTML +-- layouts/_default/single.html -- +{{ .Content }} +` + + b := hugolib.Test(t, files, hugolib.TestOptWarn()) + + b.AssertFileContent("public/p1/index.html", "") + b.AssertLogContains("WARN Raw HTML omitted from \"/content/p1.md\"; see https://gohugo.io/getting-started/configuration-markup/#rendererunsafe\nYou can suppress this warning by adding the following to your site configuration:\nignoreLogs = ['warning-goldmark-raw-html']") + + b = hugolib.Test(t, strings.ReplaceAll(files, "markup.goldmark.renderer.unsafe = false", "markup.goldmark.renderer.unsafe = true"), hugolib.TestOptWarn()) + b.AssertFileContent("public/p1/index.html", "! ") + b.AssertLogContains("! WARN") +} diff --git a/markup/goldmark/hugocontext/hugocontext.go b/markup/goldmark/hugocontext/hugocontext.go index 4971456be..a10e095ef 100644 --- a/markup/goldmark/hugocontext/hugocontext.go +++ b/markup/goldmark/hugocontext/hugocontext.go @@ -145,6 +145,7 @@ func (r *hugoContextRenderer) SetOption(name renderer.OptionName, value any) { func (r *hugoContextRenderer) RegisterFuncs(reg renderer.NodeRendererFuncRegisterer) { reg.Register(kindHugoContext, r.handleHugoContext) + reg.Register(ast.KindRawHTML, r.renderRawHTML) reg.Register(ast.KindHTMLBlock, r.renderHTMLBlock) } @@ -155,16 +156,25 @@ func (r *hugoContextRenderer) stripHugoCtx(b []byte) ([]byte, bool) { return hugoCtxRe.ReplaceAll(b, nil), true } +func (r *hugoContextRenderer) logRawHTMLEmittedWarn(w util.BufWriter) { + r.logger.Warnidf(constants.WarnGoldmarkRawHTML, "Raw HTML omitted from %q; see https://gohugo.io/getting-started/configuration-markup/#rendererunsafe", r.getPage(w)) +} + +func (r *hugoContextRenderer) getPage(w util.BufWriter) any { + var p any + ctx, ok := w.(*render.Context) + if ok { + p, _ = render.GetPageAndPageInner(ctx) + } + return p +} + +// HTML rendering based on Goldmark implementation. func (r *hugoContextRenderer) renderHTMLBlock( w util.BufWriter, source []byte, node ast.Node, entering bool, ) (ast.WalkStatus, error) { n := node.(*ast.HTMLBlock) if entering { - var p any - ctx, ok := w.(*render.Context) - if ok { - p, _ = render.GetPageAndPageInner(ctx) - } if r.Unsafe { l := n.Lines().Len() for i := 0; i < l; i++ { @@ -173,12 +183,12 @@ func (r *hugoContextRenderer) renderHTMLBlock( var stripped bool linev, stripped = r.stripHugoCtx(linev) if stripped { - r.logger.Warnidf(constants.WarnRenderShortcodesInHTML, ".RenderShortcodes detected inside HTML block in %q; this may not be what you intended, see https://gohugo.io/methods/page/rendershortcodes/#limitations", p) + r.logger.Warnidf(constants.WarnRenderShortcodesInHTML, ".RenderShortcodes detected inside HTML block in %q; this may not be what you intended, see https://gohugo.io/methods/page/rendershortcodes/#limitations", r.getPage(w)) } r.Writer.SecureWrite(w, linev) } } else { - r.logger.Warnidf(constants.WarnGoldmarkRawHTML, "Raw HTML omitted from %q; see https://gohugo.io/getting-started/configuration-markup/#rendererunsafe", p) + r.logRawHTMLEmittedWarn(w) _, _ = w.WriteString("\n") } } else { @@ -194,6 +204,26 @@ func (r *hugoContextRenderer) renderHTMLBlock( return ast.WalkContinue, nil } +func (r *hugoContextRenderer) renderRawHTML( + w util.BufWriter, source []byte, node ast.Node, entering bool, +) (ast.WalkStatus, error) { + if !entering { + return ast.WalkSkipChildren, nil + } + if r.Unsafe { + n := node.(*ast.RawHTML) + l := n.Segments.Len() + for i := 0; i < l; i++ { + segment := n.Segments.At(i) + _, _ = w.Write(segment.Value(source)) + } + return ast.WalkSkipChildren, nil + } + r.logRawHTMLEmittedWarn(w) + _, _ = w.WriteString("") + return ast.WalkSkipChildren, nil +} + func (r *hugoContextRenderer) handleHugoContext(w util.BufWriter, source []byte, node ast.Node, entering bool) (ast.WalkStatus, error) { if !entering { return ast.WalkContinue, nil From ca4fc587c368e5a4f85a6514b9fd5e00153847ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Tue, 5 Nov 2024 09:57:12 +0100 Subject: [PATCH 091/526] common/hugo: Add withdeploy to the version string printed in hugo version --- common/hugo/vars_withdeploy.go | 19 +++++++++++++++++++ common/hugo/vars_withdeploy_off.go | 19 +++++++++++++++++++ common/hugo/version.go | 3 +++ 3 files changed, 41 insertions(+) create mode 100644 common/hugo/vars_withdeploy.go create mode 100644 common/hugo/vars_withdeploy_off.go diff --git a/common/hugo/vars_withdeploy.go b/common/hugo/vars_withdeploy.go new file mode 100644 index 000000000..88ce9a1cd --- /dev/null +++ b/common/hugo/vars_withdeploy.go @@ -0,0 +1,19 @@ +// Copyright 2024 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. +// 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. + +//go:build withdeploy +// +build withdeploy + +package hugo + +var IsWithdeploy = true diff --git a/common/hugo/vars_withdeploy_off.go b/common/hugo/vars_withdeploy_off.go new file mode 100644 index 000000000..935568027 --- /dev/null +++ b/common/hugo/vars_withdeploy_off.go @@ -0,0 +1,19 @@ +// Copyright 2024 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. +// 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. + +//go:build !withdeploy +// +build !withdeploy + +package hugo + +var IsWithdeploy = false diff --git a/common/hugo/version.go b/common/hugo/version.go index 6cabfdbb9..cf5988840 100644 --- a/common/hugo/version.go +++ b/common/hugo/version.go @@ -152,6 +152,9 @@ func BuildVersionString() string { if IsExtended { version += "+extended" } + if IsWithdeploy { + version += "+withdeploy" + } osArch := bi.GoOS + "/" + bi.GoArch From 17e15b2148cee6da923acd7adf2ec31ea6b3415c Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Tue, 5 Nov 2024 11:49:09 +0000 Subject: [PATCH 092/526] releaser: Bump versions for release of 0.137.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 b265b6983..cc758c184 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: 138, - PatchLevel: 0, - Suffix: "-DEV", + Minor: 137, + PatchLevel: 1, + Suffix: "", } From df8bd4af4f49aec04d039d17ad970058f3b4e1bc Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Tue, 5 Nov 2024 12:04:27 +0000 Subject: [PATCH 093/526] releaser: Prepare repository for 0.138.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 cc758c184..b265b6983 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: 137, - PatchLevel: 1, - Suffix: "", + Minor: 138, + PatchLevel: 0, + Suffix: "-DEV", } diff --git a/hugoreleaser.env b/hugoreleaser.env index e19674c16..4bebe0e2a 100644 --- a/hugoreleaser.env +++ b/hugoreleaser.env @@ -1,7 +1,8 @@ # Release env. # These will be replaced by script before release. -HUGORELEASER_TAG=v0.137.0 -HUGORELEASER_COMMITISH=59c115813595cba1b1c0e70b867e734992648d1b +HUGORELEASER_TAG=v0.137.1 +HUGORELEASER_COMMITISH=17e15b2148cee6da923acd7adf2ec31ea6b3415c + From 2c3efc81064a6e0bdde3d02629f06ca87a7d2c08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Tue, 5 Nov 2024 16:32:57 +0100 Subject: [PATCH 094/526] Alias Page.Scratch to Page.Store (note) Fixes #13016 --- common/maps/scratch.go | 19 ------------------- hugolib/page.go | 3 +-- hugolib/page__common.go | 6 +++++- hugolib/page__new.go | 1 - hugolib/page_test.go | 26 ++++++++++++++++++++++++++ resources/page/page.go | 4 +++- 6 files changed, 35 insertions(+), 24 deletions(-) diff --git a/common/maps/scratch.go b/common/maps/scratch.go index e9f412540..638377216 100644 --- a/common/maps/scratch.go +++ b/common/maps/scratch.go @@ -28,25 +28,6 @@ type Scratch struct { mu sync.RWMutex } -// Scratcher provides a scratching service. -type Scratcher interface { - // Scratch returns a "scratch pad" that can be used to store state. - Scratch() *Scratch -} - -type scratcher struct { - s *Scratch -} - -func (s scratcher) Scratch() *Scratch { - return s.s -} - -// NewScratcher creates a new Scratcher. -func NewScratcher() Scratcher { - return scratcher{s: NewScratch()} -} - // Add will, for single values, add (using the + operator) the addend to the existing addend (if found). // Supports numeric values and strings. // diff --git a/hugolib/page.go b/hugolib/page.go index 2bc1da044..e4c841966 100644 --- a/hugolib/page.go +++ b/hugolib/page.go @@ -38,7 +38,6 @@ import ( "github.com/gohugoio/hugo/tpl" "github.com/gohugoio/hugo/common/herrors" - "github.com/gohugoio/hugo/common/maps" "github.com/gohugoio/hugo/common/types" "github.com/gohugoio/hugo/source" @@ -149,7 +148,7 @@ func (p *pageState) Key() string { } func (p *pageState) resetBuildState() { - p.Scratcher = maps.NewScratcher() + // Nothing to do for now. } func (p *pageState) reusePageOutputContent() bool { diff --git a/hugolib/page__common.go b/hugolib/page__common.go index d3b0bd112..55465e214 100644 --- a/hugolib/page__common.go +++ b/hugolib/page__common.go @@ -56,7 +56,6 @@ type pageCommon struct { store *maps.Scratch // All of these represents the common parts of a page.Page - maps.Scratcher navigation.PageMenusProvider page.AuthorProvider page.AlternativeOutputFormatsProvider @@ -113,3 +112,8 @@ type pageCommon struct { func (p *pageCommon) Store() *maps.Scratch { return p.store } + +// See issue 13016. +func (p *pageCommon) Scratch() *maps.Scratch { + return p.Store() +} diff --git a/hugolib/page__new.go b/hugolib/page__new.go index 9a4972d07..9a11fa889 100644 --- a/hugolib/page__new.go +++ b/hugolib/page__new.go @@ -184,7 +184,6 @@ func (h *HugoSites) doNewPage(m *pageMeta) (*pageState, *paths.Path, error) { pageCommon: &pageCommon{ FileProvider: m, AuthorProvider: m, - Scratcher: maps.NewScratcher(), store: maps.NewScratch(), Positioner: page.NopPage, InSectionPositioner: page.NopPage, diff --git a/hugolib/page_test.go b/hugolib/page_test.go index 429ab2659..bdd1be6f7 100644 --- a/hugolib/page_test.go +++ b/hugolib/page_test.go @@ -1688,6 +1688,32 @@ title: Scratch Me! b.AssertFileContent("public/scratchme/index.html", "C: cv") } +// Issue 13016. +func TestScratchAliasToStore(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +disableKinds = ["taxonomy", "term", "page", "section"] +disableLiveReload = true +-- layouts/index.html -- +{{ .Scratch.Set "a" "b" }} +{{ .Store.Set "c" "d" }} +.Scratch eq .Store: {{ eq .Scratch .Store }} +a: {{ .Store.Get "a" }} +c: {{ .Scratch.Get "c" }} + +` + + b := Test(t, files) + + b.AssertFileContent("public/index.html", + ".Scratch eq .Store: true", + "a: b", + "c: d", + ) +} + func TestPageParam(t *testing.T) { t.Parallel() diff --git a/resources/page/page.go b/resources/page/page.go index 20525669c..ea7f4bf1b 100644 --- a/resources/page/page.go +++ b/resources/page/page.go @@ -327,7 +327,9 @@ type PageWithoutContent interface { // Scratch returns a Scratch that can be used to store temporary state. // Note that this Scratch gets reset on server rebuilds. See Store() for a variant that survives. - maps.Scratcher + // Scratch returns a "scratch pad" that can be used to store state. + // Deprecated: From Hugo v0.138.0 this is just an alias for Store. + Scratch() *maps.Scratch // Store returns a Scratch that can be used to store temporary state. // In contrast to Scratch(), this Scratch is not reset on server rebuilds. From 95e2d5beb8cc5937792e1ed15589434987590e39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Wed, 6 Nov 2024 10:17:34 +0100 Subject: [PATCH 095/526] Fix concurrent map read and map write in short page lookups Regression introduced in Hugo `v0.137.0`. Fixes #13019 --- common/maps/cache.go | 54 +++++++++++++++++++++++-- hugolib/content_map_page.go | 78 ++++++++++++++++++------------------- hugolib/content_map_test.go | 76 ++++++++++++++++++++++++++++++++++++ lazy/init.go | 2 +- lazy/once.go | 10 ++--- 5 files changed, 170 insertions(+), 50 deletions(-) diff --git a/common/maps/cache.go b/common/maps/cache.go index 0175974b5..cdc31a684 100644 --- a/common/maps/cache.go +++ b/common/maps/cache.go @@ -13,11 +13,14 @@ package maps -import "sync" +import ( + "sync" +) // Cache is a simple thread safe cache backed by a map. type Cache[K comparable, T any] struct { - m map[K]T + m map[K]T + hasBeenInitialized bool sync.RWMutex } @@ -34,11 +37,16 @@ func (c *Cache[K, T]) Get(key K) (T, bool) { return zero, false } c.RLock() - v, found := c.m[key] + v, found := c.get(key) c.RUnlock() return v, found } +func (c *Cache[K, T]) get(key K) (T, bool) { + v, found := c.m[key] + return v, found +} + // GetOrCreate gets the value for the given key if it exists, or creates it if not. func (c *Cache[K, T]) GetOrCreate(key K, create func() (T, error)) (T, error) { c.RLock() @@ -61,13 +69,49 @@ func (c *Cache[K, T]) GetOrCreate(key K, create func() (T, error)) (T, error) { return v, nil } +// InitAndGet initializes the cache if not already done and returns the value for the given key. +// The init state will be reset on Reset or Drain. +func (c *Cache[K, T]) InitAndGet(key K, init func(get func(key K) (T, bool), set func(key K, value T)) error) (T, error) { + var v T + c.RLock() + if !c.hasBeenInitialized { + c.RUnlock() + if err := func() error { + c.Lock() + defer c.Unlock() + // Double check in case another goroutine has initialized it in the meantime. + if !c.hasBeenInitialized { + err := init(c.get, c.set) + if err != nil { + return err + } + c.hasBeenInitialized = true + } + return nil + }(); err != nil { + return v, err + } + // Reacquire the read lock. + c.RLock() + } + + v = c.m[key] + c.RUnlock() + + return v, nil +} + // Set sets the given key to the given value. func (c *Cache[K, T]) Set(key K, value T) { c.Lock() - c.m[key] = value + c.set(key, value) c.Unlock() } +func (c *Cache[K, T]) set(key K, value T) { + c.m[key] = value +} + // ForEeach calls the given function for each key/value pair in the cache. func (c *Cache[K, T]) ForEeach(f func(K, T)) { c.RLock() @@ -81,6 +125,7 @@ func (c *Cache[K, T]) Drain() map[K]T { c.Lock() m := c.m c.m = make(map[K]T) + c.hasBeenInitialized = false c.Unlock() return m } @@ -94,6 +139,7 @@ func (c *Cache[K, T]) Len() int { func (c *Cache[K, T]) Reset() { c.Lock() c.m = make(map[K]T) + c.hasBeenInitialized = false c.Unlock() } diff --git a/hugolib/content_map_page.go b/hugolib/content_map_page.go index 5e8646b21..8c9e4a31a 100644 --- a/hugolib/content_map_page.go +++ b/hugolib/content_map_page.go @@ -37,7 +37,6 @@ import ( "github.com/gohugoio/hugo/hugolib/doctree" "github.com/gohugoio/hugo/hugolib/pagesfromdata" "github.com/gohugoio/hugo/identity" - "github.com/gohugoio/hugo/lazy" "github.com/gohugoio/hugo/media" "github.com/gohugoio/hugo/output" "github.com/gohugoio/hugo/resources" @@ -925,59 +924,58 @@ func newPageMap(i int, s *Site, mcache *dynacache.Cache, pageTrees *pageTrees) * s: s, } - m.pageReverseIndex = &contentTreeReverseIndex{ - initFn: func(rm map[any]contentNodeI) { - add := func(k string, n contentNodeI) { - existing, found := rm[k] - if found && existing != ambiguousContentNode { - rm[k] = ambiguousContentNode - } else if !found { - rm[k] = n + m.pageReverseIndex = newContentTreeTreverseIndex(func(get func(key any) (contentNodeI, bool), set func(key any, val contentNodeI)) { + add := func(k string, n contentNodeI) { + existing, found := get(k) + if found && existing != ambiguousContentNode { + set(k, ambiguousContentNode) + } else if !found { + set(k, n) + } + } + + w := &doctree.NodeShiftTreeWalker[contentNodeI]{ + Tree: m.treePages, + LockType: doctree.LockTypeRead, + Handle: func(s string, n contentNodeI, match doctree.DimensionFlag) (bool, error) { + p := n.(*pageState) + if p.PathInfo() != nil { + add(p.PathInfo().BaseNameNoIdentifier(), p) } - } + return false, nil + }, + } - w := &doctree.NodeShiftTreeWalker[contentNodeI]{ - Tree: m.treePages, - LockType: doctree.LockTypeRead, - Handle: func(s string, n contentNodeI, match doctree.DimensionFlag) (bool, error) { - p := n.(*pageState) - if p.PathInfo() != nil { - add(p.PathInfo().BaseNameNoIdentifier(), p) - } - return false, nil - }, - } - - if err := w.Walk(context.Background()); err != nil { - panic(err) - } - }, - contentTreeReverseIndexMap: &contentTreeReverseIndexMap{}, - } + if err := w.Walk(context.Background()); err != nil { + panic(err) + } + }) return m } +func newContentTreeTreverseIndex(init func(get func(key any) (contentNodeI, bool), set func(key any, val contentNodeI))) *contentTreeReverseIndex { + return &contentTreeReverseIndex{ + initFn: init, + mm: maps.NewCache[any, contentNodeI](), + } +} + type contentTreeReverseIndex struct { - initFn func(rm map[any]contentNodeI) - *contentTreeReverseIndexMap + initFn func(get func(key any) (contentNodeI, bool), set func(key any, val contentNodeI)) + mm *maps.Cache[any, contentNodeI] } func (c *contentTreeReverseIndex) Reset() { - c.init.ResetWithLock().Unlock() + c.mm.Reset() } func (c *contentTreeReverseIndex) Get(key any) contentNodeI { - c.init.Do(func() { - c.m = make(map[any]contentNodeI) - c.initFn(c.contentTreeReverseIndexMap.m) + v, _ := c.mm.InitAndGet(key, func(get func(key any) (contentNodeI, bool), set func(key any, val contentNodeI)) error { + c.initFn(get, set) + return nil }) - return c.m[key] -} - -type contentTreeReverseIndexMap struct { - init lazy.OnceMore - m map[any]contentNodeI + return v } type sitePagesAssembler struct { diff --git a/hugolib/content_map_test.go b/hugolib/content_map_test.go index bf9920071..a9f719f4a 100644 --- a/hugolib/content_map_test.go +++ b/hugolib/content_map_test.go @@ -17,9 +17,11 @@ import ( "fmt" "path/filepath" "strings" + "sync" "testing" qt "github.com/frankban/quicktest" + "github.com/gohugoio/hugo/identity" ) func TestContentMapSite(t *testing.T) { @@ -396,3 +398,77 @@ irrelevant "https://example.org/en/sitemap.xml", ) } + +func TestContentTreeReverseIndex(t *testing.T) { + t.Parallel() + + c := qt.New(t) + + pageReverseIndex := newContentTreeTreverseIndex( + func(get func(key any) (contentNodeI, bool), set func(key any, val contentNodeI)) { + for i := 0; i < 10; i++ { + key := fmt.Sprint(i) + set(key, &testContentNode{key: key}) + } + }, + ) + + for i := 0; i < 10; i++ { + key := fmt.Sprint(i) + v := pageReverseIndex.Get(key) + c.Assert(v, qt.Not(qt.IsNil)) + c.Assert(v.Path(), qt.Equals, key) + } +} + +// Issue 13019. +func TestContentTreeReverseIndexPara(t *testing.T) { + t.Parallel() + + var wg sync.WaitGroup + + for i := 0; i < 10; i++ { + pageReverseIndex := newContentTreeTreverseIndex( + func(get func(key any) (contentNodeI, bool), set func(key any, val contentNodeI)) { + for i := 0; i < 10; i++ { + key := fmt.Sprint(i) + set(key, &testContentNode{key: key}) + } + }, + ) + + for j := 0; j < 10; j++ { + wg.Add(1) + go func(i int) { + defer wg.Done() + pageReverseIndex.Get(fmt.Sprint(i)) + }(j) + } + } +} + +type testContentNode struct { + key string +} + +func (n *testContentNode) GetIdentity() identity.Identity { + return identity.StringIdentity(n.key) +} + +func (n *testContentNode) ForEeachIdentity(cb func(id identity.Identity) bool) bool { + panic("not supported") +} + +func (n *testContentNode) Path() string { + return n.key +} + +func (n *testContentNode) isContentNodeBranch() bool { + return false +} + +func (n *testContentNode) resetBuildState() { +} + +func (n *testContentNode) MarkStale() { +} diff --git a/lazy/init.go b/lazy/init.go index bef3867a9..7b88a5351 100644 --- a/lazy/init.go +++ b/lazy/init.go @@ -36,7 +36,7 @@ type Init struct { prev *Init children []*Init - init OnceMore + init onceMore out any err error f func(context.Context) (any, error) diff --git a/lazy/once.go b/lazy/once.go index dac689df3..cea096652 100644 --- a/lazy/once.go +++ b/lazy/once.go @@ -24,13 +24,13 @@ import ( // * it can be reset, so the action can be repeated if needed // * it has methods to check if it's done or in progress -type OnceMore struct { +type onceMore struct { mu sync.Mutex lock uint32 done uint32 } -func (t *OnceMore) Do(f func()) { +func (t *onceMore) Do(f func()) { if atomic.LoadUint32(&t.done) == 1 { return } @@ -53,15 +53,15 @@ func (t *OnceMore) Do(f func()) { f() } -func (t *OnceMore) InProgress() bool { +func (t *onceMore) InProgress() bool { return atomic.LoadUint32(&t.lock) == 1 } -func (t *OnceMore) Done() bool { +func (t *onceMore) Done() bool { return atomic.LoadUint32(&t.done) == 1 } -func (t *OnceMore) ResetWithLock() *sync.Mutex { +func (t *onceMore) ResetWithLock() *sync.Mutex { t.mu.Lock() defer atomic.StoreUint32(&t.done, 0) return &t.mu From ad82998d54b3f9f8c2741b67356813b55b3134b9 Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Wed, 6 Nov 2024 11:22:34 +0000 Subject: [PATCH 096/526] releaser: Bump versions for release of 0.138.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 b265b6983..eb754f581 100644 --- a/common/hugo/version_current.go +++ b/common/hugo/version_current.go @@ -19,5 +19,5 @@ var CurrentVersion = Version{ Major: 0, Minor: 138, PatchLevel: 0, - Suffix: "-DEV", + Suffix: "", } From 35afe6fe2ab6b29f4cc1a538ff245ee66b067dd8 Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Wed, 6 Nov 2024 11:36:12 +0000 Subject: [PATCH 097/526] releaser: Prepare repository for 0.139.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 eb754f581..955c2f91a 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: 138, + Minor: 139, PatchLevel: 0, - Suffix: "", + Suffix: "-DEV", } diff --git a/hugoreleaser.env b/hugoreleaser.env index 4bebe0e2a..d44c55d03 100644 --- a/hugoreleaser.env +++ b/hugoreleaser.env @@ -1,7 +1,8 @@ # Release env. # These will be replaced by script before release. -HUGORELEASER_TAG=v0.137.1 -HUGORELEASER_COMMITISH=17e15b2148cee6da923acd7adf2ec31ea6b3415c +HUGORELEASER_TAG=v0.138.0 +HUGORELEASER_COMMITISH=ad82998d54b3f9f8c2741b67356813b55b3134b9 + From 2b97a2a8bf2dbb9c8277b14f7f7bf824b5a58516 Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Thu, 7 Nov 2024 12:19:59 -0800 Subject: [PATCH 098/526] markup/goldmark: Improve the raw HTML omitted warning Closes #13023 --- markup/goldmark/goldmark_integration_test.go | 4 ++-- markup/goldmark/hugocontext/hugocontext.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/markup/goldmark/goldmark_integration_test.go b/markup/goldmark/goldmark_integration_test.go index 82579069b..17b76360d 100644 --- a/markup/goldmark/goldmark_integration_test.go +++ b/markup/goldmark/goldmark_integration_test.go @@ -821,7 +821,7 @@ title: "p1" b := hugolib.Test(t, files, hugolib.TestOptWarn()) b.AssertFileContent("public/p1/index.html", "") - b.AssertLogContains("WARN Raw HTML omitted from \"/content/p1.md\"; see https://gohugo.io/getting-started/configuration-markup/#rendererunsafe\nYou can suppress this warning by adding the following to your site configuration:\nignoreLogs = ['warning-goldmark-raw-html']") + b.AssertLogContains("WARN Raw HTML omitted white rendering \"/content/p1.md\"; see https://gohugo.io/getting-started/configuration-markup/#rendererunsafe\nYou can suppress this warning by adding the following to your site configuration:\nignoreLogs = ['warning-goldmark-raw-html']") b = hugolib.Test(t, strings.ReplaceAll(files, "markup.goldmark.renderer.unsafe = false", "markup.goldmark.renderer.unsafe = true"), hugolib.TestOptWarn()) b.AssertFileContent("public/p1/index.html", "! ") @@ -845,7 +845,7 @@ title: "p1" b := hugolib.Test(t, files, hugolib.TestOptWarn()) b.AssertFileContent("public/p1/index.html", "") - b.AssertLogContains("WARN Raw HTML omitted from \"/content/p1.md\"; see https://gohugo.io/getting-started/configuration-markup/#rendererunsafe\nYou can suppress this warning by adding the following to your site configuration:\nignoreLogs = ['warning-goldmark-raw-html']") + b.AssertLogContains("WARN Raw HTML omitted white rendering \"/content/p1.md\"; see https://gohugo.io/getting-started/configuration-markup/#rendererunsafe\nYou can suppress this warning by adding the following to your site configuration:\nignoreLogs = ['warning-goldmark-raw-html']") b = hugolib.Test(t, strings.ReplaceAll(files, "markup.goldmark.renderer.unsafe = false", "markup.goldmark.renderer.unsafe = true"), hugolib.TestOptWarn()) b.AssertFileContent("public/p1/index.html", "! ") diff --git a/markup/goldmark/hugocontext/hugocontext.go b/markup/goldmark/hugocontext/hugocontext.go index a10e095ef..4098392c4 100644 --- a/markup/goldmark/hugocontext/hugocontext.go +++ b/markup/goldmark/hugocontext/hugocontext.go @@ -157,7 +157,7 @@ func (r *hugoContextRenderer) stripHugoCtx(b []byte) ([]byte, bool) { } func (r *hugoContextRenderer) logRawHTMLEmittedWarn(w util.BufWriter) { - r.logger.Warnidf(constants.WarnGoldmarkRawHTML, "Raw HTML omitted from %q; see https://gohugo.io/getting-started/configuration-markup/#rendererunsafe", r.getPage(w)) + r.logger.Warnidf(constants.WarnGoldmarkRawHTML, "Raw HTML omitted white rendering %q; see https://gohugo.io/getting-started/configuration-markup/#rendererunsafe", r.getPage(w)) } func (r *hugoContextRenderer) getPage(w util.BufWriter) any { From e79ee0d5167707d891c80906e71daa098c9e46af Mon Sep 17 00:00:00 2001 From: Andreas Deininger Date: Wed, 13 Nov 2024 10:12:26 +0100 Subject: [PATCH 099/526] markup/goldmark: Fix typo in error message --- markup/goldmark/goldmark_integration_test.go | 4 ++-- markup/goldmark/hugocontext/hugocontext.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/markup/goldmark/goldmark_integration_test.go b/markup/goldmark/goldmark_integration_test.go index 17b76360d..794f34150 100644 --- a/markup/goldmark/goldmark_integration_test.go +++ b/markup/goldmark/goldmark_integration_test.go @@ -821,7 +821,7 @@ title: "p1" b := hugolib.Test(t, files, hugolib.TestOptWarn()) b.AssertFileContent("public/p1/index.html", "") - b.AssertLogContains("WARN Raw HTML omitted white rendering \"/content/p1.md\"; see https://gohugo.io/getting-started/configuration-markup/#rendererunsafe\nYou can suppress this warning by adding the following to your site configuration:\nignoreLogs = ['warning-goldmark-raw-html']") + b.AssertLogContains("WARN Raw HTML omitted while rendering \"/content/p1.md\"; see https://gohugo.io/getting-started/configuration-markup/#rendererunsafe\nYou can suppress this warning by adding the following to your site configuration:\nignoreLogs = ['warning-goldmark-raw-html']") b = hugolib.Test(t, strings.ReplaceAll(files, "markup.goldmark.renderer.unsafe = false", "markup.goldmark.renderer.unsafe = true"), hugolib.TestOptWarn()) b.AssertFileContent("public/p1/index.html", "! ") @@ -845,7 +845,7 @@ title: "p1" b := hugolib.Test(t, files, hugolib.TestOptWarn()) b.AssertFileContent("public/p1/index.html", "") - b.AssertLogContains("WARN Raw HTML omitted white rendering \"/content/p1.md\"; see https://gohugo.io/getting-started/configuration-markup/#rendererunsafe\nYou can suppress this warning by adding the following to your site configuration:\nignoreLogs = ['warning-goldmark-raw-html']") + b.AssertLogContains("WARN Raw HTML omitted while rendering \"/content/p1.md\"; see https://gohugo.io/getting-started/configuration-markup/#rendererunsafe\nYou can suppress this warning by adding the following to your site configuration:\nignoreLogs = ['warning-goldmark-raw-html']") b = hugolib.Test(t, strings.ReplaceAll(files, "markup.goldmark.renderer.unsafe = false", "markup.goldmark.renderer.unsafe = true"), hugolib.TestOptWarn()) b.AssertFileContent("public/p1/index.html", "! ") diff --git a/markup/goldmark/hugocontext/hugocontext.go b/markup/goldmark/hugocontext/hugocontext.go index 4098392c4..b1f149d0b 100644 --- a/markup/goldmark/hugocontext/hugocontext.go +++ b/markup/goldmark/hugocontext/hugocontext.go @@ -157,7 +157,7 @@ func (r *hugoContextRenderer) stripHugoCtx(b []byte) ([]byte, bool) { } func (r *hugoContextRenderer) logRawHTMLEmittedWarn(w util.BufWriter) { - r.logger.Warnidf(constants.WarnGoldmarkRawHTML, "Raw HTML omitted white rendering %q; see https://gohugo.io/getting-started/configuration-markup/#rendererunsafe", r.getPage(w)) + r.logger.Warnidf(constants.WarnGoldmarkRawHTML, "Raw HTML omitted while rendering %q; see https://gohugo.io/getting-started/configuration-markup/#rendererunsafe", r.getPage(w)) } func (r *hugoContextRenderer) getPage(w util.BufWriter) any { From de0df119b504a91c9e1f442b07954f366ffb2932 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Wed, 13 Nov 2024 11:07:57 +0100 Subject: [PATCH 100/526] Squashed 'docs/' changes from ccb1b97cb..159c843fd 159c843fd Fix front matter menu entry example c3a476a19 Document soft deprecation of PAGE.Scratch cdead9785 netlify: Hugo 0.138.0 9169b4da4 Update version references 3bc6bf431 Update embedded.md 5c7743b2e Update creation instructions for the emoji quick reference 109efe3eb Document the comment shortcode 83d7d3005 Update theme d3c205054 netlify: Hugo 0.137.1 545290351 Handle inline HTML content 0204be97d Update theme 18d09235e Remove JS and CSS that prevents FOUC with client side math rendering 63d9dd876 Update RenderShortcodes.md 064b95539 Update output-format-definition.md 3744f3be2 Describe and refer to the extended/deploy edition 3d3302308 netlify: Hugo 0.137.0 b53aedcea Update RenderShortcodes.md b5f289165 Replace HTML comments in markdown with the new comment shortcode c673880b6 Remove superfluous right bracket f80b0c61e Update faq.md 2ede707eb Document installation on NixOS 09b114914 Update theme 76a9f90b2 Update passthrough.md 9f3355630 Update Scratch.md bc080ecaa Update Store.md 1507ede32 Update Scratch.md 54a90f569 Update Store.md 7c9145c43 Fix broken link dd15f183b Update ToMath.md 2b021c34b Move the [build] documentation to its own page cbb6677ec Fix typo ac0969063 Update ToMath.md 7fbdfd7c8 netlify: Hugo 0.136.5 17f54223c Update ToMath.md 4c9c3bb06 Update multilingual.md 1432da7bd Make site and page language methods linkable fd5b746cb Update urls.md a746f1b3a Update urls.md abf8738e2 netlify: Hugo 0.136.4 bd8759996 Update TrimSpace.md 6103c1e84 Documents strings.TrimSpace 533dd3a7b netlify: Hugo 0.136.3 30f3f97cf Update quick-start.md b0d7b41a0 Update configuration-markup.md 760e5e4f0 Update quick-start.md 17daeb866 Update quick-start.md 1e158e723 netlify: Hugo 0.136.2 d32530839 Update theme edb9bee02 Update description of url front matter field e1c576e18 netlify: Hugo 0.136.1 1ad28e1e0 Describe how to configure uglyURLs per section cbbd4c4fe netlify: Hugo 0.136.0 bb7f35e99 Merge branch 'tempv0.136.0' 706110736 docs: Regen CLI docs bf0c7821f Update urls.md 8c544e6c0 Update quick-start.md 8d02733d0 Update Paginator.md a45327aac Update Paginate.md 1377ed4de Clarify date parsing e19fb8043 Document front matter date field aliases a39951847 Update Tailwind CSS installation instructions 3be164c35 Remove duplicate token 05fc815f7 commands: Add "hugo build" as an alias for "hugo" cb3cb504c Update table render hook example efbee0bff Clarify resources.GetRemote 404 handling 4312d49c9 Update compare.Conditional documentation 4a46d53b6 Update theme 93e542d4f netlify: Hugo 0.135.0 b4da1c104 Remvoe some old new-in shortcodes 4c316f051 Update TailwindCSS.md c2fe91509 Update introduction.md 906b7c66b Update configuration.md 5ab6b3cdd Update documentation.md 26fb4bb4c Update documentation.md e9e917f37 Update version refs 83ce07f24 netlify: Hugo 0.134.3 8cb32f802 Update front-matter.md 94d7f576a Update faq.md fafc1d8d9 netlify: Hugo 0.134.2 bfe9cdc3d Update content-adapters.md 9e49ae3e1 Document ignoreLogs configuration setting 6b47a1d57 Update configuration.md fd98a0372 Document CLI options that can be set in configuration 07c2400d8 Document alternative to Summary method d053fa163 Update to reflect changes in v0.134.1 137dc3241 Update ContentWithoutSummary.md e8f6427d9 netlify: Hugo 0.134.1 git-subtree-dir: docs git-subtree-split: 159c843fd79e94a0f49bee74c272cd0cc4a848a2 --- .cspell.json | 4 + README.md | 4 +- .../gohugoioTheme/assets/css/_font-family.css | 8 +- .../assets/images/sponsors/goland.svg | 20 + .../gohugoioTheme/assets/output/css/app.css | 8 +- .../gohugoio/gohugoioTheme/data/sponsors.toml | 12 +- .../layouts/_default/baseof.html | 4 +- .../partials/home-page-sections/sponsors.html | 2 +- .../gohugoioTheme/layouts/partials/math.html | 11 +- .../layouts/partials/social-follow.html | 6 - .../layouts/shortcodes/gomodules-info.html | 2 +- .../shortcodes/module-mounts-note.html | 2 +- _vendor/modules.txt | 2 +- content/en/commands/hugo.md | 25 +- content/en/commands/hugo_build.md | 74 ++++ content/en/commands/hugo_completion.md | 2 +- content/en/commands/hugo_config.md | 6 +- content/en/commands/hugo_config_mounts.md | 2 +- content/en/commands/hugo_convert.md | 6 +- content/en/commands/hugo_convert_toJSON.md | 2 +- content/en/commands/hugo_convert_toTOML.md | 2 +- content/en/commands/hugo_convert_toYAML.md | 2 +- content/en/commands/hugo_deploy.md | 6 +- content/en/commands/hugo_env.md | 6 +- content/en/commands/hugo_gen.md | 8 +- content/en/commands/hugo_gen_chromastyles.md | 2 +- content/en/commands/hugo_gen_doc.md | 2 +- content/en/commands/hugo_gen_man.md | 2 +- content/en/commands/hugo_import.md | 6 +- content/en/commands/hugo_import_jekyll.md | 2 +- content/en/commands/hugo_list.md | 6 +- content/en/commands/hugo_list_all.md | 2 +- content/en/commands/hugo_list_drafts.md | 2 +- content/en/commands/hugo_list_expired.md | 2 +- content/en/commands/hugo_list_future.md | 2 +- content/en/commands/hugo_list_published.md | 2 +- content/en/commands/hugo_mod.md | 4 +- content/en/commands/hugo_mod_clean.md | 2 +- content/en/commands/hugo_mod_get.md | 2 +- content/en/commands/hugo_mod_graph.md | 2 +- content/en/commands/hugo_mod_init.md | 2 +- content/en/commands/hugo_mod_npm.md | 2 +- content/en/commands/hugo_mod_tidy.md | 2 +- content/en/commands/hugo_mod_vendor.md | 2 +- content/en/commands/hugo_mod_verify.md | 2 +- content/en/commands/hugo_new.md | 6 +- content/en/commands/hugo_new_content.md | 4 +- content/en/commands/hugo_new_site.md | 2 +- content/en/commands/hugo_new_theme.md | 2 +- content/en/commands/hugo_server.md | 4 +- content/en/commands/hugo_server_trust.md | 2 +- content/en/commands/hugo_version.md | 6 +- .../en/content-management/content-adapters.md | 4 + content/en/content-management/formats.md | 2 +- content/en/content-management/front-matter.md | 45 ++- .../image-processing/index.md | 2 - content/en/content-management/menus.md | 2 +- content/en/content-management/multilingual.md | 2 +- content/en/content-management/shortcodes.md | 20 + content/en/content-management/summaries.md | 66 +-- content/en/content-management/urls.md | 61 ++- content/en/contribute/development.md | 20 +- content/en/contribute/documentation.md | 24 +- content/en/functions/compare/Conditional.md | 13 +- content/en/functions/css/Sass.md | 12 +- content/en/functions/css/TailwindCSS.md | 7 +- content/en/functions/hugo/Generator.md | 2 +- content/en/functions/hugo/Version.md | 2 +- content/en/functions/resources/Babel.md | 4 +- content/en/functions/resources/FromString.md | 2 +- content/en/functions/resources/GetRemote.md | 4 + content/en/functions/resources/PostCSS.md | 4 +- content/en/functions/resources/ToCSS.md | 16 +- content/en/functions/strings/Chomp.md | 9 +- .../en/functions/strings/ContainsNonSpace.md | 16 +- content/en/functions/strings/Trim.md | 39 +- content/en/functions/strings/TrimLeft.md | 1 + content/en/functions/strings/TrimPrefix.md | 1 + content/en/functions/strings/TrimRight.md | 1 + content/en/functions/strings/TrimSpace.md | 26 ++ content/en/functions/strings/TrimSuffix.md | 1 + content/en/functions/time/AsTime.md | 31 +- content/en/functions/time/Format.md | 18 +- .../_common/parsable-date-time-strings.md | 16 +- content/en/functions/transform/ToMath.md | 6 +- .../en/getting-started/configuration-build.md | 88 ++++ .../getting-started/configuration-markup.md | 2 +- content/en/getting-started/configuration.md | 154 ++++--- content/en/getting-started/glossary.md | 2 +- content/en/getting-started/quick-start.md | 4 +- .../hosting-on-github/index.md | 2 +- .../hosting-on-gitlab.md | 4 +- .../hosting-on-netlify/index.md | 6 +- .../en/hosting-and-deployment/hugo-deploy.md | 9 +- .../en/hugo-pipes/transpile-sass-to-css.md | 12 +- .../en/installation/_common/01-editions.md | 14 +- .../_common/04-build-from-source.md | 17 +- content/en/installation/bsd.md | 5 + content/en/installation/linux.md | 13 + content/en/installation/macos.md | 5 + content/en/installation/windows.md | 4 + .../en/methods/page/ContentWithoutSummary.md | 2 +- content/en/methods/page/Language.md | 25 +- content/en/methods/page/Paginate.md | 2 +- content/en/methods/page/Paginator.md | 2 +- content/en/methods/page/RenderShortcodes.md | 17 +- content/en/methods/page/Scratch.md | 14 +- content/en/methods/page/Store.md | 8 +- content/en/methods/page/Summary.md | 34 +- content/en/methods/page/Truncated.md | 16 +- .../page/_common/output-format-definition.md | 1 - content/en/methods/resource/Colors.md | 2 - content/en/methods/shortcode/Inner.md | 14 +- content/en/methods/shortcode/InnerDeindent.md | 4 +- content/en/methods/shortcode/Parent.md | 2 +- content/en/methods/site/Language.md | 25 +- content/en/methods/site/Taxonomies.md | 7 +- content/en/quick-reference/emojis.md | 79 ++-- content/en/render-hooks/passthrough.md | 2 +- content/en/render-hooks/tables.md | 12 +- content/en/templates/embedded.md | 2 +- content/en/templates/introduction.md | 6 +- content/en/troubleshooting/faq.md | 14 +- data/embedded_template_urls.toml | 1 + go.mod | 2 +- go.sum | 20 +- layouts/shortcodes/img.html | 381 ------------------ netlify.toml | 2 +- 128 files changed, 893 insertions(+), 925 deletions(-) create mode 100644 _vendor/github.com/gohugoio/gohugoioTheme/assets/images/sponsors/goland.svg create mode 100644 content/en/commands/hugo_build.md create mode 100644 content/en/functions/strings/TrimSpace.md create mode 100644 content/en/getting-started/configuration-build.md delete mode 100644 layouts/shortcodes/img.html diff --git a/.cspell.json b/.cspell.json index 01d248e25..6596a160c 100644 --- a/.cspell.json +++ b/.cspell.json @@ -85,6 +85,7 @@ "stringifier", "struct", "toclevels", + "unpublishdate", "zgotmplz", "# ----------------------------------------------------------------------", "# cspell: ignore foreign language words", @@ -129,6 +130,7 @@ "Samsa", "Stucki", "Thénardier", + "WASI", "# ----------------------------------------------------------------------", "# cspell: ignore operating systems and software packages", "# ----------------------------------------------------------------------", @@ -158,10 +160,12 @@ "achristie", "ddmaurier", "dring", + "fleqn", "inor", "jausten", "jdoe", "jsmith", + "leqno", "milli", "rgba", "rsmith", diff --git a/README.md b/README.md index 93eaaf02e..7550a93cd 100644 --- a/README.md +++ b/README.md @@ -7,12 +7,10 @@ A fast and flexible static site generator built with love by [bep], [spf13], and [![Netlify Status](https://api.netlify.com/api/v1/badges/e0dbbfc7-34f1-4393-a679-c16e80162705/deploy-status)](https://app.netlify.com/sites/gohugoio/deploys) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](https://gohugo.io/contribute/documentation/) -This is the repository for the [Hugo](https://github.com/gohugoio/hugo) documentation site. +This is the repository for the [Hugo](https://github.com/gohugoio/hugo) documentation site. Please see the [contributing] section for guidelines, examples, and process. - - [bep]: https://github.com/bep [spf13]: https://github.com/spf13 [friends]: https://github.com/gohugoio/hugo/graphs/contributors diff --git a/_vendor/github.com/gohugoio/gohugoioTheme/assets/css/_font-family.css b/_vendor/github.com/gohugoio/gohugoioTheme/assets/css/_font-family.css index 440b5efdd..85b3b6c95 100644 --- a/_vendor/github.com/gohugoio/gohugoioTheme/assets/css/_font-family.css +++ b/_vendor/github.com/gohugoio/gohugoioTheme/assets/css/_font-family.css @@ -4,13 +4,7 @@ code, .code, pre code, .highlight pre { } .sans-serif { - font-family: 'Muli', - avenir, - 'helvetica neue', helvetica, - ubuntu, - roboto, noto, - 'segoe ui', arial, - sans-serif; + font-family: 'Muli', Avenir, 'Helvetica Neue', Helvetica, Roboto, Noto, 'Segoe UI', Arial, sans-serif; } diff --git a/_vendor/github.com/gohugoio/gohugoioTheme/assets/images/sponsors/goland.svg b/_vendor/github.com/gohugoio/gohugoioTheme/assets/images/sponsors/goland.svg new file mode 100644 index 000000000..ff3bde8bf --- /dev/null +++ b/_vendor/github.com/gohugoio/gohugoioTheme/assets/images/sponsors/goland.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/_vendor/github.com/gohugoio/gohugoioTheme/assets/output/css/app.css b/_vendor/github.com/gohugoio/gohugoioTheme/assets/output/css/app.css index 5e0b0c708..b9518491c 100644 --- a/_vendor/github.com/gohugoio/gohugoioTheme/assets/output/css/app.css +++ b/_vendor/github.com/gohugoio/gohugoioTheme/assets/output/css/app.css @@ -5002,13 +5002,7 @@ code, .code, pre code, .highlight pre { font-family: 'inconsolata',Menlo,Monaco,'Courier New',monospace; } .sans-serif { - font-family: 'Muli', - avenir, - 'helvetica neue', helvetica, - ubuntu, - roboto, noto, - 'segoe ui', arial, - sans-serif; + font-family: 'Muli', Avenir, 'Helvetica Neue', Helvetica, Roboto, Noto, 'Segoe UI', Arial, sans-serif; } .serif { font-family: Palatino,"Palatino Linotype","Palatino LT STD","Book Antiqua",Georgia,serif; diff --git a/_vendor/github.com/gohugoio/gohugoioTheme/data/sponsors.toml b/_vendor/github.com/gohugoio/gohugoioTheme/data/sponsors.toml index 33d550449..ca02ecc6f 100644 --- a/_vendor/github.com/gohugoio/gohugoioTheme/data/sponsors.toml +++ b/_vendor/github.com/gohugoio/gohugoioTheme/data/sponsors.toml @@ -15,9 +15,9 @@ link_attr = "style='color: #ffffff; font-weight: bold; text-decoration: none; text-align: center'" [[banners]] - name = "Your Company?" - link = "https://bep.is/en/hugo-sponsor-2023-01/" - utm_campaign = "hugosponsor" - show_on_hover = true - bgcolor = "#4e4f4f" - link_attr = "style='color: #ffffff; font-weight: bold; text-decoration: none; text-align: center'" + name = "GoLand" + title = "The complete IDE crafted for professional Go developers." + no_query_params = true + link = "https://www.jetbrains.com/go/?utm_source=OSS&utm_medium=referral&utm_campaign=hugo" + logo = "images/sponsors/goland.svg" + bgcolor = "#f4f4f4" diff --git a/_vendor/github.com/gohugoio/gohugoioTheme/layouts/_default/baseof.html b/_vendor/github.com/gohugoio/gohugoioTheme/layouts/_default/baseof.html index beb2d8619..6992881b6 100644 --- a/_vendor/github.com/gohugoio/gohugoioTheme/layouts/_default/baseof.html +++ b/_vendor/github.com/gohugoio/gohugoioTheme/layouts/_default/baseof.html @@ -106,9 +106,7 @@ + class="ma0 sans-serif bg-primary-color-light{{ with getenv "HUGO_ENV" }} {{ . }}{{ end }}"> {{ partial "hooks/after-body-start.html" . }} {{ block "nav" . }}{{ partial "site-nav.html" . }}{{ end }} {{ block "header" . }}{{ end }} diff --git a/_vendor/github.com/gohugoio/gohugoioTheme/layouts/partials/home-page-sections/sponsors.html b/_vendor/github.com/gohugoio/gohugoioTheme/layouts/partials/home-page-sections/sponsors.html index 84033c42c..751ee8894 100644 --- a/_vendor/github.com/gohugoio/gohugoioTheme/layouts/partials/home-page-sections/sponsors.html +++ b/_vendor/github.com/gohugoio/gohugoioTheme/layouts/partials/home-page-sections/sponsors.html @@ -25,7 +25,7 @@ {{ $query_params := .query_params | default "" }} {{ $url := .link }} {{ if not .no_query_params }} - {{ $url = printf "%s?%s%s" .link $query_params (querify "utm_source" (.utm_source | default $utmSource ) "utm_medium" "banner" "utm_campaign" (.utm_campaign | default "hugosponsor") "utm_content" (.utm_content | default "gohugoio")) | safeURL }} + {{ $url = printf "%s?%s%s" .link $query_params (querify "utm_source" (.utm_source | default $utmSource ) "utm_medium" (.utm_medium | default "banner") "utm_campaign" (.utm_campaign | default "hugosponsor") "utm_content" (.utm_content | default "gohugoio")) | safeURL }} {{ end }} {{ $logo := resources.Get .logo }} {{ $gtagID := printf "Sponsor %s %s" .name $gtag | title }} diff --git a/_vendor/github.com/gohugoio/gohugoioTheme/layouts/partials/math.html b/_vendor/github.com/gohugoio/gohugoioTheme/layouts/partials/math.html index b1eb5c8db..defcaa055 100644 --- a/_vendor/github.com/gohugoio/gohugoioTheme/layouts/partials/math.html +++ b/_vendor/github.com/gohugoio/gohugoioTheme/layouts/partials/math.html @@ -2,15 +2,8 @@ diff --git a/_vendor/github.com/gohugoio/gohugoioTheme/layouts/partials/social-follow.html b/_vendor/github.com/gohugoio/gohugoioTheme/layouts/partials/social-follow.html index 7451c15d6..243b22ccb 100644 --- a/_vendor/github.com/gohugoio/gohugoioTheme/layouts/partials/social-follow.html +++ b/_vendor/github.com/gohugoio/gohugoioTheme/layouts/partials/social-follow.html @@ -1,9 +1,3 @@ - }} +{{% note %}} +Note that the `Site` returned isn't fully built when invoked from the content adapters; if you try to call methods that depends on pages, e.g. `.Site.Pages`, you will get an error saying "this method cannot be called before the site is fully initialized". +{{% /note %}} + ###### Store Returns a persistent “scratch pad” to store and manipulate data. The main use case for this is to transfer values between executions when [EnableAllLanguages](#enablealllanguages) is set. See [examples](/methods/page/store/). diff --git a/content/en/content-management/formats.md b/content/en/content-management/formats.md index e96bc5af3..1132c888c 100644 --- a/content/en/content-management/formats.md +++ b/content/en/content-management/formats.md @@ -59,7 +59,7 @@ Create your content in [HTML] preceded by front matter. The content is typically ### Emacs Org Mode -Create your content in the [Emacs Org Mode] format preceded by front matter. You can use Org Mode keywords for front matter. See [details](/content-management/front-matter/#emacs-org-mode)). +Create your content in the [Emacs Org Mode] format preceded by front matter. You can use Org Mode keywords for front matter. See [details](/content-management/front-matter/#emacs-org-mode). ### AsciiDoc diff --git a/content/en/content-management/front-matter.md b/content/en/content-management/front-matter.md index 3ac2a63bc..5cbf645a5 100644 --- a/content/en/content-management/front-matter.md +++ b/content/en/content-management/front-matter.md @@ -39,7 +39,7 @@ weight = 10 author = 'John Smith' {{< /code-toggle >}} -Front matter fields may be [scalar], [arrays], or [maps] containing [boolean], [integer], [float], or [string] values. Note that the TOML format also supports date/time values using unquoted strings. +Front matter fields may be [boolean], [integer], [float], [string], [arrays], or [maps]. Note that the TOML format also supports unquoted date/time values. [scalar]: /getting-started/glossary/#scalar [arrays]: /getting-started/glossary/#array @@ -80,7 +80,8 @@ The field names below are reserved. For example, you cannot create a custom fiel ###### date -(`string`) The date associated with the page, typically the creation date. Note that the TOML format also supports date/time values using unquoted strings. Access this value from a template using the [`Date`] method on a `Page` object. +(`string`) The date associated with the page, typically the creation date. Note that the TOML format also supports unquoted date/time values. See the [dates](#dates) section for examples. Access this value from a template using the [`Date`] method on a `Page` object. + [`date`]: /methods/page/date/ @@ -99,7 +100,7 @@ If `true`, the page will not be rendered unless you pass the `--buildDrafts` fla ###### expiryDate -(`string`) The page expiration date. On or after the expiration date, the page will not be rendered unless you pass the `--buildExpired` flag to the `hugo` command. Note that the TOML format also supports date/time values using unquoted strings. Access this value from a template using the [`ExpiryDate`] method on a `Page` object. +(`string`) The page expiration date. On or after the expiration date, the page will not be rendered unless you pass the `--buildExpired` flag to the `hugo` command. Note that the TOML format also supports unquoted date/time values. See the [dates](#dates) section for examples. Access this value from a template using the [`ExpiryDate`] method on a `Page` object. [`expirydate`]: /methods/page/expirydate/ @@ -127,6 +128,7 @@ If `true`, the page will not be rendered unless you pass the `--buildDrafts` fla [`keywords`]: /methods/page/keywords/ [taxonomy]: /getting-started/glossary/#taxonomy +{{% comment %}} +{{% /comment %}} ###### lastmod -(`string`) The date that the page was last modified. Note that the TOML format also supports date/time values using unquoted strings. Access this value from a template using the [`Lastmod`] method on a `Page` object. +(`string`) The date that the page was last modified. Note that the TOML format also supports unquoted date/time values. See the [dates](#dates) section for examples. Access this value from a template using the [`Lastmod`] method on a `Page` object. [`lastmod`]: /methods/page/date/ @@ -167,21 +170,27 @@ lang ###### menus -(`string`,`string array`, or `map`) If set, Hugo adds the page to the given menu or menus. See the [menus] page for details. +(`string`, `string array`, or `map`) If set, Hugo adds the page to the given menu or menus. See the [menus] page for details. [menus]: /content-management/menus/#define-in-front-matter +###### modified + +Alias to [lastmod](#lastmod). + ###### outputs (`string array`) The [output formats] to render. [output formats]: /templates/output-formats/ +{{% comment %}} +{{% /comment %}} ###### params @@ -191,12 +200,20 @@ path [page parameters]: #parameters +###### pubdate + +Alias to [publishDate](#publishdate). + ###### publishDate -(`string`) The page publication date. Before the publication date, the page will not be rendered unless you pass the `--buildFuture` flag to the `hugo` command. Note that the TOML format also supports date/time values using unquoted strings. Access this value from a template using the [`PublishDate`] method on a `Page` object. +(`string`) The page publication date. Before the publication date, the page will not be rendered unless you pass the `--buildFuture` flag to the `hugo` command. Note that the TOML format also supports unquoted date/time values. See the [dates](#dates) section for examples. Access this value from a template using the [`PublishDate`] method on a `Page` object. [`publishdate`]: /methods/page/publishdate/ +###### published + +Alias to [publishDate](#publishdate). + ###### resources (`map array`) An array of maps to provide metadata for [page resources]. @@ -242,6 +259,10 @@ path [content type]: /getting-started/glossary/#content-type [`type`]: /methods/page/type/ +###### unpublishdate + +Alias to [expirydate](#expirydate). + ###### url (`string`) Overrides the entire URL path. Applicable to regular pages and section pages. See the [URL management] page for details. @@ -428,3 +449,15 @@ Note that you can also specify array elements on a single line: [content format]: /content-management/formats/ [emacs org mode]: https://orgmode.org/ + +## Dates + +When populating a date field, whether a [custom page parameter](#parameters) or one of the four predefined fields ([`date`](#date), [`expiryDate`](#expirydate), [`lastmod`](#lastmod), [`publishDate`](#publishdate)), use one of these parsable formats: + +{{% include "functions/time/_common/parsable-date-time-strings.md" %}} + +To override the default time zone, set the [`timeZone`](https://gohugo.io/getting-started/configuration/#timezone) in your site configuration. The order of precedence for determining the time zone is: + +1. The time zone offset in the date/time string +2. The time zone specified in your site configuration +3. The `Etc/UTC` time zone diff --git a/content/en/content-management/image-processing/index.md b/content/en/content-management/image-processing/index.md index db786361c..841f12863 100644 --- a/content/en/content-management/image-processing/index.md +++ b/content/en/content-management/image-processing/index.md @@ -205,8 +205,6 @@ Sometimes it can be useful to create the filter chain once and then reuse it. ### Colors -{{< new-in 0.104.0 >}} - `.Colors` returns a slice of hex strings with the dominant colors in the image using a simple histogram method. ```go-html-template diff --git a/content/en/content-management/menus.md b/content/en/content-management/menus.md index 169b6eb05..ff2011d3d 100644 --- a/content/en/content-management/menus.md +++ b/content/en/content-management/menus.md @@ -100,7 +100,7 @@ This front matter menu entry demonstrates some of the available properties: {{< code-toggle file=content/products/software.md fm=true >}} title = 'Software' -[[menus.main]] +[menus.main] parent = 'Products' weight = 20 pre = '' diff --git a/content/en/content-management/multilingual.md b/content/en/content-management/multilingual.md index b8ba80dfd..165b2402e 100644 --- a/content/en/content-management/multilingual.md +++ b/content/en/content-management/multilingual.md @@ -136,7 +136,7 @@ In the example above, all settings except `color` below `params` map to predefin ```go-html-template {{ site.Title }} -{{ site.LanguageCode }} +{{ site.Language.LanguageCode }} {{ site.Params.color }} ``` diff --git a/content/en/content-management/shortcodes.md b/content/en/content-management/shortcodes.md index 847ba2bbb..8e345f2fb 100644 --- a/content/en/content-management/shortcodes.md +++ b/content/en/content-management/shortcodes.md @@ -74,6 +74,26 @@ You can call shortcodes within other shortcodes by creating your own templates t Use these embedded shortcodes as needed. +### comment + +{{< new-in "0.137.1" >}} + +{{% note %}} +To override Hugo's embedded `comment` shortcode, copy the [source code] to a file with the same name in the layouts/shortcodes directory. + +[source code]: {{% eturl comment %}} +{{% /note %}} + +Use the `comment` shortcode to include comments in your Markdown. Hugo excludes the encapsulated text when rendering your site. + +Example usage: + +```text +{{%/* comment */%}} TODO: rewrite the paragraph below. {{%/* /comment */%}} +``` + +Although you can call this shortcode using the `{{}}` notation, computationally it is more efficient to call it using the `{{%/* */%}}` notation as shown above. + ### figure {{% note %}} diff --git a/content/en/content-management/summaries.md b/content/en/content-management/summaries.md index e0b2c9590..07c61d963 100644 --- a/content/en/content-management/summaries.md +++ b/content/en/content-management/summaries.md @@ -12,35 +12,34 @@ weight: 160 toc: true aliases: [/content/summaries/,/content-management/content-summaries/] --- - +{{% comment %}} +{{% /comment %}} -You can define a content summary manually, in front matter, or automatically. A manual content summary takes precedence over a front matter summary, and a front matter summary takes precedence over an automatic summary. +You can define a summary manually, in front matter, or automatically. A manual summary takes precedence over a front matter summary, and a front matter summary takes precedence over an automatic summary. Review the [comparison table](#comparison) below to understand the characteristics of each summary type. ## Manual summary -Use a `` divider to indicate the end of the content summary. Hugo will not render the summary divider itself. +Use a `` divider to indicate the end of the summary. Hugo will not render the summary divider itself. -{{< code file=content/sample.md >}} +{{< code file=content/example.md >}} +++ title: 'Example' date: 2024-05-26T09:10:33-07:00 +++ -Thénardier was not mistaken. The man was sitting there, and letting -Cosette get somewhat rested. +This is the first paragraph. -The inn-keeper walked round the brushwood and presented himself -abruptly to the eyes of those whom he was in search of. +This is the second paragraph. {{< /code >}} -When using the Emacs Org Mode [content format], use a `# more` divider to indicate the end of the content summary. +When using the Emacs Org Mode [content format], use a `# more` divider to indicate the end of the summary. [content format]: /content-management/formats/ @@ -48,46 +47,44 @@ When using the Emacs Org Mode [content format], use a `# more` divider to indica Use front matter to define a summary independent of content. -{{< code file=content/sample.md >}} +{{< code file=content/example.md >}} +++ title: 'Example' date: 2024-05-26T09:10:33-07:00 -summary: 'Learn more about _Les Misérables_ by Victor Hugo.' +summary: 'This summary is independent of the content.' +++ -Thénardier was not mistaken. The man was sitting there, and letting -Cosette get somewhat rested. The inn-keeper walked round the -brushwood and presented himself abruptly to the eyes of those whom -he was in search of. +This is the first paragraph. + +This is the second paragraph. {{< /code >}} ## Automatic summary -If you have not defined the summary manually or in front matter, Hugo automatically defines the summary based on the [`summaryLength`] in your site configuration. +If you do not define the summary manually or in front matter, Hugo automatically defines the summary based on the [`summaryLength`] in your site configuration. [`summaryLength`]: /getting-started/configuration/#summarylength -{{< code file=content/sample.md >}} +{{< code file=content/example.md >}} +++ title: 'Example' date: 2024-05-26T09:10:33-07:00 +++ -Thénardier was not mistaken. The man was sitting there, and letting -Cosette get somewhat rested. The inn-keeper walked round the -brushwood and presented himself abruptly to the eyes of those whom -he was in search of. +This is the first paragraph. + +This is the second paragraph. + +This is the third paragraph. {{< /code >}} -For example, with a `summaryLength` of 10, the automatic summary will be: +For example, with a `summaryLength` of 7, the automatic summary will be: -```text -Thénardier was not mistaken. The man was sitting there, and letting -Cosette get somewhat rested. +```html +

This is the first paragraph.

+

This is the second paragraph.

``` -Note that the `summaryLength` is an approximate number of words. - ## Comparison Each summary type has different characteristics: @@ -115,3 +112,18 @@ Render the summary in a template by calling the [`Summary`] method on a `Page` o {{ end }} ``` + +## Alternative + +Instead of calling the `Summary` method on a `Page` object, use the [`strings.Truncate`] function for granular control of the summary length. For example: + +[`strings.Truncate`]: /functions/strings/truncate/ + +```go-html-template +{{ range site.RegularPages }} +

{{ .LinkTitle }}

+
+ {{ .Content | strings.Truncate 42 }} +
+{{ end }} +``` diff --git a/content/en/content-management/urls.md b/content/en/content-management/urls.md index e3370f956..0f1d93c63 100644 --- a/content/en/content-management/urls.md +++ b/content/en/content-management/urls.md @@ -43,11 +43,45 @@ https://example.org/posts/my-first-post/ Set the `url` in front matter to override the entire path. Use this with either regular pages or section pages. +{{% note %}} +Hugo does not sanitize the `url` front matter field, allowing you to generate: + +- File paths that contain characters reserved by the operating system. For example, file paths on Windows may not contain any of these [reserved characters]. Hugo throws an error if a file path includes a character reserved by the current operating system. +- URLs that contain disallowed characters. For example, the less than sign (`<`) is not allowed in a URL. + +[reserved characters]: https://learn.microsoft.com/en-us/windows/win32/fileio/naming-a-file#naming-conventions +{{% /note %}} + +If you set both `slug` and `url` in front matter, the `url` value takes precedence. + +#### Include a colon + +{{< new-in 0.136.0 >}} + +If you need to include a colon in the `url` front matter field, escape it with backslash characters. Use one backslash if you wrap the string within single quotes, or use two backslashes if you wrap the string within double quotes. With YAML front matter, use a single backslash if you omit quotation marks. + +For example, with this front matter: + +{{< code-toggle file=content/example.md fm=true >}} +title: Example +url: "my\\:example" +{{< /code-toggle >}} + +The resulting URL will be: + +```text +https://example.org/my:example/ +``` + +As described above, this will fail on Windows because the colon (`:`) is a reserved character. + +#### File extensions + With this front matter: {{< code-toggle file=content/posts/post-1.md fm=true >}} title = 'My First Article' -url = '/articles/my-first-article' +url = 'articles/my-first-article' {{< /code-toggle >}} The resulting URL will be: @@ -60,7 +94,7 @@ If you include a file extension: {{< code-toggle file=content/posts/post-1.md fm=true >}} title = 'My First Article' -url = '/articles/my-first-article.html' +url = 'articles/my-first-article.html' {{< /code-toggle >}} The resulting URL will be: @@ -69,12 +103,11 @@ The resulting URL will be: https://example.org/articles/my-first-article.html ``` -In a monolingual site, a `url` value with or without a leading slash is relative to the `baseURL`. +#### Leading slashes -In a multilingual site: +With monolingual sites, `url` values with or without a leading slash are relative to the [`baseURL`]. With multilingual sites, `url` values with a leading slash are relative to the `baseURL`, and `url` values without a leading slash are relative to the `baseURL` plus the language prefix. -- A `url` value with a leading slash is relative to the `baseURL`. -- A `url` value without a leading slash is relative to the `baseURL` plus the language prefix. +[`baseURL`]: /getting-started/configuration/#baseurl Site type|Front matter `url`|Resulting URL :--|:--|:-- @@ -83,13 +116,11 @@ monolingual|`about`|`https://example.org/about/` multilingual|`/about`|`https://example.org/about/` multilingual|`about`|`https://example.org/de/about/` -If you set both `slug` and `url` in front matter, the `url` value takes precedence. - #### Permalinks tokens in front matter {{< new-in "0.131.0" >}} -You can also use [Permalinks tokens](#tokens) in the `url` front matter. This is typically used in `cascade` sections: +You can also use [tokens](#tokens) when setting the `url` value. This is typically used in `cascade` sections: {{< code-toggle file=content/foo/bar/_index.md fm=true >}} title ="Bar" @@ -246,9 +277,7 @@ public/ #### Tokens -Use these tokens when defining the URL pattern. These can both be used in the `permalinks` configuration and in the front matter [url](#permalinks-tokens-in-front-matter). - -`:filename` +Use these tokens when defining the URL pattern. You can also use these tokens when setting the [`url`](#permalinks-tokens-in-front-matter) value in front matter. `:year` : The 4-digit year as defined in the front matter `date` field. @@ -313,6 +342,14 @@ By default, Hugo produces pretty URLs. To generate ugly URLs, change your site c uglyURLs = true {{< /code-toggle >}} +You can also enable uglyURLs by section. For example, with a site that contains sections for books and films: + +{{< code-toggle file=hugo >}} +[uglyURLs] +books = true +films = false +{{< /code-toggle >}} + ### Post-processing Hugo provides two mutually exclusive configuration options to alter URLs _after_ it renders a page. diff --git a/content/en/contribute/development.md b/content/en/contribute/development.md index e4b183e93..1680d4a46 100644 --- a/content/en/contribute/development.md +++ b/content/en/contribute/development.md @@ -45,7 +45,7 @@ For a complete guide to contributing to Hugo, see the [Contribution Guide]. ## Prerequisites -To build the extended edition of Hugo from source you must: +To build the extended or extended/deploy edition from source you must: 1. Install [Git] 1. Install [Go] version 1.23.0 or later @@ -97,12 +97,26 @@ Step 4 : Make changes. Step 5 -: Compile and install: +: Compile and install. + +To compile and install the standard edition: + +```text +go install +``` + +To compile and install the extended edition: ```text CGO_ENABLED=1 go install -tags extended ``` +To compile and install the extended/deploy edition: + +```text +CGO_ENABLED=1 go install -tags extended,withdeploy +``` + Step 6 : Test your changes: @@ -158,7 +172,7 @@ CGO_ENABLED=1 go install -tags extended github.com/gohugoio/hugo@latest To build and install a specific release: ```sh -CGO_ENABLED=1 go install -tags extended github.com/gohugoio/hugo@v0.128.0 +CGO_ENABLED=1 go install -tags extended github.com/gohugoio/hugo@v0.137.1 ``` To build and install at the latest commit on the master branch: diff --git a/content/en/contribute/documentation.md b/content/en/contribute/documentation.md index 408ed505d..580d0b0e2 100644 --- a/content/en/contribute/documentation.md +++ b/content/en/contribute/documentation.md @@ -85,6 +85,24 @@ Yes → Hugo is fast. "It's an adverb, Sam. It's a lazy tool of a weak mind." (Outbreak, 1995). {{% /note %}} +#### Level 6 headings + +Level 6 headings are styled as `dt` elements. This was implemented to support a [glossary] with linkable terms. + +[glossary]: /getting-started/glossary/ + +#### Function and method descriptions + +When adding a page to the [functions] or [methods] section, begin the description with the word "Returns". With functions and methods that return a boolean value, begin the description with the phrase "Reports whether". + +For example: + +- `Returns the URL aliases as defined in front matter.` +- `Reports whether the given page is in the given section.` + +[functions]: /functions +[methods]: /methods + #### Miscellaneous Other guidelines to consider: @@ -97,12 +115,6 @@ Other guidelines to consider: - When including code samples, use short snippets that demonstrate the concept. - The Hugo user community is global; use [basic english](https://simple.wikipedia.org/wiki/Basic_English) when possible. -#### Level 6 headings - -Level 6 headings are styled as `dt` elements. This was implemented to support a [glossary] with linkable terms. - -[glossary]: /getting-started/glossary/ - ## Code examples Indent code by two spaces. With examples of template code, include a space after opening action delimiters, and include a space before closing action delimiters. diff --git a/content/en/functions/compare/Conditional.md b/content/en/functions/compare/Conditional.md index 6d693770d..997b71e94 100644 --- a/content/en/functions/compare/Conditional.md +++ b/content/en/functions/compare/Conditional.md @@ -12,26 +12,17 @@ action: aliases: [/functions/cond] --- -The CONTROL argument is a boolean value that indicates whether the function should return ARG1 or ARG2. If CONTROL is `true`, the function returns ARG1. Otherwise, the function returns ARG2. +If CONTROL is truthy the function returns ARG1, otherwise it returns ARG2. ```go-html-template {{ $qty := 42 }} {{ cond (le $qty 3) "few" "many" }} → many ``` -The CONTROL argument must be either `true` or `false`. To cast a non-boolean value to boolean, pass it through the `not` operator twice. - -```go-html-template -{{ cond (42 | not | not) "truthy" "falsy" }} → truthy -{{ cond ("" | not | not) "truthy" "falsy" }} → falsy -``` - -{{% note %}} -Unlike [ternary operators] in other languages, the `cond` function does not perform [short-circuit evaluation]. The function evaluates both ARG1 and ARG2, regardless of the CONTROL value. +Unlike [ternary operators] in other languages, the `compare.Conditional` function does not perform [short-circuit evaluation]. It evaluates both ARG1 and ARG2 regardless of the CONTROL value. [short-circuit evaluation]: https://en.wikipedia.org/wiki/Short-circuit_evaluation [ternary operators]: https://en.wikipedia.org/wiki/Ternary_conditional_operator -{{% /note %}} Due to the absence of short-circuit evaluation, these examples throw an error: diff --git a/content/en/functions/css/Sass.md b/content/en/functions/css/Sass.md index ef1572ae0..328037bb9 100644 --- a/content/en/functions/css/Sass.md +++ b/content/en/functions/css/Sass.md @@ -32,7 +32,7 @@ toc: true {{ end }} ``` -Transpile Sass to CSS using the LibSass transpiler included in Hugo's extended edition, or [install Dart Sass](#dart-sass) to use the latest features of the Sass language. +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. @@ -42,7 +42,7 @@ Sass has two forms of syntax: [SCSS] and [indented]. Hugo supports both. ## Options transpiler -: (`string`) The transpiler to use, either `libsass` (default) or `dartsass`. Hugo's extended edition includes the LibSass transpiler. To use the Dart Sass transpiler, see the [installation instructions](#dart-sass) below. +: (`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`. @@ -141,8 +141,8 @@ To install Dart Sass for your builds on GitLab Pages, the `.gitlab-ci.yml` file ```yaml variables: - HUGO_VERSION: 0.128.0 - DART_SASS_VERSION: 1.77.5 + HUGO_VERSION: 0.137.1 + DART_SASS_VERSION: 1.80.6 GIT_DEPTH: 0 GIT_STRATEGY: clone GIT_SUBMODULE_STRATEGY: recursive @@ -175,8 +175,8 @@ To install Dart Sass for your builds on Netlify, the `netlify.toml` file should ```toml [build.environment] -HUGO_VERSION = "0.128.0" -DART_SASS_VERSION = "1.77.5" +HUGO_VERSION = "0.137.1" +DART_SASS_VERSION = "1.80.6" TZ = "America/Los_Angeles" [build] diff --git a/content/en/functions/css/TailwindCSS.md b/content/en/functions/css/TailwindCSS.md index 143616453..828ac9051 100644 --- a/content/en/functions/css/TailwindCSS.md +++ b/content/en/functions/css/TailwindCSS.md @@ -16,7 +16,7 @@ toc: true {{< new-in 0.128.0 >}} - +{{% todo %}}remove this admonition when feature is stable.{{% /todo %}} {{% note %}} This is an experimental feature pending the release of TailwindCSS v4.0. @@ -31,9 +31,10 @@ To use this function you must install the Tailwind CSS CLI v4.0 or later. You ma [Tailwind CSS documentation]: https://tailwindcss.com/docs/installation {{% note %}} -Use npm to install the CLI prior to the v4.0 release of Tailwind CSS. +Prior to the release of Tailwind CSS v4.0 you must install [v4.0.0-alpha.26](https://github.com/tailwindlabs/tailwindcss/releases/tag/v4.0.0-alpha.26) or later. `npm install --save-dev tailwindcss@next @tailwindcss/cli@next` + {{% /note %}} ## Options @@ -54,7 +55,7 @@ skipInlineImportsNotFound Define a [cache buster] in your site configuration: -[cache buster]: /getting-started/configuration/#configure-cache-busters +[cache buster]: /getting-started/configuration-build/#configure-cache-busters {{< code-toggle file=hugo >}} [[build.cachebusters]] diff --git a/content/en/functions/hugo/Generator.md b/content/en/functions/hugo/Generator.md index 5538903ed..f8d20559b 100644 --- a/content/en/functions/hugo/Generator.md +++ b/content/en/functions/hugo/Generator.md @@ -11,5 +11,5 @@ action: --- ```go-html-template -{{ hugo.Generator }} → +{{ hugo.Generator }} → ``` diff --git a/content/en/functions/hugo/Version.md b/content/en/functions/hugo/Version.md index 988e8ad88..c1aee8e3f 100644 --- a/content/en/functions/hugo/Version.md +++ b/content/en/functions/hugo/Version.md @@ -11,5 +11,5 @@ action: --- ```go-html-template -{{ hugo.Version }} → 0.128.0 +{{ hugo.Version }} → 0.137.1 ``` diff --git a/content/en/functions/resources/Babel.md b/content/en/functions/resources/Babel.md index b2b51ae97..3e98ba3fe 100644 --- a/content/en/functions/resources/Babel.md +++ b/content/en/functions/resources/Babel.md @@ -15,9 +15,9 @@ expiryDate: 2025-06-24 # deprecated 2024-06-24 --- {{% deprecated-in 0.128.0 %}} -Use [js.Babel] instead. +Use [`js.Babel`] instead. -[js.Babel]: /functions/js/babel/ +[`js.Babel`]: /functions/js/babel/ {{% /deprecated-in %}} ```go-html-template diff --git a/content/en/functions/resources/FromString.md b/content/en/functions/resources/FromString.md index 8801de6e4..be30367db 100644 --- a/content/en/functions/resources/FromString.md +++ b/content/en/functions/resources/FromString.md @@ -24,7 +24,7 @@ Let's say you need to publish a file named "site.json" in the root of your publi ```json { "build_date": "2024-02-19T12:27:05-08:00", - "hugo_version": "0.128.0", + "hugo_version": "0.137.1", "last_modified": "2024-02-19T12:01:42-08:00" } ``` diff --git a/content/en/functions/resources/GetRemote.md b/content/en/functions/resources/GetRemote.md index 556bfbeca..2179415dd 100644 --- a/content/en/functions/resources/GetRemote.md +++ b/content/en/functions/resources/GetRemote.md @@ -102,6 +102,10 @@ The [`Err`] method on a resource returned by the `resources.GetRemote` function [`Err`]: /methods/resource/err/ +{{% note %}} +Hugo does not classify an HTTP response with status code 404 as an error. In this case the function returns nil. +{{% /note %}} + ```go-html-template {{ $url := "https://broken-example.org/images/a.jpg" }} {{ with resources.GetRemote $url }} diff --git a/content/en/functions/resources/PostCSS.md b/content/en/functions/resources/PostCSS.md index f495b16fe..2389d2ff5 100644 --- a/content/en/functions/resources/PostCSS.md +++ b/content/en/functions/resources/PostCSS.md @@ -16,9 +16,9 @@ expiryDate: 2025-06-24 # deprecated 2024-06-24 --- {{% deprecated-in 0.128.0 %}} -Use [css.PostCSS] instead. +Use [`css.PostCSS`] instead. -[css.PostCSS]: /functions/css/postcss/ +[`css.PostCSS`]: /functions/css/postcss/ {{% /deprecated-in %}} ```go-html-template diff --git a/content/en/functions/resources/ToCSS.md b/content/en/functions/resources/ToCSS.md index bd98dab19..5db634f93 100644 --- a/content/en/functions/resources/ToCSS.md +++ b/content/en/functions/resources/ToCSS.md @@ -16,9 +16,9 @@ expiryDate: 2025-06-24 # deprecated 2024-06-24 --- {{% deprecated-in 0.128.0 %}} -Use [css.Sass] instead. +Use [`css.Sass`] instead. -[css.Sass]: /functions/css/sass/ +[`css.Sass`]: /functions/css/sass/ {{% /deprecated-in %}} ```go-html-template @@ -36,7 +36,7 @@ Use [css.Sass] instead. {{ end }} ``` -Transpile Sass to CSS using the LibSass transpiler included in Hugo's extended edition, or [install Dart Sass](#dart-sass) to use the latest features of the Sass language. +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. @@ -46,7 +46,7 @@ Sass has two forms of syntax: [SCSS] and [indented]. Hugo supports both. ## Options transpiler -: (`string`) The transpiler to use, either `libsass` (default) or `dartsass`. Hugo's extended edition includes the LibSass transpiler. To use the Dart Sass transpiler, see the [installation instructions](#dart-sass) below. +: (`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`. @@ -145,8 +145,8 @@ To install Dart Sass for your builds on GitLab Pages, the `.gitlab-ci.yml` file ```yaml variables: - HUGO_VERSION: 0.128.0 - DART_SASS_VERSION: 1.77.5 + HUGO_VERSION: 0.137.1 + DART_SASS_VERSION: 1.80.6 GIT_DEPTH: 0 GIT_STRATEGY: clone GIT_SUBMODULE_STRATEGY: recursive @@ -179,8 +179,8 @@ To install Dart Sass for your builds on Netlify, the `netlify.toml` file should ```toml [build.environment] -HUGO_VERSION = "0.128.0" -DART_SASS_VERSION = "1.77.5" +HUGO_VERSION = "0.137.1" +DART_SASS_VERSION = "1.80.6" TZ = "America/Los_Angeles" [build] diff --git a/content/en/functions/strings/Chomp.md b/content/en/functions/strings/Chomp.md index 349f1e9b7..8024758ba 100644 --- a/content/en/functions/strings/Chomp.md +++ b/content/en/functions/strings/Chomp.md @@ -7,6 +7,7 @@ action: aliases: [chomp] related: - functions/strings/Trim + - functions/strings/TrimSpace - functions/strings/TrimLeft - functions/strings/TrimPrefix - functions/strings/TrimRight @@ -19,9 +20,9 @@ aliases: [/functions/chomp] If the argument is of type `template.HTML`, returns `template.HTML`, else returns a `string`. ```go-html-template -{{ chomp | "foo\n" }} → foo -{{ chomp | "foo\n\n" }} → foo +{{ chomp "foo\n" }} → foo +{{ chomp "foo\n\n" }} → foo -{{ chomp | "foo\r\n" }} → foo -{{ chomp | "foo\r\n\r\n" }} → foo +{{ chomp "foo\r\n" }} → foo +{{ chomp "foo\r\n\r\n" }} → foo ``` diff --git a/content/en/functions/strings/ContainsNonSpace.md b/content/en/functions/strings/ContainsNonSpace.md index d4c72eea0..81e11a5ba 100644 --- a/content/en/functions/strings/ContainsNonSpace.md +++ b/content/en/functions/strings/ContainsNonSpace.md @@ -1,6 +1,6 @@ --- title: strings.ContainsNonSpace -description: Reports whether the given string contains any non-space characters as defined by Unicode's White Space property. +description: Reports whether the given string contains any non-space characters as defined by Unicode. categories: [] keywords: [] action: @@ -18,18 +18,12 @@ aliases: [/functions/strings.containsnonspace] {{< new-in 0.111.0 >}} +Whitespace characters include `\t`, `\n`, `\v`, `\f`, `\r`, and characters in the [Unicode Space Separator] category. + +[Unicode Space Separator]: https://www.compart.com/en/unicode/category/Zs + ```go-html-template {{ strings.ContainsNonSpace "\n" }} → false {{ strings.ContainsNonSpace " " }} → false {{ strings.ContainsNonSpace "\n abc" }} → true ``` - -Common whitespace characters include: - -```text -'\t', '\n', '\v', '\f', '\r', ' ' -``` - -See the [Unicode Character Database] for a complete list. - -[Unicode Character Database]: https://www.unicode.org/Public/UCD/latest/ucd/PropList.txt diff --git a/content/en/functions/strings/Trim.md b/content/en/functions/strings/Trim.md index 9a87ff206..a8c4cf92d 100644 --- a/content/en/functions/strings/Trim.md +++ b/content/en/functions/strings/Trim.md @@ -7,6 +7,7 @@ action: aliases: [trim] related: - functions/strings/Chomp + - functions/strings/TrimSpace - functions/strings/TrimLeft - functions/strings/TrimPrefix - functions/strings/TrimRight @@ -19,41 +20,3 @@ aliases: [/functions/trim] ```go-html-template {{ trim "++foo--" "+-" }} → foo ``` - -To remove leading and trailing newline characters and carriage returns: - -```go-html-template -{{ trim "\nfoo\n" "\n\r" }} → foo -{{ trim "\n\nfoo\n\n" "\n\r" }} → foo - -{{ trim "\r\nfoo\r\n" "\n\r" }} → foo -{{ trim "\r\n\r\nfoo\r\n\r\n" "\n\r" }} → foo -``` - -The `strings.Trim` function is commonly used in shortcodes to remove leading and trailing newlines characters and carriage returns from the content within the opening and closing shortcode tags. - -For example, with this Markdown: - -```text -{{}} -Able was I ere I saw Elba. -{{}} -``` - -The value of `.Inner` in the shortcode template is: - -```text -\nAble was I ere I saw Elba.\n -``` - -If authored on a Windows system the value of `.Inner` might, depending on the editor configuration, be: - -```text -\r\nAble was I ere I saw Elba.\r\n -``` - -This construct is common in shortcode templates: - -```go-html-template -{{ trim .Inner "\n\r" }} -``` diff --git a/content/en/functions/strings/TrimLeft.md b/content/en/functions/strings/TrimLeft.md index 07cdf0064..d94aa05a3 100644 --- a/content/en/functions/strings/TrimLeft.md +++ b/content/en/functions/strings/TrimLeft.md @@ -8,6 +8,7 @@ action: related: - functions/strings/Chomp - functions/strings/Trim + - functions/strings/TrimSpace - functions/strings/TrimPrefix - functions/strings/TrimRight - functions/strings/TrimSuffix diff --git a/content/en/functions/strings/TrimPrefix.md b/content/en/functions/strings/TrimPrefix.md index 917cf06f5..331c52a03 100644 --- a/content/en/functions/strings/TrimPrefix.md +++ b/content/en/functions/strings/TrimPrefix.md @@ -8,6 +8,7 @@ action: related: - functions/strings/Chomp - functions/strings/Trim + - functions/strings/TrimSpace - functions/strings/TrimLeft - functions/strings/TrimRight - functions/strings/TrimSuffix diff --git a/content/en/functions/strings/TrimRight.md b/content/en/functions/strings/TrimRight.md index b244925ef..f36597d3d 100644 --- a/content/en/functions/strings/TrimRight.md +++ b/content/en/functions/strings/TrimRight.md @@ -8,6 +8,7 @@ action: related: - functions/strings/Chomp - functions/strings/Trim + - functions/strings/TrimSpace - functions/strings/TrimLeft - functions/strings/TrimPrefix - functions/strings/TrimSuffix diff --git a/content/en/functions/strings/TrimSpace.md b/content/en/functions/strings/TrimSpace.md new file mode 100644 index 000000000..eef4e8121 --- /dev/null +++ b/content/en/functions/strings/TrimSpace.md @@ -0,0 +1,26 @@ +--- +title: strings.TrimSpace +description: Returns the given string, removing leading and trailing whitespace as defined by Unicode. +categories: [] +keywords: [] +action: + related: + - functions/strings/Chomp + - functions/strings/Trim + - functions/strings/TrimLeft + - functions/strings/TrimPrefix + - functions/strings/TrimRight + - functions/strings/TrimSuffix + returnType: string + signatures: [strings.TrimSpace INPUT] +--- + +{{< new-in 0.136.3 >}} + +Whitespace characters include `\t`, `\n`, `\v`, `\f`, `\r`, and characters in the [Unicode Space Separator] category. + +[Unicode Space Separator]: https://www.compart.com/en/unicode/category/Zs + +```go-html-template +{{ strings.TrimSpace "\n\r\t foo \n\r\t" }} → foo +``` diff --git a/content/en/functions/strings/TrimSuffix.md b/content/en/functions/strings/TrimSuffix.md index 704bbd2d2..d612ae695 100644 --- a/content/en/functions/strings/TrimSuffix.md +++ b/content/en/functions/strings/TrimSuffix.md @@ -8,6 +8,7 @@ action: related: - functions/strings/Chomp - functions/strings/Trim + - functions/strings/TrimSpace - functions/strings/TrimLeft - functions/strings/TrimPrefix - functions/strings/TrimRight diff --git a/content/en/functions/time/AsTime.md b/content/en/functions/time/AsTime.md index 23e5304a5..70b2bd1f3 100644 --- a/content/en/functions/time/AsTime.md +++ b/content/en/functions/time/AsTime.md @@ -21,41 +21,34 @@ toc: true Hugo provides [functions] and [methods] to format, localize, parse, compare, and manipulate date/time values. Before you can do any of these with string representations of date/time values, you must first convert them to [`time.Time`] values using the `time.AsTime` function. ```go-html-template -{{ $t := "2023-10-15T14:20:28-07:00" }} -{{ time.AsTime $t }} → 2023-10-15 14:20:28 -0700 PDT (time.Time) +{{ $t := "2023-10-15T13:18:50-07:00" }} +{{ time.AsTime $t }} → 2023-10-15 13:18:50 -0700 PDT (time.Time) ``` ## Parsable strings -As shown above, the first argument must be a *parsable* string representation of a date/time value. For example: +As shown above, the first argument must be a parsable string representation of a date/time value. For example: {{% include "functions/time/_common/parsable-date-time-strings.md" %}} -## Time zones +To override the default time zone, set the [`timeZone`] in your site configuration or provide a second argument to the `time.AsTime` function. For example: -When the parsable string does not contain a time zone offset, you can do either of the following to assign a time zone other than Etc/UTC: +```go-html-template +{{ time.AsTime "15 Oct 2023" "America/Los_Angeles" }} +``` -- Provide a second argument to the `time.AsTime` function - - ```go-html-template - {{ time.AsTime "15 Oct 2023" "America/Chicago" }} - ``` - -- Set the default time zone in your site configuration - - {{< code-toggle file=hugo >}} - timeZone = 'America/New_York' - {{< /code-toggle >}} +The list of valid time zones may be system dependent, but should include `UTC`, `Local`, or any location in the [IANA Time Zone database]. The order of precedence for determining the time zone is: 1. The time zone offset in the date/time string -2. The time zone provide as the second argument to the `time.AsTime` function +2. The time zone provided as the second argument to the `time.AsTime` function 3. The time zone specified in your site configuration +4. The `Etc/UTC` time zone -The list of valid time zones may be system dependent, but should include `UTC`, `Local`, or any location in the [IANA Time Zone database]. +[IANA Time Zone database]: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones [`time.Time`]: https://pkg.go.dev/time#Time +[`timeZone`]: https://gohugo.io/getting-started/configuration/#timezone [functions]: /functions/time/ -[iana time zone database]: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones [methods]: /methods/time/ diff --git a/content/en/functions/time/Format.md b/content/en/functions/time/Format.md index 74384959b..b9db6905b 100644 --- a/content/en/functions/time/Format.md +++ b/content/en/functions/time/Format.md @@ -19,21 +19,29 @@ toc: true Use the `time.Format` function with `time.Time` values: ```go-html-template -{{ $t := time.AsTime "2023-02-27T23:44:58-08:00" }} -{{ time.Format "2 Jan 2006" $t }} → 27 Feb 2023 +{{ $t := time.AsTime "2023-10-15T13:18:50-07:00" }} +{{ time.Format "2 Jan 2006" $t }} → 15 Oct 2023 ``` -Or use `time.Format` with a *parsable* string representation of a date/time value: +Or use `time.Format` with a parsable string representation of a date/time value: ```go-html-template -{{ $t := "27 Feb 2023" }} -{{ time.Format "January 2, 2006" $t }} → February 27, 2023 +{{ $t := "15 Oct 2023" }} +{{ time.Format "January 2, 2006" $t }} → October 15, 2023 ``` Examples of parsable string representations: {{% include "functions/time/_common/parsable-date-time-strings.md" %}} +To override the default time zone, set the [`timeZone`] in your site configuration. The order of precedence for determining the time zone is: + +1. The time zone offset in the date/time string +2. The time zone specified in your site configuration +3. The `Etc/UTC` time zone + +[`timeZone`]: https://gohugo.io/getting-started/configuration/#timezone + ## Layout string {{% include "functions/_common/time-layout-string.md" %}} diff --git a/content/en/functions/time/_common/parsable-date-time-strings.md b/content/en/functions/time/_common/parsable-date-time-strings.md index a38b9983e..6d1633a6f 100644 --- a/content/en/functions/time/_common/parsable-date-time-strings.md +++ b/content/en/functions/time/_common/parsable-date-time-strings.md @@ -2,13 +2,13 @@ # Do not remove front matter. --- -String representation|Time zone +Format|Time zone :--|:-- -2023-10-15T14:20:28-07:00|America/Los_Angeles -2023-10-15T13:18:50-0700|America/Los_Angeles -2023-10-15T13:18:50Z|Etc/UTC -2023-10-15T13:18:50|Etc/UTC -2023-10-15|Etc/UTC -15 Oct 2023|Etc/UTC +`2023-10-15T13:18:50-07:00`|`America/Los_Angeles` +`2023-10-15T13:18:50-0700`|`America/Los_Angeles` +`2023-10-15T13:18:50Z`|`Etc/UTC` +`2023-10-15T13:18:50`|Default is `Etc/UTC` +`2023-10-15`|Default is `Etc/UTC` +`15 Oct 2023`|Default is `Etc/UTC` -The last four examples are not fully qualified. Without a time zone offset, the time zone is set to Etc/UTC (Coordinated Universal Time). +The last three examples are not fully qualified, and default to the `Etc/UTC` time zone. diff --git a/content/en/functions/transform/ToMath.md b/content/en/functions/transform/ToMath.md index db93a7382..bbdc7b289 100644 --- a/content/en/functions/transform/ToMath.md +++ b/content/en/functions/transform/ToMath.md @@ -2,7 +2,7 @@ title: transform.ToMath description: Renders a math expression using KaTeX. categories: [] -keywords: [] +keywords: [math,katex] action: aliases: [] related: @@ -36,7 +36,7 @@ These are a subset of the [KaTeX options]. output : (`string`). Determines the markup language of the output. One of `html`, `mathml`, or `htmlAndMathml`. Default is `mathml`. - + {{% comment %}}Indent to prevent splitting the description list.{{% / comment %}} With `html` and `htmlAndMathml` you must include KaTeX CSS within the `head` element of your base template. For example: @@ -94,7 +94,7 @@ There are 3 ways to handle errors from KaTeX: 1. Let KaTeX throw an error and make the build fail. This is the default behavior. 1. Handle the error in your template. See the render hook example below. -1. Set the `throwOnError` option to `false` to make KaTeX render the expression as an error instead of throwing an error. See [options]. +1. Set the `throwOnError` option to `false` to make KaTeX render the expression as an error instead of throwing an error. See [options](#options). {{< code file=layouts/_default/_markup/render-passthrough-inline.html copy=true >}} {{ with transform.ToMath .Inner }} diff --git a/content/en/getting-started/configuration-build.md b/content/en/getting-started/configuration-build.md new file mode 100644 index 000000000..cc64b51d7 --- /dev/null +++ b/content/en/getting-started/configuration-build.md @@ -0,0 +1,88 @@ +--- +title: Configure build +description: Configure global build options. +categories: [getting started,fundamentals] +keywords: [build,buildStats,cache] +menu: + docs: + parent: getting-started + weight: 60 +weight: 60 +slug: configuration-build +toc: true +--- + +The `build` configuration section contains global build-related configuration options. + +{{< code-toggle config=build />}} + +#### buildStats + +See [Configure buildStats](#configure-build-stats). + +#### cachebusters + +See [Configure Cache Busters](#configure-cache-busters). + +#### noJSConfigInAssets + +(`bool`) If `true`, turns off writing a `jsconfig.json` into your `/assets` folder with mapping of imports from running [js.Build](/hugo-pipes/js). This file is intended to help with intellisense/navigation inside code editors such as [VS Code](https://code.visualstudio.com/). Note that if you do not use `js.Build`, no file will be written. + +#### useResourceCacheWhen + +(`string`) When to use the cached resources in `/resources/_gen` for PostCSS and ToCSS. Valid values are `never`, `always` and `fallback`. The last value means that the cache will be tried if PostCSS/extended version is not available. + + +## Configure cache busters + +{{< new-in 0.112.0 >}} + +The `build.cachebusters` configuration option was added to support development using Tailwind 3.x's JIT compiler where a `build` configuration may look like this: + +{{< code-toggle file=hugo >}} +[build] + [build.buildStats] + enable = true + [[build.cachebusters]] + source = "assets/watching/hugo_stats\\.json" + target = "styles\\.css" + [[build.cachebusters]] + source = "(postcss|tailwind)\\.config\\.js" + target = "css" + [[build.cachebusters]] + source = "assets/.*\\.(js|ts|jsx|tsx)" + target = "js" + [[build.cachebusters]] + source = "assets/.*\\.(.*)$" + target = "$1" +{{< /code-toggle >}} + +When `buildStats` {{< new-in 0.115.1 >}} is enabled, Hugo writes a `hugo_stats.json` file on each build with HTML classes etc. that's used in the rendered output. Changes to this file will trigger a rebuild of the `styles.css` file. You also need to add `hugo_stats.json` to Hugo's server watcher. See [Hugo Starter Tailwind Basic](https://github.com/bep/hugo-starter-tailwind-basic) for a running example. + +source +: A regexp matching file(s) relative to one of the virtual component directories in Hugo, typically `assets/...`. + +target +: A regexp matching the keys in the resource cache that should be expired when `source` changes. You can use the matching regexp groups from `source` in the expression, e.g. `$1`. + +## Configure build stats + +{{< code-toggle config=build.buildStats />}} + +{{< new-in 0.115.1 >}} + +If `enable` is set to `true`, creates a `hugo_stats.json` file in the root of your project. This file contains arrays of the `class` attributes, `id` attributes, and tags of every HTML element within your published site. Use this file as data source when [removing unused CSS] from your site. This process is also known as pruning, purging, or tree shaking. + +[removing unused CSS]: /hugo-pipes/postprocess/#css-purging-with-postcss + +Exclude `class` attributes, `id` attributes, or tags from `hugo_stats.json` with the `disableClasses`, `disableIDs`, and `disableTags` keys. + +{{% note %}} +Given that CSS purging is typically limited to production builds, place the `buildStats` object below [config/production]. + +[config/production]: /getting-started/configuration/#configuration-directory + +Built for speed, there may be "false positive" detections (e.g., HTML elements that are not HTML elements) while parsing the published site. These "false positives" are infrequent and inconsequential. +{{% /note %}} + +Due to the nature of partial server builds, new HTML entities are added while the server is running, but old values will not be removed until you restart the server or run a regular `hugo` build. \ No newline at end of file diff --git a/content/en/getting-started/configuration-markup.md b/content/en/getting-started/configuration-markup.md index 0046ff1ed..bcc997519 100644 --- a/content/en/getting-started/configuration-markup.md +++ b/content/en/getting-started/configuration-markup.md @@ -238,7 +238,7 @@ This is the default configuration for the AsciiDoc renderer: ###### attributes -(`map`) A map of key-value pairs, each a document attributes. See Asciidoctor’s [attributes]. +(`map`) A map of key-value pairs, each a document attribute. See Asciidoctor’s [attributes]. [attributes]: https://asciidoctor.org/docs/asciidoc-syntax-quick-reference/#attributes-and-substitutions diff --git a/content/en/getting-started/configuration.md b/content/en/getting-started/configuration.md index b0a6cae66..342804a72 100644 --- a/content/en/getting-started/configuration.md +++ b/content/en/getting-started/configuration.md @@ -228,6 +228,10 @@ See [Configure Build](#configure-build). See [Configure File Caches](#configure-file-caches). +###### canonifyURLs + +(`bool`) See [details](/content-management/urls/#canonical-urls) before enabling this feature. Default is `false`. + ###### capitalizeListTitles {{< new-in 0.123.3 >}} @@ -246,10 +250,6 @@ For a website in a single language, define the `[[cascade]]` in [Front Matter](/ To remain consistent and prevent unexpected behavior, do not mix these strategies. {{% /note %}} -###### canonifyURLs - -(`bool`) See [details](/content-management/urls/#canonical-urls) before enabling this feature. Default is `false`. - ###### cleanDestinationDir (`bool`) When building, removes files from destination not found in static directories. Default is `false`. @@ -288,6 +288,10 @@ To remain consistent and prevent unexpected behavior, do not mix these strategie [kinds]: /getting-started/glossary/#page-kind +###### disableLanguages + +See [disable a language](/content-management/multilingual/#disable-a-language). + ###### disableLiveReload (`bool`) Disable automatic live reloading of browser window. Default is `false`. @@ -312,6 +316,9 @@ To remain consistent and prevent unexpected behavior, do not mix these strategie (`bool`) Enable generation of `robots.txt` file. Default is `false`. +###### environment + +(`string`) Build environment. Default is `production` when running `hugo` and `development` when running `hugo server`. See [Configuration directory](https://gohugo.io/getting-started/configuration/#configuration-directory). ###### frontmatter See [Front matter Configuration](#configure-front-matter). @@ -320,6 +327,22 @@ See [Front matter Configuration](#configure-front-matter). (`bool`) If true, auto-detect Chinese/Japanese/Korean Languages in the content. This will make `.Summary` and `.WordCount` behave correctly for CJK languages. Default is `false`. +###### ignoreCache + +(`bool`) Ignore the cache directory. Default is `false`. + +###### ignoreLogs +(`string slice`) A slice of message identifiers corresponding to warnings and errors you wish to suppress. See [`erroridf`] and [`warnidf`]. + +[`erroridf`]: /functions/fmt/erroridf/ +[`warnidf`]: /functions/fmt/warnidf/ + +###### ignoreVendorPaths + +(`string`) Ignore vendored modules that match the given [Glob] pattern within the `_vendor` directory. + +[Glob]: https://github.com/gobwas/glob?tab=readme-ov-file#example] + ###### imaging See [image processing configuration](/content-management/image-processing/#imaging-configuration). @@ -338,9 +361,9 @@ When present in the root of the configuration, this value is ignored if one or m See [Configure Languages](/content-management/multilingual/#configure-languages). -###### disableLanguages +###### layoutDir -See [Disable a Language](/content-management/multilingual/#disable-a-language) +(`string`) The directory that contains templates. Default is `layouts`. ###### markup @@ -366,6 +389,10 @@ Module configuration see [module configuration](/hugo-modules/configuration/). (`string`) The editor to use when creating new content. +###### noBuildLock + +(`bool`) Don't create `.hugo_build.lock` file. Default is `false`. + ###### noChmod (`bool`) Don't sync permission mode of files. Default is `false`. @@ -386,6 +413,10 @@ See [configure page](#configure-page). See [configure pagination](/templates/pagination/#configuration). +###### panicOnWarning + +(`bool`) Whether to panic on first WARNING. Default is `false`. + ###### permalinks See [Content Management](/content-management/urls/#permalinks). @@ -394,6 +425,18 @@ See [Content Management](/content-management/urls/#permalinks). (`bool`) Whether to pluralize automatic list titles. Applicable to section pages. Default is `true`. +###### printI18nWarnings + +(`bool`) Whether to log WARNINGs for each missing translation. Default is `false`. + +###### printPathWarnings + +(`bool`) Whether to log WARNINGs when Hugo publishes two or more files to the same path. Default is `false`. + +###### printUnusedTemplates + +(`bool`) Whether to log WARNINGs for each unused template. Default is `false`. + ###### publishDir (`string`) The directory to where Hugo will write the final static site (the HTML files etc.). Default is `public`. @@ -414,12 +457,6 @@ See [Related Content](/content-management/related/#configure-related-content). (`bool`) See [details](/content-management/urls/#relative-urls) before enabling this feature. Default is `false`. -###### renderSegments - -{{< new-in 0.124.0 >}} - -(`string slice`) A list of segments to render. If not set, everything will be rendered. This is more commonly set in a CLI flag, e.g. `hugo --renderSegments segment1,segment2`. The segment names must match the names in the [segments](#configure-segments) configuration. - ###### removePathAccents (`bool`) Removes [non-spacing marks](https://www.compart.com/en/unicode/category/Mn) from [composite characters](https://en.wikipedia.org/wiki/Precomposed_character) in content paths. Default is `false`. @@ -428,6 +465,12 @@ See [Related Content](/content-management/related/#configure-related-content). content/post/hügó.md → https://example.org/post/hugo/ ``` +###### renderSegments + +{{< new-in 0.124.0 >}} + +(`string slice`) A list of segments to render. If not set, everything will be rendered. This is more commonly set in a CLI flag, e.g. `hugo --renderSegments segment1,segment2`. The segment names must match the names in the [segments](#configure-segments) configuration. + ###### sectionPagesMenu See [Menus](/content-management/menus/#define-automatically). @@ -446,14 +489,23 @@ Default [sitemap configuration](/templates/sitemap/#configuration). ###### summaryLength -(`int`) Applicable to automatic summaries, the approximate number of words to render when calling the [`Summary`] method on a `Page` object. Default is `70`. +(`int`) Applicable to [automatic summaries], the minimum number of words to render when calling the [`Summary`] method on a `Page` object. In this case the `Summary` method returns the content, truncated to the paragraph closest to the `summaryLength`. +[automatic summaries]: /content-management/summaries/#automatic-summary [`Summary`]: /methods/page/summary/ ###### taxonomies See [Configure Taxonomies](/content-management/taxonomies#configure-taxonomies). +###### templateMetrics + +(`bool`) Whether to print template execution metrics to the console. Default is `false`. See [Template metrics](/troubleshooting/performance/#template-metrics). + +###### templateMetricsHints + +(`bool`) Whether to print template execution improvement hints to the console. Applicable when `templateMetrics` is `true`. Default is `false`. See [Template metrics](/troubleshooting/performance/#template-metrics). + ###### theme See [module configuration](/hugo-modules/configuration/#module-configuration-imports) for how to import a theme. @@ -468,7 +520,11 @@ See [module configuration](/hugo-modules/configuration/#module-configuration-imp ###### timeZone -(`string`) The time zone (or location), e.g. `Europe/Oslo`, used to parse front matter dates without such information and in the [`time`] function. The list of valid values may be system dependent, but should include `UTC`, `Local`, and any location in the [IANA Time Zone database](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones). +(`string`) The time zone used to parse dates without time zone offsets, including front matter date fields and values passed to the [`time.AsTime`] and [`time.Format`] template functions. The list of valid values may be system dependent, but should include `UTC`, `Local`, and any location in the [IANA Time Zone Database]. For example, `America/Los_Angeles` and `Europe/Oslo` are valid time zones. + +[`time.AsTime`]: /functions/time/astime/ +[`time.Format`]: /functions/time/format/ +[IANA Time Zone Database]: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones ###### title @@ -480,7 +536,7 @@ See [module configuration](/hugo-modules/configuration/#module-configuration-imp ###### uglyURLs -(`bool`) When enabled, creates URL of the form `/filename.html` instead of `/filename/`. Default is `false`. +(`bool` or `map`) Whether to generate uglyURLs. Default is `false`. See [details](/content-management/urls/#appearance). ###### watch @@ -546,69 +602,8 @@ These settings do not apply to the [`Next`] or [`Prev`] methods on a `Pages` obj ## Configure build -The `build` configuration section contains global build-related configuration options. +See [Configure Build](/getting-started/configuration-build/). -{{< code-toggle config=build />}} - -buildStats {{< new-in 0.115.1 >}} -: When enabled, creates a `hugo_stats.json` file in the root of your project. This file contains arrays of the `class` attributes, `id` attributes, and tags of every HTML element within your published site. Use this file as data source when [removing unused CSS] from your site. This process is also known as pruning, purging, or tree shaking. - -[removing unused CSS]: /hugo-pipes/postprocess/#css-purging-with-postcss - -Exclude `class` attributes, `id` attributes, or tags from `hugo_stats.json` with the `disableClasses`, `disableIDs`, and `disableTags` keys. - -{{% note %}} -With v0.115.0 and earlier this feature was enabled by setting `writeStats` to `true`. Although still functional, the `writeStats` key will be deprecated in a future release. - -Given that CSS purging is typically limited to production builds, place the `buildStats` object below [config/production]. - -[config/production]: /getting-started/configuration/#configuration-directory - -Built for speed, there may be "false positive" detections (e.g., HTML elements that are not HTML elements) while parsing the published site. These "false positives" are infrequent and inconsequential. -{{% /note %}} - -Due to the nature of partial server builds, new HTML entities are added while the server is running, but old values will not be removed until you restart the server or run a regular `hugo` build. - -cachebusters -: See [Configure Cache Busters](#configure-cache-busters) - -noJSConfigInAssets -: Turn off writing a `jsconfig.json` into your `/assets` folder with mapping of imports from running [js.Build](/hugo-pipes/js). This file is intended to help with intellisense/navigation inside code editors such as [VS Code](https://code.visualstudio.com/). Note that if you do not use `js.Build`, no file will be written. - -useResourceCacheWhen -: When to use the cached resources in `/resources/_gen` for PostCSS and ToCSS. Valid values are `never`, `always` and `fallback`. The last value means that the cache will be tried if PostCSS/extended version is not available. - -## Configure cache busters - -{{< new-in 0.112.0 >}} - -The `build.cachebusters` configuration option was added to support development using Tailwind 3.x's JIT compiler where a `build` configuration may look like this: - -{{< code-toggle file=hugo >}} -[build] - [build.buildStats] - enable = true - [[build.cachebusters]] - source = "assets/watching/hugo_stats\\.json" - target = "styles\\.css" - [[build.cachebusters]] - source = "(postcss|tailwind)\\.config\\.js" - target = "css" - [[build.cachebusters]] - source = "assets/.*\\.(js|ts|jsx|tsx)" - target = "js" - [[build.cachebusters]] - source = "assets/.*\\.(.*)$" - target = "$1" -{{< /code-toggle >}} - -When `buildStats` {{< new-in 0.115.1 >}} is enabled, Hugo writes a `hugo_stats.json` file on each build with HTML classes etc. that's used in the rendered output. Changes to this file will trigger a rebuild of the `styles.css` file. You also need to add `hugo_stats.json` to Hugo's server watcher. See [Hugo Starter Tailwind Basic](https://github.com/bep/hugo-starter-tailwind-basic) for a running example. - -source -: A regexp matching file(s) relative to one of the virtual component directories in Hugo, typically `assets/...`. - -target -: A regexp matching the keys in the resource cache that should be expired when `source` changes. You can use the matching regexp groups from `source` in the expression, e.g. `$1`. ## Configure server @@ -748,7 +743,7 @@ HUGO_NUMWORKERMULTIPLIER ## Configure with environment variables -In addition to the 3 configuration options already mentioned, configuration key-values can be defined through operating system environment variables. +Configuration key-values can be defined through operating system environment variables. For example, the following command will effectively set a website's title on Unix-like systems: @@ -885,7 +880,6 @@ If this is not set, Hugo will use, in order of preference: If you want to know the current value of `cacheDir`, you can run `hugo config`, e.g: `hugo config | grep cachedir`. -[`time`]: /functions/time/astime/ [`.Site.Params`]: /method/site/params/ [directory structure]: /getting-started/directory-structure/ [lookup order]: /templates/lookup-order/ @@ -919,7 +913,7 @@ The caching in Hugo is layered: ``` Dynacache -: A in memory LRU cache that gets evicted on changes, [Cache Buster](#configure-cache-busters) matches and in low memory situations. +: A in memory LRU cache that gets evicted on changes, [Cache Buster](/getting-started/configuration-build/#configure-cache-busters) matches and in low memory situations. HTTP Cache : Enables HTTP cache behavior (RFC 9111) for remote resources. This works best for resources with properly set up HTTP cache headers. The HTTP cache uses the [file cache] to store and serve cached resources. diff --git a/content/en/getting-started/glossary.md b/content/en/getting-started/glossary.md index cdd9c58ee..0e63c790d 100644 --- a/content/en/getting-started/glossary.md +++ b/content/en/getting-started/glossary.md @@ -223,7 +223,7 @@ Adaptation of a site to meet language and regional requirements. This includes t {{< new-in 0.123.0 >}} -A page or page resource identifier derived from the file path, excluding its extension and language identifier. This value is neither a file path nor a URL. Starting with a file path relative to the content directory, Hugo determines the logical path by stripping the file extension and language identifier, converting to lower case, then replacing spaces with hyphens. See [examples](/methods/page/path/#examples). +A page or page resource identifier derived from the file path, excluding its extension and language identifier. This value is neither a file path nor a URL. Starting with a file path relative to the content directory, Hugo determines the logical path by stripping the file extension and language identifier, converting to lower case, then replacing spaces with hyphens. {{% comment %}}{{% /comment %}} See [examples](/methods/page/path/#examples). ###### map diff --git a/content/en/getting-started/quick-start.md b/content/en/getting-started/quick-start.md index 6e67cb73b..bdb3247ba 100644 --- a/content/en/getting-started/quick-start.md +++ b/content/en/getting-started/quick-start.md @@ -10,7 +10,7 @@ menu: weight: 20 toc: true aliases: [/quickstart/,/overview/quickstart/] -minVersion: v0.112.0 +minVersion: v0.128.0 --- In this tutorial you will: @@ -24,7 +24,7 @@ In this tutorial you will: Before you begin this tutorial you must: -1. [Install Hugo] (extended edition, {{% param "minVersion" %}} or later) +1. [Install Hugo] (extended or extended/deploy edition, {{% param "minVersion" %}} or later) 1. [Install Git] You must also be comfortable working from the command line. diff --git a/content/en/hosting-and-deployment/hosting-on-github/index.md b/content/en/hosting-and-deployment/hosting-on-github/index.md index 03cb95bb8..28c5ff841 100644 --- a/content/en/hosting-and-deployment/hosting-on-github/index.md +++ b/content/en/hosting-and-deployment/hosting-on-github/index.md @@ -97,7 +97,7 @@ jobs: build: runs-on: ubuntu-latest env: - HUGO_VERSION: 0.128.0 + HUGO_VERSION: 0.137.1 steps: - name: Install Hugo CLI run: | diff --git a/content/en/hosting-and-deployment/hosting-on-gitlab.md b/content/en/hosting-and-deployment/hosting-on-gitlab.md index 440bbc13d..d455c83e5 100644 --- a/content/en/hosting-and-deployment/hosting-on-gitlab.md +++ b/content/en/hosting-and-deployment/hosting-on-gitlab.md @@ -27,8 +27,8 @@ Define your [CI/CD](https://docs.gitlab.com/ee/ci/quick_start/) jobs by creating {{< code file=.gitlab-ci.yml copy=true >}} variables: - DART_SASS_VERSION: 1.77.5 - HUGO_VERSION: 0.128.0 + DART_SASS_VERSION: 1.80.6 + HUGO_VERSION: 0.137.1 NODE_VERSION: 20.x GIT_DEPTH: 0 GIT_STRATEGY: clone diff --git a/content/en/hosting-and-deployment/hosting-on-netlify/index.md b/content/en/hosting-and-deployment/hosting-on-netlify/index.md index 66382b7e3..a63451062 100644 --- a/content/en/hosting-and-deployment/hosting-on-netlify/index.md +++ b/content/en/hosting-and-deployment/hosting-on-netlify/index.md @@ -101,7 +101,7 @@ Create a new file named netlify.toml in the root of your project directory. In i {{< code file=netlify.toml >}} [build.environment] -HUGO_VERSION = "0.128.0" +HUGO_VERSION = "0.137.1" TZ = "America/Los_Angeles" [build] @@ -113,8 +113,8 @@ If your site requires Dart Sass to transpile Sass to CSS, the configuration file {{< code file=netlify.toml >}} [build.environment] -HUGO_VERSION = "0.128.0" -DART_SASS_VERSION = "1.77.5" +HUGO_VERSION = "0.137.1" +DART_SASS_VERSION = "1.80.6" TZ = "America/Los_Angeles" [build] diff --git a/content/en/hosting-and-deployment/hugo-deploy.md b/content/en/hosting-and-deployment/hugo-deploy.md index db2448ee7..a7925a666 100644 --- a/content/en/hosting-and-deployment/hugo-deploy.md +++ b/content/en/hosting-and-deployment/hugo-deploy.md @@ -1,6 +1,6 @@ --- title: Hugo Deploy -description: Upload your site to GCS, S3, or Azure +description: Deploy your site directly to a Google Cloud Storage bucket, an AWS S3 bucket, or an Azure Storage container. categories: [hosting and deployment] keywords: [deployment,s3,gcs,azure] menu: @@ -11,8 +11,13 @@ weight: 20 toc: true --- -You can use the "hugo deploy" command to upload your site directly to a Google Cloud Storage (GCS) bucket, an AWS S3 bucket, and/or an Azure Storage container. +Use the `hugo deploy` command to deploy your site directly to a Google Cloud Storage bucket, an AWS S3 bucket, or an Azure Storage container +{{% note %}} +This feature requires the Hugo extended/deploy edition. See the [installation] section for details. + +[installation]: /installation/ +{{% /note %}} ## Assumptions diff --git a/content/en/hugo-pipes/transpile-sass-to-css.md b/content/en/hugo-pipes/transpile-sass-to-css.md index ee4b1295d..df7eaa2a9 100644 --- a/content/en/hugo-pipes/transpile-sass-to-css.md +++ b/content/en/hugo-pipes/transpile-sass-to-css.md @@ -20,7 +20,7 @@ aliases: [/hugo-pipes/transform-to-css/] ## Usage -Transpile Sass to CSS using the LibSass transpiler included in Hugo's extended edition, or [install Dart Sass](#dart-sass) to use the latest features of the Sass language. +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. ```go-html-template {{ $opts := dict "transpiler" "libsass" "targetPath" "css/style.css" }} @@ -37,7 +37,7 @@ Sass has two forms of syntax: [SCSS] and [indented]. Hugo supports both. ## Options transpiler -: (`string`) The transpiler to use, either `libsass` (default) or `dartsass`. Hugo's extended edition includes the LibSass transpiler. To use the Dart Sass transpiler, see the [installation instructions](#dart-sass) below. +: (`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`. @@ -136,8 +136,8 @@ To install Dart Sass for your builds on GitLab Pages, the `.gitlab-ci.yml` file ```yaml variables: - HUGO_VERSION: 0.128.0 - DART_SASS_VERSION: 1.77.5 + HUGO_VERSION: 0.137.1 + DART_SASS_VERSION: 1.80.6 GIT_DEPTH: 0 GIT_STRATEGY: clone GIT_SUBMODULE_STRATEGY: recursive @@ -170,8 +170,8 @@ To install Dart Sass for your builds on Netlify, the `netlify.toml` file should ```toml [build.environment] -HUGO_VERSION = "0.128.0" -DART_SASS_VERSION = "1.77.5" +HUGO_VERSION = "0.137.1" +DART_SASS_VERSION = "1.80.6" TZ = "America/Los_Angeles" [build] diff --git a/content/en/installation/_common/01-editions.md b/content/en/installation/_common/01-editions.md index deec8cc83..7a80a522e 100644 --- a/content/en/installation/_common/01-editions.md +++ b/content/en/installation/_common/01-editions.md @@ -2,15 +2,15 @@ # Do not remove front matter. --- -## Editions +Hugo is available in three editions: standard, extended, and extended/deploy. While the standard edition provides core functionality, the extended and extended/deploy editions offer advanced features. -Hugo is available in two editions: standard and extended. With the extended edition you can: - -- Encode to the WebP format when [processing images]. You can decode WebP images with either edition. -- [Transpile Sass to CSS] using the embedded LibSass transpiler. The extended edition is not required to use the [Dart Sass] transpiler. - -We recommend that you install the extended edition. +Feature|extended edition|extended/deploy edition +:--|:-:|:-: +Encode to the WebP format when [processing images]. You can decode WebP images with any edition.|:heavy_check_mark:|:heavy_check_mark: +[Transpile Sass to CSS] using the embedded LibSass transpiler. You can use the [Dart Sass] transpiler with any edition.|:heavy_check_mark:|:heavy_check_mark: +Deploy your site directly to a Google Cloud Storage bucket, an AWS S3 bucket, or an Azure Storage container. See [details].|:x:|:heavy_check_mark: [dart sass]: /hugo-pipes/transpile-sass-to-css/#dart-sass [processing images]: /content-management/image-processing/ [transpile sass to css]: /hugo-pipes/transpile-sass-to-css/ +[details]: /hosting-and-deployment/hugo-deploy/ diff --git a/content/en/installation/_common/04-build-from-source.md b/content/en/installation/_common/04-build-from-source.md index 63be3e456..6829c50ce 100644 --- a/content/en/installation/_common/04-build-from-source.md +++ b/content/en/installation/_common/04-build-from-source.md @@ -4,7 +4,7 @@ ## Build from source -To build the extended edition of Hugo from source you must: +To build the extended or extended/deploy edition from source you must: 1. Install [Git] 1. Install [Go] version 1.20 or later @@ -13,11 +13,22 @@ To build the extended edition of Hugo from source you must: > The install directory is controlled by the `GOPATH` and `GOBIN` environment variables. If `GOBIN` is set, binaries are installed to that directory. If `GOPATH` is set, binaries are installed to the bin subdirectory of the first directory in the `GOPATH` list. Otherwise, binaries are installed to the bin subdirectory of the default `GOPATH` (`$HOME/go` or `%USERPROFILE%\go`). -Then build and test: +To build the standard edition: + +```sh +go install github.com/gohugoio/hugo@latest +``` + +To build the extended edition: ```sh CGO_ENABLED=1 go install -tags extended github.com/gohugoio/hugo@latest -hugo version +``` + +To build the extended/deploy edition: + +```sh +CGO_ENABLED=1 go install -tags extended,withdeploy github.com/gohugoio/hugo@latest ``` [Clang]: https://clang.llvm.org/ diff --git a/content/en/installation/bsd.md b/content/en/installation/bsd.md index 6d00b8b98..1b2589c75 100644 --- a/content/en/installation/bsd.md +++ b/content/en/installation/bsd.md @@ -10,8 +10,13 @@ menu: weight: 50 toc: true --- + +## Editions + {{% include "installation/_common/01-editions.md" %}} +Unless your specific deployment needs require the extended/deploy edition, we recommend the extended edition. + {{% include "installation/_common/02-prerequisites.md" %}} {{% include "installation/_common/03-prebuilt-binaries.md" %}} diff --git a/content/en/installation/linux.md b/content/en/installation/linux.md index 769011212..2403bf47b 100644 --- a/content/en/installation/linux.md +++ b/content/en/installation/linux.md @@ -10,8 +10,13 @@ menu: weight: 30 toc: true --- + +## Editions + {{% include "installation/_common/01-editions.md" %}} +Unless your specific deployment needs require the extended/deploy edition, we recommend the extended edition. + {{% include "installation/_common/02-prerequisites.md" %}} {{% include "installation/_common/03-prebuilt-binaries.md" %}} @@ -157,6 +162,14 @@ Derivatives of the [Gentoo] distribution of Linux include [Calculate Linux], [Fu [Gentoo]: https://www.gentoo.org/ [USE]: https://packages.gentoo.org/packages/www-apps/hugo +### NixOS + +The NixOS distribution of Linux includes Hugo in its package repository. To install the extended edition of Hugo: + +```sh +nix-env -iA nixos.hugo +``` + ### openSUSE Derivatives of the [openSUSE] distribution of Linux include [GeckoLinux], [Linux Karmada], and others. To install the extended edition of Hugo: diff --git a/content/en/installation/macos.md b/content/en/installation/macos.md index fa6029679..dace545db 100644 --- a/content/en/installation/macos.md +++ b/content/en/installation/macos.md @@ -10,8 +10,13 @@ menu: weight: 20 toc: true --- + +## Editions + {{% include "installation/_common/01-editions.md" %}} +Unless your specific deployment needs require the extended/deploy edition, we recommend the extended edition. + {{% include "installation/_common/02-prerequisites.md" %}} {{% include "installation/_common/03-prebuilt-binaries.md" %}} diff --git a/content/en/installation/windows.md b/content/en/installation/windows.md index 719264550..e04268cd2 100644 --- a/content/en/installation/windows.md +++ b/content/en/installation/windows.md @@ -15,8 +15,12 @@ toc: true Hugo v0.121.1 and later require at least Windows 10 or Windows Server 2016. {{% /note %}} +## Editions + {{% include "installation/_common/01-editions.md" %}} +Unless your specific deployment needs require the extended/deploy edition, we recommend the extended edition. + {{% include "installation/_common/02-prerequisites.md" %}} {{% include "installation/_common/03-prebuilt-binaries.md" %}} diff --git a/content/en/methods/page/ContentWithoutSummary.md b/content/en/methods/page/ContentWithoutSummary.md index 5080f6717..44d660cef 100644 --- a/content/en/methods/page/ContentWithoutSummary.md +++ b/content/en/methods/page/ContentWithoutSummary.md @@ -25,4 +25,4 @@ Applicable when using manual or automatic [content summaries], the `ContentWitho {{ .ContentWithoutSummary }} ``` -The `ContentWithoutSummary` method returns an empty string if you define the content summary in front matter. +The `ContentWithoutSummary` method returns the same as `Content` if you define the content summary in front matter. diff --git a/content/en/methods/page/Language.md b/content/en/methods/page/Language.md index 321b44e56..e12fc2e62 100644 --- a/content/en/methods/page/Language.md +++ b/content/en/methods/page/Language.md @@ -26,36 +26,41 @@ languageName = 'Deutsch' weight = 2 {{< /code-toggle >}} -Lang -: (`string`) The language tag as defined by [RFC 5646]. +###### Lang + +(`string`) The language tag as defined by [RFC 5646]. ```go-html-template {{ .Language.Lang }} → de ``` -LanguageCode -: (`string`) The language code from the site configuration. Falls back to `Lang` if not defined. +###### LanguageCode + +(`string`) The language code from the site configuration. Falls back to `Lang` if not defined. ```go-html-template {{ .Language.LanguageCode }} → de-DE ``` -LanguageDirection -: (`string`) The language direction from the site configuration, either `ltr` or `rtl`. +###### LanguageDirection + +(`string`) The language direction from the site configuration, either `ltr` or `rtl`. ```go-html-template {{ .Language.LanguageDirection }} → ltr ``` -LanguageName -: (`string`) The language name from the site configuration. +###### LanguageName + +(`string`) The language name from the site configuration. ```go-html-template {{ .Language.LanguageName }} → Deutsch ``` -Weight -: (`int`) The language weight from the site configuration which determines its order in the slice of languages returned by the `Languages` method on a `Site` object. +###### Weight + +(`int`) The language weight from the site configuration which determines its order in the slice of languages returned by the `Languages` method on a `Site` object. ```go-html-template {{ .Language.Weight }} → 2 diff --git a/content/en/methods/page/Paginate.md b/content/en/methods/page/Paginate.md index d9acb6b93..02daa64b4 100644 --- a/content/en/methods/page/Paginate.md +++ b/content/en/methods/page/Paginate.md @@ -10,7 +10,7 @@ action: signatures: ['PAGE.Paginate COLLECTION [N]'] --- -[Pagination] is the process of splitting a list page into two or more pagers, where each pager contains a subset of the page collection and navigation links to other pagers. +Pagination is the process of splitting a list page into two or more pagers, where each pager contains a subset of the page collection and navigation links to other pagers. By default, the number of elements on each pager is determined by your [site configuration]. The default is `10`. Override that value by providing a second argument, an integer, when calling the `Paginate` method. diff --git a/content/en/methods/page/Paginator.md b/content/en/methods/page/Paginator.md index f57e2437e..3dd959006 100644 --- a/content/en/methods/page/Paginator.md +++ b/content/en/methods/page/Paginator.md @@ -10,7 +10,7 @@ action: signatures: [PAGE.Paginator] --- -[Pagination] is the process of splitting a list page into two or more pagers, where each pager contains a subset of the page collection and navigation links to other pagers. +Pagination is the process of splitting a list page into two or more pagers, where each pager contains a subset of the page collection and navigation links to other pagers. The number of elements on each pager is determined by your [site configuration]. The default is `10`. diff --git a/content/en/methods/page/RenderShortcodes.md b/content/en/methods/page/RenderShortcodes.md index 9679fc8d5..e95e0683e 100644 --- a/content/en/methods/page/RenderShortcodes.md +++ b/content/en/methods/page/RenderShortcodes.md @@ -32,9 +32,9 @@ For example: Then call the shortcode in your Markdown: {{< code file=content/about.md lang=md >}} -{{%/* include "/snippets/services.md" */%}} -{{%/* include "/snippets/values.md" */%}} -{{%/* include "/snippets/leadership.md" */%}} +{{%/* include "/snippets/services" */%}} +{{%/* include "/snippets/values" */%}} +{{%/* include "/snippets/leadership" */%}} {{< /code >}} Each of the included Markdown files can contain calls to other shortcodes. @@ -79,3 +79,14 @@ An *emphasized* word. ``` Note that the shortcode within the content file was rendered, but the surrounding Markdown was preserved. + + +## Limitations + +The primary use case for `.RenderShortcodes` is inclusion of Markdown content. If you try to use `.RenderShortcodes` inside `HTML` blocks when inside Markdown, you will get a warning similar to this: + +``` +WARN .RenderShortcodes detected inside HTML block in "/content/mypost.md"; this may not be what you intended ... +``` + +The above warning can be turned off is this is what you really want. diff --git a/content/en/methods/page/Scratch.md b/content/en/methods/page/Scratch.md index 8fef31893..41b1d17fd 100644 --- a/content/en/methods/page/Scratch.md +++ b/content/en/methods/page/Scratch.md @@ -13,6 +13,16 @@ toc: true aliases: [/extras/scratch/,/doc/scratch/,/functions/scratch] --- +{{% deprecated-in 0.138.0 %}} +Use the [`PAGE.Store`] method instead. + +This is a soft deprecation. This method will be removed in a future release, but the removal date has not been established. Although Hugo will not emit a warning if you continue to use this method, you should begin using `PAGE.Store` as soon as possible. + +Beginning with v0.138.0 the `PAGE.Scratch` method is aliased to `PAGE.Store`. + +[`PAGE.Store`]: /methods/page/store/ +{{% /deprecated-in %}} + The `Scratch` method on a `Page` object creates a [scratch pad] to store and manipulate data. To create a scratch pad that is not reset on server rebuilds, use the [`Store`] method instead. To create a locally scoped scratch pad that is not attached to a `Page` object, use the [`newScratch`] function. @@ -25,7 +35,7 @@ To create a locally scoped scratch pad that is not attached to a `Page` object, ## Determinate values -The `Scratch` method is often used to set scratch pad values within a shortcode, a partial template called by a shortcode, or by a Markdown render hook. In all three cases, the scratch pad values are not determinate until Hugo renders the page content. +The `Scratch` method is often used to set scratch pad values within a shortcode, a partial template called by a shortcode, or by a Markdown render hook. In all three cases, the scratch pad values are indeterminate until Hugo renders the page content. If you need to access a scratch pad value from a parent template, and the parent template has not yet rendered the page content, you can trigger content rendering by assigning the returned value to a [noop] variable: @@ -36,7 +46,7 @@ If you need to access a scratch pad value from a parent template, and the parent {{ .Store.Get "mykey" }} ``` -You can also trigger content rendering with the `FuzzyWordCount`, `Len`, `Plain`, `PlainWords`, `ReadingTime`, `Summary`, `Truncated`, and `WordCount` methods. For example: +You can also trigger content rendering with the `ContentWithoutSummary`, `FuzzyWordCount`, `Len`, `Plain`, `PlainWords`, `ReadingTime`, `Summary`, `Truncated`, and `WordCount` methods. For example: ```go-html-template {{ $noop := .WordCount }} diff --git a/content/en/methods/page/Store.md b/content/en/methods/page/Store.md index e7090fe79..a81fa71a3 100644 --- a/content/en/methods/page/Store.md +++ b/content/en/methods/page/Store.md @@ -13,9 +13,7 @@ toc: true aliases: [/functions/store] --- -The `Store` method on a `Page` object creates a persistent [scratch pad] to store and manipulate data. In contrast with the [`Scratch`] method, the scratch pad created by the `Store` method is not reset on server rebuilds. - -To create a locally scoped scratch pad that is not attached to a `Page` object, use the [`newScratch`] function. +The `Store` method on a `Page` object creates a persistent [scratch pad] to store and manipulate data. To create a locally scoped scratch pad that is not attached to a `Page` object, use the [`newScratch`] function. [`Scratch`]: /methods/page/scratch/ [`newScratch`]: /functions/collections/newscratch/ @@ -106,7 +104,7 @@ Removes the given key. ## Determinate values -The `Store` method is often used to set scratch pad values within a shortcode, a partial template called by a shortcode, or by a Markdown render hook. In all three cases, the scratch pad values are not determinate until Hugo renders the page content. +The `Store` method is often used to set scratch pad values within a shortcode, a partial template called by a shortcode, or by a Markdown render hook. In all three cases, the scratch pad values are indeterminate until Hugo renders the page content. If you need to access a scratch pad value from a parent template, and the parent template has not yet rendered the page content, you can trigger content rendering by assigning the returned value to a [noop] variable: @@ -117,7 +115,7 @@ If you need to access a scratch pad value from a parent template, and the parent {{ .Store.Get "mykey" }} ``` -You can also trigger content rendering with the `FuzzyWordCount`, `Len`, `Plain`, `PlainWords`, `ReadingTime`, `Summary`, `Truncated`, and `WordCount` methods. For example: +You can also trigger content rendering with the `ContentWithoutSummary`, `FuzzyWordCount`, `Len`, `Plain`, `PlainWords`, `ReadingTime`, `Summary`, `Truncated`, and `WordCount` methods. For example: ```go-html-template {{ $noop := .WordCount }} diff --git a/content/en/methods/page/Summary.md b/content/en/methods/page/Summary.md index e4542d258..490b201d0 100644 --- a/content/en/methods/page/Summary.md +++ b/content/en/methods/page/Summary.md @@ -1,25 +1,27 @@ --- title: Summary -description: Returns the content summary of the given page. +description: Returns the summary of the given page. categories: [] keywords: [] action: related: - methods/page/Truncated + - methods/page/Content + - methods/page/ContentWithoutSummary - methods/page/Description returnType: template.HTML signatures: [PAGE.Summary] --- - - +{{% comment %}} +Do not remove the manual summary divider below. +If you do, you will break its first literal usage on this page. +{{% /comment %}} -There are three ways to define the [content summary]: +You can define a [summary] manually, in front matter, or automatically. A manual summary takes precedence over a front matter summary, and a front matter summary takes precedence over an automatic summary. -1. Let Hugo create the summary based on the first 70 words. You can change the number of words by setting the `summaryLength` in your site configuration. -2. Manually split the content with a `` tag in Markdown. Everything before the tag is included in the summary. -3. Create a `summary` field in front matter. +[summary]: /content-management/summaries/ To list the pages in a section with a summary beneath each link: @@ -30,4 +32,20 @@ To list the pages in a section with a summary beneath each link: {{ end }} ``` -[content summary]: /content-management/summaries/ +Depending on content length and how you define the summary, the summary may be equivalent to the content itself. To determine whether the content length exceeds the summary length, use the [`Truncated`] method on a `Page` object. This is useful for conditionally rendering a “read more” link: + +[`Truncated`]: /methods/page/truncated + +```go-html-template +{{ range .Pages }} +

{{ .LinkTitle }}

+ {{ .Summary }} + {{ if .Truncated }} + Read more... + {{ end }} +{{ end }} +``` + +{{% note %}} +The `Truncated` method returns `false` if you define the summary in front matter. +{{% /note %}} diff --git a/content/en/methods/page/Truncated.md b/content/en/methods/page/Truncated.md index 0785f40cb..b4ec7ce16 100644 --- a/content/en/methods/page/Truncated.md +++ b/content/en/methods/page/Truncated.md @@ -10,17 +10,11 @@ action: signatures: [PAGE.Truncated] --- -There are three ways to define the [content summary]: +You can define a [summary] manually, in front matter, or automatically. A manual summary takes precedence over a front matter summary, and a front matter summary takes precedence over an automatic summary. -1. Let Hugo create the summary based on the first 70 words. You can change the number of words by setting the `summaryLength` in your site configuration. -2. Manually split the content with a `<--more-->` tag in Markdown. Everything before the tag is included in the summary. -3. Create a `summary` field in front matter. +[summary]: /content-management/summaries/ -{{% note %}} -The `Truncated` method returns `false` if you define the summary in front matter. -{{% /note %}} - -The `Truncated` method returns `true` if the content length exceeds the summary length. This is useful for rendering a "read more" link: +The `Truncated` method returns `true` if the content length exceeds the summary length. This is useful for conditionally rendering a "read more" link: ```go-html-template {{ range .Pages }} @@ -32,4 +26,6 @@ The `Truncated` method returns `true` if the content length exceeds the summary {{ end }} ``` -[content summary]: /content-management/summaries/ +{{% note %}} +The `Truncated` method returns `false` if you define the summary in front matter. +{{% /note %}} diff --git a/content/en/methods/page/_common/output-format-definition.md b/content/en/methods/page/_common/output-format-definition.md index 412c5cee6..d21211a3d 100644 --- a/content/en/methods/page/_common/output-format-definition.md +++ b/content/en/methods/page/_common/output-format-definition.md @@ -1,7 +1,6 @@ --- # Do not remove front matter. --- - Hugo generates one or more files per page when building a site. For example, when rendering home, [section], [taxonomy], and [term] pages, Hugo generates an HTML file and an RSS file. Both HTML and RSS are built-in _output formats_. Create multiple output formats, and control generation based on [page kind], or by enabling one or more output formats for one or more pages. See [details]. [section]: /getting-started/glossary/#section diff --git a/content/en/methods/resource/Colors.md b/content/en/methods/resource/Colors.md index b062210ba..9ee71ba7d 100644 --- a/content/en/methods/resource/Colors.md +++ b/content/en/methods/resource/Colors.md @@ -11,8 +11,6 @@ toc: true math: true --- -{{< new-in 0.104.0 >}} - The `Resources.Colors` method returns a slice of the most dominant colors in an image, ordered from most dominant to least dominant. This method is fast, but if you also downsize your image you can improve performance by extracting the colors from the scaled image. {{% include "methods/resource/_common/global-page-remote-resources.md" %}} diff --git a/content/en/methods/shortcode/Inner.md b/content/en/methods/shortcode/Inner.md index 9271adb34..a428720d7 100644 --- a/content/en/methods/shortcode/Inner.md +++ b/content/en/methods/shortcode/Inner.md @@ -29,7 +29,7 @@ With this shortcode:
{{ . }}
{{ end }}
- {{ trim .Inner "\r\n" }} + {{ .Inner | strings.TrimSpace }}
{{< /code >}} @@ -46,9 +46,9 @@ Is rendered to: ``` {{% note %}} -Content between opening and closing shortcode tags may include leading and/or trailing newlines, depending on placement within the Markdown. Use the [`trim`] function as shown above to remove both carriage returns and newlines. +Content between opening and closing shortcode tags may include leading and/or trailing newlines, depending on placement within the Markdown. Use the [`strings.TrimSpace`] function as shown above to remove both carriage returns and newlines. -[`trim`]: /functions/strings/trim/ +[`strings.TrimSpace`]: /functions/strings/trimspace/ {{% /note %}} {{% note %}} @@ -68,7 +68,7 @@ Let's modify the example above to pass the value returned by `Inner` through the
{{ . }}
{{ end }}
- {{ trim .Inner "\r\n" | .Page.RenderString }} + {{ .Inner | strings.TrimSpace | .Page.RenderString }}
{{< /code >}} @@ -119,7 +119,7 @@ Second, because we are rendering the entire shortcode as Markdown, we must adher {{ end }}
- {{ trim .Inner "\r\n" }} + {{ .Inner | strings.TrimSpace }}
{{< /code >}} @@ -136,9 +136,9 @@ The difference between this and the previous example is subtle but required. Not +
{{ . }}
{{ end }}
-- {{ trim .Inner "\r\n" | .Page.RenderString }} +- {{ .Inner | strings.TrimSpace | .Page.RenderString }} + -+ {{ trim .Inner "\r\n" }} ++ {{ .Inner | strings.TrimSpace }}
``` diff --git a/content/en/methods/shortcode/InnerDeindent.md b/content/en/methods/shortcode/InnerDeindent.md index b5f5cf206..ab4263709 100644 --- a/content/en/methods/shortcode/InnerDeindent.md +++ b/content/en/methods/shortcode/InnerDeindent.md @@ -38,7 +38,7 @@ With this shortcode, calling `Inner` instead of `InnerDeindent`: {{< code file=layouts/shortcodes/gallery.html >}} {{< /code >}} @@ -69,7 +69,7 @@ Although technically correct per the CommonMark specification, this is not what {{< code file=layouts/shortcodes/gallery.html >}} {{< /code >}} diff --git a/content/en/methods/shortcode/Parent.md b/content/en/methods/shortcode/Parent.md index c500af375..53fac8237 100644 --- a/content/en/methods/shortcode/Parent.md +++ b/content/en/methods/shortcode/Parent.md @@ -21,7 +21,7 @@ Welcome. Today is {{}}. {{< code file=layouts/shortcodes/greeting.html >}}
- {{ trim .Inner "\r\n" | .Page.RenderString }} + {{ .Inner | strings.TrimSpace | .Page.RenderString }}
{{< /code >}} diff --git a/content/en/methods/site/Language.md b/content/en/methods/site/Language.md index 7179038e4..2400c225a 100644 --- a/content/en/methods/site/Language.md +++ b/content/en/methods/site/Language.md @@ -27,36 +27,41 @@ languageName = 'Deutsch' weight = 1 {{< /code-toggle >}} -Lang -: (`string`) The language tag as defined by [RFC 5646]. +###### Lang + +(`string`) The language tag as defined by [RFC 5646]. ```go-html-template {{ .Site.Language.Lang }} → de ``` -LanguageCode -: (`string`) The language code from the site configuration. Falls back to `Lang` if not defined. +###### LanguageCode + +(`string`) The language code from the site configuration. Falls back to `Lang` if not defined. ```go-html-template {{ .Site.Language.LanguageCode }} → de-DE ``` -LanguageDirection -: (`string`) The language direction from the site configuration, either `ltr` or `rtl`. +###### LanguageDirection + +(`string`) The language direction from the site configuration, either `ltr` or `rtl`. ```go-html-template {{ .Site.Language.LanguageDirection }} → ltr ``` -LanguageName -: (`string`) The language name from the site configuration. +###### LanguageName + +(`string`) The language name from the site configuration. ```go-html-template {{ .Site.Language.LanguageName }} → Deutsch ``` -Weight -: (`int`) The language weight from the site configuration which determines its order in the slice of languages returned by the `Languages` method on a `Site` object. +###### Weight + +(`int`) The language weight from the site configuration which determines its order in the slice of languages returned by the `Languages` method on a `Site` object. ```go-html-template {{ .Site.Language.Weight }} → 1 diff --git a/content/en/methods/site/Taxonomies.md b/content/en/methods/site/Taxonomies.md index d23a0908f..4690e6da5 100644 --- a/content/en/methods/site/Taxonomies.md +++ b/content/en/methods/site/Taxonomies.md @@ -9,12 +9,9 @@ action: signatures: [SITE.Taxonomies] --- - +{{% /comment %}} Conceptually, the `Taxonomies` method on a `Site` object returns a data structure such as: diff --git a/content/en/quick-reference/emojis.md b/content/en/quick-reference/emojis.md index 4c31c5d76..d2e73843f 100644 --- a/content/en/quick-reference/emojis.md +++ b/content/en/quick-reference/emojis.md @@ -53,7 +53,7 @@ To process an emoji shortcode from within a template, use the [`emojify`] functi [`emojify`]: /functions/transform/emojify/ [`RenderString`]: /methods/page/renderstring/ - + 4. Search/replace (regex) "
" "" +{{% /comment %}} ## Table of Contents @@ -106,7 +107,7 @@ Then... | - | :-: | - | :-: | - | - | | [top](#smileys--emotion) | :grinning: | `:grinning:` | :smiley: | `:smiley:` | [top](#table-of-contents) | | [top](#smileys--emotion) | :smile: | `:smile:` | :grin: | `:grin:` | [top](#table-of-contents) | -| [top](#smileys--emotion) | :laughing: | `:laughing:`
`:satisfied:` | :sweat_smile: | `:sweat_smile:` | [top](#table-of-contents) | +| [top](#smileys--emotion) | :laughing: | `:laughing:` `:satisfied:` | :sweat_smile: | `:sweat_smile:` | [top](#table-of-contents) | | [top](#smileys--emotion) | :rofl: | `:rofl:` | :joy: | `:joy:` | [top](#table-of-contents) | | [top](#smileys--emotion) | :slightly_smiling_face: | `:slightly_smiling_face:` | :upside_down_face: | `:upside_down_face:` | [top](#table-of-contents) | | [top](#smileys--emotion) | :melting_face: | `:melting_face:` | :wink: | `:wink:` | [top](#table-of-contents) | @@ -206,7 +207,7 @@ Then... | | ico | shortcode | ico | shortcode | | | - | :-: | - | :-: | - | - | -| [top](#smileys--emotion) | :triumph: | `:triumph:` | :pout: | `:pout:`
`:rage:` | [top](#table-of-contents) | +| [top](#smileys--emotion) | :triumph: | `:triumph:` | :pout: | `:pout:` `:rage:` | [top](#table-of-contents) | | [top](#smileys--emotion) | :angry: | `:angry:` | :cursing_face: | `:cursing_face:` | [top](#table-of-contents) | | [top](#smileys--emotion) | :smiling_imp: | `:smiling_imp:` | :imp: | `:imp:` | [top](#table-of-contents) | | [top](#smileys--emotion) | :skull: | `:skull:` | :skull_and_crossbones: | `:skull_and_crossbones:` | [top](#table-of-contents) | @@ -215,7 +216,7 @@ Then... | | ico | shortcode | ico | shortcode | | | - | :-: | - | :-: | - | - | -| [top](#smileys--emotion) | :hankey: | `:hankey:`
`:poop:`
`:shit:` | :clown_face: | `:clown_face:` | [top](#table-of-contents) | +| [top](#smileys--emotion) | :hankey: | `:hankey:` `:poop:` `:shit:` | :clown_face: | `:clown_face:` | [top](#table-of-contents) | | [top](#smileys--emotion) | :japanese_ogre: | `:japanese_ogre:` | :japanese_goblin: | `:japanese_goblin:` | [top](#table-of-contents) | | [top](#smileys--emotion) | :ghost: | `:ghost:` | :alien: | `:alien:` | [top](#table-of-contents) | | [top](#smileys--emotion) | :space_invader: | `:space_invader:` | :robot: | `:robot:` | [top](#table-of-contents) | @@ -260,7 +261,7 @@ Then... | | ico | shortcode | ico | shortcode | | | - | :-: | - | :-: | - | - | | [top](#smileys--emotion) | :kiss: | `:kiss:` | :100: | `:100:` | [top](#table-of-contents) | -| [top](#smileys--emotion) | :anger: | `:anger:` | :boom: | `:boom:`
`:collision:` | [top](#table-of-contents) | +| [top](#smileys--emotion) | :anger: | `:anger:` | :boom: | `:boom:` `:collision:` | [top](#table-of-contents) | | [top](#smileys--emotion) | :dizzy: | `:dizzy:` | :sweat_drops: | `:sweat_drops:` | [top](#table-of-contents) | | [top](#smileys--emotion) | :dash: | `:dash:` | :hole: | `:hole:` | [top](#table-of-contents) | | [top](#smileys--emotion) | :speech_balloon: | `:speech_balloon:` | :eye_speech_bubble: | `:eye_speech_bubble:` | [top](#table-of-contents) | @@ -291,7 +292,7 @@ Then... | | ico | shortcode | ico | shortcode | | | - | :-: | - | :-: | - | - | | [top](#people--body) | :wave: | `:wave:` | :raised_back_of_hand: | `:raised_back_of_hand:` | [top](#table-of-contents) | -| [top](#people--body) | :raised_hand_with_fingers_splayed: | `:raised_hand_with_fingers_splayed:` | :hand: | `:hand:`
`:raised_hand:` | [top](#table-of-contents) | +| [top](#people--body) | :raised_hand_with_fingers_splayed: | `:raised_hand_with_fingers_splayed:` | :hand: | `:hand:` `:raised_hand:` | [top](#table-of-contents) | | [top](#people--body) | :vulcan_salute: | `:vulcan_salute:` | :rightwards_hand: | `:rightwards_hand:` | [top](#table-of-contents) | | [top](#people--body) | :leftwards_hand: | `:leftwards_hand:` | :palm_down_hand: | `:palm_down_hand:` | [top](#table-of-contents) | | [top](#people--body) | :palm_up_hand: | `:palm_up_hand:` | :leftwards_pushing_hand: | `:leftwards_pushing_hand:` | [top](#table-of-contents) | @@ -312,7 +313,7 @@ Then... | | ico | shortcode | ico | shortcode | | | - | :-: | - | :-: | - | - | | [top](#people--body) | :point_left: | `:point_left:` | :point_right: | `:point_right:` | [top](#table-of-contents) | -| [top](#people--body) | :point_up_2: | `:point_up_2:` | :fu: | `:fu:`
`:middle_finger:` | [top](#table-of-contents) | +| [top](#people--body) | :point_up_2: | `:point_up_2:` | :fu: | `:fu:` `:middle_finger:` | [top](#table-of-contents) | | [top](#people--body) | :point_down: | `:point_down:` | :point_up: | `:point_up:` | [top](#table-of-contents) | | [top](#people--body) | :index_pointing_at_the_viewer: | `:index_pointing_at_the_viewer:` | | | [top](#table-of-contents) | @@ -320,8 +321,8 @@ Then... | | ico | shortcode | ico | shortcode | | | - | :-: | - | :-: | - | - | -| [top](#people--body) | :+1: | `:+1:`
`:thumbsup:` | :-1: | `:-1:`
`:thumbsdown:` | [top](#table-of-contents) | -| [top](#people--body) | :fist: | `:fist:`
`:fist_raised:` | :facepunch: | `:facepunch:`
`:fist_oncoming:`
`:punch:` | [top](#table-of-contents) | +| [top](#people--body) | :+1: | `:+1:` `:thumbsup:` | :-1: | `:-1:` `:thumbsdown:` | [top](#table-of-contents) | +| [top](#people--body) | :fist: | `:fist:` `:fist_raised:` | :facepunch: | `:facepunch:` `:fist_oncoming:` `:punch:` | [top](#table-of-contents) | | [top](#people--body) | :fist_left: | `:fist_left:` | :fist_right: | `:fist_right:` | [top](#table-of-contents) | ### Hands @@ -369,7 +370,7 @@ Then... | [top](#people--body) | :person_red_hair: | `:person_red_hair:` | :curly_haired_woman: | `:curly_haired_woman:` | [top](#table-of-contents) | | [top](#people--body) | :person_curly_hair: | `:person_curly_hair:` | :white_haired_woman: | `:white_haired_woman:` | [top](#table-of-contents) | | [top](#people--body) | :person_white_hair: | `:person_white_hair:` | :bald_woman: | `:bald_woman:` | [top](#table-of-contents) | -| [top](#people--body) | :person_bald: | `:person_bald:` | :blond_haired_woman: | `:blond_haired_woman:`
`:blonde_woman:` | [top](#table-of-contents) | +| [top](#people--body) | :person_bald: | `:person_bald:` | :blond_haired_woman: | `:blond_haired_woman:` `:blonde_woman:` | [top](#table-of-contents) | | [top](#people--body) | :blond_haired_man: | `:blond_haired_man:` | :older_adult: | `:older_adult:` | [top](#table-of-contents) | | [top](#people--body) | :older_man: | `:older_man:` | :older_woman: | `:older_woman:` | [top](#table-of-contents) | @@ -380,11 +381,11 @@ Then... | [top](#people--body) | :frowning_person: | `:frowning_person:` | :frowning_man: | `:frowning_man:` | [top](#table-of-contents) | | [top](#people--body) | :frowning_woman: | `:frowning_woman:` | :pouting_face: | `:pouting_face:` | [top](#table-of-contents) | | [top](#people--body) | :pouting_man: | `:pouting_man:` | :pouting_woman: | `:pouting_woman:` | [top](#table-of-contents) | -| [top](#people--body) | :no_good: | `:no_good:` | :ng_man: | `:ng_man:`
`:no_good_man:` | [top](#table-of-contents) | -| [top](#people--body) | :ng_woman: | `:ng_woman:`
`:no_good_woman:` | :ok_person: | `:ok_person:` | [top](#table-of-contents) | +| [top](#people--body) | :no_good: | `:no_good:` | :ng_man: | `:ng_man:` `:no_good_man:` | [top](#table-of-contents) | +| [top](#people--body) | :ng_woman: | `:ng_woman:` `:no_good_woman:` | :ok_person: | `:ok_person:` | [top](#table-of-contents) | | [top](#people--body) | :ok_man: | `:ok_man:` | :ok_woman: | `:ok_woman:` | [top](#table-of-contents) | -| [top](#people--body) | :information_desk_person: | `:information_desk_person:`
`:tipping_hand_person:` | :sassy_man: | `:sassy_man:`
`:tipping_hand_man:` | [top](#table-of-contents) | -| [top](#people--body) | :sassy_woman: | `:sassy_woman:`
`:tipping_hand_woman:` | :raising_hand: | `:raising_hand:` | [top](#table-of-contents) | +| [top](#people--body) | :information_desk_person: | `:information_desk_person:` `:tipping_hand_person:` | :sassy_man: | `:sassy_man:` `:tipping_hand_man:` | [top](#table-of-contents) | +| [top](#people--body) | :sassy_woman: | `:sassy_woman:` `:tipping_hand_woman:` | :raising_hand: | `:raising_hand:` | [top](#table-of-contents) | | [top](#people--body) | :raising_hand_man: | `:raising_hand_man:` | :raising_hand_woman: | `:raising_hand_woman:` | [top](#table-of-contents) | | [top](#people--body) | :deaf_person: | `:deaf_person:` | :deaf_man: | `:deaf_man:` | [top](#table-of-contents) | | [top](#people--body) | :deaf_woman: | `:deaf_woman:` | :bow: | `:bow:` | [top](#table-of-contents) | @@ -421,7 +422,7 @@ Then... | [top](#people--body) | :astronaut: | `:astronaut:` | :man_astronaut: | `:man_astronaut:` | [top](#table-of-contents) | | [top](#people--body) | :woman_astronaut: | `:woman_astronaut:` | :firefighter: | `:firefighter:` | [top](#table-of-contents) | | [top](#people--body) | :man_firefighter: | `:man_firefighter:` | :woman_firefighter: | `:woman_firefighter:` | [top](#table-of-contents) | -| [top](#people--body) | :cop: | `:cop:`
`:police_officer:` | :policeman: | `:policeman:` | [top](#table-of-contents) | +| [top](#people--body) | :cop: | `:cop:` `:police_officer:` | :policeman: | `:policeman:` | [top](#table-of-contents) | | [top](#people--body) | :policewoman: | `:policewoman:` | :detective: | `:detective:` | [top](#table-of-contents) | | [top](#people--body) | :male_detective: | `:male_detective:` | :female_detective: | `:female_detective:` | [top](#table-of-contents) | | [top](#people--body) | :guard: | `:guard:` | :guardsman: | `:guardsman:` | [top](#table-of-contents) | @@ -434,7 +435,7 @@ Then... | [top](#people--body) | :woman_with_headscarf: | `:woman_with_headscarf:` | :person_in_tuxedo: | `:person_in_tuxedo:` | [top](#table-of-contents) | | [top](#people--body) | :man_in_tuxedo: | `:man_in_tuxedo:` | :woman_in_tuxedo: | `:woman_in_tuxedo:` | [top](#table-of-contents) | | [top](#people--body) | :person_with_veil: | `:person_with_veil:` | :man_with_veil: | `:man_with_veil:` | [top](#table-of-contents) | -| [top](#people--body) | :bride_with_veil: | `:bride_with_veil:`
`:woman_with_veil:` | :pregnant_woman: | `:pregnant_woman:` | [top](#table-of-contents) | +| [top](#people--body) | :bride_with_veil: | `:bride_with_veil:` `:woman_with_veil:` | :pregnant_woman: | `:pregnant_woman:` | [top](#table-of-contents) | | [top](#people--body) | :pregnant_man: | `:pregnant_man:` | :pregnant_person: | `:pregnant_person:` | [top](#table-of-contents) | | [top](#people--body) | :breast_feeding: | `:breast_feeding:` | :woman_feeding_baby: | `:woman_feeding_baby:` | [top](#table-of-contents) | | [top](#people--body) | :man_feeding_baby: | `:man_feeding_baby:` | :person_feeding_baby: | `:person_feeding_baby:` | [top](#table-of-contents) | @@ -476,8 +477,8 @@ Then... | [top](#people--body) | :person_in_motorized_wheelchair: | `:person_in_motorized_wheelchair:` | :man_in_motorized_wheelchair: | `:man_in_motorized_wheelchair:` | [top](#table-of-contents) | | [top](#people--body) | :woman_in_motorized_wheelchair: | `:woman_in_motorized_wheelchair:` | :person_in_manual_wheelchair: | `:person_in_manual_wheelchair:` | [top](#table-of-contents) | | [top](#people--body) | :man_in_manual_wheelchair: | `:man_in_manual_wheelchair:` | :woman_in_manual_wheelchair: | `:woman_in_manual_wheelchair:` | [top](#table-of-contents) | -| [top](#people--body) | :runner: | `:runner:`
`:running:` | :running_man: | `:running_man:` | [top](#table-of-contents) | -| [top](#people--body) | :running_woman: | `:running_woman:` | :dancer: | `:dancer:`
`:woman_dancing:` | [top](#table-of-contents) | +| [top](#people--body) | :runner: | `:runner:` `:running:` | :running_man: | `:running_man:` | [top](#table-of-contents) | +| [top](#people--body) | :running_woman: | `:running_woman:` | :dancer: | `:dancer:` `:woman_dancing:` | [top](#table-of-contents) | | [top](#people--body) | :man_dancing: | `:man_dancing:` | :business_suit_levitating: | `:business_suit_levitating:` | [top](#table-of-contents) | | [top](#people--body) | :dancers: | `:dancers:` | :dancing_men: | `:dancing_men:` | [top](#table-of-contents) | | [top](#people--body) | :dancing_women: | `:dancing_women:` | :sauna_person: | `:sauna_person:` | [top](#table-of-contents) | @@ -497,8 +498,8 @@ Then... | [top](#people--body) | :rowboat: | `:rowboat:` | :rowing_man: | `:rowing_man:` | [top](#table-of-contents) | | [top](#people--body) | :rowing_woman: | `:rowing_woman:` | :swimmer: | `:swimmer:` | [top](#table-of-contents) | | [top](#people--body) | :swimming_man: | `:swimming_man:` | :swimming_woman: | `:swimming_woman:` | [top](#table-of-contents) | -| [top](#people--body) | :bouncing_ball_person: | `:bouncing_ball_person:` | :basketball_man: | `:basketball_man:`
`:bouncing_ball_man:` | [top](#table-of-contents) | -| [top](#people--body) | :basketball_woman: | `:basketball_woman:`
`:bouncing_ball_woman:` | :weight_lifting: | `:weight_lifting:` | [top](#table-of-contents) | +| [top](#people--body) | :bouncing_ball_person: | `:bouncing_ball_person:` | :basketball_man: | `:basketball_man:` `:bouncing_ball_man:` | [top](#table-of-contents) | +| [top](#people--body) | :basketball_woman: | `:basketball_woman:` `:bouncing_ball_woman:` | :weight_lifting: | `:weight_lifting:` | [top](#table-of-contents) | | [top](#people--body) | :weight_lifting_man: | `:weight_lifting_man:` | :weight_lifting_woman: | `:weight_lifting_woman:` | [top](#table-of-contents) | | [top](#people--body) | :bicyclist: | `:bicyclist:` | :biking_man: | `:biking_man:` | [top](#table-of-contents) | | [top](#people--body) | :biking_woman: | `:biking_woman:` | :mountain_bicyclist: | `:mountain_bicyclist:` | [top](#table-of-contents) | @@ -599,7 +600,7 @@ Then... | [top](#animals--nature) | :koala: | `:koala:` | :panda_face: | `:panda_face:` | [top](#table-of-contents) | | [top](#animals--nature) | :sloth: | `:sloth:` | :otter: | `:otter:` | [top](#table-of-contents) | | [top](#animals--nature) | :skunk: | `:skunk:` | :kangaroo: | `:kangaroo:` | [top](#table-of-contents) | -| [top](#animals--nature) | :badger: | `:badger:` | :feet: | `:feet:`
`:paw_prints:` | [top](#table-of-contents) | +| [top](#animals--nature) | :badger: | `:badger:` | :feet: | `:feet:` `:paw_prints:` | [top](#table-of-contents) | ### Animal Bird @@ -637,7 +638,7 @@ Then... | | ico | shortcode | ico | shortcode | | | - | :-: | - | :-: | - | - | | [top](#animals--nature) | :whale: | `:whale:` | :whale2: | `:whale2:` | [top](#table-of-contents) | -| [top](#animals--nature) | :dolphin: | `:dolphin:`
`:flipper:` | :seal: | `:seal:` | [top](#table-of-contents) | +| [top](#animals--nature) | :dolphin: | `:dolphin:` `:flipper:` | :seal: | `:seal:` | [top](#table-of-contents) | | [top](#animals--nature) | :fish: | `:fish:` | :tropical_fish: | `:tropical_fish:` | [top](#table-of-contents) | | [top](#animals--nature) | :blowfish: | `:blowfish:` | :shark: | `:shark:` | [top](#table-of-contents) | | [top](#animals--nature) | :octopus: | `:octopus:` | :shell: | `:shell:` | [top](#table-of-contents) | @@ -649,7 +650,7 @@ Then... | - | :-: | - | :-: | - | - | | [top](#animals--nature) | :snail: | `:snail:` | :butterfly: | `:butterfly:` | [top](#table-of-contents) | | [top](#animals--nature) | :bug: | `:bug:` | :ant: | `:ant:` | [top](#table-of-contents) | -| [top](#animals--nature) | :bee: | `:bee:`
`:honeybee:` | :beetle: | `:beetle:` | [top](#table-of-contents) | +| [top](#animals--nature) | :bee: | `:bee:` `:honeybee:` | :beetle: | `:beetle:` | [top](#table-of-contents) | | [top](#animals--nature) | :lady_beetle: | `:lady_beetle:` | :cricket: | `:cricket:` | [top](#table-of-contents) | | [top](#animals--nature) | :cockroach: | `:cockroach:` | :spider: | `:spider:` | [top](#table-of-contents) | | [top](#animals--nature) | :spider_web: | `:spider_web:` | :scorpion: | `:scorpion:` | [top](#table-of-contents) | @@ -696,7 +697,7 @@ Then... | | ico | shortcode | ico | shortcode | | | - | :-: | - | :-: | - | - | | [top](#food--drink) | :grapes: | `:grapes:` | :melon: | `:melon:` | [top](#table-of-contents) | -| [top](#food--drink) | :watermelon: | `:watermelon:` | :mandarin: | `:mandarin:`
`:orange:`
`:tangerine:` | [top](#table-of-contents) | +| [top](#food--drink) | :watermelon: | `:watermelon:` | :mandarin: | `:mandarin:` `:orange:` `:tangerine:` | [top](#table-of-contents) | | [top](#food--drink) | :lemon: | `:lemon:` | :banana: | `:banana:` | [top](#table-of-contents) | | [top](#food--drink) | :pineapple: | `:pineapple:` | :mango: | `:mango:` | [top](#table-of-contents) | | [top](#food--drink) | :apple: | `:apple:` | :green_apple: | `:green_apple:` | [top](#table-of-contents) | @@ -797,7 +798,7 @@ Then... | - | :-: | - | :-: | - | - | | [top](#food--drink) | :chopsticks: | `:chopsticks:` | :plate_with_cutlery: | `:plate_with_cutlery:` | [top](#table-of-contents) | | [top](#food--drink) | :fork_and_knife: | `:fork_and_knife:` | :spoon: | `:spoon:` | [top](#table-of-contents) | -| [top](#food--drink) | :hocho: | `:hocho:`
`:knife:` | :jar: | `:jar:` | [top](#table-of-contents) | +| [top](#food--drink) | :hocho: | `:hocho:` `:knife:` | :jar: | `:jar:` | [top](#table-of-contents) | | [top](#food--drink) | :amphora: | `:amphora:` | | | [top](#table-of-contents) | ## Travel & Places @@ -889,7 +890,7 @@ Then... | [top](#travel--places) | :ambulance: | `:ambulance:` | :fire_engine: | `:fire_engine:` | [top](#table-of-contents) | | [top](#travel--places) | :police_car: | `:police_car:` | :oncoming_police_car: | `:oncoming_police_car:` | [top](#table-of-contents) | | [top](#travel--places) | :taxi: | `:taxi:` | :oncoming_taxi: | `:oncoming_taxi:` | [top](#table-of-contents) | -| [top](#travel--places) | :car: | `:car:`
`:red_car:` | :oncoming_automobile: | `:oncoming_automobile:` | [top](#table-of-contents) | +| [top](#travel--places) | :car: | `:car:` `:red_car:` | :oncoming_automobile: | `:oncoming_automobile:` | [top](#table-of-contents) | | [top](#travel--places) | :blue_car: | `:blue_car:` | :pickup_truck: | `:pickup_truck:` | [top](#table-of-contents) | | [top](#travel--places) | :truck: | `:truck:` | :articulated_lorry: | `:articulated_lorry:` | [top](#table-of-contents) | | [top](#travel--places) | :tractor: | `:tractor:` | :racing_car: | `:racing_car:` | [top](#table-of-contents) | @@ -909,7 +910,7 @@ Then... | | ico | shortcode | ico | shortcode | | | - | :-: | - | :-: | - | - | | [top](#travel--places) | :anchor: | `:anchor:` | :ring_buoy: | `:ring_buoy:` | [top](#table-of-contents) | -| [top](#travel--places) | :boat: | `:boat:`
`:sailboat:` | :canoe: | `:canoe:` | [top](#table-of-contents) | +| [top](#travel--places) | :boat: | `:boat:` `:sailboat:` | :canoe: | `:canoe:` | [top](#table-of-contents) | | [top](#travel--places) | :speedboat: | `:speedboat:` | :passenger_ship: | `:passenger_ship:` | [top](#table-of-contents) | | [top](#travel--places) | :ferry: | `:ferry:` | :motor_boat: | `:motor_boat:` | [top](#table-of-contents) | | [top](#travel--places) | :ship: | `:ship:` | | | [top](#table-of-contents) | @@ -958,7 +959,7 @@ Then... | | ico | shortcode | ico | shortcode | | | - | :-: | - | :-: | - | - | | [top](#travel--places) | :new_moon: | `:new_moon:` | :waxing_crescent_moon: | `:waxing_crescent_moon:` | [top](#table-of-contents) | -| [top](#travel--places) | :first_quarter_moon: | `:first_quarter_moon:` | :moon: | `:moon:`
`:waxing_gibbous_moon:` | [top](#table-of-contents) | +| [top](#travel--places) | :first_quarter_moon: | `:first_quarter_moon:` | :moon: | `:moon:` `:waxing_gibbous_moon:` | [top](#table-of-contents) | | [top](#travel--places) | :full_moon: | `:full_moon:` | :waning_gibbous_moon: | `:waning_gibbous_moon:` | [top](#table-of-contents) | | [top](#travel--places) | :last_quarter_moon: | `:last_quarter_moon:` | :waning_crescent_moon: | `:waning_crescent_moon:` | [top](#table-of-contents) | | [top](#travel--places) | :crescent_moon: | `:crescent_moon:` | :new_moon_with_face: | `:new_moon_with_face:` | [top](#table-of-contents) | @@ -1087,7 +1088,7 @@ Then... | [top](#objects) | :eyeglasses: | `:eyeglasses:` | :dark_sunglasses: | `:dark_sunglasses:` | [top](#table-of-contents) | | [top](#objects) | :goggles: | `:goggles:` | :lab_coat: | `:lab_coat:` | [top](#table-of-contents) | | [top](#objects) | :safety_vest: | `:safety_vest:` | :necktie: | `:necktie:` | [top](#table-of-contents) | -| [top](#objects) | :shirt: | `:shirt:`
`:tshirt:` | :jeans: | `:jeans:` | [top](#table-of-contents) | +| [top](#objects) | :shirt: | `:shirt:` `:tshirt:` | :jeans: | `:jeans:` | [top](#table-of-contents) | | [top](#objects) | :scarf: | `:scarf:` | :gloves: | `:gloves:` | [top](#table-of-contents) | | [top](#objects) | :coat: | `:coat:` | :socks: | `:socks:` | [top](#table-of-contents) | | [top](#objects) | :dress: | `:dress:` | :kimono: | `:kimono:` | [top](#table-of-contents) | @@ -1097,7 +1098,7 @@ Then... | [top](#objects) | :folding_hand_fan: | `:folding_hand_fan:` | :purse: | `:purse:` | [top](#table-of-contents) | | [top](#objects) | :handbag: | `:handbag:` | :pouch: | `:pouch:` | [top](#table-of-contents) | | [top](#objects) | :shopping: | `:shopping:` | :school_satchel: | `:school_satchel:` | [top](#table-of-contents) | -| [top](#objects) | :thong_sandal: | `:thong_sandal:` | :mans_shoe: | `:mans_shoe:`
`:shoe:` | [top](#table-of-contents) | +| [top](#objects) | :thong_sandal: | `:thong_sandal:` | :mans_shoe: | `:mans_shoe:` `:shoe:` | [top](#table-of-contents) | | [top](#objects) | :athletic_shoe: | `:athletic_shoe:` | :hiking_boot: | `:hiking_boot:` | [top](#table-of-contents) | | [top](#objects) | :flat_shoe: | `:flat_shoe:` | :high_heel: | `:high_heel:` | [top](#table-of-contents) | | [top](#objects) | :sandal: | `:sandal:` | :ballet_shoes: | `:ballet_shoes:` | [top](#table-of-contents) | @@ -1145,7 +1146,7 @@ Then... | | ico | shortcode | ico | shortcode | | | - | :-: | - | :-: | - | - | | [top](#objects) | :iphone: | `:iphone:` | :calling: | `:calling:` | [top](#table-of-contents) | -| [top](#objects) | :phone: | `:phone:`
`:telephone:` | :telephone_receiver: | `:telephone_receiver:` | [top](#table-of-contents) | +| [top](#objects) | :phone: | `:phone:` `:telephone:` | :telephone_receiver: | `:telephone_receiver:` | [top](#table-of-contents) | | [top](#objects) | :pager: | `:pager:` | :fax: | `:fax:` | [top](#table-of-contents) | ### Computer @@ -1171,14 +1172,14 @@ Then... | [top](#objects) | :vhs: | `:vhs:` | :mag: | `:mag:` | [top](#table-of-contents) | | [top](#objects) | :mag_right: | `:mag_right:` | :candle: | `:candle:` | [top](#table-of-contents) | | [top](#objects) | :bulb: | `:bulb:` | :flashlight: | `:flashlight:` | [top](#table-of-contents) | -| [top](#objects) | :izakaya_lantern: | `:izakaya_lantern:`
`:lantern:` | :diya_lamp: | `:diya_lamp:` | [top](#table-of-contents) | +| [top](#objects) | :izakaya_lantern: | `:izakaya_lantern:` `:lantern:` | :diya_lamp: | `:diya_lamp:` | [top](#table-of-contents) | ### Book Paper | | ico | shortcode | ico | shortcode | | | - | :-: | - | :-: | - | - | | [top](#objects) | :notebook_with_decorative_cover: | `:notebook_with_decorative_cover:` | :closed_book: | `:closed_book:` | [top](#table-of-contents) | -| [top](#objects) | :book: | `:book:`
`:open_book:` | :green_book: | `:green_book:` | [top](#table-of-contents) | +| [top](#objects) | :book: | `:book:` `:open_book:` | :green_book: | `:green_book:` | [top](#table-of-contents) | | [top](#objects) | :blue_book: | `:blue_book:` | :orange_book: | `:orange_book:` | [top](#table-of-contents) | | [top](#objects) | :books: | `:books:` | :notebook: | `:notebook:` | [top](#table-of-contents) | | [top](#objects) | :ledger: | `:ledger:` | :page_with_curl: | `:page_with_curl:` | [top](#table-of-contents) | @@ -1201,7 +1202,7 @@ Then... | | ico | shortcode | ico | shortcode | | | - | :-: | - | :-: | - | - | -| [top](#objects) | :envelope: | `:envelope:` | :e-mail: | `:e-mail:`
`:email:` | [top](#table-of-contents) | +| [top](#objects) | :envelope: | `:envelope:` | :e-mail: | `:e-mail:` `:email:` | [top](#table-of-contents) | | [top](#objects) | :incoming_envelope: | `:incoming_envelope:` | :envelope_with_arrow: | `:envelope_with_arrow:` | [top](#table-of-contents) | | [top](#objects) | :outbox_tray: | `:outbox_tray:` | :inbox_tray: | `:inbox_tray:` | [top](#table-of-contents) | | [top](#objects) | :package: | `:package:` | :mailbox: | `:mailbox:` | [top](#table-of-contents) | @@ -1216,7 +1217,7 @@ Then... | [top](#objects) | :pencil2: | `:pencil2:` | :black_nib: | `:black_nib:` | [top](#table-of-contents) | | [top](#objects) | :fountain_pen: | `:fountain_pen:` | :pen: | `:pen:` | [top](#table-of-contents) | | [top](#objects) | :paintbrush: | `:paintbrush:` | :crayon: | `:crayon:` | [top](#table-of-contents) | -| [top](#objects) | :memo: | `:memo:`
`:pencil:` | | | [top](#table-of-contents) | +| [top](#objects) | :memo: | `:memo:` `:pencil:` | | | [top](#table-of-contents) | ### Office @@ -1427,7 +1428,7 @@ Then... | - | :-: | - | :-: | - | - | | [top](#symbols) | :bangbang: | `:bangbang:` | :interrobang: | `:interrobang:` | [top](#table-of-contents) | | [top](#symbols) | :question: | `:question:` | :grey_question: | `:grey_question:` | [top](#table-of-contents) | -| [top](#symbols) | :grey_exclamation: | `:grey_exclamation:` | :exclamation: | `:exclamation:`
`:heavy_exclamation_mark:` | [top](#table-of-contents) | +| [top](#symbols) | :grey_exclamation: | `:grey_exclamation:` | :exclamation: | `:exclamation:` `:heavy_exclamation_mark:` | [top](#table-of-contents) | | [top](#symbols) | :wavy_dash: | `:wavy_dash:` | | | [top](#table-of-contents) | ### Currency @@ -1566,11 +1567,11 @@ Then... | [top](#flags) | :ecuador: | `:ecuador:` | :estonia: | `:estonia:` | [top](#table-of-contents) | | [top](#flags) | :egypt: | `:egypt:` | :western_sahara: | `:western_sahara:` | [top](#table-of-contents) | | [top](#flags) | :eritrea: | `:eritrea:` | :es: | `:es:` | [top](#table-of-contents) | -| [top](#flags) | :ethiopia: | `:ethiopia:` | :eu: | `:eu:`
`:european_union:` | [top](#table-of-contents) | +| [top](#flags) | :ethiopia: | `:ethiopia:` | :eu: | `:eu:` `:european_union:` | [top](#table-of-contents) | | [top](#flags) | :finland: | `:finland:` | :fiji: | `:fiji:` | [top](#table-of-contents) | | [top](#flags) | :falkland_islands: | `:falkland_islands:` | :micronesia: | `:micronesia:` | [top](#table-of-contents) | | [top](#flags) | :faroe_islands: | `:faroe_islands:` | :fr: | `:fr:` | [top](#table-of-contents) | -| [top](#flags) | :gabon: | `:gabon:` | :gb: | `:gb:`
`:uk:` | [top](#table-of-contents) | +| [top](#flags) | :gabon: | `:gabon:` | :gb: | `:gb:` `:uk:` | [top](#table-of-contents) | | [top](#flags) | :grenada: | `:grenada:` | :georgia: | `:georgia:` | [top](#table-of-contents) | | [top](#flags) | :french_guiana: | `:french_guiana:` | :guernsey: | `:guernsey:` | [top](#table-of-contents) | | [top](#flags) | :ghana: | `:ghana:` | :gibraltar: | `:gibraltar:` | [top](#table-of-contents) | diff --git a/content/en/render-hooks/passthrough.md b/content/en/render-hooks/passthrough.md index 3b82116e6..f4b954c24 100755 --- a/content/en/render-hooks/passthrough.md +++ b/content/en/render-hooks/passthrough.md @@ -95,7 +95,7 @@ Hugo populates the `Attributes` map for _block_ passthrough elements. Markdown a ###### Type -(`bool`) The passthrough element type, either `block` or `inline`. +(`string`) The passthrough element type, either `block` or `inline`. ## Example diff --git a/content/en/render-hooks/tables.md b/content/en/render-hooks/tables.md index 41eadad7b..b8a792747 100755 --- a/content/en/render-hooks/tables.md +++ b/content/en/render-hooks/tables.md @@ -82,7 +82,11 @@ In its default configuration, Hugo renders Markdown tables according to the [Git {{- range .THead }} {{- range . }} - + {{- .Text -}} {{- end }} @@ -93,7 +97,11 @@ In its default configuration, Hugo renders Markdown tables according to the [Git {{- range .TBody }} {{- range . }} - + {{- .Text -}} {{- end }} diff --git a/content/en/templates/embedded.md b/content/en/templates/embedded.md index 888f4f342..2c386b5df 100644 --- a/content/en/templates/embedded.md +++ b/content/en/templates/embedded.md @@ -82,7 +82,7 @@ Provide your tracking ID in your configuration file: {{< code-toggle file=hugo >}} [services.googleAnalytics] -ID = "G-MEASUREMENT_ID" +id = "G-MEASUREMENT_ID" {{}} To use this value in your own template, access the configured ID with `{{ site.Config.Services.GoogleAnalytics.ID }}`. diff --git a/content/en/templates/introduction.md b/content/en/templates/introduction.md index 0a3ff2b0f..e5650149a 100644 --- a/content/en/templates/introduction.md +++ b/content/en/templates/introduction.md @@ -199,11 +199,11 @@ Remember that the piped value becomes the final argument to the function or meth You can split a template action over two or more lines. For example, these are equivalent: ```go-html-template -{{ $v := or .Site.Language.LanguageName .Site.Language.Lang }} +{{ $v := or $arg1 $arg2 }} {{ $v := or - .Site.Language.LanguageName - .Site.Language.Lang + $arg1 + $arg2 }} ``` diff --git a/content/en/troubleshooting/faq.md b/content/en/troubleshooting/faq.md index 0fd67264c..3fd48c62d 100644 --- a/content/en/troubleshooting/faq.md +++ b/content/en/troubleshooting/faq.md @@ -16,17 +16,17 @@ Hugo’s [forum] is an active community of users and developers who answer quest These are just a few of the questions most frequently asked by new users. -###### An error message indicates that a feature is not available. Why? +###### An error message indicates that a feature is not available. Why? {#feature-not-available} -Hugo is available in two editions: standard and extended. With the extended edition you can (a) encode to the WebP format when processing images, and (b) transpile Sass to CSS using the embedded LibSass transpiler. The extended edition is not required to use the Dart Sass transpiler. +{{% include "installation/_common/01-editions.md" %}} -When you attempt to perform either of the operations above with the standard edition, Hugo throws this error: +When you attempt to use a feature that is not available in the edition that you installed, Hugo throws this error: ```go-html-template -Error: this feature is not available in your current Hugo version +this feature is not available in this edition of Hugo ``` -To resolve, uninstall the standard edition, then install the extended edition. See the [installation] section for details. +To resolve, install a different edition based on the feature table above. See the [installation] section for details. ###### Why do I see "Page Not Found" when visiting the home page? @@ -61,7 +61,7 @@ A directory with an index.md file is a [leaf bundle]. A directory with an _index [branch bundle]: /getting-started/glossary/#branch-bundle [leaf bundle]: /getting-started/glossary/#leaf-bundle -###### Why is my partial template not rendered as expected? {#foo} +###### Why is my partial template not rendered as expected? You may have neglected to pass the required [context] when calling the partial. For example: @@ -126,7 +126,7 @@ You can trigger content rendering with other methods as well. See next FAQ. ###### Which page methods trigger content rendering? -The following methods on a `Page` object trigger content rendering: `Content`, `FuzzyWordCount`, `Len`, `Plain`, `PlainWords`, `ReadingTime`, `Summary`, `Truncated`, and `WordCount`. +The following methods on a `Page` object trigger content rendering: `Content`, `ContentWithoutSummary`, `FuzzyWordCount`, `Len`, `Plain`, `PlainWords`, `ReadingTime`, `Summary`, `Truncated`, and `WordCount`. {{% note %}} For other questions please visit the [forum]. A quick search of over 20,000 topics will often answer your question. Please be sure to read about [requesting help] before asking your first question. diff --git a/data/embedded_template_urls.toml b/data/embedded_template_urls.toml index 7bb2e4eee..38b437fe1 100644 --- a/data/embedded_template_urls.toml +++ b/data/embedded_template_urls.toml @@ -24,6 +24,7 @@ 'render-codeblock-goat' = '_default/_markup/render-codeblock-goat.html' # Shortcodes +'comment' = 'shortcodes/comment.html' 'figure' = 'shortcodes/figure.html' 'gist' = 'shortcodes/gist.html' 'highlight' = 'shortcodes/highlight.html' diff --git a/go.mod b/go.mod index 7fd269069..a9d63af19 100644 --- a/go.mod +++ b/go.mod @@ -2,4 +2,4 @@ module github.com/gohugoio/hugoDocs go 1.16 -require github.com/gohugoio/gohugoioTheme v0.0.0-20240815082608-66ccd383a90f // indirect +require github.com/gohugoio/gohugoioTheme v0.0.0-20241105120803-6c6e5fb8f8af // indirect diff --git a/go.sum b/go.sum index 4e5e32477..5c0e10736 100644 --- a/go.sum +++ b/go.sum @@ -1,16 +1,4 @@ -github.com/gohugoio/gohugoioTheme v0.0.0-20240426212330-f38e99e0d88d h1:EaFz80Aqh3Ej20VmUSNe3K+F0NbT8UueXLP/VqkK9Dw= -github.com/gohugoio/gohugoioTheme v0.0.0-20240426212330-f38e99e0d88d/go.mod h1:GOYeAPQJ/ok8z7oz1cjfcSlsFpXrmx6VkzQ5RpnyhZM= -github.com/gohugoio/gohugoioTheme v0.0.0-20240508091825-b23e8e2d2419 h1:cQ/44eDHK0tVImTtSx/9sWWZv+RynH/oB4R7ASbQNAE= -github.com/gohugoio/gohugoioTheme v0.0.0-20240508091825-b23e8e2d2419/go.mod h1:GOYeAPQJ/ok8z7oz1cjfcSlsFpXrmx6VkzQ5RpnyhZM= -github.com/gohugoio/gohugoioTheme v0.0.0-20240619093131-b595d5fb8c52 h1:dPJxUU4SevIZ7OS1DIVOrJ7p8I/QM00pXGRfAtKgQmU= -github.com/gohugoio/gohugoioTheme v0.0.0-20240619093131-b595d5fb8c52/go.mod h1:GOYeAPQJ/ok8z7oz1cjfcSlsFpXrmx6VkzQ5RpnyhZM= -github.com/gohugoio/gohugoioTheme v0.0.0-20240622143740-53a4bdb8c0fb h1:gOIE1eFXILxCio/QOm3oLYcYmsis2CD099dXbXpjprA= -github.com/gohugoio/gohugoioTheme v0.0.0-20240622143740-53a4bdb8c0fb/go.mod h1:GOYeAPQJ/ok8z7oz1cjfcSlsFpXrmx6VkzQ5RpnyhZM= -github.com/gohugoio/gohugoioTheme v0.0.0-20240623150114-cc7096eab3fd h1:I8X7c0oBRWXy83BL2ODSk7v0xPXDnp2hcFWpCcN+Kyc= -github.com/gohugoio/gohugoioTheme v0.0.0-20240623150114-cc7096eab3fd/go.mod h1:GOYeAPQJ/ok8z7oz1cjfcSlsFpXrmx6VkzQ5RpnyhZM= -github.com/gohugoio/gohugoioTheme v0.0.0-20240728210410-d42c342ce472 h1:AYZUibKKFRBp2VCQpDHW+JmQKvCvyhX7z7/SOLUSCcw= -github.com/gohugoio/gohugoioTheme v0.0.0-20240728210410-d42c342ce472/go.mod h1:GOYeAPQJ/ok8z7oz1cjfcSlsFpXrmx6VkzQ5RpnyhZM= -github.com/gohugoio/gohugoioTheme v0.0.0-20240812175901-cc0ef8e4a14a h1:E3JbZo69eqFBz6B+meQlKyy/ZBZQ73ldVDw8TADiIrQ= -github.com/gohugoio/gohugoioTheme v0.0.0-20240812175901-cc0ef8e4a14a/go.mod h1:GOYeAPQJ/ok8z7oz1cjfcSlsFpXrmx6VkzQ5RpnyhZM= -github.com/gohugoio/gohugoioTheme v0.0.0-20240815082608-66ccd383a90f h1:Eo5z3uUYfmrtIxQvHm388dFOERZwWGTjLuUO6vobzLc= -github.com/gohugoio/gohugoioTheme v0.0.0-20240815082608-66ccd383a90f/go.mod h1:GOYeAPQJ/ok8z7oz1cjfcSlsFpXrmx6VkzQ5RpnyhZM= +github.com/gohugoio/gohugoioTheme v0.0.0-20241105040910-e9dac9458255 h1:kaSc7cVAifWPRzmECr7il0YXgXBM+H2ZrGcNnb03S8k= +github.com/gohugoio/gohugoioTheme v0.0.0-20241105040910-e9dac9458255/go.mod h1:GOYeAPQJ/ok8z7oz1cjfcSlsFpXrmx6VkzQ5RpnyhZM= +github.com/gohugoio/gohugoioTheme v0.0.0-20241105120803-6c6e5fb8f8af h1:H8Oa4AEJs2yz8w1Gq9hEGBJNukkKo05OAaIEsHMd63k= +github.com/gohugoio/gohugoioTheme v0.0.0-20241105120803-6c6e5fb8f8af/go.mod h1:GOYeAPQJ/ok8z7oz1cjfcSlsFpXrmx6VkzQ5RpnyhZM= diff --git a/layouts/shortcodes/img.html b/layouts/shortcodes/img.html deleted file mode 100644 index 34476b3d8..000000000 --- a/layouts/shortcodes/img.html +++ /dev/null @@ -1,381 +0,0 @@ -{{- /* -Renders the given image using the given filter, if any. - -@param {string} src The path to the image which must be a remote, page, or global resource. -@param {string} [filter] The filter to apply to the image (case-insensitive). -@param {string} [filterArgs] A comma-delimited list of arguments to pass to the filter. -@param {bool} [example=false] If true, renders a before/after example. -@param {int} [exampleWidth=384] Image width, in pixels, when rendering a before/after example. - -@returns {template.HTML} - -@examples - - {{< img src="zion-national-park.jpg" >}} - - {{< img src="zion-national-park.jpg" alt="Zion National Park" >}} - - {{< img - src="zion-national-park.jpg" - alt="Zion National Park" - filter="grayscale" - >}} - - {{< img - src="zion-national-park.jpg" - alt="Zion National Park" - filter="process" - filterArgs="resize 400x webp" - >}} - - {{< img - src="zion-national-park.jpg" - alt="Zion National Park" - filter="colorize" - filterArgs="180,50,20" - >}} - - {{< img - src="zion-national-park.jpg" - alt="Zion National Park" - filter="grayscale" - example=true - >}} - - {{< img - src="zion-national-park.jpg" - alt="Zion National Park" - filter="grayscale" - example=true - exampleWidth=400 - >}} - - When using the text filter, provide the arguments in this order: - - 0. The text - 1. The horizontal offset, in pixels, relative to the left of the image (default 20) - 2. The vertical offset, in pixels, relative to the top of the image (default 20) - 3. The font size in pixels (default 64) - 4. The line height (default 1.2) - 5. The font color (default #ffffff) - - {{< img - src="images/examples/zion-national-park.jpg" - alt="Zion National Park" - filter="Text" - filterArgs="Zion National Park,25,250,56" - example=true - >}} - - When using the padding filter, provide all arguments in this order: - - 0. Padding top - 1. Padding right - 2. Padding bottom - 3. Padding right - 4. Canvas color - - {{< img - src="images/examples/zion-national-park.jpg" - alt="Zion National Park" - filter="Padding" - filterArgs="20,50,20,50,#0705" - example=true - >}} - -*/}} - -{{- /* Initialize. */}} -{{- $alt := "" }} -{{- $src := "" }} -{{- $filter := "" }} -{{- $filterArgs := slice }} -{{- $example := false }} -{{- $exampleWidth := 384 }} - -{{- /* Default values to use with the text filter. */}} -{{ $textFilterOpts := dict - "xOffset" 20 - "yOffset" 20 - "fontSize" 64 - "lineHeight" 1.2 - "fontColor" "#ffffff" - "fontPath" "https://github.com/google/fonts/raw/main/ofl/lato/Lato-Regular.ttf" -}} - -{{- /* Get and validate parameters. */}} -{{- with .Get "alt" }} - {{- $alt = .}} -{{- end }} - -{{- with .Get "src" }} - {{- $src = . }} -{{- else }} - {{- errorf "The %q shortcode requires a file parameter. See %s" .Name .Position }} -{{- end }} - -{{- with .Get "filter" }} - {{- $filter = . | lower }} -{{- end }} - -{{- $validFilters := slice - "autoorient" "brightness" "colorbalance" "colorize" "contrast" "dither" - "gamma" "gaussianblur" "grayscale" "hue" "invert" "none" "opacity" "overlay" - "padding" "pixelate" "process" "saturation" "sepia" "sigmoid" "text" - "unsharpmask" -}} - -{{- with $filter }} - {{- if not (in $validFilters .) }} - {{- errorf "The filter passed to the %q shortcode is invalid. The filter must be one of %s. See %s" $.Name (delimit $validFilters ", " ", or ") $.Position }} - {{- end }} -{{- end }} - -{{- with .Get "filterArgs" }} - {{- $filterArgs = split . "," }} - {{- $filterArgs = apply $filterArgs "trim" "." " " }} -{{- end }} - -{{- if in (slice "false" false 0) (.Get "example") }} - {{- $example = false }} -{{- else if in (slice "true" true 1) (.Get "example")}} - {{- $example = true }} -{{- end }} - -{{- with .Get "exampleWidth" }} - {{- $exampleWidth = . | int }} -{{- end }} - -{{- /* Get image. */}} -{{- $ctx := dict "page" .Page "src" $src "name" .Name "position" .Position }} -{{- $i := partial "inline/get-resource.html" $ctx }} - -{{- /* Resize if rendering before/after examples. */}} -{{- if $example }} - {{- $i = $i.Resize (printf "%dx" $exampleWidth) }} -{{- end }} - -{{- /* Create filter. */}} -{{- $f := "" }} -{{- $ctx := dict "filter" $filter "args" $filterArgs "name" .Name "position" .Position }} -{{- if eq $filter "autoorient" }} - {{- $ctx = merge $ctx (dict "argsRequired" 0) }} - {{- template "validate-arg-count" $ctx }} - {{- $f = images.AutoOrient }} -{{- else if eq $filter "brightness" }} - {{- $ctx = merge $ctx (dict "argsRequired" 1) }} - {{- template "validate-arg-count" $ctx }} - {{- $filterArgs = apply $filterArgs "float" "." }} - {{- $ctx = merge $ctx (dict "argName" "percentage" "argValue" (index $filterArgs 0) "min" -100 "max" 100) }} - {{- template "validate-arg-value" $ctx }} - {{- $f = images.Brightness (index $filterArgs 0) }} -{{- else if eq $filter "colorbalance" }} - {{- $ctx = merge $ctx (dict "argsRequired" 3) }} - {{- template "validate-arg-count" $ctx }} - {{- $filterArgs = apply $filterArgs "float" "." }} - {{- $ctx = merge $ctx (dict "argName" "percentage red" "argValue" (index $filterArgs 0) "min" -100 "max" 500) }} - {{- template "validate-arg-value" $ctx }} - {{- $ctx = merge $ctx (dict "argName" "percentage green" "argValue" (index $filterArgs 1) "min" -100 "max" 500) }} - {{- template "validate-arg-value" $ctx }} - {{- $ctx = merge $ctx (dict "argName" "percentage blue" "argValue" (index $filterArgs 2) "min" -100 "max" 500) }} - {{- template "validate-arg-value" $ctx }} - {{- $f = images.ColorBalance (index $filterArgs 0) (index $filterArgs 1) (index $filterArgs 2) }} -{{- else if eq $filter "colorize" }} - {{- $ctx = merge $ctx (dict "argsRequired" 3) }} - {{- template "validate-arg-count" $ctx }} - {{- $filterArgs = apply $filterArgs "float" "." }} - {{- $ctx = merge $ctx (dict "argName" "hue" "argValue" (index $filterArgs 0) "min" 0 "max" 360) }} - {{- template "validate-arg-value" $ctx }} - {{- $ctx = merge $ctx (dict "argName" "saturation" "argValue" (index $filterArgs 1) "min" 0 "max" 100) }} - {{- template "validate-arg-value" $ctx }} - {{- $ctx = merge $ctx (dict "argName" "percentage" "argValue" (index $filterArgs 2) "min" 0 "max" 100) }} - {{- template "validate-arg-value" $ctx }} - {{- $f = images.Colorize (index $filterArgs 0) (index $filterArgs 1) (index $filterArgs 2) }} -{{- else if eq $filter "contrast" }} - {{- $ctx = merge $ctx (dict "argsRequired" 1) }} - {{- template "validate-arg-count" $ctx }} - {{- $filterArgs = apply $filterArgs "float" "." }} - {{- $ctx = merge $ctx (dict "argName" "percentage" "argValue" (index $filterArgs 0) "min" -100 "max" 100) }} - {{- template "validate-arg-value" $ctx }} - {{- $f = images.Contrast (index $filterArgs 0) }} -{{- else if eq $filter "dither" }} - {{- $f = images.Dither }} -{{- else if eq $filter "gamma" }} - {{- $ctx = merge $ctx (dict "argsRequired" 1) }} - {{- template "validate-arg-count" $ctx }} - {{- $filterArgs = apply $filterArgs "float" "." }} - {{- $ctx = merge $ctx (dict "argName" "gamma" "argValue" (index $filterArgs 0) "min" 0 "max" 100) }} - {{- template "validate-arg-value" $ctx }} - {{- $f = images.Gamma (index $filterArgs 0) }} -{{- else if eq $filter "gaussianblur" }} - {{- $ctx = merge $ctx (dict "argsRequired" 1) }} - {{- template "validate-arg-count" $ctx }} - {{- $filterArgs = apply $filterArgs "float" "." }} - {{- $ctx = merge $ctx (dict "argName" "sigma" "argValue" (index $filterArgs 0) "min" 0 "max" 1000) }} - {{- template "validate-arg-value" $ctx }} - {{- $f = images.GaussianBlur (index $filterArgs 0) }} -{{- else if eq $filter "grayscale" }} - {{- $ctx = merge $ctx (dict "argsRequired" 0) }} - {{- template "validate-arg-count" $ctx }} - {{- $f = images.Grayscale }} -{{- else if eq $filter "hue" }} - {{- $ctx = merge $ctx (dict "argsRequired" 1) }} - {{- template "validate-arg-count" $ctx }} - {{- $filterArgs = apply $filterArgs "float" "." }} - {{- $ctx = merge $ctx (dict "argName" "shift" "argValue" (index $filterArgs 0) "min" -180 "max" 180) }} - {{- template "validate-arg-value" $ctx }} - {{- $f = images.Hue (index $filterArgs 0) }} -{{- else if eq $filter "invert" }} - {{- $ctx = merge $ctx (dict "argsRequired" 0) }} - {{- template "validate-arg-count" $ctx }} - {{- $f = images.Invert }} -{{- else if eq $filter "opacity" }} - {{- $ctx = merge $ctx (dict "argsRequired" 1) }} - {{- template "validate-arg-count" $ctx }} - {{- $filterArgs = apply $filterArgs "float" "." }} - {{- $ctx = merge $ctx (dict "argName" "opacity" "argValue" (index $filterArgs 0) "min" 0 "max" 1) }} - {{- template "validate-arg-value" $ctx }} - {{- $f = images.Opacity (index $filterArgs 0) }} -{{- else if eq $filter "overlay" }} - {{- $ctx = merge $ctx (dict "argsRequired" 3) }} - {{- template "validate-arg-count" $ctx }} - {{- $ctx := dict "src" (index $filterArgs 0) "name" .Name "position" .Position }} - {{- $overlayImg := partial "inline/get-resource.html" $ctx }} - {{- $f = images.Overlay $overlayImg (index $filterArgs 1 | float ) (index $filterArgs 2 | float) }} -{{- else if eq $filter "padding" }} - {{- $ctx = merge $ctx (dict "argsRequired" 5) }} - {{- template "validate-arg-count" $ctx }} - {{- $f = images.Padding - (index $filterArgs 0 | int) - (index $filterArgs 1 | int) - (index $filterArgs 2 | int) - (index $filterArgs 3 | int) - (index $filterArgs 4) - }} -{{- else if eq $filter "pixelate" }} - {{- $ctx = merge $ctx (dict "argsRequired" 1) }} - {{- template "validate-arg-count" $ctx }} - {{- $filterArgs = apply $filterArgs "float" "." }} - {{- $ctx = merge $ctx (dict "argName" "size" "argValue" (index $filterArgs 0) "min" 0 "max" 1000) }} - {{- template "validate-arg-value" $ctx }} - {{- $f = images.Pixelate (index $filterArgs 0) }} -{{- else if eq $filter "process" }} - {{- $ctx = merge $ctx (dict "argsRequired" 1) }} - {{- template "validate-arg-count" $ctx }} - {{- $f = images.Process (index $filterArgs 0) }} -{{- else if eq $filter "saturation" }} - {{- $ctx = merge $ctx (dict "argsRequired" 1) }} - {{- template "validate-arg-count" $ctx }} - {{- $filterArgs = apply $filterArgs "float" "." }} - {{- $ctx = merge $ctx (dict "argName" "percentage" "argValue" (index $filterArgs 0) "min" -100 "max" 500) }} - {{- template "validate-arg-value" $ctx }} - {{- $f = images.Saturation (index $filterArgs 0) }} -{{- else if eq $filter "sepia" }} - {{- $ctx = merge $ctx (dict "argsRequired" 1) }} - {{- template "validate-arg-count" $ctx }} - {{- $filterArgs = apply $filterArgs "float" "." }} - {{- $ctx = merge $ctx (dict "argName" "percentage" "argValue" (index $filterArgs 0) "min" 0 "max" 100) }} - {{- template "validate-arg-value" $ctx }} - {{- $f = images.Sepia (index $filterArgs 0) }} -{{- else if eq $filter "sigmoid" }} - {{- $ctx = merge $ctx (dict "argsRequired" 2) }} - {{- template "validate-arg-count" $ctx }} - {{- $filterArgs = apply $filterArgs "float" "." }} - {{- $ctx = merge $ctx (dict "argName" "midpoint" "argValue" (index $filterArgs 0) "min" 0 "max" 1) }} - {{- template "validate-arg-value" $ctx }} - {{- $ctx = merge $ctx (dict "argName" "factor" "argValue" (index $filterArgs 1) "min" -10 "max" 10) }} - {{- template "validate-arg-value" $ctx }} - {{- $f = images.Sigmoid (index $filterArgs 0) (index $filterArgs 1) }} -{{- else if eq $filter "text" }} - {{- $ctx = merge $ctx (dict "argsRequired" 1) }} - {{- template "validate-arg-count" $ctx }} - {{- $ctx := dict "src" $textFilterOpts.fontPath "name" .Name "position" .Position }} - {{- $font := or (partial "inline/get-resource.html" $ctx) }} - {{- $fontSize := or (index $filterArgs 3 | int) $textFilterOpts.fontSize }} - {{- $lineHeight := math.Max (or (index $filterArgs 4 | float) $textFilterOpts.lineHeight) 1 }} - {{- $opts := dict - "x" (or (index $filterArgs 1 | int) $textFilterOpts.xOffset) - "y" (or (index $filterArgs 2 | int) $textFilterOpts.yOffset) - "size" $fontSize - "linespacing" (mul (sub $lineHeight 1) $fontSize) - "color" (or (index $filterArgs 5) $textFilterOpts.fontColor) - "font" $font - }} - {{- $f = images.Text (index $filterArgs 0) $opts }} -{{- else if eq $filter "unsharpmask" }} - {{- $ctx = merge $ctx (dict "argsRequired" 3) }} - {{- template "validate-arg-count" $ctx }} - {{- $filterArgs = apply $filterArgs "float" "." }} - {{- $ctx = merge $ctx (dict "argName" "sigma" "argValue" (index $filterArgs 0) "min" 0 "max" 500) }} - {{- template "validate-arg-value" $ctx }} - {{- $ctx = merge $ctx (dict "argName" "amount" "argValue" (index $filterArgs 1) "min" 0 "max" 100) }} - {{- template "validate-arg-value" $ctx }} - {{- $ctx = merge $ctx (dict "argName" "threshold" "argValue" (index $filterArgs 2) "min" 0 "max" 1) }} - {{- template "validate-arg-value" $ctx }} - {{- $f = images.UnsharpMask (index $filterArgs 0) (index $filterArgs 1) (index $filterArgs 2) }} -{{- end }} - -{{- /* Apply filter. */}} -{{- $fi := $i }} -{{- with $f }} - {{- $fi = $i.Filter . }} -{{- end }} - -{{- /* Render. */}} -{{- if $example }} -

Original

- {{ $alt }} -

Processed

- {{ $alt }} -{{- else -}} - {{ $alt }} -{{- end }} - -{{- define "validate-arg-count" }} - {{- $msg := "When using the %q filter, the %q shortcode requires an args parameter with %d %s. See %s" }} - {{- if lt (len .args) .argsRequired }} - {{- $text := "values" }} - {{- if eq 1 .argsRequired }} - {{- $text = "value" }} - {{- end }} - {{- errorf $msg .filter .name .argsRequired $text .position }} - {{- end }} -{{- end }} - -{{- define "validate-arg-value" }} - {{- $msg := "The %q argument passed to the %q shortcode is invalid. Expected a value in the range [%v,%v], but received %v. See %s" }} - {{- if or (lt .argValue .min) (gt .argValue .max) }} - {{- errorf $msg .argName .name .min .max .argValue .position }} - {{- end }} -{{- end }} - -{{- define "partials/inline/get-resource.html" }} - {{- $r := "" }} - {{- $u := urls.Parse .src }} - {{- $msg := "The %q shortcode was unable to resolve %s. See %s" }} - {{- if $u.IsAbs }} - {{- with resources.GetRemote $u.String }} - {{- with .Err }} - {{- errorf "%s" }} - {{- else }} - {{- /* This is a remote resource. */}} - {{- $r = . }} - {{- end }} - {{- else }} - {{- errorf $msg $.name $u.String $.position }} - {{- end }} - {{- else }} - {{- with .page.Resources.Get (strings.TrimPrefix "./" $u.Path) }} - {{- /* This is a page resource. */}} - {{- $r = . }} - {{- else }} - {{- with resources.Get $u.Path }} - {{- /* This is a global resource. */}} - {{- $r = . }} - {{- else }} - {{- errorf $msg $.name $u.Path $.position }} - {{- end }} - {{- end }} - {{- end }} - {{- return $r}} -{{- end -}} diff --git a/netlify.toml b/netlify.toml index 2780fe747..5079ac44d 100644 --- a/netlify.toml +++ b/netlify.toml @@ -3,7 +3,7 @@ command = "hugo --gc --minify" [build.environment] - HUGO_VERSION = "0.134.0" + HUGO_VERSION = "0.138.0" [context.production.environment] HUGO_ENV = "production" From a7df536a52912f34d7d20c970c38590bf5e0c513 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Wed, 13 Nov 2024 11:07:32 +0100 Subject: [PATCH 101/526] Add site.Store and hugo.Store and Shortcode.Store Closes #13021 --- common/hugo/hugo.go | 10 +++++++++ common/maps/scratch.go | 8 ++++++- hugolib/page_test.go | 49 ++++++++++++++++++++++++++++++++++++++++++ hugolib/shortcode.go | 34 +++++++++++++++++++++-------- hugolib/site.go | 6 ++++++ resources/page/page.go | 4 +--- resources/page/site.go | 10 +++++++++ 7 files changed, 108 insertions(+), 13 deletions(-) diff --git a/common/hugo/hugo.go b/common/hugo/hugo.go index f21103940..dd43cf7b6 100644 --- a/common/hugo/hugo.go +++ b/common/hugo/hugo.go @@ -33,6 +33,7 @@ import ( "github.com/gohugoio/hugo/common/hcontext" "github.com/gohugoio/hugo/common/hexec" "github.com/gohugoio/hugo/common/loggers" + "github.com/gohugoio/hugo/common/maps" "github.com/gohugoio/hugo/hugofs/files" "github.com/spf13/afero" @@ -55,6 +56,8 @@ var ( vendorInfo string ) +var _ maps.StoreProvider = (*HugoInfo)(nil) + // HugoInfo contains information about the current Hugo environment type HugoInfo struct { CommitHash string @@ -72,6 +75,8 @@ type HugoInfo struct { conf ConfigProvider deps []*Dependency + store *maps.Scratch + // Context gives access to some of the context scoped variables. Context Context } @@ -116,6 +121,10 @@ func (i HugoInfo) Deps() []*Dependency { return i.deps } +func (i HugoInfo) Store() *maps.Scratch { + return i.store +} + // Deprecated: Use hugo.IsMultihost instead. func (i HugoInfo) IsMultiHost() bool { Deprecate("hugo.IsMultiHost", "Use hugo.IsMultihost instead.", "v0.124.0") @@ -185,6 +194,7 @@ func NewInfo(conf ConfigProvider, deps []*Dependency) HugoInfo { Environment: conf.Environment(), conf: conf, deps: deps, + store: maps.NewScratch(), GoVersion: goVersion, } } diff --git a/common/maps/scratch.go b/common/maps/scratch.go index 638377216..cf5231783 100644 --- a/common/maps/scratch.go +++ b/common/maps/scratch.go @@ -22,7 +22,13 @@ import ( "github.com/gohugoio/hugo/common/math" ) -// Scratch is a writable context used for stateful operations in Page/Node rendering. +type StoreProvider interface { + // Store returns a Scratch that can be used to store temporary state. + // Store is not reset on server rebuilds. + Store() *Scratch +} + +// Scratch is a writable context used for stateful build operations type Scratch struct { values map[string]any mu sync.RWMutex diff --git a/hugolib/page_test.go b/hugolib/page_test.go index bdd1be6f7..39a16d948 100644 --- a/hugolib/page_test.go +++ b/hugolib/page_test.go @@ -1893,3 +1893,52 @@ func TestRenderWithoutArgument(t *testing.T) { b.Assert(err, qt.IsNotNil) } + +// Issue #13021 +func TestAllStores(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +disableKinds = ["taxonomy", "term", "page", "section"] +disableLiveReload = true +-- content/_index.md -- +--- +title: "Home" +--- +{{< s >}} +-- layouts/shortcodes/s.html -- +{{ if not (.Store.Get "Shortcode") }}{{ .Store.Set "Shortcode" (printf "sh-%s" $.Page.Title) }}{{ end }} +Shortcode: {{ .Store.Get "Shortcode" }}| +-- layouts/index.html -- +{{ .Content }} +{{ if not (.Store.Get "Page") }}{{ .Store.Set "Page" (printf "p-%s" $.Title) }}{{ end }} +{{ if not (hugo.Store.Get "Hugo") }}{{ hugo.Store.Set "Hugo" (printf "h-%s" $.Title) }}{{ end }} +{{ if not (site.Store.Get "Site") }}{{ site.Store.Set "Site" (printf "s-%s" $.Title) }}{{ end }} +Page: {{ .Store.Get "Page" }}| +Hugo: {{ hugo.Store.Get "Hugo" }}| +Site: {{ site.Store.Get "Site" }}| +` + + b := TestRunning(t, files) + + b.AssertFileContent("public/index.html", + ` +Shortcode: sh-Home| +Page: p-Home| +Site: s-Home| +Hugo: h-Home| +`, + ) + + b.EditFileReplaceAll("content/_index.md", "Home", "Homer").Build() + + b.AssertFileContent("public/index.html", + ` +Shortcode: sh-Homer| +Page: p-Homer| +Site: s-Home| +Hugo: h-Home| +`, + ) +} diff --git a/hugolib/shortcode.go b/hugolib/shortcode.go index 8a478c9df..69e891adb 100644 --- a/hugolib/shortcode.go +++ b/hugolib/shortcode.go @@ -43,9 +43,10 @@ import ( ) var ( - _ urls.RefLinker = (*ShortcodeWithPage)(nil) - _ types.Unwrapper = (*ShortcodeWithPage)(nil) - _ text.Positioner = (*ShortcodeWithPage)(nil) + _ urls.RefLinker = (*ShortcodeWithPage)(nil) + _ types.Unwrapper = (*ShortcodeWithPage)(nil) + _ text.Positioner = (*ShortcodeWithPage)(nil) + _ maps.StoreProvider = (*ShortcodeWithPage)(nil) ) // ShortcodeWithPage is the "." context in a shortcode template. @@ -72,7 +73,7 @@ type ShortcodeWithPage struct { posOffset int pos text.Position - scratch *maps.Scratch + store *maps.Scratch } // InnerDeindent returns the (potentially de-indented) inner content of the shortcode. @@ -124,13 +125,19 @@ func (scp *ShortcodeWithPage) RelRef(args map[string]any) (string, error) { return scp.Page.RelRefFrom(args, scp) } +// Store returns this shortcode's Store. +func (scp *ShortcodeWithPage) Store() *maps.Scratch { + if scp.store == nil { + scp.store = maps.NewScratch() + } + return scp.store +} + // Scratch returns a scratch-pad scoped for this shortcode. This can be used // as a temporary storage for variables, counters etc. +// Deprecated: Use Store instead. Note that from the templates this should be considered a "soft deprecation". func (scp *ShortcodeWithPage) Scratch() *maps.Scratch { - if scp.scratch == nil { - scp.scratch = maps.NewScratch() - } - return scp.scratch + return scp.Store() } // Get is a convenience method to look up shortcode parameters by its key. @@ -399,7 +406,16 @@ func doRenderShortcode( hasVariants = hasVariants || more } - data := &ShortcodeWithPage{Ordinal: sc.ordinal, posOffset: sc.pos, indentation: sc.indentation, Params: sc.params, Page: newPageForShortcode(p), Parent: parent, Name: sc.name} + data := &ShortcodeWithPage{ + Ordinal: sc.ordinal, + posOffset: sc.pos, + indentation: sc.indentation, + Params: sc.params, + Page: newPageForShortcode(p), + Parent: parent, + Name: sc.name, + } + if sc.params != nil { data.IsNamedParams = reflect.TypeOf(sc.params).Kind() == reflect.Map } diff --git a/hugolib/site.go b/hugolib/site.go index c5a4956e2..c434ff2b4 100644 --- a/hugolib/site.go +++ b/hugolib/site.go @@ -95,6 +95,7 @@ type Site struct { language *langs.Language languagei int pageMap *pageMap + store *maps.Scratch // The owning container. h *HugoSites @@ -248,6 +249,7 @@ func NewHugoSites(cfg deps.DepsCfg) (*HugoSites, error) { language: language, languagei: i, frontmatterHandler: frontmatterHandler, + store: maps.NewScratch(), } if i == 0 { @@ -614,6 +616,10 @@ func (s *Site) AllRegularPages() page.Pages { return s.h.RegularPages() } +func (s *Site) Store() *maps.Scratch { + return s.store +} + func (s *Site) CheckReady() { if s.state != siteStateReady { panic("this method cannot be called before the site is fully initialized") diff --git a/resources/page/page.go b/resources/page/page.go index ea7f4bf1b..acd4ce313 100644 --- a/resources/page/page.go +++ b/resources/page/page.go @@ -331,9 +331,7 @@ type PageWithoutContent interface { // Deprecated: From Hugo v0.138.0 this is just an alias for Store. Scratch() *maps.Scratch - // Store returns a Scratch that can be used to store temporary state. - // In contrast to Scratch(), this Scratch is not reset on server rebuilds. - Store() *maps.Scratch + maps.StoreProvider RelatedKeywordsProvider diff --git a/resources/page/site.go b/resources/page/site.go index 9f7871a02..4a99982fd 100644 --- a/resources/page/site.go +++ b/resources/page/site.go @@ -135,6 +135,8 @@ type Site interface { // Deprecated: Use .Site.Home.OutputFormats.Get "rss" instead. RSSLink() template.URL + maps.StoreProvider + // For internal use only. // This will panic if the site is not fully initialized. // This is typically used to inform the user in the content adapter templates, @@ -327,6 +329,10 @@ func (s *siteWrapper) RSSLink() template.URL { return s.s.RSSLink() } +func (s *siteWrapper) Store() *maps.Scratch { + return s.s.Store() +} + // For internal use only. func (s *siteWrapper) ForEeachIdentityByName(name string, f func(identity.Identity) bool) { s.s.(identity.ForEeachIdentityByNameProvider).ForEeachIdentityByName(name, f) @@ -491,6 +497,10 @@ func (s testSite) RSSLink() template.URL { return "" } +func (s testSite) Store() *maps.Scratch { + return maps.NewScratch() +} + func (s testSite) CheckReady() { } From 8aba6dc661e71ffb50c3825c445d451ac5db0d7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Wed, 13 Nov 2024 14:54:15 +0100 Subject: [PATCH 102/526] parser/metadecoders: Add benchmark --- parser/metadecoders/decoder_test.go | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/parser/metadecoders/decoder_test.go b/parser/metadecoders/decoder_test.go index 734713c2e..49f7868cc 100644 --- a/parser/metadecoders/decoder_test.go +++ b/parser/metadecoders/decoder_test.go @@ -306,3 +306,26 @@ func BenchmarkStringifyMapKeysIntegers(b *testing.B) { stringifyMapKeys(maps[i]) } } + +func BenchmarkDecodeYAMLToMap(b *testing.B) { + d := Default + + data := []byte(` +a: + v1: 32 + v2: 43 + v3: "foo" +b: + - a + - b +c: "d" + +`) + + for i := 0; i < b.N; i++ { + _, err := d.UnmarshalToMap(data, YAML) + if err != nil { + b.Fatal(err) + } + } +} From cb6580d008b6aa337e8fef17dfcd25e89b5d2be0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 14 Nov 2024 08:30:13 +0000 Subject: [PATCH 103/526] build(deps): bump github.com/hairyhenderson/go-codeowners Bumps [github.com/hairyhenderson/go-codeowners](https://github.com/hairyhenderson/go-codeowners) from 0.6.0 to 0.6.1. - [Release notes](https://github.com/hairyhenderson/go-codeowners/releases) - [Changelog](https://github.com/hairyhenderson/go-codeowners/blob/main/CHANGELOG.md) - [Commits](https://github.com/hairyhenderson/go-codeowners/compare/v0.6.0...v0.6.1) --- updated-dependencies: - dependency-name: github.com/hairyhenderson/go-codeowners dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 10 ++-------- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index 4b1d53a1b..1bba42f1b 100644 --- a/go.mod +++ b/go.mod @@ -46,7 +46,7 @@ require ( github.com/gohugoio/testmodBuilder/mods v0.0.0-20190520184928-c56af20f2e95 github.com/google/go-cmp v0.6.0 github.com/gorilla/websocket v1.5.3 - github.com/hairyhenderson/go-codeowners v0.6.0 + github.com/hairyhenderson/go-codeowners v0.6.1 github.com/jdkato/prose v1.2.1 github.com/kylelemons/godebug v1.1.0 github.com/kyokomi/emoji/v2 v2.2.13 diff --git a/go.sum b/go.sum index cc8b23683..6a52dae25 100644 --- a/go.sum +++ b/go.sum @@ -131,8 +131,6 @@ github.com/bep/goat v0.5.0 h1:S8jLXHCVy/EHIoCY+btKkmcxcXFd34a0Q63/0D4TKeA= github.com/bep/goat v0.5.0/go.mod h1:Md9x7gRxiWKs85yHlVTvHQw9rg86Bm+Y4SuYE8CTH7c= github.com/bep/godartsass v1.2.0 h1:E2VvQrxAHAFwbjyOIExAMmogTItSKodoKuijNrGm5yU= github.com/bep/godartsass v1.2.0/go.mod h1:6LvK9RftsXMxGfsA0LDV12AGc4Jylnu6NgHL+Q5/pE8= -github.com/bep/godartsass/v2 v2.1.0 h1:fq5Y1xYf4diu4tXABiekZUCA+5l/dmNjGKCeQwdy+s0= -github.com/bep/godartsass/v2 v2.1.0/go.mod h1:AcP8QgC+OwOXEq6im0WgDRYK7scDsmZCEW62o1prQLo= github.com/bep/godartsass/v2 v2.2.0 h1:3hO9Dt4BOnxkKmRxc+OpoKVFrDvBycpSCXEdElVAMVI= github.com/bep/godartsass/v2 v2.2.0/go.mod h1:AcP8QgC+OwOXEq6im0WgDRYK7scDsmZCEW62o1prQLo= github.com/bep/golibsass v1.2.0 h1:nyZUkKP/0psr8nT6GR2cnmt99xS93Ji82ZD9AgOK6VI= @@ -143,10 +141,6 @@ 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.8.1 h1:tjZLPRftjxU7PTI87o5e5WKOFQ4S9S0engiP1OTpJTI= github.com/bep/imagemeta v0.8.1/go.mod h1:5piPAq5Qomh07m/dPPCLN3mDJyFusvUG7VwdRD/vX0s= -github.com/bep/lazycache v0.4.0 h1:X8yVyWNVupPd4e1jV7efi3zb7ZV/qcjKQgIQ5aPbkYI= -github.com/bep/lazycache v0.4.0/go.mod h1:NmRm7Dexh3pmR1EignYR8PjO2cWybFQ68+QgY3VMCSc= -github.com/bep/lazycache v0.6.0 h1:0vCgFo7TBtMQpSx64jnH1sagmw0ZougIFRpsqPHTa5U= -github.com/bep/lazycache v0.6.0/go.mod h1:NmRm7Dexh3pmR1EignYR8PjO2cWybFQ68+QgY3VMCSc= github.com/bep/lazycache v0.7.0 h1:VM257SkkjcR9z55eslXTkUIX8QMNKoqQRNKV/4xIkCY= github.com/bep/lazycache v0.7.0/go.mod h1:NmRm7Dexh3pmR1EignYR8PjO2cWybFQ68+QgY3VMCSc= github.com/bep/logg v0.4.0 h1:luAo5mO4ZkhA5M1iDVDqDqnBBnlHjmtZF6VAyTp+nCQ= @@ -335,8 +329,8 @@ github.com/googleapis/gax-go/v2 v2.13.0/go.mod h1:Z/fvTZXF8/uw7Xu5GuslPw+bplx6SS 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= -github.com/hairyhenderson/go-codeowners v0.6.0 h1:cRCtmNf9Ni1GIeiAAlHX5IEEB2gr61813Kx5JmXxAAk= -github.com/hairyhenderson/go-codeowners v0.6.0/go.mod h1:RFWbGcjlXhRKNezt7AQHmJucY0alk4osN0+RKOsIAa8= +github.com/hairyhenderson/go-codeowners v0.6.1 h1:2OLPpLWFMxkCf9hkYzOexnCGD+kj853OqeoKq7S+9us= +github.com/hairyhenderson/go-codeowners v0.6.1/go.mod h1:RFWbGcjlXhRKNezt7AQHmJucY0alk4osN0+RKOsIAa8= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= From 46e17053c85e61709e2436316b4fc9461e1fcb79 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 14 Nov 2024 08:30:03 +0000 Subject: [PATCH 104/526] build(deps): bump golang.org/x/sync from 0.8.0 to 0.9.0 Bumps [golang.org/x/sync](https://github.com/golang/sync) from 0.8.0 to 0.9.0. - [Commits](https://github.com/golang/sync/compare/v0.8.0...v0.9.0) --- updated-dependencies: - dependency-name: golang.org/x/sync 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 1bba42f1b..ba3724b78 100644 --- a/go.mod +++ b/go.mod @@ -78,7 +78,7 @@ require ( golang.org/x/image v0.21.0 golang.org/x/mod v0.21.0 golang.org/x/net v0.30.0 - golang.org/x/sync v0.8.0 + golang.org/x/sync v0.9.0 golang.org/x/text v0.19.0 golang.org/x/tools v0.26.0 google.golang.org/api v0.191.0 diff --git a/go.sum b/go.sum index 6a52dae25..814fa1221 100644 --- a/go.sum +++ b/go.sum @@ -623,8 +623,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.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= -golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.9.0 h1:fEo0HyrW1GIgZdpbhCRO0PkJajUS5H9IFUztCgEo2jQ= +golang.org/x/sync v0.9.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= 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= From ce9cf882a54e9c55dcc7970398ae79c3b251f79e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Thu, 14 Nov 2024 09:43:37 +0100 Subject: [PATCH 105/526] server: Strip ANSI escape codes from browser error log Fixes #13037 --- common/loggers/handlerterminal.go | 24 +++++++++++----- common/loggers/handlerterminal_test.go | 40 ++++++++++++++++++++++++++ common/loggers/logger.go | 4 +-- 3 files changed, 59 insertions(+), 9 deletions(-) create mode 100644 common/loggers/handlerterminal_test.go diff --git a/common/loggers/handlerterminal.go b/common/loggers/handlerterminal.go index 53f6e41da..c5f8fcce8 100644 --- a/common/loggers/handlerterminal.go +++ b/common/loggers/handlerterminal.go @@ -18,18 +18,19 @@ package loggers import ( "fmt" "io" + "regexp" "strings" "sync" "github.com/bep/logg" ) -// newNoColoursHandler creates a new NoColoursHandler -func newNoColoursHandler(outWriter, errWriter io.Writer, noLevelPrefix bool, predicate func(*logg.Entry) bool) *noColoursHandler { +// newNoAnsiEscapeHandler creates a new noAnsiEscapeHandler +func newNoAnsiEscapeHandler(outWriter, errWriter io.Writer, noLevelPrefix bool, predicate func(*logg.Entry) bool) *noAnsiEscapeHandler { if predicate == nil { predicate = func(e *logg.Entry) bool { return true } } - return &noColoursHandler{ + return &noAnsiEscapeHandler{ noLevelPrefix: noLevelPrefix, outWriter: outWriter, errWriter: errWriter, @@ -37,7 +38,7 @@ func newNoColoursHandler(outWriter, errWriter io.Writer, noLevelPrefix bool, pre } } -type noColoursHandler struct { +type noAnsiEscapeHandler struct { mu sync.Mutex outWriter io.Writer // Defaults to os.Stdout. errWriter io.Writer // Defaults to os.Stderr. @@ -45,7 +46,7 @@ type noColoursHandler struct { noLevelPrefix bool } -func (h *noColoursHandler) HandleLog(e *logg.Entry) error { +func (h *noAnsiEscapeHandler) HandleLog(e *logg.Entry) error { if !h.predicate(e) { return nil } @@ -71,10 +72,12 @@ func (h *noColoursHandler) HandleLog(e *logg.Entry) error { prefix = prefix + ": " } + msg := stripANSI(e.Message) + if h.noLevelPrefix { - fmt.Fprintf(w, "%s%s", prefix, e.Message) + fmt.Fprintf(w, "%s%s", prefix, msg) } else { - fmt.Fprintf(w, "%s %s%s", levelString[e.Level], prefix, e.Message) + fmt.Fprintf(w, "%s %s%s", levelString[e.Level], prefix, msg) } for _, field := range e.Fields { @@ -88,3 +91,10 @@ func (h *noColoursHandler) HandleLog(e *logg.Entry) error { return nil } + +var ansiRe = regexp.MustCompile(`\x1b\[[0-9;]*m`) + +// stripANSI removes ANSI escape codes from s. +func stripANSI(s string) string { + return ansiRe.ReplaceAllString(s, "") +} diff --git a/common/loggers/handlerterminal_test.go b/common/loggers/handlerterminal_test.go new file mode 100644 index 000000000..f45ce80df --- /dev/null +++ b/common/loggers/handlerterminal_test.go @@ -0,0 +1,40 @@ +// Copyright 2024 The Hugo Authors. All rights reserved. +// Some functions in this file (see comments) is based on the Go source code, +// copyright The Go Authors and governed by a BSD-style license. +// +// 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 loggers + +import ( + "bytes" + "testing" + + "github.com/bep/logg" + qt "github.com/frankban/quicktest" + "github.com/gohugoio/hugo/common/terminal" +) + +func TestNoAnsiEscapeHandler(t *testing.T) { + c := qt.New(t) + + test := func(s string) { + c.Assert(stripANSI(terminal.Notice(s)), qt.Equals, s) + } + test(`error in "file.md:1:2"`) + + var buf bytes.Buffer + h := newNoAnsiEscapeHandler(&buf, &buf, false, nil) + h.HandleLog(&logg.Entry{Message: terminal.Notice(`error in "file.md:1:2"`), Level: logg.LevelInfo}) + + c.Assert(buf.String(), qt.Equals, "INFO error in \"file.md:1:2\"\n") +} diff --git a/common/loggers/logger.go b/common/loggers/logger.go index 4e2f3ab21..75c8102c7 100644 --- a/common/loggers/logger.go +++ b/common/loggers/logger.go @@ -62,7 +62,7 @@ func New(opts Options) Logger { if terminal.PrintANSIColors(os.Stdout) { logHandler = newDefaultHandler(opts.Stdout, opts.Stderr) } else { - logHandler = newNoColoursHandler(opts.Stdout, opts.Stderr, false, nil) + logHandler = newNoAnsiEscapeHandler(opts.Stdout, opts.Stderr, false, nil) } errorsw := &strings.Builder{} @@ -95,7 +95,7 @@ func New(opts Options) Logger { } if opts.StoreErrors { - h := newNoColoursHandler(io.Discard, errorsw, true, func(e *logg.Entry) bool { + h := newNoAnsiEscapeHandler(io.Discard, errorsw, true, func(e *logg.Entry) bool { return e.Level >= logg.LevelError }) From 588c9019cfdf80cf69b287ea6cd53fd8d7c4ae02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Thu, 14 Nov 2024 10:16:52 +0100 Subject: [PATCH 106/526] deps: Upgrade github.com/yuin/goldmark v1.7.4 => v1.7.8 Closes #12958 --- go.mod | 2 +- go.sum | 2 + markup/goldmark/convert.go | 1 + markup/goldmark/internal/render/context.go | 31 ++++++ markup/goldmark/render_hooks.go | 104 ++++++++++++++++----- 5 files changed, 114 insertions(+), 26 deletions(-) diff --git a/go.mod b/go.mod index ba3724b78..5d3fd9e73 100644 --- a/go.mod +++ b/go.mod @@ -70,7 +70,7 @@ require ( github.com/tdewolff/minify/v2 v2.20.37 github.com/tdewolff/parse/v2 v2.7.15 github.com/tetratelabs/wazero v1.8.1 - github.com/yuin/goldmark v1.7.4 + github.com/yuin/goldmark v1.7.8 github.com/yuin/goldmark-emoji v1.0.4 go.uber.org/automaxprocs v1.5.3 gocloud.dev v0.39.0 diff --git a/go.sum b/go.sum index 814fa1221..84c6452cd 100644 --- a/go.sum +++ b/go.sum @@ -472,6 +472,8 @@ github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5t github.com/yuin/goldmark v1.7.1/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= github.com/yuin/goldmark v1.7.4 h1:BDXOHExt+A7gwPCJgPIIq7ENvceR7we7rOS9TNoLZeg= github.com/yuin/goldmark v1.7.4/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-emoji v1.0.4 h1:vCwMkPZSNefSUnOW2ZKRUjBSD5Ok3W78IXhGxxAEF90= github.com/yuin/goldmark-emoji v1.0.4/go.mod h1:tTkZEbwu5wkPmgTcitqddVxY9osFZiavD+r4AzQrh1U= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= diff --git a/markup/goldmark/convert.go b/markup/goldmark/convert.go index ea3bbc4ae..823a43c9d 100644 --- a/markup/goldmark/convert.go +++ b/markup/goldmark/convert.go @@ -43,6 +43,7 @@ import ( ) const ( + // Don't change this. This pattern is lso used in the image render hooks. internalAttrPrefix = "_h__" ) diff --git a/markup/goldmark/internal/render/context.go b/markup/goldmark/internal/render/context.go index b8cf9ba54..cd64fc944 100644 --- a/markup/goldmark/internal/render/context.go +++ b/markup/goldmark/internal/render/context.go @@ -16,9 +16,13 @@ package render import ( "bytes" "math/bits" + "strings" "sync" + bp "github.com/gohugoio/hugo/bufferpool" + htext "github.com/gohugoio/hugo/common/text" + "github.com/gohugoio/hugo/tpl" "github.com/gohugoio/hugo/markup/converter" "github.com/gohugoio/hugo/markup/converter/hooks" @@ -258,3 +262,30 @@ func (c *hookBase) Position() htext.Position { func (c *hookBase) PositionerSourceTarget() []byte { return c.getSourceSample() } + +// TextPlain returns a plain text representation of the given node. +// Goldmark's Node.Text was deprecated in 1.7.8. +func TextPlain(n ast.Node, source []byte) string { + buf := bp.GetBuffer() + defer bp.PutBuffer(buf) + + for c := n.FirstChild(); c != nil; c = c.NextSibling() { + textPlainTo(c, source, buf) + } + return buf.String() +} + +func textPlainTo(c ast.Node, source []byte, buf *bytes.Buffer) { + if c == nil { + return + } + switch c := c.(type) { + case *ast.RawHTML: + s := strings.TrimSpace(tpl.StripHTML(string(c.Segments.Value(source)))) + buf.WriteString(s) + case *ast.Text: + buf.Write(c.Segment.Value(source)) + default: + textPlainTo(c.FirstChild(), source, buf) + } +} diff --git a/markup/goldmark/render_hooks.go b/markup/goldmark/render_hooks.go index bacb41a37..12cf00455 100644 --- a/markup/goldmark/render_hooks.go +++ b/markup/goldmark/render_hooks.go @@ -200,7 +200,7 @@ func (r *hookedRenderer) renderImage(w util.BufWriter, source []byte, node ast.N destination: string(n.Destination), title: string(n.Title), text: hstring.HTML(text), - plainText: string(n.Text(source)), + plainText: render.TextPlain(n, source), AttributesHolder: attributes.New(attrs, attributes.AttributesOwnerGeneral), }, ordinal: ordinal, @@ -223,7 +223,7 @@ func (r *hookedRenderer) filterInternalAttributes(attrs []ast.Attribute) []ast.A } // Fall back to the default Goldmark render funcs. Method below borrowed from: -// https://github.com/yuin/goldmark/blob/b611cd333a492416b56aa8d94b04a67bf0096ab2/renderer/html/html.go#L404 +// https://github.com/yuin/goldmark func (r *hookedRenderer) renderImageDefault(w util.BufWriter, source []byte, node ast.Node, entering bool) (ast.WalkStatus, error) { if !entering { return ast.WalkContinue, nil @@ -234,7 +234,7 @@ func (r *hookedRenderer) renderImageDefault(w util.BufWriter, source []byte, nod _, _ = w.Write(util.EscapeHTML(util.URLEscape(n.Destination, true))) } _, _ = w.WriteString(`" alt="`) - _, _ = w.Write(nodeToHTMLText(n, source)) + r.renderTexts(w, source, n) _ = w.WriteByte('"') if n.Title != nil { _, _ = w.WriteString(` title="`) @@ -242,8 +242,7 @@ func (r *hookedRenderer) renderImageDefault(w util.BufWriter, source []byte, nod _ = w.WriteByte('"') } if n.Attributes() != nil { - attrs := r.filterInternalAttributes(n.Attributes()) - attributes.RenderASTAttributes(w, attrs...) + html.RenderAttributes(w, n, html.ImageAttributeFilter) } if r.XHTML { _, _ = w.WriteString(" />") @@ -289,7 +288,7 @@ func (r *hookedRenderer) renderLink(w util.BufWriter, source []byte, node ast.No destination: string(n.Destination), title: string(n.Title), text: hstring.HTML(text), - plainText: string(n.Text(source)), + plainText: render.TextPlain(n, source), AttributesHolder: attributes.Empty, }, ) @@ -297,6 +296,79 @@ func (r *hookedRenderer) renderLink(w util.BufWriter, source []byte, node ast.No return ast.WalkContinue, err } +// Borrowed from Goldmark's HTML renderer. +func (r *hookedRenderer) renderTexts(w util.BufWriter, source []byte, n ast.Node) { + for c := n.FirstChild(); c != nil; c = c.NextSibling() { + if s, ok := c.(*ast.String); ok { + _, _ = r.renderString(w, source, s, true) + } else if t, ok := c.(*ast.Text); ok { + _, _ = r.renderText(w, source, t, true) + } else { + r.renderTexts(w, source, c) + } + } +} + +// Borrowed from Goldmark's HTML renderer. +func (r *hookedRenderer) renderString(w util.BufWriter, source []byte, node ast.Node, entering bool) (ast.WalkStatus, error) { + if !entering { + return ast.WalkContinue, nil + } + n := node.(*ast.String) + if n.IsCode() { + _, _ = w.Write(n.Value) + } else { + if n.IsRaw() { + r.Writer.RawWrite(w, n.Value) + } else { + r.Writer.Write(w, n.Value) + } + } + return ast.WalkContinue, nil +} + +// Borrowed from Goldmark's HTML renderer. +func (r *hookedRenderer) renderText(w util.BufWriter, source []byte, node ast.Node, entering bool) (ast.WalkStatus, error) { + if !entering { + return ast.WalkContinue, nil + } + n := node.(*ast.Text) + segment := n.Segment + if n.IsRaw() { + r.Writer.RawWrite(w, segment.Value(source)) + } else { + value := segment.Value(source) + r.Writer.Write(w, value) + if n.HardLineBreak() || (n.SoftLineBreak() && r.HardWraps) { + if r.XHTML { + _, _ = w.WriteString("
\n") + } else { + _, _ = w.WriteString("
\n") + } + } else if n.SoftLineBreak() { + // TODO(bep) we use these methods a fallback to default rendering when no image/link hooks are defined. + // I don't think the below is relevant in these situations, but if so, we need to create a PR + // upstream to export softLineBreak. + /*if r.EastAsianLineBreaks != html.EastAsianLineBreaksNone && len(value) != 0 { + sibling := node.NextSibling() + if sibling != nil && sibling.Kind() == ast.KindText { + if siblingText := sibling.(*ast.Text).Value(source); len(siblingText) != 0 { + thisLastRune := util.ToRune(value, len(value)-1) + siblingFirstRune, _ := utf8.DecodeRune(siblingText) + if r.EastAsianLineBreaks.softLineBreak(thisLastRune, siblingFirstRune) { + _ = w.WriteByte('\n') + } + } + } + } else { + _ = w.WriteByte('\n') + }*/ + _ = w.WriteByte('\n') + } + } + return ast.WalkContinue, nil +} + // Fall back to the default Goldmark render funcs. Method below borrowed from: // https://github.com/yuin/goldmark/blob/b611cd333a492416b56aa8d94b04a67bf0096ab2/renderer/html/html.go#L404 func (r *hookedRenderer) renderLinkDefault(w util.BufWriter, source []byte, node ast.Node, entering bool) (ast.WalkStatus, error) { @@ -443,7 +515,7 @@ func (r *hookedRenderer) renderHeading(w util.BufWriter, source []byte, node ast level: n.Level, anchor: string(anchor), text: hstring.HTML(text), - plainText: string(n.Text(source)), + plainText: render.TextPlain(n, source), AttributesHolder: attributes.New(n.Attributes(), attributes.AttributesOwnerGeneral), }, ) @@ -478,21 +550,3 @@ func (e *links) Extend(m goldmark.Markdown) { util.Prioritized(newLinkRenderer(e.cfg), 100), )) } - -// Borrowed from Goldmark. -func nodeToHTMLText(n ast.Node, source []byte) []byte { - var buf bytes.Buffer - for c := n.FirstChild(); c != nil; c = c.NextSibling() { - if s, ok := c.(*ast.String); ok && s.IsCode() { - buf.Write(s.Text(source)) - } else if !c.HasChildren() { - buf.Write(util.EscapeHTML(c.Text(source))) - if t, ok := c.(*ast.Text); ok && t.SoftLineBreak() { - buf.WriteByte('\n') - } - } else { - buf.Write(nodeToHTMLText(c, source)) - } - } - return buf.Bytes() -} From 23d21b0d16fa03c29f769bd3a13f705c69deb732 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 14 Nov 2024 13:03:30 +0100 Subject: [PATCH 107/526] Preserve input type. --- common/math/math.go | 46 +++++++++++++++++++--------------------- common/math/math_test.go | 11 +++++++--- 2 files changed, 30 insertions(+), 27 deletions(-) diff --git a/common/math/math.go b/common/math/math.go index d4e2c1148..f88fbcd9c 100644 --- a/common/math/math.go +++ b/common/math/math.go @@ -26,29 +26,32 @@ func DoArithmetic(a, b any, op rune) (any, error) { var ai, bi int64 var af, bf float64 var au, bu uint64 + var isInt, isFloat, isUint bool switch av.Kind() { case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: ai = av.Int() switch bv.Kind() { case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + isInt = true bi = bv.Int() case reflect.Float32, reflect.Float64: + isFloat = true af = float64(ai) // may overflow - ai = 0 bf = bv.Float() case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: bu = bv.Uint() if ai >= 0 { + isUint = true au = uint64(ai) - ai = 0 } else { + isInt = true bi = int64(bu) // may overflow - bu = 0 } default: return nil, errors.New("can't apply the operator to the values") } case reflect.Float32, reflect.Float64: + isFloat = true af = av.Float() switch bv.Kind() { case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: @@ -66,17 +69,18 @@ func DoArithmetic(a, b any, op rune) (any, error) { case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: bi = bv.Int() if bi >= 0 { + isUint = true bu = uint64(bi) - bi = 0 } else { + isInt = true ai = int64(au) // may overflow - au = 0 } case reflect.Float32, reflect.Float64: + isFloat = true af = float64(au) // may overflow - au = 0 bf = bv.Float() case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + isUint = true bu = bv.Uint() default: return nil, errors.New("can't apply the operator to the values") @@ -94,38 +98,32 @@ func DoArithmetic(a, b any, op rune) (any, error) { switch op { case '+': - if ai != 0 || bi != 0 { + if isInt { return ai + bi, nil - } else if af != 0 || bf != 0 { + } else if isFloat { return af + bf, nil - } else if au != 0 || bu != 0 { - return au + bu, nil } - return 0, nil + return au + bu, nil case '-': - if ai != 0 || bi != 0 { + if isInt { return ai - bi, nil - } else if af != 0 || bf != 0 { + } else if isFloat { return af - bf, nil - } else if au != 0 || bu != 0 { - return au - bu, nil } - return 0, nil + return au - bu, nil case '*': - if ai != 0 || bi != 0 { + if isInt { return ai * bi, nil - } else if af != 0 || bf != 0 { + } else if isFloat { return af * bf, nil - } else if au != 0 || bu != 0 { - return au * bu, nil } - return 0, nil + return au * bu, nil case '/': - if bi != 0 { + if isInt && bi != 0 { return ai / bi, nil - } else if bf != 0 { + } else if isFloat && bf != 0 { return af / bf, nil - } else if bu != 0 { + } else if isUint && bu != 0 { return au / bu, nil } return nil, errors.New("can't divide the value by 0") diff --git a/common/math/math_test.go b/common/math/math_test.go index 89e391ce0..d75d30a69 100644 --- a/common/math/math_test.go +++ b/common/math/math_test.go @@ -30,10 +30,12 @@ func TestDoArithmetic(t *testing.T) { expect any }{ {3, 2, '+', int64(5)}, + {0, 0, '+', int64(0)}, {3, 2, '-', int64(1)}, {3, 2, '*', int64(6)}, {3, 2, '/', int64(1)}, {3.0, 2, '+', float64(5)}, + {0.0, 0, '+', float64(0.0)}, {3.0, 2, '-', float64(1)}, {3.0, 2, '*', float64(6)}, {3.0, 2, '/', float64(1.5)}, @@ -42,18 +44,22 @@ func TestDoArithmetic(t *testing.T) { {3, 2.0, '*', float64(6)}, {3, 2.0, '/', float64(1.5)}, {3.0, 2.0, '+', float64(5)}, + {0.0, 0.0, '+', float64(0.0)}, {3.0, 2.0, '-', float64(1)}, {3.0, 2.0, '*', float64(6)}, {3.0, 2.0, '/', float64(1.5)}, {uint(3), uint(2), '+', uint64(5)}, + {uint(0), uint(0), '+', uint64(0)}, {uint(3), uint(2), '-', uint64(1)}, {uint(3), uint(2), '*', uint64(6)}, {uint(3), uint(2), '/', uint64(1)}, {uint(3), 2, '+', uint64(5)}, + {uint(0), 0, '+', uint64(0)}, {uint(3), 2, '-', uint64(1)}, {uint(3), 2, '*', uint64(6)}, {uint(3), 2, '/', uint64(1)}, {3, uint(2), '+', uint64(5)}, + {0, uint(0), '+', uint64(0)}, {3, uint(2), '-', uint64(1)}, {3, uint(2), '*', uint64(6)}, {3, uint(2), '/', uint64(1)}, @@ -66,16 +72,15 @@ func TestDoArithmetic(t *testing.T) { {-3, uint(2), '*', int64(-6)}, {-3, uint(2), '/', int64(-1)}, {uint(3), 2.0, '+', float64(5)}, + {uint(0), 0.0, '+', float64(0)}, {uint(3), 2.0, '-', float64(1)}, {uint(3), 2.0, '*', float64(6)}, {uint(3), 2.0, '/', float64(1.5)}, {3.0, uint(2), '+', float64(5)}, + {0.0, uint(0), '+', float64(0)}, {3.0, uint(2), '-', float64(1)}, {3.0, uint(2), '*', float64(6)}, {3.0, uint(2), '/', float64(1.5)}, - {0, 0, '+', 0}, - {0, 0, '-', 0}, - {0, 0, '*', 0}, {"foo", "bar", '+', "foobar"}, {3, 0, '/', false}, {3.0, 0, '/', false}, From ac6962d28432f7ec14e8bf541be4a96f66098559 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Thu, 14 Nov 2024 15:18:27 +0100 Subject: [PATCH 108/526] commands: Add -O flag to server to open browser Fixes #13040 --- commands/server.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/commands/server.go b/commands/server.go index 6b801b158..c2fee68b2 100644 --- a/commands/server.go +++ b/commands/server.go @@ -40,6 +40,7 @@ import ( "time" "github.com/bep/mclib" + "github.com/pkg/browser" "github.com/bep/debounce" "github.com/bep/simplecobra" @@ -448,6 +449,7 @@ type serverCommand struct { // Flags. renderStaticToDisk bool navigateToChanged bool + openBrowser bool serverAppend bool serverInterface string tlsCertFile string @@ -539,6 +541,7 @@ of a second, you will be able to save and see your changes nearly instantly.` cmd.Flags().BoolVarP(&c.serverAppend, "appendPort", "", true, "append port to baseURL") cmd.Flags().BoolVar(&c.disableLiveReload, "disableLiveReload", false, "watch without enabling live browser reload on rebuild") cmd.Flags().BoolVarP(&c.navigateToChanged, "navigateToChanged", "N", false, "navigate to changed content file on live browser reload") + cmd.Flags().BoolVarP(&c.openBrowser, "openBrowser", "O", false, "open the site in a browser after server startup") cmd.Flags().BoolVar(&c.renderStaticToDisk, "renderStaticToDisk", false, "serve static files from disk and dynamic files from memory") cmd.Flags().BoolVar(&c.disableFastRender, "disableFastRender", false, "enables full re-renders on changes") cmd.Flags().BoolVar(&c.disableBrowserError, "disableBrowserError", false, "do not show build errors in the browser") @@ -998,6 +1001,13 @@ func (c *serverCommand) serve() error { c.r.Println("Press Ctrl+C to stop") + if c.openBrowser { + // There may be more than one baseURL in multihost mode, open the first. + if err := browser.OpenURL(baseURLs[0].String()); err != nil { + c.r.logger.Warnf("Failed to open browser: %s", err) + } + } + err = func() error { for { select { From 58a3c91a7f24365584f84b0a4eecb8c2cb7d5c6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Thu, 14 Nov 2024 16:10:38 +0100 Subject: [PATCH 109/526] docs: Regenerate CLI docs --- docs/content/en/commands/hugo_server.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/content/en/commands/hugo_server.md b/docs/content/en/commands/hugo_server.md index b79b7f374..c716c304f 100644 --- a/docs/content/en/commands/hugo_server.md +++ b/docs/content/en/commands/hugo_server.md @@ -54,6 +54,7 @@ hugo server [command] [flags] --noChmod don't sync permission mode of files --noHTTPCache prevent HTTP caching --noTimes don't sync modification time of files + -O, --openBrowser open the site in a browser after server startup --panicOnWarning panic on first WARNING log --poll string set this to a poll interval, e.g --poll 700ms, to use a poll based approach to watch for file system changes -p, --port int port on which the server will listen (default 1313) From 5e3133a7d8a8cbfe7015fbd446fdeb04d1902605 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Thu, 14 Nov 2024 16:45:21 +0100 Subject: [PATCH 110/526] Run go mod tidy --- go.mod | 2 +- go.sum | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 5d3fd9e73..b12a889a9 100644 --- a/go.mod +++ b/go.mod @@ -60,6 +60,7 @@ require ( github.com/olekukonko/tablewriter v0.0.5 github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 github.com/pelletier/go-toml/v2 v2.2.3 + github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c github.com/rogpeppe/go-internal v1.13.1 github.com/sanity-io/litter v1.5.5 github.com/spf13/afero v1.11.0 @@ -145,7 +146,6 @@ require ( github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 // indirect github.com/perimeterx/marshmallow v1.1.5 // indirect - github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect github.com/pkg/errors v0.9.1 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect go.opencensus.io v0.24.0 // indirect diff --git a/go.sum b/go.sum index 84c6452cd..fcd88e55a 100644 --- a/go.sum +++ b/go.sum @@ -470,8 +470,6 @@ 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.4 h1:BDXOHExt+A7gwPCJgPIIq7ENvceR7we7rOS9TNoLZeg= -github.com/yuin/goldmark v1.7.4/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-emoji v1.0.4 h1:vCwMkPZSNefSUnOW2ZKRUjBSD5Ok3W78IXhGxxAEF90= From 33e964d40b4bce03a55671dae2cbd4c8a82c74fe Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 15 Nov 2024 08:05:22 +0000 Subject: [PATCH 111/526] build(deps): bump golang.org/x/image from 0.21.0 to 0.22.0 Bumps [golang.org/x/image](https://github.com/golang/image) from 0.21.0 to 0.22.0. - [Commits](https://github.com/golang/image/compare/v0.21.0...v0.22.0) --- updated-dependencies: - dependency-name: golang.org/x/image 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 b12a889a9..417ae934f 100644 --- a/go.mod +++ b/go.mod @@ -76,11 +76,11 @@ require ( go.uber.org/automaxprocs v1.5.3 gocloud.dev v0.39.0 golang.org/x/exp v0.0.0-20221031165847-c99f073a8326 - golang.org/x/image v0.21.0 + golang.org/x/image v0.22.0 golang.org/x/mod v0.21.0 golang.org/x/net v0.30.0 golang.org/x/sync v0.9.0 - golang.org/x/text v0.19.0 + golang.org/x/text v0.20.0 golang.org/x/tools v0.26.0 google.golang.org/api v0.191.0 gopkg.in/yaml.v2 v2.4.0 diff --git a/go.sum b/go.sum index fcd88e55a..91bf20425 100644 --- a/go.sum +++ b/go.sum @@ -526,8 +526,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.21.0 h1:c5qV36ajHpdj4Qi0GnE0jUc/yuo33OLFaa0d+crTD5s= -golang.org/x/image v0.21.0/go.mod h1:vUbsLavqK/W303ZroQQVKQ+Af3Yl6Uz1Ppu5J/cLz78= +golang.org/x/image v0.22.0 h1:UtK5yLUzilVrkjMAZAZ34DXGpASN8i8pj8g+O+yd10g= +golang.org/x/image v0.22.0/go.mod h1:9hPFhljd4zZ1GNSIZJ49sqbp45GKK9t6w+iXvGqZUz4= 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= @@ -692,8 +692,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.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= -golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug= +golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4= 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 7921777da16d8228f1cb3144b31606b7ccd8758c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 15 Nov 2024 08:04:55 +0000 Subject: [PATCH 112/526] build(deps): bump github.com/fatih/color from 1.17.0 to 1.18.0 Bumps [github.com/fatih/color](https://github.com/fatih/color) from 1.17.0 to 1.18.0. - [Release notes](https://github.com/fatih/color/releases) - [Commits](https://github.com/fatih/color/compare/v1.17.0...v1.18.0) --- updated-dependencies: - dependency-name: github.com/fatih/color 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 417ae934f..bac210042 100644 --- a/go.mod +++ b/go.mod @@ -28,7 +28,7 @@ require ( github.com/disintegration/gift v1.2.1 github.com/dustin/go-humanize v1.0.1 github.com/evanw/esbuild v0.24.0 - github.com/fatih/color v1.17.0 + github.com/fatih/color v1.18.0 github.com/fortytw2/leaktest v1.3.0 github.com/frankban/quicktest v1.14.6 github.com/fsnotify/fsnotify v1.7.0 diff --git a/go.sum b/go.sum index 91bf20425..2ed8cd7bd 100644 --- a/go.sum +++ b/go.sum @@ -191,8 +191,8 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.m github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/evanw/esbuild v0.24.0 h1:GZ78naTLp7FKr+K7eNuM/SLs5maeiHYRPsTg6kmdsSE= github.com/evanw/esbuild v0.24.0/go.mod h1:D2vIQZqV/vIf/VRHtViaUtViZmG7o+kKmlBfVQuRi48= -github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4= -github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI= +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= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= From 7a2f04ee8c3de43f9cc8e0a71fca838125878f8c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 15 Nov 2024 08:05:19 +0000 Subject: [PATCH 113/526] build(deps): bump github.com/tdewolff/minify/v2 from 2.20.37 to 2.21.1 Bumps [github.com/tdewolff/minify/v2](https://github.com/tdewolff/minify) from 2.20.37 to 2.21.1. - [Release notes](https://github.com/tdewolff/minify/releases) - [Commits](https://github.com/tdewolff/minify/compare/v2.20.37...v2.21.1) --- updated-dependencies: - dependency-name: github.com/tdewolff/minify/v2 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 bac210042..54cfa4353 100644 --- a/go.mod +++ b/go.mod @@ -68,8 +68,8 @@ require ( github.com/spf13/cobra v1.8.1 github.com/spf13/fsync v0.10.1 github.com/spf13/pflag v1.0.5 - github.com/tdewolff/minify/v2 v2.20.37 - github.com/tdewolff/parse/v2 v2.7.15 + github.com/tdewolff/minify/v2 v2.21.1 + github.com/tdewolff/parse/v2 v2.7.18 github.com/tetratelabs/wazero v1.8.1 github.com/yuin/goldmark v1.7.8 github.com/yuin/goldmark-emoji v1.0.4 diff --git a/go.sum b/go.sum index 2ed8cd7bd..c64b6fb9f 100644 --- a/go.sum +++ b/go.sum @@ -452,10 +452,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.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.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/minify/v2 v2.21.1 h1:AAf5iltw6+KlUvjRNPAPrANIXl3XEJNBBzuZom5iCAM= +github.com/tdewolff/minify/v2 v2.21.1/go.mod h1:PoqFH8ugcuTUvKqVM9vOqXw4msxvuhL/DTmV5ZXhSCI= +github.com/tdewolff/parse/v2 v2.7.18 h1:uSqjEMT2lwCj5oifBHDcWU2kN1pbLrRENgFWDJa57eI= +github.com/tdewolff/parse/v2 v2.7.18/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= From 2c54c3298684f502ab23685a0be5da41ff7deeeb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 15 Nov 2024 09:03:34 +0000 Subject: [PATCH 114/526] build(deps): bump golang.org/x/tools from 0.26.0 to 0.27.0 Bumps [golang.org/x/tools](https://github.com/golang/tools) from 0.26.0 to 0.27.0. - [Release notes](https://github.com/golang/tools/releases) - [Commits](https://github.com/golang/tools/compare/v0.26.0...v0.27.0) --- updated-dependencies: - dependency-name: golang.org/x/tools 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 54cfa4353..eeb19b4bb 100644 --- a/go.mod +++ b/go.mod @@ -77,11 +77,11 @@ require ( gocloud.dev v0.39.0 golang.org/x/exp v0.0.0-20221031165847-c99f073a8326 golang.org/x/image v0.22.0 - golang.org/x/mod v0.21.0 - golang.org/x/net v0.30.0 + golang.org/x/mod v0.22.0 + golang.org/x/net v0.31.0 golang.org/x/sync v0.9.0 golang.org/x/text v0.20.0 - golang.org/x/tools v0.26.0 + golang.org/x/tools v0.27.0 google.golang.org/api v0.191.0 gopkg.in/yaml.v2 v2.4.0 ) @@ -154,9 +154,9 @@ require ( go.opentelemetry.io/otel v1.28.0 // indirect go.opentelemetry.io/otel/metric v1.28.0 // indirect go.opentelemetry.io/otel/trace v1.28.0 // indirect - golang.org/x/crypto v0.28.0 // indirect + golang.org/x/crypto v0.29.0 // indirect golang.org/x/oauth2 v0.22.0 // indirect - golang.org/x/sys v0.26.0 // indirect + golang.org/x/sys v0.27.0 // indirect golang.org/x/time v0.6.0 // indirect golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9 // indirect google.golang.org/genproto v0.0.0-20240812133136-8ffd90a71988 // indirect diff --git a/go.sum b/go.sum index c64b6fb9f..6102c4ea2 100644 --- a/go.sum +++ b/go.sum @@ -509,8 +509,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.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw= -golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U= +golang.org/x/crypto v0.29.0 h1:L5SG1JTTXupVV3n6sUqMTeWbjAyfPwoda2DLX8J8FrQ= +golang.org/x/crypto v0.29.0/go.mod h1:+F4F4N5hv6v38hfeYwTdx20oUvLLc+QfrE9Ax9HtgRg= 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= @@ -554,8 +554,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.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0= -golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= +golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= +golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= 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= @@ -595,8 +595,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.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= -golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= +golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo= +golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM= 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= @@ -672,8 +672,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.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= -golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 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= @@ -751,8 +751,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.26.0 h1:v/60pFQmzmT9ExmjDv2gGIfi3OqfKoEP6I5+umXlbnQ= -golang.org/x/tools v0.26.0/go.mod h1:TPVVj70c7JJ3WCazhD8OdXcZg/og+b9+tH/KxylGwH0= +golang.org/x/tools v0.27.0 h1:qEKojBykQkQ4EynWy4S8Weg69NumxKdn40Fce3uc/8o= +golang.org/x/tools v0.27.0/go.mod h1:sUi0ZgbwW9ZPAq26Ekut+weQPR5eIM6GQLQ1Yjm1H0Q= 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 d4de780edc7c6bf1261a424c5d008edbbeeef512 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Sat, 16 Nov 2024 09:56:25 +0100 Subject: [PATCH 115/526] Fix extra newline/paragraphs issue with .RenderShortcodes Fixes #13051 --- hugolib/rendershortcodes_test.go | 59 ++++++++++++++++++-- markup/goldmark/goldmark_integration_test.go | 2 +- markup/goldmark/hugocontext/hugocontext.go | 34 +++++++++++ 3 files changed, 88 insertions(+), 7 deletions(-) diff --git a/hugolib/rendershortcodes_test.go b/hugolib/rendershortcodes_test.go index 0eebf46eb..d8b51d3ed 100644 --- a/hugolib/rendershortcodes_test.go +++ b/hugolib/rendershortcodes_test.go @@ -434,16 +434,16 @@ code_p3 b := TestRunning(t, files, TestOptWarn()) b.AssertNoRenderShortcodesArtifacts() - b.AssertFileContentEquals("public/p1/index.html", "

Content p1 id-1000.

\ncode_p2

Foo.\n

\ncode_p3

\ncode_p1code_p1_2code_p1_3") + b.AssertFileContentEquals("public/p1/index.html", "

Content p1 id-1000.

\ncode_p2

Foo.

\ncode_p3code_p1code_p1_2code_p1_3") b.EditFileReplaceAll("content/p1.md", "id-1000.", "id-100.").Build() b.AssertNoRenderShortcodesArtifacts() - b.AssertFileContentEquals("public/p1/index.html", "

Content p1 id-100.

\ncode_p2

Foo.\n

\ncode_p3

\ncode_p1code_p1_2code_p1_3") + b.AssertFileContentEquals("public/p1/index.html", "

Content p1 id-100.

\ncode_p2

Foo.

\ncode_p3code_p1code_p1_2code_p1_3") b.EditFileReplaceAll("content/p2.md", "code_p2", "codep2").Build() b.AssertNoRenderShortcodesArtifacts() - b.AssertFileContentEquals("public/p1/index.html", "

Content p1 id-100.

\ncodep2

Foo.\n

\ncode_p3

\ncode_p1code_p1_2code_p1_3") + b.AssertFileContentEquals("public/p1/index.html", "

Content p1 id-100.

\ncodep2

Foo.

\ncode_p3code_p1code_p1_2code_p1_3") b.EditFileReplaceAll("content/p3.md", "code_p3", "code_p3_edited").Build() b.AssertNoRenderShortcodesArtifacts() - b.AssertFileContentEquals("public/p1/index.html", "

Content p1 id-100.

\ncodep2

Foo.\n

\ncode_p3_edited

\ncode_p1code_p1_2code_p1_3") + b.AssertFileContentEquals("public/p1/index.html", "

Content p1 id-100.

\ncodep2

Foo.

\ncode_p3_editedcode_p1code_p1_2code_p1_3") } // Issue 13004. @@ -475,8 +475,55 @@ This is some **markup**. ` b := TestRunning(t, files) b.AssertNoRenderShortcodesArtifacts() - b.AssertFileContentEquals("public/first/p1/index.html", "

p1-h1

\n

\n

p2-h1

\n

This is some markup.\n

\n") + b.AssertFileContentEquals("public/first/p1/index.html", "

p1-h1

\n

p2-h1

\n

This is some markup.

\n") b.EditFileReplaceAll("content/second/p2.md", "p2-h1", "p2-h1-edited").Build() b.AssertNoRenderShortcodesArtifacts() - b.AssertFileContentEquals("public/first/p1/index.html", "

p1-h1

\n

\n

p2-h1-edited

\n

This is some markup.\n

\n") + b.AssertFileContentEquals("public/first/p1/index.html", "

p1-h1

\n

p2-h1-edited

\n

This is some markup.

\n") +} + +// Issue 13051. +func TestRenderShortcodesEmptyParagraph(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +disableKinds = ['section','rss','sitemap','taxonomy','term'] +-- layouts/_default/home.html -- +{{ .Content }} +-- layouts/_default/single.html -- +{{ .Content }} +-- layouts/shortcodes/include.html -- + {{ with site.GetPage (.Get 0) }} + {{ .RenderShortcodes }} +{{ end }} +-- content/_index.md -- +--- +title: home +--- + +a + +{{% include "/snippet" %}} + +b + +-- content/snippet.md -- +--- +title: snippet +build: + render: never + list: never +--- + +_emphasized_ + +not emphasized + +` + + b := Test(t, files) + b.AssertNoRenderShortcodesArtifacts() + b.AssertFileContentEquals("public/index.html", + "

a

\n

emphasized

\n

not emphasized

\n

b

\n", + ) } diff --git a/markup/goldmark/goldmark_integration_test.go b/markup/goldmark/goldmark_integration_test.go index 794f34150..591226dc2 100644 --- a/markup/goldmark/goldmark_integration_test.go +++ b/markup/goldmark/goldmark_integration_test.go @@ -575,7 +575,7 @@ sc3_begin|{{ .Inner }}|sc3_end // Issue #7332 ":x:\n", // Issue #11587 - "

✔️\n

", + "

✔️

", // Should not be converted to emoji "sc1_begin|:smiley:|sc1_end", // Should be converted to emoji diff --git a/markup/goldmark/hugocontext/hugocontext.go b/markup/goldmark/hugocontext/hugocontext.go index b1f149d0b..601014b37 100644 --- a/markup/goldmark/hugocontext/hugocontext.go +++ b/markup/goldmark/hugocontext/hugocontext.go @@ -242,6 +242,39 @@ func (r *hugoContextRenderer) handleHugoContext(w util.BufWriter, source []byte, return ast.WalkContinue, nil } +type hugoContextTransformer struct{} + +var _ parser.ASTTransformer = (*hugoContextTransformer)(nil) + +func (a *hugoContextTransformer) Transform(n *ast.Document, reader text.Reader, pc parser.Context) { + ast.Walk(n, func(n ast.Node, entering bool) (ast.WalkStatus, error) { + s := ast.WalkContinue + if !entering || n.Kind() != kindHugoContext { + return s, nil + } + + if p, ok := n.Parent().(*ast.Paragraph); ok { + if p.ChildCount() == 1 { + // Avoid empty paragraphs. + p.Parent().ReplaceChild(p.Parent(), p, n) + } else { + if t, ok := n.PreviousSibling().(*ast.Text); ok { + // Remove the newline produced by the Hugo context markers. + if t.SoftLineBreak() { + if t.Segment.Len() == 0 { + p.RemoveChild(p, t) + } else { + t.SetSoftLineBreak(false) + } + } + } + } + } + + return s, nil + }) +} + type hugoContextExtension struct { logger loggers.Logger } @@ -251,6 +284,7 @@ func (a *hugoContextExtension) Extend(m goldmark.Markdown) { parser.WithInlineParsers( util.Prioritized(&hugoContextParser{}, 50), ), + parser.WithASTTransformers(util.Prioritized(&hugoContextTransformer{}, 10)), ) m.Renderer().AddOptions( From f7fc6ccd59e6ca1e784cba3d9133640b02fa6d20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Sat, 16 Nov 2024 18:29:13 +0100 Subject: [PATCH 116/526] release: Add missing withdeploy archive for arm64 Linux Closes #13029 --- hugoreleaser.toml | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/hugoreleaser.toml b/hugoreleaser.toml index 2cb8e3665..c5b7910bd 100644 --- a/hugoreleaser.toml +++ b/hugoreleaser.toml @@ -154,6 +154,23 @@ archive_alias_replacements = { "linux-amd64.tar.gz" = "Linux-64bit.tar.gz" } [[builds.os.archs]] goarch = "arm64" +[[builds]] + path = "container2/linux/extended-withdeploy" + + [builds.build_settings] + flags = ["-buildmode", "exe", "-tags", "extended,withdeploy"] + + [[builds.os]] + goos = "linux" + [builds.os.build_settings] + env = [ + "CGO_ENABLED=1", + "CC=aarch64-linux-gnu-gcc", + "CXX=aarch64-linux-gnu-g++", + ] + [[builds.os.archs]] + goarch = "arm64" + [[builds]] path = "container1/windows/regular" @@ -215,10 +232,13 @@ archive_alias_replacements = { "linux-amd64.tar.gz" = "Linux-64bit.tar.gz" } [archives.archive_settings] name_template = "{{ .Project }}_extended_withdeploy_{{ .Tag | trimPrefix `v` }}_{{ .Goos }}-{{ .Goarch }}" [[archives]] - # Only extended builds in container2. - paths = ["builds/container2/**"] + paths = ["builds/container2/*/extended/**"] [archives.archive_settings] name_template = "{{ .Project }}_extended_{{ .Tag | trimPrefix `v` }}_{{ .Goos }}-{{ .Goarch }}" +[[archives]] + paths = ["builds/container2/*/extended-withdeploy/**"] + [archives.archive_settings] + name_template = "{{ .Project }}_extended_withdeploy_{{ .Tag | trimPrefix `v` }}_{{ .Goos }}-{{ .Goarch }}" [[archives]] paths = ["builds/**/windows/regular/**"] [archives.archive_settings.type] From ad43d137d5382836ed7b173bd33ccac4b19a0e8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Sat, 16 Nov 2024 17:58:06 +0100 Subject: [PATCH 117/526] Remove deprecations <= v0.122.0 (note) These have, once we release this, been logging ERROR for 6 minor versions. --- commands/commandeer.go | 16 --------- common/hugo/hugo_test.go | 4 +++ config/allconfig/allconfig.go | 19 ++--------- hugolib/page__common.go | 1 - hugolib/page__meta.go | 18 ---------- hugolib/page__new.go | 1 - hugolib/site.go | 26 -------------- resources/page/page.go | 11 ------ resources/page/page_nop.go | 22 ------------ resources/page/site.go | 53 ----------------------------- resources/page/testhelpers_test.go | 22 ------------ source/fileInfo.go | 7 ---- tpl/collections/collections.go | 49 -------------------------- tpl/collections/collections_test.go | 33 ------------------ tpl/collections/init.go | 5 --- tpl/lang/lang.go | 7 ---- 16 files changed, 7 insertions(+), 287 deletions(-) diff --git a/commands/commandeer.go b/commands/commandeer.go index 69077ad73..bb82ec654 100644 --- a/commands/commandeer.go +++ b/commands/commandeer.go @@ -39,7 +39,6 @@ import ( "github.com/gohugoio/hugo/common/hstrings" "github.com/gohugoio/hugo/common/htime" - "github.com/gohugoio/hugo/common/hugo" "github.com/gohugoio/hugo/common/loggers" "github.com/gohugoio/hugo/common/paths" "github.com/gohugoio/hugo/common/types" @@ -141,8 +140,6 @@ type rootCommand struct { logLevel string - verbose bool - debug bool quiet bool devMode bool // Hidden flag. @@ -482,17 +479,6 @@ func (r *rootCommand) createLogger(running bool) (loggers.Logger, error) { default: return nil, fmt.Errorf("invalid log level: %q, must be one of debug, warn, info or error", r.logLevel) } - } else { - if r.verbose { - hugo.Deprecate("--verbose", "use --logLevel info", "v0.114.0") - hugo.Deprecate("--verbose", "use --logLevel info", "v0.114.0") - level = logg.LevelInfo - } - - if r.debug { - hugo.Deprecate("--debug", "use --logLevel debug", "v0.114.0") - level = logg.LevelDebug - } } } @@ -560,8 +546,6 @@ Complete documentation is available at https://gohugo.io/.` cmd.PersistentFlags().BoolVar(&r.quiet, "quiet", false, "build in quiet mode") cmd.PersistentFlags().BoolVarP(&r.renderToMemory, "renderToMemory", "M", false, "render to memory (mostly useful when running the server)") - cmd.PersistentFlags().BoolVarP(&r.verbose, "verbose", "v", false, "verbose output") - cmd.PersistentFlags().BoolVarP(&r.debug, "debug", "", false, "debug output") cmd.PersistentFlags().BoolVarP(&r.devMode, "devMode", "", false, "only used for internal testing, flag hidden.") cmd.PersistentFlags().StringVar(&r.logLevel, "logLevel", "", "log level (debug|info|warn|error)") _ = cmd.RegisterFlagCompletionFunc("logLevel", cobra.FixedCompletions([]string{"debug", "info", "warn", "error"}, cobra.ShellCompDirectiveNoFileComp)) diff --git a/common/hugo/hugo_test.go b/common/hugo/hugo_test.go index 241d8c0ae..feb52075d 100644 --- a/common/hugo/hugo_test.go +++ b/common/hugo/hugo_test.go @@ -63,6 +63,10 @@ func TestDeprecationLogLevelFromVersion(t *testing.T) { c.Assert(deprecationLogLevelFromVersion(ver.String()), qt.Equals, logg.LevelWarn) ver.Minor -= 6 c.Assert(deprecationLogLevelFromVersion(ver.String()), qt.Equals, logg.LevelError) + + // Added just to find the threshold for where we can remove deprecated items. + // Subtract 5 from the minor version of the first ERRORed version => 0.122.0. + c.Assert(deprecationLogLevelFromVersion("0.127.0"), qt.Equals, logg.LevelError) } func TestMarkupScope(t *testing.T) { diff --git a/config/allconfig/allconfig.go b/config/allconfig/allconfig.go index 35517ece2..b158d8a90 100644 --- a/config/allconfig/allconfig.go +++ b/config/allconfig/allconfig.go @@ -888,30 +888,17 @@ func fromLoadConfigResult(fs afero.Fs, logger loggers.Logger, res config.LoadCon var differentRootKeys []string switch x := v.(type) { case maps.Params: - var params maps.Params - pv, found := x["params"] - if found { - params = pv.(maps.Params) - } else { - params = maps.Params{ + _, found := x["params"] + if !found { + x["params"] = maps.Params{ maps.MergeStrategyKey: maps.ParamsMergeStrategyDeep, } - x["params"] = params } for kk, vv := range x { if kk == "_merge" { continue } - if kk != maps.MergeStrategyKey && !configLanguageKeys[kk] { - // This should have been placed below params. - // We accidentally allowed it in the past, so we need to support it a little longer, - // But log a warning. - if _, found := params[kk]; !found { - hugo.Deprecate(fmt.Sprintf("config: languages.%s.%s: custom params on the language top level", k, kk), fmt.Sprintf("Put the value below [languages.%s.params]. See https://gohugo.io/content-management/multilingual/#changes-in-hugo-01120", k), "v0.112.0") - params[kk] = vv - } - } if kk == "baseurl" { // baseURL configure don the language level is a multihost setup. isMultihost = true diff --git a/hugolib/page__common.go b/hugolib/page__common.go index 55465e214..a120849b3 100644 --- a/hugolib/page__common.go +++ b/hugolib/page__common.go @@ -57,7 +57,6 @@ type pageCommon struct { // All of these represents the common parts of a page.Page navigation.PageMenusProvider - page.AuthorProvider page.AlternativeOutputFormatsProvider page.ChildCareProvider page.FileProvider diff --git a/hugolib/page__meta.go b/hugolib/page__meta.go index 97a716b43..07d9d1c0e 100644 --- a/hugolib/page__meta.go +++ b/hugolib/page__meta.go @@ -32,7 +32,6 @@ import ( "github.com/gohugoio/hugo/common/constants" "github.com/gohugoio/hugo/common/hashing" - "github.com/gohugoio/hugo/common/hugo" "github.com/gohugoio/hugo/common/loggers" "github.com/gohugoio/hugo/common/maps" "github.com/gohugoio/hugo/common/paths" @@ -108,23 +107,6 @@ func (p *pageMeta) Aliases() []string { return p.pageConfig.Aliases } -// Deprecated: Use taxonomies instead. -func (p *pageMeta) Author() page.Author { - hugo.Deprecate(".Page.Author", "Use taxonomies instead.", "v0.98.0") - authors := p.Authors() - - for _, author := range authors { - return author - } - return page.Author{} -} - -// Deprecated: Use taxonomies instead. -func (p *pageMeta) Authors() page.AuthorList { - hugo.Deprecate(".Page.Authors", "Use taxonomies instead.", "v0.112.0") - return nil -} - func (p *pageMeta) BundleType() string { switch p.pathInfo.BundleType() { case paths.PathTypeLeaf: diff --git a/hugolib/page__new.go b/hugolib/page__new.go index 9a11fa889..91bfe5e32 100644 --- a/hugolib/page__new.go +++ b/hugolib/page__new.go @@ -183,7 +183,6 @@ func (h *HugoSites) doNewPage(m *pageMeta) (*pageState, *paths.Path, error) { dependencyManager: m.s.Conf.NewIdentityManager(m.Path()), pageCommon: &pageCommon{ FileProvider: m, - AuthorProvider: m, store: maps.NewScratch(), Positioner: page.NopPage, InSectionPositioner: page.NopPage, diff --git a/hugolib/site.go b/hugolib/site.go index c434ff2b4..f6dc89a77 100644 --- a/hugolib/site.go +++ b/hugolib/site.go @@ -17,7 +17,6 @@ import ( "context" "errors" "fmt" - "html/template" "io" "mime" "net/url" @@ -412,12 +411,6 @@ func newHugoSites(cfg deps.DepsCfg, d *deps.Deps, pageTrees *pageTrees, sites [] return h, nil } -// Deprecated: Use hugo.IsServer instead. -func (s *Site) IsServer() bool { - hugo.Deprecate(".Site.IsServer", "Use hugo.IsServer instead.", "v0.120.0") - return s.conf.Internal.Running -} - // Returns the server port. func (s *Site) ServerPort() int { return s.conf.C.BaseURL.Port() @@ -432,13 +425,6 @@ func (s *Site) Copyright() string { return s.conf.Copyright } -// Deprecated: Use .Site.Home.OutputFormats.Get "rss" instead. -func (s *Site) RSSLink() template.URL { - hugo.Deprecate(".Site.RSSLink", "Use the Output Format's Permalink method instead, e.g. .OutputFormats.Get \"RSS\".Permalink", "v0.114.0") - rssOutputFormat := s.home.OutputFormats().Get("rss") - return template.URL(rssOutputFormat.Permalink()) -} - func (s *Site) Config() page.SiteConfig { return page.SiteConfig{ Privacy: s.conf.Privacy, @@ -520,18 +506,6 @@ func (s *Site) Social() map[string]string { return s.conf.Social } -// Deprecated: Use .Site.Config.Services.Disqus.Shortname instead. -func (s *Site) DisqusShortname() string { - hugo.Deprecate(".Site.DisqusShortname", "Use .Site.Config.Services.Disqus.Shortname instead.", "v0.120.0") - return s.Config().Services.Disqus.Shortname -} - -// Deprecated: Use .Site.Config.Services.GoogleAnalytics.ID instead. -func (s *Site) GoogleAnalytics() string { - hugo.Deprecate(".Site.GoogleAnalytics", "Use .Site.Config.Services.GoogleAnalytics.ID instead.", "v0.120.0") - return s.Config().Services.GoogleAnalytics.ID -} - func (s *Site) Param(key any) (any, error) { return resource.Param(s, nil, key) } diff --git a/resources/page/page.go b/resources/page/page.go index acd4ce313..032ee320d 100644 --- a/resources/page/page.go +++ b/resources/page/page.go @@ -51,14 +51,6 @@ type AlternativeOutputFormatsProvider interface { AlternativeOutputFormats() OutputFormats } -// AuthorProvider provides author information. -type AuthorProvider interface { - // Deprecated: Use taxonomies instead. - Author() Author - // Deprecated: Use taxonomies instead. - Authors() AuthorList -} - // ChildCareProvider provides accessors to child resources. type ChildCareProvider interface { // Pages returns a list of pages of all kinds. @@ -309,9 +301,6 @@ type PageWithoutContent interface { Positioner navigation.PageMenusProvider - // TODO(bep) - AuthorProvider - // Page lookups/refs GetPageProvider RefProvider diff --git a/resources/page/page_nop.go b/resources/page/page_nop.go index 2b40dbb73..5a03b1994 100644 --- a/resources/page/page_nop.go +++ b/resources/page/page_nop.go @@ -77,20 +77,6 @@ func (p *nopPage) Layout() string { return "" } -func (p *nopPage) RSSLink() template.URL { - return "" -} - -// Deprecated: Use taxonomies instead. -func (p *nopPage) Author() Author { - return Author{} -} - -// Deprecated: Use taxonomies instead. -func (p *nopPage) Authors() AuthorList { - return nil -} - func (p *nopPage) AllTranslations() Pages { return nil } @@ -167,14 +153,6 @@ func (p *nopPage) ExpiryDate() (t time.Time) { return } -func (p *nopPage) Ext() string { - return "" -} - -func (p *nopPage) Extension() string { - return "" -} - func (p *nopPage) File() *source.File { return nil } diff --git a/resources/page/site.go b/resources/page/site.go index 4a99982fd..47e1454c8 100644 --- a/resources/page/site.go +++ b/resources/page/site.go @@ -14,7 +14,6 @@ package page import ( - "html/template" "time" "github.com/gohugoio/hugo/common/maps" @@ -54,9 +53,6 @@ type Site interface { // A shortcut to the home Home() Page - // Deprecated: Use hugo.IsServer instead. - IsServer() bool - // Returns the server port. ServerPort() int @@ -117,12 +113,6 @@ type Site interface { // Deprecated: Use .Site.Params instead. Social() map[string]string - // Deprecated: Use Config().Services.GoogleAnalytics instead. - GoogleAnalytics() string - - // Deprecated: Use Config().Privacy.Disqus instead. - DisqusShortname() string - // BuildDrafts is deprecated and will be removed in a future release. BuildDrafts() bool @@ -132,9 +122,6 @@ type Site interface { // LanguagePrefix returns the language prefix for this site. LanguagePrefix() string - // Deprecated: Use .Site.Home.OutputFormats.Get "rss" instead. - RSSLink() template.URL - maps.StoreProvider // For internal use only. @@ -195,11 +182,6 @@ func (s *siteWrapper) Authors() AuthorList { return s.s.Authors() } -// Deprecated: Use .Site.Config.Services.GoogleAnalytics.ID instead. -func (s *siteWrapper) GoogleAnalytics() string { - return s.s.GoogleAnalytics() -} - func (s *siteWrapper) GetPage(ref ...string) (Page, error) { return s.s.GetPage(ref...) } @@ -232,11 +214,6 @@ func (s *siteWrapper) Home() Page { return s.s.Home() } -// Deprecated: Use hugo.IsServer instead. -func (s *siteWrapper) IsServer() bool { - return s.s.IsServer() -} - func (s *siteWrapper) ServerPort() int { return s.s.ServerPort() } @@ -315,20 +292,10 @@ func (s *siteWrapper) IsMultiLingual() bool { return s.s.IsMultiLingual() } -// Deprecated: Use .Site.Config.Services.Disqus.Shortname instead. -func (s *siteWrapper) DisqusShortname() string { - return s.s.DisqusShortname() -} - func (s *siteWrapper) LanguagePrefix() string { return s.s.LanguagePrefix() } -// Deprecated: Use .Site.Home.OutputFormats.Get "rss" instead. -func (s *siteWrapper) RSSLink() template.URL { - return s.s.RSSLink() -} - func (s *siteWrapper) Store() *maps.Scratch { return s.s.Store() } @@ -416,20 +383,10 @@ func (t testSite) Languages() langs.Languages { return nil } -// Deprecated: Use .Site.Config.Services.GoogleAnalytics.ID instead. -func (t testSite) GoogleAnalytics() string { - return "" -} - func (t testSite) MainSections() []string { return nil } -// Deprecated: Use hugo.IsServer instead. -func (t testSite) IsServer() bool { - return false -} - func (t testSite) Language() *langs.Language { return t.l } @@ -474,11 +431,6 @@ func (s testSite) Config() SiteConfig { return SiteConfig{} } -// Deprecated: Use .Site.Config.Services.Disqus.Shortname instead. -func (testSite) DisqusShortname() string { - return "" -} - func (s testSite) BuildDrafts() bool { return false } @@ -492,11 +444,6 @@ func (s testSite) Param(key any) (any, error) { return nil, nil } -// Deprecated: Use .Site.Home.OutputFormats.Get "rss" instead. -func (s testSite) RSSLink() template.URL { - return "" -} - func (s testSite) Store() *maps.Scratch { return maps.NewScratch() } diff --git a/resources/page/testhelpers_test.go b/resources/page/testhelpers_test.go index 9eefeeea4..8a2d28e31 100644 --- a/resources/page/testhelpers_test.go +++ b/resources/page/testhelpers_test.go @@ -127,16 +127,6 @@ func (p *testPage) AlternativeOutputFormats() OutputFormats { panic("testpage: not implemented") } -// Deprecated: Use taxonomies instead. -func (p *testPage) Author() Author { - return Author{} -} - -// Deprecated: Use taxonomies instead. -func (p *testPage) Authors() AuthorList { - return nil -} - func (p *testPage) BaseFileName() string { panic("testpage: not implemented") } @@ -201,14 +191,6 @@ func (p *testPage) ExpiryDate() time.Time { return p.expiryDate } -func (p *testPage) Ext() string { - panic("testpage: not implemented") -} - -func (p *testPage) Extension() string { - panic("testpage: not implemented") -} - func (p *testPage) File() *source.File { return p.file } @@ -459,10 +441,6 @@ func (p *testPage) PublishDate() time.Time { return p.pubDate } -func (p *testPage) RSSLink() template.URL { - return "" -} - func (p *testPage) RawContent() string { panic("testpage: not implemented") } diff --git a/source/fileInfo.go b/source/fileInfo.go index bece86fa9..8994dec97 100644 --- a/source/fileInfo.go +++ b/source/fileInfo.go @@ -56,13 +56,6 @@ func (fi *File) Dir() string { return fi.pathToDir(fi.p().Dir()) } -// Extension is an alias to Ext(). -// Deprecated: Use Ext() instead. -func (fi *File) Extension() string { - hugo.Deprecate(".File.Extension", "Use .File.Ext instead.", "v0.96.0") - return fi.Ext() -} - // Ext returns a file's extension without the leading period (e.g. "md"). func (fi *File) Ext() string { return fi.p().Ext() } diff --git a/tpl/collections/collections.go b/tpl/collections/collections.go index edec536ef..a7e36f689 100644 --- a/tpl/collections/collections.go +++ b/tpl/collections/collections.go @@ -26,7 +26,6 @@ import ( "time" "github.com/gohugoio/hugo/common/collections" - "github.com/gohugoio/hugo/common/hugo" "github.com/gohugoio/hugo/common/maps" "github.com/gohugoio/hugo/common/types" "github.com/gohugoio/hugo/deps" @@ -189,54 +188,6 @@ func (ns *Namespace) Dictionary(values ...any) (map[string]any, error) { return root, nil } -// EchoParam returns the value in the collection c with key k if is set; otherwise, it returns an -// empty string. -// Deprecated: Use the index function instead. -func (ns *Namespace) EchoParam(c, k any) any { - hugo.Deprecate("collections.EchoParam", "Use the index function instead.", "v0.120.0") - av, isNil := indirect(reflect.ValueOf(c)) - if isNil { - return "" - } - - var avv reflect.Value - switch av.Kind() { - case reflect.Array, reflect.Slice: - index, ok := k.(int) - if ok && av.Len() > index { - avv = av.Index(index) - } - case reflect.Map: - kv := reflect.ValueOf(k) - if kv.Type().AssignableTo(av.Type().Key()) { - avv = av.MapIndex(kv) - } - } - - avv, isNil = indirect(avv) - - if isNil { - return "" - } - - if avv.IsValid() { - switch avv.Kind() { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return avv.Int() - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - return avv.Uint() - case reflect.Float32, reflect.Float64: - return avv.Float() - case reflect.String: - return avv.String() - case reflect.Bool: - return avv.Bool() - } - } - - return "" -} - // First returns the first limit items in list l. func (ns *Namespace) First(limit any, l any) (any, error) { if limit == nil || l == nil { diff --git a/tpl/collections/collections_test.go b/tpl/collections/collections_test.go index c89051a3d..0f4bf82f5 100644 --- a/tpl/collections/collections_test.go +++ b/tpl/collections/collections_test.go @@ -232,39 +232,6 @@ func TestReverse(t *testing.T) { c.Assert(err, qt.Not(qt.IsNil)) } -func TestEchoParam(t *testing.T) { - t.Skip("deprecated, will be removed in Hugo 0.133.0") - t.Parallel() - c := qt.New(t) - - ns := newNs() - - for i, test := range []struct { - a any - key any - expect any - }{ - {[]int{1, 2, 3}, 1, int64(2)}, - {[]uint{1, 2, 3}, 1, uint64(2)}, - {[]float64{1.1, 2.2, 3.3}, 1, float64(2.2)}, - {[]string{"foo", "bar", "baz"}, 1, "bar"}, - {[]TstX{{A: "a", B: "b"}, {A: "c", B: "d"}, {A: "e", B: "f"}}, 1, ""}, - {map[string]int{"foo": 1, "bar": 2, "baz": 3}, "bar", int64(2)}, - {map[string]uint{"foo": 1, "bar": 2, "baz": 3}, "bar", uint64(2)}, - {map[string]float64{"foo": 1.1, "bar": 2.2, "baz": 3.3}, "bar", float64(2.2)}, - {map[string]string{"foo": "FOO", "bar": "BAR", "baz": "BAZ"}, "bar", "BAR"}, - {map[string]TstX{"foo": {A: "a", B: "b"}, "bar": {A: "c", B: "d"}, "baz": {A: "e", B: "f"}}, "bar", ""}, - {map[string]any{"foo": nil}, "foo", ""}, - {(*[]string)(nil), "bar", ""}, - } { - errMsg := qt.Commentf("[%d] %v", i, test) - - result := ns.EchoParam(test.a, test.key) - - c.Assert(result, qt.Equals, test.expect, errMsg) - } -} - func TestFirst(t *testing.T) { t.Parallel() c := qt.New(t) diff --git a/tpl/collections/init.go b/tpl/collections/init.go index 20711f9e4..f89651326 100644 --- a/tpl/collections/init.go +++ b/tpl/collections/init.go @@ -67,11 +67,6 @@ func init() { [][2]string{}, ) - ns.AddMethodMapping(ctx.EchoParam, - []string{"echoParam"}, - [][2]string{}, - ) - ns.AddMethodMapping(ctx.First, []string{"first"}, [][2]string{}, diff --git a/tpl/lang/lang.go b/tpl/lang/lang.go index b4ff98684..4cbd661af 100644 --- a/tpl/lang/lang.go +++ b/tpl/lang/lang.go @@ -26,7 +26,6 @@ import ( translators "github.com/gohugoio/localescompressed" "github.com/gohugoio/hugo/common/hreflect" - "github.com/gohugoio/hugo/common/hugo" "github.com/gohugoio/hugo/deps" "github.com/spf13/cast" ) @@ -240,12 +239,6 @@ func (ns *Namespace) FormatNumberCustom(precision, number any, options ...any) ( return string(b), nil } -// Deprecated: Use lang.FormatNumberCustom instead. -func (ns *Namespace) NumFmt(precision, number any, options ...any) (string, error) { - hugo.Deprecate("lang.NumFmt", "Use lang.FormatNumberCustom instead.", "v0.120.0") - return ns.FormatNumberCustom(precision, number, options...) -} - type pagesLanguageMerger interface { MergeByLanguageInterface(other any) (any, error) } From 66dd6ecab2b7f484a56e08c600b31027525057b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Sat, 16 Nov 2024 20:34:00 +0100 Subject: [PATCH 118/526] docs: Regen CLI docs --- docs/content/en/commands/hugo.md | 2 -- docs/content/en/commands/hugo_build.md | 2 -- docs/content/en/commands/hugo_completion.md | 2 -- docs/content/en/commands/hugo_completion_bash.md | 2 -- docs/content/en/commands/hugo_completion_fish.md | 2 -- docs/content/en/commands/hugo_completion_powershell.md | 2 -- docs/content/en/commands/hugo_completion_zsh.md | 2 -- docs/content/en/commands/hugo_config.md | 2 -- docs/content/en/commands/hugo_config_mounts.md | 2 -- docs/content/en/commands/hugo_convert.md | 2 -- docs/content/en/commands/hugo_convert_toJSON.md | 2 -- docs/content/en/commands/hugo_convert_toTOML.md | 2 -- docs/content/en/commands/hugo_convert_toYAML.md | 2 -- docs/content/en/commands/hugo_deploy.md | 2 -- docs/content/en/commands/hugo_env.md | 2 -- docs/content/en/commands/hugo_gen.md | 2 -- docs/content/en/commands/hugo_gen_chromastyles.md | 2 -- docs/content/en/commands/hugo_gen_doc.md | 2 -- docs/content/en/commands/hugo_gen_man.md | 2 -- docs/content/en/commands/hugo_import.md | 2 -- docs/content/en/commands/hugo_import_jekyll.md | 2 -- docs/content/en/commands/hugo_list.md | 2 -- docs/content/en/commands/hugo_list_all.md | 2 -- docs/content/en/commands/hugo_list_drafts.md | 2 -- docs/content/en/commands/hugo_list_expired.md | 2 -- docs/content/en/commands/hugo_list_future.md | 2 -- docs/content/en/commands/hugo_list_published.md | 2 -- docs/content/en/commands/hugo_mod.md | 2 -- docs/content/en/commands/hugo_mod_clean.md | 2 -- docs/content/en/commands/hugo_mod_get.md | 2 -- docs/content/en/commands/hugo_mod_graph.md | 2 -- docs/content/en/commands/hugo_mod_init.md | 2 -- docs/content/en/commands/hugo_mod_npm.md | 2 -- docs/content/en/commands/hugo_mod_npm_pack.md | 2 -- docs/content/en/commands/hugo_mod_tidy.md | 2 -- docs/content/en/commands/hugo_mod_vendor.md | 2 -- docs/content/en/commands/hugo_mod_verify.md | 2 -- docs/content/en/commands/hugo_new.md | 2 -- docs/content/en/commands/hugo_new_content.md | 2 -- docs/content/en/commands/hugo_new_site.md | 2 -- docs/content/en/commands/hugo_new_theme.md | 2 -- docs/content/en/commands/hugo_server.md | 2 -- docs/content/en/commands/hugo_server_trust.md | 2 -- docs/content/en/commands/hugo_version.md | 2 -- 44 files changed, 88 deletions(-) diff --git a/docs/content/en/commands/hugo.md b/docs/content/en/commands/hugo.md index c23b3e4ba..ef0bca9a5 100644 --- a/docs/content/en/commands/hugo.md +++ b/docs/content/en/commands/hugo.md @@ -33,7 +33,6 @@ hugo [flags] --config string config file (default is hugo.yaml|json|toml) --configDir string config dir (default "config") -c, --contentDir string filesystem path to content directory - --debug debug output -d, --destination string filesystem path to write files to --disableKinds strings disable different kind of pages (home, RSS etc.) --enableGitInfo add Git revision, date, author, and CODEOWNERS info to the pages @@ -64,7 +63,6 @@ hugo [flags] -t, --theme strings themes to use (located in /themes/THEMENAME/) --themesDir string filesystem path to themes directory --trace file write trace to file (not useful in general) - -v, --verbose verbose output -w, --watch watch filesystem for changes and recreate as needed ``` diff --git a/docs/content/en/commands/hugo_build.md b/docs/content/en/commands/hugo_build.md index c0abecfa9..582cbe511 100644 --- a/docs/content/en/commands/hugo_build.md +++ b/docs/content/en/commands/hugo_build.md @@ -33,7 +33,6 @@ hugo build [flags] --config string config file (default is hugo.yaml|json|toml) --configDir string config dir (default "config") -c, --contentDir string filesystem path to content directory - --debug debug output -d, --destination string filesystem path to write files to --disableKinds strings disable different kind of pages (home, RSS etc.) --enableGitInfo add Git revision, date, author, and CODEOWNERS info to the pages @@ -64,7 +63,6 @@ hugo build [flags] -t, --theme strings themes to use (located in /themes/THEMENAME/) --themesDir string filesystem path to themes directory --trace file write trace to file (not useful in general) - -v, --verbose verbose output -w, --watch watch filesystem for changes and recreate as needed ``` diff --git a/docs/content/en/commands/hugo_completion.md b/docs/content/en/commands/hugo_completion.md index 171018fee..96f53742a 100644 --- a/docs/content/en/commands/hugo_completion.md +++ b/docs/content/en/commands/hugo_completion.md @@ -25,7 +25,6 @@ See each sub-command's help for details on how to use the generated script. --clock string set the clock used by Hugo, e.g. --clock 2021-11-06T22:30:00.00+09:00 --config string config file (default is hugo.yaml|json|toml) --configDir string config dir (default "config") - --debug debug output -d, --destination string filesystem path to write files to -e, --environment string build environment --ignoreVendorPaths string ignores any _vendor for module paths matching the given Glob pattern @@ -34,7 +33,6 @@ See each sub-command's help for details on how to use the generated script. -M, --renderToMemory render to memory (mostly useful when running the server) -s, --source string filesystem path to read files relative from --themesDir string filesystem path to themes directory - -v, --verbose verbose output ``` ### SEE ALSO diff --git a/docs/content/en/commands/hugo_completion_bash.md b/docs/content/en/commands/hugo_completion_bash.md index bface97c6..60973415f 100644 --- a/docs/content/en/commands/hugo_completion_bash.md +++ b/docs/content/en/commands/hugo_completion_bash.md @@ -48,7 +48,6 @@ hugo completion bash --clock string set the clock used by Hugo, e.g. --clock 2021-11-06T22:30:00.00+09:00 --config string config file (default is hugo.yaml|json|toml) --configDir string config dir (default "config") - --debug debug output -d, --destination string filesystem path to write files to -e, --environment string build environment --ignoreVendorPaths string ignores any _vendor for module paths matching the given Glob pattern @@ -57,7 +56,6 @@ hugo completion bash -M, --renderToMemory render to memory (mostly useful when running the server) -s, --source string filesystem path to read files relative from --themesDir string filesystem path to themes directory - -v, --verbose verbose output ``` ### SEE ALSO diff --git a/docs/content/en/commands/hugo_completion_fish.md b/docs/content/en/commands/hugo_completion_fish.md index 3a9cf0df2..92bbd6c22 100644 --- a/docs/content/en/commands/hugo_completion_fish.md +++ b/docs/content/en/commands/hugo_completion_fish.md @@ -39,7 +39,6 @@ hugo completion fish [flags] --clock string set the clock used by Hugo, e.g. --clock 2021-11-06T22:30:00.00+09:00 --config string config file (default is hugo.yaml|json|toml) --configDir string config dir (default "config") - --debug debug output -d, --destination string filesystem path to write files to -e, --environment string build environment --ignoreVendorPaths string ignores any _vendor for module paths matching the given Glob pattern @@ -48,7 +47,6 @@ hugo completion fish [flags] -M, --renderToMemory render to memory (mostly useful when running the server) -s, --source string filesystem path to read files relative from --themesDir string filesystem path to themes directory - -v, --verbose verbose output ``` ### SEE ALSO diff --git a/docs/content/en/commands/hugo_completion_powershell.md b/docs/content/en/commands/hugo_completion_powershell.md index 593573cee..f01442920 100644 --- a/docs/content/en/commands/hugo_completion_powershell.md +++ b/docs/content/en/commands/hugo_completion_powershell.md @@ -36,7 +36,6 @@ hugo completion powershell [flags] --clock string set the clock used by Hugo, e.g. --clock 2021-11-06T22:30:00.00+09:00 --config string config file (default is hugo.yaml|json|toml) --configDir string config dir (default "config") - --debug debug output -d, --destination string filesystem path to write files to -e, --environment string build environment --ignoreVendorPaths string ignores any _vendor for module paths matching the given Glob pattern @@ -45,7 +44,6 @@ hugo completion powershell [flags] -M, --renderToMemory render to memory (mostly useful when running the server) -s, --source string filesystem path to read files relative from --themesDir string filesystem path to themes directory - -v, --verbose verbose output ``` ### SEE ALSO diff --git a/docs/content/en/commands/hugo_completion_zsh.md b/docs/content/en/commands/hugo_completion_zsh.md index c227c6125..142c53103 100644 --- a/docs/content/en/commands/hugo_completion_zsh.md +++ b/docs/content/en/commands/hugo_completion_zsh.md @@ -50,7 +50,6 @@ hugo completion zsh [flags] --clock string set the clock used by Hugo, e.g. --clock 2021-11-06T22:30:00.00+09:00 --config string config file (default is hugo.yaml|json|toml) --configDir string config dir (default "config") - --debug debug output -d, --destination string filesystem path to write files to -e, --environment string build environment --ignoreVendorPaths string ignores any _vendor for module paths matching the given Glob pattern @@ -59,7 +58,6 @@ hugo completion zsh [flags] -M, --renderToMemory render to memory (mostly useful when running the server) -s, --source string filesystem path to read files relative from --themesDir string filesystem path to themes directory - -v, --verbose verbose output ``` ### SEE ALSO diff --git a/docs/content/en/commands/hugo_config.md b/docs/content/en/commands/hugo_config.md index 96f84a531..8e8d745d2 100644 --- a/docs/content/en/commands/hugo_config.md +++ b/docs/content/en/commands/hugo_config.md @@ -34,7 +34,6 @@ hugo config [command] [flags] --clock string set the clock used by Hugo, e.g. --clock 2021-11-06T22:30:00.00+09:00 --config string config file (default is hugo.yaml|json|toml) --configDir string config dir (default "config") - --debug debug output -d, --destination string filesystem path to write files to -e, --environment string build environment --ignoreVendorPaths string ignores any _vendor for module paths matching the given Glob pattern @@ -43,7 +42,6 @@ hugo config [command] [flags] -M, --renderToMemory render to memory (mostly useful when running the server) -s, --source string filesystem path to read files relative from --themesDir string filesystem path to themes directory - -v, --verbose verbose output ``` ### SEE ALSO diff --git a/docs/content/en/commands/hugo_config_mounts.md b/docs/content/en/commands/hugo_config_mounts.md index 6fa30c016..5af4819a2 100644 --- a/docs/content/en/commands/hugo_config_mounts.md +++ b/docs/content/en/commands/hugo_config_mounts.md @@ -28,7 +28,6 @@ hugo config mounts [flags] [args] --clock string set the clock used by Hugo, e.g. --clock 2021-11-06T22:30:00.00+09:00 --config string config file (default is hugo.yaml|json|toml) --configDir string config dir (default "config") - --debug debug output -d, --destination string filesystem path to write files to -e, --environment string build environment --ignoreVendorPaths string ignores any _vendor for module paths matching the given Glob pattern @@ -37,7 +36,6 @@ hugo config mounts [flags] [args] -M, --renderToMemory render to memory (mostly useful when running the server) -s, --source string filesystem path to read files relative from --themesDir string filesystem path to themes directory - -v, --verbose verbose output ``` ### SEE ALSO diff --git a/docs/content/en/commands/hugo_convert.md b/docs/content/en/commands/hugo_convert.md index 53d4d992c..aeaa37766 100644 --- a/docs/content/en/commands/hugo_convert.md +++ b/docs/content/en/commands/hugo_convert.md @@ -27,7 +27,6 @@ See convert's subcommands toJSON, toTOML and toYAML for more information. --clock string set the clock used by Hugo, e.g. --clock 2021-11-06T22:30:00.00+09:00 --config string config file (default is hugo.yaml|json|toml) --configDir string config dir (default "config") - --debug debug output -d, --destination string filesystem path to write files to -e, --environment string build environment --ignoreVendorPaths string ignores any _vendor for module paths matching the given Glob pattern @@ -36,7 +35,6 @@ See convert's subcommands toJSON, toTOML and toYAML for more information. -M, --renderToMemory render to memory (mostly useful when running the server) -s, --source string filesystem path to read files relative from --themesDir string filesystem path to themes directory - -v, --verbose verbose output ``` ### SEE ALSO diff --git a/docs/content/en/commands/hugo_convert_toJSON.md b/docs/content/en/commands/hugo_convert_toJSON.md index 9546788b5..40403193c 100644 --- a/docs/content/en/commands/hugo_convert_toJSON.md +++ b/docs/content/en/commands/hugo_convert_toJSON.md @@ -28,7 +28,6 @@ hugo convert toJSON [flags] [args] --clock string set the clock used by Hugo, e.g. --clock 2021-11-06T22:30:00.00+09:00 --config string config file (default is hugo.yaml|json|toml) --configDir string config dir (default "config") - --debug debug output -d, --destination string filesystem path to write files to -e, --environment string build environment --ignoreVendorPaths string ignores any _vendor for module paths matching the given Glob pattern @@ -39,7 +38,6 @@ hugo convert toJSON [flags] [args] -s, --source string filesystem path to read files relative from --themesDir string filesystem path to themes directory --unsafe enable less safe operations, please backup first - -v, --verbose verbose output ``` ### SEE ALSO diff --git a/docs/content/en/commands/hugo_convert_toTOML.md b/docs/content/en/commands/hugo_convert_toTOML.md index 3bd703f60..53ab82651 100644 --- a/docs/content/en/commands/hugo_convert_toTOML.md +++ b/docs/content/en/commands/hugo_convert_toTOML.md @@ -28,7 +28,6 @@ hugo convert toTOML [flags] [args] --clock string set the clock used by Hugo, e.g. --clock 2021-11-06T22:30:00.00+09:00 --config string config file (default is hugo.yaml|json|toml) --configDir string config dir (default "config") - --debug debug output -d, --destination string filesystem path to write files to -e, --environment string build environment --ignoreVendorPaths string ignores any _vendor for module paths matching the given Glob pattern @@ -39,7 +38,6 @@ hugo convert toTOML [flags] [args] -s, --source string filesystem path to read files relative from --themesDir string filesystem path to themes directory --unsafe enable less safe operations, please backup first - -v, --verbose verbose output ``` ### SEE ALSO diff --git a/docs/content/en/commands/hugo_convert_toYAML.md b/docs/content/en/commands/hugo_convert_toYAML.md index 563375486..efb63a4e2 100644 --- a/docs/content/en/commands/hugo_convert_toYAML.md +++ b/docs/content/en/commands/hugo_convert_toYAML.md @@ -28,7 +28,6 @@ hugo convert toYAML [flags] [args] --clock string set the clock used by Hugo, e.g. --clock 2021-11-06T22:30:00.00+09:00 --config string config file (default is hugo.yaml|json|toml) --configDir string config dir (default "config") - --debug debug output -d, --destination string filesystem path to write files to -e, --environment string build environment --ignoreVendorPaths string ignores any _vendor for module paths matching the given Glob pattern @@ -39,7 +38,6 @@ hugo convert toYAML [flags] [args] -s, --source string filesystem path to read files relative from --themesDir string filesystem path to themes directory --unsafe enable less safe operations, please backup first - -v, --verbose verbose output ``` ### SEE ALSO diff --git a/docs/content/en/commands/hugo_deploy.md b/docs/content/en/commands/hugo_deploy.md index a6fc53658..fce1e5422 100644 --- a/docs/content/en/commands/hugo_deploy.md +++ b/docs/content/en/commands/hugo_deploy.md @@ -38,7 +38,6 @@ hugo deploy [flags] [args] --clock string set the clock used by Hugo, e.g. --clock 2021-11-06T22:30:00.00+09:00 --config string config file (default is hugo.yaml|json|toml) --configDir string config dir (default "config") - --debug debug output -d, --destination string filesystem path to write files to -e, --environment string build environment --ignoreVendorPaths string ignores any _vendor for module paths matching the given Glob pattern @@ -47,7 +46,6 @@ hugo deploy [flags] [args] -M, --renderToMemory render to memory (mostly useful when running the server) -s, --source string filesystem path to read files relative from --themesDir string filesystem path to themes directory - -v, --verbose verbose output ``` ### SEE ALSO diff --git a/docs/content/en/commands/hugo_env.md b/docs/content/en/commands/hugo_env.md index 50a7bc92f..e216be416 100644 --- a/docs/content/en/commands/hugo_env.md +++ b/docs/content/en/commands/hugo_env.md @@ -27,7 +27,6 @@ hugo env [flags] [args] --clock string set the clock used by Hugo, e.g. --clock 2021-11-06T22:30:00.00+09:00 --config string config file (default is hugo.yaml|json|toml) --configDir string config dir (default "config") - --debug debug output -d, --destination string filesystem path to write files to -e, --environment string build environment --ignoreVendorPaths string ignores any _vendor for module paths matching the given Glob pattern @@ -36,7 +35,6 @@ hugo env [flags] [args] -M, --renderToMemory render to memory (mostly useful when running the server) -s, --source string filesystem path to read files relative from --themesDir string filesystem path to themes directory - -v, --verbose verbose output ``` ### SEE ALSO diff --git a/docs/content/en/commands/hugo_gen.md b/docs/content/en/commands/hugo_gen.md index 20d829178..97cdbdb9d 100644 --- a/docs/content/en/commands/hugo_gen.md +++ b/docs/content/en/commands/hugo_gen.md @@ -23,7 +23,6 @@ Generate documentation for your project using Hugo's documentation engine, inclu --clock string set the clock used by Hugo, e.g. --clock 2021-11-06T22:30:00.00+09:00 --config string config file (default is hugo.yaml|json|toml) --configDir string config dir (default "config") - --debug debug output -d, --destination string filesystem path to write files to -e, --environment string build environment --ignoreVendorPaths string ignores any _vendor for module paths matching the given Glob pattern @@ -32,7 +31,6 @@ Generate documentation for your project using Hugo's documentation engine, inclu -M, --renderToMemory render to memory (mostly useful when running the server) -s, --source string filesystem path to read files relative from --themesDir string filesystem path to themes directory - -v, --verbose verbose output ``` ### SEE ALSO diff --git a/docs/content/en/commands/hugo_gen_chromastyles.md b/docs/content/en/commands/hugo_gen_chromastyles.md index 1c0ac7235..49cde6bb9 100644 --- a/docs/content/en/commands/hugo_gen_chromastyles.md +++ b/docs/content/en/commands/hugo_gen_chromastyles.md @@ -33,7 +33,6 @@ hugo gen chromastyles [flags] [args] --clock string set the clock used by Hugo, e.g. --clock 2021-11-06T22:30:00.00+09:00 --config string config file (default is hugo.yaml|json|toml) --configDir string config dir (default "config") - --debug debug output -d, --destination string filesystem path to write files to -e, --environment string build environment --ignoreVendorPaths string ignores any _vendor for module paths matching the given Glob pattern @@ -42,7 +41,6 @@ hugo gen chromastyles [flags] [args] -M, --renderToMemory render to memory (mostly useful when running the server) -s, --source string filesystem path to read files relative from --themesDir string filesystem path to themes directory - -v, --verbose verbose output ``` ### SEE ALSO diff --git a/docs/content/en/commands/hugo_gen_doc.md b/docs/content/en/commands/hugo_gen_doc.md index 5d2fffa4f..180dc4f95 100644 --- a/docs/content/en/commands/hugo_gen_doc.md +++ b/docs/content/en/commands/hugo_gen_doc.md @@ -33,7 +33,6 @@ hugo gen doc [flags] [args] --clock string set the clock used by Hugo, e.g. --clock 2021-11-06T22:30:00.00+09:00 --config string config file (default is hugo.yaml|json|toml) --configDir string config dir (default "config") - --debug debug output -d, --destination string filesystem path to write files to -e, --environment string build environment --ignoreVendorPaths string ignores any _vendor for module paths matching the given Glob pattern @@ -42,7 +41,6 @@ hugo gen doc [flags] [args] -M, --renderToMemory render to memory (mostly useful when running the server) -s, --source string filesystem path to read files relative from --themesDir string filesystem path to themes directory - -v, --verbose verbose output ``` ### SEE ALSO diff --git a/docs/content/en/commands/hugo_gen_man.md b/docs/content/en/commands/hugo_gen_man.md index f05b06298..f33342c54 100644 --- a/docs/content/en/commands/hugo_gen_man.md +++ b/docs/content/en/commands/hugo_gen_man.md @@ -30,7 +30,6 @@ hugo gen man [flags] [args] --clock string set the clock used by Hugo, e.g. --clock 2021-11-06T22:30:00.00+09:00 --config string config file (default is hugo.yaml|json|toml) --configDir string config dir (default "config") - --debug debug output -d, --destination string filesystem path to write files to -e, --environment string build environment --ignoreVendorPaths string ignores any _vendor for module paths matching the given Glob pattern @@ -39,7 +38,6 @@ hugo gen man [flags] [args] -M, --renderToMemory render to memory (mostly useful when running the server) -s, --source string filesystem path to read files relative from --themesDir string filesystem path to themes directory - -v, --verbose verbose output ``` ### SEE ALSO diff --git a/docs/content/en/commands/hugo_import.md b/docs/content/en/commands/hugo_import.md index 7de28e4cb..b20b58599 100644 --- a/docs/content/en/commands/hugo_import.md +++ b/docs/content/en/commands/hugo_import.md @@ -25,7 +25,6 @@ Import requires a subcommand, e.g. `hugo import jekyll jekyll_root_path target_p --clock string set the clock used by Hugo, e.g. --clock 2021-11-06T22:30:00.00+09:00 --config string config file (default is hugo.yaml|json|toml) --configDir string config dir (default "config") - --debug debug output -d, --destination string filesystem path to write files to -e, --environment string build environment --ignoreVendorPaths string ignores any _vendor for module paths matching the given Glob pattern @@ -34,7 +33,6 @@ Import requires a subcommand, e.g. `hugo import jekyll jekyll_root_path target_p -M, --renderToMemory render to memory (mostly useful when running the server) -s, --source string filesystem path to read files relative from --themesDir string filesystem path to themes directory - -v, --verbose verbose output ``` ### SEE ALSO diff --git a/docs/content/en/commands/hugo_import_jekyll.md b/docs/content/en/commands/hugo_import_jekyll.md index 33c91d24c..14c57cc44 100644 --- a/docs/content/en/commands/hugo_import_jekyll.md +++ b/docs/content/en/commands/hugo_import_jekyll.md @@ -30,7 +30,6 @@ hugo import jekyll [flags] [args] --clock string set the clock used by Hugo, e.g. --clock 2021-11-06T22:30:00.00+09:00 --config string config file (default is hugo.yaml|json|toml) --configDir string config dir (default "config") - --debug debug output -d, --destination string filesystem path to write files to -e, --environment string build environment --ignoreVendorPaths string ignores any _vendor for module paths matching the given Glob pattern @@ -39,7 +38,6 @@ hugo import jekyll [flags] [args] -M, --renderToMemory render to memory (mostly useful when running the server) -s, --source string filesystem path to read files relative from --themesDir string filesystem path to themes directory - -v, --verbose verbose output ``` ### SEE ALSO diff --git a/docs/content/en/commands/hugo_list.md b/docs/content/en/commands/hugo_list.md index 070a44d84..726fe51a9 100644 --- a/docs/content/en/commands/hugo_list.md +++ b/docs/content/en/commands/hugo_list.md @@ -25,7 +25,6 @@ List requires a subcommand, e.g. hugo list drafts --clock string set the clock used by Hugo, e.g. --clock 2021-11-06T22:30:00.00+09:00 --config string config file (default is hugo.yaml|json|toml) --configDir string config dir (default "config") - --debug debug output -d, --destination string filesystem path to write files to -e, --environment string build environment --ignoreVendorPaths string ignores any _vendor for module paths matching the given Glob pattern @@ -34,7 +33,6 @@ List requires a subcommand, e.g. hugo list drafts -M, --renderToMemory render to memory (mostly useful when running the server) -s, --source string filesystem path to read files relative from --themesDir string filesystem path to themes directory - -v, --verbose verbose output ``` ### SEE ALSO diff --git a/docs/content/en/commands/hugo_list_all.md b/docs/content/en/commands/hugo_list_all.md index 5dd29904e..59846733d 100644 --- a/docs/content/en/commands/hugo_list_all.md +++ b/docs/content/en/commands/hugo_list_all.md @@ -27,7 +27,6 @@ hugo list all [flags] [args] --clock string set the clock used by Hugo, e.g. --clock 2021-11-06T22:30:00.00+09:00 --config string config file (default is hugo.yaml|json|toml) --configDir string config dir (default "config") - --debug debug output -d, --destination string filesystem path to write files to -e, --environment string build environment --ignoreVendorPaths string ignores any _vendor for module paths matching the given Glob pattern @@ -36,7 +35,6 @@ hugo list all [flags] [args] -M, --renderToMemory render to memory (mostly useful when running the server) -s, --source string filesystem path to read files relative from --themesDir string filesystem path to themes directory - -v, --verbose verbose output ``` ### SEE ALSO diff --git a/docs/content/en/commands/hugo_list_drafts.md b/docs/content/en/commands/hugo_list_drafts.md index 4dff70886..5f3bcd617 100644 --- a/docs/content/en/commands/hugo_list_drafts.md +++ b/docs/content/en/commands/hugo_list_drafts.md @@ -27,7 +27,6 @@ hugo list drafts [flags] [args] --clock string set the clock used by Hugo, e.g. --clock 2021-11-06T22:30:00.00+09:00 --config string config file (default is hugo.yaml|json|toml) --configDir string config dir (default "config") - --debug debug output -d, --destination string filesystem path to write files to -e, --environment string build environment --ignoreVendorPaths string ignores any _vendor for module paths matching the given Glob pattern @@ -36,7 +35,6 @@ hugo list drafts [flags] [args] -M, --renderToMemory render to memory (mostly useful when running the server) -s, --source string filesystem path to read files relative from --themesDir string filesystem path to themes directory - -v, --verbose verbose output ``` ### SEE ALSO diff --git a/docs/content/en/commands/hugo_list_expired.md b/docs/content/en/commands/hugo_list_expired.md index 7b874a105..c010d1159 100644 --- a/docs/content/en/commands/hugo_list_expired.md +++ b/docs/content/en/commands/hugo_list_expired.md @@ -27,7 +27,6 @@ hugo list expired [flags] [args] --clock string set the clock used by Hugo, e.g. --clock 2021-11-06T22:30:00.00+09:00 --config string config file (default is hugo.yaml|json|toml) --configDir string config dir (default "config") - --debug debug output -d, --destination string filesystem path to write files to -e, --environment string build environment --ignoreVendorPaths string ignores any _vendor for module paths matching the given Glob pattern @@ -36,7 +35,6 @@ hugo list expired [flags] [args] -M, --renderToMemory render to memory (mostly useful when running the server) -s, --source string filesystem path to read files relative from --themesDir string filesystem path to themes directory - -v, --verbose verbose output ``` ### SEE ALSO diff --git a/docs/content/en/commands/hugo_list_future.md b/docs/content/en/commands/hugo_list_future.md index f558acd52..888784dcd 100644 --- a/docs/content/en/commands/hugo_list_future.md +++ b/docs/content/en/commands/hugo_list_future.md @@ -27,7 +27,6 @@ hugo list future [flags] [args] --clock string set the clock used by Hugo, e.g. --clock 2021-11-06T22:30:00.00+09:00 --config string config file (default is hugo.yaml|json|toml) --configDir string config dir (default "config") - --debug debug output -d, --destination string filesystem path to write files to -e, --environment string build environment --ignoreVendorPaths string ignores any _vendor for module paths matching the given Glob pattern @@ -36,7 +35,6 @@ hugo list future [flags] [args] -M, --renderToMemory render to memory (mostly useful when running the server) -s, --source string filesystem path to read files relative from --themesDir string filesystem path to themes directory - -v, --verbose verbose output ``` ### SEE ALSO diff --git a/docs/content/en/commands/hugo_list_published.md b/docs/content/en/commands/hugo_list_published.md index 9fc75694b..b8ec0e7b2 100644 --- a/docs/content/en/commands/hugo_list_published.md +++ b/docs/content/en/commands/hugo_list_published.md @@ -27,7 +27,6 @@ hugo list published [flags] [args] --clock string set the clock used by Hugo, e.g. --clock 2021-11-06T22:30:00.00+09:00 --config string config file (default is hugo.yaml|json|toml) --configDir string config dir (default "config") - --debug debug output -d, --destination string filesystem path to write files to -e, --environment string build environment --ignoreVendorPaths string ignores any _vendor for module paths matching the given Glob pattern @@ -36,7 +35,6 @@ hugo list published [flags] [args] -M, --renderToMemory render to memory (mostly useful when running the server) -s, --source string filesystem path to read files relative from --themesDir string filesystem path to themes directory - -v, --verbose verbose output ``` ### SEE ALSO diff --git a/docs/content/en/commands/hugo_mod.md b/docs/content/en/commands/hugo_mod.md index d4e305ff1..2c07b89cf 100644 --- a/docs/content/en/commands/hugo_mod.md +++ b/docs/content/en/commands/hugo_mod.md @@ -34,7 +34,6 @@ See https://gohugo.io/hugo-modules/ for more information. --clock string set the clock used by Hugo, e.g. --clock 2021-11-06T22:30:00.00+09:00 --config string config file (default is hugo.yaml|json|toml) --configDir string config dir (default "config") - --debug debug output -d, --destination string filesystem path to write files to -e, --environment string build environment --ignoreVendorPaths string ignores any _vendor for module paths matching the given Glob pattern @@ -43,7 +42,6 @@ See https://gohugo.io/hugo-modules/ for more information. -M, --renderToMemory render to memory (mostly useful when running the server) -s, --source string filesystem path to read files relative from --themesDir string filesystem path to themes directory - -v, --verbose verbose output ``` ### SEE ALSO diff --git a/docs/content/en/commands/hugo_mod_clean.md b/docs/content/en/commands/hugo_mod_clean.md index 80a983a66..7df51059f 100644 --- a/docs/content/en/commands/hugo_mod_clean.md +++ b/docs/content/en/commands/hugo_mod_clean.md @@ -34,7 +34,6 @@ hugo mod clean [flags] [args] --clock string set the clock used by Hugo, e.g. --clock 2021-11-06T22:30:00.00+09:00 --config string config file (default is hugo.yaml|json|toml) --configDir string config dir (default "config") - --debug debug output -d, --destination string filesystem path to write files to -e, --environment string build environment --ignoreVendorPaths string ignores any _vendor for module paths matching the given Glob pattern @@ -43,7 +42,6 @@ hugo mod clean [flags] [args] -M, --renderToMemory render to memory (mostly useful when running the server) -s, --source string filesystem path to read files relative from --themesDir string filesystem path to themes directory - -v, --verbose verbose output ``` ### SEE ALSO diff --git a/docs/content/en/commands/hugo_mod_get.md b/docs/content/en/commands/hugo_mod_get.md index de6b01a24..f4ca6069a 100644 --- a/docs/content/en/commands/hugo_mod_get.md +++ b/docs/content/en/commands/hugo_mod_get.md @@ -58,7 +58,6 @@ hugo mod get [flags] [args] --clock string set the clock used by Hugo, e.g. --clock 2021-11-06T22:30:00.00+09:00 --config string config file (default is hugo.yaml|json|toml) --configDir string config dir (default "config") - --debug debug output -d, --destination string filesystem path to write files to -e, --environment string build environment --ignoreVendorPaths string ignores any _vendor for module paths matching the given Glob pattern @@ -67,7 +66,6 @@ hugo mod get [flags] [args] -M, --renderToMemory render to memory (mostly useful when running the server) -s, --source string filesystem path to read files relative from --themesDir string filesystem path to themes directory - -v, --verbose verbose output ``` ### SEE ALSO diff --git a/docs/content/en/commands/hugo_mod_graph.md b/docs/content/en/commands/hugo_mod_graph.md index f20e26b6f..5b5a14d5d 100644 --- a/docs/content/en/commands/hugo_mod_graph.md +++ b/docs/content/en/commands/hugo_mod_graph.md @@ -35,7 +35,6 @@ hugo mod graph [flags] [args] --clock string set the clock used by Hugo, e.g. --clock 2021-11-06T22:30:00.00+09:00 --config string config file (default is hugo.yaml|json|toml) --configDir string config dir (default "config") - --debug debug output -d, --destination string filesystem path to write files to -e, --environment string build environment --ignoreVendorPaths string ignores any _vendor for module paths matching the given Glob pattern @@ -44,7 +43,6 @@ hugo mod graph [flags] [args] -M, --renderToMemory render to memory (mostly useful when running the server) -s, --source string filesystem path to read files relative from --themesDir string filesystem path to themes directory - -v, --verbose verbose output ``` ### SEE ALSO diff --git a/docs/content/en/commands/hugo_mod_init.md b/docs/content/en/commands/hugo_mod_init.md index 1d7bc4ac0..bf9651b59 100644 --- a/docs/content/en/commands/hugo_mod_init.md +++ b/docs/content/en/commands/hugo_mod_init.md @@ -39,7 +39,6 @@ hugo mod init [flags] [args] --clock string set the clock used by Hugo, e.g. --clock 2021-11-06T22:30:00.00+09:00 --config string config file (default is hugo.yaml|json|toml) --configDir string config dir (default "config") - --debug debug output -d, --destination string filesystem path to write files to -e, --environment string build environment --ignoreVendorPaths string ignores any _vendor for module paths matching the given Glob pattern @@ -48,7 +47,6 @@ hugo mod init [flags] [args] -M, --renderToMemory render to memory (mostly useful when running the server) -s, --source string filesystem path to read files relative from --themesDir string filesystem path to themes directory - -v, --verbose verbose output ``` ### SEE ALSO diff --git a/docs/content/en/commands/hugo_mod_npm.md b/docs/content/en/commands/hugo_mod_npm.md index eeb684e51..a013fb91f 100644 --- a/docs/content/en/commands/hugo_mod_npm.md +++ b/docs/content/en/commands/hugo_mod_npm.md @@ -27,7 +27,6 @@ hugo mod npm [command] [flags] --clock string set the clock used by Hugo, e.g. --clock 2021-11-06T22:30:00.00+09:00 --config string config file (default is hugo.yaml|json|toml) --configDir string config dir (default "config") - --debug debug output -d, --destination string filesystem path to write files to -e, --environment string build environment --ignoreVendorPaths string ignores any _vendor for module paths matching the given Glob pattern @@ -36,7 +35,6 @@ hugo mod npm [command] [flags] -M, --renderToMemory render to memory (mostly useful when running the server) -s, --source string filesystem path to read files relative from --themesDir string filesystem path to themes directory - -v, --verbose verbose output ``` ### SEE ALSO diff --git a/docs/content/en/commands/hugo_mod_npm_pack.md b/docs/content/en/commands/hugo_mod_npm_pack.md index 47d3e28b9..8f8738280 100644 --- a/docs/content/en/commands/hugo_mod_npm_pack.md +++ b/docs/content/en/commands/hugo_mod_npm_pack.md @@ -42,7 +42,6 @@ hugo mod npm pack [flags] [args] --clock string set the clock used by Hugo, e.g. --clock 2021-11-06T22:30:00.00+09:00 --config string config file (default is hugo.yaml|json|toml) --configDir string config dir (default "config") - --debug debug output -d, --destination string filesystem path to write files to -e, --environment string build environment --ignoreVendorPaths string ignores any _vendor for module paths matching the given Glob pattern @@ -51,7 +50,6 @@ hugo mod npm pack [flags] [args] -M, --renderToMemory render to memory (mostly useful when running the server) -s, --source string filesystem path to read files relative from --themesDir string filesystem path to themes directory - -v, --verbose verbose output ``` ### SEE ALSO diff --git a/docs/content/en/commands/hugo_mod_tidy.md b/docs/content/en/commands/hugo_mod_tidy.md index be0f92657..c15ddb3c8 100644 --- a/docs/content/en/commands/hugo_mod_tidy.md +++ b/docs/content/en/commands/hugo_mod_tidy.md @@ -28,7 +28,6 @@ hugo mod tidy [flags] [args] --clock string set the clock used by Hugo, e.g. --clock 2021-11-06T22:30:00.00+09:00 --config string config file (default is hugo.yaml|json|toml) --configDir string config dir (default "config") - --debug debug output -d, --destination string filesystem path to write files to -e, --environment string build environment --ignoreVendorPaths string ignores any _vendor for module paths matching the given Glob pattern @@ -37,7 +36,6 @@ hugo mod tidy [flags] [args] -M, --renderToMemory render to memory (mostly useful when running the server) -s, --source string filesystem path to read files relative from --themesDir string filesystem path to themes directory - -v, --verbose verbose output ``` ### SEE ALSO diff --git a/docs/content/en/commands/hugo_mod_vendor.md b/docs/content/en/commands/hugo_mod_vendor.md index d33b2a673..ae112a36a 100644 --- a/docs/content/en/commands/hugo_mod_vendor.md +++ b/docs/content/en/commands/hugo_mod_vendor.md @@ -34,7 +34,6 @@ hugo mod vendor [flags] [args] --clock string set the clock used by Hugo, e.g. --clock 2021-11-06T22:30:00.00+09:00 --config string config file (default is hugo.yaml|json|toml) --configDir string config dir (default "config") - --debug debug output -d, --destination string filesystem path to write files to -e, --environment string build environment --ignoreVendorPaths string ignores any _vendor for module paths matching the given Glob pattern @@ -43,7 +42,6 @@ hugo mod vendor [flags] [args] -M, --renderToMemory render to memory (mostly useful when running the server) -s, --source string filesystem path to read files relative from --themesDir string filesystem path to themes directory - -v, --verbose verbose output ``` ### SEE ALSO diff --git a/docs/content/en/commands/hugo_mod_verify.md b/docs/content/en/commands/hugo_mod_verify.md index c5e755e3c..63dd28ce8 100644 --- a/docs/content/en/commands/hugo_mod_verify.md +++ b/docs/content/en/commands/hugo_mod_verify.md @@ -33,7 +33,6 @@ hugo mod verify [flags] [args] --clock string set the clock used by Hugo, e.g. --clock 2021-11-06T22:30:00.00+09:00 --config string config file (default is hugo.yaml|json|toml) --configDir string config dir (default "config") - --debug debug output -d, --destination string filesystem path to write files to -e, --environment string build environment --ignoreVendorPaths string ignores any _vendor for module paths matching the given Glob pattern @@ -42,7 +41,6 @@ hugo mod verify [flags] [args] -M, --renderToMemory render to memory (mostly useful when running the server) -s, --source string filesystem path to read files relative from --themesDir string filesystem path to themes directory - -v, --verbose verbose output ``` ### SEE ALSO diff --git a/docs/content/en/commands/hugo_new.md b/docs/content/en/commands/hugo_new.md index cfe6cc1cd..4d3021b44 100644 --- a/docs/content/en/commands/hugo_new.md +++ b/docs/content/en/commands/hugo_new.md @@ -30,7 +30,6 @@ Ensure you run this within the root directory of your site. --clock string set the clock used by Hugo, e.g. --clock 2021-11-06T22:30:00.00+09:00 --config string config file (default is hugo.yaml|json|toml) --configDir string config dir (default "config") - --debug debug output -d, --destination string filesystem path to write files to -e, --environment string build environment --ignoreVendorPaths string ignores any _vendor for module paths matching the given Glob pattern @@ -39,7 +38,6 @@ Ensure you run this within the root directory of your site. -M, --renderToMemory render to memory (mostly useful when running the server) -s, --source string filesystem path to read files relative from --themesDir string filesystem path to themes directory - -v, --verbose verbose output ``` ### SEE ALSO diff --git a/docs/content/en/commands/hugo_new_content.md b/docs/content/en/commands/hugo_new_content.md index c1e3ffa30..a8d2100f9 100644 --- a/docs/content/en/commands/hugo_new_content.md +++ b/docs/content/en/commands/hugo_new_content.md @@ -42,7 +42,6 @@ hugo new content [path] [flags] --clock string set the clock used by Hugo, e.g. --clock 2021-11-06T22:30:00.00+09:00 --config string config file (default is hugo.yaml|json|toml) --configDir string config dir (default "config") - --debug debug output -d, --destination string filesystem path to write files to -e, --environment string build environment --ignoreVendorPaths string ignores any _vendor for module paths matching the given Glob pattern @@ -51,7 +50,6 @@ hugo new content [path] [flags] -M, --renderToMemory render to memory (mostly useful when running the server) -s, --source string filesystem path to read files relative from --themesDir string filesystem path to themes directory - -v, --verbose verbose output ``` ### SEE ALSO diff --git a/docs/content/en/commands/hugo_new_site.md b/docs/content/en/commands/hugo_new_site.md index 9df879103..cc0e63013 100644 --- a/docs/content/en/commands/hugo_new_site.md +++ b/docs/content/en/commands/hugo_new_site.md @@ -31,7 +31,6 @@ hugo new site [path] [flags] --clock string set the clock used by Hugo, e.g. --clock 2021-11-06T22:30:00.00+09:00 --config string config file (default is hugo.yaml|json|toml) --configDir string config dir (default "config") - --debug debug output -d, --destination string filesystem path to write files to -e, --environment string build environment --ignoreVendorPaths string ignores any _vendor for module paths matching the given Glob pattern @@ -40,7 +39,6 @@ hugo new site [path] [flags] -M, --renderToMemory render to memory (mostly useful when running the server) -s, --source string filesystem path to read files relative from --themesDir string filesystem path to themes directory - -v, --verbose verbose output ``` ### SEE ALSO diff --git a/docs/content/en/commands/hugo_new_theme.md b/docs/content/en/commands/hugo_new_theme.md index 6ab98f6b9..a79978c4a 100644 --- a/docs/content/en/commands/hugo_new_theme.md +++ b/docs/content/en/commands/hugo_new_theme.md @@ -30,7 +30,6 @@ hugo new theme [name] [flags] --clock string set the clock used by Hugo, e.g. --clock 2021-11-06T22:30:00.00+09:00 --config string config file (default is hugo.yaml|json|toml) --configDir string config dir (default "config") - --debug debug output -d, --destination string filesystem path to write files to -e, --environment string build environment --ignoreVendorPaths string ignores any _vendor for module paths matching the given Glob pattern @@ -39,7 +38,6 @@ hugo new theme [name] [flags] -M, --renderToMemory render to memory (mostly useful when running the server) -s, --source string filesystem path to read files relative from --themesDir string filesystem path to themes directory - -v, --verbose verbose output ``` ### SEE ALSO diff --git a/docs/content/en/commands/hugo_server.md b/docs/content/en/commands/hugo_server.md index c716c304f..a1c77d36f 100644 --- a/docs/content/en/commands/hugo_server.md +++ b/docs/content/en/commands/hugo_server.md @@ -81,7 +81,6 @@ hugo server [command] [flags] --clock string set the clock used by Hugo, e.g. --clock 2021-11-06T22:30:00.00+09:00 --config string config file (default is hugo.yaml|json|toml) --configDir string config dir (default "config") - --debug debug output -d, --destination string filesystem path to write files to -e, --environment string build environment --ignoreVendorPaths string ignores any _vendor for module paths matching the given Glob pattern @@ -90,7 +89,6 @@ hugo server [command] [flags] -M, --renderToMemory render to memory (mostly useful when running the server) -s, --source string filesystem path to read files relative from --themesDir string filesystem path to themes directory - -v, --verbose verbose output ``` ### SEE ALSO diff --git a/docs/content/en/commands/hugo_server_trust.md b/docs/content/en/commands/hugo_server_trust.md index fb242d88c..1a904e845 100644 --- a/docs/content/en/commands/hugo_server_trust.md +++ b/docs/content/en/commands/hugo_server_trust.md @@ -24,7 +24,6 @@ hugo server trust [flags] [args] --clock string set the clock used by Hugo, e.g. --clock 2021-11-06T22:30:00.00+09:00 --config string config file (default is hugo.yaml|json|toml) --configDir string config dir (default "config") - --debug debug output -d, --destination string filesystem path to write files to -e, --environment string build environment --ignoreVendorPaths string ignores any _vendor for module paths matching the given Glob pattern @@ -33,7 +32,6 @@ hugo server trust [flags] [args] -M, --renderToMemory render to memory (mostly useful when running the server) -s, --source string filesystem path to read files relative from --themesDir string filesystem path to themes directory - -v, --verbose verbose output ``` ### SEE ALSO diff --git a/docs/content/en/commands/hugo_version.md b/docs/content/en/commands/hugo_version.md index bbc961093..b1a6b971e 100644 --- a/docs/content/en/commands/hugo_version.md +++ b/docs/content/en/commands/hugo_version.md @@ -27,7 +27,6 @@ hugo version [flags] [args] --clock string set the clock used by Hugo, e.g. --clock 2021-11-06T22:30:00.00+09:00 --config string config file (default is hugo.yaml|json|toml) --configDir string config dir (default "config") - --debug debug output -d, --destination string filesystem path to write files to -e, --environment string build environment --ignoreVendorPaths string ignores any _vendor for module paths matching the given Glob pattern @@ -36,7 +35,6 @@ hugo version [flags] [args] -M, --renderToMemory render to memory (mostly useful when running the server) -s, --source string filesystem path to read files relative from --themesDir string filesystem path to themes directory - -v, --verbose verbose output ``` ### SEE ALSO From 6bde8abaad9827f45f5f6c5497ffbe583562ad46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Sun, 17 Nov 2024 11:25:10 +0100 Subject: [PATCH 119/526] deps: Upgrade github.com/bep/imagemeta v0.8.1 => v0.8.3 --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index eeb19b4bb..886737b95 100644 --- a/go.mod +++ b/go.mod @@ -15,7 +15,7 @@ require ( github.com/bep/golibsass v1.2.0 github.com/bep/gowebp v0.3.0 github.com/bep/helpers v0.5.0 - github.com/bep/imagemeta v0.8.1 + github.com/bep/imagemeta v0.8.3 github.com/bep/lazycache v0.7.0 github.com/bep/logg v0.4.0 github.com/bep/mclib v1.20400.20402 diff --git a/go.sum b/go.sum index 6102c4ea2..42f9a0119 100644 --- a/go.sum +++ b/go.sum @@ -141,6 +141,8 @@ 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.8.1 h1:tjZLPRftjxU7PTI87o5e5WKOFQ4S9S0engiP1OTpJTI= github.com/bep/imagemeta v0.8.1/go.mod h1:5piPAq5Qomh07m/dPPCLN3mDJyFusvUG7VwdRD/vX0s= +github.com/bep/imagemeta v0.8.3 h1:68XqpYXjWW9mFjdGurutDmAKBJa9y2aknEBHwY/+3zw= +github.com/bep/imagemeta v0.8.3/go.mod h1:5piPAq5Qomh07m/dPPCLN3mDJyFusvUG7VwdRD/vX0s= github.com/bep/lazycache v0.7.0 h1:VM257SkkjcR9z55eslXTkUIX8QMNKoqQRNKV/4xIkCY= github.com/bep/lazycache v0.7.0/go.mod h1:NmRm7Dexh3pmR1EignYR8PjO2cWybFQ68+QgY3VMCSc= github.com/bep/logg v0.4.0 h1:luAo5mO4ZkhA5M1iDVDqDqnBBnlHjmtZF6VAyTp+nCQ= From 838bd312b1a287bb33962ad478dbc54737654f35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Mon, 18 Nov 2024 10:11:17 +0100 Subject: [PATCH 120/526] Squashed 'docs/' changes from 159c843fd..227aab619 227aab619 Update configuration-markup.md 019ff776c Fix grammatical error c889827bf Remove old new-in 39807c5bc Remove duplicate yaml key git-subtree-dir: docs git-subtree-split: 227aab61905c0f778d173ed9e38621df4d7c429a --- content/en/content-management/archetypes.md | 8 ++++---- content/en/content-management/mathematics.md | 2 +- content/en/functions/lang/FormatNumberCustom.md | 2 +- content/en/getting-started/configuration-markup.md | 4 ++-- content/en/hugo-pipes/transpile-sass-to-css.md | 2 +- content/en/methods/duration/Truncate.md | 1 - content/en/methods/shortcode/Inner.md | 5 +++-- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/content/en/content-management/archetypes.md b/content/en/content-management/archetypes.md index f89c3f6b3..acf101fda 100644 --- a/content/en/content-management/archetypes.md +++ b/content/en/content-management/archetypes.md @@ -86,9 +86,9 @@ Type Site : (`page.Site`) The current site object. See [details](/methods/site/). -## Alternate date format +## Date format -To insert date and time with an alternate format, use the [`time.Now`] function: +To insert date and time with a different format, use the [`time.Now`] function: [`time.Now`]: /functions/time/now/ @@ -169,9 +169,9 @@ content/ └── _index.md ``` -## Use alternate archetype +## Specify archetype -Use the `--kind` command line flag to specify an alternate archetype when creating content. +Use the `--kind` command line flag to specify an archetype when creating content. For example, let's say your site has two sections: articles and tutorials. Create an archetype for each content type: diff --git a/content/en/content-management/mathematics.md b/content/en/content-management/mathematics.md index a01a166dc..3212fe251 100644 --- a/content/en/content-management/mathematics.md +++ b/content/en/content-management/mathematics.md @@ -137,7 +137,7 @@ These are block equations: a^*=x-b^* \] -These are block equations using alternate delimiters: +These are also block equations: $$a^*=x-b^*$$ diff --git a/content/en/functions/lang/FormatNumberCustom.md b/content/en/functions/lang/FormatNumberCustom.md index 5b24aa2c1..603f42087 100644 --- a/content/en/functions/lang/FormatNumberCustom.md +++ b/content/en/functions/lang/FormatNumberCustom.md @@ -15,7 +15,7 @@ action: aliases: ['/functions/numfmt/'] --- -This function formats a number with the given precision. The first options parameter is a space-delimited string of characters to represent negativity, the decimal point, and grouping. The default value is `- . ,`. The second options parameter defines an alternate delimiting character. +This function formats a number with the given precision. The first options parameter is a space-delimited string of characters to represent negativity, the decimal point, and grouping. The default value is `- . ,`. The second options parameter defines an alternative delimiting character. Note that numbers are rounded up at 5 or greater. So, with precision set to 0, 1.5 becomes 2, and 1.4 becomes 1. diff --git a/content/en/getting-started/configuration-markup.md b/content/en/getting-started/configuration-markup.md index bcc997519..3853a3a6a 100644 --- a/content/en/getting-started/configuration-markup.md +++ b/content/en/getting-started/configuration-markup.md @@ -21,7 +21,7 @@ Hugo uses [Goldmark] to render Markdown to HTML. defaultMarkdownHandler = 'goldmark' {{< /code-toggle >}} -Files with the `.md` or `.markdown` extension are processed as Markdown, provided that you have not specified a different [content format] using the `markup` field in front matter. +Files with a `.md`, `.mdown`, or `.markdown` extension are processed as Markdown, provided that you have not specified a different [content format] using the `markup` field in front matter. To use a different renderer for Markdown files, specify one of `asciidocext`, `org`, `pandoc`, or `rst` in your site configuration. @@ -36,7 +36,7 @@ defaultMarkdownHandler|Description To use AsciiDoc, Pandoc, or reStructuredText you must install the relevant renderer and update your [security policy]. {{% note %}} -Unless you need a unique capability provided by one of the alternate Markdown handlers, we strongly recommend that you use the default setting. Goldmark is fast, well maintained, conforms to the [CommonMark] specification, and is compatible with [GitHub Flavored Markdown] (GFM). +Unless you need a unique capability provided by one of the alternative Markdown handlers, we strongly recommend that you use the default setting. Goldmark is fast, well maintained, conforms to the [CommonMark] specification, and is compatible with [GitHub Flavored Markdown] (GFM). [commonmark]: https://spec.commonmark.org/0.30/ [github flavored markdown]: https://github.github.com/gfm/ diff --git a/content/en/hugo-pipes/transpile-sass-to-css.md b/content/en/hugo-pipes/transpile-sass-to-css.md index df7eaa2a9..67ef4b7cd 100644 --- a/content/en/hugo-pipes/transpile-sass-to-css.md +++ b/content/en/hugo-pipes/transpile-sass-to-css.md @@ -62,7 +62,7 @@ precision enableSourceMap : (`bool`) If `true`, generates a source map. -sourceMapIncludeSources {{< new-in 0.108.0 >}} +sourceMapIncludeSources : (`bool`) If `true`, embeds sources in the generated source map. Not applicable to LibSass. includePaths diff --git a/content/en/methods/duration/Truncate.md b/content/en/methods/duration/Truncate.md index 795fcad76..78cddc27a 100644 --- a/content/en/methods/duration/Truncate.md +++ b/content/en/methods/duration/Truncate.md @@ -4,7 +4,6 @@ description: Returns the result of rounding DURATION1 toward zero to a multiple categories: [] keywords: [] action: - related: related: - functions/time/Duration - functions/time/ParseDuration diff --git a/content/en/methods/shortcode/Inner.md b/content/en/methods/shortcode/Inner.md index a428720d7..2814bcc2a 100644 --- a/content/en/methods/shortcode/Inner.md +++ b/content/en/methods/shortcode/Inner.md @@ -11,6 +11,7 @@ action: - methods/shortcode/InnerDeindent returnType: template.HTML signatures: [SHORTCODE.Inner] +toc: true --- This content: @@ -56,7 +57,7 @@ In the example above, the value returned by `Inner` is Markdown, but it was rend {{% /note %}} -## Use the RenderString method +## Use RenderString Let's modify the example above to pass the value returned by `Inner` through the [`RenderString`] method on the `Page` object: @@ -89,7 +90,7 @@ You can use the [`markdownify`] function instead of the `RenderString` method, b [details]: /methods/page/renderstring/ [`markdownify`]: /functions/transform/markdownify/ -## Use alternate notation +## Alternative notation Instead of calling the shortcode with the `{{}}` notation, use the `{{%/* */%}}` notation: From 3a6b2e6b14788222b6d755fccead9c2b6fa9f66a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Nov 2024 08:56:15 +0000 Subject: [PATCH 121/526] build(deps): bump github.com/fsnotify/fsnotify from 1.7.0 to 1.8.0 Bumps [github.com/fsnotify/fsnotify](https://github.com/fsnotify/fsnotify) from 1.7.0 to 1.8.0. - [Release notes](https://github.com/fsnotify/fsnotify/releases) - [Changelog](https://github.com/fsnotify/fsnotify/blob/main/CHANGELOG.md) - [Commits](https://github.com/fsnotify/fsnotify/compare/v1.7.0...v1.8.0) --- updated-dependencies: - dependency-name: github.com/fsnotify/fsnotify dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 886737b95..b5586e011 100644 --- a/go.mod +++ b/go.mod @@ -31,7 +31,7 @@ require ( github.com/fatih/color v1.18.0 github.com/fortytw2/leaktest v1.3.0 github.com/frankban/quicktest v1.14.6 - github.com/fsnotify/fsnotify v1.7.0 + github.com/fsnotify/fsnotify v1.8.0 github.com/getkin/kin-openapi v0.123.0 github.com/ghodss/yaml v1.0.0 github.com/gobuffalo/flect v1.0.3 diff --git a/go.sum b/go.sum index 42f9a0119..e2768d578 100644 --- a/go.sum +++ b/go.sum @@ -139,8 +139,6 @@ 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.8.1 h1:tjZLPRftjxU7PTI87o5e5WKOFQ4S9S0engiP1OTpJTI= -github.com/bep/imagemeta v0.8.1/go.mod h1:5piPAq5Qomh07m/dPPCLN3mDJyFusvUG7VwdRD/vX0s= github.com/bep/imagemeta v0.8.3 h1:68XqpYXjWW9mFjdGurutDmAKBJa9y2aknEBHwY/+3zw= github.com/bep/imagemeta v0.8.3/go.mod h1:5piPAq5Qomh07m/dPPCLN3mDJyFusvUG7VwdRD/vX0s= github.com/bep/lazycache v0.7.0 h1:VM257SkkjcR9z55eslXTkUIX8QMNKoqQRNKV/4xIkCY= @@ -205,8 +203,8 @@ github.com/frankban/quicktest v1.13.0/go.mod h1:qLE0fzW0VuyUAJgPU19zByoIr0HtCHN/ github.com/frankban/quicktest v1.14.2/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/getkin/kin-openapi v0.123.0 h1:zIik0mRwFNLyvtXK274Q6ut+dPh6nlxBp0x7mNrPhs8= github.com/getkin/kin-openapi v0.123.0/go.mod h1:wb1aSZA/iWmorQP9KTAS/phLj/t17B5jT7+fS8ed9NM= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= From 2d503f82acb90de1edfd0fc3cdc6e65af8184b8c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Nov 2024 08:57:17 +0000 Subject: [PATCH 122/526] build(deps): bump github.com/aws/aws-sdk-go-v2 from 1.30.3 to 1.32.4 Bumps [github.com/aws/aws-sdk-go-v2](https://github.com/aws/aws-sdk-go-v2) from 1.30.3 to 1.32.4. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/v1.30.3...v1.32.4) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2 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 b5586e011..a889cd853 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.14.0 github.com/armon/go-radix v1.0.1-0.20221118154546-54df44f2176c - github.com/aws/aws-sdk-go-v2 v1.30.3 + github.com/aws/aws-sdk-go-v2 v1.32.4 github.com/aws/aws-sdk-go-v2/service/cloudfront v1.38.4 github.com/bep/clocks v0.5.0 github.com/bep/debounce v1.2.0 @@ -118,7 +118,7 @@ require ( github.com/aws/aws-sdk-go-v2/service/sso v1.22.4 // indirect 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.20.3 // indirect + github.com/aws/smithy-go v1.22.0 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.4 // indirect github.com/dlclark/regexp2 v1.11.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect diff --git a/go.sum b/go.sum index e2768d578..5db7f7a4e 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.30.3 h1:jUeBtG0Ih+ZIFH0F4UkmL9w3cSpaMv9tYYDbzILP8dY= -github.com/aws/aws-sdk-go-v2 v1.30.3/go.mod h1:nIQjQVp5sfpQcTc9mPSr1B0PaWK5ByX9MOoDadSN4lc= +github.com/aws/aws-sdk-go-v2 v1.32.4 h1:S13INUiTxgrPueTmrm5DZ+MiAo99zYzHEFh1UNkOxNE= +github.com/aws/aws-sdk-go-v2 v1.32.4/go.mod h1:2SK5n0a2karNTv5tbP1SjsX0uhttou00v/HpXKM1ZUo= 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= @@ -119,8 +119,8 @@ github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.4 h1:yiwVzJW2ZxZTurVbYWA7QOrA github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.4/go.mod h1:0oxfLkpz3rQ/CHlx5hB7H69YUpFiI1tql6Q6Ne+1bCw= github.com/aws/aws-sdk-go-v2/service/sts v1.30.3 h1:ZsDKRLXGWHk8WdtyYMoGNO7bTudrvuKpDKgMVRlepGE= github.com/aws/aws-sdk-go-v2/service/sts v1.30.3/go.mod h1:zwySh8fpFyXp9yOr/KVzxOl8SRqgf/IDw5aUt9UKFcQ= -github.com/aws/smithy-go v1.20.3 h1:ryHwveWzPV5BIof6fyDvor6V3iUL7nTfiTKXHiW05nE= -github.com/aws/smithy-go v1.20.3/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= +github.com/aws/smithy-go v1.22.0 h1:uunKnWlcoL3zO7q+gG2Pk53joueEOsnNB28QdMsmiMM= +github.com/aws/smithy-go v1.22.0/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= github.com/bep/clocks v0.5.0 h1:hhvKVGLPQWRVsBP/UB7ErrHYIO42gINVbvqxvYTPVps= github.com/bep/clocks v0.5.0/go.mod h1:SUq3q+OOq41y2lRQqH5fsOoxN8GbxSiT6jvoVVLCVhU= github.com/bep/debounce v1.2.0 h1:wXds8Kq8qRfwAOpAxHrJDbCXgC5aHSzgQb/0gKsHQqo= From 61e2ce2a49ad49fccdd1dc5f8aeb42616ac313f3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Nov 2024 08:54:55 +0000 Subject: [PATCH 123/526] build(deps): bump google.golang.org/api from 0.191.0 to 0.206.0 Bumps [google.golang.org/api](https://github.com/googleapis/google-api-go-client) from 0.191.0 to 0.206.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.191.0...v0.206.0) --- updated-dependencies: - dependency-name: google.golang.org/api dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 40 +++++++++++++------------- go.sum | 88 +++++++++++++++++++++++++++++----------------------------- 2 files changed, 64 insertions(+), 64 deletions(-) diff --git a/go.mod b/go.mod index a889cd853..dcf1926f6 100644 --- a/go.mod +++ b/go.mod @@ -82,16 +82,16 @@ require ( golang.org/x/sync v0.9.0 golang.org/x/text v0.20.0 golang.org/x/tools v0.27.0 - google.golang.org/api v0.191.0 + google.golang.org/api v0.206.0 gopkg.in/yaml.v2 v2.4.0 ) require ( - cloud.google.com/go v0.115.0 // indirect - cloud.google.com/go/auth v0.8.1 // indirect - cloud.google.com/go/auth/oauth2adapt v0.2.4 // indirect - cloud.google.com/go/compute/metadata v0.5.0 // indirect - cloud.google.com/go/iam v1.1.13 // indirect + cloud.google.com/go v0.116.0 // indirect + cloud.google.com/go/auth v0.10.2 // indirect + cloud.google.com/go/auth/oauth2adapt v0.2.5 // indirect + cloud.google.com/go/compute/metadata v0.5.2 // indirect + cloud.google.com/go/iam v1.2.2 // indirect cloud.google.com/go/storage v1.43.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 @@ -131,8 +131,8 @@ require ( github.com/google/s2a-go v0.1.8 // 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.2 // indirect - github.com/googleapis/gax-go/v2 v2.13.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.4 // indirect + github.com/googleapis/gax-go/v2 v2.14.0 // indirect github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/invopop/yaml v0.2.0 // indirect @@ -149,21 +149,21 @@ require ( github.com/pkg/errors v0.9.1 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 // indirect - go.opentelemetry.io/otel v1.28.0 // indirect - go.opentelemetry.io/otel/metric v1.28.0 // indirect - go.opentelemetry.io/otel/trace v1.28.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 // indirect + go.opentelemetry.io/otel v1.29.0 // indirect + go.opentelemetry.io/otel/metric v1.29.0 // indirect + go.opentelemetry.io/otel/trace v1.29.0 // indirect golang.org/x/crypto v0.29.0 // indirect - golang.org/x/oauth2 v0.22.0 // indirect + golang.org/x/oauth2 v0.24.0 // indirect golang.org/x/sys v0.27.0 // indirect - golang.org/x/time v0.6.0 // indirect + golang.org/x/time v0.8.0 // indirect golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9 // indirect - google.golang.org/genproto v0.0.0-20240812133136-8ffd90a71988 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240812133136-8ffd90a71988 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240812133136-8ffd90a71988 // indirect - google.golang.org/grpc v1.65.0 // indirect - google.golang.org/protobuf v1.34.2 // indirect + google.golang.org/genproto v0.0.0-20241104194629-dd2ea8efbc28 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 // indirect + google.golang.org/grpc v1.67.1 // indirect + google.golang.org/protobuf v1.35.1 // 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 5db7f7a4e..4a61c396a 100644 --- a/go.sum +++ b/go.sum @@ -17,26 +17,26 @@ 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.115.0 h1:CnFSK6Xo3lDYRoBKEcAtia6VSC837/ZkJuRduSFnr14= -cloud.google.com/go v0.115.0/go.mod h1:8jIM5vVgoAEoiVxQ/O4BFTfHqulPZgs/ufEzMcFMdWU= -cloud.google.com/go/auth v0.8.1 h1:QZW9FjC5lZzN864p13YxvAtGUlQ+KgRL+8Sg45Z6vxo= -cloud.google.com/go/auth v0.8.1/go.mod h1:qGVp/Y3kDRSDZ5gFD/XPUfYQ9xW1iI7q8RIRoCyBbJc= -cloud.google.com/go/auth/oauth2adapt v0.2.4 h1:0GWE/FUsXhf6C+jAkWgYm7X9tK8cuEIfy19DBn6B6bY= -cloud.google.com/go/auth/oauth2adapt v0.2.4/go.mod h1:jC/jOpwFP6JBxhB3P5Rr0a9HLMC/Pe3eaL4NmdvqPtc= +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.10.2 h1:oKF7rgBfSHdp/kuhXtqU/tNDr0mZqhYbEh+6SiqzkKo= +cloud.google.com/go/auth v0.10.2/go.mod h1:xxA5AqpDrvS+Gkmo9RqrGGRh6WSNKKOXhY3zNOr38tI= +cloud.google.com/go/auth/oauth2adapt v0.2.5 h1:2p29+dePqsCHPP1bqDJcKj4qxRyYCcbzKpFyKGt3MTk= +cloud.google.com/go/auth/oauth2adapt v0.2.5/go.mod h1:AlmsELtlEBnaNTL7jCj8VQFLy6mbZv0s4Q7NGBeQ5E8= 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.5.0 h1:Zr0eK8JbFv6+Wi4ilXAR8FJ3wyNdpxHKJNPos6LTZOY= -cloud.google.com/go/compute/metadata v0.5.0/go.mod h1:aHnloV2TPI38yx4s9+wAZhHykWvVCfu7hQbF+9CWoiY= +cloud.google.com/go/compute/metadata v0.5.2 h1:UxK4uu/Tn+I3p2dYWTfiX4wva7aYlKixAHn3fyqngqo= +cloud.google.com/go/compute/metadata v0.5.2/go.mod h1:C66sj2AluDcIqakBq/M8lw8/ybHgOZqin2obFxa/E5k= 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.1.13 h1:7zWBXG9ERbMLrzQBRhFliAV+kjcRToDTgQT3CTwYyv4= -cloud.google.com/go/iam v1.1.13/go.mod h1:K8mY0uSXwEXS30KrnVb+j54LB/ntfZu1dr+4zFMNbus= -cloud.google.com/go/longrunning v0.5.12 h1:5LqSIdERr71CqfUsFlJdBpOkBH8FBCFD7P1nTWy3TYE= -cloud.google.com/go/longrunning v0.5.12/go.mod h1:S5hMV8CDJ6r50t2ubVJSKQVv5u0rmik5//KgLO3k4lU= +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/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= @@ -320,12 +320,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.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= -github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= +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/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.13.0 h1:yitjD5f7jQHhyDsnhKEBU52NdvvdSeGzlAnDPT0hH1s= -github.com/googleapis/gax-go/v2 v2.13.0/go.mod h1:Z/fvTZXF8/uw7Xu5GuslPw+bplx6SS338j1Is2S+B7A= +github.com/googleapis/gax-go/v2 v2.14.0 h1:f+jMrjBPl+DL9nI4IQzLUxMq7XrAqFYB7hBPqMNIe8o= +github.com/googleapis/gax-go/v2 v2.14.0/go.mod h1:lhBCnjdLrWRaPvLWhmc8IS24m9mr07qSYnHncrgo+zk= 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= @@ -482,18 +482,18 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0 h1:9G6E0TXzGFVfTnawRzrPl83iHOAV7L8NJiR8RSGYV1g= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0/go.mod h1:azvtTADFQJA8mX80jIH/akaE7h+dbm/sVuaHqN13w74= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 h1:4K4tsIXefpVJtvA/8srF4V4y0akAoPHkIslgAkjixJA= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0/go.mod h1:jjdQuTGVsXV4vSs+CJ2qYDeDPf9yIJV23qlIzBm73Vg= -go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo= -go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4= -go.opentelemetry.io/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6bOeuA5Q= -go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s= -go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= -go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= -go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g= -go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0 h1:r6I7RJCN86bpD/FQwedZ0vSixDpwuWREjW9oRMsmqDc= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0/go.mod h1:B9yO6b04uB80CzjedvewuqDhxJxi11s7/GtiGa8bAjI= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 h1:TT4fX+nBOA/+LUkobKGW1ydGcn+G3vRw9+g5HwCphpk= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0/go.mod h1:L7UH0GbB0p47T4Rri3uHjbpCFYrVrwc1I25QhNPiGK8= +go.opentelemetry.io/otel v1.29.0 h1:PdomN/Al4q/lN6iBJEN3AwPvUiHPMlt93c8bqTG5Llw= +go.opentelemetry.io/otel v1.29.0/go.mod h1:N/WtXPs1CNCUEx+Agz5uouwCba+i+bJGFicT8SR4NP8= +go.opentelemetry.io/otel/metric v1.29.0 h1:vPf/HFWTNkPu1aYeIsc98l4ktOQaL6LeSoeV2g+8YLc= +go.opentelemetry.io/otel/metric v1.29.0/go.mod h1:auu/QWieFVWx+DmQOUMgj0F8LHWdgalxXqvp7BII/W8= +go.opentelemetry.io/otel/sdk v1.29.0 h1:vkqKjk7gwhS8VaWb0POZKmIEDimRCMsopNYnriHyryo= +go.opentelemetry.io/otel/sdk v1.29.0/go.mod h1:pM8Dx5WKnvxLCb+8lG1PRNIDxu9g9b9g59Qr7hfAAok= +go.opentelemetry.io/otel/trace v1.29.0 h1:J/8ZNK4XgR7a21DZUAsbF8pZ5Jcw1VhACmnYt39JTi4= +go.opentelemetry.io/otel/trace v1.29.0/go.mod h1:eHl3w0sp3paPkYstJOmAimxhiFXPg+MMTlEh3nsQgWQ= 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.39.0 h1:EYABYGhAalPUaMrbSKOr5lejxoxvXj99nE8XFtsDgds= @@ -606,8 +606,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.22.0 h1:BzDx2FehcG7jJwgWLELCdmLuxk2i+x9UDpSiss2u0ZA= -golang.org/x/oauth2 v0.22.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE= +golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= 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= @@ -697,8 +697,8 @@ golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4= 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.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U= -golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/time v0.8.0 h1:9i3RxcPv3PZnitoVGMPDKZSq1xW1gK1Xy3ArNOGZfEg= +golang.org/x/time v0.8.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= 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= @@ -778,8 +778,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.191.0 h1:cJcF09Z+4HAB2t5qTQM1ZtfL/PemsLFkcFG67qq2afk= -google.golang.org/api v0.191.0/go.mod h1:tD5dsFGxFza0hnQveGfVk9QQYKcfp+VzgRqyXFxE0+E= +google.golang.org/api v0.206.0 h1:A27GClesCSheW5P2BymVHjpEeQ2XHH8DI8Srs2HI2L8= +google.golang.org/api v0.206.0/go.mod h1:BtB8bfjTYIrai3d8UyvPmV9REGgox7coh+ZRwm0b+W8= 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= @@ -823,12 +823,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-20240812133136-8ffd90a71988 h1:CT2Thj5AuPV9phrYMtzX11k+XkzMGfRAet42PmoTATM= -google.golang.org/genproto v0.0.0-20240812133136-8ffd90a71988/go.mod h1:7uvplUBj4RjHAxIZ//98LzOvrQ04JBkaixRmCMI29hc= -google.golang.org/genproto/googleapis/api v0.0.0-20240812133136-8ffd90a71988 h1:+/tmTy5zAieooKIXfzDm9KiA3Bv6JBwriRN9LY+yayk= -google.golang.org/genproto/googleapis/api v0.0.0-20240812133136-8ffd90a71988/go.mod h1:4+X6GvPs+25wZKbQq9qyAXrwIRExv7w0Ea6MgZLZiDM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240812133136-8ffd90a71988 h1:V71AcdLZr2p8dC9dbOIMCpqi4EmRl8wUwnJzXXLmbmc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240812133136-8ffd90a71988/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= +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-20241104194629-dd2ea8efbc28 h1:M0KvPgPmDZHPlbRbaNU1APr28TvwvvdUPlSv7PUvy8g= +google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:dguCy7UOdZhTvLzDyt15+rOrawrpM4q7DD9dQ1P11P4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 h1:XVhgTWWV3kGQlwJHR3upFWZeTsei6Oks1apkZSeonIE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= 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= @@ -845,8 +845,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.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc= -google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ= +google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E= +google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= 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= @@ -857,8 +857,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.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= -google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= +google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= +google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= 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 1fd845eee4d2d0dc264c0f45471815d00160f7dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Mon, 18 Nov 2024 10:26:35 +0100 Subject: [PATCH 124/526] dartsass: Remove support for v1 of the protocol/binary (note) People who stil use a very old binary named `dart-sass-embedded` need to upgrade. See https://gohugo.io/functions/css/sass/#dart-sass --- common/herrors/file_error.go | 11 --- common/hugo/hugo.go | 24 ++--- go.mod | 1 - go.sum | 7 -- .../tocss/dartsass/client.go | 95 +++++-------------- .../tocss/dartsass/transform.go | 10 -- 6 files changed, 35 insertions(+), 113 deletions(-) diff --git a/common/herrors/file_error.go b/common/herrors/file_error.go index 32a6f0081..007a06b48 100644 --- a/common/herrors/file_error.go +++ b/common/herrors/file_error.go @@ -20,8 +20,6 @@ import ( "io" "path/filepath" - godartsassv1 "github.com/bep/godartsass" - "github.com/bep/godartsass/v2" "github.com/bep/golibsass/libsass/libsasserrors" "github.com/gohugoio/hugo/common/paths" @@ -153,8 +151,6 @@ func (e *fileError) causeString() string { // Avoid repeating the file info in the error message. case godartsass.SassError: return v.Message - case godartsassv1.SassError: - return v.Message case libsasserrors.Error: return v.Message default: @@ -392,13 +388,6 @@ func extractPosition(e error) (pos text.Position) { pos.Filename = filename pos.Offset = start.Offset pos.ColumnNumber = start.Column - case godartsassv1.SassError: - span := v.Span - start := span.Start - filename, _ := paths.UrlToFilename(span.Url) - pos.Filename = filename - pos.Offset = start.Offset - pos.ColumnNumber = start.Column case libsasserrors.Error: pos.Filename = v.File pos.LineNumber = v.Line diff --git a/common/hugo/hugo.go b/common/hugo/hugo.go index dd43cf7b6..11ec40e0b 100644 --- a/common/hugo/hugo.go +++ b/common/hugo/hugo.go @@ -25,9 +25,7 @@ import ( "sync" "time" - godartsassv1 "github.com/bep/godartsass" "github.com/bep/logg" - "github.com/mitchellh/mapstructure" "github.com/bep/godartsass/v2" "github.com/gohugoio/hugo/common/hcontext" @@ -318,7 +316,7 @@ func GetDependencyListNonGo() []string { if dartSass := dartSassVersion(); dartSass.ProtocolVersion != "" { dartSassPath := "github.com/sass/dart-sass-embedded" - if IsDartSassV2() { + if IsDartSassGeV2() { dartSassPath = "github.com/sass/dart-sass" } deps = append(deps, @@ -365,22 +363,15 @@ type Dependency struct { } func dartSassVersion() godartsass.DartSassVersion { - if DartSassBinaryName == "" { + if DartSassBinaryName == "" || !IsDartSassGeV2() { return godartsass.DartSassVersion{} } - if IsDartSassV2() { - v, _ := godartsass.Version(DartSassBinaryName) - return v - } - - v, _ := godartsassv1.Version(DartSassBinaryName) - var vv godartsass.DartSassVersion - mapstructure.WeakDecode(v, &vv) - return vv + v, _ := godartsass.Version(DartSassBinaryName) + return v } // DartSassBinaryName is the name of the Dart Sass binary to use. -// TODO(beop) find a better place for this. +// TODO(bep) find a better place for this. var DartSassBinaryName string func init() { @@ -405,7 +396,10 @@ var ( dartSassBinaryNamesV2 = []string{"dart-sass", "sass"} ) -func IsDartSassV2() bool { +// TODO(bep) we eventually want to remove this, but keep it for a while to throw an informative error. +// We stopped supporting the old binary in Hugo 0.139.0. +func IsDartSassGeV2() bool { + // dart-sass-embedded was the first version of the embedded Dart Sass before it was moved into the main project. return !strings.Contains(DartSassBinaryName, "embedded") } diff --git a/go.mod b/go.mod index dcf1926f6..c19e8da34 100644 --- a/go.mod +++ b/go.mod @@ -10,7 +10,6 @@ require ( github.com/bep/debounce v1.2.0 github.com/bep/gitmap v1.6.0 github.com/bep/goat v0.5.0 - github.com/bep/godartsass v1.2.0 github.com/bep/godartsass/v2 v2.2.0 github.com/bep/golibsass v1.2.0 github.com/bep/gowebp v0.3.0 diff --git a/go.sum b/go.sum index 4a61c396a..0ba28ce4d 100644 --- a/go.sum +++ b/go.sum @@ -129,8 +129,6 @@ github.com/bep/gitmap v1.6.0 h1:sDuQMm9HoTL0LtlrfxjbjgAg2wHQd4nkMup2FInYzhA= github.com/bep/gitmap v1.6.0/go.mod h1:n+3W1f/rot2hynsqEGxGMErPRgT41n9CkGuzPvz9cIw= github.com/bep/goat v0.5.0 h1:S8jLXHCVy/EHIoCY+btKkmcxcXFd34a0Q63/0D4TKeA= github.com/bep/goat v0.5.0/go.mod h1:Md9x7gRxiWKs85yHlVTvHQw9rg86Bm+Y4SuYE8CTH7c= -github.com/bep/godartsass v1.2.0 h1:E2VvQrxAHAFwbjyOIExAMmogTItSKodoKuijNrGm5yU= -github.com/bep/godartsass v1.2.0/go.mod h1:6LvK9RftsXMxGfsA0LDV12AGc4Jylnu6NgHL+Q5/pE8= github.com/bep/godartsass/v2 v2.2.0 h1:3hO9Dt4BOnxkKmRxc+OpoKVFrDvBycpSCXEdElVAMVI= github.com/bep/godartsass/v2 v2.2.0/go.mod h1:AcP8QgC+OwOXEq6im0WgDRYK7scDsmZCEW62o1prQLo= github.com/bep/golibsass v1.2.0 h1:nyZUkKP/0psr8nT6GR2cnmt99xS93Ji82ZD9AgOK6VI= @@ -163,7 +161,6 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/clbanning/mxj/v2 v2.7.0 h1:WA/La7UGCanFe5NpHF0Q3DNtnCsVoxbPKuyBNHWRyME= github.com/clbanning/mxj/v2 v2.7.0/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s= -github.com/cli/safeexec v1.0.0/go.mod h1:Z/D4tTN8Vs5gXYHDCbaM1S/anmEDnJb1iW0+EJ5zx3Q= github.com/cli/safeexec v1.0.1 h1:e/C79PbXF4yYTN/wauC4tviMxEV13BwljGj0N9j+N00= github.com/cli/safeexec v1.0.1/go.mod h1:Z/D4tTN8Vs5gXYHDCbaM1S/anmEDnJb1iW0+EJ5zx3Q= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= @@ -200,7 +197,6 @@ github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHqu github.com/frankban/quicktest v1.4.1/go.mod h1:36zfPVQyHxymz4cH7wlDmVwDrJuljRB60qkgn7rorfQ= github.com/frankban/quicktest v1.7.2/go.mod h1:jaStnuzAqU1AJdCO0l53JDCJrVDKcS03DbaAcR7Ks/o= github.com/frankban/quicktest v1.13.0/go.mod h1:qLE0fzW0VuyUAJgPU19zByoIr0HtCHN/r/VLSOOIySU= -github.com/frankban/quicktest v1.14.2/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= @@ -287,7 +283,6 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= @@ -358,7 +353,6 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -417,7 +411,6 @@ github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4 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/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= diff --git a/resources/resource_transformers/tocss/dartsass/client.go b/resources/resource_transformers/tocss/dartsass/client.go index e6f5567e4..b42327621 100644 --- a/resources/resource_transformers/tocss/dartsass/client.go +++ b/resources/resource_transformers/tocss/dartsass/client.go @@ -20,7 +20,6 @@ import ( "io" "strings" - godartsassv1 "github.com/bep/godartsass" "github.com/bep/godartsass/v2" "github.com/bep/logg" "github.com/gohugoio/hugo/common/herrors" @@ -52,54 +51,39 @@ func New(fs *filesystems.SourceFilesystem, rs *resources.Spec) (*Client, error) return nil, fmt.Errorf("no Dart Sass binary found in $PATH") } + if !hugo.IsDartSassGeV2() { + return nil, fmt.Errorf("unsupported Dart Sass version detected, please upgrade to Dart Sass 2.0 or later, see https://gohugo.io/functions/css/sass/#dart-sass") + } + if err := rs.ExecHelper.Sec().CheckAllowedExec(hugo.DartSassBinaryName); err != nil { return nil, err } var ( - transpiler *godartsass.Transpiler - transpilerv1 *godartsassv1.Transpiler - err error - infol = rs.Logger.InfoCommand("Dart Sass") - warnl = rs.Logger.WarnCommand("Dart Sass") + transpiler *godartsass.Transpiler + err error + infol = rs.Logger.InfoCommand("Dart Sass") + warnl = rs.Logger.WarnCommand("Dart Sass") ) - if hugo.IsDartSassV2() { - transpiler, err = godartsass.Start(godartsass.Options{ - DartSassEmbeddedFilename: hugo.DartSassBinaryName, - LogEventHandler: func(event godartsass.LogEvent) { - message := strings.ReplaceAll(event.Message, dartSassStdinPrefix, "") - switch event.Type { - case godartsass.LogEventTypeDebug: - // Log as Info for now, we may adjust this if it gets too chatty. - infol.Log(logg.String(message)) - default: - // The rest are either deprecations or @warn statements. - warnl.Log(logg.String(message)) - } - }, - }) - } else { - transpilerv1, err = godartsassv1.Start(godartsassv1.Options{ - DartSassEmbeddedFilename: hugo.DartSassBinaryName, - LogEventHandler: func(event godartsassv1.LogEvent) { - message := strings.ReplaceAll(event.Message, dartSassStdinPrefix, "") - switch event.Type { - case godartsassv1.LogEventTypeDebug: - // Log as Info for now, we may adjust this if it gets too chatty. - infol.Log(logg.String(message)) - default: - // The rest are either deprecations or @warn statements. - warnl.Log(logg.String(message)) - } - }, - }) - } - + transpiler, err = godartsass.Start(godartsass.Options{ + DartSassEmbeddedFilename: hugo.DartSassBinaryName, + LogEventHandler: func(event godartsass.LogEvent) { + message := strings.ReplaceAll(event.Message, dartSassStdinPrefix, "") + switch event.Type { + case godartsass.LogEventTypeDebug: + // Log as Info for now, we may adjust this if it gets too chatty. + infol.Log(logg.String(message)) + default: + // The rest are either deprecations or @warn statements. + warnl.Log(logg.String(message)) + } + }, + }) if err != nil { return nil, err } - return &Client{sfs: fs, workFs: rs.BaseFs.Work, rs: rs, transpiler: transpiler, transpilerV1: transpilerv1}, nil + return &Client{sfs: fs, workFs: rs.BaseFs.Work, rs: rs, transpiler: transpiler}, nil } type Client struct { @@ -108,9 +92,7 @@ type Client struct { sfs *filesystems.SourceFilesystem workFs afero.Fs - // One of these are non-nil. - transpiler *godartsass.Transpiler - transpilerV1 *godartsassv1.Transpiler + transpiler *godartsass.Transpiler } func (c *Client) ToCSS(res resources.ResourceTransformer, args map[string]any) (resource.Resource, error) { @@ -121,13 +103,7 @@ func (c *Client) ToCSS(res resources.ResourceTransformer, args map[string]any) ( } func (c *Client) Close() error { - if c.transpilerV1 != nil { - return c.transpilerV1.Close() - } - if c.transpiler != nil { - return c.transpiler.Close() - } - return nil + return c.transpiler.Close() } func (c *Client) toCSS(args godartsass.Args, src io.Reader) (godartsass.Result, error) { @@ -135,26 +111,7 @@ func (c *Client) toCSS(args godartsass.Args, src io.Reader) (godartsass.Result, args.Source = in - var ( - err error - res godartsass.Result - ) - - if c.transpilerV1 != nil { - var resv1 godartsassv1.Result - var argsv1 godartsassv1.Args - mapstructure.Decode(args, &argsv1) - if args.ImportResolver != nil { - argsv1.ImportResolver = importResolverV1{args.ImportResolver} - } - resv1, err = c.transpilerV1.Execute(argsv1) - if err == nil { - mapstructure.Decode(resv1, &res) - } - } else { - res, err = c.transpiler.Execute(args) - } - + res, err := c.transpiler.Execute(args) if err != nil { if err.Error() == "unexpected EOF" { //lint:ignore ST1005 end user message. diff --git a/resources/resource_transformers/tocss/dartsass/transform.go b/resources/resource_transformers/tocss/dartsass/transform.go index d8b6ae5b4..e23ef0986 100644 --- a/resources/resource_transformers/tocss/dartsass/transform.go +++ b/resources/resource_transformers/tocss/dartsass/transform.go @@ -35,7 +35,6 @@ import ( "github.com/gohugoio/hugo/hugofs" - godartsassv1 "github.com/bep/godartsass" "github.com/bep/godartsass/v2" ) @@ -206,12 +205,3 @@ func (t importResolver) Load(url string) (godartsass.Import, error) { return godartsass.Import{Content: string(b), SourceSyntax: sourceSyntax}, err } - -type importResolverV1 struct { - godartsass.ImportResolver -} - -func (t importResolverV1) Load(url string) (godartsassv1.Import, error) { - res, err := t.ImportResolver.Load(url) - return godartsassv1.Import{Content: res.Content, SourceSyntax: godartsassv1.SourceSyntax(res.SourceSyntax)}, err -} From 3b6eaf9b1f128b36fe25478b2e7c4d8463e5ab58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Mon, 18 Nov 2024 10:04:37 +0100 Subject: [PATCH 125/526] dartsass: Add silenceDeprecations option Fixes #13045 --- docs/content/en/functions/css/Sass.md | 3 ++ go.mod | 2 +- go.sum | 2 ++ hugolib/integrationtest_builder.go | 7 ++++ .../tocss/dartsass/client.go | 9 ++++- .../dartsass/dartsass_integration_test.go | 35 +++++++++++++++++++ .../tocss/dartsass/transform.go | 1 + 7 files changed, 57 insertions(+), 2 deletions(-) diff --git a/docs/content/en/functions/css/Sass.md b/docs/content/en/functions/css/Sass.md index 328037bb9..793c0c1ac 100644 --- a/docs/content/en/functions/css/Sass.md +++ b/docs/content/en/functions/css/Sass.md @@ -86,6 +86,9 @@ includePaths {{ 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 The extended version of Hugo includes [LibSass] to transpile Sass to CSS. In 2020, the Sass team deprecated LibSass in favor of [Dart Sass]. diff --git a/go.mod b/go.mod index c19e8da34..82a59ac91 100644 --- a/go.mod +++ b/go.mod @@ -10,7 +10,7 @@ require ( github.com/bep/debounce v1.2.0 github.com/bep/gitmap v1.6.0 github.com/bep/goat v0.5.0 - github.com/bep/godartsass/v2 v2.2.0 + github.com/bep/godartsass/v2 v2.3.0 github.com/bep/golibsass v1.2.0 github.com/bep/gowebp v0.3.0 github.com/bep/helpers v0.5.0 diff --git a/go.sum b/go.sum index 0ba28ce4d..a3af71aee 100644 --- a/go.sum +++ b/go.sum @@ -131,6 +131,8 @@ github.com/bep/goat v0.5.0 h1:S8jLXHCVy/EHIoCY+btKkmcxcXFd34a0Q63/0D4TKeA= github.com/bep/goat v0.5.0/go.mod h1:Md9x7gRxiWKs85yHlVTvHQw9rg86Bm+Y4SuYE8CTH7c= github.com/bep/godartsass/v2 v2.2.0 h1:3hO9Dt4BOnxkKmRxc+OpoKVFrDvBycpSCXEdElVAMVI= github.com/bep/godartsass/v2 v2.2.0/go.mod h1:AcP8QgC+OwOXEq6im0WgDRYK7scDsmZCEW62o1prQLo= +github.com/bep/godartsass/v2 v2.3.0 h1:gEMyq/bNn4hxpUSwy/NKyOTqPqVh3AedhMHvQR+x0kU= +github.com/bep/godartsass/v2 v2.3.0/go.mod h1:AcP8QgC+OwOXEq6im0WgDRYK7scDsmZCEW62o1prQLo= github.com/bep/golibsass v1.2.0 h1:nyZUkKP/0psr8nT6GR2cnmt99xS93Ji82ZD9AgOK6VI= github.com/bep/golibsass v1.2.0/go.mod h1:DL87K8Un/+pWUS75ggYv41bliGiolxzDKWJAq3eJ1MA= github.com/bep/gowebp v0.3.0 h1:MhmMrcf88pUY7/PsEhMgEP0T6fDUnRTMpN8OclDrbrY= diff --git a/hugolib/integrationtest_builder.go b/hugolib/integrationtest_builder.go index 5dc13592f..637e5dee0 100644 --- a/hugolib/integrationtest_builder.go +++ b/hugolib/integrationtest_builder.go @@ -76,6 +76,13 @@ func TestOptWarn() TestOpt { } } +// TestOptOsFs will enable the real file system in integration tests. +func TestOptOsFs() TestOpt { + return func(c *IntegrationTestConfig) { + c.NeedsOsFS = true + } +} + // TestOptWithNFDOnDarwin will normalize the Unicode filenames to NFD on Darwin. func TestOptWithNFDOnDarwin() TestOpt { return func(c *IntegrationTestConfig) { diff --git a/resources/resource_transformers/tocss/dartsass/client.go b/resources/resource_transformers/tocss/dartsass/client.go index b42327621..762828b70 100644 --- a/resources/resource_transformers/tocss/dartsass/client.go +++ b/resources/resource_transformers/tocss/dartsass/client.go @@ -74,8 +74,10 @@ func New(fs *filesystems.SourceFilesystem, rs *resources.Spec) (*Client, error) case godartsass.LogEventTypeDebug: // Log as Info for now, we may adjust this if it gets too chatty. infol.Log(logg.String(message)) + case godartsass.LogEventTypeDeprecated: + warnl.Logf("DEPRECATED [%s]: %s", event.DeprecationType, message) default: - // The rest are either deprecations or @warn statements. + // The rest are @warn statements. warnl.Log(logg.String(message)) } }, @@ -151,6 +153,11 @@ type Options struct { // @use "hugo:vars"; // $color: vars.$color; Vars map[string]any + + // Deprecations IDs in this slice will be silenced. + // The IDs can be found in the Dart Sass log output, e.g. "import" in + // WARN Dart Sass: DEPRECATED [import]. + SilenceDeprecations []string } func decodeOptions(m map[string]any) (opts Options, err error) { diff --git a/resources/resource_transformers/tocss/dartsass/dartsass_integration_test.go b/resources/resource_transformers/tocss/dartsass/dartsass_integration_test.go index 2aac2c5fb..5d1b89eaf 100644 --- a/resources/resource_transformers/tocss/dartsass/dartsass_integration_test.go +++ b/resources/resource_transformers/tocss/dartsass/dartsass_integration_test.go @@ -605,3 +605,38 @@ module hugo-github-issue-12849 b.AssertFileContent("public/index.html", ".foo{color:red}.bar{color:green}") } + +func TestIgnoreDeprecationWarnings(t *testing.T) { + t.Parallel() + if !dartsass.Supports() { + t.Skip() + } + + files := ` +-- hugo.toml -- +disableKinds = ['page','section','rss','sitemap','taxonomy','term'] +-- assets/scss/main.scss -- +@import "moo"; +-- node_modules/foo/_moo.scss -- +$moolor: #fff; + +moo { + color: $moolor; +} +-- config.toml -- +-- layouts/index.html -- +{{ $cssOpts := (dict "includePaths" (slice "node_modules/foo") "transpiler" "dartsass" ) }} +{{ $r := resources.Get "scss/main.scss" | toCSS $cssOpts | minify }} +T1: {{ $r.Content }} + ` + + b := hugolib.Test(t, files, hugolib.TestOptOsFs(), hugolib.TestOptWarn()) + b.AssertLogContains("Dart Sass: DEPRECATED [import]") + b.AssertFileContent("public/index.html", `moo{color:#fff}`) + + files = strings.ReplaceAll(files, `"transpiler" "dartsass"`, `"transpiler" "dartsass" "silenceDeprecations" (slice "import")`) + + b = hugolib.Test(t, files, hugolib.TestOptOsFs(), hugolib.TestOptWarn()) + b.AssertLogContains("! Dart Sass: DEPRECATED [import]") + b.AssertFileContent("public/index.html", `moo{color:#fff}`) +} diff --git a/resources/resource_transformers/tocss/dartsass/transform.go b/resources/resource_transformers/tocss/dartsass/transform.go index e23ef0986..c5f97abff 100644 --- a/resources/resource_transformers/tocss/dartsass/transform.go +++ b/resources/resource_transformers/tocss/dartsass/transform.go @@ -89,6 +89,7 @@ func (t *transform) Transform(ctx *resources.ResourceTransformationCtx) error { OutputStyle: godartsass.ParseOutputStyle(opts.OutputStyle), EnableSourceMap: opts.EnableSourceMap, SourceMapIncludeSources: opts.SourceMapIncludeSources, + SilenceDeprecations: opts.SilenceDeprecations, } // Append any workDir relative include paths From eb298144b63cfa9e6720ec5731c7687d7df15955 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Nov 2024 09:52:23 +0000 Subject: [PATCH 126/526] build(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudfront Bumps [github.com/aws/aws-sdk-go-v2/service/cloudfront](https://github.com/aws/aws-sdk-go-v2) from 1.38.4 to 1.41.0. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/s3/v1.38.4...service/s3/v1.41.0) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/cloudfront 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 82a59ac91..3013813ab 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ require ( github.com/alecthomas/chroma/v2 v2.14.0 github.com/armon/go-radix v1.0.1-0.20221118154546-54df44f2176c github.com/aws/aws-sdk-go-v2 v1.32.4 - github.com/aws/aws-sdk-go-v2/service/cloudfront v1.38.4 + github.com/aws/aws-sdk-go-v2/service/cloudfront v1.41.0 github.com/bep/clocks v0.5.0 github.com/bep/debounce v1.2.0 github.com/bep/gitmap v1.6.0 @@ -105,8 +105,8 @@ require ( github.com/aws/aws-sdk-go-v2/credentials v1.17.27 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.11 // indirect github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.10 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.15 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.15 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.23 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.23 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 // indirect github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.15 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.3 // indirect diff --git a/go.sum b/go.sum index a3af71aee..32005ff6f 100644 --- a/go.sum +++ b/go.sum @@ -93,16 +93,16 @@ github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.11 h1:KreluoV8FZDEtI6Co2xuNk github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.11/go.mod h1:SeSUYBLsMYFoRvHE0Tjvn7kbxaUhl75CJi1sbfhMxkU= github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.10 h1:zeN9UtUlA6FTx0vFSayxSX32HDw73Yb6Hh2izDSFxXY= github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.10/go.mod h1:3HKuexPDcwLWPaqpW2UR/9n8N/u/3CKcGAzSs8p8u8g= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.15 h1:SoNJ4RlFEQEbtDcCEt+QG56MY4fm4W8rYirAmq+/DdU= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.15/go.mod h1:U9ke74k1n2bf+RIgoX1SXFed1HLs51OgUSs+Ph0KJP8= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.15 h1:C6WHdGnTDIYETAm5iErQUiVNsclNx9qbJVPIt03B6bI= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.15/go.mod h1:ZQLZqhcu+JhSrA9/NXRm8SkDvsycE+JkV3WGY41e+IM= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.23 h1:A2w6m6Tmr+BNXjDsr7M90zkWjsu4JXHwrzPg235STs4= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.23/go.mod h1:35EVp9wyeANdujZruvHiQUAo9E3vbhnIO1mTCAxMlY0= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.23 h1:pgYW9FCabt2M25MoHYCfMrVY2ghiiBKYWUVXfwZs+sU= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.23/go.mod h1:c48kLgzO19wAu3CPkDWC28JbaJ+hfQlsdl7I2+oqIbk= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 h1:hT8rVHwugYE2lEfdFE0QWVo81lF7jMrYJVDWI+f+VxU= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0/go.mod h1:8tu/lYfQfFe6IGnaOdrpVgEL2IrrDOf6/m9RQum4NkY= github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.15 h1:Z5r7SycxmSllHYmaAZPpmN8GviDrSGhMS6bldqtXZPw= github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.15/go.mod h1:CetW7bDE00QoGEmPUoZuRog07SGVAUVW6LFpNP0YfIg= -github.com/aws/aws-sdk-go-v2/service/cloudfront v1.38.4 h1:I/sQ9uGOs72/483obb2SPoa9ZEsYGbel6jcTTwD/0zU= -github.com/aws/aws-sdk-go-v2/service/cloudfront v1.38.4/go.mod h1:P6ByphKl2oNQZlv4WsCaLSmRncKEcOnbitYLtJPfqZI= +github.com/aws/aws-sdk-go-v2/service/cloudfront v1.41.0 h1:sLXpWohpuSh6fSvI7q/D5k3yUB9KtUyIEUDAQnasG0c= +github.com/aws/aws-sdk-go-v2/service/cloudfront v1.41.0/go.mod h1:GM6Olux4KAMUmRw0XgadfpN1cOpm5eWYZ31PAj59JSk= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.3 h1:dT3MqvGhSoaIhRseqw2I0yH81l7wiR2vjs57O51EAm8= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.3/go.mod h1:GlAeCkHwugxdHaueRr4nhPuY+WW+gR8UjlcqzPr1SPI= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.17 h1:YPYe6ZmvUfDDDELqEKtAd6bo8zxhkm+XEFEzQisqUIE= From e917401c710d4213e17b7174ed18f042784ff6d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Mon, 18 Nov 2024 15:01:09 +0100 Subject: [PATCH 127/526] Make sure term is always set Fixes #13063 --- hugolib/content_map_page.go | 9 +++--- hugolib/page__new.go | 20 ++++++++++--- .../pagesfromgotmpl_integration_test.go | 30 +++++++++++++++++++ 3 files changed, 51 insertions(+), 8 deletions(-) diff --git a/hugolib/content_map_page.go b/hugolib/content_map_page.go index 8c9e4a31a..a336c8489 100644 --- a/hugolib/content_map_page.go +++ b/hugolib/content_map_page.go @@ -1595,6 +1595,10 @@ func (sa *sitePagesAssembler) applyAggregatesToTaxonomiesAndTerms() error { } func (sa *sitePagesAssembler) assembleTermsAndTranslations() error { + if sa.pageMap.cfg.taxonomyTermDisabled { + return nil + } + var ( pages = sa.pageMap.treePages entries = sa.pageMap.treeTaxonomyEntries @@ -1612,10 +1616,6 @@ func (sa *sitePagesAssembler) assembleTermsAndTranslations() error { return false, nil } - if sa.pageMap.cfg.taxonomyTermDisabled { - return false, nil - } - for _, viewName := range views { vals := types.ToStringSlicePreserveString(getParam(ps, viewName.plural, false)) if vals == nil { @@ -1674,6 +1674,7 @@ func (sa *sitePagesAssembler) assembleTermsAndTranslations() error { }) } } + return false, nil }, } diff --git a/hugolib/page__new.go b/hugolib/page__new.go index 91bfe5e32..7d948ef58 100644 --- a/hugolib/page__new.go +++ b/hugolib/page__new.go @@ -15,6 +15,7 @@ package hugolib import ( "fmt" + "strings" "sync" "sync/atomic" @@ -140,6 +141,7 @@ func (h *HugoSites) doNewPage(m *pageMeta) (*pageState, *paths.Path, error) { } } + var tc viewName // Identify Page Kind. if m.pageConfig.Kind == "" { m.pageConfig.Kind = kinds.KindSection @@ -147,16 +149,13 @@ func (h *HugoSites) doNewPage(m *pageMeta) (*pageState, *paths.Path, error) { m.pageConfig.Kind = kinds.KindHome } else if m.pathInfo.IsBranchBundle() { // A section, taxonomy or term. - tc := m.s.pageMap.cfg.getTaxonomyConfig(m.Path()) + tc = m.s.pageMap.cfg.getTaxonomyConfig(m.Path()) if !tc.IsZero() { // Either a taxonomy or a term. if tc.pluralTreeKey == m.Path() { m.pageConfig.Kind = kinds.KindTaxonomy - m.singular = tc.singular } else { m.pageConfig.Kind = kinds.KindTerm - m.term = m.pathInfo.Unnormalized().BaseNameNoIdentifier() - m.singular = tc.singular } } } else if m.f != nil { @@ -164,6 +163,19 @@ func (h *HugoSites) doNewPage(m *pageMeta) (*pageState, *paths.Path, error) { } } + if m.pageConfig.Kind == kinds.KindTerm || m.pageConfig.Kind == kinds.KindTaxonomy { + if tc.IsZero() { + tc = m.s.pageMap.cfg.getTaxonomyConfig(m.Path()) + } + if tc.IsZero() { + return nil, fmt.Errorf("no taxonomy configuration found for %q", m.Path()) + } + m.singular = tc.singular + if m.pageConfig.Kind == kinds.KindTerm { + m.term = paths.TrimLeading(strings.TrimPrefix(m.pathInfo.Unnormalized().Base(), tc.pluralTreeKey)) + } + } + if m.pageConfig.Kind == kinds.KindPage && !m.s.conf.IsKindEnabled(m.pageConfig.Kind) { return nil, nil } diff --git a/hugolib/pagesfromdata/pagesfromgotmpl_integration_test.go b/hugolib/pagesfromdata/pagesfromgotmpl_integration_test.go index a4cf4dcff..b033aad2b 100644 --- a/hugolib/pagesfromdata/pagesfromgotmpl_integration_test.go +++ b/hugolib/pagesfromdata/pagesfromgotmpl_integration_test.go @@ -678,3 +678,33 @@ summary: {{ .Summary }}|content: {{ .Content}} "

aaa

|content:

aaa

\n

bbb

", ) } + +// Issue 13063. +func TestPagesFromGoTmplTermIsEmpty(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +baseURL = "https://example.com" +disableKinds = ['section', 'home', 'rss','sitemap'] +printPathWarnings = true +[taxonomies] +tag = "tags" +-- content/mypost.md -- +--- +title: "My Post" +tags: ["mytag"] +--- +-- content/tags/_content.gotmpl -- +{{ .AddPage (dict "path" "mothertag" "title" "My title" "kind" "term") }} +-- +-- layouts/_default/taxonomy.html -- +Terms: {{ range .Data.Terms.ByCount }}{{ .Name }}: {{ .Count }}|{{ end }}§s +-- layouts/_default/single.html -- +Single. +` + + b := hugolib.Test(t, files, hugolib.TestOptWarn()) + + b.AssertFileContent("public/tags/index.html", "Terms: mytag: 1|§s") +} From 8d92042ab9a2a8f23640c9babd521ecad134c3ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Mon, 18 Nov 2024 17:14:56 +0100 Subject: [PATCH 128/526] dartsass: Fix error message Closes #13065 --- resources/resource_transformers/tocss/dartsass/client.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/resource_transformers/tocss/dartsass/client.go b/resources/resource_transformers/tocss/dartsass/client.go index 762828b70..470c18b97 100644 --- a/resources/resource_transformers/tocss/dartsass/client.go +++ b/resources/resource_transformers/tocss/dartsass/client.go @@ -52,7 +52,7 @@ func New(fs *filesystems.SourceFilesystem, rs *resources.Spec) (*Client, error) } if !hugo.IsDartSassGeV2() { - return nil, fmt.Errorf("unsupported Dart Sass version detected, please upgrade to Dart Sass 2.0 or later, see https://gohugo.io/functions/css/sass/#dart-sass") + return nil, fmt.Errorf("unsupported Dart Sass version detected, please upgrade to Dart Sass 1.63.0 or later, see https://gohugo.io/functions/css/sass/#dart-sass") } if err := rs.ExecHelper.Sec().CheckAllowedExec(hugo.DartSassBinaryName); err != nil { From dacef0df92a9a20072b4eaa42003e1a63ace8f41 Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Mon, 18 Nov 2024 16:17:45 +0000 Subject: [PATCH 129/526] releaser: Bump versions for release of 0.139.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 955c2f91a..f988486db 100644 --- a/common/hugo/version_current.go +++ b/common/hugo/version_current.go @@ -19,5 +19,5 @@ var CurrentVersion = Version{ Major: 0, Minor: 139, PatchLevel: 0, - Suffix: "-DEV", + Suffix: "", } From 59a55a1f9e1d0f97f8143d429398355a8a4de251 Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Mon, 18 Nov 2024 16:32:01 +0000 Subject: [PATCH 130/526] releaser: Prepare repository for 0.140.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 f988486db..39a350415 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: 139, + Minor: 140, PatchLevel: 0, - Suffix: "", + Suffix: "-DEV", } diff --git a/hugoreleaser.env b/hugoreleaser.env index d44c55d03..e9000af65 100644 --- a/hugoreleaser.env +++ b/hugoreleaser.env @@ -1,7 +1,8 @@ # Release env. # These will be replaced by script before release. -HUGORELEASER_TAG=v0.138.0 -HUGORELEASER_COMMITISH=ad82998d54b3f9f8c2741b67356813b55b3134b9 +HUGORELEASER_TAG=v0.139.0 +HUGORELEASER_COMMITISH=dacef0df92a9a20072b4eaa42003e1a63ace8f41 + From 2d4c0c6c8d023f407996d3db5bee70392bb9708f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Tue, 19 Nov 2024 10:05:42 +0100 Subject: [PATCH 131/526] readme: Update dependency list --- README.md | 130 ++++++++++++++++-------------------------------------- 1 file changed, 39 insertions(+), 91 deletions(-) diff --git a/README.md b/README.md index 97afe32fd..7dfbca7c1 100644 --- a/README.md +++ b/README.md @@ -149,153 +149,101 @@ Hugo stands on the shoulders of great open source libraries. Run `hugo env --log See current dependencies ```text -cloud.google.com/go/compute/metadata="v0.2.3" -cloud.google.com/go/iam="v1.1.5" -cloud.google.com/go/storage="v1.35.1" -cloud.google.com/go="v0.110.10" -github.com/Azure/azure-sdk-for-go/sdk/azcore="v1.9.0" -github.com/Azure/azure-sdk-for-go/sdk/azidentity="v1.4.0" -github.com/Azure/azure-sdk-for-go/sdk/internal="v1.5.0" -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob="v1.2.0" -github.com/Azure/go-autorest/autorest/to="v0.4.0" -github.com/AzureAD/microsoft-authentication-library-for-go="v1.2.0" github.com/BurntSushi/locker="v0.0.0-20171006230638-a6e239ea1c69" github.com/alecthomas/chroma/v2="v2.14.0" github.com/armon/go-radix="v1.0.1-0.20221118154546-54df44f2176c" -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream="v1.5.4" -github.com/aws/aws-sdk-go-v2/config="v1.26.1" -github.com/aws/aws-sdk-go-v2/credentials="v1.16.12" -github.com/aws/aws-sdk-go-v2/feature/ec2/imds="v1.14.10" -github.com/aws/aws-sdk-go-v2/feature/s3/manager="v1.15.7" -github.com/aws/aws-sdk-go-v2/internal/configsources="v1.3.5" -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2="v2.6.5" -github.com/aws/aws-sdk-go-v2/internal/ini="v1.7.2" -github.com/aws/aws-sdk-go-v2/internal/v4a="v1.2.9" -github.com/aws/aws-sdk-go-v2/service/cloudfront="v1.35.4" -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding="v1.10.4" -github.com/aws/aws-sdk-go-v2/service/internal/checksum="v1.2.9" -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url="v1.10.9" -github.com/aws/aws-sdk-go-v2/service/internal/s3shared="v1.16.9" -github.com/aws/aws-sdk-go-v2/service/s3="v1.47.5" -github.com/aws/aws-sdk-go-v2/service/sso="v1.18.5" -github.com/aws/aws-sdk-go-v2/service/ssooidc="v1.21.5" -github.com/aws/aws-sdk-go-v2/service/sts="v1.26.5" -github.com/aws/aws-sdk-go-v2="v1.26.1" -github.com/aws/aws-sdk-go="v1.50.7" -github.com/aws/smithy-go="v1.20.2" github.com/bep/clocks="v0.5.0" github.com/bep/debounce="v1.2.0" -github.com/bep/gitmap="v1.1.2" +github.com/bep/gitmap="v1.6.0" github.com/bep/goat="v0.5.0" -github.com/bep/godartsass/v2="v2.0.0" -github.com/bep/godartsass="v1.2.0" -github.com/bep/golibsass="v1.1.1" +github.com/bep/godartsass/v2="v2.3.0" +github.com/bep/golibsass="v1.2.0" github.com/bep/gowebp="v0.3.0" -github.com/bep/lazycache="v0.4.0" +github.com/bep/imagemeta="v0.8.3" +github.com/bep/lazycache="v0.7.0" github.com/bep/logg="v0.4.0" github.com/bep/mclib="v1.20400.20402" github.com/bep/overlayfs="v0.9.2" github.com/bep/simplecobra="v0.4.0" github.com/bep/tmc="v0.5.1" +github.com/cespare/xxhash/v2="v2.3.0" github.com/clbanning/mxj/v2="v2.7.0" github.com/cli/safeexec="v1.0.1" -github.com/cpuguy83/go-md2man/v2="v2.0.3" +github.com/cpuguy83/go-md2man/v2="v2.0.4" github.com/disintegration/gift="v1.2.1" github.com/dlclark/regexp2="v1.11.0" -github.com/dustin/go-humanize="v1.0.1" -github.com/evanw/esbuild="v0.21.4" -github.com/fatih/color="v1.16.0" +github.com/evanw/esbuild="v0.24.0" +github.com/fatih/color="v1.18.0" github.com/frankban/quicktest="v1.14.6" -github.com/fsnotify/fsnotify="v1.7.0" +github.com/fsnotify/fsnotify="v1.8.0" github.com/getkin/kin-openapi="v0.123.0" github.com/ghodss/yaml="v1.0.0" github.com/go-openapi/jsonpointer="v0.20.2" github.com/go-openapi/swag="v0.22.8" -github.com/gobuffalo/flect="v1.0.2" +github.com/gobuffalo/flect="v1.0.3" github.com/gobwas/glob="v0.2.3" github.com/gohugoio/go-i18n/v2="v2.1.3-0.20230805085216-e63c13218d0e" +github.com/gohugoio/hashstructure="v0.1.0" github.com/gohugoio/httpcache="v0.7.0" github.com/gohugoio/hugo-goldmark-extensions/extras="v0.2.0" -github.com/gohugoio/hugo-goldmark-extensions/passthrough="v0.2.0" +github.com/gohugoio/hugo-goldmark-extensions/passthrough="v0.3.0" github.com/gohugoio/locales="v0.14.0" github.com/gohugoio/localescompressed="v1.0.1" -github.com/golang-jwt/jwt/v5="v5.1.0" -github.com/golang/groupcache="v0.0.0-20210331224755-41bb18bfe9da" -github.com/golang/protobuf="v1.5.3" github.com/google/go-cmp="v0.6.0" -github.com/google/s2a-go="v0.1.7" -github.com/google/uuid="v1.4.0" -github.com/google/wire="v0.5.0" -github.com/googleapis/enterprise-certificate-proxy="v0.3.2" -github.com/googleapis/gax-go/v2="v2.12.0" -github.com/gorilla/websocket="v1.5.1" -github.com/hairyhenderson/go-codeowners="v0.4.0" +github.com/gorilla/websocket="v1.5.3" +github.com/hairyhenderson/go-codeowners="v0.6.1" github.com/hashicorp/golang-lru/v2="v2.0.7" github.com/invopop/yaml="v0.2.0" github.com/jdkato/prose="v1.2.1" -github.com/jmespath/go-jmespath="v0.4.0" github.com/josharian/intern="v1.0.0" github.com/kr/pretty="v0.3.1" github.com/kr/text="v0.2.0" -github.com/kylelemons/godebug="v1.1.0" -github.com/kyokomi/emoji/v2="v2.2.12" +github.com/kyokomi/emoji/v2="v2.2.13" github.com/mailru/easyjson="v0.7.7" github.com/makeworld-the-better-one/dither/v2="v2.4.0" github.com/marekm4/color-extractor="v1.2.1" github.com/mattn/go-colorable="v0.1.13" github.com/mattn/go-isatty="v0.0.20" github.com/mattn/go-runewidth="v0.0.9" -github.com/mitchellh/hashstructure="v1.1.0" github.com/mitchellh/mapstructure="v1.5.1-0.20231216201459-8508981c8b6c" github.com/mohae/deepcopy="v0.0.0-20170929034955-c48cc78d4826" github.com/muesli/smartcrop="v0.3.0" github.com/niklasfasching/go-org="v1.7.0" github.com/olekukonko/tablewriter="v0.0.5" github.com/pbnjay/memory="v0.0.0-20210728143218-7b4eea64cf58" -github.com/pelletier/go-toml/v2="v2.2.2" +github.com/pelletier/go-toml/v2="v2.2.3" github.com/perimeterx/marshmallow="v1.1.5" -github.com/pkg/browser="v0.0.0-20210911075715-681adbf594b8" +github.com/pkg/browser="v0.0.0-20240102092130-5ac0b6a4141c" github.com/pkg/errors="v0.9.1" -github.com/rogpeppe/go-internal="v1.12.0" +github.com/rogpeppe/go-internal="v1.13.1" github.com/russross/blackfriday/v2="v2.1.0" -github.com/rwcarlsen/goexif="v0.0.0-20190401172101-9e8deecbddbd" -github.com/sass/dart-sass/compiler="1.77.5" -github.com/sass/dart-sass/implementation="1.77.5" -github.com/sass/dart-sass/protocol="2.7.1" -github.com/sass/libsass="3.6.5" +github.com/sass/dart-sass/compiler="1.81.0" +github.com/sass/dart-sass/implementation="1.81.0" +github.com/sass/dart-sass/protocol="3.1.0" github.com/spf13/afero="v1.11.0" -github.com/spf13/cast="v1.6.0" -github.com/spf13/cobra="v1.8.0" +github.com/spf13/cast="v1.7.0" +github.com/spf13/cobra="v1.8.1" github.com/spf13/fsync="v0.10.1" github.com/spf13/pflag="v1.0.5" -github.com/tdewolff/minify/v2="v2.20.20" -github.com/tdewolff/parse/v2="v2.7.13" -github.com/webmproject/libwebp="v1.3.2" -github.com/yuin/goldmark-emoji="v1.0.3" -github.com/yuin/goldmark="v1.7.4" -go.opencensus.io="v0.24.0" +github.com/tdewolff/minify/v2="v2.21.1" +github.com/tdewolff/parse/v2="v2.7.18" +github.com/tetratelabs/wazero="v1.8.1" +github.com/yuin/goldmark-emoji="v1.0.4" +github.com/yuin/goldmark="v1.7.8" go.uber.org/automaxprocs="v1.5.3" -gocloud.dev="v0.36.0" -golang.org/x/crypto="v0.23.0" +golang.org/x/crypto="v0.29.0" golang.org/x/exp="v0.0.0-20221031165847-c99f073a8326" -golang.org/x/image="v0.16.0" -golang.org/x/mod="v0.17.0" -golang.org/x/net="v0.25.0" -golang.org/x/oauth2="v0.15.0" -golang.org/x/sync="v0.7.0" -golang.org/x/sys="v0.20.0" -golang.org/x/text="v0.15.0" -golang.org/x/time="v0.5.0" -golang.org/x/tools="v0.20.0" -golang.org/x/xerrors="v0.0.0-20231012003039-104605ab7028" -google.golang.org/api="v0.152.0" -google.golang.org/genproto/googleapis/api="v0.0.0-20231120223509-83a465c0220f" -google.golang.org/genproto/googleapis/rpc="v0.0.0-20231120223509-83a465c0220f" -google.golang.org/genproto="v0.0.0-20231120223509-83a465c0220f" -google.golang.org/grpc="v1.59.0" -google.golang.org/protobuf="v1.33.0" +golang.org/x/image="v0.22.0" +golang.org/x/mod="v0.22.0" +golang.org/x/net="v0.31.0" +golang.org/x/sync="v0.9.0" +golang.org/x/sys="v0.27.0" +golang.org/x/text="v0.20.0" +golang.org/x/tools="v0.27.0" +google.golang.org/protobuf="v1.35.1" gopkg.in/yaml.v2="v2.4.0" gopkg.in/yaml.v3="v3.0.1" +howett.net/plist="v1.0.0" software.sslmate.com/src/go-pkcs12="v0.2.0" ``` From 8fcd3c148707d8cace2f375e537c30a821ea2516 Mon Sep 17 00:00:00 2001 From: wangjingcun Date: Tue, 19 Nov 2024 18:29:19 +0800 Subject: [PATCH 132/526] common: Fix some GoDoc typos --- common/constants/constants.go | 2 +- common/hugio/readers.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/common/constants/constants.go b/common/constants/constants.go index 48813e79b..b2cb4fb73 100644 --- a/common/constants/constants.go +++ b/common/constants/constants.go @@ -41,7 +41,7 @@ const ( ResourceTransformationFingerprint = "fingerprint" ) -// IsResourceTransformationLinkChange returns whether the given name is a resource transformation that changes the permalink based on the content. +// IsResourceTransformationPermalinkHash returns whether the given name is a resource transformation that changes the permalink based on the content. func IsResourceTransformationPermalinkHash(name string) bool { return name == ResourceTransformationFingerprint } diff --git a/common/hugio/readers.go b/common/hugio/readers.go index 25e327908..c4304c84e 100644 --- a/common/hugio/readers.go +++ b/common/hugio/readers.go @@ -74,13 +74,13 @@ type StringReader interface { ReadString() string } -// NewReadSeekerNoOpCloserFromString uses strings.NewReader to create a new ReadSeekerNoOpCloser +// NewReadSeekerNoOpCloserFromBytes uses bytes.NewReader to create a new ReadSeekerNoOpCloser // from the given bytes slice. func NewReadSeekerNoOpCloserFromBytes(content []byte) readSeekerNopCloser { return readSeekerNopCloser{bytes.NewReader(content)} } -// NewReadSeekCloser creates a new ReadSeekCloser from the given ReadSeeker. +// NewOpenReadSeekCloser creates a new ReadSeekCloser from the given ReadSeeker. // The ReadSeeker will be seeked to the beginning before returned. func NewOpenReadSeekCloser(r ReadSeekCloser) OpenReadSeekCloser { return func() (ReadSeekCloser, error) { From 8d017a60fb53b3ffb7b57f6c483fe92c3f2813cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Thu, 21 Nov 2024 09:48:54 +0100 Subject: [PATCH 133/526] dartsass: Fix nilpointer on Close when Dart Sass isn't installed Fixes #13076 --- .../cssjs/postcss_integration_test.go | 2 +- .../tocss/dartsass/client.go | 15 +++++++++------ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/resources/resource_transformers/cssjs/postcss_integration_test.go b/resources/resource_transformers/cssjs/postcss_integration_test.go index e8f52326c..8f2132789 100644 --- a/resources/resource_transformers/cssjs/postcss_integration_test.go +++ b/resources/resource_transformers/cssjs/postcss_integration_test.go @@ -70,7 +70,7 @@ hello: other: "Bonjour" -- layouts/index.html -- {{ $options := dict "inlineImports" true }} -{{ $styles := resources.Get "css/styles.css" | resources.PostCSS $options }} +{{ $styles := resources.Get "css/styles.css" | css.PostCSS $options }} Styles RelPermalink: {{ $styles.RelPermalink }} {{ $cssContent := $styles.Content }} Styles Content: Len: {{ len $styles.Content }}| diff --git a/resources/resource_transformers/tocss/dartsass/client.go b/resources/resource_transformers/tocss/dartsass/client.go index 470c18b97..4ab958c01 100644 --- a/resources/resource_transformers/tocss/dartsass/client.go +++ b/resources/resource_transformers/tocss/dartsass/client.go @@ -44,7 +44,7 @@ const dartSassStdinPrefix = "hugostdin:" func New(fs *filesystems.SourceFilesystem, rs *resources.Spec) (*Client, error) { if !Supports() { - return &Client{dartSassNotAvailable: true}, nil + return &Client{}, nil } if hugo.DartSassBinaryName == "" { @@ -89,22 +89,25 @@ func New(fs *filesystems.SourceFilesystem, rs *resources.Spec) (*Client, error) } type Client struct { - dartSassNotAvailable bool - rs *resources.Spec - sfs *filesystems.SourceFilesystem - workFs afero.Fs + rs *resources.Spec + sfs *filesystems.SourceFilesystem + workFs afero.Fs + // This may be nil if Dart Sass is not available. transpiler *godartsass.Transpiler } func (c *Client) ToCSS(res resources.ResourceTransformer, args map[string]any) (resource.Resource, error) { - if c.dartSassNotAvailable { + if c.transpiler == nil { return res.Transform(resources.NewFeatureNotAvailableTransformer(transformationName, args)) } return res.Transform(&transform{c: c, optsm: args}) } func (c *Client) Close() error { + if c.transpiler == nil { + return nil + } return c.transpiler.Close() } From 5a50eee9da934c01e56e3df4c0c425878bc1caff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Sat, 23 Nov 2024 14:28:20 +0100 Subject: [PATCH 134/526] minifiers: Add failing test for upstream bug See #13082 --- minifiers/minifiers_test.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/minifiers/minifiers_test.go b/minifiers/minifiers_test.go index bfd743fae..b81c632fe 100644 --- a/minifiers/minifiers_test.go +++ b/minifiers/minifiers_test.go @@ -153,10 +153,12 @@ func TestBugs(t *testing.T) { rawString string expectedMinString string }{ - // https://github.com/gohugoio/hugo/issues/5506 + // Issue 5506 {media.Builtin.CSSType, " body { color: rgba(000, 000, 000, 0.7); }", "body{color:rgba(0,0,0,.7)}"}, - // https://github.com/gohugoio/hugo/issues/8332 + // Issue 8332 {media.Builtin.HTMLType, " Tags", ` Tags`}, + // Issue #13082 + {media.Builtin.HTMLType, "", ``}, } { var b bytes.Buffer From aa3dd197f794236ded6393dbb91db91fee288c26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Sat, 23 Nov 2024 14:29:58 +0100 Subject: [PATCH 135/526] Revert "build(deps): bump github.com/tdewolff/minify/v2 from 2.20.37 to 2.21.1" This reverts commit 7a2f04ee8c3de43f9cc8e0a71fca838125878f8c. Closes #13082 --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 3013813ab..03df8b3db 100644 --- a/go.mod +++ b/go.mod @@ -67,8 +67,8 @@ require ( github.com/spf13/cobra v1.8.1 github.com/spf13/fsync v0.10.1 github.com/spf13/pflag v1.0.5 - github.com/tdewolff/minify/v2 v2.21.1 - github.com/tdewolff/parse/v2 v2.7.18 + github.com/tdewolff/minify/v2 v2.20.37 + github.com/tdewolff/parse/v2 v2.7.15 github.com/tetratelabs/wazero v1.8.1 github.com/yuin/goldmark v1.7.8 github.com/yuin/goldmark-emoji v1.0.4 diff --git a/go.sum b/go.sum index 32005ff6f..2920de0f8 100644 --- a/go.sum +++ b/go.sum @@ -447,10 +447,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.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/tdewolff/minify/v2 v2.21.1 h1:AAf5iltw6+KlUvjRNPAPrANIXl3XEJNBBzuZom5iCAM= -github.com/tdewolff/minify/v2 v2.21.1/go.mod h1:PoqFH8ugcuTUvKqVM9vOqXw4msxvuhL/DTmV5ZXhSCI= -github.com/tdewolff/parse/v2 v2.7.18 h1:uSqjEMT2lwCj5oifBHDcWU2kN1pbLrRENgFWDJa57eI= -github.com/tdewolff/parse/v2 v2.7.18/go.mod h1:3FbJWZp3XT9OWVN3Hmfp0p/a08v4h8J9W1aghka0soA= +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= From 21299a7a677287e1ec7a6465f3bb3dd5864826ec Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Sat, 23 Nov 2024 14:13:46 +0000 Subject: [PATCH 136/526] releaser: Bump versions for release of 0.139.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 39a350415..605568189 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: 140, - PatchLevel: 0, - Suffix: "-DEV", + Minor: 139, + PatchLevel: 1, + Suffix: "", } From e00fdae4562c3329b9d877425c43aa8484784e5c Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Sat, 23 Nov 2024 14:26:42 +0000 Subject: [PATCH 137/526] releaser: Prepare repository for 0.140.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 605568189..39a350415 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: 139, - PatchLevel: 1, - Suffix: "", + Minor: 140, + PatchLevel: 0, + Suffix: "-DEV", } diff --git a/hugoreleaser.env b/hugoreleaser.env index e9000af65..b9cc5806c 100644 --- a/hugoreleaser.env +++ b/hugoreleaser.env @@ -1,7 +1,8 @@ # Release env. # These will be replaced by script before release. -HUGORELEASER_TAG=v0.139.0 -HUGORELEASER_COMMITISH=dacef0df92a9a20072b4eaa42003e1a63ace8f41 +HUGORELEASER_TAG=v0.139.1 +HUGORELEASER_COMMITISH=21299a7a677287e1ec7a6465f3bb3dd5864826ec + From 0ab81896d90e0111dc9c9611e9f0eceddd3732b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Sat, 23 Nov 2024 16:29:32 +0100 Subject: [PATCH 138/526] modules: Skip empty lines in modules.txt Closes #13084 --- modules/collect.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/collect.go b/modules/collect.go index 4eb12a1a6..7034a6b16 100644 --- a/modules/collect.go +++ b/modules/collect.go @@ -556,6 +556,9 @@ func (c *collector) collectModulesTXT(owner Module) error { line := scanner.Text() line = strings.Trim(line, "# ") line = strings.TrimSpace(line) + if line == "" { + continue + } parts := strings.Fields(line) if len(parts) != 2 { return fmt.Errorf("invalid modules list: %q", filename) From 770f548b47b39e6f0fd4da1cc80552024e5829e1 Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Sat, 23 Nov 2024 15:33:51 +0000 Subject: [PATCH 139/526] releaser: Bump versions for release of 0.139.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 39a350415..8af8030bb 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: 140, - PatchLevel: 0, - Suffix: "-DEV", + Minor: 139, + PatchLevel: 2, + Suffix: "", } From 467444ef649b35676ed5b4198eb8165b347d9119 Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Sat, 23 Nov 2024 15:46:37 +0000 Subject: [PATCH 140/526] releaser: Prepare repository for 0.140.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 8af8030bb..39a350415 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: 139, - PatchLevel: 2, - Suffix: "", + Minor: 140, + PatchLevel: 0, + Suffix: "-DEV", } diff --git a/hugoreleaser.env b/hugoreleaser.env index b9cc5806c..d76795ecf 100644 --- a/hugoreleaser.env +++ b/hugoreleaser.env @@ -1,7 +1,8 @@ # Release env. # These will be replaced by script before release. -HUGORELEASER_TAG=v0.139.1 -HUGORELEASER_COMMITISH=21299a7a677287e1ec7a6465f3bb3dd5864826ec +HUGORELEASER_TAG=v0.139.2 +HUGORELEASER_COMMITISH=770f548b47b39e6f0fd4da1cc80552024e5829e1 + From dea158c88514afbd24f67558039ec4d20cd5aed1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Mon, 25 Nov 2024 10:39:17 +0100 Subject: [PATCH 141/526] commands: Fix flaw in the livereload logic I guess most commonly an issue with TailwindCSS editing in templates: * Build changes both CSS and index.html => reload OK. * Build changes both CSS and index.html and some other files => only CSS reloaded. The above would fix itself with one more edit, but that's annoying. --- commands/hugobuilder.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/commands/hugobuilder.go b/commands/hugobuilder.go index 95129018f..51493938d 100644 --- a/commands/hugobuilder.go +++ b/commands/hugobuilder.go @@ -966,7 +966,7 @@ func (c *hugoBuilder) handleEvents(watcher *watcher.Batcher, pathToRefresh := h.PathSpec.RelURL(paths.ToSlashTrimLeading(otherChanges[0]), false) lrl.Logf("refreshing %q", pathToRefresh) livereload.RefreshPath(pathToRefresh) - } else if len(cssChanges) == 0 { + } else if len(cssChanges) == 0 || len(otherChanges) > 1 { lrl.Logf("force refresh") livereload.ForceRefresh() } From 88b7868fbdaf7c84c1dd14712535a593a34e9c3a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Nov 2024 08:30:24 +0000 Subject: [PATCH 142/526] build(deps): bump github.com/tetratelabs/wazero from 1.8.1 to 1.8.2 Bumps [github.com/tetratelabs/wazero](https://github.com/tetratelabs/wazero) from 1.8.1 to 1.8.2. - [Release notes](https://github.com/tetratelabs/wazero/releases) - [Commits](https://github.com/tetratelabs/wazero/compare/v1.8.1...v1.8.2) --- updated-dependencies: - dependency-name: github.com/tetratelabs/wazero dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 03df8b3db..36fdec39d 100644 --- a/go.mod +++ b/go.mod @@ -69,7 +69,7 @@ require ( github.com/spf13/pflag v1.0.5 github.com/tdewolff/minify/v2 v2.20.37 github.com/tdewolff/parse/v2 v2.7.15 - github.com/tetratelabs/wazero v1.8.1 + github.com/tetratelabs/wazero v1.8.2 github.com/yuin/goldmark v1.7.8 github.com/yuin/goldmark-emoji v1.0.4 go.uber.org/automaxprocs v1.5.3 diff --git a/go.sum b/go.sum index 2920de0f8..d07cac1bd 100644 --- a/go.sum +++ b/go.sum @@ -129,8 +129,6 @@ github.com/bep/gitmap v1.6.0 h1:sDuQMm9HoTL0LtlrfxjbjgAg2wHQd4nkMup2FInYzhA= github.com/bep/gitmap v1.6.0/go.mod h1:n+3W1f/rot2hynsqEGxGMErPRgT41n9CkGuzPvz9cIw= github.com/bep/goat v0.5.0 h1:S8jLXHCVy/EHIoCY+btKkmcxcXFd34a0Q63/0D4TKeA= github.com/bep/goat v0.5.0/go.mod h1:Md9x7gRxiWKs85yHlVTvHQw9rg86Bm+Y4SuYE8CTH7c= -github.com/bep/godartsass/v2 v2.2.0 h1:3hO9Dt4BOnxkKmRxc+OpoKVFrDvBycpSCXEdElVAMVI= -github.com/bep/godartsass/v2 v2.2.0/go.mod h1:AcP8QgC+OwOXEq6im0WgDRYK7scDsmZCEW62o1prQLo= github.com/bep/godartsass/v2 v2.3.0 h1:gEMyq/bNn4hxpUSwy/NKyOTqPqVh3AedhMHvQR+x0kU= github.com/bep/godartsass/v2 v2.3.0/go.mod h1:AcP8QgC+OwOXEq6im0WgDRYK7scDsmZCEW62o1prQLo= github.com/bep/golibsass v1.2.0 h1:nyZUkKP/0psr8nT6GR2cnmt99xS93Ji82ZD9AgOK6VI= @@ -454,8 +452,8 @@ github.com/tdewolff/parse/v2 v2.7.15/go.mod h1:3FbJWZp3XT9OWVN3Hmfp0p/a08v4h8J9W 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/tetratelabs/wazero v1.8.1 h1:NrcgVbWfkWvVc4UtT4LRLDf91PsOzDzefMdwhLfA550= -github.com/tetratelabs/wazero v1.8.1/go.mod h1:yAI0XTsMBhREkM/YDAK/zNou3GoiAce1P6+rp/wQhjs= +github.com/tetratelabs/wazero v1.8.2 h1:yIgLR/b2bN31bjxwXHD8a3d+BogigR952csSDdLYEv4= +github.com/tetratelabs/wazero v1.8.2/go.mod h1:yAI0XTsMBhREkM/YDAK/zNou3GoiAce1P6+rp/wQhjs= github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0= github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= From 7e130e34f202d400891cd2acaaf196c049b17f7f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 28 Nov 2024 08:22:59 +0000 Subject: [PATCH 143/526] build(deps): bump github.com/bep/godartsass/v2 from 2.3.0 to 2.3.1 Bumps [github.com/bep/godartsass/v2](https://github.com/bep/godartsass) from 2.3.0 to 2.3.1. - [Release notes](https://github.com/bep/godartsass/releases) - [Commits](https://github.com/bep/godartsass/compare/v2.3.0...v2.3.1) --- updated-dependencies: - dependency-name: github.com/bep/godartsass/v2 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 36fdec39d..a82ecb5f8 100644 --- a/go.mod +++ b/go.mod @@ -10,7 +10,7 @@ require ( github.com/bep/debounce v1.2.0 github.com/bep/gitmap v1.6.0 github.com/bep/goat v0.5.0 - github.com/bep/godartsass/v2 v2.3.0 + github.com/bep/godartsass/v2 v2.3.1 github.com/bep/golibsass v1.2.0 github.com/bep/gowebp v0.3.0 github.com/bep/helpers v0.5.0 diff --git a/go.sum b/go.sum index d07cac1bd..e60627e68 100644 --- a/go.sum +++ b/go.sum @@ -129,8 +129,8 @@ github.com/bep/gitmap v1.6.0 h1:sDuQMm9HoTL0LtlrfxjbjgAg2wHQd4nkMup2FInYzhA= github.com/bep/gitmap v1.6.0/go.mod h1:n+3W1f/rot2hynsqEGxGMErPRgT41n9CkGuzPvz9cIw= github.com/bep/goat v0.5.0 h1:S8jLXHCVy/EHIoCY+btKkmcxcXFd34a0Q63/0D4TKeA= github.com/bep/goat v0.5.0/go.mod h1:Md9x7gRxiWKs85yHlVTvHQw9rg86Bm+Y4SuYE8CTH7c= -github.com/bep/godartsass/v2 v2.3.0 h1:gEMyq/bNn4hxpUSwy/NKyOTqPqVh3AedhMHvQR+x0kU= -github.com/bep/godartsass/v2 v2.3.0/go.mod h1:AcP8QgC+OwOXEq6im0WgDRYK7scDsmZCEW62o1prQLo= +github.com/bep/godartsass/v2 v2.3.1 h1:Lh9v0IxAaB+toyZrZ+XYNYcGXI1PzGzvZ4u8tRWTnLw= +github.com/bep/godartsass/v2 v2.3.1/go.mod h1:AcP8QgC+OwOXEq6im0WgDRYK7scDsmZCEW62o1prQLo= github.com/bep/golibsass v1.2.0 h1:nyZUkKP/0psr8nT6GR2cnmt99xS93Ji82ZD9AgOK6VI= github.com/bep/golibsass v1.2.0/go.mod h1:DL87K8Un/+pWUS75ggYv41bliGiolxzDKWJAq3eJ1MA= github.com/bep/gowebp v0.3.0 h1:MhmMrcf88pUY7/PsEhMgEP0T6fDUnRTMpN8OclDrbrY= From fc3d1cbadb48d5f8e10fcd811377de6b8453ea8d Mon Sep 17 00:00:00 2001 From: huajin tong <137764712+thirdkeyword@users.noreply.github.com> Date: Thu, 28 Nov 2024 18:20:02 +0800 Subject: [PATCH 144/526] Fix some typos --- common/hugo/hugo.go | 2 +- hugolib/doctree/nodeshifttree.go | 2 +- markup/blackfriday/anchors.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/common/hugo/hugo.go b/common/hugo/hugo.go index 11ec40e0b..e480baa94 100644 --- a/common/hugo/hugo.go +++ b/common/hugo/hugo.go @@ -426,7 +426,7 @@ func DeprecateLevel(item, alternative, version string, level logg.Level) { loggers.Log().Logger().WithLevel(level).WithField(loggers.FieldNameCmd, "deprecated").Logf(msg) } -// We ususally do about one minor version a month. +// We usually do about one minor version a month. // We want people to run at least the current and previous version without any warnings. // We want people who don't update Hugo that often to see the warnings and errors before we remove the feature. func deprecationLogLevelFromVersion(ver string) logg.Level { diff --git a/hugolib/doctree/nodeshifttree.go b/hugolib/doctree/nodeshifttree.go index 36382c2d7..497e9f02e 100644 --- a/hugolib/doctree/nodeshifttree.go +++ b/hugolib/doctree/nodeshifttree.go @@ -59,7 +59,7 @@ type ( ) // NodeShiftTree is the root of a tree that can be shaped using the Shape method. -// Note that multipled shapes of the same tree is meant to be used concurrently, +// Note that multiplied shapes of the same tree is meant to be used concurrently, // so use the applicable locking when needed. type NodeShiftTree[T any] struct { tree *radix.Tree diff --git a/markup/blackfriday/anchors.go b/markup/blackfriday/anchors.go index 7b0b41854..e00c24c9a 100644 --- a/markup/blackfriday/anchors.go +++ b/markup/blackfriday/anchors.go @@ -11,7 +11,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -// Package blackfriday holds some compability functions for the old Blackfriday v1 Markdown engine. +// Package blackfriday holds some compatibility functions for the old Blackfriday v1 Markdown engine. package blackfriday import "unicode" From c1dc35dd712fc926cc7eaa2bf607fb4716794dfd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Fri, 29 Nov 2024 12:13:49 +0100 Subject: [PATCH 145/526] Fix server edits of resources included in shortcode/hooks Fixes #13093 --- hugolib/page__content.go | 4 +++ hugolib/rebuild_test.go | 77 ++++++++++++++++++++++++++++++++++------ identity/finder.go | 25 ++++++++----- tpl/template.go | 1 - 4 files changed, 86 insertions(+), 21 deletions(-) diff --git a/hugolib/page__content.go b/hugolib/page__content.go index 4ec91f7b5..b5527a281 100644 --- a/hugolib/page__content.go +++ b/hugolib/page__content.go @@ -863,6 +863,10 @@ type cachedContentScope struct { } func (c *cachedContentScope) prepareContext(ctx context.Context) context.Context { + // A regular page's shortcode etc. may be rendered by e.g. the home page, + // so we need to track any changes to this content's page. + ctx = tpl.Context.DependencyManagerScopedProvider.Set(ctx, c.pco.po.p) + // The markup scope is recursive, so if already set to a non zero value, preserve that value. if s := hugo.GetMarkupScope(ctx); s != "" || s == c.scope { return ctx diff --git a/hugolib/rebuild_test.go b/hugolib/rebuild_test.go index 2219fe812..ff1f8267e 100644 --- a/hugolib/rebuild_test.go +++ b/hugolib/rebuild_test.go @@ -21,8 +21,13 @@ const rebuildFilesSimple = ` baseURL = "https://example.com" disableKinds = ["term", "taxonomy", "sitemap", "robotstxt", "404"] disableLiveReload = true +[outputFormats] + [outputFormats.rss] + weight = 10 + [outputFormats.html] + weight = 20 [outputs] -home = ["html"] +home = ["rss", "html"] section = ["html"] page = ["html"] -- content/mysection/_index.md -- @@ -58,6 +63,21 @@ Home Text Content. title: "myothersectionpage" --- myothersectionpage Content. +-- content/mythirdsection/mythirdsectionpage.md -- +--- +title: "mythirdsectionpage" +--- +mythirdsectionpage Content. +{{< myshortcodetext >}} +§§§ myothertext +foo +§§§ +-- assets/mytext.txt -- +Assets My Text. +-- assets/myshortcodetext.txt -- +Assets My Shortcode Text. +-- assets/myothertext.txt -- +Assets My Other Text. -- layouts/_default/single.html -- Single: {{ .Title }}|{{ .Content }}$ Resources: {{ range $i, $e := .Resources }}{{ $i }}:{{ .RelPermalink }}|{{ .Content }}|{{ end }}$ @@ -68,6 +88,13 @@ Len Resources: {{ len .Resources }}| Resources: {{ range $i, $e := .Resources }}{{ $i }}:{{ .RelPermalink }}|{{ .Content }}|{{ end }}$ -- layouts/shortcodes/foo.html -- Foo. +-- layouts/shortcodes/myshortcodetext.html -- +{{ warnf "mytext %s" now}} +{{ $r := resources.Get "myshortcodetext.txt" }} +My Shortcode Text: {{ $r.Content }}|{{ $r.Permalink }}| +-- layouts/_default/_markup/render-codeblock-myothertext.html -- +{{ $r := resources.Get "myothertext.txt" }} +My Other Text: {{ $r.Content }}|{{ $r.Permalink }}| ` @@ -83,6 +110,34 @@ func TestRebuildEditTextFileInLeafBundle(t *testing.T) { b.AssertRenderCountContent(1) } +func TestRebuildEditTextFileInShortcode(t *testing.T) { + t.Parallel() + for i := 0; i < 3; i++ { + b := TestRunning(t, rebuildFilesSimple) + b.AssertFileContent("public/mythirdsection/mythirdsectionpage/index.html", + "Text: Assets My Shortcode Text.") + b.EditFileReplaceAll("assets/myshortcodetext.txt", "My Shortcode Text", "My Shortcode Text Edited").Build() + fmt.Println(b.LogString()) + b.AssertFileContent("public/mythirdsection/mythirdsectionpage/index.html", + "Text: Assets My Shortcode Text Edited.") + + } +} + +func TestRebuildEditTextFileInHook(t *testing.T) { + t.Parallel() + for i := 0; i < 3; i++ { + b := TestRunning(t, rebuildFilesSimple) + b.AssertFileContent("public/mythirdsection/mythirdsectionpage/index.html", + "Text: Assets My Other Text.") + b.AssertFileContent("public/myothertext.txt", "Assets My Other Text.") + b.EditFileReplaceAll("assets/myothertext.txt", "My Other Text", "My Other Text Edited").Build() + b.AssertFileContent("public/mythirdsection/mythirdsectionpage/index.html", + "Text: Assets My Other Text Edited.") + + } +} + func TestRebuiEditUnmarshaledYamlFileInLeafBundle(t *testing.T) { files := ` -- hugo.toml -- @@ -140,8 +195,8 @@ func TestRebuildRenameTextFileInLeafBundle(t *testing.T) { b.RenameFile("content/mysection/mysectionbundle/mysectionbundletext.txt", "content/mysection/mysectionbundle/mysectionbundletext2.txt").Build() b.AssertFileContent("public/mysection/mysectionbundle/index.html", "mysectionbundletext2", "My Section Bundle Text 2 Content.", "Len Resources: 2|") - b.AssertRenderCountPage(5) - b.AssertRenderCountContent(6) + b.AssertRenderCountPage(8) + b.AssertRenderCountContent(8) }) } @@ -161,8 +216,8 @@ func TestRebuilEditContentFileThenAnother(t *testing.T) { b.EditFileReplaceAll("content/myothersection/myothersectionpage.md", "myothersectionpage Content.", "myothersectionpage Content Edited.").Build() b.AssertFileContent("public/myothersection/myothersectionpage/index.html", "myothersectionpage Content Edited") - b.AssertRenderCountPage(1) - b.AssertRenderCountContent(1) + b.AssertRenderCountPage(2) + b.AssertRenderCountContent(2) } func TestRebuildRenameTextFileInBranchBundle(t *testing.T) { @@ -171,7 +226,7 @@ func TestRebuildRenameTextFileInBranchBundle(t *testing.T) { b.RenameFile("content/mysection/mysectiontext.txt", "content/mysection/mysectiontext2.txt").Build() b.AssertFileContent("public/mysection/index.html", "mysectiontext2", "My Section") - b.AssertRenderCountPage(2) + b.AssertRenderCountPage(3) b.AssertRenderCountContent(2) } @@ -181,14 +236,14 @@ func TestRebuildRenameTextFileInHomeBundle(t *testing.T) { b.RenameFile("content/hometext.txt", "content/hometext2.txt").Build() b.AssertFileContent("public/index.html", "hometext2", "Home Text Content.") - b.AssertRenderCountPage(3) + b.AssertRenderCountPage(5) } func TestRebuildRenameDirectoryWithLeafBundle(t *testing.T) { b := TestRunning(t, rebuildFilesSimple) b.RenameDir("content/mysection/mysectionbundle", "content/mysection/mysectionbundlerenamed").Build() b.AssertFileContent("public/mysection/mysectionbundlerenamed/index.html", "My Section Bundle") - b.AssertRenderCountPage(1) + b.AssertRenderCountPage(2) } func TestRebuildRenameDirectoryWithBranchBundle(t *testing.T) { @@ -197,7 +252,7 @@ func TestRebuildRenameDirectoryWithBranchBundle(t *testing.T) { b.AssertFileContent("public/mysectionrenamed/index.html", "My Section") b.AssertFileContent("public/mysectionrenamed/mysectionbundle/index.html", "My Section Bundle") b.AssertFileContent("public/mysectionrenamed/mysectionbundle/mysectionbundletext.txt", "My Section Bundle Text 2 Content.") - b.AssertRenderCountPage(3) + b.AssertRenderCountPage(5) } func TestRebuildRenameDirectoryWithRegularPageUsedInHome(t *testing.T) { @@ -296,7 +351,7 @@ func TestRebuildRenameDirectoryWithBranchBundleFastRender(t *testing.T) { b.AssertFileContent("public/mysectionrenamed/index.html", "My Section") b.AssertFileContent("public/mysectionrenamed/mysectionbundle/index.html", "My Section Bundle") b.AssertFileContent("public/mysectionrenamed/mysectionbundle/mysectionbundletext.txt", "My Section Bundle Text 2 Content.") - b.AssertRenderCountPage(3) + b.AssertRenderCountPage(5) } func TestRebuilErrorRecovery(t *testing.T) { @@ -1239,7 +1294,7 @@ Single. return strings.Replace(s, "red", "blue", 1) }).Build() - b.AssertRenderCountPage(3) + b.AssertRenderCountPage(4) b.AssertFileContent("public/index.html", "Home.", "") } diff --git a/identity/finder.go b/identity/finder.go index 91fac7237..b1a08d061 100644 --- a/identity/finder.go +++ b/identity/finder.go @@ -122,17 +122,21 @@ func (f *Finder) Contains(id, in Identity, maxDepth int) FinderResult { defer putSearchID(sid) - if r := f.checkOne(sid, in, 0); r > 0 { + r := FinderNotFound + if i := f.checkOne(sid, in, 0); i > r { + r = i + } + if r == FinderFound { return r } m := GetDependencyManager(in) if m != nil { - if r := f.checkManager(sid, m, 0); r > 0 { - return r + if i := f.checkManager(sid, m, 0); i > r { + r = i } } - return FinderNotFound + return r } func (f *Finder) checkMaxDepth(sid *searchID, level int) FinderResult { @@ -279,15 +283,18 @@ func (f *Finder) search(sid *searchID, m Manager, depth int) FinderResult { var r FinderResult m.forEeachIdentity( func(v Identity) bool { - if r > 0 { - panic("should be terminated") + i := f.checkOne(sid, v, depth) + if i > r { + r = i } - r = f.checkOne(sid, v, depth) - if r > 0 { + if r == FinderFound { return true } m := GetDependencyManager(v) - if r = f.checkManager(sid, m, depth+1); r > 0 { + if i := f.checkManager(sid, m, depth+1); i > r { + r = i + } + if r == FinderFound { return true } return false diff --git a/tpl/template.go b/tpl/template.go index 18a31e231..39c6b4f1c 100644 --- a/tpl/template.go +++ b/tpl/template.go @@ -172,7 +172,6 @@ type contextKey string var Context = struct { DependencyManagerScopedProvider hcontext.ContextDispatcher[identity.DependencyManagerScopedProvider] GetDependencyManagerInCurrentScope func(context.Context) identity.Manager - SetDependencyManagerInCurrentScope func(context.Context, identity.Manager) context.Context DependencyScope hcontext.ContextDispatcher[int] Page hcontext.ContextDispatcher[page] IsInGoldmark hcontext.ContextDispatcher[bool] From 2f6864387cd31b975914e8373d4bf38bddbd47bc Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Fri, 29 Nov 2024 15:36:56 +0000 Subject: [PATCH 146/526] releaser: Bump versions for release of 0.139.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 39a350415..b69c55775 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: 140, - PatchLevel: 0, - Suffix: "-DEV", + Minor: 139, + PatchLevel: 3, + Suffix: "", } From 487bb96474363070a9b5b22ce4640f80329e91e4 Mon Sep 17 00:00:00 2001 From: hugoreleaser Date: Fri, 29 Nov 2024 15:51:07 +0000 Subject: [PATCH 147/526] releaser: Prepare repository for 0.140.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 b69c55775..39a350415 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: 139, - PatchLevel: 3, - Suffix: "", + Minor: 140, + PatchLevel: 0, + Suffix: "-DEV", } diff --git a/hugoreleaser.env b/hugoreleaser.env index d76795ecf..4c8ed54a6 100644 --- a/hugoreleaser.env +++ b/hugoreleaser.env @@ -1,7 +1,8 @@ # Release env. # These will be replaced by script before release. -HUGORELEASER_TAG=v0.139.2 -HUGORELEASER_COMMITISH=770f548b47b39e6f0fd4da1cc80552024e5829e1 +HUGORELEASER_TAG=v0.139.3 +HUGORELEASER_COMMITISH=2f6864387cd31b975914e8373d4bf38bddbd47bc + From b529859008fae916a0509645da539072e62dfcb1 Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Wed, 4 Dec 2024 09:21:21 -0800 Subject: [PATCH 148/526] markup/tableofcontents: Cast Fragments.ToHTML args to int Closes #13107 --- hugolib/page__content.go | 13 ++-- markup/goldmark/convert_test.go | 4 +- markup/tableofcontents/tableofcontents.go | 23 ++++-- .../tableofcontents_integration_test.go | 78 +++++++++++++++++++ .../tableofcontents/tableofcontents_test.go | 24 ++++-- 5 files changed, 120 insertions(+), 22 deletions(-) diff --git a/hugolib/page__content.go b/hugolib/page__content.go index b5527a281..f7579f182 100644 --- a/hugolib/page__content.go +++ b/hugolib/page__content.go @@ -730,16 +730,15 @@ func (c *cachedContentScope) contentToC(ctx context.Context) (contentTableOfCont isHTML := cp.po.p.m.pageConfig.ContentMediaType.IsHTML() if !isHTML { - createAndSetToC := func(tocProvider converter.TableOfContentsProvider) { + createAndSetToC := func(tocProvider converter.TableOfContentsProvider) error { cfg := p.s.ContentSpec.Converters.GetMarkupConfig() ct.tableOfContents = tocProvider.TableOfContents() - ct.tableOfContentsHTML = template.HTML( - ct.tableOfContents.ToHTML( - cfg.TableOfContents.StartLevel, - cfg.TableOfContents.EndLevel, - cfg.TableOfContents.Ordered, - ), + ct.tableOfContentsHTML, err = ct.tableOfContents.ToHTML( + cfg.TableOfContents.StartLevel, + cfg.TableOfContents.EndLevel, + cfg.TableOfContents.Ordered, ) + return err } // If the converter supports doing the parsing separately, we do that. diff --git a/markup/goldmark/convert_test.go b/markup/goldmark/convert_test.go index 6048bce39..a35441aff 100644 --- a/markup/goldmark/convert_test.go +++ b/markup/goldmark/convert_test.go @@ -208,8 +208,8 @@ unsafe = true toc, ok := b.(converter.TableOfContentsProvider) c.Assert(ok, qt.Equals, true) - tocString := string(toc.TableOfContents().ToHTML(1, 2, false)) - c.Assert(tocString, qt.Contains, "TableOfContents") + tocHTML, _ := toc.TableOfContents().ToHTML(1, 2, false) + c.Assert(string(tocHTML), qt.Contains, "TableOfContents") } func TestConvertAutoIDAsciiOnly(t *testing.T) { diff --git a/markup/tableofcontents/tableofcontents.go b/markup/tableofcontents/tableofcontents.go index 49a9cdeb7..560e421b7 100644 --- a/markup/tableofcontents/tableofcontents.go +++ b/markup/tableofcontents/tableofcontents.go @@ -14,11 +14,13 @@ package tableofcontents import ( + "fmt" "html/template" "sort" "strings" "github.com/gohugoio/hugo/common/collections" + "github.com/spf13/cast" ) // Empty is an empty ToC. @@ -133,19 +135,30 @@ func (toc *Fragments) addAt(h *Heading, row, level int) { } // ToHTML renders the ToC as HTML. -func (toc *Fragments) ToHTML(startLevel, stopLevel int, ordered bool) template.HTML { +func (toc *Fragments) ToHTML(startLevel, stopLevel any, ordered bool) (template.HTML, error) { if toc == nil { - return "" + return "", nil } + + iStartLevel, err := cast.ToIntE(startLevel) + if err != nil { + return "", fmt.Errorf("startLevel: %w", err) + } + + iStopLevel, err := cast.ToIntE(stopLevel) + if err != nil { + return "", fmt.Errorf("stopLevel: %w", err) + } + b := &tocBuilder{ s: strings.Builder{}, h: toc.Headings, - startLevel: startLevel, - stopLevel: stopLevel, + startLevel: iStartLevel, + stopLevel: iStopLevel, ordered: ordered, } b.Build() - return template.HTML(b.s.String()) + return template.HTML(b.s.String()), nil } func (toc Fragments) walk(fn func(*Heading)) { diff --git a/markup/tableofcontents/tableofcontents_integration_test.go b/markup/tableofcontents/tableofcontents_integration_test.go index 87a7c0108..e6ae03ce2 100644 --- a/markup/tableofcontents/tableofcontents_integration_test.go +++ b/markup/tableofcontents/tableofcontents_integration_test.go @@ -14,6 +14,7 @@ package tableofcontents_test import ( + "strings" "testing" "github.com/gohugoio/hugo/hugolib" @@ -43,3 +44,80 @@ disableKinds = ['page','rss','section','sitemap','taxonomy','term'] "heading-l5|5|Heading L5", ) } + +// Issue #13107 +func TestToHTMLArgTypes(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +disableKinds = ['home','section','rss','sitemap','taxonomy','term'] +-- layouts/_default/single.html -- +{{ .Fragments.ToHTML .Params.toc.startLevel .Params.toc.endLevel false }} +-- content/json.md -- +{ + "title": "json", + "params": { + "toc": { + "startLevel": 2, + "endLevel": 4 + } + } +} +CONTENT +-- content/toml.md -- ++++ +title = 'toml' +[params.toc] +startLevel = 2 +endLevel = 4 ++++ +CONTENT +-- content/yaml.md -- +--- +title: yaml +params: + toc: + startLevel: 2 + endLevel: 4 +--- +CONTENT +` + + content := ` +# Level One +## Level Two +### Level Three +#### Level Four +##### Level Five +###### Level Six + ` + + want := ` + +` + + files = strings.ReplaceAll(files, "CONTENT", content) + + b := hugolib.Test(t, files) + b.AssertFileContentEquals("public/json/index.html", strings.TrimSpace(want)) + b.AssertFileContentEquals("public/toml/index.html", strings.TrimSpace(want)) + b.AssertFileContentEquals("public/yaml/index.html", strings.TrimSpace(want)) + + files = strings.ReplaceAll(files, `2`, `"x"`) + + b, _ = hugolib.TestE(t, files) + b.AssertLogMatches(`error calling ToHTML: startLevel: unable to cast "x" of type string`) +} diff --git a/markup/tableofcontents/tableofcontents_test.go b/markup/tableofcontents/tableofcontents_test.go index 3af9c4eb6..9ec7ec293 100644 --- a/markup/tableofcontents/tableofcontents_test.go +++ b/markup/tableofcontents/tableofcontents_test.go @@ -45,7 +45,8 @@ func TestToc(t *testing.T) { toc.addAt(&Heading{Title: "1-H3-1", ID: "1-h2-2"}, 0, 2) toc.addAt(&Heading{Title: "Heading 2", ID: "h1-2"}, 1, 0) - got := string(toc.ToHTML(1, -1, false)) + tocHTML, _ := toc.ToHTML(1, -1, false) + got := string(tocHTML) c.Assert(got, qt.Equals, ``, qt.Commentf(got)) - got = string(toc.ToHTML(1, 1, false)) + tocHTML, _ = toc.ToHTML(1, 1, false) + got = string(tocHTML) c.Assert(got, qt.Equals, ``, qt.Commentf(got)) - got = string(toc.ToHTML(1, 2, false)) + tocHTML, _ = toc.ToHTML(1, 2, false) + got = string(tocHTML) c.Assert(got, qt.Equals, ``, qt.Commentf(got)) - got = string(toc.ToHTML(2, 2, false)) + tocHTML, _ = toc.ToHTML(2, 2, false) + got = string(tocHTML) c.Assert(got, qt.Equals, ``, qt.Commentf(got)) - got = string(toc.ToHTML(1, -1, true)) + tocHTML, _ = toc.ToHTML(1, -1, true) + got = string(tocHTML) c.Assert(got, qt.Equals, `