From 851bf3515e61141cda6209fb196f4505c826607c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Mon, 7 Aug 2023 10:52:52 +0200 Subject: [PATCH] Add all config to docshelper.json Also consolidate so the mediaTypes and outputFormats are listed once only. Fixes #11328 --- commands/gen.go | 10 + config/allconfig/alldecoders.go | 13 +- config/{ => allconfig}/docshelper.go | 14 +- config/security/docshelper.go | 26 - .../en/getting-started/configuration.md | 2 +- docs/content/en/templates/output-formats.md | 4 +- docs/data/docs.json | 1451 ++++++++++------- docs/layouts/maintenance/list.html | 136 +- docs/layouts/shortcodes/code-toggle.html | 44 +- docs/layouts/shortcodes/datatable.html | 41 +- docshelper/docs.go | 20 +- markup/markup_config/config.go | 9 - media/docshelper.go | 13 - minifiers/config.go | 9 - output/docshelper.go | 1 - 15 files changed, 1023 insertions(+), 770 deletions(-) rename config/{ => allconfig}/docshelper.go (79%) delete mode 100644 config/security/docshelper.go delete mode 100644 media/docshelper.go diff --git a/commands/gen.go b/commands/gen.go index 1a3cf2174..02df720c8 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 6b8a4568c..24f9b9677 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 e34c53c2b..48a09de51 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 ade03560e..000000000 --- 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 ea82f1b53..2ed46cb10 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 3983acc24..d1f5f3bfe 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 8d130b2fc..23f9710bb 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,74 +1812,529 @@ "preserveTOC": false } }, - "mergeStrategy": { - "build": { - "_merge": "none" + "mediaTypes": { + "application/json": { + "delimiter": ".", + "suffixes": [ + "json" + ] }, - "caches": { - "_merge": "none" + "application/manifest+json": { + "delimiter": ".", + "suffixes": [ + "webmanifest" + ] }, - "cascade": { - "_merge": "none" + "application/octet-stream": { + "delimiter": "." }, - "frontmatter": { - "_merge": "none" + "application/pdf": { + "delimiter": ".", + "suffixes": [ + "pdf" + ] }, - "imaging": { - "_merge": "none" + "application/rss+xml": { + "delimiter": ".", + "suffixes": [ + "xml", + "rss" + ] }, - "languages": { - "_merge": "none", - "en": { - "_merge": "none", - "menus": { - "_merge": "shallow" - }, - "params": { - "_merge": "deep" - } - } + "application/toml": { + "delimiter": ".", + "suffixes": [ + "toml" + ] }, - "markup": { - "_merge": "none" + "application/wasm": { + "delimiter": ".", + "suffixes": [ + "wasm" + ] }, - "mediatypes": { - "_merge": "shallow" + "application/xml": { + "delimiter": ".", + "suffixes": [ + "xml" + ] }, - "menus": { - "_merge": "shallow" + "application/yaml": { + "delimiter": ".", + "suffixes": [ + "yaml", + "yml" + ] }, - "minify": { - "_merge": "none" + "font/otf": { + "delimiter": ".", + "suffixes": [ + "otf" + ] }, - "module": { - "_merge": "none" + "font/ttf": { + "delimiter": ".", + "suffixes": [ + "ttf" + ] }, - "outputformats": { - "_merge": "shallow" + "image/bmp": { + "delimiter": ".", + "suffixes": [ + "bmp" + ] }, - "params": { - "_merge": "deep" + "image/gif": { + "delimiter": ".", + "suffixes": [ + "gif" + ] }, - "permalinks": { - "_merge": "none" + "image/jpeg": { + "delimiter": ".", + "suffixes": [ + "jpg", + "jpeg", + "jpe", + "jif", + "jfif" + ] }, - "privacy": { - "_merge": "none" + "image/png": { + "delimiter": ".", + "suffixes": [ + "png" + ] }, - "related": { - "_merge": "none" + "image/svg+xml": { + "delimiter": ".", + "suffixes": [ + "svg" + ] }, - "security": { - "_merge": "none" + "image/tiff": { + "delimiter": ".", + "suffixes": [ + "tif", + "tiff" + ] + }, + "image/webp": { + "delimiter": ".", + "suffixes": [ + "webp" + ] + }, + "text/calendar": { + "delimiter": ".", + "suffixes": [ + "ics" + ] + }, + "text/css": { + "delimiter": ".", + "suffixes": [ + "css" + ] + }, + "text/csv": { + "delimiter": ".", + "suffixes": [ + "csv" + ] + }, + "text/html": { + "delimiter": ".", + "suffixes": [ + "html" + ] + }, + "text/javascript": { + "delimiter": ".", + "suffixes": [ + "js", + "jsm", + "mjs" + ] + }, + "text/jsx": { + "delimiter": ".", + "suffixes": [ + "jsx" + ] + }, + "text/markdown": { + "delimiter": ".", + "suffixes": [ + "md", + "markdown" + ] + }, + "text/plain": { + "delimiter": ".", + "suffixes": [ + "txt" + ] + }, + "text/tsx": { + "delimiter": ".", + "suffixes": [ + "tsx" + ] + }, + "text/typescript": { + "delimiter": ".", + "suffixes": [ + "ts" + ] + }, + "text/x-sass": { + "delimiter": ".", + "suffixes": [ + "sass" + ] + }, + "text/x-scss": { + "delimiter": ".", + "suffixes": [ + "scss" + ] + }, + "video/3gpp": { + "delimiter": ".", + "suffixes": [ + "3gpp", + "3gp" + ] + }, + "video/mp4": { + "delimiter": ".", + "suffixes": [ + "mp4" + ] + }, + "video/mpeg": { + "delimiter": ".", + "suffixes": [ + "mpg", + "mpeg" + ] + }, + "video/ogg": { + "delimiter": ".", + "suffixes": [ + "ogv" + ] + }, + "video/webm": { + "delimiter": ".", + "suffixes": [ + "webm" + ] + }, + "video/x-msvideo": { + "delimiter": ".", + "suffixes": [ + "avi" + ] + } + }, + "imaging": { + "bgColor": "#ffffff", + "hint": "photo", + "quality": 75, + "resampleFilter": "box" + }, + "outputFormats": { + "amp": { + "mediaType": "text/html", + "name": "amp", + "path": "amp", + "baseName": "index", + "rel": "amphtml", + "protocol": "", + "isPlainText": false, + "isHTML": true, + "noUgly": false, + "notAlternative": false, + "permalinkable": true, + "weight": 0 + }, + "calendar": { + "mediaType": "text/calendar", + "name": "calendar", + "path": "", + "baseName": "index", + "rel": "alternate", + "protocol": "webcal://", + "isPlainText": true, + "isHTML": false, + "noUgly": false, + "notAlternative": false, + "permalinkable": false, + "weight": 0 + }, + "css": { + "mediaType": "text/css", + "name": "css", + "path": "", + "baseName": "styles", + "rel": "stylesheet", + "protocol": "", + "isPlainText": true, + "isHTML": false, + "noUgly": false, + "notAlternative": true, + "permalinkable": false, + "weight": 0 + }, + "csv": { + "mediaType": "text/csv", + "name": "csv", + "path": "", + "baseName": "index", + "rel": "alternate", + "protocol": "", + "isPlainText": true, + "isHTML": false, + "noUgly": false, + "notAlternative": false, + "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": "", + "baseName": "index", + "rel": "alternate", + "protocol": "", + "isPlainText": true, + "isHTML": false, + "noUgly": false, + "notAlternative": false, + "permalinkable": false, + "weight": 0 + }, + "markdown": { + "mediaType": "text/markdown", + "name": "markdown", + "path": "", + "baseName": "index", + "rel": "alternate", + "protocol": "", + "isPlainText": true, + "isHTML": false, + "noUgly": false, + "notAlternative": false, + "permalinkable": false, + "weight": 0 + }, + "robots": { + "mediaType": "text/plain", + "name": "robots", + "path": "", + "baseName": "robots", + "rel": "alternate", + "protocol": "", + "isPlainText": true, + "isHTML": false, + "noUgly": false, + "notAlternative": false, + "permalinkable": false, + "weight": 0 + }, + "rss": { + "mediaType": "application/rss+xml", + "name": "rss", + "path": "", + "baseName": "index", + "rel": "alternate", + "protocol": "", + "isPlainText": false, + "isHTML": false, + "noUgly": true, + "notAlternative": false, + "permalinkable": false, + "weight": 0 }, "sitemap": { - "_merge": "none" + "mediaType": "application/xml", + "name": "sitemap", + "path": "", + "baseName": "sitemap", + "rel": "sitemap", + "protocol": "", + "isPlainText": false, + "isHTML": false, + "noUgly": true, + "notAlternative": false, + "permalinkable": false, + "weight": 0 }, - "taxonomies": { - "_merge": "none" + "webappmanifest": { + "mediaType": "application/manifest+json", + "name": "webappmanifest", + "path": "", + "baseName": "manifest", + "rel": "manifest", + "protocol": "", + "isPlainText": true, + "isHTML": false, + "noUgly": false, + "notAlternative": true, + "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, @@ -1782,572 +2375,237 @@ } } }, + "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": { - "enableInlineShortcodes": false, "exec": { "allow": [ - "^(dart-)?sass(-embedded)?$", - "^go$", - "^npx$", - "^postcss$" + "^((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)$" + "(?i)^(PATH|PATHEXT|APPDATA|HOME|TMP|TEMP|TERM)$" ] }, "funcs": { "getenv": [ - "^HUGO_", - "^CI$" + "^(HUGO_|REPOSITORY_URL|^BRANCH$)" ] }, - "goTemplates": { - "AllowActionJSTmpl": false - }, "http": { - "mediaTypes": null, + "urls": [ + ".*" + ], "methods": [ "(?i)GET|POST" ], - "urls": [ - ".*" - ] + "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" } } }, - "media": { - "types": [ - { - "mainType": "application", - "subType": "json", - "delimiter": ".", - "type": "application/json", - "string": "application/json", - "suffixes": [ - "json" - ] - }, - { - "mainType": "application", - "subType": "manifest", - "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": [ - "" - ] - }, - { - "mainType": "application", - "subType": "pdf", - "delimiter": ".", - "type": "application/pdf", - "string": "application/pdf", - "suffixes": [ - "pdf" - ] - }, - { - "mainType": "application", - "subType": "rss", - "delimiter": ".", - "type": "application/rss+xml", - "string": "application/rss+xml", - "suffixes": [ - "xml", - "rss" - ] - }, - { - "mainType": "application", - "subType": "toml", - "delimiter": ".", - "type": "application/toml", - "string": "application/toml", - "suffixes": [ - "toml" - ] - }, - { - "mainType": "application", - "subType": "wasm", - "delimiter": ".", - "type": "application/wasm", - "string": "application/wasm", - "suffixes": [ - "wasm" - ] - }, - { - "mainType": "application", - "subType": "xml", - "delimiter": ".", - "type": "application/xml", - "string": "application/xml", - "suffixes": [ - "xml" - ] - }, - { - "mainType": "application", - "subType": "yaml", - "delimiter": ".", - "type": "application/yaml", - "string": "application/yaml", - "suffixes": [ - "yaml", - "yml" - ] - }, - { - "mainType": "font", - "subType": "otf", - "delimiter": ".", - "type": "font/otf", - "string": "font/otf", - "suffixes": [ - "otf" - ] - }, - { - "mainType": "font", - "subType": "ttf", - "delimiter": ".", - "type": "font/ttf", - "string": "font/ttf", - "suffixes": [ - "ttf" - ] - }, - { - "mainType": "image", - "subType": "bmp", - "delimiter": ".", - "type": "image/bmp", - "string": "image/bmp", - "suffixes": [ - "bmp" - ] - }, - { - "mainType": "image", - "subType": "gif", - "delimiter": ".", - "type": "image/gif", - "string": "image/gif", - "suffixes": [ - "gif" - ] - }, - { - "mainType": "image", - "subType": "jpeg", - "delimiter": ".", - "type": "image/jpeg", - "string": "image/jpeg", - "suffixes": [ - "jpg", - "jpeg", - "jpe", - "jif", - "jfif" - ] - }, - { - "mainType": "image", - "subType": "png", - "delimiter": ".", - "type": "image/png", - "string": "image/png", - "suffixes": [ - "png" - ] - }, - { - "mainType": "image", - "subType": "svg", - "delimiter": ".", - "type": "image/svg+xml", - "string": "image/svg+xml", - "suffixes": [ - "svg" - ] - }, - { - "mainType": "image", - "subType": "tiff", - "delimiter": ".", - "type": "image/tiff", - "string": "image/tiff", - "suffixes": [ - "tif", - "tiff" - ] - }, - { - "mainType": "image", - "subType": "webp", - "delimiter": ".", - "type": "image/webp", - "string": "image/webp", - "suffixes": [ - "webp" - ] - }, - { - "mainType": "text", - "subType": "calendar", - "delimiter": ".", - "type": "text/calendar", - "string": "text/calendar", - "suffixes": [ - "ics" - ] - }, - { - "mainType": "text", - "subType": "css", - "delimiter": ".", - "type": "text/css", - "string": "text/css", - "suffixes": [ - "css" - ] - }, - { - "mainType": "text", - "subType": "csv", - "delimiter": ".", - "type": "text/csv", - "string": "text/csv", - "suffixes": [ - "csv" - ] - }, - { - "mainType": "text", - "subType": "html", - "delimiter": ".", - "type": "text/html", - "string": "text/html", - "suffixes": [ - "html" - ] - }, - { - "mainType": "text", - "subType": "javascript", - "delimiter": ".", - "type": "text/javascript", - "string": "text/javascript", - "suffixes": [ - "js", - "jsm", - "mjs" - ] - }, - { - "mainType": "text", - "subType": "jsx", - "delimiter": ".", - "type": "text/jsx", - "string": "text/jsx", - "suffixes": [ - "jsx" - ] - }, - { - "mainType": "text", - "subType": "markdown", - "delimiter": ".", - "type": "text/markdown", - "string": "text/markdown", - "suffixes": [ - "md", - "markdown" - ] - }, - { - "mainType": "text", - "subType": "plain", - "delimiter": ".", - "type": "text/plain", - "string": "text/plain", - "suffixes": [ - "txt" - ] - }, - { - "mainType": "text", - "subType": "tsx", - "delimiter": ".", - "type": "text/tsx", - "string": "text/tsx", - "suffixes": [ - "tsx" - ] - }, - { - "mainType": "text", - "subType": "typescript", - "delimiter": ".", - "type": "text/typescript", - "string": "text/typescript", - "suffixes": [ - "ts" - ] - }, - { - "mainType": "text", - "subType": "x-sass", - "delimiter": ".", - "type": "text/x-sass", - "string": "text/x-sass", - "suffixes": [ - "sass" - ] - }, - { - "mainType": "text", - "subType": "x-scss", - "delimiter": ".", - "type": "text/x-scss", - "string": "text/x-scss", - "suffixes": [ - "scss" - ] - }, - { - "mainType": "video", - "subType": "3gpp", - "delimiter": ".", - "type": "video/3gpp", - "string": "video/3gpp", - "suffixes": [ - "3gpp", - "3gp" - ] - }, - { - "mainType": "video", - "subType": "mp4", - "delimiter": ".", - "type": "video/mp4", - "string": "video/mp4", - "suffixes": [ - "mp4" - ] - }, - { - "mainType": "video", - "subType": "mpeg", - "delimiter": ".", - "type": "video/mpeg", - "string": "video/mpeg", - "suffixes": [ - "mpg", - "mpeg" - ] - }, - { - "mainType": "video", - "subType": "ogg", - "delimiter": ".", - "type": "video/ogg", - "string": "video/ogg", - "suffixes": [ - "ogv" - ] - }, - { - "mainType": "video", - "subType": "webm", - "delimiter": ".", - "type": "video/webm", - "string": "video/webm", - "suffixes": [ - "webm" - ] - }, - { - "mainType": "video", - "subType": "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 - }, - { - "mediaType": "text/html", - "name": "amp", - "path": "amp", - "baseName": "index", - "rel": "amphtml", - "protocol": "", - "isPlainText": false, - "isHTML": true, - "noUgly": false, - "notAlternative": false, - "permalinkable": true, - "weight": 0 - }, - { - "mediaType": "text/calendar", - "name": "calendar", - "path": "", - "baseName": "index", - "rel": "alternate", - "protocol": "webcal://", - "isPlainText": true, - "isHTML": false, - "noUgly": false, - "notAlternative": false, - "permalinkable": false, - "weight": 0 - }, - { - "mediaType": "text/css", - "name": "css", - "path": "", - "baseName": "styles", - "rel": "stylesheet", - "protocol": "", - "isPlainText": true, - "isHTML": false, - "noUgly": false, - "notAlternative": true, - "permalinkable": false, - "weight": 0 - }, - { - "mediaType": "text/csv", - "name": "csv", - "path": "", - "baseName": "index", - "rel": "alternate", - "protocol": "", - "isPlainText": true, - "isHTML": false, - "noUgly": false, - "notAlternative": false, - "permalinkable": false, - "weight": 0 - }, - { - "mediaType": "application/json", - "name": "json", - "path": "", - "baseName": "index", - "rel": "alternate", - "protocol": "", - "isPlainText": true, - "isHTML": false, - "noUgly": false, - "notAlternative": false, - "permalinkable": false, - "weight": 0 - }, - { - "mediaType": "text/markdown", - "name": "markdown", - "path": "", - "baseName": "index", - "rel": "alternate", - "protocol": "", - "isPlainText": true, - "isHTML": false, - "noUgly": false, - "notAlternative": false, - "permalinkable": false, - "weight": 0 - }, - { - "mediaType": "text/plain", - "name": "robots", - "path": "", - "baseName": "robots", - "rel": "alternate", - "protocol": "", - "isPlainText": true, - "isHTML": false, - "noUgly": false, - "notAlternative": false, - "permalinkable": false, - "weight": 0 - }, - { - "mediaType": "application/rss+xml", - "name": "rss", - "path": "", - "baseName": "index", - "rel": "alternate", - "protocol": "", - "isPlainText": false, - "isHTML": false, - "noUgly": true, - "notAlternative": false, - "permalinkable": false, - "weight": 0 - }, - { - "mediaType": "application/xml", - "name": "sitemap", - "path": "", - "baseName": "sitemap", - "rel": "sitemap", - "protocol": "", - "isPlainText": false, - "isHTML": false, - "noUgly": true, - "notAlternative": false, - "permalinkable": false, - "weight": 0 - }, - { - "mediaType": "application/manifest+json", - "name": "webappmanifest", - "path": "", - "baseName": "manifest", - "rel": "manifest", - "protocol": "", - "isPlainText": true, - "isHTML": false, - "noUgly": false, - "notAlternative": true, - "permalinkable": false, - "weight": 0 - } - ], "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 2035c058b..f78bbd08f 100644 --- a/docs/layouts/maintenance/list.html +++ b/docs/layouts/maintenance/list.html @@ -1,68 +1,78 @@ {{ define "main" }} -
+
- -
- {{ $byLastMod := .Site.RegularPages.ByLastmod }} - {{ $recent := ($byLastMod | last 30).Reverse }} - {{ $leastRecent := $byLastMod | first 10 }} -

Last Updated

- {{ partial "maintenance-pages-table.html" $recent }} -

Least Recently Updated

- {{ partial "maintenance-pages-table.html" $leastRecent }} + +
+ {{ $byLastMod := .Site.RegularPages.ByLastmod }} + {{ $recent := ($byLastMod | last 30).Reverse }} + {{ $leastRecent := $byLastMod | first 10 }} +

Last Updated

+ {{ partial "maintenance-pages-table.html" $recent }} +

Least Recently Updated

+ {{ 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 }} + {{/* 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 }} +

Pages marked with TODO

+ {{ partial "maintenance-pages-table.html" (.Scratch.Get "todos") }} + + +

Dependencies

+ + + + + + + + + + + + + {{ range $index, $element := hugo.Deps }} + + + + + + + + {{ end }} -

Pages marked with TODO

- {{ partial "maintenance-pages-table.html" (.Scratch.Get "todos") }} - -

Dependencies

-
#OwnerPathVersionTimeVendor
{{ add $index 1 }} + {{ with $element.Owner }}{{ .Path }}{{ end }} + + {{ $element.Path }} + {{ with $element.Replace }} + => + {{ .Path }} + {{ end }} + {{ $element.Version }} + {{ with $element.Time }}{{ . }}{{ end }} + {{ $element.Vendor }}
- - - - - - - - - - - - {{ range $index, $element := hugo.Deps }} - - - - - - - - - {{ end }} - -
#OwnerPathVersionTimeVendor
{{ add $index 1 }}{{ with $element.Owner }}{{.Path }}{{ end }} - {{ $element.Path }} - {{ with $element.Replace}} - => {{ .Path }} - {{ end }} - {{ $element.Version }}{{ with $element.Time }}{{ . }}{{ end }}{{ $element.Vendor }}
- -
+ + +
-
-{{ end }} \ No newline at end of file +
+{{ end }} diff --git a/docs/layouts/shortcodes/code-toggle.html b/docs/layouts/shortcodes/code-toggle.html index 3b151669f..6e0e3d73e 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 @@ Renders syntax-highlighted configuration data in JSON, TOML, and YAML formats. {{- /* 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 @@ Renders syntax-highlighted configuration data in JSON, TOML, and YAML formats. {{- /* 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 @@ Renders syntax-highlighted configuration data in JSON, TOML, and YAML formats. {{- end }} {{- range $langs }} -   @@ -70,7 +78,9 @@ Renders syntax-highlighted configuration data in JSON, TOML, and YAML formats.
{{- range $langs }} -
+
{{- $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 @@ Renders syntax-highlighted configuration data in JSON, TOML, and YAML formats. {{ highlight $hCode . "" | replaceRE $placeHolder (index $delimiters .) | safeHTML }}
{{- if $copy }} - + {{- /* 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 4e2814f5a..12054f89d 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 }} + - - {{ range $fields }} - - {{ end }} - - {{ range $list }} - - {{ range $k, $v := . }} - {{ $.Scratch.Set $k $v }} - {{ end }} - {{ range $fields }} - - {{ end }} - - {{ end }} + + {{ range $fields }} + {{ $s := . }} + {{ if eq $s "_key" }} + {{ $s = "Type" }} + {{ end }} + + {{ end }} + + {{ range $k1, $v1 := $list }} + + {{ range $k2, $v2 := . }} + {{ $.Scratch.Set $k2 $v2 }} + {{ end }} + {{ range $fields }} + {{ $s := "" }} + {{ if eq . "_key" }} + {{ $s = $k1 }} + {{ else }} + {{ $s = $.Scratch.Get . }} + {{ end }} + + {{ end }} + + {{ end }}
{{ . }}
{{ $.Scratch.Get . }}
{{ $s }}
{{ $s }}
diff --git a/docshelper/docs.go b/docshelper/docs.go index 1e1594120..b138ff81e 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 0793669a7..0350a78a2 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 d37c08eb3..000000000 --- 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 58271362d..8ebcaa5c9 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 1275c5979..0436a10be 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(), }, }