2 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
brent saner
9cce861b2e v1.16.1
FIXED:
* *Some* documentation weirdness on pkg.go dev rendering. It still uses
  the Markdown render by default, and it seems if you use anchor links
  in a bulletpoint list, pandoc just says "lol screw you"...

ADDED:
* tplx/sprigx tpl function `osHostname`
2026-01-28 09:16:18 -05:00
4 changed files with 401 additions and 248 deletions

View File

@@ -21,11 +21,22 @@ SprigX are extensions to https://masterminds.github.io/sprig/[the `sprig` librar
They provide functions that offer more enriched use cases and domain-specific data. They provide functions that offer more enriched use cases and domain-specific data.
[TIP]
====
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 https://git.r00t2.io/r00t2/go_goutils/src/branch/master/tplx/sprigx/README.adoc[the AsciiDoc rendering^]
or by downloading and viewing the https://git.r00t2.io/r00t2/go_goutils/raw/branch/master/tplx/sprigx/README.html[HTML version^].
====
[id="use"] [id="use"]
== How do I Use SprigX? == How do I Use SprigX?
The same way you would `sprig`!
[%collapsible] [%collapsible]
.The same way you would `sprig`! .Like this.
==== ====
[source,go] [source,go]
---- ----
@@ -40,21 +51,23 @@ import (
var ( var (
txtTpl *txtTplLib.Template = txtTplLib. txtTpl *txtTplLib.Template = txtTplLib.
New(""). New("").
Funcs( Funcs(
sprigx.TxtFuncMap(), sprigx.TxtFuncMap(),
) )
htmlTpl *htmlTplLib.Template = htmlTplLib. htmlTpl *htmlTplLib.Template = htmlTplLib.
New(""). New("").
Funcs( Funcs(
sprigx.HtmlFuncMap(), sprigx.HtmlFuncMap(),
) )
) )
---- ----
==== ====
They can even be combined/used together.
[%collapsible] [%collapsible]
.They can even be combined/used together. .Like this.
==== ====
[source,go] [source,go]
---- ----
@@ -68,23 +81,23 @@ import (
) )
var txtTpl *template.Template = template. var txtTpl *template.Template = template.
New(""). New("").
Funcs( Funcs(
sprigx.TxtFuncMap(), sprigx.TxtFuncMap(),
). ).
Funcs( Funcs(
sprig.TxtFuncMap(), sprig.TxtFuncMap(),
) )
// Or: // Or:
/* /*
var txtTpl *template.Template = template. var txtTpl *template.Template = template.
New(""). New("").
Funcs( Funcs(
sprig.TxtFuncMap(), sprig.TxtFuncMap(),
). ).
Funcs( Funcs(
sprigx.TxtFuncMap(), sprigx.TxtFuncMap(),
) )
*/ */
---- ----
==== ====
@@ -93,8 +106,42 @@ If a `<template>.FuncMap` is added via `.Funcs()` *after* template parsing, it w
For example, if both `sprig` and `sprigx` provide a function `foo`: For example, if both `sprig` and `sprigx` provide a function `foo`:
this will use `foo` from `sprigx`
[%collapsible] [%collapsible]
.this will use `foo` from `sprigx` .(show)
====
[source,go]
----
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 `sprig`
[%collapsible]
.(show)
==== ====
[source,go] [source,go]
---- ----
@@ -113,52 +160,20 @@ const (
var ( var (
tpl *template.Template = template.Must( tpl *template.Template = template.Must(
template. template.
New(""). New("").
Funcs(sprig.TxtFuncMap()). Funcs(sprigx.TxtFuncMap()).
Parse(myTpl), Parse(myTpl),
). ).
Funcs(sprigx.TxtFuncMap()) Funcs(sprig.TxtFuncMap())
) )
---- ----
==== ====
whereas and a function can even be explicitly overridden.
[%collapsible] [%collapsible]
.this will use `foo` from `sprig` .(show)
====
[source,go]
----
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
[%collapsible]
.explicitly overridden.
==== ====
This would override a function `foo` and `foo2` in `sprigx` from `foo` and `foo2` from `sprig`, but leave all other `sprig` functions untouched. This would override a function `foo` and `foo2` in `sprigx` from `foo` and `foo2` from `sprig`, but leave all other `sprig` functions untouched.
@@ -180,19 +195,19 @@ const (
var ( var (
overrideFuncs template.FuncMap = sprig.TxtFuncMap() overrideFuncs template.FuncMap = sprig.TxtFuncMap()
tpl *template.Template = template.Must( tpl *template.Template = template.Must(
template. template.
New(""). New("").
Funcs(sprigx.TxtFuncMap()). Funcs(sprigx.TxtFuncMap()).
Parse(myTpl), Parse(myTpl),
). ).
Funcs( Funcs(
template.FuncMap( template.FuncMap(
map[string]any{ map[string]any{
"foo": overrideFuncs["foo"], "foo": overrideFuncs["foo"],
"foo2": overrideFuncs["foo2"], "foo2": overrideFuncs["foo2"],
}, },
), ),
) )
) )
---- ----
==== ====
@@ -201,8 +216,17 @@ var (
== Functions == Functions
Expect this list to grow over time, and potentially more frequently than the `sprigx` functions. Expect this list to grow over time, and potentially more frequently than the `sprigx` functions.
[id="fn_os"]
=== Operating System
[id="fn_os_hstnm"]
==== `osHostname`
`osHostname` simply wraps and returns the result of calling https://pkg.go.dev/os#Hostname[`os.Hostname`^].
As such, it comes with the same caveats - it's possible for it to error, and it isn't guaranteed to be an FQDN -- it will be precisely/exactly whatever the kernel's hostname is set as.
[id="fn_sys"] [id="fn_sys"]
=== System/OS/Platform === System/Platform/Architecture
[id="fn_sys_arch"] [id="fn_sys_arch"]
==== `sysArch` ==== `sysArch`

View File

@@ -559,7 +559,7 @@ pre.rouge .gs {
<div class="details"> <div class="details">
<span id="author" class="author">Brent Saner</span><br> <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="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>
<div id="toc" class="toc2"> <div id="toc" class="toc2">
<div id="toctitle">Table of Contents</div> <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="#use">2. How do I Use SprigX?</a></li>
<li><a href="#fn">3. Functions</a> <li><a href="#fn">3. Functions</a>
<ul class="sectlevel2"> <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"> <ul class="sectlevel3">
<li><a href="#fn_sys_arch">3.1.1. <code>sysArch</code></a></li> <li><a href="#fn_os_hstnm">3.1.1. <code>osHostname</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>
</ul> </ul>
</li> </li>
<li><a href="#fn_path">3.2. Paths</a> <li><a href="#fn_sys">3.2. System/Platform/Architecture</a>
<ul class="sectlevel3"> <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"> <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_pj">3.3.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_ppj">3.3.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_psj">3.3.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_pspj">3.3.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_psubj">3.3.1.5. <code>pathSubJoin</code></a></li>
</ul> </ul>
</li> </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"> <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_pj">3.3.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_os_ppj">3.3.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_ossep">3.3.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_psj">3.3.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_pspj">3.3.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_psubj">3.3.2.6. <code>osPathSubJoin</code></a></li>
</ul> </ul>
</li> </li>
</ul> </ul>
</li> </li>
<li><a href="#fn_str">3.3. Strings</a> <li><a href="#fn_str">3.4. Strings</a>
<ul class="sectlevel3"> <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> </ul>
</li> </li>
</ul> </ul>
@@ -619,13 +629,35 @@ pre.rouge .gs {
<div class="paragraph"> <div class="paragraph">
<p>They provide functions that offer more enriched use cases and domain-specific data.</p> <p>They provide functions that offer more enriched use cases and domain-specific data.</p>
</div> </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> </div>
<div class="sect1"> <div class="sect1">
<h2 id="use"><a class="link" href="#use">2. How do I Use SprigX?</a></h2> <h2 id="use"><a class="link" href="#use">2. How do I Use SprigX?</a></h2>
<div class="sectionbody"> <div class="sectionbody">
<div class="paragraph">
<p>The same way you would <code>sprig</code>!</p>
</div>
<details> <details>
<summary class="title">The same way you would <code>sprig</code>!</summary> <summary class="title">Like this.</summary>
<div class="content"> <div class="content">
<div class="listingblock"> <div class="listingblock">
<div class="content"> <div class="content">
@@ -640,22 +672,25 @@ pre.rouge .gs {
<span class="k">var</span> <span class="p">(</span> <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">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">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">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">sprigx</span><span class="o">.</span><span class="n">TxtFuncMap</span><span class="p">(),</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">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">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">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="n">sprigx</span><span class="o">.</span><span class="n">HtmlFuncMap</span><span class="p">(),</span>
<span class="p">)</span> <span class="p">)</span>
<span class="p">)</span></code></pre> <span class="p">)</span></code></pre>
</div> </div>
</div> </div>
</div> </div>
</details> </details>
<div class="paragraph">
<p>They can even be combined/used together.</p>
</div>
<details> <details>
<summary class="title">They can even be combined.</summary> <summary class="title">Like this.</summary>
<div class="content"> <div class="content">
<div class="listingblock"> <div class="listingblock">
<div class="content"> <div class="content">
@@ -669,23 +704,23 @@ pre.rouge .gs {
<span class="p">)</span> <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="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">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">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">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="p">)</span><span class="o">.</span>
<span class="n">Funcs</span><span class="p">(</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">sprig</span><span class="o">.</span><span class="n">TxtFuncMap</span><span class="p">(),</span>
<span class="p">)</span> <span class="p">)</span>
<span class="c">// Or:</span> <span class="c">// Or:</span>
<span class="c">/* <span class="c">/*
var txtTpl *template.Template = template. var txtTpl *template.Template = template.
New(""). New("").
Funcs( Funcs(
sprig.TxtFuncMap(), sprig.TxtFuncMap(),
). ).
Funcs( Funcs(
sprigx.TxtFuncMap(), sprigx.TxtFuncMap(),
) )
*/</span></code></pre> */</span></code></pre>
</div> </div>
</div> </div>
@@ -697,8 +732,11 @@ var txtTpl *template.Template = template.
<div class="paragraph"> <div class="paragraph">
<p>For example, if both <code>sprig</code> and <code>sprigx</code> provide a function <code>foo</code>:</p> <p>For example, if both <code>sprig</code> and <code>sprigx</code> provide a function <code>foo</code>:</p>
</div> </div>
<div class="paragraph">
<p>this will use <code>foo</code> from <code>sprigx</code></p>
</div>
<details> <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="content">
<div class="listingblock"> <div class="listingblock">
<div class="content"> <div class="content">
@@ -717,22 +755,22 @@ var txtTpl *template.Template = template.
<span class="k">var</span> <span class="p">(</span> <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">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">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">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">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="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="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">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> <span class="p">)</span></code></pre>
</div> </div>
</div> </div>
</div> </div>
</details> </details>
<div class="paragraph"> <div class="paragraph">
<p>whereas</p> <p>whereas this will use <code>foo</code> from <code>sprig</code></p>
</div> </div>
<details> <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="content">
<div class="listingblock"> <div class="listingblock">
<div class="content"> <div class="content">
@@ -751,22 +789,22 @@ var txtTpl *template.Template = template.
<span class="k">var</span> <span class="p">(</span> <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">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">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">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">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="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="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">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> <span class="p">)</span></code></pre>
</div> </div>
</div> </div>
</div> </div>
</details> </details>
<div class="paragraph"> <div class="paragraph">
<p>and a function can even be</p> <p>and a function can even be explicitly overridden.</p>
</div> </div>
<details> <details>
<summary class="title">explicitly overridden.</summary> <summary class="title">(show)</summary>
<div class="content"> <div class="content">
<div class="paragraph"> <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> <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="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">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">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">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">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">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="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="p">)</span><span class="o">.</span>
<span class="n">Funcs</span><span class="p">(</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="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="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">"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="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>
<span class="p">)</span> <span class="p">)</span>
<span class="p">)</span></code></pre> <span class="p">)</span></code></pre>
</div> </div>
</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> <p>Expect this list to grow over time, and potentially more frequently than the <code>sprigx</code> functions.</p>
</div> </div>
<div class="sect2"> <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"> <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"> <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> <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> </div>
<div class="sect3"> <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"> <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> <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> </div>
<div class="sect3"> <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"> <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> <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> </div>
<div class="sect3"> <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"> <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> <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> </div>
@@ -926,14 +976,14 @@ var txtTpl *template.Template = template.
</div> </div>
</div> </div>
<div class="sect2"> <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"> <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"> <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> <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>
<div class="sect4"> <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"> <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> <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> </div>
@@ -945,7 +995,7 @@ var txtTpl *template.Template = template.
</td> </td>
<td class="content"> <td class="content">
<div class="paragraph"> <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> </div>
</td> </td>
</tr> </tr>
@@ -970,7 +1020,7 @@ var txtTpl *template.Template = template.
</div> </div>
</div> </div>
<div class="sect4"> <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"> <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> <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> </div>
@@ -997,7 +1047,7 @@ var txtTpl *template.Template = template.
</div> </div>
</div> </div>
<div class="sect4"> <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"> <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> <p><code>pathSliceJoin</code> joins a slice of path segment strings (<code>[]string</code>) instead of a variadic sequence of strings.</p>
</div> </div>
@@ -1035,7 +1085,7 @@ a/b/c
</div> </div>
</div> </div>
<div class="sect4"> <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"> <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> <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> </div>
@@ -1072,7 +1122,7 @@ a/b/c
</div> </div>
</div> </div>
<div class="sect4"> <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"> <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> <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> </div>
@@ -1099,7 +1149,7 @@ a/b/c
</div> </div>
</div> </div>
<div class="sect3"> <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"> <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> <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> </div>
@@ -1121,7 +1171,7 @@ a/b/c
</table> </table>
</div> </div>
<div class="sect4"> <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"> <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> <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> </div>
@@ -1133,7 +1183,7 @@ a/b/c
</td> </td>
<td class="content"> <td class="content">
<div class="paragraph"> <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> </div>
</td> </td>
</tr> </tr>
@@ -1189,7 +1239,7 @@ C:/a/b/c</code></pre>
</table> </table>
</div> </div>
<div class="sect4"> <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"> <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> <p><code>osPathPipeJoin</code> operates like <a href="#fn_path_gnrc_ppj"><code>pathPipeJoin</code></a> (except using OS-specific path separators).</p>
</div> </div>
@@ -1243,7 +1293,7 @@ C:/a/b/c</code></pre>
</table> </table>
</div> </div>
<div class="sect4"> <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"> <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> <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> </div>
@@ -1287,7 +1337,7 @@ C:/a/b/c</code></pre>
</table> </table>
</div> </div>
<div class="sect4"> <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"> <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> <p><code>osPathSliceJoin</code> operates like <a href="#fn_path_gnrc_psj"><code>pathSliceJoin</code></a> but with OS-specific path separators.</p>
</div> </div>
@@ -1352,7 +1402,7 @@ a/b/c
</table> </table>
</div> </div>
<div class="sect4"> <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"> <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> <p><code>osPathSlicePipeJoin</code> operates like <a href="#fn_path_gnrc_pspj"><code>pathSlicePipeJoin</code></a> but with OS-specific separators.</p>
</div> </div>
@@ -1415,7 +1465,7 @@ a/b/c
</table> </table>
</div> </div>
<div class="sect4"> <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"> <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> <p><code>osPathSubJoin</code> operates like <a href="#fn_path_gnrc_psubj"><code>pathSubJoin</code></a> but with OS-specific separators.</p>
</div> </div>
@@ -1470,15 +1520,29 @@ a/b/c
</div> </div>
</div> </div>
<div class="sect2"> <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"> <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"> <div class="paragraph">
<p><code>extIndent</code> allows for a MUCH more flexible indenter than the <code>sprig</code> <code>indent</code> function.</p> <p><code>extIndent</code> allows for a MUCH more flexible indenter than the <code>sprig</code> <code>indent</code> function.</p>
</div> </div>
<div class="paragraph"> <div class="paragraph">
<p>It works with both Windows (<code>\r\n</code>) and POSIX (<code>\n</code>) linebreaks.</p> <p>It works with both Windows (<code>\r\n</code>) and POSIX (<code>\n</code>) linebreaks.</p>
</div> </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"> <div class="paragraph">
<p>It has quite a few arguments, however:</p> <p>It has quite a few arguments, however:</p>
</div> </div>
@@ -1514,6 +1578,15 @@ a/b/c
</div> </div>
</div> </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> </div>
</div> </div>
@@ -1525,7 +1598,7 @@ a/b/c
</div> </div>
<div id="footer"> <div id="footer">
<div id="footer-text"> <div id="footer-text">
Last updated 2026-01-24 06:56:00 -0500 Last updated 2026-01-28 09:16:03 -0500
</div> </div>
</div> </div>
</body> </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 They provide functions that offer more enriched use cases and
domain-specific data. 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? # How do I Use SprigX?
The same way you would `sprig`!
package main package main
import ( import (
@@ -20,17 +33,19 @@ domain-specific data.
var ( var (
txtTpl *txtTplLib.Template = txtTplLib. txtTpl *txtTplLib.Template = txtTplLib.
New(""). New("").
Funcs( Funcs(
sprigx.TxtFuncMap(), sprigx.TxtFuncMap(),
) )
htmlTpl *htmlTplLib.Template = htmlTplLib. htmlTpl *htmlTplLib.Template = htmlTplLib.
New(""). New("").
Funcs( Funcs(
sprigx.HtmlFuncMap(), sprigx.HtmlFuncMap(),
) )
) )
They can even be combined/used together.
package main package main
import ( import (
@@ -41,23 +56,23 @@ domain-specific data.
) )
var txtTpl *template.Template = template. var txtTpl *template.Template = template.
New(""). New("").
Funcs( Funcs(
sprigx.TxtFuncMap(), sprigx.TxtFuncMap(),
). ).
Funcs( Funcs(
sprig.TxtFuncMap(), sprig.TxtFuncMap(),
) )
// Or: // Or:
/* /*
var txtTpl *template.Template = template. var txtTpl *template.Template = template.
New(""). New("").
Funcs( Funcs(
sprig.TxtFuncMap(), sprig.TxtFuncMap(),
). ).
Funcs( Funcs(
sprigx.TxtFuncMap(), sprigx.TxtFuncMap(),
) )
*/ */
If a `<template>.FuncMap` is added via `.Funcs()` **after** template 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`: For example, if both `sprig` and `sprigx` provide a function `foo`:
package main this will use `foo` from `sprigx`
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
package main package main
@@ -106,15 +98,40 @@ whereas
var ( var (
tpl *template.Template = template.Must( tpl *template.Template = template.Must(
template. template.
New(""). New("").
Funcs(sprigx.TxtFuncMap()). Funcs(sprig.TxtFuncMap()).
Parse(myTpl), Parse(myTpl),
). ).
Funcs(sprig.TxtFuncMap()) 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` This would override a function `foo` and `foo2` in `sprigx` from `foo`
and `foo2` from `sprig`, but leave all other `sprig` functions and `foo2` from `sprig`, but leave all other `sprig` functions
@@ -136,19 +153,19 @@ untouched.
var ( var (
overrideFuncs template.FuncMap = sprig.TxtFuncMap() overrideFuncs template.FuncMap = sprig.TxtFuncMap()
tpl *template.Template = template.Must( tpl *template.Template = template.Must(
template. template.
New(""). New("").
Funcs(sprigx.TxtFuncMap()). Funcs(sprigx.TxtFuncMap()).
Parse(myTpl), Parse(myTpl),
). ).
Funcs( Funcs(
template.FuncMap( template.FuncMap(
map[string]any{ map[string]any{
"foo": overrideFuncs["foo"], "foo": overrideFuncs["foo"],
"foo2": overrideFuncs["foo2"], "foo2": overrideFuncs["foo2"],
}, },
), ),
) )
) )
# Functions # Functions
@@ -156,7 +173,18 @@ untouched.
Expect this list to grow over time, and potentially more frequently than Expect this list to grow over time, and potentially more frequently than
the `sprigx` functions. 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` ### `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. [`path.Join`](https://pkg.go.dev/path#Join) in stdlib.
If you are joining paths in a pipeline, you almost assuredly want 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" }}
{{- 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. [`path/filepath.Join`](https://pkg.go.dev/path/filepath#Join) in stdlib.
If you are joining paths in a pipeline, you almost assuredly want 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" }}
{{- 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. 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: It has quite a few arguments, however:
{{ extIndent <levels> <skipFirst> <skipEmpty> <skipWhitespace> <indentString> <input> }} {{ extIndent <levels> <skipFirst> <skipEmpty> <skipWhitespace> <indentString> <input> }}
@@ -654,3 +687,13 @@ Where:
- `<input>`: The text to be indented. Because it is the last argument, - `<input>`: The text to be indented. Because it is the last argument,
`extIndent` works with pipelined text as well. `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.

View File

@@ -0,0 +1,13 @@
package sprigx
import (
"os"
)
// osHostname returns os.Hostname()
func osHostname() (out string, err error) {
out, err = os.Hostname()
return
}