From 5ee96971ad1532a8a54c1e63a159a067010b9e7e Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Tue, 14 May 2024 06:40:17 -0700 Subject: [PATCH] Document content adapters --- .cspell.json | 3 + .../examples/zion-national-park-grayscale.jpg | Bin 42537 -> 0 bytes .../en/content-management/content-adapters.md | 339 ++++++++++++++++++ content/en/content-management/formats.md | 18 +- content/en/content-management/front-matter.md | 2 +- content/en/getting-started/glossary.md | 4 + content/en/methods/page/File.md | 15 + content/en/methods/page/RenderString.md | 2 +- 8 files changed, 372 insertions(+), 11 deletions(-) delete mode 100644 assets/images/examples/zion-national-park-grayscale.jpg create mode 100644 content/en/content-management/content-adapters.md diff --git a/.cspell.json b/.cspell.json index 755c77b88..62c2576e3 100644 --- a/.cspell.json +++ b/.cspell.json @@ -114,6 +114,7 @@ "# ----------------------------------------------------------------------", "# cspell: ignore names", "# ----------------------------------------------------------------------", + "Atishay", "Eliott", "Furet", "Gregor", @@ -132,6 +133,7 @@ "cifs", "corejs", "disqus", + "docutils", "dpkg", "doas", "eopkg", @@ -161,6 +163,7 @@ "rsmith", "tdewolff", "tjones", + "wcag", "xfeff" ] } diff --git a/assets/images/examples/zion-national-park-grayscale.jpg b/assets/images/examples/zion-national-park-grayscale.jpg deleted file mode 100644 index 908bd88c6b95706cb4d77cf14628821e034536d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42537 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 F{U6E1vTpzY diff --git a/content/en/content-management/content-adapters.md b/content/en/content-management/content-adapters.md new file mode 100644 index 000000000..42285b7a5 --- /dev/null +++ b/content/en/content-management/content-adapters.md @@ -0,0 +1,339 @@ +--- +title: Content adapters +description: Create content adapters to dynamically add content when building your site. +categories: [content management] +keywords: [] +menu: + docs: + parent: content-management + weight: 280 +weight: 280 +toc: true +--- + +{{< new-in 0.126.0 >}} + +## Overview + +A content adapter is a template that dynamically creates pages when building a site. For example, use a content adapter to create pages from a remote data source such as JSON, TOML, YAML, or XML. + +Unlike templates that reside in the layouts directory, content adapters reside in the content directory, no more than one per directory per language. When a content adapter creates a page, the page's [logical path] will be relative to the content adapter. + +```text +content/ +├── articles/ +│ ├── _index.md +│ ├── article-1.md +│ └── article-2.md +├── books/ +│ ├── _content.gotmpl <-- content adapter +│ └── _index.md +└── films/ + ├── _content.gotmpl <-- content adapter + └── _index.md +``` + +Each content adapter is named _content.gotmpl and uses the same [syntax] as templates in the layouts directory. You can use any of the [template functions] within a content adapter, as well as the methods described below. + +## Methods + +Use these methods within a content adapter. + +###### AddPage + +Adds a page to the site. + +{{< code file=content/books/_content.gotmpl >}} +{{ $content := dict + "mediaType" "text/markdown" + "value" "The _Hunchback of Notre Dame_ was written by Victor Hugo." +}} +{{ $page := dict + "content" $content + "kind" "page" + "path" "the-hunchback-of-notre-dame" + "title" "The Hunchback of Notre Dame" +}} +{{ .AddPage $page }} +{{< /code >}} + +###### AddResource + +Adds a page resource to the site. + +{{< code file=content/books/_content.gotmpl >}} +{{ with resources.Get "images/a.jpg" }} + {{ $content := dict + "mediaType" .MediaType.Type + "value" . + }} + {{ $resource := dict + "content" $content + "path" "the-hunchback-of-notre-dame/cover.jpg" + }} + {{ $.AddResource $resource }} +{{ end }} +{{< /code >}} + +Then retrieve the new page resource with something like: + +{{< code file=layouts/_default/single.html >}} +{{ with .Resources.Get "cover.jpg" }} + +{{ end }} +{{< /code >}} + +###### Site + +Returns the `Site` to which the pages will be added. + +{{< code file=content/books/_content.gotmpl >}} +{{ .Site.Title }} +{{< /code >}} + +###### Store + +Creates a persistent “scratch pad” to store and manipulate data. See [examples](/methods/page/store/). + +{{< code file=content/books/_content.gotmpl >}} +{{ .Store.Set "key" "value" }} +{{ .Store.Get "key" }} +{{< /code >}} + +###### EnableAllLanguages + +By default, Hugo executes the content adapter for the language defined by the _content.gotmpl file . Use this method to activate the content adapter for all languages. + +{{< code file=content/books/_content.gotmpl >}} +{{ .EnableAllLanguages }} +{{ $content := dict + "mediaType" "text/markdown" + "value" "The _Hunchback of Notre Dame_ was written by Victor Hugo." +}} +{{ $page := dict + "content" $content + "kind" "page" + "path" "the-hunchback-of-notre-dame" + "title" "The Hunchback of Notre Dame" +}} +{{ .AddPage $page }} +{{< /code >}} + +## Page map + +Set any [front matter field] in the map passed to the [`AddPage`](#addpage) method, excluding `markup`. Instead of setting the `markup` field, specify the `content.mediaType` as described below. + +This table describes the fields most commonly passed to the `AddPage` method. + +Key|Descripion|Required +:--|:--|:-: +`content.mediaType`|The content [media type]. Default is `text/markdown`. See [content formats] for examples.|  +`content.value`|The content value as a string.|  +`dates.date`|The page creation date as a `time.Time` value.|  +`dates.expiryDate`|The page expiry date as a `time.Time` value.|  +`dates.lastmod`|The page last modification date as a `time.Time` value.|  +`dates.publishDate`|The page publication date as a `time.Time` value.|  +`kind`|The [page kind]. Default is `page`.|  +`params`|A map of page parameters.|  +`path`|The page's [logical path] relative to the content adapter. Do not include a leading slash.|:heavy_check_mark: +`title`|The page title.|  + +{{% note %}} +While `path` is the only required field, we recommend setting `title` as well. + +When setting the `path`, Hugo transforms the given string to a logical path. For example, setting `path` to `A B C` produces a logical path of `/section/a-b-c`. +{{% /note %}} + +## Resource map + +Construct the map passed to the [`AddResource`](#addresource) method using the fields below. + +Key|Descripion|Required +:--|:--|:-: +`content.mediaType`|The content [media type].|:heavy_check_mark: +`content.value`|The content value as a string or resource.|:heavy_check_mark: +`name`|The resource name.|  +`params`|A map of resource parameters.|  +`path`|The resources's [logical path] relative to the content adapter. Do not include a leading slash.|:heavy_check_mark: +`title`|The resource title.|  + +{{% note %}} +If the `content.value` is a string Hugo creates a new resource. If the `content.value` is a resource, Hugo obtains the value from the existing resource. + +When setting the `path`, Hugo transforms the given string to a logical path. For example, setting `path` to `A B C/cover.jpg` produces a logical path of `/section/a-b-c/cover.jpg`. +{{% /note %}} + +## Example + +Create pages from remote data, where each page represents a book review. + +Step 1 +: Create the content structure. + +```text +content/ +└── books/ + ├── _content.gotmpl <-- content adapter + └── _index.md +``` + +Step 2 +: Inspect the remote data to determine how to map key-value pairs to front matter fields. + +: + +Step 3 +: Create the content adapter. + +{{< code file=content/books/_content.gotmpl copy=true >}} +{{/* Get remote data. */}} +{{ $data := dict }} +{{ $url := "https://gohugo.io/shared/examples/data/books.json" }} +{{ with resources.GetRemote $url }} + {{ with .Err }} + {{ errorf "Unable to get remote resource %s: %s" $url . }} + {{ else }} + {{ $data = . | transform.Unmarshal }} + {{ end }} +{{ else }} + {{ errorf "Unable to get remote resource %s" $url }} +{{ end }} + +{{/* Add pages and page resources. */}} +{{ range $data }} + + {{/* Add page. */}} + {{ $content := dict "mediaType" "text/markdown" "value" .summary }} + {{ $dates := dict "date" (time.AsTime .date) }} + {{ $params := dict "author" .author "isbn" .isbn "rating" .rating "tags" .tags }} + {{ $page := dict + "content" $content + "dates" $dates + "kind" "page" + "params" $params + "path" .title + "title" .title + }} + {{ $.AddPage $page }} + + {{/* Add page resource. */}} + {{ $item := . }} + {{ with $url := $item.cover }} + {{ with resources.GetRemote $url }} + {{ with .Err }} + {{ errorf "Unable to get remote resource %s: %s" $url . }} + {{ else }} + {{ $content := dict "mediaType" .MediaType.Type "value" .Content }} + {{ $params := dict "alt" $item.title }} + {{ $resource := dict + "content" $content + "params" $params + "path" (printf "%s/cover.%s" $item.title .MediaType.SubType) + }} + {{ $.AddResource $resource }} + {{ end }} + {{ else }} + {{ errorf "Unable to get remote resource %s" $url }} + {{ end }} + {{ end }} + +{{ end }} +{{< /code >}} + +Step 4 +: Create a single page template to render each book review. + +{{< code file=layouts/books/single.html copy=true >}} +{{ define "main" }} +

{{ .Title }}

+ + {{ with .Resources.GetMatch "cover.*" }} + {{ .Params.alt }} + {{ end }} + +

Author: {{ .Params.author }}

+ +

+ ISBN: {{ .Params.isbn }}
+ Rating: {{ .Params.rating }}
+ Review date: {{ .Date | time.Format ":date_long" }} +

+ + {{ with .GetTerms "tags" }} +

Tags:

+ + {{ end }} + + {{ .Content }} +{{ end }} +{{< /code >}} + +## Multilingual sites + +With multilingual sites you can: + +1. Create one content adapter for all languages using the [`EnableAllLanguages`](#enablealllanguages) method as described above. +2. Create content adapters unique to each language. See the examples below. + +### Translations by file name + +With this site configuration: + +{{< code-toggle file=hugo >}} +[languages.en] +weight = 1 + +[languages.de] +weight = 2 +{{< /code-toggle >}} + +Include a language designator in the content adapter's file name. + +```text +content/ +└── books/ + ├── _content.de.gotmpl + ├── _content.en.gotmpl + ├── _index.de.md + └── _index.en.md +``` + +### Translations by content directory + +With this site configuration: + +{{< code-toggle file=hugo >}} +[languages.en] +contentDir = 'content/en' +weight = 1 + +[languages.de] +contentDir = 'content/de' +weight = 2 +{{< /code-toggle >}} + +Create a single content adapter in each directory: + +```text +content/ +├── de/ +│ └── books/ +│ ├── _content.gotmpl +│ └── _index.md +└── en/ + └── books/ + ├── _content.gotmpl + └── _index.md +``` + +[content formats]: /content-management/formats/#classification +[front matter field]: /content-management/front-matter/#fields +[logical path]: /getting-started/glossary/#logical-path +[media type]: https://en.wikipedia.org/wiki/Media_type +[page kind]: /getting-started/glossary/#page-kind +[syntax]: /templates/introduction/ +[template functions]: /functions/ diff --git a/content/en/content-management/formats.md b/content/en/content-management/formats.md index 305679b21..7b141593c 100644 --- a/content/en/content-management/formats.md +++ b/content/en/content-management/formats.md @@ -29,7 +29,7 @@ content/ Regardless of content format, all content must have [front matter], preferably including both `title` and `date`. -Hugo selects the content renderer based on the `markup` identifier in front matter, falling back to the file extension. See the [comparison table](#comparison) table below for a list of markup identifiers and recognized file extensions. +Hugo selects the content renderer based on the `markup` identifier in front matter, falling back to the file extension. See the [classification](#classification) table below for a list of markup identifiers and recognized file extensions. ## Formats @@ -99,16 +99,16 @@ Hugo passes these CLI flags when calling the rst2html executable: --leave-comments --initial-header-level=2 ``` -## Comparison +## Classification -Content format|Identifier|Identifier aliases|File extensions +Content format|Media type|Identifier|File extensions :--|:--|:--|:-- -Markdown|`goldmark`|`md`, `mdown`, `markdown`|`md`, `mdown`, `markdown` -HTML|`html`|`htm`|`html`, `htm` -Emacs Org Mode|`org`||`org` -AsciiDoc|`asciidocext`|`adoc`, `ad`|`adoc`, `ad` -Pandoc|`pandoc`|`pdc`|`pandoc`, `pdc` -reStructuredText|`rst`||`rst` +Markdown|`text/markdown`|`markdown`|`markdown`,`md`, `mdown` +HTML|`text/html`|`html`|`htm`, `html` +Emacs Org Mode|`text/org`|`org`|`org` +AsciiDoc|`text/asciidoc`|`asciidoc`|`ad`, `adoc`, `asciidoc` +Pandoc|`text/pandoc`|`pandoc`|`pandoc`, `pdc` +reStructuredText|`text/rst`|`rst`|`rst` When converting content to HTML, Hugo uses: diff --git a/content/en/content-management/front-matter.md b/content/en/content-management/front-matter.md index 8ea41487d..2c01f7854 100644 --- a/content/en/content-management/front-matter.md +++ b/content/en/content-management/front-matter.md @@ -163,7 +163,7 @@ lang (`string`) An identifier corresponding to one of the supported [content formats]. If not provided, Hugo determines the content renderer based on the file extension. -[content formats]: /content-management/formats/#comparison +[content formats]: /content-management/formats/#classification ###### menus diff --git a/content/en/getting-started/glossary.md b/content/en/getting-started/glossary.md index e31f45187..bbc35906e 100644 --- a/content/en/getting-started/glossary.md +++ b/content/en/getting-started/glossary.md @@ -90,6 +90,10 @@ Command line interface. An [array](#array), [slice](#slice), or [map](#map). +###### content adapter + +A template that dynamically creates pages when building a site. For example, use a content adapter to create pages from a remote data source such as JSON, TOML, YAML, or XML. See [details](/content-management/content-adapters/). + ###### content format A markup language for creating content. Typically Markdown, but may also be HTML, AsciiDoc, Org, Pandoc, or reStructuredText. See [details](/content-management/formats/). diff --git a/content/en/methods/page/File.md b/content/en/methods/page/File.md index 310404cb8..d59171577 100644 --- a/content/en/methods/page/File.md +++ b/content/en/methods/page/File.md @@ -82,6 +82,20 @@ The path separators (slash or backslash) in `Path`, `Dir`, and `Filename` depend {{ end }} ``` +###### IsContentAdapter + +{{< new-in 0.126.0 >}} + +(`bool`) Reports whether the file is a [content adapter]. + +[content adapter]: /content-management/content-adapters/ + +```go-html-template +{{ with .File }} + {{ .IsContentAdapter }} +{{ end }} +``` + ###### LogicalName (`string`) The file name. @@ -159,6 +173,7 @@ ContentBaseName|a|b|news Dir|news/|news/b/|news/ Ext|md|md|md Filename|/home/user/...|/home/user/...|/home/user/... +IsContentAdapter|false|false|false LogicalName|a.en.md|index.en.md|_index.en.md Path|news/a.en.md|news/b/index.en.md|news/_index.en.md Section|news|news|news diff --git a/content/en/methods/page/RenderString.md b/content/en/methods/page/RenderString.md index 0f2df111f..1a92c78c6 100644 --- a/content/en/methods/page/RenderString.md +++ b/content/en/methods/page/RenderString.md @@ -47,5 +47,5 @@ Render with [Pandoc]: {{ .RenderString $opts $s }} →

H2O

``` -[markup identifier]: /content-management/formats/#formats +[markup identifier]: /content-management/formats/#classification [pandoc]: https://www.pandoc.org/