1 Commits

Author SHA1 Message Date
brent saner
64a7648fbc v1.16.2
...why didn't my docs regen hook run?
2026-01-28 09:20:34 -05:00
2 changed files with 285 additions and 169 deletions

View File

@@ -559,7 +559,7 @@ pre.rouge .gs {
<div class="details">
<span id="author" class="author">Brent Saner</span><br>
<span id="email" class="email"><a href="mailto:bts@square-r00t.net">bts@square-r00t.net</a></span><br>
<span id="revdate">Last rendered 2026-01-24 06:56:03 -0500</span>
<span id="revdate">Last rendered 2026-01-28 09:20:19 -0500</span>
</div>
<div id="toc" class="toc2">
<div id="toctitle">Table of Contents</div>
@@ -568,40 +568,50 @@ pre.rouge .gs {
<li><a href="#use">2. How do I Use SprigX?</a></li>
<li><a href="#fn">3. Functions</a>
<ul class="sectlevel2">
<li><a href="#fn_sys">3.1. System/OS/Platform</a>
<li><a href="#fn_os">3.1. Operating System</a>
<ul class="sectlevel3">
<li><a href="#fn_sys_arch">3.1.1. <code>sysArch</code></a></li>
<li><a href="#fn_sys_numcpu">3.1.2. <code>sysNumCpu</code></a></li>
<li><a href="#fn_sys_os">3.1.3. <code>sysOsName</code></a></li>
<li><a href="#fn_sys_rntm">3.1.4. <code>sysRuntime</code></a></li>
<li><a href="#fn_os_hstnm">3.1.1. <code>osHostname</code></a></li>
</ul>
</li>
<li><a href="#fn_path">3.2. Paths</a>
<li><a href="#fn_sys">3.2. System/Platform/Architecture</a>
<ul class="sectlevel3">
<li><a href="#fn_path_gnrc">3.2.1. Generic</a>
<li><a href="#fn_sys_arch">3.2.1. <code>sysArch</code></a></li>
<li><a href="#fn_sys_numcpu">3.2.2. <code>sysNumCpu</code></a></li>
<li><a href="#fn_sys_os">3.2.3. <code>sysOsName</code></a></li>
<li><a href="#fn_sys_rntm">3.2.4. <code>sysRuntime</code></a></li>
</ul>
</li>
<li><a href="#fn_path">3.3. Paths</a>
<ul class="sectlevel3">
<li><a href="#fn_path_gnrc">3.3.1. Generic</a>
<ul class="sectlevel4">
<li><a href="#fn_path_gnrc_pj">3.2.1.1. <code>pathJoin</code></a></li>
<li><a href="#fn_path_gnrc_ppj">3.2.1.2. <code>pathPipeJoin</code></a></li>
<li><a href="#fn_path_gnrc_psj">3.2.1.3. <code>pathSliceJoin</code></a></li>
<li><a href="#fn_path_gnrc_pspj">3.2.1.4. <code>pathSlicePipeJoin</code></a></li>
<li><a href="#fn_path_gnrc_psubj">3.2.1.5. <code>pathSubJoin</code></a></li>
<li><a href="#fn_path_gnrc_pj">3.3.1.1. <code>pathJoin</code></a></li>
<li><a href="#fn_path_gnrc_ppj">3.3.1.2. <code>pathPipeJoin</code></a></li>
<li><a href="#fn_path_gnrc_psj">3.3.1.3. <code>pathSliceJoin</code></a></li>
<li><a href="#fn_path_gnrc_pspj">3.3.1.4. <code>pathSlicePipeJoin</code></a></li>
<li><a href="#fn_path_gnrc_psubj">3.3.1.5. <code>pathSubJoin</code></a></li>
</ul>
</li>
<li><a href="#fn_path_os">3.2.2. OS/Platform-Tailored</a>
<li><a href="#fn_path_os">3.3.2. OS/Platform-Tailored</a>
<ul class="sectlevel4">
<li><a href="#fn_path_os_pj">3.2.2.1. <code>osPathJoin</code></a></li>
<li><a href="#fn_path_os_ppj">3.2.2.2. <code>osPathPipeJoin</code></a></li>
<li><a href="#fn_path_ossep">3.2.2.3. <code>osPathSep</code></a></li>
<li><a href="#fn_path_os_psj">3.2.2.4. <code>osPathSliceJoin</code></a></li>
<li><a href="#fn_path_os_pspj">3.2.2.5. <code>osPathSlicePipeJoin</code></a></li>
<li><a href="#fn_path_os_psubj">3.2.2.6. <code>osPathSubJoin</code></a></li>
<li><a href="#fn_path_os_pj">3.3.2.1. <code>osPathJoin</code></a></li>
<li><a href="#fn_path_os_ppj">3.3.2.2. <code>osPathPipeJoin</code></a></li>
<li><a href="#fn_path_ossep">3.3.2.3. <code>osPathSep</code></a></li>
<li><a href="#fn_path_os_psj">3.3.2.4. <code>osPathSliceJoin</code></a></li>
<li><a href="#fn_path_os_pspj">3.3.2.5. <code>osPathSlicePipeJoin</code></a></li>
<li><a href="#fn_path_os_psubj">3.3.2.6. <code>osPathSubJoin</code></a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#fn_str">3.3. Strings</a>
<li><a href="#fn_str">3.4. Strings</a>
<ul class="sectlevel3">
<li><a href="#fn_str_extindent">3.3.1. <code>extIndent</code></a></li>
<li><a href="#fn_str_extindent">3.4.1. <code>extIndent</code></a></li>
</ul>
</li>
<li><a href="#fn_dbg">3.5. Debugging</a>
<ul class="sectlevel3">
<li><a href="#fn_dbg_dump">3.5.1. <code>dump</code></a></li>
</ul>
</li>
</ul>
@@ -619,13 +629,35 @@ pre.rouge .gs {
<div class="paragraph">
<p>They provide functions that offer more enriched use cases and domain-specific data.</p>
</div>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<div class="title">Tip</div>
</td>
<td class="content">
<div class="paragraph">
<p>If you are reading this README on the Go Module Directory documentation (<a href="https://pkg.go.dev/r00t2.io/goutils/tplx/sprigx" class="bare">https://pkg.go.dev/r00t2.io/goutils/tplx/sprigx</a>)
or the directory landing page (<a href="https://git.r00t2.io/r00t2/go_goutils/src/branch/master/tplx/sprigx" class="bare">https://git.r00t2.io/r00t2/go_goutils/src/branch/master/tplx/sprigx</a>), it may not render correctly.</p>
</div>
<div class="paragraph">
<p>Be sure to view it at properly via <a href="https://git.r00t2.io/r00t2/go_goutils/src/branch/master/tplx/sprigx/README.adoc" target="_blank" rel="noopener">the AsciiDoc rendering</a>
or by downloading and viewing the <a href="https://git.r00t2.io/r00t2/go_goutils/raw/branch/master/tplx/sprigx/README.html" target="_blank" rel="noopener">HTML version</a>.</p>
</div>
</td>
</tr>
</table>
</div>
</div>
</div>
<div class="sect1">
<h2 id="use"><a class="link" href="#use">2. How do I Use SprigX?</a></h2>
<div class="sectionbody">
<div class="paragraph">
<p>The same way you would <code>sprig</code>!</p>
</div>
<details>
<summary class="title">The same way you would <code>sprig</code>!</summary>
<summary class="title">Like this.</summary>
<div class="content">
<div class="listingblock">
<div class="content">
@@ -640,22 +672,25 @@ pre.rouge .gs {
<span class="k">var</span> <span class="p">(</span>
<span class="n">txtTpl</span> <span class="o">*</span><span class="n">txtTplLib</span><span class="o">.</span><span class="n">Template</span> <span class="o">=</span> <span class="n">txtTplLib</span><span class="o">.</span>
<span class="n">New</span><span class="p">(</span><span class="s">""</span><span class="p">)</span><span class="o">.</span>
<span class="n">Funcs</span><span class="p">(</span>
<span class="n">sprigx</span><span class="o">.</span><span class="n">TxtFuncMap</span><span class="p">(),</span>
<span class="p">)</span>
<span class="n">New</span><span class="p">(</span><span class="s">""</span><span class="p">)</span><span class="o">.</span>
<span class="n">Funcs</span><span class="p">(</span>
<span class="n">sprigx</span><span class="o">.</span><span class="n">TxtFuncMap</span><span class="p">(),</span>
<span class="p">)</span>
<span class="n">htmlTpl</span> <span class="o">*</span><span class="n">htmlTplLib</span><span class="o">.</span><span class="n">Template</span> <span class="o">=</span> <span class="n">htmlTplLib</span><span class="o">.</span>
<span class="n">New</span><span class="p">(</span><span class="s">""</span><span class="p">)</span><span class="o">.</span>
<span class="n">Funcs</span><span class="p">(</span>
<span class="n">sprigx</span><span class="o">.</span><span class="n">HtmlFuncMap</span><span class="p">(),</span>
<span class="p">)</span>
<span class="n">New</span><span class="p">(</span><span class="s">""</span><span class="p">)</span><span class="o">.</span>
<span class="n">Funcs</span><span class="p">(</span>
<span class="n">sprigx</span><span class="o">.</span><span class="n">HtmlFuncMap</span><span class="p">(),</span>
<span class="p">)</span>
<span class="p">)</span></code></pre>
</div>
</div>
</div>
</details>
<div class="paragraph">
<p>They can even be combined/used together.</p>
</div>
<details>
<summary class="title">They can even be combined.</summary>
<summary class="title">Like this.</summary>
<div class="content">
<div class="listingblock">
<div class="content">
@@ -669,23 +704,23 @@ pre.rouge .gs {
<span class="p">)</span>
<span class="k">var</span> <span class="n">txtTpl</span> <span class="o">*</span><span class="n">template</span><span class="o">.</span><span class="n">Template</span> <span class="o">=</span> <span class="n">template</span><span class="o">.</span>
<span class="n">New</span><span class="p">(</span><span class="s">""</span><span class="p">)</span><span class="o">.</span>
<span class="n">Funcs</span><span class="p">(</span>
<span class="n">sprigx</span><span class="o">.</span><span class="n">TxtFuncMap</span><span class="p">(),</span>
<span class="p">)</span><span class="o">.</span>
<span class="n">Funcs</span><span class="p">(</span>
<span class="n">sprig</span><span class="o">.</span><span class="n">TxtFuncMap</span><span class="p">(),</span>
<span class="p">)</span>
<span class="n">New</span><span class="p">(</span><span class="s">""</span><span class="p">)</span><span class="o">.</span>
<span class="n">Funcs</span><span class="p">(</span>
<span class="n">sprigx</span><span class="o">.</span><span class="n">TxtFuncMap</span><span class="p">(),</span>
<span class="p">)</span><span class="o">.</span>
<span class="n">Funcs</span><span class="p">(</span>
<span class="n">sprig</span><span class="o">.</span><span class="n">TxtFuncMap</span><span class="p">(),</span>
<span class="p">)</span>
<span class="c">// Or:</span>
<span class="c">/*
var txtTpl *template.Template = template.
New("").
Funcs(
sprig.TxtFuncMap(),
).
Funcs(
sprigx.TxtFuncMap(),
)
New("").
Funcs(
sprig.TxtFuncMap(),
).
Funcs(
sprigx.TxtFuncMap(),
)
*/</span></code></pre>
</div>
</div>
@@ -697,8 +732,11 @@ var txtTpl *template.Template = template.
<div class="paragraph">
<p>For example, if both <code>sprig</code> and <code>sprigx</code> provide a function <code>foo</code>:</p>
</div>
<div class="paragraph">
<p>this will use <code>foo</code> from <code>sprigx</code></p>
</div>
<details>
<summary class="title">this will use <code>foo</code> from <code>sprigx</code></summary>
<summary class="title">(show)</summary>
<div class="content">
<div class="listingblock">
<div class="content">
@@ -717,22 +755,22 @@ var txtTpl *template.Template = template.
<span class="k">var</span> <span class="p">(</span>
<span class="n">tpl</span> <span class="o">*</span><span class="n">template</span><span class="o">.</span><span class="n">Template</span> <span class="o">=</span> <span class="n">template</span><span class="o">.</span><span class="n">Must</span><span class="p">(</span>
<span class="n">template</span><span class="o">.</span>
<span class="n">New</span><span class="p">(</span><span class="s">""</span><span class="p">)</span><span class="o">.</span>
<span class="n">Funcs</span><span class="p">(</span><span class="n">sprig</span><span class="o">.</span><span class="n">TxtFuncMap</span><span class="p">())</span><span class="o">.</span>
<span class="n">Parse</span><span class="p">(</span><span class="n">myTpl</span><span class="p">),</span>
<span class="p">)</span><span class="o">.</span>
<span class="n">Funcs</span><span class="p">(</span><span class="n">sprigx</span><span class="o">.</span><span class="n">TxtFuncMap</span><span class="p">())</span>
<span class="n">template</span><span class="o">.</span>
<span class="n">New</span><span class="p">(</span><span class="s">""</span><span class="p">)</span><span class="o">.</span>
<span class="n">Funcs</span><span class="p">(</span><span class="n">sprig</span><span class="o">.</span><span class="n">TxtFuncMap</span><span class="p">())</span><span class="o">.</span>
<span class="n">Parse</span><span class="p">(</span><span class="n">myTpl</span><span class="p">),</span>
<span class="p">)</span><span class="o">.</span>
<span class="n">Funcs</span><span class="p">(</span><span class="n">sprigx</span><span class="o">.</span><span class="n">TxtFuncMap</span><span class="p">())</span>
<span class="p">)</span></code></pre>
</div>
</div>
</div>
</details>
<div class="paragraph">
<p>whereas</p>
<p>whereas this will use <code>foo</code> from <code>sprig</code></p>
</div>
<details>
<summary class="title">this will use <code>foo</code> from <code>sprig</code></summary>
<summary class="title">(show)</summary>
<div class="content">
<div class="listingblock">
<div class="content">
@@ -751,22 +789,22 @@ var txtTpl *template.Template = template.
<span class="k">var</span> <span class="p">(</span>
<span class="n">tpl</span> <span class="o">*</span><span class="n">template</span><span class="o">.</span><span class="n">Template</span> <span class="o">=</span> <span class="n">template</span><span class="o">.</span><span class="n">Must</span><span class="p">(</span>
<span class="n">template</span><span class="o">.</span>
<span class="n">New</span><span class="p">(</span><span class="s">""</span><span class="p">)</span><span class="o">.</span>
<span class="n">Funcs</span><span class="p">(</span><span class="n">sprigx</span><span class="o">.</span><span class="n">TxtFuncMap</span><span class="p">())</span><span class="o">.</span>
<span class="n">Parse</span><span class="p">(</span><span class="n">myTpl</span><span class="p">),</span>
<span class="p">)</span><span class="o">.</span>
<span class="n">Funcs</span><span class="p">(</span><span class="n">sprig</span><span class="o">.</span><span class="n">TxtFuncMap</span><span class="p">())</span>
<span class="n">template</span><span class="o">.</span>
<span class="n">New</span><span class="p">(</span><span class="s">""</span><span class="p">)</span><span class="o">.</span>
<span class="n">Funcs</span><span class="p">(</span><span class="n">sprigx</span><span class="o">.</span><span class="n">TxtFuncMap</span><span class="p">())</span><span class="o">.</span>
<span class="n">Parse</span><span class="p">(</span><span class="n">myTpl</span><span class="p">),</span>
<span class="p">)</span><span class="o">.</span>
<span class="n">Funcs</span><span class="p">(</span><span class="n">sprig</span><span class="o">.</span><span class="n">TxtFuncMap</span><span class="p">())</span>
<span class="p">)</span></code></pre>
</div>
</div>
</div>
</details>
<div class="paragraph">
<p>and a function can even be</p>
<p>and a function can even be explicitly overridden.</p>
</div>
<details>
<summary class="title">explicitly overridden.</summary>
<summary class="title">(show)</summary>
<div class="content">
<div class="paragraph">
<p>This would override a function <code>foo</code> and <code>foo2</code> in <code>sprigx</code> from <code>foo</code> and <code>foo2</code> from <code>sprig</code>, but leave all other <code>sprig</code> functions untouched.</p>
@@ -789,19 +827,19 @@ var txtTpl *template.Template = template.
<span class="k">var</span> <span class="p">(</span>
<span class="n">overrideFuncs</span> <span class="n">template</span><span class="o">.</span><span class="n">FuncMap</span> <span class="o">=</span> <span class="n">sprig</span><span class="o">.</span><span class="n">TxtFuncMap</span><span class="p">()</span>
<span class="n">tpl</span> <span class="o">*</span><span class="n">template</span><span class="o">.</span><span class="n">Template</span> <span class="o">=</span> <span class="n">template</span><span class="o">.</span><span class="n">Must</span><span class="p">(</span>
<span class="n">template</span><span class="o">.</span>
<span class="n">New</span><span class="p">(</span><span class="s">""</span><span class="p">)</span><span class="o">.</span>
<span class="n">Funcs</span><span class="p">(</span><span class="n">sprigx</span><span class="o">.</span><span class="n">TxtFuncMap</span><span class="p">())</span><span class="o">.</span>
<span class="n">Parse</span><span class="p">(</span><span class="n">myTpl</span><span class="p">),</span>
<span class="p">)</span><span class="o">.</span>
<span class="n">Funcs</span><span class="p">(</span>
<span class="n">template</span><span class="o">.</span><span class="n">FuncMap</span><span class="p">(</span>
<span class="k">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="n">any</span><span class="p">{</span>
<span class="s">"foo"</span><span class="o">:</span> <span class="n">overrideFuncs</span><span class="p">[</span><span class="s">"foo"</span><span class="p">],</span>
<span class="s">"foo2"</span><span class="o">:</span> <span class="n">overrideFuncs</span><span class="p">[</span><span class="s">"foo2"</span><span class="p">],</span>
<span class="p">},</span>
<span class="p">),</span>
<span class="p">)</span>
<span class="n">template</span><span class="o">.</span>
<span class="n">New</span><span class="p">(</span><span class="s">""</span><span class="p">)</span><span class="o">.</span>
<span class="n">Funcs</span><span class="p">(</span><span class="n">sprigx</span><span class="o">.</span><span class="n">TxtFuncMap</span><span class="p">())</span><span class="o">.</span>
<span class="n">Parse</span><span class="p">(</span><span class="n">myTpl</span><span class="p">),</span>
<span class="p">)</span><span class="o">.</span>
<span class="n">Funcs</span><span class="p">(</span>
<span class="n">template</span><span class="o">.</span><span class="n">FuncMap</span><span class="p">(</span>
<span class="k">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="n">any</span><span class="p">{</span>
<span class="s">"foo"</span><span class="o">:</span> <span class="n">overrideFuncs</span><span class="p">[</span><span class="s">"foo"</span><span class="p">],</span>
<span class="s">"foo2"</span><span class="o">:</span> <span class="n">overrideFuncs</span><span class="p">[</span><span class="s">"foo2"</span><span class="p">],</span>
<span class="p">},</span>
<span class="p">),</span>
<span class="p">)</span>
<span class="p">)</span></code></pre>
</div>
</div>
@@ -816,27 +854,39 @@ var txtTpl *template.Template = template.
<p>Expect this list to grow over time, and potentially more frequently than the <code>sprigx</code> functions.</p>
</div>
<div class="sect2">
<h3 id="fn_sys"><a class="link" href="#fn_sys">3.1. System/OS/Platform</a></h3>
<h3 id="fn_os"><a class="link" href="#fn_os">3.1. Operating System</a></h3>
<div class="sect3">
<h4 id="fn_sys_arch"><a class="link" href="#fn_sys_arch">3.1.1. <code>sysArch</code></a></h4>
<h4 id="fn_os_hstnm"><a class="link" href="#fn_os_hstnm">3.1.1. <code>osHostname</code></a></h4>
<div class="paragraph">
<p><code>osHostname</code> simply wraps and returns the result of calling <a href="https://pkg.go.dev/os#Hostname" target="_blank" rel="noopener"><code>os.Hostname</code></a>.</p>
</div>
<div class="paragraph">
<p>As such, it comes with the same caveats - it&#8217;s possible for it to error, and it isn&#8217;t guaranteed to be an FQDN&#8201;&#8212;&#8201;it will be precisely/exactly whatever the kernel&#8217;s hostname is set as.</p>
</div>
</div>
</div>
<div class="sect2">
<h3 id="fn_sys"><a class="link" href="#fn_sys">3.2. System/Platform/Architecture</a></h3>
<div class="sect3">
<h4 id="fn_sys_arch"><a class="link" href="#fn_sys_arch">3.2.1. <code>sysArch</code></a></h4>
<div class="paragraph">
<p>Returns the <a href="https://pkg.go.dev/runtime#GOARCH" target="_blank" rel="noopener"><code>runtime.GOARCH</code></a> constant.</p>
</div>
</div>
<div class="sect3">
<h4 id="fn_sys_numcpu"><a class="link" href="#fn_sys_numcpu">3.1.2. <code>sysNumCpu</code></a></h4>
<h4 id="fn_sys_numcpu"><a class="link" href="#fn_sys_numcpu">3.2.2. <code>sysNumCpu</code></a></h4>
<div class="paragraph">
<p>Returns the value from <a href="https://pkg.go.dev/runtime#NumCPU" target="_blank" rel="noopener"><code>runtime.NumCPU</code></a>.</p>
</div>
</div>
<div class="sect3">
<h4 id="fn_sys_os"><a class="link" href="#fn_sys_os">3.1.3. <code>sysOsName</code></a></h4>
<h4 id="fn_sys_os"><a class="link" href="#fn_sys_os">3.2.3. <code>sysOsName</code></a></h4>
<div class="paragraph">
<p>Returns the <a href="https://pkg.go.dev/runtime#GOOS" target="_blank" rel="noopener"><code>runtime.GOOS</code></a> constant.</p>
</div>
</div>
<div class="sect3">
<h4 id="fn_sys_rntm"><a class="link" href="#fn_sys_rntm">3.1.4. <code>sysRuntime</code></a></h4>
<h4 id="fn_sys_rntm"><a class="link" href="#fn_sys_rntm">3.2.4. <code>sysRuntime</code></a></h4>
<div class="paragraph">
<p>This function returns a <code>map[string]string</code> of various information from the <a href="https://pkg.go.dev/runtime" target="_blank" rel="noopener"><code>runtime</code> stdlib library</a>.</p>
</div>
@@ -926,14 +976,14 @@ var txtTpl *template.Template = template.
</div>
</div>
<div class="sect2">
<h3 id="fn_path"><a class="link" href="#fn_path">3.2. Paths</a></h3>
<h3 id="fn_path"><a class="link" href="#fn_path">3.3. Paths</a></h3>
<div class="sect3">
<h4 id="fn_path_gnrc"><a class="link" href="#fn_path_gnrc">3.2.1. Generic</a></h4>
<h4 id="fn_path_gnrc"><a class="link" href="#fn_path_gnrc">3.3.1. Generic</a></h4>
<div class="paragraph">
<p>These operate similar to <a href="https://pkg.go.dev/path" target="_blank" rel="noopener">the <code>path</code> stdlib library</a> and use a fixed <code>/</code> path separator.</p>
</div>
<div class="sect4">
<h5 id="fn_path_gnrc_pj"><a class="link" href="#fn_path_gnrc_pj">3.2.1.1. <code>pathJoin</code></a></h5>
<h5 id="fn_path_gnrc_pj"><a class="link" href="#fn_path_gnrc_pj">3.3.1.1. <code>pathJoin</code></a></h5>
<div class="paragraph">
<p><code>pathJoin</code> operates <strong>exactly</strong> like <a href="https://pkg.go.dev/path#Join" target="_blank" rel="noopener"><code>path.Join</code></a> in stdlib.</p>
</div>
@@ -945,7 +995,7 @@ var txtTpl *template.Template = template.
</td>
<td class="content">
<div class="paragraph">
<p>If you are joining paths in a pipeline, you almost assuredly want <a href="#fn_path_gnrc_ppj"><code>pathPipeJoin</code></a> or <a href="#fn_path_gnrc_pspj"><code>pathSlicePipeJoin</code></a> instead.</p>
<p>If you are joining paths in a pipeline, you almost assuredly want <a href="#fn_path_gnrc_ppj"><code>pathPipeJoin</code></a> or <a href="#fn_path_gnrc_pspj"><code>pathSlicePipeJoin</code></a> instead unless you are explicitly <strong>appending</strong> a pipeline result to a path.</p>
</div>
</td>
</tr>
@@ -970,7 +1020,7 @@ var txtTpl *template.Template = template.
</div>
</div>
<div class="sect4">
<h5 id="fn_path_gnrc_ppj"><a class="link" href="#fn_path_gnrc_ppj">3.2.1.2. <code>pathPipeJoin</code></a></h5>
<h5 id="fn_path_gnrc_ppj"><a class="link" href="#fn_path_gnrc_ppj">3.3.1.2. <code>pathPipeJoin</code></a></h5>
<div class="paragraph">
<p><code>pathPipeJoin</code> operates like <a href="#fn_path_gnrc_pj"><code>pathJoin</code></a> with one deviation: the root/base path is expected to be <strong>last</strong> in the arguments.</p>
</div>
@@ -997,7 +1047,7 @@ var txtTpl *template.Template = template.
</div>
</div>
<div class="sect4">
<h5 id="fn_path_gnrc_psj"><a class="link" href="#fn_path_gnrc_psj">3.2.1.3. <code>pathSliceJoin</code></a></h5>
<h5 id="fn_path_gnrc_psj"><a class="link" href="#fn_path_gnrc_psj">3.3.1.3. <code>pathSliceJoin</code></a></h5>
<div class="paragraph">
<p><code>pathSliceJoin</code> joins a slice of path segment strings (<code>[]string</code>) instead of a variadic sequence of strings.</p>
</div>
@@ -1035,7 +1085,7 @@ a/b/c
</div>
</div>
<div class="sect4">
<h5 id="fn_path_gnrc_pspj"><a class="link" href="#fn_path_gnrc_pspj">3.2.1.4. <code>pathSlicePipeJoin</code></a></h5>
<h5 id="fn_path_gnrc_pspj"><a class="link" href="#fn_path_gnrc_pspj">3.3.1.4. <code>pathSlicePipeJoin</code></a></h5>
<div class="paragraph">
<p><code>pathSlicePipeJoin</code> operates like <a href="#fn_path_gnrc_ppj"><code>pathPipeJoin</code></a> in that it is suitable for pipeline use in which the root/base path is passed in from the pipeline, but it is like <a href="#fn_path_gnrc_psj"><code>pathSliceJoin</code></a> in that it then also accepts a slice of path segments (<code>[]string</code>) to append to that base path.</p>
</div>
@@ -1072,7 +1122,7 @@ a/b/c
</div>
</div>
<div class="sect4">
<h5 id="fn_path_gnrc_psubj"><a class="link" href="#fn_path_gnrc_psubj">3.2.1.5. <code>pathSubJoin</code></a></h5>
<h5 id="fn_path_gnrc_psubj"><a class="link" href="#fn_path_gnrc_psubj">3.3.1.5. <code>pathSubJoin</code></a></h5>
<div class="paragraph">
<p><code>pathSubJoin</code> operates like <a href="#fn_path_gnrc_pj"><code>pathJoin</code></a> but it expects an explicit root/base path.</p>
</div>
@@ -1099,7 +1149,7 @@ a/b/c
</div>
</div>
<div class="sect3">
<h4 id="fn_path_os"><a class="link" href="#fn_path_os">3.2.2. OS/Platform-Tailored</a></h4>
<h4 id="fn_path_os"><a class="link" href="#fn_path_os">3.3.2. OS/Platform-Tailored</a></h4>
<div class="paragraph">
<p>These operate similar to <a href="https://pkg.go.dev/path/filepath" target="_blank" rel="noopener">the <code>path/filepath</code> stdlib library</a>, and use the OS-specific <a href="https://pkg.go.dev/os#PathSeparator" target="_blank" rel="noopener"><code>os.PathSeparator</code></a>.</p>
</div>
@@ -1121,7 +1171,7 @@ a/b/c
</table>
</div>
<div class="sect4">
<h5 id="fn_path_os_pj"><a class="link" href="#fn_path_os_pj">3.2.2.1. <code>osPathJoin</code></a></h5>
<h5 id="fn_path_os_pj"><a class="link" href="#fn_path_os_pj">3.3.2.1. <code>osPathJoin</code></a></h5>
<div class="paragraph">
<p><code>osPathJoin</code> operates <strong>exactly</strong> like <a href="https://pkg.go.dev/path/filepath#Join" target="_blank" rel="noopener"><code>path/filepath.Join</code></a> in stdlib.</p>
</div>
@@ -1133,7 +1183,7 @@ a/b/c
</td>
<td class="content">
<div class="paragraph">
<p>If you are joining paths in a pipeline, you almost assuredly want <a href="#fn_path_os_ppj"><code>osPathPipeJoin</code></a> or <a href="#fn_path_os_pspj"><code>osPathSlicePipeJoin</code></a> instead.</p>
<p>If you are joining paths in a pipeline, you almost assuredly want <a href="#fn_path_os_ppj"><code>osPathPipeJoin</code></a> or <a href="#fn_path_os_pspj"><code>osPathSlicePipeJoin</code></a> instead unless you are explicitly <strong>appending</strong> a pipeline result to a path.</p>
</div>
</td>
</tr>
@@ -1189,7 +1239,7 @@ C:/a/b/c</code></pre>
</table>
</div>
<div class="sect4">
<h5 id="fn_path_os_ppj"><a class="link" href="#fn_path_os_ppj">3.2.2.2. <code>osPathPipeJoin</code></a></h5>
<h5 id="fn_path_os_ppj"><a class="link" href="#fn_path_os_ppj">3.3.2.2. <code>osPathPipeJoin</code></a></h5>
<div class="paragraph">
<p><code>osPathPipeJoin</code> operates like <a href="#fn_path_gnrc_ppj"><code>pathPipeJoin</code></a> (except using OS-specific path separators).</p>
</div>
@@ -1243,7 +1293,7 @@ C:/a/b/c</code></pre>
</table>
</div>
<div class="sect4">
<h5 id="fn_path_ossep"><a class="link" href="#fn_path_ossep">3.2.2.3. <code>osPathSep</code></a></h5>
<h5 id="fn_path_ossep"><a class="link" href="#fn_path_ossep">3.3.2.3. <code>osPathSep</code></a></h5>
<div class="paragraph">
<p><code>osPathSep</code> returns the <a href="https://pkg.go.dev/os#PathSeparator" target="_blank" rel="noopener"><code>os.PathSeparator</code></a> for this OS.</p>
</div>
@@ -1287,7 +1337,7 @@ C:/a/b/c</code></pre>
</table>
</div>
<div class="sect4">
<h5 id="fn_path_os_psj"><a class="link" href="#fn_path_os_psj">3.2.2.4. <code>osPathSliceJoin</code></a></h5>
<h5 id="fn_path_os_psj"><a class="link" href="#fn_path_os_psj">3.3.2.4. <code>osPathSliceJoin</code></a></h5>
<div class="paragraph">
<p><code>osPathSliceJoin</code> operates like <a href="#fn_path_gnrc_psj"><code>pathSliceJoin</code></a> but with OS-specific path separators.</p>
</div>
@@ -1352,7 +1402,7 @@ a/b/c
</table>
</div>
<div class="sect4">
<h5 id="fn_path_os_pspj"><a class="link" href="#fn_path_os_pspj">3.2.2.5. <code>osPathSlicePipeJoin</code></a></h5>
<h5 id="fn_path_os_pspj"><a class="link" href="#fn_path_os_pspj">3.3.2.5. <code>osPathSlicePipeJoin</code></a></h5>
<div class="paragraph">
<p><code>osPathSlicePipeJoin</code> operates like <a href="#fn_path_gnrc_pspj"><code>pathSlicePipeJoin</code></a> but with OS-specific separators.</p>
</div>
@@ -1415,7 +1465,7 @@ a/b/c
</table>
</div>
<div class="sect4">
<h5 id="fn_path_os_psubj"><a class="link" href="#fn_path_os_psubj">3.2.2.6. <code>osPathSubJoin</code></a></h5>
<h5 id="fn_path_os_psubj"><a class="link" href="#fn_path_os_psubj">3.3.2.6. <code>osPathSubJoin</code></a></h5>
<div class="paragraph">
<p><code>osPathSubJoin</code> operates like <a href="#fn_path_gnrc_psubj"><code>pathSubJoin</code></a> but with OS-specific separators.</p>
</div>
@@ -1470,15 +1520,29 @@ a/b/c
</div>
</div>
<div class="sect2">
<h3 id="fn_str"><a class="link" href="#fn_str">3.3. Strings</a></h3>
<h3 id="fn_str"><a class="link" href="#fn_str">3.4. Strings</a></h3>
<div class="sect3">
<h4 id="fn_str_extindent"><a class="link" href="#fn_str_extindent">3.3.1. <code>extIndent</code></a></h4>
<h4 id="fn_str_extindent"><a class="link" href="#fn_str_extindent">3.4.1. <code>extIndent</code></a></h4>
<div class="paragraph">
<p><code>extIndent</code> allows for a MUCH more flexible indenter than the <code>sprig</code> <code>indent</code> function.</p>
</div>
<div class="paragraph">
<p>It works with both Windows (<code>\r\n</code>) and POSIX (<code>\n</code>) linebreaks.</p>
</div>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<div class="title">Tip</div>
</td>
<td class="content">
<div class="paragraph">
<p>If <code>&lt;indentString&gt;</code> is set to <code>\n</code> and <code>&lt;levels&gt;</code> is always set to <code>1</code>, this function can even be used to doubelspace text!</p>
</div>
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>It has quite a few arguments, however:</p>
</div>
@@ -1514,6 +1578,15 @@ a/b/c
</div>
</div>
</div>
<div class="sect2">
<h3 id="fn_dbg"><a class="link" href="#fn_dbg">3.5. Debugging</a></h3>
<div class="sect3">
<h4 id="fn_dbg_dump"><a class="link" href="#fn_dbg_dump">3.5.1. <code>dump</code></a></h4>
<div class="paragraph">
<p>The <code>dump</code> function calls <a href="https://pkg.go.dev/github.com/davecgh/go-spew/spew#Sdump" target="_blank" rel="noopener">the <code>Sdump</code> function</a> from <a href="https://github.com/davecgh/go-spew"><code>go-spew</code></a> (<a href="https://pkg.go.dev/github.com/davecgh/go-spew/spew" target="_blank" rel="noopener"><code>github.com/davecgh/go-spew/spew</code></a>) for whatever object(s) is/are passed to it.</p>
</div>
</div>
</div>
</div>
</div>
</div>
@@ -1525,7 +1598,7 @@ a/b/c
</div>
<div id="footer">
<div id="footer-text">
Last updated 2026-01-24 06:56:00 -0500
Last updated 2026-01-28 09:16:03 -0500
</div>
</div>
</body>

View File

@@ -7,8 +7,21 @@ docs](https://pkg.go.dev/github.com/Masterminds/sprig/v3)).
They provide functions that offer more enriched use cases and
domain-specific data.
If you are reading this README on the Go Module Directory documentation
(<https://pkg.go.dev/r00t2.io/goutils/tplx/sprigx>) or the directory
landing page
(<https://git.r00t2.io/r00t2/go_goutils/src/branch/master/tplx/sprigx>),
it may not render correctly.
Be sure to view it at properly via [the AsciiDoc
rendering](https://git.r00t2.io/r00t2/go_goutils/src/branch/master/tplx/sprigx/README.adoc)
or by downloading and viewing the [HTML
version](https://git.r00t2.io/r00t2/go_goutils/raw/branch/master/tplx/sprigx/README.html).
# How do I Use SprigX?
The same way you would `sprig`!
package main
import (
@@ -20,17 +33,19 @@ domain-specific data.
var (
txtTpl *txtTplLib.Template = txtTplLib.
New("").
Funcs(
sprigx.TxtFuncMap(),
)
New("").
Funcs(
sprigx.TxtFuncMap(),
)
htmlTpl *htmlTplLib.Template = htmlTplLib.
New("").
Funcs(
sprigx.HtmlFuncMap(),
)
New("").
Funcs(
sprigx.HtmlFuncMap(),
)
)
They can even be combined/used together.
package main
import (
@@ -41,23 +56,23 @@ domain-specific data.
)
var txtTpl *template.Template = template.
New("").
Funcs(
sprigx.TxtFuncMap(),
).
Funcs(
sprig.TxtFuncMap(),
)
New("").
Funcs(
sprigx.TxtFuncMap(),
).
Funcs(
sprig.TxtFuncMap(),
)
// Or:
/*
var txtTpl *template.Template = template.
New("").
Funcs(
sprig.TxtFuncMap(),
).
Funcs(
sprigx.TxtFuncMap(),
)
New("").
Funcs(
sprig.TxtFuncMap(),
).
Funcs(
sprigx.TxtFuncMap(),
)
*/
If a `<template>.FuncMap` is added via `.Funcs()` **after** template
@@ -66,30 +81,7 @@ parsing, it will override any functions of the same name of a
For example, if both `sprig` and `sprigx` provide a function `foo`:
package main
import (
"text/template"
"github.com/Masterminds/sprig/v3"
"r00t2.io/goutils/tplx/sprigx"
)
const (
myTpl string = `{{ "This is an example template string." | foo }}`
)
var (
tpl *template.Template = template.Must(
template.
New("").
Funcs(sprig.TxtFuncMap()).
Parse(myTpl),
).
Funcs(sprigx.TxtFuncMap())
)
whereas
this will use `foo` from `sprigx`
package main
@@ -106,15 +98,40 @@ whereas
var (
tpl *template.Template = template.Must(
template.
New("").
Funcs(sprigx.TxtFuncMap()).
Parse(myTpl),
).
Funcs(sprig.TxtFuncMap())
template.
New("").
Funcs(sprig.TxtFuncMap()).
Parse(myTpl),
).
Funcs(sprigx.TxtFuncMap())
)
and a function can even be
whereas this will use `foo` from `sprig`
package main
import (
"text/template"
"github.com/Masterminds/sprig/v3"
"r00t2.io/goutils/tplx/sprigx"
)
const (
myTpl string = `{{ "This is an example template string." | foo }}`
)
var (
tpl *template.Template = template.Must(
template.
New("").
Funcs(sprigx.TxtFuncMap()).
Parse(myTpl),
).
Funcs(sprig.TxtFuncMap())
)
and a function can even be explicitly overridden.
This would override a function `foo` and `foo2` in `sprigx` from `foo`
and `foo2` from `sprig`, but leave all other `sprig` functions
@@ -136,19 +153,19 @@ untouched.
var (
overrideFuncs template.FuncMap = sprig.TxtFuncMap()
tpl *template.Template = template.Must(
template.
New("").
Funcs(sprigx.TxtFuncMap()).
Parse(myTpl),
).
Funcs(
template.FuncMap(
map[string]any{
"foo": overrideFuncs["foo"],
"foo2": overrideFuncs["foo2"],
},
),
)
template.
New("").
Funcs(sprigx.TxtFuncMap()).
Parse(myTpl),
).
Funcs(
template.FuncMap(
map[string]any{
"foo": overrideFuncs["foo"],
"foo2": overrideFuncs["foo2"],
},
),
)
)
# Functions
@@ -156,7 +173,18 @@ untouched.
Expect this list to grow over time, and potentially more frequently than
the `sprigx` functions.
## System/OS/Platform
## Operating System
### `osHostname`
`osHostname` simply wraps and returns the result of calling
[`os.Hostname`](https://pkg.go.dev/os#Hostname).
As such, it comes with the same caveats - its possible for it to error,
and it isnt guaranteed to be an FQDNit will be precisely/exactly
whatever the kernels hostname is set as.
## System/Platform/Architecture
### `sysArch`
@@ -277,7 +305,8 @@ library](https://pkg.go.dev/path) and use a fixed `/` path separator.
[`path.Join`](https://pkg.go.dev/path#Join) in stdlib.
If you are joining paths in a pipeline, you almost assuredly want
[](#fn_path_gnrc_ppj) or [](#fn_path_gnrc_pspj) instead.
[](#fn_path_gnrc_ppj) or [](#fn_path_gnrc_pspj) instead unless you are
explicitly **appending** a pipeline result to a path.
{{- pathJoin "a" "b" "c" }}
{{- pathJoin "/" "a" "b" "c" }}
@@ -384,7 +413,8 @@ path bases/roots if needed.
[`path/filepath.Join`](https://pkg.go.dev/path/filepath#Join) in stdlib.
If you are joining paths in a pipeline, you almost assuredly want
[](#fn_path_os_ppj) or [](#fn_path_os_pspj) instead.
[](#fn_path_os_ppj) or [](#fn_path_os_pspj) instead unless you are
explicitly **appending** a pipeline result to a path.
{{- osPathJoin "a" "b" "c" }}
{{- osPathJoin "/" "a" "b" "c" }}
@@ -629,6 +659,9 @@ renders as:
It works with both Windows (`\r\n`) and POSIX (`\n`) linebreaks.
If `<indentString>` is set to `\n` and `<levels>` is always set to `1`,
this function can even be used to doubelspace text!
It has quite a few arguments, however:
{{ extIndent <levels> <skipFirst> <skipEmpty> <skipWhitespace> <indentString> <input> }}
@@ -654,3 +687,13 @@ Where:
- `<input>`: The text to be indented. Because it is the last argument,
`extIndent` works with pipelined text as well.
## Debugging
### `dump`
The `dump` function calls [the `Sdump`
function](https://pkg.go.dev/github.com/davecgh/go-spew/spew#Sdump) from
[`go-spew`](https://github.com/davecgh/go-spew)
([`github.com/davecgh/go-spew/spew`](https://pkg.go.dev/github.com/davecgh/go-spew/spew))
for whatever object(s) is/are passed to it.