{{/* Left Marginalia — article metadata sidebar (US-028) Shows: Principal (author) / Chronicle (date) / Dimensions (reading time + word count) / Dialect (lang switch) + Suggest Changes Rendered inside aside.article-marginalia (>= 1024px sticky left column) */}} {{- $page := . }}
{{/* ── Principal (Author) — clickable → /about/, avatar + halo ── */}} {{- $aboutURL := "/about/" }} {{- if eq $page.Lang "en" }}{{ $aboutURL = "/en/about/" }}{{ end }} {{- if eq $page.Lang "zh" }}{{ $aboutURL = "/zh/about/" }}{{ end }} {{/* Normalize author: front matter is often a slice like ["Xinwei Xiong", "Me"]. Drop redundant "Me"/"我" tokens and keep the real name; render clean string. */}} {{- $rawAuthor := $page.Params.author | default site.Params.author }} {{- $authorName := "—" }} {{- if reflect.IsSlice $rawAuthor }} {{- $names := slice }} {{- range $rawAuthor }} {{- $t := trim . " " }} {{- if and $t (not (in (slice "Me" "me" "我" "我自己") $t)) }}{{ $names = $names | append $t }}{{ end }} {{- end }} {{- if $names }}{{ $authorName = index $names 0 }}{{ else if $rawAuthor }}{{ $authorName = index $rawAuthor 0 }}{{ end }} {{- else if $rawAuthor }} {{- $authorName = trim (replaceRE "[,,]\\s*(我|Me|me)\\s*$" "" (printf "%v" $rawAuthor)) " " }} {{- end }} {{/* Latin-only names get the expressive Fraunces display treatment regardless of page lang */}} {{- $isLatinName := not (findRE "[\\p{Han}\\p{Hiragana}\\p{Katakana}]" $authorName) }} {{/* Resolve avatar from assets (fallback to static path) */}} {{- $avatar := resources.Get "my-avatar.jpg" }} {{- if not $avatar }}{{ $avatar = resources.Get "cubxxw-image.jpg" }}{{ end }} {{- $avatarURL := "/assets/cubxxw-image.jpg" | relURL }} {{- if $avatar }} {{- $sm := $avatar.Fill "128x128 Center q90" }} {{- $avatarURL = $sm.RelPermalink }} {{- end }}
{{ i18n "marginalia.principal" | default "Principal" }} {{ $authorName }} {{ $authorName }} {{- if eq $page.Lang "zh" -}}著者 · 主理人{{- else -}}Author · Curator{{- end -}}
{{/* ── Chronicle (Date) — clickable → /archives/ ── */}} {{- $archivesURL := "/archives/" }} {{- if eq $page.Lang "en" }}{{ $archivesURL = "/en/archives/" }}{{ end }} {{- if eq $page.Lang "zh" }}{{ $archivesURL = "/zh/archives/" }}{{ end }} {{- $zeroTime := "0001-01-01" }} {{- if ne ($page.Date.Format "2006-01-02") $zeroTime }}
{{ i18n "marginalia.chronicle" | default "Chronicle" }} {{- if eq $page.Lang "zh" -}} {{ $page.Date.Format "2006 年 1 月 2 日" }} {{- else -}} {{ $page.Date.Format "January 2, 2006" }} {{- end -}}
{{- end }} {{/* ── Maturity (living-content stage: Seedling / Budding / Evergreen) ── */}} {{- $maturityBadge := partial "article/maturity.html" $page -}} {{- if trim $maturityBadge " \n\t" }}
{{ i18n "marginalia.maturity" | default "Maturity" }} {{ $maturityBadge | safeHTML }}
{{- end }} {{/* ── Dimensions (Reading Time + Word Count) ── */}}
{{ i18n "marginalia.dimensions" | default "Dimensions" }} {{- $readTime := $page.ReadingTime -}} {{- $wordCount := $page.WordCount -}} {{- if eq $page.Lang "zh" -}} {{ $readTime }} 分钟 · {{ $wordCount }} 字 {{- else -}} {{ $readTime }} min · {{ $wordCount }} words {{- end -}}
{{/* ── Dialect (Language Switch) ── */}} {{- if $page.IsTranslated }}
{{ i18n "marginalia.dialect" | default "Dialect" }} {{- if eq $page.Lang "zh" -}}中{{- else -}}EN{{- end -}} {{- range $page.Translations }} | {{- if eq .Lang "zh" -}}中{{- else -}}EN{{- end -}} {{- end }}
{{- end }} {{/* ── Series (multi-part essay group, collapsible) ── */}} {{- $seriesP := $page.Params.series }} {{- if and $seriesP $seriesP.slug }} {{- $sSlug := $seriesP.slug }} {{- $sIsZh := eq $page.Lang "zh" }} {{- $sSibs := slice }} {{- range where (where site.RegularPages "Lang" $page.Lang) "Params.series.slug" $sSlug }} {{- $sSibs = $sSibs | append . }} {{- end }} {{- $sOrdered := sort $sSibs "Params.series.order" "asc" }} {{- $sOrder := $seriesP.order | default 0 }} {{- $sTotal := $seriesP.total | default (len $sOrdered) }} {{- $sColumnURL := printf "/columns/%s/" $sSlug }} {{- if eq $page.Lang "zh" }}{{ $sColumnURL = printf "/zh/columns/%s/" $sSlug }}{{ end }}
{{ if $sIsZh }}系列{{ else }}Series{{ end }} {{ $seriesP.name }} {{ $sOrder }}/{{ $sTotal }} {{- if $sOrdered }}
    {{- range $sOrdered }} {{- $isCurrent := eq .RelPermalink $page.RelPermalink }} {{- $ord := .Params.series.order | default 0 }}
  1. {{- if $isCurrent }} {{ $ord }} {{ .Title }} {{- else }} {{ $ord }} {{ .Title }} {{- end }}
  2. {{- end }}
{{- end }}
{{- end }} {{/* ── Topics (Categories) ── */}} {{- $cats := $page.Language.Params.Taxonomies.category | default "categories" }} {{- $catTerms := $page.GetTerms $cats }} {{- if $catTerms }}
{{ i18n "marginalia.topics" | default "Topics" }}
{{- range $catTerms }} {{ .LinkTitle }} {{- end }}
{{- end }} {{/* ── Tags ── */}} {{- $tagTax := $page.Language.Params.Taxonomies.tag | default "tags" }} {{- $tagTerms := $page.GetTerms $tagTax }} {{- if $tagTerms }}
{{ i18n "marginalia.tags" | default "Tags" }}
{{- range $tagTerms }} {{ .LinkTitle }} {{- end }}
{{- end }} {{/* ── GitHub / Contribute ── */}} {{- with site.Params.editPost.URL }} {{- $editURL := printf "%s/%s" site.Params.editPost.URL $page.File.Path }} {{- $repoBase := "https://github.com/cubxxw/blog" }} {{- $blobURL := printf "%s/blob/main/content/%s/%s" $repoBase $page.Lang $page.File.Path }}
{{ i18n "marginalia.contribute" | default "Contribute" }}
{{- end }} {{/* ── Share ── */}} {{- $mg_tags := slice }} {{- range $page.GetTerms "tags" }}{{ $mg_tags = $mg_tags | append .LinkTitle }}{{ end }} {{- $mg_cats := slice }} {{- range $page.GetTerms "categories" }}{{ $mg_cats = $mg_cats | append .LinkTitle }}{{ end }} {{- $mg_desc := $page.Description }} {{- $mg_descShort := "" }} {{- if $mg_desc }}{{- $mg_descShort = $mg_desc | truncate 120 "…" }}{{- end }} {{- $mg_tweetText := $page.Title }} {{- if $mg_descShort }}{{- $mg_tweetText = printf "%s — %s" $page.Title $mg_descShort }}{{- end }} {{- $mg_emailBody := $page.Title }} {{- if $mg_descShort }}{{- $mg_emailBody = printf "%s\n\n%s" $mg_emailBody $mg_descShort }}{{- end }} {{- $mg_emailBody = printf "%s\n\n%s" $mg_emailBody $page.Permalink }} {{- if $mg_cats }}{{- $mg_emailBody = printf "%s\n\nTopics: %s" $mg_emailBody (delimit $mg_cats ", ") }}{{- end }} {{- if $mg_tags }}{{- $mg_emailBody = printf "%s\nTags: %s" $mg_emailBody (delimit $mg_tags ", ") }}{{- end }} {{- $mg_hashtagSlice := slice }} {{- range $mg_tags }}{{- $mg_hashtagSlice = $mg_hashtagSlice | append (replaceRE "(\\s)" "" .) }}{{ end }} {{- $mg_hashtagStr := delimit $mg_hashtagSlice "," }}
{{ i18n "marginalia.share" | default "Share" }}