Repository: gohugoio/hugo (language: go)

Issue:
docs: Add related key to docs.json
`hugo config --format json | grep related -A 20` yields:

```json
"related": {
    "indices": [
      {
        "name": "keywords",
        "type": "basic",
        "weight": 100
      },
      {
        "name": "date",
        "type": "basic",
        "weight": 10
      },
      {
        "name": "tags",
        "weight": 80
      }
    ],
    "threshold": 80
  },
```

It would be convenient if that were in docs.json, but we'd have to note in the docs (special case) that this bit is only present if `tags` is one of the taxonomies:

```text
      {
        "name": "tags",
        "weight": 80
      }
```




Discussion / hints:

Fix patch:
diff --git a/commands/gen.go b/commands/gen.go
index 1a3cf2174e6..02df720c8c7 100644
--- a/commands/gen.go
+++ b/commands/gen.go
@@ -30,6 +30,8 @@ import (
 	"github.com/gohugoio/hugo/docshelper"
 	"github.com/gohugoio/hugo/helpers"
 	"github.com/gohugoio/hugo/hugofs"
+	"github.com/gohugoio/hugo/hugolib"
+	"github.com/gohugoio/hugo/parser"
 	"github.com/spf13/cobra"
 	"github.com/spf13/cobra/doc"
 )
@@ -197,6 +199,14 @@ url: %s
 				enc := json.NewEncoder(f)
 				enc.SetIndent("", "  ")
 
+				configProvider := func() docshelper.DocProvider {
+					conf := hugolib.DefaultConfig()
+					conf.CacheDir = "" // The default value does not make sense in the docs.
+					defaultConfig := parser.LowerCaseCamelJSONMarshaller{Value: conf}
+					return docshelper.DocProvider{"config": defaultConfig}
+				}
+
+				docshelper.AddDocProviderFunc(configProvider)
 				if err := enc.Encode(docshelper.GetDocProvider()); err != nil {
 					return err
 				}
diff --git a/config/allconfig/alldecoders.go b/config/allconfig/alldecoders.go
index 6b8a4568cfd..24f9b9677aa 100644
--- a/config/allconfig/alldecoders.go
+++ b/config/allconfig/alldecoders.go
@@ -49,10 +49,11 @@ type decodeConfig struct {
 }
 
 type decodeWeight struct {
-	key         string
-	decode      func(decodeWeight, decodeConfig) error
-	getCompiler func(c *Config) configCompiler
-	weight      int
+	key                  string
+	decode               func(decodeWeight, decodeConfig) error
+	getCompiler          func(c *Config) configCompiler
+	weight               int
+	internalOrDeprecated bool // Hide it from the docs.
 }
 
 var allDecoderSetups = map[string]decodeWeight{
@@ -340,6 +341,7 @@ var allDecoderSetups = map[string]decodeWeight{
 			p.c.Author = maps.CleanConfigStringMap(p.p.GetStringMap(d.key))
 			return nil
 		},
+		internalOrDeprecated: true,
 	},
 	"social": {
 		key: "social",
@@ -347,6 +349,7 @@ var allDecoderSetups = map[string]decodeWeight{
 			p.c.Social = maps.CleanConfigStringMapString(p.p.GetStringMapString(d.key))
 			return nil
 		},
+		internalOrDeprecated: true,
 	},
 	"uglyurls": {
 		key: "uglyurls",
@@ -362,12 +365,14 @@ var allDecoderSetups = map[string]decodeWeight{
 			}
 			return nil
 		},
+		internalOrDeprecated: true,
 	},
 	"internal": {
 		key: "internal",
 		decode: func(d decodeWeight, p decodeConfig) error {
 			return mapstructure.WeakDecode(p.p.GetStringMap(d.key), &p.c.Internal)
 		},
+		internalOrDeprecated: true,
 	},
 }
 
diff --git a/config/docshelper.go b/config/allconfig/docshelper.go
similarity index 79%
rename from config/docshelper.go
rename to config/allconfig/docshelper.go
index e34c53c2bc1..48a09de51f5 100644
--- a/config/docshelper.go
+++ b/config/allconfig/docshelper.go
@@ -1,4 +1,4 @@
-// Copyright 2021 The Hugo Authors. All rights reserved.
+// Copyright 2023 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.
@@ -11,10 +11,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package config
+package allconfig
 
 import (
 	"github.com/gohugoio/hugo/common/maps"
+	"github.com/gohugoio/hugo/config"
 	"github.com/gohugoio/hugo/docshelper"
 )
 
@@ -22,8 +23,11 @@ import (
 func init() {
 	docsProvider := func() docshelper.DocProvider {
 
-		cfg := New()
-		for _, configRoot := range ConfigRootKeys {
+		cfg := config.New()
+		for configRoot, v := range allDecoderSetups {
+			if v.internalOrDeprecated {
+				continue
+			}
 			cfg.Set(configRoot, make(maps.Params))
 		}
 		lang := maps.Params{
@@ -38,7 +42,7 @@ func init() {
 		configHelpers := map[string]any{
 			"mergeStrategy": cfg.Get(""),
 		}
-		return docshelper.DocProvider{"config": configHelpers}
+		return docshelper.DocProvider{"config_helpers": configHelpers}
 	}
 
 	docshelper.AddDocProviderFunc(docsProvider)
diff --git a/config/security/docshelper.go b/config/security/docshelper.go
deleted file mode 100644
index ade03560ebc..00000000000
--- a/config/security/docshelper.go
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2021 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 security
-
-import (
-	"github.com/gohugoio/hugo/docshelper"
-)
-
-func init() {
-	docsProvider := func() docshelper.DocProvider {
-
-		return docshelper.DocProvider{"config": DefaultConfig.ToSecurityMap()}
-	}
-	docshelper.AddDocProviderFunc(docsProvider)
-}
diff --git a/docs/content/en/getting-started/configuration.md b/docs/content/en/getting-started/configuration.md
index ea82f1b53be..2ed46cb1064 100644
--- a/docs/content/en/getting-started/configuration.md
+++ b/docs/content/en/getting-started/configuration.md
@@ -112,7 +112,7 @@ deep
 
 Note that you don't need to be so verbose as in the default setup below; a `_merge` value higher up will be inherited if not set.
 
-{{< code-toggle config="mergeStrategy" skipHeader=true />}}
+{{< code-toggle file="hugo" dataKey="config_helpers.mergeStrategy" skipHeader=true />}}
 
 ## All configuration settings
 
diff --git a/docs/content/en/templates/output-formats.md b/docs/content/en/templates/output-formats.md
index 3983acc2440..d1f5f3bfe48 100644
--- a/docs/content/en/templates/output-formats.md
+++ b/docs/content/en/templates/output-formats.md
@@ -20,7 +20,7 @@ A [media type] (also known as _MIME type_ and _content type_) is a two-part iden
 
 This is the full set of built-in media types in Hugo:
 
-{{< datatable "media" "types" "type" "suffixes" >}}
+{{< datatable "config" "mediaTypes" "_key" "suffixes" >}}
 
 **Note:**
 
@@ -61,7 +61,7 @@ Given a media type and some additional configuration, you get an **Output Format
 
 This is the full set of Hugo's built-in output formats:
 
-{{< datatable "output" "formats" "name" "mediaType" "path" "baseName" "rel" "protocol" "isPlainText" "isHTML" "noUgly" "permalinkable" >}}
+{{< datatable "config" "outputFormats" "name" "mediaType" "path" "baseName" "rel" "protocol" "isPlainText" "isHTML" "noUgly" "permalinkable" >}}
 
 - A page can be output in as many output formats as you want, and you can have an infinite amount of output formats defined **as long as they resolve to a unique path on the file system**. In the above table, the best example of this is `AMP` vs. `HTML`. `AMP` has the value `amp` for `Path` so it doesn't overwrite the `HTML` version; e.g. we can now have both `/index.html` and `/amp/index.html`.
 - The `MediaType` must match the `Type` of an already defined media type.
diff --git a/docs/data/docs.json b/docs/data/docs.json
index 8d130b2fc98..23f9710bb6f 100644
--- a/docs/data/docs.json
+++ b/docs/data/docs.json
@@ -1600,6 +1600,144 @@
     ]
   },
   "config": {
+    "baseURL": "",
+    "buildDrafts": false,
+    "buildExpired": false,
+    "buildFuture": false,
+    "copyright": "",
+    "defaultContentLanguage": "en",
+    "defaultContentLanguageInSubdir": false,
+    "disableAliases": false,
+    "disablePathToLower": false,
+    "disableKinds": null,
+    "disableLanguages": null,
+    "disableHugoGeneratorInject": false,
+    "disableLiveReload": false,
+    "enableEmoji": false,
+    "mainSections": null,
+    "enableRobotsTXT": false,
+    "enableGitInfo": false,
+    "templateMetrics": false,
+    "templateMetricsHints": false,
+    "noBuildLock": false,
+    "ignoreErrors": null,
+    "ignoreFiles": [],
+    "ignoreCache": false,
+    "enableMissingTranslationPlaceholders": false,
+    "panicOnWarning": false,
+    "environment": "production",
+    "languageCode": "",
+    "hasCJKLanguage": false,
+    "paginate": 10,
+    "paginatePath": "page",
+    "pluralizeListTitles": true,
+    "canonifyURLs": false,
+    "relativeURLs": false,
+    "removePathAccents": false,
+    "printUnusedTemplates": false,
+    "printI18nWarnings": false,
+    "printPathWarnings": false,
+    "refLinksNotFoundURL": "",
+    "refLinksErrorLevel": "",
+    "sectionPagesMenu": "",
+    "summaryLength": 70,
+    "title": "",
+    "theme": null,
+    "timeout": "30s",
+    "timeZone": "",
+    "titleCaseStyle": "AP",
+    "newContentEditor": "",
+    "noTimes": false,
+    "noChmod": false,
+    "cleanDestinationDir": false,
+    "ignoreVendorPaths": "",
+    "themesDir": "themes",
+    "publishDir": "public",
+    "resourceDir": "resources",
+    "workingDir": "",
+    "cacheDir": "",
+    "contentDir": "content",
+    "dataDir": "data",
+    "layoutDir": "layouts",
+    "i18nDir": "i18n",
+    "archeTypeDir": "archetypes",
+    "assetDir": "assets",
+    "staticDir": [
+      "static"
+    ],
+    "staticDir0": null,
+    "staticDir1": null,
+    "staticDir2": null,
+    "staticDir3": null,
+    "staticDir4": null,
+    "staticDir5": null,
+    "staticDir6": null,
+    "staticDir7": null,
+    "staticDir8": null,
+    "staticDir9": null,
+    "staticDir10": null,
+    "author": {},
+    "social": null,
+    "build": {
+      "useResourceCacheWhen": "fallback",
+      "buildStats": {
+        "enable": false,
+        "disableTags": false,
+        "disableClasses": false,
+        "disableIDs": false
+      },
+      "noJSConfigInAssets": false,
+      "cacheBusters": [
+        {
+          "source": "assets/.*\\.(js|ts|jsx|tsx)",
+          "target": "(js|scripts|javascript)"
+        },
+        {
+          "source": "assets/.*\\.(css|sass|scss)$",
+          "target": "(css|styles|scss|sass)"
+        },
+        {
+          "source": "(postcss|tailwind)\\.config\\.js",
+          "target": "(css|styles|scss|sass)"
+        },
+        {
+          "source": "assets/.*\\.(.*)$",
+          "target": "$1"
+        }
+      ]
+    },
+    "caches": {
+      "assets": {
+        "maxAge": -1,
+        "dir": ":resourceDir/_gen",
+        "isResourceDir": true
+      },
+      "getcsv": {
+        "maxAge": -1,
+        "dir": ":cacheDir/:project",
+        "isResourceDir": false
+      },
+      "getjson": {
+        "maxAge": -1,
+        "dir": ":cacheDir/:project",
+        "isResourceDir": false
+      },
+      "getresource": {
+        "maxAge": -1,
+        "dir": ":cacheDir/:project",
+        "isResourceDir": false
+      },
+      "images": {
+        "maxAge": 1800000000000000,
+        "dir": ":cacheDir/images",
+        "isResourceDir": false
+      },
+      "modules": {
+        "maxAge": -1,
+        "dir": ":cacheDir/modules",
+        "isResourceDir": false
+      }
+    },
     "markup": {
       "defaultMarkdownHandler": "goldmark",
       "highlight": {
@@ -1674,287 +1812,86 @@
         "preserveTOC": false
       }
     },
-    "mergeStrategy": {
-      "build": {
-        "_merge": "none"
-      },
-      "caches": {
-        "_merge": "none"
-      },
-      "cascade": {
-        "_merge": "none"
-      },
-      "frontmatter": {
-        "_merge": "none"
-      },
-      "imaging": {
-        "_merge": "none"
-      },
-      "languages": {
-        "_merge": "none",
-        "en": {
-          "_merge": "none",
-          "menus": {
-            "_merge": "shallow"
-          },
-          "params": {
-            "_merge": "deep"
-          }
-        }
-      },
-      "markup": {
-        "_merge": "none"
-      },
-      "mediatypes": {
-        "_merge": "shallow"
-      },
-      "menus": {
-        "_merge": "shallow"
-      },
-      "minify": {
-        "_merge": "none"
-      },
-      "module": {
-        "_merge": "none"
-      },
-      "outputformats": {
-        "_merge": "shallow"
-      },
-      "params": {
-        "_merge": "deep"
-      },
-      "permalinks": {
-        "_merge": "none"
-      },
-      "privacy": {
-        "_merge": "none"
-      },
-      "related": {
-        "_merge": "none"
-      },
-      "security": {
-        "_merge": "none"
-      },
-      "sitemap": {
-        "_merge": "none"
-      },
-      "taxonomies": {
-        "_merge": "none"
-      }
-    },
-    "minify": {
-      "minifyOutput": false,
-      "disableHTML": false,
-      "disableCSS": false,
-      "disableJS": false,
-      "disableJSON": false,
-      "disableSVG": false,
-      "disableXML": false,
-      "tdewolff": {
-        "html": {
-          "keepComments": false,
-          "keepConditionalComments": true,
-          "keepDefaultAttrVals": true,
-          "keepDocumentTags": true,
-          "keepEndTags": true,
-          "keepQuotes": false,
-          "keepWhitespace": false
-        },
-        "css": {
-          "keepCSS2": true,
-          "precision": 0
-        },
-        "js": {
-          "precision": 0,
-          "keepVarNames": false,
-          "version": 2022
-        },
-        "json": {
-          "precision": 0,
-          "keepNumbers": false
-        },
-        "svg": {
-          "keepComments": false,
-          "precision": 0
-        },
-        "xml": {
-          "keepWhitespace": false
-        }
-      }
-    },
-    "security": {
-      "enableInlineShortcodes": false,
-      "exec": {
-        "allow": [
-          "^(dart-)?sass(-embedded)?$",
-          "^go$",
-          "^npx$",
-          "^postcss$"
-        ],
-        "osEnv": [
-          "(?i)^((HTTPS?|NO)_PROXY|PATH(EXT)?|APPDATA|TE?MP|TERM|GO\\w+|(XDG_CONFIG_)?HOME|USERPROFILE|SSH_AUTH_SOCK|DISPLAY|LANG)$"
-        ]
-      },
-      "funcs": {
-        "getenv": [
-          "^HUGO_",
-          "^CI$"
-        ]
-      },
-      "goTemplates": {
-        "AllowActionJSTmpl": false
-      },
-      "http": {
-        "mediaTypes": null,
-        "methods": [
-          "(?i)GET|POST"
-        ],
-        "urls": [
-          ".*"
-        ]
-      }
-    }
-  },
-  "media": {
-    "types": [
-      {
-        "mainType": "application",
-        "subType": "json",
+    "mediaTypes": {
+      "application/json": {
         "delimiter": ".",
-        "type": "application/json",
-        "string": "application/json",
         "suffixes": [
           "json"
         ]
       },
-      {
-        "mainType": "application",
-        "subType": "manifest",
+      "application/manifest+json": {
         "delimiter": ".",
-        "type": "application/manifest+json",
-        "string": "application/manifest+json",
         "suffixes": [
           "webmanifest"
         ]
       },
-      {
-        "mainType": "application",
-        "subType": "octet-stream",
-        "delimiter": ".",
-        "type": "application/octet-stream",
-        "string": "application/octet-stream",
-        "suffixes": [
-          ""
-        ]
+      "application/octet-stream": {
+        "delimiter": "."
       },
-      {
-        "mainType": "application",
-        "subType": "pdf",
+      "application/pdf": {
         "delimiter": ".",
-        "type": "application/pdf",
-        "string": "application/pdf",
         "suffixes": [
           "pdf"
         ]
       },
-      {
-        "mainType": "application",
-        "subType": "rss",
+      "application/rss+xml": {
         "delimiter": ".",
-        "type": "application/rss+xml",
-        "string": "application/rss+xml",
         "suffixes": [
           "xml",
           "rss"
         ]
       },
-      {
-        "mainType": "application",
-        "subType": "toml",
+      "application/toml": {
         "delimiter": ".",
-        "type": "application/toml",
-        "string": "application/toml",
         "suffixes": [
           "toml"
         ]
       },
-      {
-        "mainType": "application",
-        "subType": "wasm",
+      "application/wasm": {
         "delimiter": ".",
-        "type": "application/wasm",
-        "string": "application/wasm",
         "suffixes": [
           "wasm"
         ]
       },
-      {
-        "mainType": "application",
-        "subType": "xml",
+      "application/xml": {
         "delimiter": ".",
-        "type": "application/xml",
-        "string": "application/xml",
         "suffixes": [
           "xml"
         ]
       },
-      {
-        "mainType": "application",
-        "subType": "yaml",
+      "application/yaml": {
         "delimiter": ".",
-        "type": "application/yaml",
-        "string": "application/yaml",
         "suffixes": [
           "yaml",
           "yml"
         ]
       },
-      {
-        "mainType": "font",
-        "subType": "otf",
+      "font/otf": {
         "delimiter": ".",
-        "type": "font/otf",
-        "string": "font/otf",
         "suffixes": [
           "otf"
         ]
       },
-      {
-        "mainType": "font",
-        "subType": "ttf",
+      "font/ttf": {
         "delimiter": ".",
-        "type": "font/ttf",
-        "string": "font/ttf",
         "suffixes": [
           "ttf"
         ]
       },
-      {
-        "mainType": "image",
-        "subType": "bmp",
+      "image/bmp": {
         "delimiter": ".",
-        "type": "image/bmp",
-        "string": "image/bmp",
         "suffixes": [
           "bmp"
         ]
       },
-      {
-        "mainType": "image",
-        "subType": "gif",
+      "image/gif": {
         "delimiter": ".",
-        "type": "image/gif",
-        "string": "image/gif",
         "suffixes": [
           "gif"
         ]
       },
-      {
-        "mainType": "image",
-        "subType": "jpeg",
+      "image/jpeg": {
         "delimiter": ".",
-        "type": "image/jpeg",
-        "string": "image/jpeg",
         "suffixes": [
           "jpg",
           "jpeg",
@@ -1963,251 +1900,153 @@
           "jfif"
         ]
       },
-      {
-        "mainType": "image",
-        "subType": "png",
+      "image/png": {
         "delimiter": ".",
-        "type": "image/png",
-        "string": "image/png",
         "suffixes": [
           "png"
         ]
       },
-      {
-        "mainType": "image",
-        "subType": "svg",
+      "image/svg+xml": {
         "delimiter": ".",
-        "type": "image/svg+xml",
-        "string": "image/svg+xml",
         "suffixes": [
           "svg"
         ]
       },
-      {
-        "mainType": "image",
-        "subType": "tiff",
+      "image/tiff": {
         "delimiter": ".",
-        "type": "image/tiff",
-        "string": "image/tiff",
         "suffixes": [
           "tif",
           "tiff"
         ]
       },
-      {
-        "mainType": "image",
-        "subType": "webp",
+      "image/webp": {
         "delimiter": ".",
-        "type": "image/webp",
-        "string": "image/webp",
         "suffixes": [
           "webp"
         ]
       },
-      {
-        "mainType": "text",
-        "subType": "calendar",
+      "text/calendar": {
         "delimiter": ".",
-        "type": "text/calendar",
-        "string": "text/calendar",
         "suffixes": [
           "ics"
         ]
       },
-      {
-        "mainType": "text",
-        "subType": "css",
+      "text/css": {
         "delimiter": ".",
-        "type": "text/css",
-        "string": "text/css",
         "suffixes": [
           "css"
         ]
       },
-      {
-        "mainType": "text",
-        "subType": "csv",
+      "text/csv": {
         "delimiter": ".",
-        "type": "text/csv",
-        "string": "text/csv",
         "suffixes": [
           "csv"
         ]
       },
-      {
-        "mainType": "text",
-        "subType": "html",
+      "text/html": {
         "delimiter": ".",
-        "type": "text/html",
-        "string": "text/html",
         "suffixes": [
           "html"
         ]
       },
-      {
-        "mainType": "text",
-        "subType": "javascript",
+      "text/javascript": {
         "delimiter": ".",
-        "type": "text/javascript",
-        "string": "text/javascript",
         "suffixes": [
           "js",
           "jsm",
           "mjs"
         ]
       },
-      {
-        "mainType": "text",
-        "subType": "jsx",
+      "text/jsx": {
         "delimiter": ".",
-        "type": "text/jsx",
-        "string": "text/jsx",
         "suffixes": [
           "jsx"
         ]
       },
-      {
-        "mainType": "text",
-        "subType": "markdown",
+      "text/markdown": {
         "delimiter": ".",
-        "type": "text/markdown",
-        "string": "text/markdown",
         "suffixes": [
           "md",
           "markdown"
         ]
       },
-      {
-        "mainType": "text",
-        "subType": "plain",
+      "text/plain": {
         "delimiter": ".",
-        "type": "text/plain",
-        "string": "text/plain",
         "suffixes": [
           "txt"
         ]
       },
-      {
-        "mainType": "text",
-        "subType": "tsx",
+      "text/tsx": {
         "delimiter": ".",
-        "type": "text/tsx",
-        "string": "text/tsx",
         "suffixes": [
           "tsx"
         ]
       },
-      {
-        "mainType": "text",
-        "subType": "typescript",
+      "text/typescript": {
         "delimiter": ".",
-        "type": "text/typescript",
-        "string": "text/typescript",
         "suffixes": [
           "ts"
         ]
       },
-      {
-        "mainType": "text",
-        "subType": "x-sass",
+      "text/x-sass": {
         "delimiter": ".",
-        "type": "text/x-sass",
-        "string": "text/x-sass",
         "suffixes": [
           "sass"
         ]
       },
-      {
-        "mainType": "text",
-        "subType": "x-scss",
+      "text/x-scss": {
         "delimiter": ".",
-        "type": "text/x-scss",
-        "string": "text/x-scss",
         "suffixes": [
           "scss"
         ]
       },
-      {
-        "mainType": "video",
-        "subType": "3gpp",
+      "video/3gpp": {
         "delimiter": ".",
-        "type": "video/3gpp",
-        "string": "video/3gpp",
         "suffixes": [
           "3gpp",
           "3gp"
         ]
       },
-      {
-        "mainType": "video",
-        "subType": "mp4",
+      "video/mp4": {
         "delimiter": ".",
-        "type": "video/mp4",
-        "string": "video/mp4",
         "suffixes": [
           "mp4"
         ]
       },
-      {
-        "mainType": "video",
-        "subType": "mpeg",
+      "video/mpeg": {
         "delimiter": ".",
-        "type": "video/mpeg",
-        "string": "video/mpeg",
         "suffixes": [
           "mpg",
           "mpeg"
         ]
       },
-      {
-        "mainType": "video",
-        "subType": "ogg",
+      "video/ogg": {
         "delimiter": ".",
-        "type": "video/ogg",
-        "string": "video/ogg",
         "suffixes": [
           "ogv"
         ]
       },
-      {
-        "mainType": "video",
-        "subType": "webm",
+      "video/webm": {
         "delimiter": ".",
-        "type": "video/webm",
-        "string": "video/webm",
         "suffixes": [
           "webm"
         ]
       },
-      {
-        "mainType": "video",
-        "subType": "x-msvideo",
+      "video/x-msvideo": {
         "delimiter": ".",
-        "type": "video/x-msvideo",
-        "string": "video/x-msvideo",
         "suffixes": [
           "avi"
         ]
       }
-    ]
-  },
-  "output": {
-    "formats": [
-      {
-        "mediaType": "text/html",
-        "name": "html",
-        "path": "",
-        "baseName": "index",
-        "rel": "canonical",
-        "protocol": "",
-        "isPlainText": false,
-        "isHTML": true,
-        "noUgly": false,
-        "notAlternative": false,
-        "permalinkable": true,
-        "weight": 10
-      },
-      {
+    },
+    "imaging": {
+      "bgColor": "#ffffff",
+      "hint": "photo",
+      "quality": 75,
+      "resampleFilter": "box"
+    },
+    "outputFormats": {
+      "amp": {
         "mediaType": "text/html",
         "name": "amp",
         "path": "amp",
@@ -2221,7 +2060,7 @@
         "permalinkable": true,
         "weight": 0
       },
-      {
+      "calendar": {
         "mediaType": "text/calendar",
         "name": "calendar",
         "path": "",
@@ -2235,7 +2074,7 @@
         "permalinkable": false,
         "weight": 0
       },
-      {
+      "css": {
         "mediaType": "text/css",
         "name": "css",
         "path": "",
@@ -2249,7 +2088,7 @@
         "permalinkable": false,
         "weight": 0
       },
-      {
+      "csv": {
         "mediaType": "text/csv",
         "name": "csv",
         "path": "",
@@ -2263,7 +2102,21 @@
         "permalinkable": false,
         "weight": 0
       },
-      {
+      "html": {
+        "mediaType": "text/html",
+        "name": "html",
+        "path": "",
+        "baseName": "index",
+        "rel": "canonical",
+        "protocol": "",
+        "isPlainText": false,
+        "isHTML": true,
+        "noUgly": false,
+        "notAlternative": false,
+        "permalinkable": true,
+        "weight": 10
+      },
+      "json": {
         "mediaType": "application/json",
         "name": "json",
         "path": "",
@@ -2277,7 +2130,7 @@
         "permalinkable": false,
         "weight": 0
       },
-      {
+      "markdown": {
         "mediaType": "text/markdown",
         "name": "markdown",
         "path": "",
@@ -2291,7 +2144,7 @@
         "permalinkable": false,
         "weight": 0
       },
-      {
+      "robots": {
         "mediaType": "text/plain",
         "name": "robots",
         "path": "",
@@ -2305,7 +2158,7 @@
         "permalinkable": false,
         "weight": 0
       },
-      {
+      "rss": {
         "mediaType": "application/rss+xml",
         "name": "rss",
         "path": "",
@@ -2319,7 +2172,7 @@
         "permalinkable": false,
         "weight": 0
       },
-      {
+      "sitemap": {
         "mediaType": "application/xml",
         "name": "sitemap",
         "path": "",
@@ -2333,7 +2186,7 @@
         "permalinkable": false,
         "weight": 0
       },
-      {
+      "webappmanifest": {
         "mediaType": "application/manifest+json",
         "name": "webappmanifest",
         "path": "",
@@ -2347,7 +2200,412 @@
         "permalinkable": false,
         "weight": 0
       }
-    ],
+    },
+    "outputs": {
+      "home": [
+        "html",
+        "rss"
+      ],
+      "page": [
+        "html"
+      ],
+      "rss": [
+        "rss"
+      ],
+      "section": [
+        "html",
+        "rss"
+      ],
+      "taxonomy": [
+        "html",
+        "rss"
+      ],
+      "term": [
+        "html",
+        "rss"
+      ]
+    },
+    "cascade": [],
+    "menus": {},
+    "deployment": {
+      "targets": null,
+      "matchers": null,
+      "order": null,
+      "target": "",
+      "confirm": false,
+      "dryRun": false,
+      "force": false,
+      "invalidateCDN": true,
+      "maxDeletes": 256,
+      "workers": 10
+    },
+    "module": {
+      "mounts": [
+        {
+          "source": "content",
+          "target": "content",
+          "lang": "",
+          "includeFiles": null,
+          "excludeFiles": null
+        },
+        {
+          "source": "data",
+          "target": "data",
+          "lang": "",
+          "includeFiles": null,
+          "excludeFiles": null
+        },
+        {
+          "source": "layouts",
+          "target": "layouts",
+          "lang": "",
+          "includeFiles": null,
+          "excludeFiles": null
+        },
+        {
+          "source": "i18n",
+          "target": "i18n",
+          "lang": "",
+          "includeFiles": null,
+          "excludeFiles": null
+        },
+        {
+          "source": "archetypes",
+          "target": "archetypes",
+          "lang": "",
+          "includeFiles": null,
+          "excludeFiles": null
+        },
+        {
+          "source": "assets",
+          "target": "assets",
+          "lang": "",
+          "includeFiles": null,
+          "excludeFiles": null
+        },
+        {
+          "source": "static",
+          "target": "static",
+          "lang": "",
+          "includeFiles": null,
+          "excludeFiles": null
+        }
+      ],
+      "imports": null,
+      "params": null,
+      "hugoVersion": {
+        "min": "",
+        "max": "",
+        "extended": false
+      },
+      "noVendor": "",
+      "vendorClosest": false,
+      "replacements": null,
+      "proxy": "direct",
+      "noProxy": "none",
+      "private": "*.*",
+      "workspace": "off"
+    },
+    "frontmatter": {
+      "date": [
+        "date",
+        "publishdate",
+        "pubdate",
+        "published",
+        "lastmod",
+        "modified"
+      ],
+      "lastmod": [
+        ":git",
+        "lastmod",
+        "modified",
+        "date",
+        "publishdate",
+        "pubdate",
+        "published"
+      ],
+      "publishDate": [
+        "publishdate",
+        "pubdate",
+        "published",
+        "date"
+      ],
+      "expiryDate": [
+        "expirydate",
+        "unpublishdate"
+      ]
+    },
+    "minify": {
+      "minifyOutput": false,
+      "disableHTML": false,
+      "disableCSS": false,
+      "disableJS": false,
+      "disableJSON": false,
+      "disableSVG": false,
+      "disableXML": false,
+      "tdewolff": {
+        "html": {
+          "keepComments": false,
+          "keepConditionalComments": true,
+          "keepDefaultAttrVals": true,
+          "keepDocumentTags": true,
+          "keepEndTags": true,
+          "keepQuotes": false,
+          "keepWhitespace": false
+        },
+        "css": {
+          "keepCSS2": true,
+          "precision": 0
+        },
+        "js": {
+          "precision": 0,
+          "keepVarNames": false,
+          "version": 2022
+        },
+        "json": {
+          "precision": 0,
+          "keepNumbers": false
+        },
+        "svg": {
+          "keepComments": false,
+          "precision": 0
+        },
+        "xml": {
+          "keepWhitespace": false
+        }
+      }
+    },
+    "permalinks": {
+      "page": {},
+      "section": {},
+      "taxonomy": {},
+      "term": {}
+    },
+    "taxonomies": {
+      "category": "categories",
+      "tag": "tags"
+    },
+    "sitemap": {
+      "changeFreq": "",
+      "priority": -1,
+      "filename": "sitemap.xml"
+    },
+    "related": {
+      "threshold": 80,
+      "includeNewer": false,
+      "toLower": false,
+      "indices": [
+        {
+          "name": "keywords",
+          "type": "basic",
+          "applyFilter": false,
+          "pattern": "",
+          "weight": 100,
+          "cardinalityThreshold": 0,
+          "toLower": false
+        },
+        {
+          "name": "date",
+          "type": "basic",
+          "applyFilter": false,
+          "pattern": "",
+          "weight": 10,
+          "cardinalityThreshold": 0,
+          "toLower": false
+        },
+        {
+          "name": "tags",
+          "type": "",
+          "applyFilter": false,
+          "pattern": "",
+          "weight": 80,
+          "cardinalityThreshold": 0,
+          "toLower": false
+        }
+      ]
+    },
+    "server": {
+      "headers": null,
+      "redirects": [
+        {
+          "from": "**",
+          "to": "/404.html",
+          "status": 404,
+          "force": false
+        }
+      ]
+    },
+    "privacy": {
+      "disqus": {
+        "disable": false
+      },
+      "googleAnalytics": {
+        "disable": false,
+        "useSessionStorage": false,
+        "respectDoNotTrack": false,
+        "anonymizeIP": false
+      },
+      "instagram": {
+        "disable": false,
+        "simple": false
+      },
+      "twitter": {
+        "disable": false,
+        "enableDNT": false,
+        "simple": false
+      },
+      "vimeo": {
+        "disable": false,
+        "enableDNT": false,
+        "simple": false
+      },
+      "youTube": {
+        "disable": false,
+        "privacyEnhanced": false
+      }
+    },
+    "security": {
+      "exec": {
+        "allow": [
+          "^((dart-)?sass(-embedded)?|go|npx|postcss)$"
+        ],
+        "osEnv": [
+          "(?i)^(PATH|PATHEXT|APPDATA|HOME|TMP|TEMP|TERM)$"
+        ]
+      },
+      "funcs": {
+        "getenv": [
+          "^(HUGO_|REPOSITORY_URL|^BRANCH$)"
+        ]
+      },
+      "http": {
+        "urls": [
+          ".*"
+        ],
+        "methods": [
+          "(?i)GET|POST"
+        ],
+        "mediaTypes": null
+      },
+      "enableInlineShortcodes": false,
+      "goTemplates": {
+        "allowActionJSTmpl": false
+      }
+    },
+    "services": {
+      "disqus": {
+        "shortname": ""
+      },
+      "googleAnalytics": {
+        "id": ""
+      },
+      "instagram": {
+        "disableInlineCSS": false,
+        "accessToken": ""
+      },
+      "twitter": {
+        "disableInlineCSS": false
+      },
+      "rss": {
+        "limit": -1
+      }
+    },
+    "params": {},
+    "languages": {
+      "en": {
+        "languageName": "",
+        "languageCode": "",
+        "title": "",
+        "languageDirection": "",
+        "weight": 0,
+        "disabled": false
+      }
+    },
+    "uglyURLs": false
+  },
+  "config_helpers": {
+    "mergeStrategy": {
+      "build": {
+        "_merge": "none"
+      },
+      "caches": {
+        "_merge": "none"
+      },
+      "cascade": {
+        "_merge": "none"
+      },
+      "deployment": {
+        "_merge": "none"
+      },
+      "frontmatter": {
+        "_merge": "none"
+      },
+      "imaging": {
+        "_merge": "none"
+      },
+      "languages": {
+        "_merge": "none",
+        "en": {
+          "_merge": "none",
+          "menus": {
+            "_merge": "shallow"
+          },
+          "params": {
+            "_merge": "deep"
+          }
+        }
+      },
+      "markup": {
+        "_merge": "none"
+      },
+      "mediatypes": {
+        "_merge": "shallow"
+      },
+      "menus": {
+        "_merge": "shallow"
+      },
+      "minify": {
+        "_merge": "none"
+      },
+      "module": {
+        "_merge": "none"
+      },
+      "outputformats": {
+        "_merge": "shallow"
+      },
+      "outputs": {
+        "_merge": "none"
+      },
+      "params": {
+        "_merge": "deep"
+      },
+      "permalinks": {
+        "_merge": "none"
+      },
+      "privacy": {
+        "_merge": "none"
+      },
+      "related": {
+        "_merge": "none"
+      },
+      "security": {
+        "_merge": "none"
+      },
+      "server": {
+        "_merge": "none"
+      },
+      "services": {
+        "_merge": "none"
+      },
+      "sitemap": {
+        "_merge": "none"
+      },
+      "taxonomies": {
+        "_merge": "none"
+      }
+    }
+  },
+  "output": {
     "layouts": [
       {
         "Example": "Single page in \"posts\" section",
@@ -3138,7 +3396,7 @@
           "Examples": []
         },
         "Apply": {
-          "Description": "Apply takes a map, array, or slice c and returns a new slice with the function fname applied over it.",
+          "Description": "Apply takes an array or slice c and returns a new slice with the function fname applied over it.",
           "Args": [
             "ctx",
             "c",
@@ -3168,6 +3426,7 @@
         "Delimit": {
           "Description": "Delimit takes a given list l and returns a string delimited by sep.\nIf last is passed to the function, it will be used as the final delimiter.",
           "Args": [
+            "ctx",
             "l",
             "sep",
             "last"
@@ -3415,6 +3674,7 @@
         "Sort": {
           "Description": "Sort returns a sorted copy of the list l.",
           "Args": [
+            "ctx",
             "l",
             "args"
           ],
@@ -3473,6 +3733,7 @@
         "Where": {
           "Description": "Where returns a filtered subset of collection c.",
           "Args": [
+            "ctx",
             "c",
             "key",
             "args"
diff --git a/docs/layouts/maintenance/list.html b/docs/layouts/maintenance/list.html
index 2035c058b55..f78bbd08f2b 100644
--- a/docs/layouts/maintenance/list.html
+++ b/docs/layouts/maintenance/list.html
@@ -1,68 +1,78 @@
 {{ define "main" }}
-<div class="w-100 ph4 pb5 pb6-ns pt1 mt4 pt3-ns">
+  <div class="w-100 ph4 pb5 pb6-ns pt1 mt4 pt3-ns">
     <div class="flex-l">
-        <div class="order-2 w-100 w-20-l ph5-m ph0-l mb4 sticky">
-            <aside class="fixed-lTK mw5-l right-0 f6 bl-l b--moon-gray pv4 pv0-ns ph4-l nested-list-reset nested-links nested-copy-line-height">
-                <p class="b">What's on this Page</p>
-                <ul>
-                    <li><a href="#last-updated">Last Updated</a></li>
-                    <li><a href="#least-recently-updated">Least Recently Updated</a></li>
-                    <li><a href="#todos">Pages marked with TODO</a></li>
-                    <li><a href="#dependencies">Project dependencies (Hugo Modules)</a></li>
-                </ul>
-            </aside>
-        </div>
-        <div class="w-100">
-            {{ $byLastMod :=  .Site.RegularPages.ByLastmod  }}
-            {{ $recent := ($byLastMod | last 30).Reverse }}
-            {{ $leastRecent := $byLastMod | first 10 }}
-            <h2 id="last-updated">Last Updated</h2>
-            {{ partial "maintenance-pages-table.html" $recent }}
-            <h2 id="least-recently-updated">Least Recently Updated</h2>
-            {{ partial "maintenance-pages-table.html" $leastRecent }}
+      <div class="order-2 w-100 w-20-l ph5-m ph0-l mb4 sticky">
+        <aside
+          class="fixed-lTK mw5-l right-0 f6 bl-l b--moon-gray pv4 pv0-ns ph4-l nested-list-reset nested-links nested-copy-line-height">
+          <p class="b">What's on this Page</p>
+          <ul>
+            <li><a href="#last-updated">Last Updated</a></li>
+            <li>
+              <a href="#least-recently-updated">Least Recently Updated</a>
+            </li>
+            <li><a href="#todos">Pages marked with TODO</a></li>
+            <li>
+              <a href="#dependencies">Project dependencies (Hugo Modules)</a>
+            </li>
+          </ul>
+        </aside>
+      </div>
+      <div class="w-100">
+        {{ $byLastMod :=  .Site.RegularPages.ByLastmod }}
+        {{ $recent := ($byLastMod | last 30).Reverse }}
+        {{ $leastRecent := $byLastMod | first 10 }}
+        <h2 id="last-updated">Last Updated</h2>
+        {{ partial "maintenance-pages-table.html" $recent }}
+        <h2 id="least-recently-updated">Least Recently Updated</h2>
+        {{ partial "maintenance-pages-table.html" $leastRecent }}
 
-            {{/* Don't think this is possible with where directly. Should investigate. */}}
-            {{ .Scratch.Set "todos" slice }}
-            {{ range .Site.RegularPages }}
-                 {{ if .HasShortcode "todo" }}
-                 {{ $.Scratch.Add "todos" . }}
-                 {{ end }}
-            {{ end }}
-            <h2 id="todos">Pages marked with TODO</h2>
-            {{ partial "maintenance-pages-table.html" (.Scratch.Get "todos") }}
+        {{/* Don't think this is possible with where directly. Should investigate. */}}
+        {{ .Scratch.Set "todos" slice }}
+        {{ range .Site.RegularPages }}
+          {{ if .HasShortcode "todo" }}
+            {{ $.Scratch.Add "todos" . }}
+          {{ end }}
+        {{ end }}
+        <h2 id="todos">Pages marked with TODO</h2>
+        {{ partial "maintenance-pages-table.html" (.Scratch.Get "todos") }}
 
-            <h2 id="dependencies">Dependencies</h2>
-            <table class="collapse ba br2 b--black-10 pv2 ph3">
-              <thead>
-                <tr>
-                  <th class="pv2 ph3 tl f6 fw6 ttu">#</th>
-                  <th class="pv2 ph3 tl f6 fw6 ttu">Owner</th>
-                  <th class="pv2 ph3 tl f6 fw6 ttu">Path</th>
-                  <th class="pv2 ph3 tl f6 fw6 ttu">Version</th>
-                  <th class="pv2 ph3 tl f6 fw6 ttu">Time</th>
-                  <th class="pv2 ph3 tl f6 fw6 ttu">Vendor</th>
-                </tr>
-              </thead>
-              <tbody>
-                {{ range $index, $element := hugo.Deps }}
-                <tr class="striped--light-gray">
-                  <th class="pv2 ph3">{{ add $index 1 }}</th>
-                  <td class="pv2 ph3">{{ with $element.Owner }}{{.Path }}{{ end }}</td>
-                  <td class="pv2 ph3">
-                    {{ $element.Path }}
-                    {{ with $element.Replace}}
-                    => {{ .Path }}
-                    {{ end }}
-                  </td>
-                  <td class="pv2 ph3">{{ $element.Version }}</td>
-                  <td class="pv2 ph3">{{ with $element.Time }}{{ . }}{{ end }}</td>
-                  <td class="pv2 ph3">{{ $element.Vendor }}</td>
-                </tr>
-                {{ end }}
-              </tbody>
-            </table>
 
-        </div>
+        <h2 id="dependencies">Dependencies</h2>
+        <table class="collapse ba br2 b--black-10 pv2 ph3">
+          <thead>
+            <tr>
+              <th class="pv2 ph3 tl f6 fw6 ttu">#</th>
+              <th class="pv2 ph3 tl f6 fw6 ttu">Owner</th>
+              <th class="pv2 ph3 tl f6 fw6 ttu">Path</th>
+              <th class="pv2 ph3 tl f6 fw6 ttu">Version</th>
+              <th class="pv2 ph3 tl f6 fw6 ttu">Time</th>
+              <th class="pv2 ph3 tl f6 fw6 ttu">Vendor</th>
+            </tr>
+          </thead>
+          <tbody>
+            {{ range $index, $element := hugo.Deps }}
+              <tr class="striped--light-gray">
+                <th class="pv2 ph3">{{ add $index 1 }}</th>
+                <td class="pv2 ph3">
+                  {{ with $element.Owner }}{{ .Path }}{{ end }}
+                </td>
+                <td class="pv2 ph3">
+                  {{ $element.Path }}
+                  {{ with $element.Replace }}
+                    =>
+                    {{ .Path }}
+                  {{ end }}
+                </td>
+                <td class="pv2 ph3">{{ $element.Version }}</td>
+                <td class="pv2 ph3">
+                  {{ with $element.Time }}{{ . }}{{ end }}
+                </td>
+                <td class="pv2 ph3">{{ $element.Vendor }}</td>
+              </tr>
+            {{ end }}
+          </tbody>
+        </table>
+      </div>
     </div>
-</div>
-{{ end }}
\ No newline at end of file
+  </div>
+{{ end }}
diff --git a/docs/layouts/shortcodes/code-toggle.html b/docs/layouts/shortcodes/code-toggle.html
index 3b151669fdf..6e0e3d73eb1 100644
--- a/docs/layouts/shortcodes/code-toggle.html
+++ b/docs/layouts/shortcodes/code-toggle.html
@@ -1,17 +1,18 @@
 {{- /*
-Renders syntax-highlighted configuration data in JSON, TOML, and YAML formats.
+  Renders syntax-highlighted configuration data in JSON, TOML, and YAML formats.
 
-@param {string} [config] The section of site.Data.docs.config to render.
-@param {bool} [copy=true] If true, display a copy to clipboard button.
-@param {string} [file] The file name to display above the rendered code.
-@param {bool} [fm=false] If true, render the code as front matter.
-@param {bool} [skipHeader=false] If false, omit top level key(s) when rendering a section of site.Data.docs.config.
+  @param {string} [config] The section of site.Data.docs.config to render.
+  @param {bool} [copy=true] If true, display a copy to clipboard button.
+  @param {string} [file] The file name to display above the rendered code.
+  @param {bool} [fm=false] If true, render the code as front matter.
+  @param {bool} [skipHeader=false] If false, omit top level key(s) when rendering a section of site.Data.docs.config.
 
-@returns {template.HTML}
+  @returns {template.HTML}
 */}}
 
 {{- /* Initialize. */}}
 {{- $config := "" }}
+{{- $dataKey := "" }}
 {{- $copy := true }}
 {{- $file := "" }}
 {{- $fm := false }}
@@ -19,20 +20,21 @@
 
 {{- /* Get parameters. */}}
 {{- $config = .Get "config" }}
+{{- $dataKey = .Get "dataKey" }}
 {{- $file = .Get "file" }}
 {{- if in (slice "false" false 0) (.Get "copy") }}
   {{- $copy = false }}
-{{- else if in (slice "true" true 1) (.Get "copy")}}
+{{- else if in (slice "true" true 1) (.Get "copy") }}
   {{- $copy = true }}
 {{- end }}
 {{- if in (slice "false" false 0) (.Get "fm") }}
   {{- $fm = false }}
-{{- else if in (slice "true" true 1) (.Get "fm")}}
+{{- else if in (slice "true" true 1) (.Get "fm") }}
   {{- $fm = true }}
 {{- end }}
 {{- if in (slice "false" false 0) (.Get "skipHeader") }}
   {{- $skipHeader = false }}
-{{- else if in (slice "true" true 1) (.Get "skipHeader")}}
+{{- else if in (slice "true" true 1) (.Get "skipHeader") }}
   {{- $skipHeader = true }}
 {{- end }}
 
@@ -43,14 +45,18 @@
 
 {{- /* Render. */}}
 {{- $code := "" }}
-{{- with $config }}
+{{- if $config }}
   {{- $file = $file | default "hugo" }}
-  {{- $sections := (split . ".") }}
+  {{- $sections := (split $config ".") }}
   {{- $configSection := index $.Site.Data.docs.config $sections }}
   {{- $code = dict $sections $configSection }}
   {{- if $skipHeader }}
     {{- $code = $configSection }}
   {{- end }}
+{{- else if $dataKey }}
+  {{- $file = $file | default $dataKey }}
+  {{- $sections := (split $dataKey ".") }}
+  {{- $code = index $.Site.Data.docs $sections }}
 {{- else }}
   {{- $code = $.Inner }}
 {{- end }}
@@ -62,7 +68,9 @@
       </div>
     {{- end }}
     {{- range $langs }}
-      <button data-toggle-tab="{{ . }}" class="tab-button {{ cond (eq . "yaml") "active" "" }} ba san-serif f6 dib lh-solid ph2 pv2">
+      <button
+        data-toggle-tab="{{ . }}"
+        class="tab-button {{ cond (eq . "yaml") "active" "" }} ba san-serif f6 dib lh-solid ph2 pv2">
         {{ . }}
       </button>
       &nbsp;
@@ -70,7 +78,9 @@
   </div>
   <div class="tab-content">
     {{- range $langs }}
-      <div data-pane="{{ . }}" class="code-copy-content nt3 tab-pane {{ cond (eq . "yaml") "active" "" }}">
+      <div
+        data-pane="{{ . }}"
+        class="code-copy-content nt3 tab-pane {{ cond (eq . "yaml") "active" "" }}">
         {{- $hCode := $code | transform.Remarshal . }}
         {{- if and $fm (in (slice "toml" "yaml") .) }}
           {{- $hCode = printf "%s\n%s\n%s" $placeHolder $hCode $placeHolder }}
@@ -79,7 +89,11 @@
         {{ highlight $hCode . "" | replaceRE $placeHolder (index $delimiters .) | safeHTML }}
       </div>
       {{- if $copy }}
-        <button class="needs-js copy copy-toggle bg-accent-color-dark f6 absolute top-0 right-0 lh-solid hover-bg-primary-color-dark bn white ph3 pv2" title="Copy this code to your clipboard." data-clipboard-action="copy" aria-label="copy button"></button>
+        <button
+          class="needs-js copy copy-toggle bg-accent-color-dark f6 absolute top-0 right-0 lh-solid hover-bg-primary-color-dark bn white ph3 pv2"
+          title="Copy this code to your clipboard."
+          data-clipboard-action="copy"
+          aria-label="copy button"></button>
         {{- /* Functionality located within filesaver.js The copy here is located in the css with .copy class so it can be replaced with JS on success */}}
       {{- end }}
     {{- end }}
diff --git a/docs/layouts/shortcodes/datatable.html b/docs/layouts/shortcodes/datatable.html
index 4e2814f5a9f..12054f89dad 100644
--- a/docs/layouts/shortcodes/datatable.html
+++ b/docs/layouts/shortcodes/datatable.html
@@ -3,20 +3,31 @@
 {{ $list := (index (index .Site.Data.docs $package) $listname) }}
 {{ $fields := after 2 .Params }}
 
+
 <table class="table table-bordered">
-	<tr>
-		{{ range $fields }}
-		<th>{{ . }}</th>
-		{{ end }}
-	</tr>
-	{{ range $list }}
-	<tr>
-		{{ range $k, $v := . }}
-		{{ $.Scratch.Set $k $v }}
-		{{ end }}
-		{{ range $fields }}
-			<td>{{ $.Scratch.Get . }}</td>
-		{{ end }}
-	</tr>
-	{{ end }}
+  <tr>
+    {{ range $fields }}
+      {{ $s := . }}
+      {{ if eq $s "_key" }}
+        {{ $s = "Type" }}
+      {{ end }}
+      <th>{{ $s }}</th>
+    {{ end }}
+  </tr>
+  {{ range $k1, $v1 := $list }}
+    <tr>
+      {{ range $k2, $v2 := . }}
+        {{ $.Scratch.Set $k2 $v2 }}
+      {{ end }}
+      {{ range $fields }}
+        {{ $s := "" }}
+        {{ if eq . "_key" }}
+          {{ $s = $k1 }}
+        {{ else }}
+          {{ $s = $.Scratch.Get . }}
+        {{ end }}
+        <td>{{ $s }}</td>
+      {{ end }}
+    </tr>
+  {{ end }}
 </table>
diff --git a/docshelper/docs.go b/docshelper/docs.go
index 1e159412056..b138ff81e35 100644
--- a/docshelper/docs.go
+++ b/docshelper/docs.go
@@ -15,9 +15,11 @@
 // is of limited interest for the general Hugo user.
 package docshelper
 
+import "fmt"
+
 type (
 	DocProviderFunc = func() DocProvider
-	DocProvider     map[string]map[string]any
+	DocProvider     map[string]any
 )
 
 var docProviderFuncs []DocProviderFunc
@@ -32,20 +34,14 @@ func GetDocProvider() DocProvider {
 	for _, fn := range docProviderFuncs {
 		p := fn()
 		for k, v := range p {
-			if prev, found := provider[k]; !found {
-				provider[k] = v
-			} else {
-				merge(prev, v)
+			if _, found := provider[k]; found {
+				// We use to merge config, but not anymore.
+				// These constructs will eventually go away, so just make it simple.
+				panic(fmt.Sprintf("Duplicate doc provider key: %q", k))
 			}
+			provider[k] = v
 		}
 	}
 
 	return provider
 }
-
-// Shallow merge
-func merge(dst, src map[string]any) {
-	for k, v := range src {
-		dst[k] = v
-	}
-}
diff --git a/markup/markup_config/config.go b/markup/markup_config/config.go
index 0793669a76b..0350a78a234 100644
--- a/markup/markup_config/config.go
+++ b/markup/markup_config/config.go
@@ -16,12 +16,10 @@ package markup_config
 import (
 	"github.com/gohugoio/hugo/common/maps"
 	"github.com/gohugoio/hugo/config"
-	"github.com/gohugoio/hugo/docshelper"
 	"github.com/gohugoio/hugo/markup/asciidocext/asciidocext_config"
 	"github.com/gohugoio/hugo/markup/goldmark/goldmark_config"
 	"github.com/gohugoio/hugo/markup/highlight"
 	"github.com/gohugoio/hugo/markup/tableofcontents"
-	"github.com/gohugoio/hugo/parser"
 	"github.com/mitchellh/mapstructure"
 )
 
@@ -108,10 +106,3 @@ var Default = Config{
 	Goldmark:    goldmark_config.Default,
 	AsciidocExt: asciidocext_config.Default,
 }
-
-func init() {
-	docsProvider := func() docshelper.DocProvider {
-		return docshelper.DocProvider{"config": map[string]any{"markup": parser.LowerCaseCamelJSONMarshaller{Value: Default}}}
-	}
-	docshelper.AddDocProviderFunc(docsProvider)
-}
diff --git a/media/docshelper.go b/media/docshelper.go
deleted file mode 100644
index d37c08eb307..00000000000
--- a/media/docshelper.go
+++ /dev/null
@@ -1,13 +0,0 @@
-package media
-
-import (
-	"github.com/gohugoio/hugo/docshelper"
-)
-
-// This is is just some helpers used to create some JSON used in the Hugo docs.
-func init() {
-	docsProvider := func() docshelper.DocProvider {
-		return docshelper.DocProvider{"media": map[string]any{"types": DefaultTypes}}
-	}
-	docshelper.AddDocProviderFunc(docsProvider)
-}
diff --git a/minifiers/config.go b/minifiers/config.go
index 58271362d9a..8ebcaa5c9b7 100644
--- a/minifiers/config.go
+++ b/minifiers/config.go
@@ -15,8 +15,6 @@ package minifiers
 
 import (
 	"github.com/gohugoio/hugo/common/maps"
-	"github.com/gohugoio/hugo/docshelper"
-	"github.com/gohugoio/hugo/parser"
 	"github.com/spf13/cast"
 
 	"github.com/mitchellh/mapstructure"
@@ -113,10 +111,3 @@ func DecodeConfig(v any) (conf MinifyConfig, err error) {
 
 	return
 }
-
-func init() {
-	docsProvider := func() docshelper.DocProvider {
-		return docshelper.DocProvider{"config": map[string]any{"minify": parser.LowerCaseCamelJSONMarshaller{Value: defaultConfig}}}
-	}
-	docshelper.AddDocProviderFunc(docsProvider)
-}
diff --git a/output/docshelper.go b/output/docshelper.go
index 1275c59795b..0436a10be4d 100644
--- a/output/docshelper.go
+++ b/output/docshelper.go
@@ -14,7 +14,6 @@ func init() {
 	docsProvider := func() docshelper.DocProvider {
 		return docshelper.DocProvider{
 			"output": map[string]any{
-				"formats": DefaultFormats,
 				"layouts": createLayoutExamples(),
 			},
 		}


Test patch: