Hello,
Is there a way I can test if a variable is a single value or a list or a map or a …?
I am missing test functions like “IsList”, “IsMap”, …
Hello,
Is there a way I can test if a variable is a single value or a list or a map or a …?
I am missing test functions like “IsList”, “IsMap”, …
You can do something ala:
{{ if eq (printf "%T" true) "bool" }}
Thanks!
It ended up being a bit ugly though, but it worked.
debugprint.html
as a partial.{{ partial "debugprint.html" .Params }}
PS: I just realized that that partial can be called recursively! Still looking forward to comments on how I can optimize it further.
That doesn’t look very pretty … If you want to put together a PR with reflect.IsMap
and reflect.IsSlice
…
Next, I started updating that debugprint.html
partial to just print potential useful vars from .Site
. And now I am needing to do:
{{ $typeIsArray := (findRE "^([[][]]|.*TaxonomyList)" $type 1 | len | eq 1) }} <!-- match ^[] -->
{{ $typeIsMap := (findRE "^(map[[].+[]]|.*SiteSocial)" $type 1 | len | eq 1) }} <!-- match ^map[*] -->
Is there a generic way to tell if something is a map or an array (slice?). I simply need to know if I need to use {{ range $value }}
or {{ range $key1, $value1 := $value }}
or none of those… I don’t care of the exact map/slice type.
Also, is there a better way to write:
{{ if $type1IsTime }}
<!-- Print the date only if it is not at its initial value of Jan 1, 0001 -->
{{ if (ne "0001-01-01" ($value1.Format "2006-01-02")) }}
{{ printf "<tr><td class=\"key\">%s</td><td class=\"type\">%s</td><td class=\"value\">" $key1 $type1 | safeHTML }}
{{ partial "debugprint.html" $value1 }} <!-- Recursive call FTW! -->
{{ printf "</td></tr>" | safeHTML }}
{{ end }}
{{ else }}
{{ printf "<tr><td class=\"key\">%s</td><td class=\"type\">%s</td><td class=\"value\">" $key1 $type1 | safeHTML }}
{{ partial "debugprint.html" $value1 }} <!-- Recursive call FTW! -->
{{ printf "</td></tr>" | safeHTML }}
{{ end }}
I basically want to do something like (PSEUDO-code below):
{{ if (or (not $type1IsTime)
(and $type1IsTime
(ne "0001-01-01" ($value1.Format "2006-01-02")))) }}
<!-- Print the date only if it is not at its initial value of Jan 1, 0001 -->
{{ printf "<tr><td class=\"key\">%s</td><td class=\"type\">%s</td><td class=\"value\">" $key1 $type1 | safeHTML }}
{{ partial "debugprint.html" $value1 }} <!-- Recursive call FTW! -->
{{ printf "</td></tr>" | safeHTML }}
{{ end }}
But cannot figure out how to write that whole OR condition in Go templates.
I just had a look at https://github.com/gohugoio/hugo/blob/master/tpl/collections/reflect_helpers.go.
I don’t think I am ready to submit to a PR to Go code as I need to figure out first of all what ‘reflect’ is, and what to put in the case statements (base on examples of isUint
, etc. Also I have never coded in it Go, so I need to put in considerable time to learn Go debugging, etc.
Can you please add those functions?
Start with PR:
So the PR is already there. Can that please be merged?
TIL there’s something called Kind
that’s a broader categorization of Type
, and the kindIs
function in that PR is exactly what I need, assuming that function can be used in templates/partials.
Created a new issue to track this:
Thanks a lot… Helped me resolve my issue with separating array from string.
Hi I have another solution. Check if the index 0 of an array isset. And if not it cant be an array:
Thats from a JSON source where sometimes .description is an array and sometimes it ist not.
{{ if (isset .description 0) }}
{{ range .description }}
{{ . }}
{{ end }}
{{ else }}
{{ .description }}
{{ end }}
But it leads to this error message:
WARNING: calling IsSet with unsupported type “string” (string) will always return false.