<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hugo on Much Ado About IT</title><link>https://it.knightnet.org.uk/categories/hugo/</link><description>
Recent content about Hugo from Much Ado About IT |
Ramblings and rantings from IT Architect &amp; Designer, Julian Knight</description><generator>Hugo | gohugo.io | Theme twenty-sixteen</generator><language>en-gb</language><copyright>This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.</copyright><lastBuildDate>Mon, 24 Apr 2023 21:27:28 +0000</lastBuildDate><atom:link href="https://it.knightnet.org.uk/categories/hugo/feed.xml" rel="self" type="application/rss+xml"/><item><title>Embed a diagram in a Hugo page</title><link>https://it.knightnet.org.uk/kb/hugo/embed-diagram/</link><guid isPermaLink="true">https://it.knightnet.org.uk/kb/hugo/embed-diagram/</guid><pubDate>Fri, 14 Dec 2018 12:56:01 +0000</pubDate><guid>https://it.knightnet.org.uk/kb/hugo/embed-diagram/</guid><description><div>It is great to be able to define a diagram in code directly in your web pages. This article shows you one way to achieve that using Gravizo.</div><div>&lt;h2 id="summary">Summary&lt;/h2>
&lt;p>We want to be able to generate neat diagrams for our website. This can, of course, be done offline using Microsoft Visio
or some other diagramming tool. There are online ones too. But sometimes, we want to be able to generate a diagram
using code or we just need something quick and simple. That is where tools such as &lt;a href="http://graphviz.org/">GraphViz&lt;/a> or
&lt;a href="https://www.gravizo.com/#PlantUML">PlantUML&lt;/a> come in handy.&lt;/p>
&lt;p>But currently, there are no direct addin&amp;rsquo;s for Hugo to achieve this.&lt;/p>
&lt;p>We can, however, use an external tool to create the diagram dynamically from code embedded in the page.
There are several tools that we could use, I will update this page as and when I try those tools.&lt;/p>
&lt;h2 id="mermaidjs">MermaidJS&lt;/h2>
&lt;p>&lt;a href="https://mermaidjs.github.io/">MermaidJS&lt;/a> is a JavaScript library that you can easily embed on your page. It is widely used and well supported.&lt;/p>
&lt;p>Mermaid supports several types of diagram including: Sequence, Flowchart, Gantt (timeline), Class (beta), Git graph (beta).&lt;/p>
&lt;p>MermaidJS is available for installation on your own configuration using Node.JS or you can use the UnPkg CDN.&lt;/p>
&lt;h2 id="gravizo">Gravizo&lt;/h2>
&lt;p>We can use &lt;a href="https://www.gravizo.com/">Gravizo&lt;/a> to embed diagrams of various kinds in a web site.&lt;/p>
&lt;p>Gravizo has a number of ways to embed or access the source and supports GraphViz (DOT language), PlantUML and
UMLGraph (though there are some limitations on the latter).&lt;/p>
&lt;p>Graviso will produce the following types of diagram: Graph (DOT), UML Sequence, UML State, UML Class, Activity, SVG custom.&lt;/p>
&lt;p>You can output the diagram as SVG or PNG graphics by changing the URL.&lt;/p>
&lt;p>Note that you are using a 3rd party website if you use these methods. As always, I recommend turning off 3rd-party cookie support
in your browser to help prevent any tracking. The advantage however, is that you don&amp;rsquo;t need any JavaScript on your page.&lt;/p>
&lt;h3 id="using-a-hugo-custom-shortcode">Using a Hugo custom shortcode&lt;/h3>
&lt;p>&lt;code>shortcodes/gravizo.html&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="line">&lt;span class="cl">{{ $title := &amp;#34;Diagram&amp;#34; }}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{{ if .IsNamedParams }}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {{ with .Get &amp;#34;title&amp;#34; }}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {{ $title = . }}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {{ end }}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{{ else }}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {{ with .Get 0 }}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {{ $title = . }}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {{ end }}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{{ end }}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">figure&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">img&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">src&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#39;https://g.gravizo.com/svg?{{ .Inner }}&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">alt&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#39;{{ $title }}&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">figcaption&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>{{ $title }}&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">figcaption&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">figure&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>To use:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="line">&lt;span class="cl">{ {&lt;span class="p">&amp;lt;&lt;/span> &lt;span class="nt">gravizo&lt;/span> &lt;span class="err">&amp;#34;&lt;/span>&lt;span class="na">DOT&lt;/span> &lt;span class="na">Language&lt;/span> &lt;span class="err">(&lt;/span>&lt;span class="na">GraphViz&lt;/span>&lt;span class="err">)&lt;/span> &lt;span class="na">Example&lt;/span>&lt;span class="err">&amp;#34;&lt;/span> &lt;span class="p">&amp;gt;&lt;/span>}}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> digraph G {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> aize =&amp;#34;4,4&amp;#34;;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> main [shape=box];
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> main -&amp;gt; parse [weight=8];
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> parse -&amp;gt; execute;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> main -&amp;gt; init [style=dotted];
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> main -&amp;gt; cleanup;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> execute -&amp;gt; { make_string; printf}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> init -&amp;gt; make_string;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> edge [color=red];
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> main -&amp;gt; printf [style=bold,label=&amp;#34;100 times&amp;#34;];
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> make_string [label=&amp;#34;make a string&amp;#34;];
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> node [shape=box,style=filled,color=&amp;#34;.7 .3 1.0&amp;#34;];
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> execute -&amp;gt; compare;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{ {&lt;span class="p">&amp;lt;&lt;/span> &lt;span class="p">/&lt;/span>&lt;span class="nt">gravizo&lt;/span> &lt;span class="p">&amp;gt;&lt;/span>}}&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;figure>
&lt;img
src='https://g.gravizo.com/svg?%0a%20%20digraph%20G%20%7b%0a%20%20%20%20aize%20%3d%224%2c4%22%3b%0a%20%20%20%20main%20%5bshape%3dbox%5d%3b%0a%20%20%20%20main%20-%3e%20parse%20%5bweight%3d8%5d%3b%0a%20%20%20%20parse%20-%3e%20execute%3b%0a%20%20%20%20main%20-%3e%20init%20%5bstyle%3ddotted%5d%3b%0a%20%20%20%20main%20-%3e%20cleanup%3b%0a%20%20%20%20execute%20-%3e%20%7b%20make_string%3b%20printf%7d%0a%20%20%20%20init%20-%3e%20make_string%3b%0a%20%20%20%20edge%20%5bcolor%3dred%5d%3b%0a%20%20%20%20main%20-%3e%20printf%20%5bstyle%3dbold%2clabel%3d%22100%20times%22%5d%3b%0a%20%20%20%20make_string%20%5blabel%3d%22make%20a%20string%22%5d%3b%0a%20%20%20%20node%20%5bshape%3dbox%2cstyle%3dfilled%2ccolor%3d%22.7%20.3%201.0%22%5d%3b%0a%20%20%20%20execute%20-%3e%20compare%3b%0a%20%20%7d%0a'
alt='DOT Language (GraphViz) Example'
/>
&lt;figcaption>DOT Language (GraphViz) Example&lt;/figcaption>
&lt;/figure>
&lt;figure>
&lt;img
src='https://g.gravizo.com/svg?%0a%20%20%40startuml%3b%0a%0a%20%20actor%20User%3b%0a%20%20participant%20%22First%20Class%22%20as%20A%3b%0a%20%20participant%20%22Second%20Class%22%20as%20B%3b%0a%20%20participant%20%22Last%20Class%22%20as%20C%3b%0a%0a%20%20User%20-%3e%20A%3a%20DoWork%3b%0a%20%20activate%20A%3b%0a%0a%20%20A%20-%3e%20B%3a%20Create%20Request%3b%0a%20%20activate%20B%3b%0a%0a%20%20B%20-%3e%20C%3a%20DoWork%3b%0a%20%20activate%20C%3b%0a%0a%20%20C%20--%3e%20B%3a%20WorkDone%3b%0a%20%20destroy%20C%3b%0a%0a%20%20B%20--%3e%20A%3a%20Request%20Created%3b%0a%20%20deactivate%20B%3b%0a%0a%20%20A%20--%3e%20User%3a%20Done%3b%0a%20%20deactivate%20A%3b%0a%0a%20%20%40enduml%0a'
alt='PlantUML Example'
/>
&lt;figcaption>PlantUML Example&lt;/figcaption>
&lt;/figure>
&lt;p>Note that the UMLGraph example below from the Gravizo website doesn&amp;rsquo;t
work in this context - it is unclear why but I expect it to be
something to do with an invalid HTML entity.&lt;/p>
&lt;figure>
&lt;img
src='https://g.gravizo.com/svg?%0a%20%20%2f%2a%2a%0a%20%20%20%20%2aStructural%20Things%0a%20%20%20%20%2a%40opt%20commentname%0a%20%20%20%20%2a%40note%20Notes%20can%0a%20%20%20%20%2abe%20extended%20to%0a%20%20%20%20%2aspan%20multiple%20lines%0a%20%20%20%20%2a%2f%0a%20%20%20%20class%20Structural%7b%7d%0a%0a%20%20%20%20%2f%2a%2a%0a%20%20%20%20%2a%40opt%20all%0a%20%20%20%20%2a%40note%20Class%0a%20%20%20%20%2a%2f%0a%20%20%20%20class%20Counter%20extends%20Structural%20%7b%0a%20%20%20%20%20%20%20%20%20%20%20%20static%20public%20int%20counter%3b%0a%20%20%20%20%20%20%20%20%20%20%20%20public%20int%20getCounter%2528%2529%3b%0a%20%20%20%20%7d%0a%0a%20%20%20%20%2f%2a%2a%0a%20%20%20%20%2a%40opt%20shape%20activeclass%0a%20%20%20%20%2a%40opt%20all%0a%20%20%20%20%2a%40note%20Active%20Class%0a%20%20%20%20%2a%2f%0a%20%20%20%20class%20RunningCounter%20extends%20Counter%7b%7d%0a%0a'
alt='UMLGraph Example'
/>
&lt;figcaption>UMLGraph Example&lt;/figcaption>
&lt;/figure>
&lt;h3 id="inline-markdown-code">Inline Markdown code&lt;/h3>
&lt;p>An alternative to needing a shortcode is to embed the source directly into the page.&lt;/p>
&lt;p>Note that this method does not allow blank lines so the source is hard to read. This is because Markdown uses a blank line
as a paragraph separator.&lt;/p>
&lt;p>![Alt text](&lt;a href="https://g.gravizo.com/svg">https://g.gravizo.com/svg&lt;/a>?
@startuml;
actor User;
participant &amp;ldquo;First Class&amp;rdquo; as A;
participant &amp;ldquo;Second Class&amp;rdquo; as B;
participant &amp;ldquo;Last Class&amp;rdquo; as C;
User -&amp;gt; A: DoWork;
activate A;
A -&amp;gt; B: Create Request;
activate B;
B -&amp;gt; C: DoWork;
activate C;
C &amp;ndash;&amp;gt; B: WorkDone;
destroy C;
B &amp;ndash;&amp;gt; A: Request Created;
deactivate B;
A &amp;ndash;&amp;gt; User: Done;
deactivate A;
@enduml
)&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-markdown" data-lang="markdown">&lt;span class="line">&lt;span class="cl">![&lt;span class="nt">Alt text&lt;/span>](&lt;span class="na">https://g.gravizo.com/svg?
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">@startuml;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">actor User;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">participant &amp;#34;First Class&amp;#34; as A;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">participant &amp;#34;Second Class&amp;#34; as B;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">participant &amp;#34;Last Class&amp;#34; as C;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">User -&amp;gt; A: DoWork;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">activate A;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">A -&amp;gt; B: Create Request;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">activate B;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">B -&amp;gt; C: DoWork;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">activate C;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">C --&amp;gt; B: WorkDone;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">destroy C;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">B --&amp;gt; A: Request Created;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">deactivate B;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">A --&amp;gt; User: Done;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">deactivate A;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">@enduml
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">&lt;/span>)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This method &lt;strong>does&lt;/strong> allow the UMLGraph example to work as long as you remove
the blank lines:&lt;/p>
&lt;p>![Alt text](&lt;a href="https://g.gravizo.com/svg">https://g.gravizo.com/svg&lt;/a>?
/**
*Structural Things
*@opt commentname
*@note Notes can
*be extended to
&lt;em>span multiple lines
&lt;em>/
class Structural{}
/&lt;/em>&lt;/em>
*@opt all
&lt;em>@note Class
&lt;em>/
class Counter extends Structural {
static public int counter;
public int getCounter%28%29;
}
/&lt;/em>&lt;/em>
*@opt shape activeclass
*@opt all
*@note Active Class
*/
class RunningCounter extends Counter{}
)&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-markdown" data-lang="markdown">&lt;span class="line">&lt;span class="cl">![&lt;span class="nt">Alt text&lt;/span>](&lt;span class="na">https://g.gravizo.com/svg?
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na"> /**
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na"> *Structural Things
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na"> *@opt commentname
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na"> *@note Notes can
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na"> *be extended to
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na"> *span multiple lines
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na"> */
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na"> class Structural{}
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na"> /**
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na"> *@opt all
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na"> *@note Class
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na"> */
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na"> class Counter extends Structural {
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na"> static public int counter;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na"> public int getCounter%28%29;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na"> }
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na"> /**
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na"> *@opt shape activeclass
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na"> *@opt all
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na"> *@note Active Class
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na"> */
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na"> class RunningCounter extends Counter{}
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">&lt;/span>)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></div></description><author>Julian Knight</author><category domain="https://it.knightnet.org.uk/categories/hugo">Hugo</category><category domain="https://it.knightnet.org.uk/tags/hugo">Hugo</category><category domain="https://it.knightnet.org.uk/tags/diagrams">Diagrams</category></item><item><title>Automatically updating Hugo</title><link>https://it.knightnet.org.uk/kb/hugo/get-latest-version/</link><guid isPermaLink="true">https://it.knightnet.org.uk/kb/hugo/get-latest-version/</guid><pubDate>Tue, 29 May 2018 21:28:30 +0000</pubDate><guid>https://it.knightnet.org.uk/kb/hugo/get-latest-version/</guid><description><div>Hugo is still changing very quickly. So it is helpful to be able to easily download and install the latest version directly from GitHub.</div><div>&lt;h2 id="summary">Summary&lt;/h2>
&lt;p>The tricks are firstly to use GitHub&amp;rsquo;s &lt;code>latest&lt;/code> link for software releases and download the webpage. Secondly, to find the link to the actual software download in
the content of the page. Once you have this, you can download the latest built version file automatically, unpack it over the top of the existing files and then
delete the downloaded file.&lt;/p>
&lt;p>&lt;strong>NOTE&lt;/strong>: For hopefully obvious reasons, the Hugo server cannot be running when you run this.&lt;/p>
&lt;p>Many thanks to &lt;a href="https://discourse.gohugo.io/u/pgr">@pgr&lt;/a> on the &lt;a href="https://discourse.gohugo.io/t/clever-link-to-latest-hugo-version-download/12178">Hugo Discourse for the original idea&lt;/a>.&lt;/p>
&lt;h2 id="using-powershell-on-windows-10">Using PowerShell on Windows 10&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-PowerShell" data-lang="PowerShell">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># get-hugo.ps1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Get the latest copy of Hugo for Windows (64bit) from GitHub and install it&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># -- CHANGE THESE IF NEEDED -- #&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># The folder containing the Hugo `bin` subfolder&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$hugoRoot&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;c:\Hugo&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># A regular expression to find the right platform link name&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$hugoPlatform&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;Windows\-64bit\.zip&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Location of the Hugo executable (relative to $hugoRoot or use absolute path)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$hugoBin&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;bin&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># ---------------------------- #&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># ================================================== #&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># -- Shouldn&amp;#39;t need to change anything below here -- #&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># ================================================== #&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Set-LocationEx&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="nv">$hugoRoot&lt;/span> &lt;span class="c"># AKA `cd ...`&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Make TLS 1.2 the primary version otherwise get from most sites will fail&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">[&lt;/span>&lt;span class="no">Net.ServicePointManager&lt;/span>&lt;span class="p">]::&lt;/span>&lt;span class="n">SecurityProtocol&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;tls12, tls11, tls&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Get the GitHub page containing the latest version of Hugo&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$latest&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">Invoke-WebRequest&lt;/span> &lt;span class="n">-Uri&lt;/span> &lt;span class="n">https&lt;/span>&lt;span class="err">:&lt;/span>&lt;span class="p">//&lt;/span>&lt;span class="n">github&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">com&lt;/span>&lt;span class="p">/&lt;/span>&lt;span class="n">gohugoio&lt;/span>&lt;span class="p">/&lt;/span>&lt;span class="n">hugo&lt;/span>&lt;span class="p">/&lt;/span>&lt;span class="n">releases&lt;/span>&lt;span class="p">/&lt;/span>&lt;span class="n">latest&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Find the file details for the Windows 64bit version&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$file&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nv">$latest&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">ParsedHtml&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">links&lt;/span> &lt;span class="p">|&lt;/span> &lt;span class="nb">Where-Object&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="nv">$_&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">nameProp&lt;/span> &lt;span class="o">-match&lt;/span> &lt;span class="nv">$hugoPlatform&lt;/span>&lt;span class="p">}&lt;/span> &lt;span class="p">|&lt;/span> &lt;span class="nb">select &lt;/span>&lt;span class="n">pathname&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">nameProp&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Download the actual file&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Invoke-WebRequest&lt;/span> &lt;span class="n">-Uri&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;https://github.com/&amp;#34;&lt;/span> &lt;span class="p">+&lt;/span> &lt;span class="nv">$file&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">pathname&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">-OutFile&lt;/span> &lt;span class="nv">$file&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">nameProp&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Unpack the zip file into the `bin` folder - NOTE: This requires PowerShell v5 or above (Windows 10 1709)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">Microsoft&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">PowerShell&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Archive&lt;/span>&lt;span class="p">\&lt;/span>&lt;span class="nb">Expand-Archive&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="nv">$file&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">nameProp&lt;/span> &lt;span class="n">-DestinationPath&lt;/span> &lt;span class="nv">$hugoBin&lt;/span> &lt;span class="n">-Force&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Delete the zip file&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Remove-Item&lt;/span> &lt;span class="nv">$file&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">nameProp&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c">#EOF&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></div></description><author>Julian Knight</author><category domain="https://it.knightnet.org.uk/categories/hugo">Hugo</category><category domain="https://it.knightnet.org.uk/tags/hugo">Hugo</category><category domain="https://it.knightnet.org.uk/tags/powershell">PowerShell</category><category domain="https://it.knightnet.org.uk/tags/automation">Automation</category><category domain="https://it.knightnet.org.uk/tags/commandline">Commandline</category></item></channel></rss>