I know that the variable scope and context within with
and range
statements only apply within them. A variable can be created within them but can only then be used within them, not outside. If you want to use it outside, you have to create the variable outside the statement first and then only reassign the value.
But I always thought it was different for if
statements. That you could create a variable inside the statement and use it outside, however I’m generating a error which indicates that my understanding is wrong. A variable the very certainly exists within, no longer is defined outside the if
statement.
It is an easy fix, but am I missing something or was my understanding wrong all along?
The code is below. The issue is $logo_new
which is created in the if
statement and I want to use it again outside. (also, please don’t judge the code otherwise as it is in refactor process from the mess that it was)
{{ with $logo := resources.Get site.Params.logo_src }}
{{ $logoWidth:= site.Params.logo_width | default $logo.Width }}
{{ if eq .MediaType.SubType "gif" }}
{{ $logo_new := ($logo.Resize (add (string $logoWidth) "x")).RelPermalink }}
{{ else if eq .MediaType.SubType "svg+xml" }}
{{ $logo_new := $logo.RelPermalink }}
{{ else }}
{{ $options := add (string $logoWidth) "x webp icon" }}
{{ $logo_new := ($logo.Resize $options).RelPermalink }}
{{ $logo_fallback := ($logo.Resize (add (string $logoWidth) "x")).RelPermalink }}
{{ warnf "%#v" $logo_new }}
{{ end }}
{{ warnf "%#v" $logo_new }}
<img
id="header-logo"
loading="preload"
decoding="async"
class="img-fluid"
width="{{ $logoWidth }}"
src="{{ $logo }}"
alt="{{ site.Params.logo_alt | default site.Params.logo_text }}"
{{- if and (ne .MediaType.SubType "gif") (ne .MediaType.SubType "svg+xml") -}}
onerror="this.onerror=null;this.src='{{ $logo }}'"
{{- end -}} />
{{ else }}
{{ with site.Params.logo_text }}
{{ . | markdownify }}
{{ else }}
{{ site.Title | markdownify }}
{{ end }}
{{ end }}