<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Hugo on Nelson Figueroa</title>
    <link>https://nelson.cloud/categories/hugo/</link>
    <description>Recent content in Hugo on Nelson Figueroa</description>
    <image>
      <title>Nelson Figueroa</title>
      <url>https://nelson.cloud/opengraph-images/default.png</url>
      <link>https://nelson.cloud/opengraph-images/default.png</link>
    </image>
    <language>en</language>
    <lastBuildDate>Sun, 19 Apr 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://nelson.cloud/categories/hugo/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>How to Install a Specific Version of a Homebrew Package with brew extract</title>
      <link>https://nelson.cloud/how-to-install-a-specific-version-of-a-homebrew-package-with-brew-extract/?ref=rss</link>
      <pubDate>Sun, 19 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://nelson.cloud/how-to-install-a-specific-version-of-a-homebrew-package-with-brew-extract/?ref=rss</guid>
      <description>Use &lt;code&gt;brew extract&lt;/code&gt; to install a specific version of a homebrew package.</description><content:encoded><![CDATA[<p>I previously wrote about 

<a href="https://nelson.cloud/how-to-install-older-versions-of-homebrew-packages/">how to install older versions of homebrew packages</a>. That method involves installing a package from a Ruby file but it&rsquo;s outdated and doesn&rsquo;t always work. There&rsquo;s a better way with <code>brew extract</code>, although it still comes with caveats.</p>
<p>I&rsquo;ll be using <code>hugo</code> as an example. Let&rsquo;s say I wanted to install v0.145.0 because v0.146.0 introduced breaking changes that broke my theme.</p>
<blockquote><p><strong>tl;dr:</strong></p><p>To install hugo v0.145.0:</p>
<ul>
<li>Create a local tap with <code>brew tap-new $USER/local</code></li>
<li>Tap homebrew/core which is a 1.3GB clone at the time of writing</li>
<li>Extract the formula with <code>brew extract</code></li>
<li>Patch the <code>hugo</code> formula. This isn&rsquo;t needed for every formula.</li>
<li>Install as usual</li>
</ul></blockquote>

<p>Note that this process will point your <code>hugo</code> command to the older version, but you can switch between versions with <code>brew link</code>.</p>
<h2 id="create-a-local-tap">Create a local tap</h2>
<p>Run <code>brew tap-new $USER/local</code></p>
<pre tabindex="0"><code>$ brew tap-new $USER/local

Initialized empty Git repository in /opt/homebrew/Library/Taps/nelson/homebrew-local/.git/
[main (root-commit) 6af371f] Create nelson/local tap
 3 files changed, 111 insertions(+)
 create mode 100644 .github/workflows/publish.yml
 create mode 100644 .github/workflows/tests.yml
 create mode 100644 README.md
==&gt; Created nelson/local
/opt/homebrew/Library/Taps/nelson/homebrew-local

When a pull request making changes to a formula (or formulae) becomes green
(all checks passed), then you can publish the built bottles.
To do so, label your PR as `pr-pull` and the workflow will be triggered.
</code></pre><p>It will enable developer mode. This is normal and safe.</p>
<h2 id="tap-homebrewcore">Tap homebrew/core</h2>
<p>Next, run <code>brew tap --force homebrew/core</code>. At the time of writing, it&rsquo;s a 1.3GB download. This is necessary to get this working because Homebrew no longer keeps 

<a href="https://github.com/homebrew/homebrew-core" target="_blank" rel="noopener">homebrew-core</a> cloned locally. The <code>brew extract</code> command needs the full git history to search for older versions.</p>
<pre tabindex="0"><code>$ brew tap --force homebrew/core

✔︎ JSON API formula.jws.json                                                                                                                                    Downloaded   32.0MB/ 32.0MB
✔︎ JSON API cask.jws.json                                                                                                                                       Downloaded   15.4MB/ 15.4MB
==&gt; Tapping homebrew/core
Cloning into &#39;/opt/homebrew/Library/Taps/homebrew/homebrew-core&#39;...
remote: Enumerating objects: 3385552, done.
remote: Counting objects: 100% (544/544), done.
remote: Compressing objects: 100% (119/119), done.
remote: Total 3385552 (delta 497), reused 427 (delta 425), pack-reused 3385008 (from 4)
Receiving objects: 100% (3385552/3385552), 1.08 GiB | 48.36 MiB/s, done.
Resolving deltas: 100% (2612327/2612327), done.
Tapped 5 commands and 8313 formulae (8,851 files, 1.3GB).
</code></pre><h2 id="extract-the-desired-version">Extract the desired version</h2>
<p>Now we can use <code>brew extract</code>. This command will find a commit where the formula was at the version we want and copy that locally as <code>&lt;package&gt;@&lt;version&gt;.rb</code>.</p>
<p>In this case we want Hugo v0.145.0, so we run <code>brew extract --version=0.145.0 hugo $USER/local</code>:</p>
<pre tabindex="0"><code>$ brew extract --version=0.145.0 hugo $USER/local

==&gt; Searching repository history
==&gt; Writing formula for hugo at 0.145.0 from revision a110fdb to:
/opt/homebrew/Library/Taps/nelson/homebrew-local/Formula/hugo@0.145.0.rb
</code></pre><h2 id="patch-the-formula">Patch the formula</h2>
<p>This isn&rsquo;t needed for every formula and is something I ran into specifically with Hugo. Without this patch, you&rsquo;ll run into errors.</p>
<p>After running <code>brew extract</code>, edit the file: <code>/opt/homebrew/Library/Taps/$USER/homebrew-local/Formula/hugo@0.145.0.rb</code>.</p>
<p>Change this line:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="nb">system</span> <span class="s2">&#34;go&#34;</span><span class="p">,</span> <span class="s2">&#34;build&#34;</span><span class="p">,</span> <span class="o">*</span><span class="n">std_go_args</span><span class="p">(</span><span class="ss">ldflags</span><span class="p">:,</span> <span class="ss">tags</span><span class="p">:)</span>
</span></span></code></pre></td></tr></table>
</blockquote><p>To this:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="nb">system</span> <span class="s2">&#34;go&#34;</span><span class="p">,</span> <span class="s2">&#34;build&#34;</span><span class="p">,</span> <span class="o">*</span><span class="n">std_go_args</span><span class="p">(</span><span class="ss">output</span><span class="p">:</span> <span class="n">bin</span><span class="o">/</span><span class="s2">&#34;hugo&#34;</span><span class="p">,</span> <span class="ss">ldflags</span><span class="p">:,</span> <span class="ss">tags</span><span class="p">:)</span>
</span></span></code></pre></td></tr></table>
</blockquote><p>The reason we need to patch this file is because it prevents the error:</p>
<pre tabindex="0"><code>command not found: /opt/homebrew/Cellar/hugo@0.145.0/0.145.0/bin/hugo
</code></pre><p>It&rsquo;s a mismatch between the path Homebrew expects (<code>bin/hugo</code>) vs the path that is created when using <code>brew extract</code> on Hugo (<code>bin/hugo@0.145.0</code>).</p>
<h2 id="install-the-older-version">Install the older version</h2>
<p>Now that Hugo is extracted and patched, we can install with <code>brew install hugo@0.145.0</code>:</p>
<pre tabindex="0"><code>$ brew install hugo@0.145.0

✔︎ JSON API cask.jws.json
✔︎ JSON API formula.jws.json
==&gt; Fetching downloads for: hugo@0.145.0
✔︎ Formula hugo@0.145.0 (0.145.0)
==&gt; Installing hugo@0.145.0 from nelson/local
==&gt; go build -o=/opt/homebrew/Cellar/hugo@0.145.0/0.145.0/bin/hugo -tags=extended withdeploy -ldflags=-s -w -X github.com/gohugoio/hugo/common/hugo.commitHash=nelson -X github.com/gohugoio/hugo/common/
==&gt; /opt/homebrew/Cellar/hugo@0.145.0/0.145.0/bin/hugo gen man --dir /opt/homebrew/Cellar/hugo@0.145.0/0.145.0/share/man/man1
Warning: These files were overwritten during the `brew link` step:
/opt/homebrew/etc/bash_completion.d/hugo
.
.
.
/opt/homebrew/share/zsh/site-functions/_hugo

They have been backed up to: /Users/nelson/Library/Caches/Homebrew/Backup
==&gt; Summary
🍺  /opt/homebrew/Cellar/hugo@0.145.0/0.145.0: 53 files, 73MB, built in 8 seconds
==&gt; Running `brew cleanup hugo@0.145.0`...
Disable this behaviour by setting `HOMEBREW_NO_INSTALL_CLEANUP=1`.
Hide these hints with `HOMEBREW_NO_ENV_HINTS=1` (see `man brew`).
==&gt; Caveats
zsh completions have been installed to:
  /opt/homebrew/share/zsh/site-functions
</code></pre><p>Hugo v0.145.0 is now installed. There&rsquo;s a warning with long output in the previous example due to the normal Hugo package being already installed but that is expected. Homebrew is now pointing the <code>hugo</code> binary to v0.145.0 instead of the latest version (v0.160.1 at the time of writing). We can verify with <code>hugo version</code>:</p>
<pre tabindex="0"><code>$ hugo version

hugo v0.145.0+extended+withdeploy darwin/arm64 BuildDate=2025-02-26T15:41:25Z VendorInfo=brew
</code></pre><p>We can also see that Hugo v0.145.0 is installed along with the latest version with <code>brew list | grep hugo</code>:</p>
<pre tabindex="0"><code>$ brew list | grep hugo

hugo
hugo@0.145.0
</code></pre><h2 id="switching-between-versions-with-brew-link">Switching Between Versions with <code>brew link</code></h2>
<p>Currently the <code>hugo</code> command is pointing to v0.145.0. To have it point back to the regular version, run <code>brew unlink hugo &amp;&amp; brew link --overwrite hugo</code>:</p>
<pre tabindex="0"><code>$ brew unlink hugo &amp;&amp; brew link --overwrite hugo

Unlinking /opt/homebrew/Cellar/hugo/0.160.1... 2 symlinks removed.
Linking /opt/homebrew/Cellar/hugo/0.160.1... 49 symlinks created.
</code></pre><p>And if we want <code>hugo</code> to point back to the old version, run <code>brew unlink hugo@0.145.0 &amp;&amp; brew link --overwrite hugo@0.145.0</code></p>
<pre tabindex="0"><code>$ brew unlink hugo@0.145.0 &amp;&amp; brew link --overwrite hugo@0.145.0

Unlinking /opt/homebrew/Cellar/hugo@0.145.0/0.145.0... 1 symlinks removed.
Linking /opt/homebrew/Cellar/hugo@0.145.0/0.145.0... 48 symlinks created.
</code></pre><p>At first I expected <code>brew link --overwrite hugo</code> to work right off the bat, but running both <code>brew unlink</code> and <code>brew link --overwrite</code> is necessary to switch between versions properly. This is because homebrew tracks linked formulas and actual symlinks on disk separately. To help Homebrew track things properly we need to run both <code>brew unlink</code> to clean the records, then <code>brew link --overwrite</code> to write the new symlinks.</p>
<p>There&rsquo;s no need to use <code>brew pin</code> to prevent the older version of Hugo from updating. Since this is a local copy, there is no remote repository that would be updated that would in turn update our local version. You can even try running <code>brew update</code> to see the warning message:</p>
<pre tabindex="0"><code>$ brew update

==&gt; Updating Homebrew...
Warning: No remote &#39;origin&#39; in /opt/homebrew/Library/Taps/nelson/homebrew-local, skipping update!
Already up-to-date.
</code></pre><h2 id="removing-the-older-version">Removing the Older Version</h2>
<p>If you no longer need Hugo v0.145.0 you can run <code>brew uninstall hugo@0.145.0</code>:</p>
<pre tabindex="0"><code>$ brew uninstall hugo@0.145.0

Uninstalling /opt/homebrew/Cellar/hugo@0.145.0/0.145.0... (53 files, 73MB)
</code></pre><p>If you don&rsquo;t have any other packages you extracted with <code>brew extract</code>, you can also remove your local tap with <code>brew untap $USER/local</code></p>
<pre tabindex="0"><code>$ brew untap $USER/local

Untapping nelson/local...
Untapped 1 formula (34 files, 36.7KB).
</code></pre><p>Finally, if you don&rsquo;t plan on using <code>brew extract</code> again in the future, you can remove the local clone of homebrew-core with <code>brew untap homebrew/core</code>. This will clean up the 1.3GB of files that was downloaded:</p>
<pre tabindex="0"><code>$ brew untap homebrew/core

Untapping homebrew/core...
Untapped 5 commands and 8313 formulae (8,975 files, 1.3GB).
</code></pre><p>Then re-link <code>hugo</code> to the latest version with <code>brew unlink hugo &amp;&amp; brew link hugo</code>:</p>
<pre tabindex="0"><code>$ brew unlink hugo &amp;&amp; brew link hugo

Unlinking /opt/homebrew/Cellar/hugo/0.160.1... 2 symlinks removed.
Linking /opt/homebrew/Cellar/hugo/0.160.1... 49 symlinks created.
</code></pre><h2 id="references">References</h2>
<ul>
<li>

<a href="https://docs.brew.sh/Manpage" target="_blank" rel="noopener">https://docs.brew.sh/Manpage</a></li>
<li>

<a href="https://github.com/orgs/Homebrew/discussions/2941" target="_blank" rel="noopener">https://github.com/orgs/Homebrew/discussions/2941</a></li>
<li>

<a href="https://emmer.dev/blog/installing-old-homebrew-formula-versions/" target="_blank" rel="noopener">https://emmer.dev/blog/installing-old-homebrew-formula-versions/</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Proper Hugo Template Syntax Highlighting with go-html-template</title>
      <link>https://nelson.cloud/proper-hugo-template-syntax-highlighting-with-go-html-template/?ref=rss</link>
      <pubDate>Sun, 03 Aug 2025 00:00:00 +0000</pubDate>
      <guid>https://nelson.cloud/proper-hugo-template-syntax-highlighting-with-go-html-template/?ref=rss</guid>
      <description>Improve Hugo template code highlighting using go-html-template Markdown code blocks.</description><content:encoded><![CDATA[<p>I recently learned that you can highlight Hugo template code blocks by specifying <code>go-html-template</code> after the opening backticks.</p>
<p>So the opening backticks in a Markdown file look like this:</p>
<pre tabindex="0"><code>```go-html-template
</code></pre><p>It makes a huge difference when highlighting Hugo template code blocks. I was previously using <code>html</code> for syntax highlighting and it wasn&rsquo;t as good.</p>
<p>For example, here is some HTML + Hugo templating stuff being highlighted with <code>html</code>:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl">{{- define &#34;main&#34; }}
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">{{- if .Title }}
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">header</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;page-header&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">h1</span><span class="p">&gt;</span>{{ .Title }}<span class="p">&lt;/</span><span class="nt">h1</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    {{- if .Description }}
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;post-description&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        {{ .Description }}
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    {{- end }}
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">header</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">{{- end }}
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">ul</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;terms-tags&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    {{- $type := .Type }}
</span></span><span class="line"><span class="cl">    {{- range $key, $value := .Data.Terms.Alphabetical }}
</span></span><span class="line"><span class="cl">    {{- $name := .Name }}
</span></span><span class="line"><span class="cl">    {{- $count := .Count }}
</span></span><span class="line"><span class="cl">    {{- with site.GetPage (printf &#34;/%s/%s&#34; $type $name) }}
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">li</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;{{ .Permalink }}&#34;</span><span class="p">&gt;</span>{{ .Name }}<span class="p">&lt;</span><span class="nt">sup</span><span class="p">&gt;</span> {{ $count }}<span class="p">&lt;/</span><span class="nt">sup</span><span class="p">&gt;&lt;/</span><span class="nt">a</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">li</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    {{- end }}
</span></span><span class="line"><span class="cl">    {{- end }}
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">ul</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">{{- end }}{{/* end main */ -}}
</span></span></code></pre></td></tr></table>
</blockquote><p>Here&rsquo;s the same code block but with <code>go-html-template</code> specified:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-go-html-template" data-lang="go-html-template"><span class="line"><span class="cl"><span class="cp">{{-</span><span class="w"> </span><span class="k">define</span><span class="w"> </span><span class="s">&#34;main&#34;</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="cp">{{-</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="na">.Title</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">header</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;page-header&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">h1</span><span class="p">&gt;</span><span class="cp">{{</span><span class="w"> </span><span class="na">.Title</span><span class="w"> </span><span class="cp">}}</span><span class="p">&lt;/</span><span class="nt">h1</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="cp">{{-</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="na">.Description</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;post-description&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="cp">{{</span><span class="w"> </span><span class="na">.Description</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="cp">{{-</span><span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">header</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="cp">{{-</span><span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">ul</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;terms-tags&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="cp">{{-</span><span class="w"> </span><span class="nx">$type</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="na">.Type</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">    <span class="cp">{{-</span><span class="w"> </span><span class="k">range</span><span class="w"> </span><span class="nx">$key</span><span class="o">,</span><span class="w"> </span><span class="nx">$value</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="na">.Data.Terms.Alphabetical</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">    <span class="cp">{{-</span><span class="w"> </span><span class="nx">$name</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="na">.Name</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">    <span class="cp">{{-</span><span class="w"> </span><span class="nx">$count</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="na">.Count</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">    <span class="cp">{{-</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="nx">site</span><span class="na">.GetPage</span><span class="w"> </span><span class="o">(</span><span class="k">printf</span><span class="w"> </span><span class="s">&#34;/%s/%s&#34;</span><span class="w"> </span><span class="nx">$type</span><span class="w"> </span><span class="nx">$name</span><span class="o">)</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">li</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;</span><span class="cp">{{</span><span class="w"> </span><span class="na">.Permalink</span><span class="w"> </span><span class="cp">}}</span><span class="s">&#34;</span><span class="p">&gt;</span><span class="cp">{{</span><span class="w"> </span><span class="na">.Name</span><span class="w"> </span><span class="cp">}}</span><span class="p">&lt;</span><span class="nt">sup</span><span class="p">&gt;</span> <span class="cp">{{</span><span class="w"> </span><span class="nx">$count</span><span class="w"> </span><span class="cp">}}</span><span class="p">&lt;/</span><span class="nt">sup</span><span class="p">&gt;&lt;/</span><span class="nt">a</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">li</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="cp">{{-</span><span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">    <span class="cp">{{-</span><span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">ul</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="cp">{{-</span><span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="cp">}}</span><span class="cm">{{/* end main */ -}}</span>
</span></span></code></pre></td></tr></table>
</blockquote><p>Big difference!</p>
<p>Note that I&rsquo;m using Chroma for syntax highlighting so your experience may vary, but Chroma comes by default with Hugo.</p>
<h2 id="references">References</h2>
<ul>
<li>

<a href="https://gohugo.io/content-management/syntax-highlighting/" target="_blank" rel="noopener">https://gohugo.io/content-management/syntax-highlighting/</a></li>
<li>

<a href="https://github.com/alecthomas/chroma" target="_blank" rel="noopener">https://github.com/alecthomas/chroma</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>A Trick To Remove Unwanted Whitespace After Links in Hugo</title>
      <link>https://nelson.cloud/a-trick-to-remove-unwanted-whitespace-after-links-in-hugo/?ref=rss</link>
      <pubDate>Fri, 11 Jul 2025 00:00:00 +0000</pubDate>
      <guid>https://nelson.cloud/a-trick-to-remove-unwanted-whitespace-after-links-in-hugo/?ref=rss</guid>
      <description>Use this template syntax to remove unwanted whitespace after links in Hugo.</description><content:encoded><![CDATA[<blockquote><p><strong>tl;dr:</strong></p>You can use the <code>{{- &quot;&quot; -}}</code> template syntax to remove trailing whitespace on links in Hugo.</blockquote>

<p>For some reason, 

<a href="https://gohugo.io/" target="_blank" rel="noopener">Hugo</a> was rendering links with a space after them. Here&rsquo;s a screenshot of what that looked like:</p>
<img src="/unwanted-hugo-whitespace/before.webp" alt="Link generated by Hugo with a space after it for some reason." height="50" style="aspect-ratio: 168 / 26;" loading="lazy" decoding="async">
<p>It&rsquo;s subtle but becomes more obvious and distracting in link-heavy pages.</p>
<p>Here is the markdown that I was using to generate the link above. Nothing out of the ordinary:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl">This sentence has a [<span class="nt">link at the end</span>](<span class="na">https://example.com</span>).
</span></span></code></pre></td></tr></table>
</blockquote><p>In Hugo, you can apply post-processing to links through 

<a href="https://gohugo.io/render-hooks/links/" target="_blank" rel="noopener">link render hooks</a> by editing the <code>layouts/_default/_markup/render-link.html</code> file. Here&rsquo;s my terrible template that I use to process links. Once again, nothing stood out that would add unnecessary whitespace after links:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-go-html-template" data-lang="go-html-template"><span class="line"><span class="cl"><span class="cp">{{-</span><span class="w"> </span><span class="nx">$url</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="na">.Destination</span><span class="w"> </span><span class="cp">-}}</span>
</span></span><span class="line"><span class="cl"><span class="cp">{{-</span><span class="w"> </span><span class="nx">$refParam</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="s">&#34;&#34;</span><span class="w"> </span><span class="cp">-}}</span>
</span></span><span class="line"><span class="cl"><span class="cp">{{-</span><span class="w"> </span><span class="nx">$refDomain</span><span class="o">:=</span><span class="w"> </span><span class="s">&#34;&#34;</span><span class="w"> </span><span class="cp">-}}</span>
</span></span><span class="line"><span class="cl"><span class="cp">{{-</span><span class="w"> </span><span class="nx">$hasQuery</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">strings</span><span class="na">.Contains</span><span class="w"> </span><span class="nx">$url</span><span class="w"> </span><span class="s">&#34;?&#34;</span><span class="w"> </span><span class="cp">-}}</span>
</span></span><span class="line"><span class="cl"><span class="cp">{{-</span><span class="w"> </span><span class="nx">$hasHash</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">strings</span><span class="na">.Contains</span><span class="w"> </span><span class="nx">$url</span><span class="w"> </span><span class="s">&#34;#&#34;</span><span class="w"> </span><span class="cp">-}}</span>
</span></span><span class="line"><span class="cl"><span class="cp">{{-</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="nx">$hasQuery</span><span class="w"> </span><span class="cp">-}}</span>
</span></span><span class="line"><span class="cl">    <span class="cm">{{/*  taking into account existing query strings  */}}</span>
</span></span><span class="line"><span class="cl">    <span class="cp">{{-</span><span class="w"> </span><span class="nx">$refParam</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&#34;&amp;ref=&#34;</span><span class="w"> </span><span class="cp">-}}</span>
</span></span><span class="line"><span class="cl">    <span class="cp">{{-</span><span class="w"> </span><span class="nx">$refDomain</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&#34;nelson.cloud&#34;</span><span class="w"> </span><span class="cp">-}}</span>
</span></span><span class="line"><span class="cl"><span class="cp">{{-</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="nx">$hasHash</span><span class="w"> </span><span class="cp">-}}</span>
</span></span><span class="line"><span class="cl">    <span class="cm">{{/*  ensuring that URL doesn&#39;t have a hash #  */}}</span>
</span></span><span class="line"><span class="cl">    <span class="cm">{{/*  do nothing in this case  */}}</span>
</span></span><span class="line"><span class="cl"><span class="cp">{{-</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="cp">-}}</span>
</span></span><span class="line"><span class="cl">    <span class="cp">{{-</span><span class="w"> </span><span class="nx">$refParam</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&#34;?ref=&#34;</span><span class="w"> </span><span class="cp">-}}</span>
</span></span><span class="line"><span class="cl">    <span class="cp">{{-</span><span class="w"> </span><span class="nx">$refDomain</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&#34;nelson.cloud&#34;</span><span class="w"> </span><span class="cp">-}}</span>
</span></span><span class="line"><span class="cl"><span class="cp">{{-</span><span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="cp">-}}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;</span><span class="cp">{{</span><span class="w"> </span><span class="na">.Destination</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="nx">safeURL</span><span class="w"> </span><span class="cp">}}{{</span><span class="w"> </span><span class="nx">$refParam</span><span class="w"> </span><span class="cp">}}{{</span><span class="w"> </span><span class="nx">$refDomain</span><span class="w"> </span><span class="cp">}}</span><span class="s">&#34;</span><span class="cp">{{</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="na">.Title</span><span class="cp">}}</span> <span class="na">title</span><span class="o">=</span><span class="s">&#34;</span><span class="cp">{{</span><span class="w"> </span><span class="na">.</span><span class="w"> </span><span class="cp">}}</span><span class="s">&#34;</span><span class="cp">{{</span><span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="cp">}}{{</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="nx">strings</span><span class="na">.HasPrefix</span><span class="w"> </span><span class="na">.Destination</span><span class="w"> </span><span class="s">&#34;http&#34;</span><span class="w"> </span><span class="cp">}}</span> <span class="na">target</span><span class="o">=</span><span class="s">&#34;_blank&#34;</span> <span class="na">rel</span><span class="o">=</span><span class="s">&#34;noopener noreferrer&#34;</span><span class="cp">{{</span><span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="cp">}}</span><span class="p">&gt;</span><span class="cp">{{</span><span class="w"> </span><span class="na">.Text</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="nx">safeHTML</span><span class="w"> </span><span class="cp">}}</span><span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span>
</span></span></code></pre></td></tr></table>
</blockquote><p>Here is the HTML that was generated by Hugo based on the Markdown I wrote and the processing in <code>render-link.html</code>. This is straight from the browser dev tools:</p>
<img src="/unwanted-hugo-whitespace/html-before.webp" alt="HTML of the link generated by Hugo before the template syntax was added." width="1498" height="162" style="max-width: 100%; height: auto; aspect-ratio: 749 / 81;" loading="lazy" decoding="async">
<p>The period was on its own line, which looks suspicious. Why is there additional space being added though? I tried modifying my CSS, my Markdown, and <code>render-link.html</code> to see if I could remove the whitespace but nothing worked.</p>
<p>Eventually, I was out of ideas and asked ChatGPT what could be going wrong. ChatGPT suggested I could add the <code>{{- &quot;&quot; -}}</code> template syntax to <code>render-link.html</code> to remove the whitespace. Apparently that would force the removal of both leading and trailing whitespace. And sure enough it worked!</p>
<p>I modified my <code>render-link.html</code> template to include the <code>{{- &quot;&quot; -}}</code> template syntax at the end of the <code>&lt;a&gt;</code> tag in the highlighted line:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="hl"><span class="lnt">18
</span></span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-go-html-template" data-lang="go-html-template"><span class="line"><span class="cl"><span class="cp">{{-</span><span class="w"> </span><span class="nx">$url</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="na">.Destination</span><span class="w"> </span><span class="cp">-}}</span>
</span></span><span class="line"><span class="cl"><span class="cp">{{-</span><span class="w"> </span><span class="nx">$refParam</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="s">&#34;&#34;</span><span class="w"> </span><span class="cp">-}}</span>
</span></span><span class="line"><span class="cl"><span class="cp">{{-</span><span class="w"> </span><span class="nx">$refDomain</span><span class="o">:=</span><span class="w"> </span><span class="s">&#34;&#34;</span><span class="w"> </span><span class="cp">-}}</span>
</span></span><span class="line"><span class="cl"><span class="cp">{{-</span><span class="w"> </span><span class="nx">$hasQuery</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">strings</span><span class="na">.Contains</span><span class="w"> </span><span class="nx">$url</span><span class="w"> </span><span class="s">&#34;?&#34;</span><span class="w"> </span><span class="cp">-}}</span>
</span></span><span class="line"><span class="cl"><span class="cp">{{-</span><span class="w"> </span><span class="nx">$hasHash</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">strings</span><span class="na">.Contains</span><span class="w"> </span><span class="nx">$url</span><span class="w"> </span><span class="s">&#34;#&#34;</span><span class="w"> </span><span class="cp">-}}</span>
</span></span><span class="line"><span class="cl"><span class="cp">{{-</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="nx">$hasQuery</span><span class="w"> </span><span class="cp">-}}</span>
</span></span><span class="line"><span class="cl">    <span class="cm">{{/*  taking into account existing query strings  */}}</span>
</span></span><span class="line"><span class="cl">    <span class="cp">{{-</span><span class="w"> </span><span class="nx">$refParam</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&#34;&amp;ref=&#34;</span><span class="w"> </span><span class="cp">-}}</span>
</span></span><span class="line"><span class="cl">    <span class="cp">{{-</span><span class="w"> </span><span class="nx">$refDomain</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&#34;nelson.cloud&#34;</span><span class="w"> </span><span class="cp">-}}</span>
</span></span><span class="line"><span class="cl"><span class="cp">{{-</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="nx">$hasHash</span><span class="w"> </span><span class="cp">-}}</span>
</span></span><span class="line"><span class="cl">    <span class="cm">{{/*  ensuring that URL doesn&#39;t have a hash #  */}}</span>
</span></span><span class="line"><span class="cl">    <span class="cm">{{/*  do nothing in this case  */}}</span>
</span></span><span class="line"><span class="cl"><span class="cp">{{-</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="cp">-}}</span>
</span></span><span class="line"><span class="cl">    <span class="cp">{{-</span><span class="w"> </span><span class="nx">$refParam</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&#34;?ref=&#34;</span><span class="w"> </span><span class="cp">-}}</span>
</span></span><span class="line"><span class="cl">    <span class="cp">{{-</span><span class="w"> </span><span class="nx">$refDomain</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&#34;nelson.cloud&#34;</span><span class="w"> </span><span class="cp">-}}</span>
</span></span><span class="line"><span class="cl"><span class="cp">{{-</span><span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="cp">-}}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line hl"><span class="cl"><span class="p">&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;</span><span class="cp">{{</span><span class="w"> </span><span class="na">.Destination</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="nx">safeURL</span><span class="w"> </span><span class="cp">}}{{</span><span class="w"> </span><span class="nx">$refParam</span><span class="w"> </span><span class="cp">}}{{</span><span class="w"> </span><span class="nx">$refDomain</span><span class="w"> </span><span class="cp">}}</span><span class="s">&#34;</span><span class="cp">{{</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="na">.Title</span><span class="cp">}}</span> <span class="na">title</span><span class="o">=</span><span class="s">&#34;</span><span class="cp">{{</span><span class="w"> </span><span class="na">.</span><span class="w"> </span><span class="cp">}}</span><span class="s">&#34;</span><span class="cp">{{</span><span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="cp">}}{{</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="nx">strings</span><span class="na">.HasPrefix</span><span class="w"> </span><span class="na">.Destination</span><span class="w"> </span><span class="s">&#34;http&#34;</span><span class="w"> </span><span class="cp">}}</span> <span class="na">target</span><span class="o">=</span><span class="s">&#34;_blank&#34;</span> <span class="na">rel</span><span class="o">=</span><span class="s">&#34;noopener noreferrer&#34;</span><span class="cp">{{</span><span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="cp">}}</span><span class="p">&gt;</span><span class="cp">{{</span><span class="w"> </span><span class="na">.Text</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="nx">safeHTML</span><span class="w"> </span><span class="cp">}}</span><span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span><span class="cp">{{-</span><span class="w"> </span><span class="s">&#34;&#34;</span><span class="w"> </span><span class="cp">-}}</span></span></span></code></pre></td></tr></table>
</blockquote>
<p>Then my links were rendering without additional space after them, and here&rsquo;s a screenshot showing that:</p>
<img src="/unwanted-hugo-whitespace/after.webp" alt="Link generated by Hugo with the space after it gone now." height="50" style="aspect-ratio: 168 / 26;" loading="lazy" decoding="async">
<p>The weird thing is that when I checked the HTML being generated, it looked identical to the original before I added the template syntax and I had no idea why:</p>
<img src="/unwanted-hugo-whitespace/html-after.webp" alt="HTML of the link generated by Hugo after the template syntax was added." width="1498" height="162" style="max-width: 100%; height: auto; aspect-ratio: 749 / 81;" loading="lazy" decoding="async">
<p>But at least the whitespace was gone when viewing the article in a browser. That&rsquo;s what matters.</p>
<p>This template syntax trick can probably be applied to other areas of Hugo and not just for links, but I haven&rsquo;t done any additional experimenting.</p>
<h2 id="references">References</h2>
<ul>
<li>Wherever ChatGPT <del>stole</del> got this information from. I feel weird using ChatGPT as a reference but that really is how I discovered the solution.</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Remove Unnecessary Hugo Meta Tag to Keep HTML Lean</title>
      <link>https://nelson.cloud/remove-unnecessary-hugo-meta-tag-to-keep-html-lean/?ref=rss</link>
      <pubDate>Sun, 15 Jun 2025 00:00:00 +0000</pubDate>
      <guid>https://nelson.cloud/remove-unnecessary-hugo-meta-tag-to-keep-html-lean/?ref=rss</guid>
      <description>Remove an unnecessary and auto-generated Hugo meta tag by setting &lt;code&gt;disableHugoGeneratorInject&lt;/code&gt; to &lt;code&gt;true&lt;/code&gt;.</description><content:encoded><![CDATA[<p>I like to keep my 

<a href="https://gohugo.io/" target="_blank" rel="noopener">Hugo</a> site as lean as possible for performance reasons and to save on hosting costs.</p>
<p>I recently discovered that Hugo generates an HTML <code>&lt;meta&gt;</code> tag with the Hugo version in the <code>&lt;head&gt;</code> tag. This is done by default and looks like this:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">head</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">meta</span> <span class="na">name</span><span class="o">=</span><span class="s">generator</span> <span class="na">content</span><span class="o">=</span><span class="s">&#34;Hugo 0.146.2&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">head</span><span class="p">&gt;</span>
</span></span></code></pre></td></tr></table>
</blockquote><p>To remove this tag, we can disable it in <code>config.yaml</code> or <code>config.toml</code> by setting the <code>disableHugoGeneratorInject</code> boolean to <code>true</code>.</p>
<p>In YAML:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-YAML" data-lang="YAML"><span class="line"><span class="cl"><span class="nt">disableHugoGeneratorInject</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</blockquote><p>In TOML:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-TOML" data-lang="TOML"><span class="line"><span class="cl"><span class="nx">disableHugoGeneratorInject</span> <span class="p">=</span> <span class="kc">true</span>
</span></span></code></pre></td></tr></table>
</blockquote><p>If setting <code>disableHugoGeneratorInject</code> doesn&rsquo;t work, do a global search in your Hugo project for <code>{{ hugo.Generator }}</code>. This template syntax outputs the same <code>&lt;meta&gt;</code> tag and doesn&rsquo;t respect the <code>disableHugoGeneratorInject</code> configuration (at least as of Hugo v0.147.8).</p>
<h2 id="references">References</h2>
<ul>
<li>

<a href="https://gohugo.io/configuration/all/#disablehugogeneratorinject" target="_blank" rel="noopener">https://gohugo.io/configuration/all/#disablehugogeneratorinject</a></li>
<li>

<a href="https://gohugo.io/functions/hugo/generator/" target="_blank" rel="noopener">https://gohugo.io/functions/hugo/generator/</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>How to Generate and Format the Current Date and Time in Hugo with dateFormat</title>
      <link>https://nelson.cloud/how-to-generate-and-format-the-current-date-and-time-in-hugo-with-dateformat/?ref=rss</link>
      <pubDate>Sun, 22 Dec 2024 00:00:00 +0000</pubDate>
      <guid>https://nelson.cloud/how-to-generate-and-format-the-current-date-and-time-in-hugo-with-dateformat/?ref=rss</guid>
      <description>Several examples of dateFormat including date only, date + 12-hour time, date + 24-hour time, date + timezone, and date + UTC offset.</description><content:encoded><![CDATA[<p>Here are a bunch of 

<a href="https://gohugo.io/" target="_blank" rel="noopener">Hugo</a> snippets you can use to generate the current date and time in your Hugo site.</p>
<p>You can copy and paste these into HTML templates. If you want to use these within your posts/articles (Markdown files) you&rsquo;ll need to create a shortcode first. Scroll down to the 

<a href="#using-shortcodes">Using Shortcodes</a> section for more details.</p>
<p>I&rsquo;m running Hugo v0.140.0+extended.</p>
<p><strong>For all examples, I will assume the time is 2024-12-22 2:30PM PT.</strong></p>
<h2 id="date-only">Date Only</h2>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-go-html-template" data-lang="go-html-template"><span class="line"><span class="cl"><span class="cp">{{</span><span class="w"> </span><span class="nx">now</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="nx">dateFormat</span><span class="w"> </span><span class="s">&#34;2006-01-02&#34;</span><span class="w"> </span><span class="cp">}}</span>
</span></span></code></pre></td></tr></table>
</blockquote><p>Output:</p>
<pre tabindex="0"><code>2024-12-22
</code></pre><h2 id="date-and-12-hour-time">Date and 12-Hour Time</h2>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-go-html-template" data-lang="go-html-template"><span class="line"><span class="cl"><span class="cp">{{</span><span class="w"> </span><span class="nx">now</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="nx">dateFormat</span><span class="w"> </span><span class="s">&#34;2006-01-02 3:04&#34;</span><span class="w"> </span><span class="cp">}}</span>
</span></span></code></pre></td></tr></table>
</blockquote><p>Output:</p>
<pre tabindex="0"><code>2024-12-22 2:30
</code></pre><p>You can specify AM or PM by adding <code>PM</code> to the time. Go will output the correct one (AM/PM) based on the actual time:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-go-html-template" data-lang="go-html-template"><span class="line"><span class="cl"><span class="cp">{{</span><span class="w"> </span><span class="nx">now</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="nx">dateFormat</span><span class="w"> </span><span class="s">&#34;2006-01-02 3:04PM&#34;</span><span class="w"> </span><span class="cp">}}</span>
</span></span></code></pre></td></tr></table>
</blockquote><p>Output:</p>
<pre tabindex="0"><code>2024-12-22 2:30PM
</code></pre><blockquote><p><strong>Note:</strong></p><p>Always use <code>PM</code> (or <code>pm</code>) as the placeholder in the time string. Using <code>AM</code> in the time string will print the literal text <code>AM</code> as regardless of the actual time. For example:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-go-html-template" data-lang="go-html-template"><span class="line"><span class="cl"><span class="cp">{{</span><span class="w"> </span><span class="nx">now</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="nx">dateFormat</span><span class="w"> </span><span class="s">&#34;2006-01-02 3:04AM&#34;</span><span class="w"> </span><span class="cp">}}</span>
</span></span></code></pre></td></tr></table>
</blockquote><p>Will output:</p>
<pre tabindex="0"><code>2024-12-22 2:30AM
</code></pre><p>Even if it&rsquo;s actually 2:30PM.</p>
</blockquote>

<h2 id="date-and-24-hour-time">Date and 24-Hour Time</h2>
<p>Essentially just changing <code>3:04</code> to <code>15:04</code>.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-go-html-template" data-lang="go-html-template"><span class="line"><span class="cl"><span class="cp">{{</span><span class="w"> </span><span class="nx">now</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="nx">dateFormat</span><span class="w"> </span><span class="s">&#34;2006-01-02 15:04&#34;</span><span class="w"> </span><span class="cp">}}</span>
</span></span></code></pre></td></tr></table>
</blockquote><p>Output:</p>
<pre tabindex="0"><code>2024-12-22 14:30
</code></pre><h2 id="date-and-time-with-timezone">Date and Time with Timezone</h2>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-go-html-template" data-lang="go-html-template"><span class="line"><span class="cl"><span class="cp">{{</span><span class="w"> </span><span class="nx">now</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="nx">dateFormat</span><span class="w"> </span><span class="s">&#34;2006-01-02 15:04 PST&#34;</span><span class="w"> </span><span class="cp">}}</span>
</span></span></code></pre></td></tr></table>
</blockquote><p>Output:</p>
<pre tabindex="0"><code>2024-12-22 14:30 PST
</code></pre><br>
<p>It&rsquo;s possible to add just about anything in place of the timezone and it&rsquo;ll take it. You can even add text that isn&rsquo;t a valid timezone.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-go-html-template" data-lang="go-html-template"><span class="line"><span class="cl"><span class="cp">{{</span><span class="w"> </span><span class="nx">now</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="nx">dateFormat</span><span class="w"> </span><span class="s">&#34;2006-01-02 15:04 test&#34;</span><span class="w"> </span><span class="cp">}}</span>
</span></span></code></pre></td></tr></table>
</blockquote><p>Output:</p>
<pre tabindex="0"><code>2024-12-22 14:30 test
</code></pre><h2 id="date-time-timezone-and-utc-offset">Date, Time, Timezone, and UTC Offset</h2>
<p>There are two ways that I found of doing this.</p>
<p>The first way:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-go-html-template" data-lang="go-html-template"><span class="line"><span class="cl"><span class="cp">{{</span><span class="w"> </span><span class="nx">now</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="nx">dateFormat</span><span class="w"> </span><span class="s">&#34;2006-01-02 15:04 PST -0700&#34;</span><span class="w"> </span><span class="cp">}}</span>
</span></span></code></pre></td></tr></table>
</blockquote><p>Output. Note how Hugo changed the offset from <code>-0700</code> to <code>-0800</code> in this case:</p>
<pre tabindex="0"><code>2024-12-22 14:30 PST -0800
</code></pre><br>
<p>The second way:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-go-html-template" data-lang="go-html-template"><span class="line"><span class="cl"><span class="cp">{{</span><span class="w"> </span><span class="nx">now</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="nx">dateFormat</span><span class="w"> </span><span class="s">&#34;2006-01-02 15:04 PST UTC-0700&#34;</span><span class="w"> </span><span class="cp">}}</span>
</span></span></code></pre></td></tr></table>
</blockquote><p>Output. Hugo once again changed the offset from <code>UTC-0700</code> to <code>UTC-0800</code>:</p>
<pre tabindex="0"><code>2024-12-22 14:30 PST UTC-0800
</code></pre><h2 id="timezones-and-cicd">Timezones and CI/CD</h2>
<p>These snippets work for your current timezone but if you use a 

<a href="https://en.wikipedia.org/wiki/CI/CD" target="_blank" rel="noopener">CI/CD solution</a> you may need to specify the timezone through an environment variable or etc. It depends on your CI/CD solution. I couldn&rsquo;t find a way to set the timezone in Hugo itself so I don&rsquo;t think it&rsquo;s possible.</p>
<h2 id="using-shortcodes">Using Shortcodes</h2>
<p>These snippets can be copied and pasted into <code>.html</code> templates. However, to use them in Markdown files, you&rsquo;ll need to create a separate file in <code>layouts/shortcodes/</code> and then use that shortcode in a markdown file.</p>
<p>For example, I can create a file <code>generate_date.html</code> in <code>layouts/shortcodes/</code> with the following contents:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-go-html-template" data-lang="go-html-template"><span class="line"><span class="cl"><span class="cp">{{</span><span class="w"> </span><span class="nx">now</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="nx">dateFormat</span><span class="w"> </span><span class="s">&#34;2006-01-02&#34;</span><span class="w"> </span><span class="cp">}}</span>
</span></span></code></pre></td></tr></table>
</blockquote><p>Then I can reference this shortcode in a markdown file with this syntax:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-md" data-lang="md"><span class="line"><span class="cl">{{&lt; generate_date &gt;}}
</span></span></code></pre></td></tr></table>
</blockquote><p>An example along with some other markdown:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-md" data-lang="md"><span class="line"><span class="cl"><span class="gh"># A Header in Markdown
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Some text in markdown
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="ge">*The current date is*</span>: {{&lt; generate_date &gt;}}
</span></span></code></pre></td></tr></table>
</blockquote><h2 id="references">References</h2>
<ul>
<li>

<a href="https://discourse.gohugo.io/t/how-to-display-time-by-timezone/42643/7" target="_blank" rel="noopener">https://discourse.gohugo.io/t/how-to-display-time-by-timezone/42643/7</a></li>
<li>

<a href="https://community.cloudflare.com/t/hugo-timezone-format-issue/390678" target="_blank" rel="noopener">https://community.cloudflare.com/t/hugo-timezone-format-issue/390678</a></li>
</ul>
]]></content:encoded>
    </item>
  </channel>
</rss>
