<?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>Automation on Haseeb Majid</title>
    <link>https://haseebmajid.dev/tags/automation/</link>
    <description>Recent content in Automation on Haseeb Majid</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <lastBuildDate>Mon, 20 Mar 2023 00:00:00 +0000</lastBuildDate><atom:link href="https://haseebmajid.dev/tags/automation/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>How to Create New Posts on Hugo Using Archetypes</title>
      <link>https://haseebmajid.dev/posts/2023-03-20--how-to-create-new-posts-on-hugo-using-archetypes-/</link>
      <pubDate>Mon, 20 Mar 2023 00:00:00 +0000</pubDate>
      <author>Me</author>
      <guid>https://haseebmajid.dev/posts/2023-03-20--how-to-create-new-posts-on-hugo-using-archetypes-/</guid>
      <description>&lt;p&gt;In this post, I will go over how you can use Hugo&amp;rsquo;s archetypes to quickly create new posts.
I have previously used NetlifyCMS to help create new posts, but recently I have found that to be
a bit overkill for my blog.&lt;/p&gt;
&lt;p&gt;So I decided to simplify my workflow by using Hugo&amp;rsquo;s archetypes &lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;. Archetypes allow us to create templates
markdown files, which is then used to create our blog posts.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>In this post, I will go over how you can use Hugo&rsquo;s archetypes to quickly create new posts.
I have previously used NetlifyCMS to help create new posts, but recently I have found that to be
a bit overkill for my blog.</p>
<p>So I decided to simplify my workflow by using Hugo&rsquo;s archetypes <sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>. Archetypes allow us to create templates
markdown files, which is then used to create our blog posts.</p>
<h2 id="archetypes">Archetypes</h2>
<p>First, let&rsquo;s create a new archetype we will call <code>post-bundle</code></p>
<p>Create a new folder at the root of your project called <code>archetypes</code> (i.e. <code>mkdir archetypes</code>).
Then inside the <code>archetype</code> folder, create a structure that looks like this.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">├── post-bundle
</span></span><span class="line"><span class="cl">│   ├── images
</span></span><span class="line"><span class="cl">│   └── index.md
</span></span></code></pre></div><h3 id="page-bundles">Page Bundles</h3>
<p>We will be using a page bundle, so we keep all the content related to our post in a single folder, like the images <sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>.
All we need to do is create an <code>index.md</code> which will contain the content we show on our Hugo site.</p>
<h3 id="indexmd">index.md</h3>
<p>Our <code>index.md</code> file will look something like this:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-md" data-lang="md"><span class="line"><span class="cl"><span class="nn">---</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">title</span><span class="p">:</span><span class="w"> </span>{{<span class="w"> </span><span class="l">slicestr (replace .Name &#34;-&#34; &#34; &#34;) 11 | title }}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">date</span><span class="p">:</span><span class="w"> </span>{{<span class="w"> </span><span class="l">dateFormat &#34;2006-01-02&#34; .Date }}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">canonicalURL</span><span class="p">:</span><span class="w"> </span><span class="l">https://haseebmajid.dev/posts/{{.Name}}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">tags</span><span class="p">:</span><span class="w"> </span><span class="p">[]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nn">---</span><span class="w">
</span></span></span></code></pre></div><p>Let&rsquo;s break this file down:</p>
<p><code>title: {{ slicestr (replace .Name &quot;-&quot; &quot; &quot;) 11 | title }}</code></p>
<p>Here we are using go tempting to take a variable <code>.Name</code>. For example if
<code>.Name = 2023-03-20--how-to-create-new-posts-on-hugo-using-archetypes-</code>
<code>title:  How to Create New Posts on Hugo Using Archetypes</code></p>
<p>You can see we strip the first <code>11</code> characters to strip the date of the title.
Then we move all <code>-</code> hyphens and replace them with blank spaces. Finally, we convert
it to a &ldquo;title&rdquo; case which will capitalize certain words such as <code>Hugo</code> and <code>New</code> but not <code>on</code>.</p>
<p>Next, we have:</p>
<p><code>date: {{ dateFormat &quot;2006-01-02&quot; .Date }}</code></p>
<p>This is just formatting the date to the format we want, in my case I want the date to be <code>YYYY-MM-DD</code> <sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup>.</p>
<h2 id="post">Post</h2>
<p>Now that we have a template, let&rsquo;s look at how we can create a new post. We will use a script to create new posts.
Let&rsquo;s create a new script at <code>script/add</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="cp">#!/usr/bin/env bash
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">TITLE</span><span class="o">=</span><span class="si">${</span><span class="nv">1</span><span class="k">:-</span><span class="si">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">TITLE_SLUG</span><span class="o">=</span><span class="s2">&#34;</span><span class="k">$(</span><span class="nb">echo</span> -n <span class="s2">&#34;</span><span class="nv">$TITLE</span><span class="s2">&#34;</span> <span class="p">|</span> sed -e <span class="s1">&#39;s/[^[:alnum:]]/-/g&#39;</span> <span class="p">|</span> tr -s <span class="s1">&#39;-&#39;</span> <span class="p">|</span> tr A-Z a-z<span class="k">)</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">DATE</span><span class="o">=</span><span class="s2">&#34;</span><span class="k">$(</span>date +<span class="s2">&#34;%F&#34;</span><span class="k">)</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">SLUG</span><span class="o">=</span><span class="s2">&#34;</span><span class="nv">$DATE</span><span class="s2">-</span><span class="nv">$TITLE_SLUG</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">git checkout -b <span class="s2">&#34;</span><span class="nv">$SLUG</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">hugo new --kind post-bundle posts/<span class="nv">$SLUG</span>
</span></span></code></pre></div><p>This script takes a title as input and then converts it into a string we can use as the folder name and this
will be the <code>.Name</code> variable. For example <code>scripts/add &quot;How to Create New Posts on Hugo using Archetypes&quot;</code>
will become <code>2023-03-18--how-to-create-new-posts-on-hugo-using-archetypes-</code>.</p>
<p>The script assumes you have a folder called <code>content/posts</code> where all of your posts are stored.
I have all of my blog posts in <code>content/posts</code>, and then I have another folder for my talks at <code>content/talks</code>.</p>
<p>In my case, I use <code>go-task</code> <sup id="fnref:4"><a href="#fn:4" class="footnote-ref" role="doc-noteref">4</a></sup> which can be used as a Makefile alternative. I have the following entry in my
<code>Taskfile.yml</code> which looks like:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="w">  </span><span class="nt">new_post</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">cmds</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">scripts/add &#34;{{.CLI_ARGS}}&#34;</span><span class="w">
</span></span></span></code></pre></div><p>Finally, I can do something like this; <code>task new_post -- &quot;How to Create New Posts on Hugo using Archetypes&quot;</code>.
This creates a new bundle at <code>content/posts/2023-03-18--how-to-create-new-posts-on-hugo-using-archetypes-</code>.
With a new <code>index.md</code>, which looks like:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-md" data-lang="md"><span class="line"><span class="cl"><span class="nn">---</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">title</span><span class="p">:</span><span class="w"> </span><span class="l">How to Create New Posts on Hugo Using Archetypes </span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">date</span><span class="p">:</span><span class="w"> </span><span class="ld">2023-03-18</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">canonicalURL</span><span class="p">:</span><span class="w"> </span><span class="l">https://haseebmajid.dev/posts/2023-03-18--how-to-create-new-posts-on-hugo-using-archetypes-</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">tags</span><span class="p">:</span><span class="w"> </span><span class="p">[]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nn">---</span><span class="w">
</span></span></span></code></pre></div><h2 id="appendix">Appendix</h2>
<ul>
<li><a href="https://randomgeekery.org/post/2017/07/hugo-archetype-templates/">Inspired by this post</a></li>
</ul>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p><a href="https://gohugo.io/content-management/archetypes/">https://gohugo.io/content-management/archetypes/</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p><a href="https://gohugo.io/content-management/page-bundles/">https://gohugo.io/content-management/page-bundles/</a>&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3">
<p><a href="https://gohugo.io/functions/format/#hugo-date-and-time-templating-reference">https://gohugo.io/functions/format/#hugo-date-and-time-templating-reference</a>&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:4">
<p><a href="https://taskfile.dev/">https://taskfile.dev/</a>&#160;<a href="#fnref:4" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    
  </channel>
</rss>
