{{- /* Code block wrapper hook for highlight output. - Applies wrapper UI features based on codeblock config. - Supports classic/modern modes, copy button, expand button, and line-number states. @param {Object} .Attributes code block attributes @param {Object} .Options code fence options @param {String} .Inner raw code content @param {Object} .Page current page context @param {String} .Type language/type for current block */ -}} {{- $config := .Attributes | merge .Page.Params.codeblock | merge .Page.Site.Params.codeblock -}} {{- $result := transform.HighlightCodeBlock . -}} {{- $wrapper := $result.Wrapped -}} {{- /* If wrapper is enabled, add code wrapper and more features */ -}} {{- if $config.wrapper -}} {{- $mode := $config.mode | default "classic" -}} {{- $lines := cond .Inner (len (split .Inner "\n")) 0 -}} {{- $maxShownLines := $config.maxshownlines -}} {{- $lineNoStart := cond (ne .Options.linenostart nil) .Options.linenostart 1 -}} {{- $lineNosDigit := strings.RuneCount (sub (add $lines $lineNoStart) 1) -}} {{- $class := "highlight" -}} {{- with $config.class -}}{{ $class = add $class " " . }}{{- end -}} {{- $targetClass := add "code-block " $class -}} {{- with $config.wrapperclass -}}{{ $targetClass = add $targetClass " " . }}{{- end -}} {{- /* Add code wrapper around the table or pre */ -}} {{- $REin := cond (strings.Contains $wrapper ``) `(
[\s\S]*?<\/table>)` `(
[\s\S]*?<\/pre>)` -}}
  {{- $REout := printf `
$1
` -}} {{- $wrapper = replaceRE $REin $REout $wrapper -}} {{- /* Hide line numbers if linenos=false */ -}} {{- if (not (strings.Contains $wrapper `class="lnt"`)) | and (not (strings.Contains $wrapper `class="ln"`)) -}} {{- $targetClass = add $targetClass " line-nos-hidden" -}} {{- end -}} {{- /* Add code expand button */ -}} {{- if (gt $lines $maxShownLines) | and (gt $lines 0) | and (gt $maxShownLines 0) -}} {{- $wrapper = dict "Wrapper" $wrapper | partial "function/code-expand-btn.html" -}} {{- end -}} {{- /* Render for different modes */ -}} {{- if eq $mode "classic" -}} {{- $wrapper = dict "Wrapper" $wrapper "Config" $config "Type" .Type | partial "function/code-header.html" -}} {{- else -}} {{- $wrapper = dict "Wrapper" $wrapper "Config" $config | partial "function/code-copy-btn.html" -}} {{- end -}} {{- /* Add data attributes and class Directly set CSS variables to ensure compatibility with non-Chromium-based browsers See https://caniuse.com/css3-attr for attr() support status */ -}} {{- if $config.editable -}} {{- $wrapper = replace $wrapper (printf `class="%s"` $class) (printf `class="%s" data-editable="%v"` $class $config.editable) -}} {{- end -}} {{- if $config.copyable -}} {{- $wrapper = replace $wrapper (printf `class="%s"` $class) (printf `class="%s" data-copyable="%v"` $class $config.copyable) -}} {{- end -}} {{- if ne $config.shadow "never" -}} {{- $wrapper = replace $wrapper (printf `class="%s"` $class) (printf `class="%s" data-shadow="%s"` $class $config.shadow) -}} {{- end -}} {{- if $config.group -}} {{- $tabTitle := $config.name | default (strings.FirstUpper .Type) | default "Code" -}} {{- $groupKey := printf "code-tab-group-first:%s" $config.group -}} {{- $isFirst := not (.Page.Store.Get $groupKey) -}} {{- if $isFirst -}} {{- .Page.Store.Set $groupKey true -}} {{- else -}} {{- $targetClass = add $targetClass " d-none" -}} {{- end -}} {{- $wrapper = replace $wrapper (printf `class="%s"` $class) (printf `class="%s" data-tab-title="%s"` $class $tabTitle) -}} {{- end -}} {{- if ne .Options.linenostart nil -}} {{- $wrapper = replace $wrapper `class="code-wrapper"` (printf `class="code-wrapper" data-line-start="%v"` .Options.linenostart) -}} {{- end -}} {{- $wrapperStyle := printf "--fi-max-shown-lines:%v;--fi-line-digit:%v;--fi-line-start:%v;" $maxShownLines $lineNosDigit $lineNoStart -}} {{- $wrapper = replace $wrapper `class="code-wrapper"` (printf `class="code-wrapper" style="%s"` $wrapperStyle) -}} {{- $wrapper = replace $wrapper `class="code-wrapper"` (printf `class="code-wrapper" data-max="%v" data-line-digit="%d"` $maxShownLines $lineNosDigit ) -}} {{- $wrapper = replace $wrapper (printf `class="%s"` $class) (printf `class="%s" data-mode="%s"` $targetClass $mode) -}} {{- end -}} {{- $wrapper | safeHTML -}}