{{/* Check parameter types */ -}} {{ $tpPersistAttrName := "data-td-tp-persist" -}} {{ with .Get "langEqualsHeader" -}} {{ if ne ( printf "%T" . ) "bool" -}} {{ errorf "Shortcode %q: boolean value expected for parameter %q, but got %s. Error position: %s" $.Name "langEqualsHeader" (printf "%T" .) $.Position -}} {{ end -}} {{ end -}} {{ with .Get "text" -}} {{ if ne ( printf "%T" . ) "bool" -}} {{ errorf "Shortcode %q: boolean value expected for parameter %q, but got %s. Error position: %s" $.Name "text" (printf "%T" .) $.Position -}} {{ end -}} {{ end -}} {{ $_persistLang := .Get "persistLang" -}} {{ if and (ne $_persistLang nil) (ne $_persistLang "") -}} {{ if ne ( printf "%T" $_persistLang ) "bool" -}} {{ errorf "Shortcode %q: boolean value expected for parameter %q, but got %s. Error position: %s" $.Name "persistLang" (printf "%T" $_persistLang) $.Position -}} {{ else -}} {{ warnf "Shortcode %q parameter `persistLang` is deprecated, use `persist` instead: %s" $.Name $.Position -}} {{ end -}} {{ end -}} {{ $_persist := .Get "persist" -}} {{ with $_persist -}} {{ $matched := findRE "^(header|lang|disabled)$" . -}} {{ if not $matched -}} {{ errorf "Shortcode %q: parameter %q should be one of 'header', 'lang', or 'disabled'; but got %s. Error position: %s" $.Name "persist" $_persist $.Position -}} {{ end -}} {{ end -}} {{ with .Get "right" -}} {{ if ne ( printf "%T" . ) "bool" -}} {{ errorf "Shortcode %q: boolean value expected for parameter %q, but got %s. Error position: %s" $.Name "right" (printf "%T" .) $.Position -}} {{ end -}} {{ end -}} {{/* Set values given defined within tabpane */ -}} {{ $langPane := default "" ($.Get "lang") -}} {{ $hloptionsPane := default "" ($.Get "highlight") -}} {{ $textPane := default false ($.Get "text") -}} {{ $langEqualsHeader := default false ($.Get "langEqualsHeader") -}} {{ $deprecatedPersistLang := $_persistLang | default true -}} {{ $persistKeyKind := $_persist | default (cond (or $textPane (ne "" $langPane)) "header" "lang") -}} {{ $persistTabpane := and $deprecatedPersistLang (ne $persistKeyKind "disabled") -}} {{ $rightPane := default false ($.Get "right") -}} {{ $activeSet := false -}} {{/* Scratchpad gets populated through call to .Inner */ -}} {{ .Inner -}} {{ $duplicate := false -}} {{ $duplicateKey := "" -}} {{ $persistKeyList := slice -}} {{ $tabPaneOrdinal := .Ordinal -}} {{/* Nav tabs */ -}} <ul class="nav nav-tabs{{ if $rightPane }} justify-content-end{{ end }}" id="tabs-{{- $tabPaneOrdinal -}}" role="tablist"> {{ range $index, $element := $.Scratch.Get "tabs" -}} {{ $enabled := not $element.disabled -}} {{ $lang := $langPane -}} {{ if $langEqualsHeader -}} {{ $lang = $element.header -}} {{ end -}} {{ with $element.language -}} {{ $lang = . -}} {{ end -}} {{ $persistKey := "" -}} {{ if eq $persistKeyKind "lang" -}} {{ with $lang -}} {{ $persistKey = . -}} {{ else -}} {{ with findRE "```(\\S+)" $element.content 1 -}} {{ $persistKey = index . 1 -}} {{ end -}} {{ end -}} {{ else if eq $persistKeyKind "header" -}} {{ $persistKey = $element.header -}} {{ end -}} {{ $persistKey = $persistKey | lower -}} {{ $persistTab := and $persistTabpane $persistKey $enabled -}} {{/* Check for duplicate tab-persistence keys */ -}} {{ if $persistTab -}} {{ if in $persistKeyList $persistKey -}} {{ $duplicate = true -}} {{ $duplicateKey = $persistKey -}} {{ $persistTab = false -}} {{ else -}} {{ $persistKeyList = $persistKeyList | append $persistKey -}} {{ end -}} {{ end -}} {{ $rightpush := false -}} {{ with $element.rightpush -}} {{ $rightpush = . -}} {{ end -}} <li class="nav-item{{ if $rightpush }} ms-auto{{ end -}}"> {{/* Generate the IDs for the <a> and the <div> elements */ -}} {{ $tabid := printf "tabs-%02v-%v-tab" $tabPaneOrdinal $index | anchorize -}} {{ $entryid := printf "tabs-%02v-%v" $tabPaneOrdinal $index | anchorize -}} {{ $isActive := and $enabled (not $activeSet) -}} <button class="nav-link {{- if $isActive -}} {{ $activeSet = true }} active {{- end -}} {{ if not $enabled }} disabled{{ end -}}" id="{{ $tabid }}" data-bs-toggle="tab" data-bs-target="#{{ $entryid }}" role="tab" {{ if $persistTab -}} {{ printf "%s=%q " $tpPersistAttrName $persistKey | safeHTMLAttr -}} {{ end -}} aria-controls="{{- $entryid -}}" aria-selected="{{ $isActive }}"> {{ index . "header" | markdownify }} </button> </li> {{- end }} </ul> {{ if $duplicate -}} {{ warnf "Shortcode %q: duplicate tab-persistence key %q detected, disabling persistance to avoid multiple tab display. Position: %s" $.Name $duplicateKey $.Position -}} {{ end -}} {{ $activeSet = false -}} {{/* Tab panes */ -}} <div class="tab-content" id="tabs-{{ $tabPaneOrdinal }}-content"> {{- range $index, $element := $.Scratch.Get "tabs" -}} {{ $lang := $langPane -}} {{ if $langEqualsHeader -}} {{ $lang = $element.header -}} {{ end -}} {{ with $element.language -}} {{ $lang = . -}} {{ end -}} {{ $enabled := not $element.disabled -}} {{ $hloptions := $hloptionsPane -}} {{ with $element.highlight -}} {{ $hloptions = . -}} {{ end -}} {{ $text := $textPane -}} {{ with $element.text -}} {{ $text = . }} {{ end -}} {{ $tabid := printf "tabs-%02v-%v-tab" $tabPaneOrdinal $index | anchorize -}} {{ $entryid := printf "tabs-%02v-%v" $tabPaneOrdinal $index | anchorize }} {{ $isActive := and $enabled (not $activeSet) -}} <div class="{{ if $text }}tab-body {{end}}tab-pane fade {{- if $isActive -}} {{ $activeSet = true }} show active {{- end }}" id="{{ $entryid }}" role="tabpanel" aria-labelled-by="{{ $tabid }}" tabindex="{{ $tabPaneOrdinal }}"> {{ if $text -}} {{ index . "content" -}} {{ else -}} {{ highlight (trim (index . "content") "\r\n") $lang $hloptions -}} {{ end }} </div> {{- end }} </div>