From ec3890affe55af1fa196901f446cc0e7df059da8 Mon Sep 17 00:00:00 2001
From: hugoreleaser
Date: Thu, 24 Oct 2024 12:41:02 +0000
Subject: [PATCH 001/456] 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 002/456] 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 003/456] 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 004/456] 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 005/456] 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
+
+
## 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 006/456] 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 007/456] 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 008/456] 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 009/456] 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
[](https://github.com/gohugoio/hugo/actions?query=workflow%3ATest)
[](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 010/456] 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
+-- 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 013/456] 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 014/456] 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 015/456] 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 016/456] 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 017/456] 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 018/456] 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 019/456] 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 020/456] 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 021/456] 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 022/456] 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 023/456] 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 024/456] 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 025/456] 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 026/456] 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 027/456] 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 028/456] 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 029/456] 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 030/456] 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
[](https://app.netlify.com/sites/gohugoio/deploys)
[](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 @@
-
- {{ partial "svg/twitter.svg" (dict "size" "32px") }}
-}}
+{{% 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
+
+{{ 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
-{{* my-shortcode */>}}
-Able was I ere I saw Elba.
-{{* /my-shortcode */>}}
-```
-
-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 }}
+
+ {{ .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:
{{< /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
{{< /code >}}
@@ -69,7 +69,7 @@ Although technically correct per the CommonMark specification, this is not what
{{< code file=layouts/shortcodes/gallery.html >}}