<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hugo Shortcodes on
A Scripter's Notes</title><link>https://scripter.co/series/hugo-shortcodes/</link><description>Recent content in Hugo Shortcodes
on A Scripter's Notes</description><language>en-us</language><managingEditor>kaushal.modi@gmail.com (Kaushal Modi)</managingEditor><webMaster>kaushal.modi@gmail.com (Kaushal Modi)</webMaster><lastBuildDate>Mon, 08 Jan 2024 07:42:20 -0500</lastBuildDate><generator>Hugo -- gohugo.io</generator><docs>https://validator.w3.org/feed/docs/rss2.html</docs><atom:link href="https://scripter.co/series/hugo-shortcodes/index.xml" rel="self" type="application/rss+xml"/><item><title>titleref: Referencing Hugo posts by their titles</title><link>https://scripter.co/titleref-referencing-hugo-posts-by-their-titles/</link><description>&lt;blockquote>A custom Hugo shortcode to create cross-references to other posts
using their title strings.&lt;/blockquote>&lt;div class="ox-hugo-toc toc">
&lt;div class="heading">Table of Contents&lt;/div>
&lt;ul>
&lt;li>&lt;a href="#relref-shortcode">&lt;code>relref&lt;/code> shortcode&lt;/a>&lt;/li>
&lt;li>&lt;a href="#relref-org-macro">&lt;code>relref&lt;/code> Org macro&lt;/a>&lt;/li>
&lt;li>&lt;a href="#titleref-shortcode">&lt;code>titleref&lt;/code> shortcode&lt;/a>&lt;/li>
&lt;li>&lt;a href="#titleref-org-macro">&lt;code>titleref&lt;/code> Org macro&lt;/a>&lt;/li>
&lt;li>&lt;a href="#summary">Summary&lt;/a>&lt;/li>
&lt;/ul>
&lt;/div>
&lt;!--endtoc-->
&lt;h2 id="relref-shortcode">&lt;code>relref&lt;/code> shortcode&amp;nbsp;&lt;a class="headline-hash no-text-decoration" href="#relref-shortcode">#&lt;/a>&lt;/h2>
&lt;p>Hugo has a built-in shortcode &lt;a href="https://gohugo.io/content-management/cross-references/">&lt;code>relref&lt;/code>&lt;/a> that gets relative links
&lt;span class="sidenote-number">&lt;small class="sidenote">
There&amp;rsquo;s also a &lt;code>ref&lt;/code> shortcode which creates absolute links. &lt;code>ref&lt;/code> can
be used wherever &lt;code>relref&lt;/code> is used.
&lt;/small>&lt;/span>
to other posts by using their &lt;code>url&lt;/code>. In &lt;a href="https://gohugo.io/content-management/organization#path-breakdown-in-hugo">Hugo lingo&lt;/a>, a post&amp;rsquo;s &lt;code>url&lt;/code>
consists of the post&amp;rsquo;s &lt;code>section&lt;/code> and &lt;code>slug&lt;/code>
&lt;span class="sidenote-number">&lt;small class="sidenote">
This post&amp;rsquo;s &lt;code>section&lt;/code> is &lt;code>posts&lt;/code> and &lt;code>slug&lt;/code> is
&lt;code>titleref-referencing-hugo-posts-by-their-titles&lt;/code>. So the &lt;code>url&lt;/code> is
&lt;code>posts/titleref-referencing-hugo-posts-by-their-titles&lt;/code>.
&lt;/small>&lt;/span>
.&lt;/p>
&lt;p>This page&amp;rsquo;s relative link can be fetched by using &lt;code class="code-inline language-md">{{&lt;span class="p">&amp;lt;&lt;/span> &lt;span class="nt">relref&lt;/span> &lt;span class="err">&amp;#34;&lt;/span>&lt;span class="na">posts&lt;/span>&lt;span class="err">/&lt;/span>&lt;span class="na">titleref-referencing-hugo-posts-by-their-titles&lt;/span>&lt;span class="err">&amp;#34;&lt;/span> &lt;span class="p">&amp;gt;&lt;/span>}}&lt;/code>. If a
post&amp;rsquo;s slug is unique across all the posts, its &lt;code>section&lt;/code> part can be
skipped. So the same &lt;code>relref&lt;/code> can be written as &lt;code class="code-inline language-md">{{&lt;span class="p">&amp;lt;&lt;/span> &lt;span class="nt">relref&lt;/span> &lt;span class="err">&amp;#34;&lt;/span>&lt;span class="na">titleref-referencing-hugo-posts-by-their-titles&lt;/span>&lt;span class="err">&amp;#34;&lt;/span> &lt;span class="p">&amp;gt;&lt;/span>}}&lt;/code> and that will
still return
&lt;a href="https://scripter.co/titleref-referencing-hugo-posts-by-their-titles/"> this &lt;/a>
same link.&lt;/p>
&lt;dl>
&lt;dt>Problem Statement&lt;/dt>
&lt;dd>The issue with &lt;code>relref&lt;/code> is that it returns only
the link &amp;mdash; the description still needs to be written manually. I
typically use a post&amp;rsquo;s title as description when I link to it. So
the full link with description will look like this when writing in
Org mode
&lt;span class="sidenote-number">&lt;small class="sidenote">
In Markdown, the same link will look like this: &lt;code class="code-inline language-md">[&lt;span class="nt">titleref: Referencing Hugo posts by their titles&lt;/span>](&lt;span class="na">{{&amp;lt; relref &amp;quot;titleref-referencing-hugo-posts-by-their-titles&amp;quot; &amp;gt;}}&lt;/span>)&lt;/code>.
&lt;/small>&lt;/span>
for exporting using &lt;a href="https://ox-hugo.scripter.co">ox-hugo&lt;/a>:
&lt;code class="code-inline language-org">[[&lt;span class="na">@@hugo:{{&amp;lt; relref &amp;#34;titleref-referencing-hugo-posts-by-their-titles&amp;#34; &amp;gt;}}@@&lt;/span>][&lt;span class="nt">titleref: Referencing Hugo posts by their titles&lt;/span>]]&lt;/code>.&lt;/dd>
&lt;/dl>
&lt;p>You can see how impractical and verbose that is!&lt;/p>
&lt;p>&lt;em>If you write your posts in Markdown, you can jump to the &lt;a href="#titleref-shortcode">&lt;code>titleref&lt;/code>
shortcode&lt;/a> section.&lt;/em>&lt;/p>
&lt;h2 id="relref-org-macro">&lt;code>relref&lt;/code> Org macro&amp;nbsp;&lt;a class="headline-hash no-text-decoration" href="#relref-org-macro">#&lt;/a>&lt;/h2>
&lt;p>An Org macro can help a little over here.&lt;/p>
&lt;p>&lt;a id="code-snippet--relref-org-macro">&lt;/a>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-org" data-lang="org">&lt;span class="line">&lt;span class="cl">&lt;span class="cs">#+macro&lt;/span>&lt;span class="c">: relref @@hugo:[@@ $1 @@hugo:]({{&amp;lt; relref &amp;#34;$2&amp;#34; &amp;gt;}})@@&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="src-block-caption">
&lt;span class="src-block-number">&lt;a href="#code-snippet--relref-org-macro">Code Snippet 1&lt;/a>:&lt;/span>
&lt;code>relref&lt;/code> Org macro
&lt;/div>
&lt;p>&lt;span class="org-target" id="org-target--relref-macro-example">&lt;/span> With this macro, that same &lt;code>relref&lt;/code> link can
be rewritten as &lt;code class="code-inline language-org">&lt;span class="nb">{{{relref(titleref: Referencing Hugo posts by their titles,titleref-referencing-hugo-posts-by-their-titles)}}}&lt;/span>&lt;/code>.&lt;/p>
&lt;p>It&amp;rsquo;s a bit less verbose compared to using the shortcode directly, but
I still wasn&amp;rsquo;t happy with the &lt;a href="https://en.wikipedia.org/wiki/Redundancy_(information_theory)">redundancy&lt;/a>.&lt;/p>
&lt;h2 id="titleref-shortcode">&lt;code>titleref&lt;/code> shortcode&amp;nbsp;&lt;a class="headline-hash no-text-decoration" href="#titleref-shortcode">#&lt;/a>&lt;/h2>
&lt;div class="note">
&lt;p>In that &lt;em>relref&lt;/em> link, we are providing both, the post slug and the
post title.
&lt;mark>Both are uniquely associated with each-other&lt;/mark> , and Hugo can internally derive one from the other. So there&amp;rsquo;s no
need for us to specify both!&lt;/p>
&lt;/div>
&lt;p>And so I thought that it should be pretty simple to specify just the
title of post that I want to link, and let Hugo derive the post&amp;rsquo;s
permalink &amp;mdash; and it was simple, by using this custom
&lt;span class="sidenote-number">&lt;small class="sidenote">
A user can add custom shortcodes or override the default Hugo
shortcodes by putting them in the &lt;code>layouts/shortcodes/&lt;/code> directory of
the site or theme repo.
&lt;/small>&lt;/span>
shortcode!&lt;/p>
&lt;p>An astute Org mode user might think that this idea looks like the
&lt;code class="code-inline language-org">[[&lt;span class="na">*Heading&lt;/span>]]&lt;/code> syntax &lt;a href="https://orgmode.org/manual/Internal-Links.html">supported by Org&lt;/a>, and they
would be right! This &lt;code>titleref&lt;/code> idea is inspired by that Org mode
feature.&lt;/p>
&lt;p>&lt;a id="code-snippet--titleref-sc">&lt;/a>&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt" id="org-coderef--4922be-1">&lt;a style="outline: none; text-decoration:none; color:inherit" href="#org-coderef--4922be-1"> 1&lt;/a>
&lt;/span>&lt;span class="lnt" id="org-coderef--4922be-2">&lt;a style="outline: none; text-decoration:none; color:inherit" href="#org-coderef--4922be-2"> 2&lt;/a>
&lt;/span>&lt;span class="lnt" id="org-coderef--4922be-3">&lt;a style="outline: none; text-decoration:none; color:inherit" href="#org-coderef--4922be-3"> 3&lt;/a>
&lt;/span>&lt;span class="lnt" id="org-coderef--4922be-4">&lt;a style="outline: none; text-decoration:none; color:inherit" href="#org-coderef--4922be-4"> 4&lt;/a>
&lt;/span>&lt;span class="hl">&lt;span class="lnt" id="org-coderef--4922be-5">&lt;a style="outline: none; text-decoration:none; color:inherit" href="#org-coderef--4922be-5"> 5&lt;/a>
&lt;/span>&lt;/span>&lt;span class="lnt" id="org-coderef--4922be-6">&lt;a style="outline: none; text-decoration:none; color:inherit" href="#org-coderef--4922be-6"> 6&lt;/a>
&lt;/span>&lt;span class="lnt" id="org-coderef--4922be-7">&lt;a style="outline: none; text-decoration:none; color:inherit" href="#org-coderef--4922be-7"> 7&lt;/a>
&lt;/span>&lt;span class="lnt" id="org-coderef--4922be-8">&lt;a style="outline: none; text-decoration:none; color:inherit" href="#org-coderef--4922be-8"> 8&lt;/a>
&lt;/span>&lt;span class="lnt" id="org-coderef--4922be-9">&lt;a style="outline: none; text-decoration:none; color:inherit" href="#org-coderef--4922be-9"> 9&lt;/a>
&lt;/span>&lt;span class="lnt" id="org-coderef--4922be-10">&lt;a style="outline: none; text-decoration:none; color:inherit" href="#org-coderef--4922be-10">10&lt;/a>
&lt;/span>&lt;span class="lnt" id="org-coderef--4922be-11">&lt;a style="outline: none; text-decoration:none; color:inherit" href="#org-coderef--4922be-11">11&lt;/a>
&lt;/span>&lt;span class="hl">&lt;span class="lnt" id="org-coderef--4922be-12">&lt;a style="outline: none; text-decoration:none; color:inherit" href="#org-coderef--4922be-12">12&lt;/a>
&lt;/span>&lt;/span>&lt;span class="hl">&lt;span class="lnt" id="org-coderef--4922be-13">&lt;a style="outline: none; text-decoration:none; color:inherit" href="#org-coderef--4922be-13">13&lt;/a>
&lt;/span>&lt;/span>&lt;span class="lnt" id="org-coderef--4922be-14">&lt;a style="outline: none; text-decoration:none; color:inherit" href="#org-coderef--4922be-14">14&lt;/a>
&lt;/span>&lt;span class="lnt" id="org-coderef--4922be-15">&lt;a style="outline: none; text-decoration:none; color:inherit" href="#org-coderef--4922be-15">15&lt;/a>
&lt;/span>&lt;span class="lnt" id="org-coderef--4922be-16">&lt;a style="outline: none; text-decoration:none; color:inherit" href="#org-coderef--4922be-16">16&lt;/a>
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-go-html-template" data-lang="go-html-template">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">{{-&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nx">$title_anchor&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">:=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="na">.Get&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nx">0&lt;/span>&lt;span class="o">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="cp">-}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">{{-&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nx">$title&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">:=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nx">trim&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="k">index&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="nx">split&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nx">$title_anchor&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s">&amp;#34;#&amp;#34;&lt;/span>&lt;span class="o">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nx">0&lt;/span>&lt;span class="o">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s">&amp;#34; &amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="cp">-}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">{{-&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nx">$anchor&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">:=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nx">trim&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="k">index&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="nx">split&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nx">$title_anchor&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s">&amp;#34;#&amp;#34;&lt;/span>&lt;span class="o">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nx">1&lt;/span>&lt;span class="o">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s">&amp;#34; &amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="cp">-}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">{{-&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nx">$desc&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">:=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="na">.Get&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nx">1&lt;/span>&lt;span class="o">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nx">markdownify&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="cp">-}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line hl">&lt;span class="cl">&lt;span class="cp">{{-&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nx">$filtered&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">:=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nx">where&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nx">site&lt;/span>&lt;span class="na">.RegularPages&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s">&amp;#34;Title&amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nx">$title&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="cp">-}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">{{-&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nx">$first_match&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">:=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">index&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nx">$filtered&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nx">0&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="cp">-}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">{{-&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">with&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nx">$first_match&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="cp">-}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cp">{{-&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">if&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nx">$anchor&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="cp">-}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cp">{{-&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nx">$anchor&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">printf&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s">`#%s`&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nx">$anchor&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="cp">-}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cp">{{-&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">end&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="cp">-}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cp">{{-&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nx">$anchor&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nx">$anchor&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nx">default&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s">&amp;#34;&amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="cp">-}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line hl">&lt;span class="cl"> &lt;span class="cp">{{-&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nx">$desc&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nx">$desc&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nx">default&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="na">.Title&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="cp">-}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line hl">&lt;span class="cl"> &lt;span class="cp">{{-&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="k">printf&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s">`&amp;lt;a href=&amp;#34;%s%s&amp;#34;&amp;gt;%s&amp;lt;/a&amp;gt;`&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="na">.RelPermalink&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nx">$anchor&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nx">$desc&lt;/span>&lt;span class="o">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nx">safeHTML&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="cp">-}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">{{-&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">else&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="cp">-}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cp">{{-&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="nx">errorf&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s">`%s: Page titled &amp;#34;%s&amp;#34; not found`&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="na">.Position&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nx">$title&lt;/span>&lt;span class="o">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="cp">-}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">{{-&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">end&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="cp">-}}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="src-block-caption">
&lt;span class="src-block-number">&lt;a href="#code-snippet--titleref-sc">Code Snippet 2&lt;/a>:&lt;/span>
&lt;code>titleref&lt;/code> Shortcode
&lt;/div>
&lt;p>This shortcode is designed to take up to two arguments:&lt;/p>
&lt;dl>
&lt;dt>title (+anchor)&lt;/dt>
&lt;dd>The first argument can be just the title of the
post that we want to link (e.g. &lt;em>&amp;ldquo;My post&amp;rdquo;&lt;/em>). Optionally, it can
also be followed by an anchor in that post, separated by &amp;ldquo;#&amp;rdquo;
(e.g. &lt;em>&amp;ldquo;My post#some-heading&amp;rdquo;&lt;/em>).&lt;/dd>
&lt;dt>(description)&lt;/dt>
&lt;dd>The second argument is optional, and it&amp;rsquo;s the link
description. If this argument is not set, the description is set to
the post&amp;rsquo;s title.&lt;/dd>
&lt;/dl>
&lt;details title="Click to expand">
&lt;summary>How this shortcode works&lt;/summary>
&lt;div class="details">
&lt;ul>
&lt;li>In lines &lt;a href="#org-coderef--4922be-2">2&lt;/a> and &lt;a href="#org-coderef--4922be-3">3&lt;/a>, the title and
anchor portions are parsed from the first argument.&lt;/li>
&lt;li>In line &lt;a href="#org-coderef--4922be-4">4&lt;/a>, if the description is specified using a
second argument, it&amp;rsquo;s converted to HTML using &lt;code>markdownify&lt;/code>.&lt;/li>
&lt;li>✨ &lt;a href="#org-coderef--4922be-5">Line 5&lt;/a> is the main logic &amp;ndash; It
returned a list of all the pages whose &lt;em>Title&lt;/em> matches the title
parsed from the first argument.
&lt;mark>This list should have only 1 element as the assumption is that all
blog posts have unique titles.&lt;/mark>&lt;/li>
&lt;li>The first (and only) &lt;em>page&lt;/em> element of that list is saved on
&lt;code>$first_match&lt;/code> in line &lt;a href="#org-coderef--4922be-6">6&lt;/a>.&lt;/li>
&lt;li>If the &lt;em>Title&lt;/em> based search was successfully in that main logic,
&lt;code>$first_match&lt;/code> won&amp;rsquo;t be &lt;em>nil&lt;/em>. In line &lt;a href="#org-coderef--4922be-12">12&lt;/a>,
the link description is set to the &lt;code>.Title&lt;/code> from that page object,
if a description wasn&amp;rsquo;t already set using the second
argument. Finally an HTML link is printed by using &lt;code>.RelPermalink&lt;/code>
(&lt;em>relative permalink&lt;/em>) from the &lt;em>page&lt;/em> object and the description.&lt;/li>
&lt;li>If the &lt;em>Title&lt;/em> based search fails in the main logic, an error is
printed on line &lt;a href="#org-coderef--4922be-15">15&lt;/a>.&lt;/li>
&lt;/ul>
&lt;/div>
&lt;/details>
&lt;details title="Click to expand">
&lt;summary>Examples of using the &lt;code>titleref&lt;/code> shortcode (for Markdown users)&lt;/summary>
&lt;div class="details">
&lt;ul>
&lt;li>&lt;code class="code-inline language-md">{{&lt;span class="p">&amp;lt;&lt;/span> &lt;span class="nt">titleref&lt;/span> &lt;span class="err">&amp;#34;&lt;/span>&lt;span class="na">TITLE&lt;/span>&lt;span class="err">&amp;#34;&lt;/span> &lt;span class="p">&amp;gt;&lt;/span>}}&lt;/code> &amp;ndash; Link to a page
with that &lt;em>TITLE&lt;/em> and set the link description to be the same as the
&lt;em>TITLE&lt;/em>.&lt;/li>
&lt;li>&lt;code class="code-inline language-md">{{&lt;span class="p">&amp;lt;&lt;/span> &lt;span class="nt">titleref&lt;/span> &lt;span class="err">&amp;#34;&lt;/span>&lt;span class="na">TITLE&lt;/span>&lt;span class="err">&amp;#34;&lt;/span> &lt;span class="err">&amp;#34;&lt;/span>&lt;span class="na">DESC&lt;/span>&lt;span class="err">&amp;#34;&lt;/span> &lt;span class="p">&amp;gt;&lt;/span>}}&lt;/code> &amp;ndash; Link to a
page with that &lt;em>TITLE&lt;/em>, with &lt;em>DESC&lt;/em> as description.&lt;/li>
&lt;li>&lt;code class="code-inline language-md">{{&lt;span class="p">&amp;lt;&lt;/span> &lt;span class="nt">titleref&lt;/span> &lt;span class="err">&amp;#34;&lt;/span>&lt;span class="na">TITLE&lt;/span>&lt;span class="err">#&lt;/span>&lt;span class="na">ANCHOR&lt;/span>&lt;span class="err">&amp;#34;&lt;/span> &lt;span class="err">&amp;#34;&lt;/span>&lt;span class="na">DESC&lt;/span>&lt;span class="err">&amp;#34;&lt;/span> &lt;span class="p">&amp;gt;&lt;/span>}}&lt;/code> &amp;ndash;
Link to an &lt;em>ANCHOR&lt;/em> in a page with that &lt;em>TITLE&lt;/em>, with &lt;em>DESC&lt;/em> as
description.&lt;/li>
&lt;/ul>
&lt;/div>
&lt;/details>
&lt;h2 id="titleref-org-macro">&lt;code>titleref&lt;/code> Org macro&amp;nbsp;&lt;a class="headline-hash no-text-decoration" href="#titleref-org-macro">#&lt;/a>&lt;/h2>
&lt;p>But the fun doesn&amp;rsquo;t end here for an Org mode user! 😃&lt;/p>
&lt;p>I do not prefer using Hugo shortcodes directly in my Org source. So I
created an Org macro to wrap this shortcode.&lt;/p>
&lt;p>&lt;a id="code-snippet--titleref-org-macro">&lt;/a>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-org" data-lang="org">&lt;span class="line">&lt;span class="cl">&lt;span class="cs">#+macro&lt;/span>&lt;span class="c">: titleref @@hugo:{{&amp;lt; titleref &amp;#34;$1&amp;#34; &amp;#34;@@ $2 @@hugo:&amp;#34; &amp;gt;}}@@&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="src-block-caption">
&lt;span class="src-block-number">&lt;a href="#code-snippet--titleref-org-macro">Code Snippet 3&lt;/a>:&lt;/span>
&lt;code>titleref&lt;/code> Org macro
&lt;/div>
&lt;p>Now &lt;code class="code-inline language-org">&lt;span class="nb">{{{titleref(titleref: Referencing Hugo posts by their titles,)}}}&lt;/span>&lt;/code> will export to &lt;a href="https://scripter.co/titleref-referencing-hugo-posts-by-their-titles/">titleref: Referencing Hugo posts by their titles&lt;/a>.&lt;/p>
&lt;p>Here are some example uses of this macro:&lt;/p>
&lt;ul>
&lt;li>&lt;code class="code-inline language-org">&lt;span class="nb">{{{titleref(TITLE,)}}}&lt;/span>&lt;/code> &amp;ndash; Link to a page
with that &lt;em>TITLE&lt;/em> and set the link description to be the same as the
&lt;em>TITLE&lt;/em>.&lt;/li>
&lt;li>&lt;code class="code-inline language-org">&lt;span class="nb">{{{titleref(TITLE,DESC)}}}&lt;/span>&lt;/code> &amp;ndash; Link to a page
with that &lt;em>TITLE&lt;/em>, with &lt;em>DESC&lt;/em> as description.&lt;/li>
&lt;li>&lt;code class="code-inline language-org">&lt;span class="nb">{{{titleref(TITLE#ANCHOR,DESC)}}}&lt;/span>&lt;/code> &amp;ndash; Link to
an &lt;em>ANCHOR&lt;/em> in a page with that &lt;em>TITLE&lt;/em>, with &lt;em>DESC&lt;/em> as description.&lt;/li>
&lt;/ul>
&lt;h2 id="summary">Summary&amp;nbsp;&lt;a class="headline-hash no-text-decoration" href="#summary">#&lt;/a>&lt;/h2>
&lt;p>By using the &lt;code>titleref&lt;/code> shortcode (or Org macro) instead of &lt;code>relref&lt;/code>,
we now have a tremendous reduction of redundancy.&lt;/p>
&lt;dl>
&lt;dt>&lt;a href="#org-target--relref-macro-example">Before&lt;/a>&lt;/dt>
&lt;dd>&lt;ul>
&lt;li>Org mode: &lt;code class="code-inline language-org">&lt;span class="nb">{{{relref(titleref: Referencing Hugo posts by their titles,titleref-referencing-hugo-posts-by-their-titles)}}}&lt;/span>&lt;/code>&lt;/li>
&lt;li>Markdown: &lt;code class="code-inline language-md">[&lt;span class="nt">titleref: Referencing Hugo posts by their titles&lt;/span>](&lt;span class="na">{{&amp;lt; relref &amp;#34;titleref-referencing-hugo-posts-by-their-titles&amp;#34; &amp;gt;}}&lt;/span>)&lt;/code>&lt;/li>
&lt;/ul>
&lt;/dd>
&lt;dt>Now&lt;/dt>
&lt;dd>&lt;ul>
&lt;li>Org mode: &lt;code class="code-inline language-org">&lt;span class="nb">{{{titleref(titleref: Referencing Hugo posts by their titles,)}}}&lt;/span>&lt;/code>&lt;/li>
&lt;li>Markdown: &lt;code class="code-inline language-md">{{&lt;span class="p">&amp;lt;&lt;/span> &lt;span class="nt">titleref&lt;/span> &lt;span class="err">&amp;#34;&lt;/span>&lt;span class="na">titleref:&lt;/span> &lt;span class="na">Referencing&lt;/span> &lt;span class="na">Hugo&lt;/span> &lt;span class="na">posts&lt;/span> &lt;span class="na">by&lt;/span> &lt;span class="na">their&lt;/span> &lt;span class="na">titles&lt;/span>&lt;span class="err">&amp;#34;&lt;/span> &lt;span class="p">&amp;gt;&lt;/span>}}&lt;/code>&lt;/li>
&lt;/ul>
&lt;/dd>
&lt;/dl></description><author>Kaushal.Modi@fakeEmailToMakeValidatorHappy.com (Kaushal Modi)</author><category domain="https://scripter.co/categories/hugo">hugo</category><category domain="https://scripter.co/series/hugo-shortcodes">Hugo Shortcodes</category><category domain="https://scripter.co/tags/shortcodes">shortcodes</category><category domain="https://scripter.co/tags/cross-referencing">cross-referencing</category><category domain="https://scripter.co/tags/100daystooffload">100DaysToOffload</category><category domain="https://scripter.co/tags/org-macro">org-macro</category><guid>https://scripter.co/titleref-referencing-hugo-posts-by-their-titles/</guid><pubDate>Tue, 01 Mar 2022 00:20:00 -0500</pubDate></item></channel></rss>