<?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>HTML on Nelson Figueroa</title><link>https://nelson.cloud/categories/html/</link><description>Recent content in HTML on Nelson Figueroa</description><image><title>Nelson Figueroa</title><url>https://nelson.cloud/apple-touch-icon.png</url><link>https://nelson.cloud/categories/html/</link></image><language>en</language><lastBuildDate>Wed, 01 Apr 2026 22:42:16 -0700</lastBuildDate><atom:link href="https://nelson.cloud/categories/html/index.xml" rel="self" type="application/rss+xml"/><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>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">```go-html-template</span></span></code></pre></div><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"><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></div><p>Here&rsquo;s the same code block but with <code>go-html-template</code> specified:</p>
<div class="highlight"><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></div><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"><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></div><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"><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></div><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"><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></div>
<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"><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></div><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"><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></span></code></pre></div><p>In TOML:</p>
<div class="highlight"><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></div><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 Disable CSS Animations and Transitions</title><link>https://nelson.cloud/how-to-disable-css-animations-and-transitions/?ref=rss</link><pubDate>Sun, 26 Jan 2025 00:00:00 +0000</pubDate><guid>https://nelson.cloud/how-to-disable-css-animations-and-transitions/?ref=rss</guid><description>Disable CSS animations and transitions with a few lines of CSS.</description><content:encoded><![CDATA[<p>If you&rsquo;re using a CSS library that comes with animations by default it may be a pain to maintain a modified version of it without animations. It&rsquo;s easier to write your own CSS to disable animations and transitions.</p>
<p>My motivation behind this post was disabling button animations when using 

<a href="https://daisyui.com/" target="_blank" rel="noopener">daisyUI</a> on a side project.</p>
<blockquote><p><strong>Note:</strong></p>I am not a CSS expert and there may be other ways of animating elements via CSS that I did not cover here. Also, this doesn&rsquo;t help if elements are being moved around by JavaScript. But you can easily disable JavaScript for any site through your browser :)</blockquote>

<p>To disable CSS animations and transitions you can try adding the following to your CSS:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="o">*</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">animation</span><span class="p">:</span> <span class="kc">none</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">transition</span><span class="p">:</span> <span class="kc">none</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div><p>If that doesn&rsquo;t work, try using <code>!important</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="o">*</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">animation</span><span class="p">:</span> <span class="kc">none</span> <span class="cp">!important</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">transition</span><span class="p">:</span> <span class="kc">none</span> <span class="cp">!important</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div><p>Animations may also be applied using the <code>::before</code> and <code>::after</code> pseudo elements. We can include those in the previous CSS:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="o">*,</span> <span class="o">*</span><span class="p">::</span><span class="nd">before</span><span class="o">,</span> <span class="o">*</span><span class="p">::</span><span class="nd">after</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">animation</span><span class="p">:</span> <span class="kc">none</span> <span class="cp">!important</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">transition</span><span class="p">:</span> <span class="kc">none</span> <span class="cp">!important</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div><p>You can also put these into a CSS class and apply to HTML elements as needed if you still want animations in some places:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="c">/* style.css */</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">no-animations</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">animation</span><span class="p">:</span> <span class="kc">none</span> <span class="cp">!important</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">transition</span><span class="p">:</span> <span class="kc">none</span> <span class="cp">!important</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="c">&lt;!-- index.html --&gt;</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">html</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><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">link</span> <span class="na">rel</span><span class="o">=</span><span class="s">&#34;stylesheet&#34;</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;style.css&#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><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">body</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">     <span class="c">&lt;!-- add a class to whatever elements you want --&gt;</span>
</span></span><span class="line"><span class="cl">     <span class="p">&lt;</span><span class="nt">button</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;no-animations&#34;</span> <span class="na">type</span><span class="o">=</span><span class="s">&#34;button&#34;</span><span class="p">&gt;</span>No Animations on this Button<span class="p">&lt;/</span><span class="nt">button</span><span class="p">&gt;</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">button</span> <span class="na">type</span><span class="o">=</span><span class="s">&#34;button&#34;</span><span class="p">&gt;</span>Animations are ok here<span class="p">&lt;/</span><span class="nt">button</span><span class="p">&gt;</span> 
</span></span><span class="line"><span class="cl">  <span class="p">&lt;/</span><span class="nt">body</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">html</span><span class="p">&gt;</span></span></span></code></pre></div><h2 id="references">References</h2>
<ul>
<li>

<a href="https://stackoverflow.com/questions/11131875/what-is-the-cleanest-way-to-disable-css-transition-effects-temporarily" target="_blank" rel="noopener">https://stackoverflow.com/questions/11131875/what-is-the-cleanest-way-to-disable-css-transition-effects-temporarily</a></li>
<li>

<a href="https://stackoverflow.com/questions/31576156/what-does-animationnone-do-exactly" target="_blank" rel="noopener">https://stackoverflow.com/questions/31576156/what-does-animationnone-do-exactly</a></li>
<li>

<a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/animation" target="_blank" rel="noopener">https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/animation</a></li>
<li>

<a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/transition" target="_blank" rel="noopener">https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/transition</a></li>
</ul>
]]></content:encoded></item><item><title>Render HTML and CSS if JavaScript Is Disabled Using the `&lt;noscript&gt;` Tag</title><link>https://nelson.cloud/render-html-and-css-if-javascript-is-disabled-using-the-noscript-tag/?ref=rss</link><pubDate>Sat, 30 Nov 2024 00:00:00 +0000</pubDate><guid>https://nelson.cloud/render-html-and-css-if-javascript-is-disabled-using-the-noscript-tag/?ref=rss</guid><description>Render HTML and apply CSS styles if JavaScript is disabled.</description><content:encoded><![CDATA[<p>I recently learned about the 

<a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/noscript" target="_blank" rel="noopener"><code>&lt;noscript&gt;</code> HTML tag</a>. HTML and CSS contained within <code>&lt;noscript&gt;</code> tags will be rendered if JavaScript is disabled in the browser.</p>
<p>For example, try reloading this page with JavaScript disabled and you&rsquo;ll see a new message below:</p>
<noscript>
    <blockquote>This message only shows up when JavaScript is disabled!</blockquote>
</noscript>
<p>The HTML for the message above looks like this:</p>
<div class="highlight"><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">noscript</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">blockquote</span><span class="p">&gt;</span>This message only shows up when JavaScript is disabled!<span class="p">&lt;/</span><span class="nt">blockquote</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">noscript</span><span class="p">&gt;</span></span></span></code></pre></div><p>Here&rsquo;s an example where CSS styles within <code>&lt;noscript&gt;</code> tags are applied when JavaScript is disabled. Try reloading this page without JavaScript and the message below will be italicized.</p>
<noscript>
    <style>
        blockquote#example {
            font-style: italic;
        }
    </style>
</noscript>
<blockquote id="example">The text within this blockquote element is italicized when JavaScript is disabled!</blockquote>
<p>And this is what the HTML and CSS looks like for the example above:</p>
<div class="highlight"><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">noscript</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">style</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="nt">blockquote</span><span class="p">#</span><span class="nn">example</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="k">font-style</span><span class="p">:</span> <span class="kc">italic</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">style</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">noscript</span><span class="p">&gt;</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">blockquote</span> <span class="na">id</span><span class="o">=</span><span class="s">&#34;example&#34;</span><span class="p">&gt;</span>The text within this blockquote element is italicized when JavaScript is disabled!<span class="p">&lt;/</span><span class="nt">blockquote</span><span class="p">&gt;</span></span></span></code></pre></div><h2 id="references">References</h2>
<ul>
<li>

<a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/noscript" target="_blank" rel="noopener">https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/noscript</a></li>
</ul>
]]></content:encoded></item><item><title>Ruby on Rails: Enable File Downloads Using link_to</title><link>https://nelson.cloud/ruby-on-rails-enable-file-downloads-using-link_to/?ref=rss</link><pubDate>Sat, 03 Feb 2024 00:00:00 +0000</pubDate><guid>https://nelson.cloud/ruby-on-rails-enable-file-downloads-using-link_to/?ref=rss</guid><description>How to enable file downloads using the link_to helper in Ruby on Rails.</description><content:encoded><![CDATA[<p>In a Ruby on Rails app I was working on, I wanted to include a link that would download a user&rsquo;s data (bank statements in this case) as JSON.</p>
<p>Originally I had the following ERB:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-erb" data-lang="erb"><span class="line"><span class="cl"><span class="cp">&lt;%=</span> <span class="n">link_to</span> <span class="s1">&#39;Download All Statements as JSON&#39;</span><span class="p">,</span> <span class="n">statements_download_path</span> <span class="cp">%&gt;</span></span></span></code></pre></div><p>Clicking this link would show JSON in the browser, but it wouldn&rsquo;t download a JSON file, which is what I wanted.</p>
<p>The solution was to add a <code>download</code> attribute to the ERB snippet:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-erb" data-lang="erb"><span class="line"><span class="cl"><span class="cp">&lt;%=</span> <span class="n">link_to</span> <span class="s1">&#39;Download All Statements as JSON&#39;</span><span class="p">,</span> <span class="n">statements_download_path</span><span class="p">,</span> <span class="ss">download</span><span class="p">:</span> <span class="s1">&#39;statements.json&#39;</span> <span class="cp">%&gt;</span></span></span></code></pre></div><h2 id="full-setup">Full Setup</h2>
<p>For additional context, here is all the code required to get this to work.</p>
<p>First I created this method in <code>statements_controller.rb</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">download</span>
</span></span><span class="line"><span class="cl">  <span class="n">render</span> <span class="ss">json</span><span class="p">:</span> <span class="vi">@user</span><span class="o">.</span><span class="n">statements</span>
</span></span><span class="line"><span class="cl"><span class="k">end</span></span></span></code></pre></div><p>Then I added a new route to <code>routes.rb</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">get</span> <span class="s1">&#39;statements/download&#39;</span><span class="p">,</span> <span class="ss">to</span><span class="p">:</span> <span class="s1">&#39;statements#download&#39;</span></span></span></code></pre></div><p>And then I added the <code>link_to</code> helper in the view:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-erb" data-lang="erb"><span class="line"><span class="cl"><span class="cp">&lt;%=</span> <span class="n">link_to</span> <span class="s1">&#39;Download All Statements as JSON&#39;</span><span class="p">,</span> <span class="n">statements_download_path</span><span class="p">,</span> <span class="ss">download</span><span class="p">:</span> <span class="s1">&#39;statements.json&#39;</span> <span class="cp">%&gt;</span></span></span></code></pre></div><p>The <code>link_to</code> ERB helper is creating this HTML:</p>
<div class="highlight"><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">a</span> <span class="na">download</span><span class="o">=</span><span class="s">&#34;statements.json&#34;</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;/statements/download&#34;</span><span class="p">&gt;</span>Download All Statements as JSON<span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span></span></span></code></pre></div><p>The <code>download</code> attribute can be customized in ERB. For example, I can name the file based on the user&rsquo;s name like so:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-erb" data-lang="erb"><span class="line"><span class="cl"><span class="cp">&lt;%=</span> <span class="n">link_to</span> <span class="s1">&#39;Download All Statements as JSON&#39;</span><span class="p">,</span> <span class="n">statements_download_path</span><span class="p">,</span> <span class="ss">download</span><span class="p">:</span> <span class="s2">&#34;</span><span class="si">#{</span><span class="vi">@user</span><span class="o">.</span><span class="n">name</span><span class="o">.</span><span class="n">downcase</span><span class="si">}</span><span class="s2">-statements&#34;</span> <span class="cp">%&gt;</span></span></span></code></pre></div><p>And it will generate the following HTML:</p>
<div class="highlight"><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">a</span> <span class="na">download</span><span class="o">=</span><span class="s">&#34;nelson-statements&#34;</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;/statements/download&#34;</span><span class="p">&gt;</span>Download All Statements as JSON<span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span></span></span></code></pre></div><p>This link will trigger a download for <code>nelson-statements.json</code> in my case.</p>
<p>Ultimately this was a case of understanding the <code>download</code> HTML attribute for <code>&lt;a&gt;</code> tags and how to use it in Rails.</p>
<h2 id="further-reading-and-references">Further Reading and References</h2>
<blockquote><p><strong>Note:</strong></p>There are other ways of handling this, like using the <code>send_data</code> method in a controller. But that&rsquo;s beyond the scope of this post. Read more about it here: 

<a href="https://api.rubyonrails.org/v7.0.1/classes/ActionController/DataStreaming.html#method-i-send_data" target="_blank" rel="noopener">https://api.rubyonrails.org/v7.0.1/classes/ActionController/DataStreaming.html#method-i-send_data</a></blockquote>

<p>References:</p>
<ul>
<li>

<a href="https://www.w3schools.com/tags/att_a_download.asp" target="_blank" rel="noopener">https://www.w3schools.com/tags/att_a_download.asp</a></li>
<li>

<a href="https://forum.upcase.com/t/download-html-file-instead-of-opening-in-browser-with-link-to/2994" target="_blank" rel="noopener">https://forum.upcase.com/t/download-html-file-instead-of-opening-in-browser-with-link-to/2994</a></li>
<li>

<a href="https://www.reddit.com/r/rails/comments/co0h6i/whats_the_best_way_create_a_download_image_link/" target="_blank" rel="noopener">https://www.reddit.com/r/rails/comments/co0h6i/whats_the_best_way_create_a_download_image_link/</a></li>
</ul>
]]></content:encoded></item></channel></rss>