From 886bee453e27c2d42892bc890f6d11b30c3b8e84 Mon Sep 17 00:00:00 2001 From: Mikko Ahlroth Date: Sat, 18 Mar 2023 10:04:34 +0200 Subject: [PATCH] Add event materials, add support for slides and many talks from one person --- event-2017-09-21.html | 28 +++-- event-2023-03-16.html | 44 ++++++- feed.xml | 31 ++++- index.html | 2 +- src/trelixir/config.gleam | 1 + src/trelixir/events/event_2017_09_21.gleam | 12 +- src/trelixir/events/event_2023_03_16.gleam | 21 +++- src/trelixir/events/types.gleam | 6 +- src/trelixir/events/utils.gleam | 109 ++++++++++++++---- ...6-a134-e11df93a864d-description.html.glemp | 2 +- src/trelixir/feed/feed.gleam | 24 +++- src/trelixir/index.gleam | 17 +-- tpl/feed.xml.glemp | 4 +- tpl/page.html.glemp | 24 +++- 14 files changed, 255 insertions(+), 70 deletions(-) create mode 100644 src/trelixir/config.gleam diff --git a/event-2017-09-21.html b/event-2017-09-21.html index 702f176..5bdf238 100644 --- a/event-2017-09-21.html +++ b/event-2017-09-21.html @@ -64,16 +64,22 @@

Why Elixir matters

- Mikko Ahlroth + + Mikko Ahlroth +

Mikko Ahlroth, Vincit Oyj

-

- Mikko works primarily as a full stack developer at Vincit, but on his free time has dabbled with Elixir since 2013. He has published some packages on hex.pm and runs Code::Stats on Phoenix. + +

+ Mikko works primarily as a full stack developer at Vincit, but on his free time has dabbled with Elixir since 2013. He has published some packages on hex.pm and runs Code::Stats on Phoenix. -

+

+ + + @@ -81,16 +87,22 @@

GenServer & Agent

- Janne Tenhovirta + + Janne Tenhovirta +

Janne Tenhovirta, Cybersoft

-

- Janne mainly gets his hands dirty in .NET backend development at his job with Cybersoft, a subsidiary of Headpower. He feels they get dirtier when fiddling with the frontend. He first learned of Elixir's existence in 2015 and started to fool around with it in 2016. + +

+ Janne mainly gets his hands dirty in .NET backend development at his job with Cybersoft, a subsidiary of Headpower. He feels they get dirtier when fiddling with the frontend. He first learned of Elixir's existence in 2015 and started to fool around with it in 2016. -

+

+ + + diff --git a/event-2023-03-16.html b/event-2023-03-16.html index 6a0cc63..a449a90 100644 --- a/event-2023-03-16.html +++ b/event-2023-03-16.html @@ -74,22 +74,56 @@

Gleam – Type Safe BEAM

- Mikko Ahlroth + + Mikko Ahlroth +

Mikko Ahlroth, Vincit Oyj

-

- Mikko works primarily as a full stack developer at Vincit, but on his free time has dabbled with Elixir since 2013. He has published some packages on hex.pm and runs Code::Stats on Phoenix. + +

+ Mikko works primarily as a full stack developer at Vincit, but on his free time has dabbled with Elixir since 2013. He has published some packages on hex.pm and runs Code::Stats on Phoenix. -

+

+ + + +

Slides & materials

+ + +
-

More talks TBA

+

Forget config.exs

+ + + +

+ Mikko Ahlroth +

+ + + + +

Slides & materials

+ + +
diff --git a/feed.xml b/feed.xml index 06f142a..1ecb86c 100644 --- a/feed.xml +++ b/feed.xml @@ -2,12 +2,39 @@ TRElixir - https://trelixir.fi/ + + https://trelixir.fi + TRElixir newsletter feed. Glemplate © Mikko Ahlroth + + + <![CDATA[Thanks and materials added]]> + + + Mikko Ahlroth + + + https://trelixir.fi/event-2023-03-16.html + + + d11e88e3-87a1-4ee1-a02c-6e50b1c123d0 + + + + Thanks to everyone for attending the first TRElixir in a long time! It was really nice to get to see all of you. I've added my talk materials to the website.

The next TRElixir will likely be at the end of May or beginning of June. Watch this feed! :)

If you have inspiration to talk about something yourself at the next event, or ideas or feedback for the event, please let me know! My contact details are on the main page of the website.

+ ]]> +
+ + + Sat, 18 Mar 2023 10:00:00 +0200 + +
+ <![CDATA[Lightning talk possibility]]> @@ -54,7 +81,7 @@ </p> <p> - <a href="https://trelixir.fi/event-2023-03-16.html">Go to event page.</a> + <a href="https://trelixir.fi/event-2023-03-16.html">Go to event page.</a> </p> ]]> diff --git a/index.html b/index.html index 83a4dd4..3400c4d 100644 --- a/index.html +++ b/index.html @@ -77,7 +77,7 @@ <li> - More talks TBA + Forget config.exs (Mikko Ahlroth) </li> diff --git a/src/trelixir/config.gleam b/src/trelixir/config.gleam new file mode 100644 index 0000000..7a4fa4e --- /dev/null +++ b/src/trelixir/config.gleam @@ -0,0 +1 @@ +pub const url = "https://trelixir.fi" diff --git a/src/trelixir/events/event_2017_09_21.gleam b/src/trelixir/events/event_2017_09_21.gleam index 2625d60..69fb7e1 100644 --- a/src/trelixir/events/event_2017_09_21.gleam +++ b/src/trelixir/events/event_2017_09_21.gleam @@ -18,8 +18,16 @@ pub fn data() { ), signup_info: utils.load_child_tpl("generic", "signup_closed", assigns.new()), talks: [ - types.Talk(title: "Why Elixir matters", speaker: mikko_ahlroth.data()), - types.Talk(title: "GenServer & Agent", speaker: janne_tenhovirta.data()), + types.Talk( + title: "Why Elixir matters", + speaker: mikko_ahlroth.data(), + slides: [], + ), + types.Talk( + title: "GenServer & Agent", + speaker: janne_tenhovirta.data(), + slides: [], + ), ], ) } diff --git a/src/trelixir/events/event_2023_03_16.gleam b/src/trelixir/events/event_2023_03_16.gleam index aa072db..1c2a414 100644 --- a/src/trelixir/events/event_2023_03_16.gleam +++ b/src/trelixir/events/event_2023_03_16.gleam @@ -24,8 +24,27 @@ pub fn data() { types.Talk( title: "Gleam – Type Safe BEAM", speaker: mikko_ahlroth.data(), + slides: [ + types.Slide( + title: "Presentation", + link: "https://docs.google.com/presentation/d/1Jz_eQFemwfjV_0KqG8YXQ9GJQ7rdTAYOStvbN6sUySA/edit?usp=sharing", + ), + ], + ), + types.Talk( + title: "Forget config.exs", + speaker: mikko_ahlroth.data(), + slides: [ + types.Slide( + title: "Presentation", + link: "https://docs.google.com/presentation/d/1KUB3qXolxa_RRXy84NftzpvVuR46f4S4eLqe4ROc5mQ/edit?usp=sharing", + ), + types.Slide( + title: "Blog post about configuration", + link: "https://blog.nytsoi.net/2021/04/17/elixir-simple-configuration", + ), + ], ), - types.Placeholder, ], ) } diff --git a/src/trelixir/events/types.gleam b/src/trelixir/events/types.gleam index ea20270..1159016 100644 --- a/src/trelixir/events/types.gleam +++ b/src/trelixir/events/types.gleam @@ -9,9 +9,13 @@ pub type Speaker { Speaker(name: String, img: String, company: Company, description: String) } +pub type Slide { + Slide(title: String, link: String) +} + pub type Talk { Placeholder - Talk(title: String, speaker: Speaker) + Talk(title: String, speaker: Speaker, slides: List(Slide)) } pub type Event { diff --git a/src/trelixir/events/utils.gleam b/src/trelixir/events/utils.gleam index b964bc2..382d7fd 100644 --- a/src/trelixir/events/utils.gleam +++ b/src/trelixir/events/utils.gleam @@ -1,5 +1,6 @@ import gleam/map import gleam/list +import gleam/set import gleam/string_builder import glemplate/assigns import glemplate/html @@ -7,6 +8,7 @@ import glemplate/ast import glemplate/renderer import trelixir/tpls import trelixir/events/types +import trelixir/config pub fn render( template: ast.Template, @@ -16,6 +18,10 @@ pub fn render( html.render(template, event_to_assigns(data), template_cache) } +pub fn event_url(event_file: String) { + config.url <> "/" <> event_file <> ".html" +} + pub fn event_to_assigns(event: types.Event) -> assigns.Assigns { assigns.from_list([ #("title", assigns.String(event.title)), @@ -23,37 +29,94 @@ pub fn event_to_assigns(event: types.Event) -> assigns.Assigns { #("host_name", assigns.String(event.host_name)), #("host_url", assigns.String(event.host_url)), #("signup_info", assigns.String(event.signup_info)), - #("talks", assigns.List(list.map(event.talks, talk_to_assigns))), + #("talks", talks_to_assigns(event.talks)), #("is_index", assigns.Bool(False)), ]) } -pub fn talk_to_assigns(talk: types.Talk) -> assigns.AssignData { - case talk { - types.Talk(title, speaker) -> - assigns.Map(map.from_list([ - #("title", assigns.String(title)), - #("speaker", speaker_to_assigns(speaker)), - #("is_placeholder", assigns.Bool(False)), - ])) - - types.Placeholder -> - assigns.Map(map.from_list([#("is_placeholder", assigns.Bool(True))])) - } +type TalkAcc { + TalkAcc(talks: List(assigns.AssignData), speakers: set.Set(types.Speaker)) } -pub fn speaker_to_assigns(speaker: types.Speaker) -> assigns.AssignData { - let company = case speaker.company { - types.NoCompany -> assigns.Bool(False) - types.Company(name) -> assigns.String(name) +pub fn talks_to_assigns(talks: List(types.Talk)) -> assigns.AssignData { + let talk_acc = + list.fold( + talks, + TalkAcc(talks: [], speakers: set.new()), + fn(acc, talk) { + let talk_assign = case talk { + types.Talk(title, speaker, slides) -> + assigns.Map(map.from_list([ + #("title", assigns.String(title)), + #( + "speaker", + speaker_to_assigns(speaker, set.contains(acc.speakers, speaker)), + ), + #("is_placeholder", assigns.Bool(False)), + #("slides", slides_to_assigns(slides)), + ])) + + types.Placeholder -> + assigns.Map(map.from_list([#("is_placeholder", assigns.Bool(True))])) + } + + let speakers = case talk { + types.Talk(_title, speaker, _slides) -> + set.insert(acc.speakers, speaker) + types.Placeholder -> acc.speakers + } + TalkAcc(talks: [talk_assign, ..acc.talks], speakers: speakers) + }, + ) + + assigns.List(list.reverse(talk_acc.talks)) +} + +pub fn speaker_to_assigns( + speaker: types.Speaker, + suppressed: Bool, +) -> assigns.AssignData { + let general_data = + map.from_list([ + #("name", assigns.String(speaker.name)), + #("img", assigns.String(speaker.img)), + ]) + + let data = case suppressed { + True -> + general_data + |> map.insert("is_detailed", assigns.Bool(False)) + + False -> { + let company = case speaker.company { + types.NoCompany -> assigns.Bool(False) + types.Company(name) -> assigns.String(name) + } + + general_data + |> map.insert("company", company) + |> map.insert("description", assigns.String(speaker.description)) + |> map.insert("is_detailed", assigns.Bool(True)) + } } - assigns.Map(map.from_list([ - #("name", assigns.String(speaker.name)), - #("img", assigns.String(speaker.img)), - #("company", company), - #("description", assigns.String(speaker.description)), - ])) + assigns.Map(data) +} + +pub fn slides_to_assigns(slides: List(types.Slide)) -> assigns.AssignData { + case slides { + [] -> assigns.Bool(False) + slides -> + assigns.List(list.map( + slides, + fn(slide) { + assigns.Map(map.from_list([ + #("title", assigns.String(slide.title)), + #("link", assigns.String(slide.link)), + ])) + }, + )) + } } pub fn load_child_tpl( diff --git a/src/trelixir/feed/cfc19ed7-f46d-45b6-a134-e11df93a864d-description.html.glemp b/src/trelixir/feed/cfc19ed7-f46d-45b6-a134-e11df93a864d-description.html.glemp index 0a5309c..5d705e3 100644 --- a/src/trelixir/feed/cfc19ed7-f46d-45b6-a134-e11df93a864d-description.html.glemp +++ b/src/trelixir/feed/cfc19ed7-f46d-45b6-a134-e11df93a864d-description.html.glemp @@ -3,5 +3,5 @@ </p> <p> - <a href="https://trelixir.fi/<%= event_file %>.html">Go to event page.</a> + <a href="<%= site_url %>/<%= event_file %>.html">Go to event page.</a> </p> diff --git a/src/trelixir/feed/feed.gleam b/src/trelixir/feed/feed.gleam index 04d664e..78ce6b5 100644 --- a/src/trelixir/feed/feed.gleam +++ b/src/trelixir/feed/feed.gleam @@ -8,6 +8,8 @@ import glemplate/ast import glemplate/renderer import trelixir/tpls import trelixir/events/event_2023_03_16 +import trelixir/events/utils +import trelixir/config pub const tpl = "feed.xml.glemp" @@ -32,20 +34,27 @@ pub fn render(template: ast.Template, template_cache: renderer.TemplateCache) { fn items() { [ + Item( + title: "Thanks and materials added", + link: utils.event_url(event_2023_03_16.file), + guid: "d11e88e3-87a1-4ee1-a02c-6e50b1c123d0", + description: "<p>Thanks to everyone for attending the first TRElixir in a long time! It was really nice to get to see all of you. I've added my talk materials to the website.</p>" <> "<p>The next TRElixir will likely be at the end of May or beginning of June. Watch this feed! :)</p>" <> "<p>If you have inspiration to talk about something yourself at the next event, or ideas or feedback for the event, please let me know! My contact details are on the main page of the website.</p>", + pub_date: "Sat, 18 Mar 2023 10:00:00 +0200", + ), Item( title: "Lightning talk possibility", - link: "https://trelixir.fi/" <> event_2023_03_16.file <> ".html", + link: utils.event_url(event_2023_03_16.file), guid: "8f77b5c8-2de0-49bb-b652-077a601f762b", description: "It's possible to hold a lightning talk (5–10 mins) at our event! Inquire for the possibility from Mikko Ahlroth (contact details on the website), or come talk to him before the event.", - pub_date: "Sun, 12 Mar 2023 9:40:00 +0200" + pub_date: "Sun, 12 Mar 2023 9:40:00 +0200", ), Item( title: "Upcoming event: 16.3.2023", - link: "https://trelixir.fi/" <> event_2023_03_16.file <> ".html", + link: utils.event_url(event_2023_03_16.file), guid: "cfc19ed7-f46d-45b6-a134-e11df93a864d", description: load_description( "cfc19ed7-f46d-45b6-a134-e11df93a864d", - assigns.new() + base_assigns() |> assigns.add_string("event_file", event_2023_03_16.file), ), pub_date: "Tue, 21 Feb 2023 21:30:00 +0200", @@ -70,7 +79,7 @@ fn items_to_assigns(items: List(Item)) { }, ) - assigns.new() + base_assigns() |> assigns.add_list("items", mapped) } @@ -80,3 +89,8 @@ fn load_description(item: String, data: assigns.Assigns) { let assert Ok(rendered) = html.render(parsed, data, map.new()) string_builder.to_string(rendered) } + +fn base_assigns() { + assigns.new() + |> assigns.add_string("site_url", config.url) +} diff --git a/src/trelixir/index.gleam b/src/trelixir/index.gleam index 6bf60ab..a6018db 100644 --- a/src/trelixir/index.gleam +++ b/src/trelixir/index.gleam @@ -1,5 +1,4 @@ import gleam/map -import gleam/list import glemplate/assigns import glemplate/renderer import glemplate/html @@ -28,13 +27,7 @@ pub fn assigns() { ", ), ), - #( - "talks", - assigns.List(list.map( - event_2023_03_16.data().talks, - utils.talk_to_assigns, - )), - ), + #("talks", utils.talks_to_assigns(event_2023_03_16.data().talks)), ])), ), #( @@ -53,13 +46,7 @@ pub fn assigns() { ", ), ), - #( - "talks", - assigns.List(list.map( - event_2017_09_21.data().talks, - utils.talk_to_assigns, - )), - ), + #("talks", utils.talks_to_assigns(event_2017_09_21.data().talks)), ])), ]), ), diff --git a/tpl/feed.xml.glemp b/tpl/feed.xml.glemp index 252d0b6..d68009d 100644 --- a/tpl/feed.xml.glemp +++ b/tpl/feed.xml.glemp @@ -2,7 +2,9 @@ <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"> <channel> <title>TRElixir - https://trelixir.fi/ + + <%= site_url %> + TRElixir newsletter feed. Glemplate © Mikko Ahlroth diff --git a/tpl/page.html.glemp b/tpl/page.html.glemp index c2a2f3e..86c3f39 100644 --- a/tpl/page.html.glemp +++ b/tpl/page.html.glemp @@ -35,15 +35,29 @@ <% else %>

<%= talk.title %>

- <%= talk.speaker.name %> + <% if talk.speaker.is_detailed %> + <%= talk.speaker.name %> + <% end %>

- <%= talk.speaker.name %><% if talk.speaker.company %>, <%= talk.speaker.company %><% end %> + <%= talk.speaker.name %><% if talk.speaker.is_detailed %><% if talk.speaker.company %>, <%= talk.speaker.company %><% end %><% end %>

-

- <%= raw talk.speaker.description %> -

+ <% if talk.speaker.is_detailed %> +

+ <%= raw talk.speaker.description %> +

+ <% end %> + + <% if talk.slides %> +

Slides & materials

+ + + <% end %> <% end %> <% end %>