{{ define "body-class" }}article-page conferences-page{{ end }} {{ define "main" }} {{- $lang := .Lang -}} {{- $data := .Site.Data.conferences -}} {{- $talks := dict -}} {{- range $data.talks -}} {{- $talks = merge $talks (dict .id .) -}} {{- end -}} {{/* Compute stats */}} {{- $totalEvents := len $data.events -}} {{- $years := slice -}} {{- range $data.events -}} {{- $y := (time .date).Year | string -}} {{- if not (in $years $y) -}} {{- $years = $years | append $y -}} {{- end -}} {{- end -}} {{- $totalYears := len $years -}} {{- $uniqueTalks := len $data.talks -}} {{/* Count events with video */}} {{- $videosCount := 0 -}} {{- range $data.events -}} {{- if .video -}} {{- $videosCount = add $videosCount 1 -}} {{- end -}} {{- end -}}
{{/* ===== HEADER ===== */}}

{{- if eq $lang "fr" -}}Conférences{{- else -}}Conferences{{- end -}}

{{- if eq $lang "fr" -}} Parallèlement à ce blog, j'aime transmettre ma passion pour l'informatique en général dans des conférences. {{- else -}} Alongside this blog, I enjoy sharing my passion for computer science in general through conferences. {{- end -}}

{{- if eq $lang "fr" -}} Note: vous pouvez me solliciter pour des meetups et des BBLs pour tous les talks que vous trouverez ci dessous. Je suis également disponible pour des enregistrements de podcast sur ces sujets. {{- else -}} Note: You can contact me for meetups and Brown Bag Lunches (BBLs) for any of the talks you'll find below. I'm also available for podcast recordings on these topics. {{- end -}}

{{/* ===== STATS BANNER ===== */}}
{{ $totalEvents }} {{ if eq $lang "fr" }}Talks{{ else }}Talks{{ end }}
{{ $uniqueTalks }} {{ if eq $lang "fr" }}Sujets{{ else }}Topics{{ end }}
{{ $totalYears }} {{ if eq $lang "fr" }}Années{{ else }}Years{{ end }}
{{ $videosCount }} {{ if eq $lang "fr" }}Vidéos{{ else }}Videos{{ end }}
{{/* ===== TALKS SECTION (unique presentations) ===== */}} {{/* Show the first 4 talks (with slides) as "active"; the rest go in the archive */}} {{- $activeTalkIDs := slice -}} {{- $activeLimit := 4 -}} {{- range $data.talks -}} {{- if and .slides (lt (len $activeTalkIDs) $activeLimit) -}} {{- $activeTalkIDs = $activeTalkIDs | append .id -}} {{- end -}} {{- end -}}

{{ if eq $lang "fr" }}Les supports de présentation{{ else }}Presentation Materials{{ end }}

{{- if eq $lang "fr" -}} Pratique pour suivre en live ou retrouver les liens 😉 {{- else -}} Handy for following live or finding links 😉 {{- end -}}

{{/* Active talks grid */}}
{{- range $data.talks -}} {{- if and .slides (in $activeTalkIDs .id) -}}

{{ index .title $lang | default (index .title "fr") }}

{{- if .cospeaker -}}

{{ if eq $lang "fr" }}avec{{ else }}with{{ end }} {{ if .cospeaker_url }}{{ .cospeaker }}{{ else }}{{ .cospeaker }}{{ end }}

{{- end -}} {{- $count := 0 -}} {{- $talkId := .id -}} {{- range $data.events -}} {{- if eq .talk $talkId -}} {{- $count = add $count 1 -}} {{- end -}} {{- end -}} {{- if gt $count 0 -}}

{{ if eq $lang "fr" }}Présenté {{ $count }}x{{ else }}Presented {{ $count }}x{{ end }}

{{- end -}}
{{- end -}} {{- end -}}
{{/* Inactive (older) talks — collapsible */}} {{- $hasInactive := false -}} {{- range $data.talks -}} {{- if and .slides (not (in $activeTalkIDs .id)) -}} {{- $hasInactive = true -}} {{- end -}} {{- end -}} {{- if $hasInactive -}}
{{ if eq $lang "fr" }}Talks précédents{{ else }}Previous Talks{{ end }} {{- $inactiveCount := 0 -}} {{- range $data.talks -}} {{- if and .slides (not (in $activeTalkIDs .id)) -}} {{- $inactiveCount = add $inactiveCount 1 -}} {{- end -}} {{- end -}} {{ $inactiveCount }} {{ if eq $lang "fr" }}{{ if eq $inactiveCount 1 }}sujet{{ else }}sujets{{ end }}{{ else }}{{ if eq $inactiveCount 1 }}topic{{ else }}topics{{ end }}{{ end }}
{{- range $data.talks -}} {{- if and .slides (not (in $activeTalkIDs .id)) -}}

{{ index .title $lang | default (index .title "fr") }}

{{- if .cospeaker -}}

{{ if eq $lang "fr" }}avec{{ else }}with{{ end }} {{ if .cospeaker_url }}{{ .cospeaker }}{{ else }}{{ .cospeaker }}{{ end }}

{{- end -}} {{- $count := 0 -}} {{- $talkId := .id -}} {{- range $data.events -}} {{- if eq .talk $talkId -}} {{- $count = add $count 1 -}} {{- end -}} {{- end -}} {{- if gt $count 0 -}}

{{ if eq $lang "fr" }}Présenté {{ $count }}x{{ else }}Presented {{ $count }}x{{ end }}

{{- end -}}
{{- end -}} {{- end -}}
{{- end -}}
{{/* ===== EVENTS BY YEAR ===== */}}

{{ if eq $lang "fr" }}Liste des conférences{{ else }}Conference List{{ end }}

{{- if eq $lang "fr" -}} J'ai été (ou vais bientôt être) speaker sur les événements suivants : {{- else -}} I have been (or will soon be) a speaker at the following events: {{- end -}}

{{/* Group events by year */}} {{- $eventsByYear := dict -}} {{- range $data.events -}} {{- $y := (time .date).Year | string -}} {{- $existing := index $eventsByYear $y | default slice -}} {{- $eventsByYear = merge $eventsByYear (dict $y ($existing | append .)) -}} {{- end -}} {{/* Sort years descending */}} {{- $sortedYears := sort $years "value" "desc" -}} {{- $recentYearCount := 2 -}} {{/* Recent years (shown directly) */}} {{- range $i, $year := $sortedYears -}} {{- if lt $i $recentYearCount -}} {{- $yearEvents := index $eventsByYear $year -}} {{- $count := len $yearEvents -}}
{{ $year }} {{ $count }} {{ if eq $lang "fr" }}{{ if eq $count 1 }}événement{{ else }}événements{{ end }}{{ else }}{{ if eq $count 1 }}event{{ else }}events{{ end }}{{ end }}
{{- range $yearEvents -}} {{- $talk := index $talks .talk -}} {{- $eventType := .type -}} {{- $isUpcoming := gt (time .date) now -}}
{{- if eq $eventType "conference" -}} conf {{- else if eq $eventType "meetup" -}} meetup {{- else if eq $eventType "bbl" -}} BBL {{- end -}}

{{ .event }} {{- if $isUpcoming }} {{ if eq $lang "fr" }}à venir{{ else }}upcoming{{ end }} {{- end -}}

{{ index $talk.title $lang | default (index $talk.title "fr") }}

{{- if .note -}}

{{ index .note $lang | default (index .note "fr") }}

{{- end -}}
{{- if .video -}} 📹 {{- end -}} {{- if .feedback -}} 💬 {{- end -}} {{- if .feedback2 -}} 💬 {{- end -}} {{- if .link -}} 🔗 {{- end -}}
{{- end -}}
{{- end -}} {{- end -}} {{/* Older years (collapsible archive) */}} {{- $olderCount := sub (len $sortedYears) $recentYearCount -}} {{- if gt $olderCount 0 -}} {{- $olderEvents := 0 -}} {{- range $i, $year := $sortedYears -}} {{- if ge $i $recentYearCount -}} {{- $olderEvents = add $olderEvents (len (index $eventsByYear $year)) -}} {{- end -}} {{- end -}}
{{ if eq $lang "fr" }}Années précédentes{{ else }}Previous Years{{ end }} {{ $olderEvents }} {{ if eq $lang "fr" }}{{ if eq $olderEvents 1 }}événement{{ else }}événements{{ end }}{{ else }}{{ if eq $olderEvents 1 }}event{{ else }}events{{ end }}{{ end }}
{{- range $i, $year := $sortedYears -}} {{- if ge $i $recentYearCount -}} {{- $yearEvents := index $eventsByYear $year -}} {{- $count := len $yearEvents -}}
{{ $year }} {{ $count }} {{ if eq $lang "fr" }}{{ if eq $count 1 }}événement{{ else }}événements{{ end }}{{ else }}{{ if eq $count 1 }}event{{ else }}events{{ end }}{{ end }}
{{- range $yearEvents -}} {{- $talk := index $talks .talk -}} {{- $eventType := .type -}} {{- $isUpcoming := gt (time .date) now -}}
{{- if eq $eventType "conference" -}} conf {{- else if eq $eventType "meetup" -}} meetup {{- else if eq $eventType "bbl" -}} BBL {{- end -}}

{{ .event }} {{- if $isUpcoming }} {{ if eq $lang "fr" }}à venir{{ else }}upcoming{{ end }} {{- end -}}

{{ index $talk.title $lang | default (index $talk.title "fr") }}

{{- if .note -}}

{{ index .note $lang | default (index .note "fr") }}

{{- end -}}
{{- if .video -}} 📹 {{- end -}} {{- if .feedback -}} 💬 {{- end -}} {{- if .feedback2 -}} 💬 {{- end -}} {{- if .link -}} 🔗 {{- end -}}
{{- end -}}
{{- end -}} {{- end -}}
{{- end -}}

{{- if eq $lang "fr" -}} Note : les talks disponibles en replay sont également souvent disponibles sur mon instance PeerTube personnelle {{- else -}} Note: Talks available as replays are usually also available on my personal PeerTube instance {{- end -}}

{{/* ===== ORGANIZER ===== */}}

{{ if eq $lang "fr" }}Organisateur{{ else }}Organizer{{ end }}

{{/* ===== FOOTER ===== */}}
{{ partialCached "footer/footer" . }} {{ end }} {{/* No right sidebar on this page — full-width content */}} {{ define "right-sidebar" }}{{ end }}