diff --git a/build.sbt b/build.sbt index 80c696d3..50536227 100644 --- a/build.sbt +++ b/build.sbt @@ -48,14 +48,12 @@ lazy val root = project ) ) -def lines(lines: String*) = lines.mkString("\n") def slugify(name: String): String = name.toLowerCase().replace("-", "_") -def listMarkdowns(file: File): Seq[File] = file.listFiles().filter(_.getName.endsWith(".md")).toList -def listFolders(file: File): Seq[File] = file.listFiles().filter(_.isDirectory()).toList +val allConferences = new File("./public/conferences") def eventListing() = Def.task { val file = (Compile / sourceManaged).value / "io" / "scala" / "data" / "EventsData.scala" - val events = listMarkdowns(new File("./public/scalafr-meetups")) + val events = allConferences.listFiles(_.name.endsWith(".md")) val content = s"""|package io.scala.data | @@ -71,10 +69,9 @@ def eventListing() = Def.task { def confListing() = Def.task { val file = (Compile / sourceManaged).value / "io" / "scala" / "data" / "ConfsData.scala" - val conferences = listFolders(new File("./public/conferences")).map { folder => - val conference = listMarkdowns(folder).find(_.getName == "conference.md").get - val folderSlug = slugify(folder.getName) - folderSlug -> s"""| def ${folderSlug}: String = ${"\"" * 3 + IO.read(conference) + "\"" * 3}""" + val conferences = allConferences.globRecursive(_.name == "conference.md").get().map { file => + val folderSlug = slugify(file.getParentFile().name) + folderSlug -> s"""| def ${folderSlug}: String = ${"\"" * 3 + IO.read(file) + "\"" * 3}""" } val content = @@ -93,12 +90,12 @@ def confListing() = Def.task { def sessionsListing() = Def.task { val file = (Compile / sourceManaged).value / "io" / "scala" / "data" / "SessionsData.scala" - val sessionsByConf = listFolders(new File("./public/conferences")).map { folder => - val sessions = listMarkdowns(folder).filter(_.getName != "conference.md") - s"""| def ${slugify( - folder - .getName() - )}: List[String] = List(${sessions.map(file => "\"" * 3 + IO.read(file) + "\"" * 3).mkString(",")})""" + val sessionsByConf = allConferences.listFiles(_.isDirectory()).map { folder => + val sessions = (folder / "sessions").listFiles() + val slug = slugify(folder.getName) + s"""| def $slug: List[String] = List(${sessions + .map(file => "\"" * 3 + IO.read(file) + "\"" * 3) + .mkString(",")})""" } val content = @@ -116,9 +113,10 @@ def sessionsListing() = Def.task { def sponsorListing() = Def.task { val file = (Compile / sourceManaged).value / "io" / "scala" / "data" / "SponsorsData.scala" - val sponsors = listMarkdowns(new File("./public/sponsors")).map { md => - s"""| def ${slugify(md.base)}: String = ${"\"" * 3 + IO.read(md) + "\"" * 3}""" - } + val sponsors = + allConferences.globRecursive(_.name == "sponsors.md").get().map { md => + s"""| def ${slugify(md.getParentFile.name)}: String = ${"\"" * 3 + IO.read(md) + "\"" * 3}""" + } val content = s"""|package io.scala.data diff --git a/index.html b/index.html index 90dc4ac7..a894b1c0 100644 --- a/index.html +++ b/index.html @@ -13,13 +13,13 @@ - + ScalaIO diff --git a/public/.git-blame-ignore-revs b/public/.git-blame-ignore-revs deleted file mode 100644 index e69de29b..00000000 diff --git a/public/conferences/nantes-2024/armored-type-safety-with-iron.md b/public/conferences/nantes-2024/sessions/armored-type-safety-with-iron.md similarity index 96% rename from public/conferences/nantes-2024/armored-type-safety-with-iron.md rename to public/conferences/nantes-2024/sessions/armored-type-safety-with-iron.md index b149aa3a..a48e349a 100644 --- a/public/conferences/nantes-2024/armored-type-safety-with-iron.md +++ b/public/conferences/nantes-2024/sessions/armored-type-safety-with-iron.md @@ -23,7 +23,7 @@ In this talk, we’ll show first the different technique we can use to apply con ### Raphaël Lemaitre -- photoRelPath: /images/profiles/nantes-2024/rLemaitre.webp +- photoRelPath: /images/profiles/speakers/rLemaitre.webp - job: Senior Staff Engineer @ Ledger #### Links @@ -47,7 +47,7 @@ My interests span from software development to history and technology, where I e ### Valentin Bergeron -- photoRelPath: /images/profiles/nantes-2024/vBergeron.webp +- photoRelPath: /images/profiles/speakers/vBergeron.webp - job: Engineering team lead @ Ledger #### Links diff --git a/public/conferences/nantes-2024/chasing-arrows-functors-monads.md b/public/conferences/nantes-2024/sessions/chasing-arrows-functors-monads.md similarity index 94% rename from public/conferences/nantes-2024/chasing-arrows-functors-monads.md rename to public/conferences/nantes-2024/sessions/chasing-arrows-functors-monads.md index 30a86a20..1c4c86ab 100644 --- a/public/conferences/nantes-2024/chasing-arrows-functors-monads.md +++ b/public/conferences/nantes-2024/sessions/chasing-arrows-functors-monads.md @@ -4,7 +4,7 @@ - Slug: chasing-arrows-functors-monads - Category: Algebra - confirmed: true -- Slides: https://scala.io/slides/2024/chasing-arrows.pdf +- Slides: /conferences/nantes-2024/slides/2024/chasing-arrows.pdf - Replay: https://www.youtube.com/watch?v=KFhhR6tSy_0&list=PLjkHSzY9VuL96myavOIICS-x6yVyAMPjg&index=12&pp=iAQB ## Abstract @@ -26,7 +26,7 @@ This ScalaIO talk will be a overview of the EPITA CT4P course, with emphasis on ### Jim Newton -- photoRelPath: /images/profiles/nantes-2024/jim.webp +- photoRelPath: /images/profiles/speakers/jim.webp - job: Researcher @ EPITA Le Kremlin-Bicêtre #### Links @@ -46,7 +46,7 @@ Jim has been programming off and on in Scala for about 5 years. ### Uli Fahrenberg -- photoRelPath: /images/profiles/nantes-2024/uli.webp +- photoRelPath: /images/profiles/speakers/uli.webp - job: @ EPITA Rennes #### Links diff --git a/public/conferences/nantes-2024/contravariance-intuition-building.md b/public/conferences/nantes-2024/sessions/contravariance-intuition-building.md similarity index 94% rename from public/conferences/nantes-2024/contravariance-intuition-building.md rename to public/conferences/nantes-2024/sessions/contravariance-intuition-building.md index 86372fba..e72bca66 100644 --- a/public/conferences/nantes-2024/contravariance-intuition-building.md +++ b/public/conferences/nantes-2024/sessions/contravariance-intuition-building.md @@ -4,7 +4,7 @@ - Slug: contravariance-intuition-building - Category: Modeling - confirmed: true -- Slides: https://scala.io/slides/2024/Contravariance.pdf +- Slides: /conferences/nantes-2024/slides/2024/Contravariance.pdf - Replay: https://www.youtube.com/watch?v=A7t3b0kymFM&list=PLjkHSzY9VuL96myavOIICS-x6yVyAMPjg&index=13&pp=iAQB ## Abstract @@ -31,7 +31,7 @@ We’ll begin by working with an Animal type hierarchy and some PetRescue and Pe ### Sophie Collard -- photoRelPath: /images/profiles/nantes-2024/sCollard.webp +- photoRelPath: /images/profiles/speakers/sCollard.webp - job: Lead Software Engineer @ JPMorgan #### Links diff --git a/public/conferences/nantes-2024/data-pipelines-simple.md b/public/conferences/nantes-2024/sessions/data-pipelines-simple.md similarity index 90% rename from public/conferences/nantes-2024/data-pipelines-simple.md rename to public/conferences/nantes-2024/sessions/data-pipelines-simple.md index a728cade..7bf2cfc6 100644 --- a/public/conferences/nantes-2024/data-pipelines-simple.md +++ b/public/conferences/nantes-2024/sessions/data-pipelines-simple.md @@ -4,7 +4,7 @@ - Slug: data-pipelines-simple - Category: DataEng - confirmed: true -- Slides: https://scala.io/slides/2024/data-pipeline.pptx +- Slides: /conferences/nantes-2024/slides/2024/data-pipeline.pptx - Replay: https://www.youtube.com/watch?v=gS6zOfqUHVs&list=PLjkHSzY9VuL96myavOIICS-x6yVyAMPjg&index=8&pp=iAQB ## Abstract @@ -17,7 +17,7 @@ Most organizations have data pipelines and those are growing by the minute. But ### Raphael Claude -- photoRelPath: /images/profiles/nantes-2024/rClaude.webp +- photoRelPath: /images/profiles/speakers/rClaude.webp - job: Staff Dev Lead @ Criteo #### Links diff --git a/public/conferences/nantes-2024/dependent-types-from-theory-to-practice.md b/public/conferences/nantes-2024/sessions/dependent-types-from-theory-to-practice.md similarity index 96% rename from public/conferences/nantes-2024/dependent-types-from-theory-to-practice.md rename to public/conferences/nantes-2024/sessions/dependent-types-from-theory-to-practice.md index 3059a3c1..705442e4 100644 --- a/public/conferences/nantes-2024/dependent-types-from-theory-to-practice.md +++ b/public/conferences/nantes-2024/sessions/dependent-types-from-theory-to-practice.md @@ -23,7 +23,7 @@ Nous aborderons: le type fonctionnel dépendant, la paire dépendante, le type s ### Didier Plaindoux -- photoRelPath: /images/profiles/nantes-2024/dPlaindoux.webp +- photoRelPath: /images/profiles/speakers/dPlaindoux.webp - job: Senior Software Engineer @ Fungus (Freelance) #### Links diff --git a/public/conferences/nantes-2024/hands-on-besom-iac-with-scala.md b/public/conferences/nantes-2024/sessions/hands-on-besom-iac-with-scala.md similarity index 92% rename from public/conferences/nantes-2024/hands-on-besom-iac-with-scala.md rename to public/conferences/nantes-2024/sessions/hands-on-besom-iac-with-scala.md index d78d909a..96324b00 100644 --- a/public/conferences/nantes-2024/hands-on-besom-iac-with-scala.md +++ b/public/conferences/nantes-2024/sessions/hands-on-besom-iac-with-scala.md @@ -4,7 +4,7 @@ - Slug: hands-on-besom-iac-with-scala - Category: Cloud - confirmed: true -- Slides: https://scala.io/slides/2024/besom.pdf +- Slides: /conferences/nantes-2024/slides/2024/besom.pdf - Replay: https://www.youtube.com/watch?v=J0vXLHN8YpA&list=PLjkHSzY9VuL96myavOIICS-x6yVyAMPjg&index=7&pp=iAQB ## Abstract @@ -17,7 +17,7 @@ In my talk I will briefly introduce Besom, a Pulumi SDK for Scala and then swift ### Łukasz Biały -- photoRelPath: /images/profiles/nantes-2024/lBialy.webp +- photoRelPath: /images/profiles/speakers/lBialy.webp - job: Software Engineer @ VirtusLab #### Links diff --git a/public/conferences/nantes-2024/intro-to-gadts.md b/public/conferences/nantes-2024/sessions/intro-to-gadts.md similarity index 89% rename from public/conferences/nantes-2024/intro-to-gadts.md rename to public/conferences/nantes-2024/sessions/intro-to-gadts.md index da53063b..bd6aaa4a 100644 --- a/public/conferences/nantes-2024/intro-to-gadts.md +++ b/public/conferences/nantes-2024/sessions/intro-to-gadts.md @@ -4,7 +4,7 @@ - Slug: intro-to-gadts - Category: Algebra - confirmed: true -- Slides: https://scala.io/slides/2024/GADTs-xavier-vw-woestyne.pdf +- Slides: /conferences/nantes-2024/slides/2024/GADTs-xavier-vw-woestyne.pdf - Replay: https://www.youtube.com/watch?v=r4c7xuVB9xA&ab_channel=ScalaIOFR ## Abstract @@ -17,7 +17,7 @@ Les GADTs et Scala, c’est une très longue histoire de “je t’aime, moi non ### Xavier Van de Woestyne -- photoRelPath: /images/profiles/nantes-2024/xVdW.webp +- photoRelPath: /images/profiles/speakers/xVdW.webp - job: Software Engineer @ The Funkyworkers #### Links diff --git a/public/conferences/nantes-2024/introduction-to-smithy-smithy4s.md b/public/conferences/nantes-2024/sessions/introduction-to-smithy-smithy4s.md similarity index 97% rename from public/conferences/nantes-2024/introduction-to-smithy-smithy4s.md rename to public/conferences/nantes-2024/sessions/introduction-to-smithy-smithy4s.md index 932cba6f..c58cb731 100644 --- a/public/conferences/nantes-2024/introduction-to-smithy-smithy4s.md +++ b/public/conferences/nantes-2024/sessions/introduction-to-smithy-smithy4s.md @@ -23,7 +23,7 @@ This talk will serve as an introduction to the Smithy IDL, and a demo of what is ### Olivier Mélois -- photoRelPath: /images/profiles/nantes-2024/oMelois.webp +- photoRelPath: /images/profiles/speakers/oMelois.webp - job: Principal Engineer @ Disney Streaming Services #### Links diff --git a/public/conferences/nantes-2024/kapoeira-with-kafka-streams.md b/public/conferences/nantes-2024/sessions/kapoeira-with-kafka-streams.md similarity index 95% rename from public/conferences/nantes-2024/kapoeira-with-kafka-streams.md rename to public/conferences/nantes-2024/sessions/kapoeira-with-kafka-streams.md index 0db262a2..2d6fceb8 100644 --- a/public/conferences/nantes-2024/kapoeira-with-kafka-streams.md +++ b/public/conferences/nantes-2024/sessions/kapoeira-with-kafka-streams.md @@ -27,7 +27,7 @@ Si vous êtes intéressés, nous serons ravis de récolter vos retours et vos co ### Johanna Vauchel -- photoRelPath: /images/profiles/nantes-2024/jVauchel.webp +- photoRelPath: /images/profiles/speakers/jVauchel.webp - job: Data Engineer @ Lectra #### Links @@ -44,7 +44,7 @@ Diplômée de l'INSA de Rouen spécialité Génie Mathématique, j'ai commencé ### Mehdi Rebiai -- photoRelPath: /images/profiles/nantes-2024/mRebiai.webp +- photoRelPath: /images/profiles/speakers/mRebiai.webp - job: Data Engineer, Tech Lead @ Lectra - confirmed: true diff --git a/public/conferences/nantes-2024/logic-meta-programming-for-functional-languages.md b/public/conferences/nantes-2024/sessions/logic-meta-programming-for-functional-languages.md similarity index 96% rename from public/conferences/nantes-2024/logic-meta-programming-for-functional-languages.md rename to public/conferences/nantes-2024/sessions/logic-meta-programming-for-functional-languages.md index fe1d3d41..595b52d0 100644 --- a/public/conferences/nantes-2024/logic-meta-programming-for-functional-languages.md +++ b/public/conferences/nantes-2024/sessions/logic-meta-programming-for-functional-languages.md @@ -17,7 +17,7 @@ Since the beginning of the 21st century, the functional programming paradigm, wh ### Enzo Crance -- photoRelPath: /images/profiles/nantes-2024/eCrance.webp +- photoRelPath: /images/profiles/speakers/eCrance.webp - job: PhD Student @ INRIA #### Links diff --git a/public/conferences/nantes-2024/migrating-gallia-to-scala-3.md b/public/conferences/nantes-2024/sessions/migrating-gallia-to-scala-3.md similarity index 96% rename from public/conferences/nantes-2024/migrating-gallia-to-scala-3.md rename to public/conferences/nantes-2024/sessions/migrating-gallia-to-scala-3.md index 08e7704c..47e74c12 100644 --- a/public/conferences/nantes-2024/migrating-gallia-to-scala-3.md +++ b/public/conferences/nantes-2024/sessions/migrating-gallia-to-scala-3.md @@ -4,7 +4,7 @@ - Slug: migrating-gallia-to-scala-3 - Category: ToolsEcosystem - confirmed: true -- Slides: https://scala.io/slides/2024/gallia-migration.pdf +- Slides: /conferences/nantes-2024/slides/2024/gallia-migration.pdf - Replay: https://www.youtube.com/watch?v=DzjvFx5YYik&list=PLjkHSzY9VuL96myavOIICS-x6yVyAMPjg&index=14&pp=iAQB ## Abstract @@ -21,7 +21,7 @@ I will briefly introduce how certain features [worked before](https://github.com ### Anthony Cros -- photoRelPath: /images/profiles/nantes-2024/aCros.webp +- photoRelPath: /images/profiles/speakers/aCros.webp - job: Software Architect @ Self-employed #### Links diff --git a/public/conferences/nantes-2024/my-first-year-in-scala.md b/public/conferences/nantes-2024/sessions/my-first-year-in-scala.md similarity index 94% rename from public/conferences/nantes-2024/my-first-year-in-scala.md rename to public/conferences/nantes-2024/sessions/my-first-year-in-scala.md index 136721cb..5f9f6c51 100644 --- a/public/conferences/nantes-2024/my-first-year-in-scala.md +++ b/public/conferences/nantes-2024/sessions/my-first-year-in-scala.md @@ -4,7 +4,7 @@ - Slug: my-first-year-in-scala - Category: Community - confirmed: true -- Slides: https://scala.io/slides/2024/first-year-scala.pdf +- Slides: /conferences/nantes-2024/slides/2024/first-year-scala.pdf - Replay: https://www.youtube.com/watch?v=Jyn2l1nhwZE&list=PLjkHSzY9VuL96myavOIICS-x6yVyAMPjg&index=3&pp=iAQB ## Abstract @@ -27,7 +27,7 @@ By the end of this talk, I hope that newcomers will feel less alone and more opt ### Monica McGuigan -- photoRelPath: /images/profiles/nantes-2024/mMcGuigan.webp +- photoRelPath: /images/profiles/speakers/mMcGuigan.webp - job: Software Engineer @ JP Morgan #### Links diff --git a/public/conferences/nantes-2024/nails-are-tree-need-chainsaw.md b/public/conferences/nantes-2024/sessions/nails-are-tree-need-chainsaw.md similarity index 92% rename from public/conferences/nantes-2024/nails-are-tree-need-chainsaw.md rename to public/conferences/nantes-2024/sessions/nails-are-tree-need-chainsaw.md index 3e4db610..6b93cd01 100644 --- a/public/conferences/nantes-2024/nails-are-tree-need-chainsaw.md +++ b/public/conferences/nantes-2024/sessions/nails-are-tree-need-chainsaw.md @@ -4,7 +4,7 @@ - Slug: nails-are-tree-need-chainsaw - Category: Algebra - confirmed: true -- Slides: https://scala.io/slides/2024/Chainsaw.pdf +- Slides: /conferences/nantes-2024/slides/2024/Chainsaw.pdf - Replay: https://www.youtube.com/watch?v=0unlHZmNYkw&list=PLjkHSzY9VuL96myavOIICS-x6yVyAMPjg&index=5&pp=iAQB ## Abstract @@ -24,7 +24,7 @@ the process and how it helped me solved my problems with less pain. ### Matthieu Baechler -- photoRelPath: /images/profiles/nantes-2024/mBaechler.webp +- photoRelPath: /images/profiles/speakers/mBaechler.webp - job: Developer @ Freelancer #### Links diff --git a/public/conferences/nantes-2024/rex-migration-scala-2-to-3.md b/public/conferences/nantes-2024/sessions/rex-migration-scala-2-to-3.md similarity index 92% rename from public/conferences/nantes-2024/rex-migration-scala-2-to-3.md rename to public/conferences/nantes-2024/sessions/rex-migration-scala-2-to-3.md index 93a2d0fd..f044683a 100644 --- a/public/conferences/nantes-2024/rex-migration-scala-2-to-3.md +++ b/public/conferences/nantes-2024/sessions/rex-migration-scala-2-to-3.md @@ -26,7 +26,7 @@ tout ça dans le but d'accéder au trésor : Scala 3. ### Antoine Blondeau -- photoRelPath: /images/profiles/nantes-2024/aBlondeau.webp +- photoRelPath: /images/profiles/speakers/aBlondeau.webp - job: Developer @ Clever Cloud #### Links @@ -42,7 +42,7 @@ I'm a backend developer specialized in platform orchestration. I have experience ### Jean-Baptiste Kaiser -- photoRelPath: /images/profiles/nantes-2024/jbKaiser.webp +- photoRelPath: /images/profiles/speakers/jbKaiser.webp - job: Scala Developer @ Clever Cloud - confirmed: true diff --git a/public/conferences/nantes-2024/scala-3-compiler-academy-journey.md b/public/conferences/nantes-2024/sessions/scala-3-compiler-academy-journey.md similarity index 97% rename from public/conferences/nantes-2024/scala-3-compiler-academy-journey.md rename to public/conferences/nantes-2024/sessions/scala-3-compiler-academy-journey.md index e16542c7..d8b17b9d 100644 --- a/public/conferences/nantes-2024/scala-3-compiler-academy-journey.md +++ b/public/conferences/nantes-2024/sessions/scala-3-compiler-academy-journey.md @@ -19,7 +19,7 @@ Now, two years later, with the format fleshed out and the lessons learnt, I’d ### Anatolii Kmetiuk -- photoRelPath: /images/profiles/nantes-2024/toli.webp +- photoRelPath: /images/profiles/speakers/toli.webp - job: Compiler engineer and community manager @ Scala Center, EPFL #### Links diff --git a/public/conferences/nantes-2024/songwriting-in-scala-dsl-and-adt.md b/public/conferences/nantes-2024/sessions/songwriting-in-scala-dsl-and-adt.md similarity index 96% rename from public/conferences/nantes-2024/songwriting-in-scala-dsl-and-adt.md rename to public/conferences/nantes-2024/sessions/songwriting-in-scala-dsl-and-adt.md index 9816785c..461e5747 100644 --- a/public/conferences/nantes-2024/songwriting-in-scala-dsl-and-adt.md +++ b/public/conferences/nantes-2024/sessions/songwriting-in-scala-dsl-and-adt.md @@ -23,7 +23,7 @@ Topics covered: ### Paul Matthews -- photoRelPath: /images/profiles/nantes-2024/pMatthews.webp +- photoRelPath: /images/profiles/speakers/pMatthews.webp - job: Backend Scala Developer @ ClearScore #### Links diff --git a/public/conferences/nantes-2024/ukraine-scala-community.md b/public/conferences/nantes-2024/sessions/ukraine-scala-community.md similarity index 94% rename from public/conferences/nantes-2024/ukraine-scala-community.md rename to public/conferences/nantes-2024/sessions/ukraine-scala-community.md index f9963434..749648f0 100644 --- a/public/conferences/nantes-2024/ukraine-scala-community.md +++ b/public/conferences/nantes-2024/sessions/ukraine-scala-community.md @@ -4,7 +4,7 @@ - Slug: ukraine-scala-community - Category: Community - confirmed: true -- Slides: https://scala.io/slides/2024/scala-community-building-lessons.pptx +- Slides: /conferences/nantes-2024/slides/2024/scala-community-building-lessons.pptx - Replay: https://www.youtube.com/watch?v=6skPn0evEE8&list=PLjkHSzY9VuL96myavOIICS-x6yVyAMPjg&index=11&pp=iAQB ## Abstract @@ -21,7 +21,7 @@ Discover our presence at conferences, active engagement in programs such as Goog ### Olya Mazhara -- photoRelPath: /images/profiles/nantes-2024/oMazhara.webp +- photoRelPath: /images/profiles/speakers/oMazhara.webp - job: Software Engineer @ Intellias #### Links diff --git a/public/conferences/nantes-2024/unleashing-scalafix-potential.md b/public/conferences/nantes-2024/sessions/unleashing-scalafix-potential.md similarity index 94% rename from public/conferences/nantes-2024/unleashing-scalafix-potential.md rename to public/conferences/nantes-2024/sessions/unleashing-scalafix-potential.md index 6ab4699a..113f0ca5 100644 --- a/public/conferences/nantes-2024/unleashing-scalafix-potential.md +++ b/public/conferences/nantes-2024/sessions/unleashing-scalafix-potential.md @@ -4,7 +4,7 @@ - Slug: unleashing-scalafix-potential - Category: ToolsEcosystem - confirmed: true -- Slides: https://scala.io/slides/2024/scalafix.pdf +- Slides: /conferences/nantes-2024/slides/2024/scalafix.pdf - Replay: https://www.youtube.com/watch?v=qexJYvo2EwY&list=PLjkHSzY9VuL96myavOIICS-x6yVyAMPjg&index=15&pp=iAQB ## Abstract @@ -21,7 +21,7 @@ In this talk, we will [demystify AST traversal and semantic information lookup]( ### Brice Jaglin -- photoRelPath: /images/profiles/nantes-2024/bJaglin.webp +- photoRelPath: /images/profiles/speakers/bJaglin.webp - job: Staff Engineer @ Swile #### Links diff --git a/public/conferences/nantes-2024/unwrapping-io.md b/public/conferences/nantes-2024/sessions/unwrapping-io.md similarity index 97% rename from public/conferences/nantes-2024/unwrapping-io.md rename to public/conferences/nantes-2024/sessions/unwrapping-io.md index b367d2da..a502c939 100644 --- a/public/conferences/nantes-2024/unwrapping-io.md +++ b/public/conferences/nantes-2024/sessions/unwrapping-io.md @@ -23,7 +23,7 @@ We will compare both the low-level aspects, as well as take a look at structured ### Adam Warski -- photoRelPath: /images/profiles/nantes-2024/aWarski.webp +- photoRelPath: /images/profiles/speakers/aWarski.webp - job: Co-founder @ SoftwareMill #### Links diff --git a/public/conferences/nantes-2024/use-ai-in-your-programs.md b/public/conferences/nantes-2024/sessions/use-ai-in-your-programs.md similarity index 94% rename from public/conferences/nantes-2024/use-ai-in-your-programs.md rename to public/conferences/nantes-2024/sessions/use-ai-in-your-programs.md index fed6411f..b755ed02 100644 --- a/public/conferences/nantes-2024/use-ai-in-your-programs.md +++ b/public/conferences/nantes-2024/sessions/use-ai-in-your-programs.md @@ -19,7 +19,7 @@ Une fois ceci fait, je souhaite montrer comment utiliser un modèle en utilisant ### François Laroche -- photoRelPath: /images/profiles/nantes-2024/fLaroche.webp +- photoRelPath: /images/profiles/speakers/fLaroche.webp - job: Tech Lead @ NuMind #### Links @@ -37,7 +37,7 @@ Je suis actuellement développeur chez NuMind où nous aidons nos clients à ent ### Samuel Bernard -- photoRelPath: /images/profiles/nantes-2024/sBernard.webp +- photoRelPath: /images/profiles/speakers/sBernard.webp - job: Co-Founder & CTO @ NuMind #### Links diff --git a/public/slides/2024/Chainsaw.pdf b/public/conferences/nantes-2024/slides/2024/Chainsaw.pdf similarity index 100% rename from public/slides/2024/Chainsaw.pdf rename to public/conferences/nantes-2024/slides/2024/Chainsaw.pdf diff --git a/public/slides/2024/Contravariance.pdf b/public/conferences/nantes-2024/slides/2024/Contravariance.pdf similarity index 100% rename from public/slides/2024/Contravariance.pdf rename to public/conferences/nantes-2024/slides/2024/Contravariance.pdf diff --git a/public/slides/2024/GADTs-xavier-vw-woestyne.pdf b/public/conferences/nantes-2024/slides/2024/GADTs-xavier-vw-woestyne.pdf similarity index 100% rename from public/slides/2024/GADTs-xavier-vw-woestyne.pdf rename to public/conferences/nantes-2024/slides/2024/GADTs-xavier-vw-woestyne.pdf diff --git a/public/slides/2024/besom.pdf b/public/conferences/nantes-2024/slides/2024/besom.pdf similarity index 100% rename from public/slides/2024/besom.pdf rename to public/conferences/nantes-2024/slides/2024/besom.pdf diff --git a/public/slides/2024/chasing-arrows.pdf b/public/conferences/nantes-2024/slides/2024/chasing-arrows.pdf similarity index 100% rename from public/slides/2024/chasing-arrows.pdf rename to public/conferences/nantes-2024/slides/2024/chasing-arrows.pdf diff --git a/public/slides/2024/data-pipeline.pptx b/public/conferences/nantes-2024/slides/2024/data-pipeline.pptx similarity index 100% rename from public/slides/2024/data-pipeline.pptx rename to public/conferences/nantes-2024/slides/2024/data-pipeline.pptx diff --git a/public/slides/2024/first-year-scala.pdf b/public/conferences/nantes-2024/slides/2024/first-year-scala.pdf similarity index 100% rename from public/slides/2024/first-year-scala.pdf rename to public/conferences/nantes-2024/slides/2024/first-year-scala.pdf diff --git a/public/slides/2024/gallia-migration.pdf b/public/conferences/nantes-2024/slides/2024/gallia-migration.pdf similarity index 100% rename from public/slides/2024/gallia-migration.pdf rename to public/conferences/nantes-2024/slides/2024/gallia-migration.pdf diff --git a/public/slides/2024/scala-community-building-lessons.pptx b/public/conferences/nantes-2024/slides/2024/scala-community-building-lessons.pptx similarity index 100% rename from public/slides/2024/scala-community-building-lessons.pptx rename to public/conferences/nantes-2024/slides/2024/scala-community-building-lessons.pptx diff --git a/public/slides/2024/scalafix.pdf b/public/conferences/nantes-2024/slides/2024/scalafix.pdf similarity index 100% rename from public/slides/2024/scalafix.pdf rename to public/conferences/nantes-2024/slides/2024/scalafix.pdf diff --git a/public/sponsors/nantes-2024.md b/public/conferences/nantes-2024/sponsors.md similarity index 100% rename from public/sponsors/nantes-2024.md rename to public/conferences/nantes-2024/sponsors.md diff --git a/public/conferences/paris-2024/anatomy-scaladex.md b/public/conferences/paris-2024/sessions/anatomy-scaladex.md similarity index 97% rename from public/conferences/paris-2024/anatomy-scaladex.md rename to public/conferences/paris-2024/sessions/anatomy-scaladex.md index c8f08894..9cd1ce14 100644 --- a/public/conferences/paris-2024/anatomy-scaladex.md +++ b/public/conferences/paris-2024/sessions/anatomy-scaladex.md @@ -19,7 +19,7 @@ In this talk, I will introduce you to Scaladex, an exciting project I began expl ### Kannupriya Kalra -- photoRelPath: /images/profiles/paris-2024/kKalra.webp +- photoRelPath: /images/profiles/speakers/kKalra.webp - job: Scala Developer @ Sky #### Links diff --git a/public/conferences/paris-2024/better-builds-with-mill.md b/public/conferences/paris-2024/sessions/better-builds-with-mill.md similarity index 95% rename from public/conferences/paris-2024/better-builds-with-mill.md rename to public/conferences/paris-2024/sessions/better-builds-with-mill.md index 2517f483..dcd59690 100644 --- a/public/conferences/paris-2024/better-builds-with-mill.md +++ b/public/conferences/paris-2024/sessions/better-builds-with-mill.md @@ -15,7 +15,7 @@ Mill is a Scala build tool that improves upon the SBT toolchain: more performant ### Li Haoyi -- photoRelPath: /images/profiles/paris-2024/lHaoyi.webp +- photoRelPath: /images/profiles/speakers/lHaoyi.webp - job: N/A #### Links diff --git a/public/conferences/paris-2024/beyond-basics-lsp.md b/public/conferences/paris-2024/sessions/beyond-basics-lsp.md similarity index 95% rename from public/conferences/paris-2024/beyond-basics-lsp.md rename to public/conferences/paris-2024/sessions/beyond-basics-lsp.md index 2e87db01..f0697344 100644 --- a/public/conferences/paris-2024/beyond-basics-lsp.md +++ b/public/conferences/paris-2024/sessions/beyond-basics-lsp.md @@ -15,7 +15,7 @@ LSP has greatly standardised the behaviour of IDEs, in a good direction: we can ### Xavier Van de Woestyne -- photoRelPath: /images/profiles/paris-2024/xVanDeWoestyne.webp +- photoRelPath: /images/profiles/speakers/xVanDeWoestyne.webp - job: OCaml Software Engineering at Tarides #### Links diff --git a/public/conferences/paris-2024/building-robust-applications-with-kyo-intro.md b/public/conferences/paris-2024/sessions/building-robust-applications-with-kyo-intro.md similarity index 97% rename from public/conferences/paris-2024/building-robust-applications-with-kyo-intro.md rename to public/conferences/paris-2024/sessions/building-robust-applications-with-kyo-intro.md index c4e09e18..46dc1871 100644 --- a/public/conferences/paris-2024/building-robust-applications-with-kyo-intro.md +++ b/public/conferences/paris-2024/sessions/building-robust-applications-with-kyo-intro.md @@ -21,7 +21,7 @@ Participants should have basic Scala knowledge and bring a laptop with a Scala d ### Adam Hearn -- photoRelPath: /images/profiles/paris-2024/aHearn.jpg +- photoRelPath: /images/profiles/speakers/aHearn.jpg - job: Sofware Engineer @ Amazon #### Links diff --git a/public/conferences/paris-2024/building-robust-applications-with-kyo.md b/public/conferences/paris-2024/sessions/building-robust-applications-with-kyo.md similarity index 97% rename from public/conferences/paris-2024/building-robust-applications-with-kyo.md rename to public/conferences/paris-2024/sessions/building-robust-applications-with-kyo.md index cf29bd78..db3aade6 100644 --- a/public/conferences/paris-2024/building-robust-applications-with-kyo.md +++ b/public/conferences/paris-2024/sessions/building-robust-applications-with-kyo.md @@ -21,7 +21,7 @@ Participants should have basic Scala knowledge and bring a laptop with a Scala d ### Adam Hearn -- photoRelPath: /images/profiles/paris-2024/aHearn.jpg +- photoRelPath: /images/profiles/speakers/aHearn.jpg - job: Sofware Engineer @ Amazon #### Links diff --git a/public/conferences/paris-2024/calculating-funnier.md b/public/conferences/paris-2024/sessions/calculating-funnier.md similarity index 97% rename from public/conferences/paris-2024/calculating-funnier.md rename to public/conferences/paris-2024/sessions/calculating-funnier.md index a2aaffbb..29712158 100644 --- a/public/conferences/paris-2024/calculating-funnier.md +++ b/public/conferences/paris-2024/sessions/calculating-funnier.md @@ -19,7 +19,7 @@ Expr is very simple though, in real life we seldom face such simplistic cases. T ### Regis Kuckaertz -- photoRelPath: /images/profiles/paris-2024/rKuckaertz.webp +- photoRelPath: /images/profiles/speakers/rKuckaertz.webp - job: Principal Engineer @ Pirum #### Links diff --git a/public/conferences/paris-2024/computer-algebra-scala.md b/public/conferences/paris-2024/sessions/computer-algebra-scala.md similarity index 95% rename from public/conferences/paris-2024/computer-algebra-scala.md rename to public/conferences/paris-2024/sessions/computer-algebra-scala.md index 6462b6f2..0df9d7fc 100644 --- a/public/conferences/paris-2024/computer-algebra-scala.md +++ b/public/conferences/paris-2024/sessions/computer-algebra-scala.md @@ -15,7 +15,7 @@ The Scala Algebra System (ScAS) is a research project devised to explore how one ### Raphaël Jolly -- photoRelPath: /images/profiles/paris-2024/rJolly.webp +- photoRelPath: /images/profiles/speakers/rJolly.webp - job: Software Engineer #### Links diff --git a/public/conferences/paris-2024/contextual-abstraction-scala3.md b/public/conferences/paris-2024/sessions/contextual-abstraction-scala3.md similarity index 97% rename from public/conferences/paris-2024/contextual-abstraction-scala3.md rename to public/conferences/paris-2024/sessions/contextual-abstraction-scala3.md index 1632ff92..f6719253 100644 --- a/public/conferences/paris-2024/contextual-abstraction-scala3.md +++ b/public/conferences/paris-2024/sessions/contextual-abstraction-scala3.md @@ -15,7 +15,7 @@ Have you ever been confused by implicits in Scala? I most certainly have. I stru ### Magda Stożek -- photoRelPath: /images/profiles/paris-2024/mStozek.webp +- photoRelPath: /images/profiles/speakers/mStozek.webp - job: Senior Scala engineer @ SoftwareMill #### Links diff --git a/public/conferences/paris-2024/decision4s.md b/public/conferences/paris-2024/sessions/decision4s.md similarity index 95% rename from public/conferences/paris-2024/decision4s.md rename to public/conferences/paris-2024/sessions/decision4s.md index 8a501dfb..c52b04e3 100644 --- a/public/conferences/paris-2024/decision4s.md +++ b/public/conferences/paris-2024/sessions/decision4s.md @@ -15,7 +15,7 @@ Higher-kinded data is a specialised application of higher-kinded types. It allow ### Wojciech Pituła -- photoRelPath: /images/profiles/paris-2024/vPitula.webp +- photoRelPath: /images/profiles/speakers/vPitula.webp - job: Staff Engineer @ SwissBorg #### Links diff --git a/public/conferences/paris-2024/escaping-false-dichotomy.md b/public/conferences/paris-2024/sessions/escaping-false-dichotomy.md similarity index 95% rename from public/conferences/paris-2024/escaping-false-dichotomy.md rename to public/conferences/paris-2024/sessions/escaping-false-dichotomy.md index f544c0c4..29bf8407 100644 --- a/public/conferences/paris-2024/escaping-false-dichotomy.md +++ b/public/conferences/paris-2024/sessions/escaping-false-dichotomy.md @@ -15,7 +15,7 @@ Are you using one of many type-class based libraries in Scala? Have you ever bee ### Mateusz Kubuszok -- photoRelPath: /images/profiles/paris-2024/mKubuszok.webp +- photoRelPath: /images/profiles/speakers/mKubuszok.webp - job: Senior Scala Developer @ Self-Employed #### Links diff --git a/public/conferences/paris-2024/fast-scala-web-workshop.md b/public/conferences/paris-2024/sessions/fast-scala-web-workshop.md similarity index 95% rename from public/conferences/paris-2024/fast-scala-web-workshop.md rename to public/conferences/paris-2024/sessions/fast-scala-web-workshop.md index 7db50d58..7a268eef 100644 --- a/public/conferences/paris-2024/fast-scala-web-workshop.md +++ b/public/conferences/paris-2024/sessions/fast-scala-web-workshop.md @@ -19,7 +19,7 @@ In this workshop we will introduce you to the FastScala framework, it's installa ### David Miguel Antunes -- photoRelPath: /images/profiles/paris-2024/dAntunes.webp +- photoRelPath: /images/profiles/speakers/dAntunes.webp - job: Scala Developer & founder @ Scala Academy #### Links diff --git a/public/conferences/paris-2024/fast-scala-web.md b/public/conferences/paris-2024/sessions/fast-scala-web.md similarity index 95% rename from public/conferences/paris-2024/fast-scala-web.md rename to public/conferences/paris-2024/sessions/fast-scala-web.md index de922884..24fcf6f8 100644 --- a/public/conferences/paris-2024/fast-scala-web.md +++ b/public/conferences/paris-2024/sessions/fast-scala-web.md @@ -15,7 +15,7 @@ The FastScala web framework is based on anonymous and secure callbacks from the ### David Miguel Antunes -- photoRelPath: /images/profiles/paris-2024/dAntunes.webp +- photoRelPath: /images/profiles/speakers/dAntunes.webp - job: Scala Developer & founder @ Scala Academy #### Links diff --git a/public/conferences/paris-2024/full-stack-scala.md b/public/conferences/paris-2024/sessions/full-stack-scala.md similarity index 92% rename from public/conferences/paris-2024/full-stack-scala.md rename to public/conferences/paris-2024/sessions/full-stack-scala.md index c84c1b3f..b6226a3a 100644 --- a/public/conferences/paris-2024/full-stack-scala.md +++ b/public/conferences/paris-2024/sessions/full-stack-scala.md @@ -17,7 +17,7 @@ All set up in 10 seconds. ### Olivier Nouguier -- photoRelPath: /images/profiles/paris-2024/oNouguier.webp +- photoRelPath: /images/profiles/speakers/oNouguier.webp - job: Software Engineer @ Ledger #### Links diff --git a/public/conferences/paris-2024/how-functional-is-direct-style.md b/public/conferences/paris-2024/sessions/how-functional-is-direct-style.md similarity index 96% rename from public/conferences/paris-2024/how-functional-is-direct-style.md rename to public/conferences/paris-2024/sessions/how-functional-is-direct-style.md index edddd4fb..eca30df5 100644 --- a/public/conferences/paris-2024/how-functional-is-direct-style.md +++ b/public/conferences/paris-2024/sessions/how-functional-is-direct-style.md @@ -19,7 +19,7 @@ We’ll investigate what functional programming is at its core, how it relates t ### Adam Warski -- photoRelPath: /images/profiles/paris-2024/aWarski.webp +- photoRelPath: /images/profiles/speakers/aWarski.webp - job: Co-founder @ SoftwareMill #### Links diff --git a/public/conferences/paris-2024/keynote-nicolas.md b/public/conferences/paris-2024/sessions/keynote-nicolas.md similarity index 96% rename from public/conferences/paris-2024/keynote-nicolas.md rename to public/conferences/paris-2024/sessions/keynote-nicolas.md index 4577da37..48b347fb 100644 --- a/public/conferences/paris-2024/keynote-nicolas.md +++ b/public/conferences/paris-2024/sessions/keynote-nicolas.md @@ -17,7 +17,7 @@ In this talk, I will show you how to create a programming language from scratch ### Nicolas Rinaudo -- photoRelPath: /images/profiles/paris-2024/nRinaudo.jpeg +- photoRelPath: /images/profiles/speakers/nRinaudo.jpeg - job: VP of Engineering @ J.P. Morgan #### Links diff --git a/public/conferences/paris-2024/keynote-valentin.md b/public/conferences/paris-2024/sessions/keynote-valentin.md similarity index 95% rename from public/conferences/paris-2024/keynote-valentin.md rename to public/conferences/paris-2024/sessions/keynote-valentin.md index d8966744..de59472b 100644 --- a/public/conferences/paris-2024/keynote-valentin.md +++ b/public/conferences/paris-2024/sessions/keynote-valentin.md @@ -19,7 +19,7 @@ Bring your heart, and maybe a notebook. ### Valentin Kasas -- photoRelPath: /images/profiles/paris-2024/vKasas.jpeg +- photoRelPath: /images/profiles/speakers/vKasas.jpeg - job: Scala Lover #### Links diff --git a/public/conferences/paris-2024/metaprogramming-in-scala3.md b/public/conferences/paris-2024/sessions/metaprogramming-in-scala3.md similarity index 96% rename from public/conferences/paris-2024/metaprogramming-in-scala3.md rename to public/conferences/paris-2024/sessions/metaprogramming-in-scala3.md index 425f7644..c575e93b 100644 --- a/public/conferences/paris-2024/metaprogramming-in-scala3.md +++ b/public/conferences/paris-2024/sessions/metaprogramming-in-scala3.md @@ -29,7 +29,7 @@ In short, we’ll be exploring the compile-time arsenal that Scala 3 gives us wi ### Aleksander Rainko -- photoRelPath: /images/profiles/paris-2024/aRainko.webp +- photoRelPath: /images/profiles/speakers/aRainko.webp - job: Scala Developer @ Scalac #### Links diff --git a/public/conferences/paris-2024/mill-builds-scala3.md b/public/conferences/paris-2024/sessions/mill-builds-scala3.md similarity index 94% rename from public/conferences/paris-2024/mill-builds-scala3.md rename to public/conferences/paris-2024/sessions/mill-builds-scala3.md index 0b056591..d555cd9b 100644 --- a/public/conferences/paris-2024/mill-builds-scala3.md +++ b/public/conferences/paris-2024/sessions/mill-builds-scala3.md @@ -15,7 +15,7 @@ Mill is a popular build tool used in Scala projects, where build definitions are ### Jamie Thompson -- photoRelPath: /images/profiles/paris-2024/jThompson.webp +- photoRelPath: /images/profiles/speakers/jThompson.webp - job: Scala 3 compiler contributor #### Links diff --git a/public/conferences/paris-2024/optimize-kafka-to-bq.md b/public/conferences/paris-2024/sessions/optimize-kafka-to-bq.md similarity index 96% rename from public/conferences/paris-2024/optimize-kafka-to-bq.md rename to public/conferences/paris-2024/sessions/optimize-kafka-to-bq.md index 0ac8a327..83312698 100644 --- a/public/conferences/paris-2024/optimize-kafka-to-bq.md +++ b/public/conferences/paris-2024/sessions/optimize-kafka-to-bq.md @@ -15,7 +15,7 @@ I will explore how our team developed a custom solution to address the escalatin ### Dario Amorosi -- photoRelPath: /images/profiles/paris-2024/dAmorosi.webp +- photoRelPath: /images/profiles/speakers/dAmorosi.webp - job: Big Data Engineer @ Adevinta #### Links diff --git a/public/conferences/paris-2024/plowing-postgres.md b/public/conferences/paris-2024/sessions/plowing-postgres.md similarity index 95% rename from public/conferences/paris-2024/plowing-postgres.md rename to public/conferences/paris-2024/sessions/plowing-postgres.md index 4fae787a..a77c0fe6 100644 --- a/public/conferences/paris-2024/plowing-postgres.md +++ b/public/conferences/paris-2024/sessions/plowing-postgres.md @@ -21,7 +21,7 @@ Join to learn more about applying functional principle to schema modeling and ha ### Valentin Bergeron -- photoRelPath: /images/profiles/paris-2024/vBergeron.webp +- photoRelPath: /images/profiles/speakers/vBergeron.webp - job: Engineering team lead @ Ledger - confirmed: true diff --git a/public/conferences/paris-2024/profunctor.md b/public/conferences/paris-2024/sessions/profunctor.md similarity index 92% rename from public/conferences/paris-2024/profunctor.md rename to public/conferences/paris-2024/sessions/profunctor.md index 27f17e35..9c1f9f08 100644 --- a/public/conferences/paris-2024/profunctor.md +++ b/public/conferences/paris-2024/sessions/profunctor.md @@ -15,7 +15,7 @@ Surprise 👀 ### Xavier Van de Woestyne -- photoRelPath: /images/profiles/paris-2024/xVanDeWoestyne.webp +- photoRelPath: /images/profiles/speakers/xVanDeWoestyne.webp - job: OCaml Software Engineering at Tarides #### Links diff --git a/public/conferences/paris-2024/publish-to-maven.md b/public/conferences/paris-2024/sessions/publish-to-maven.md similarity index 98% rename from public/conferences/paris-2024/publish-to-maven.md rename to public/conferences/paris-2024/sessions/publish-to-maven.md index ef9e475b..0c0b610d 100644 --- a/public/conferences/paris-2024/publish-to-maven.md +++ b/public/conferences/paris-2024/sessions/publish-to-maven.md @@ -21,7 +21,7 @@ This talk will show how the Guardian’s new GitHub Action release workflow make ### Roberto Tyley -- photoRelPath: /images/profiles/paris-2024/rTyley.webp +- photoRelPath: /images/profiles/speakers/rTyley.webp - job: Principal Engineer @ The Guardian #### Links diff --git a/public/conferences/paris-2024/regular-pattern-heterogeneous-sequences.md b/public/conferences/paris-2024/sessions/regular-pattern-heterogeneous-sequences.md similarity index 98% rename from public/conferences/paris-2024/regular-pattern-heterogeneous-sequences.md rename to public/conferences/paris-2024/sessions/regular-pattern-heterogeneous-sequences.md index ecf23471..5a66cc93 100644 --- a/public/conferences/paris-2024/regular-pattern-heterogeneous-sequences.md +++ b/public/conferences/paris-2024/sessions/regular-pattern-heterogeneous-sequences.md @@ -43,7 +43,7 @@ The project is available [here](https://github.com/jimka2001/scala-rte) ### Jim Newton -- photoRelPath: /images/profiles/paris-2024/jim.webp +- photoRelPath: /images/profiles/speakers/jim.webp - job: Teacher & Researcher @ EPITA #### Links diff --git a/public/conferences/paris-2024/scala-2-7-7.md b/public/conferences/paris-2024/sessions/scala-2-7-7.md similarity index 95% rename from public/conferences/paris-2024/scala-2-7-7.md rename to public/conferences/paris-2024/sessions/scala-2-7-7.md index 7fd1d1f1..ecd7b396 100644 --- a/public/conferences/paris-2024/scala-2-7-7.md +++ b/public/conferences/paris-2024/sessions/scala-2-7-7.md @@ -19,7 +19,7 @@ It is expected that many people from the audience get surprised about the sbt pr ### Alexis Hernandez -- photoRelPath: /images/profiles/paris-2024/aHernandez.webp +- photoRelPath: /images/profiles/speakers/aHernandez.webp - job: Principal Scala Consultant @ wiringbits #### Links diff --git a/public/conferences/paris-2024/scala-pattern-matching-for-dsl.md b/public/conferences/paris-2024/sessions/scala-pattern-matching-for-dsl.md similarity index 97% rename from public/conferences/paris-2024/scala-pattern-matching-for-dsl.md rename to public/conferences/paris-2024/sessions/scala-pattern-matching-for-dsl.md index f50650ea..ee9efd74 100644 --- a/public/conferences/paris-2024/scala-pattern-matching-for-dsl.md +++ b/public/conferences/paris-2024/sessions/scala-pattern-matching-for-dsl.md @@ -21,7 +21,7 @@ The technique is used in the Libretto project for pattern matching on domain-lev ### Tomas Mikula -- photoRelPath: /images/profiles/paris-2024/tMikula.webp +- photoRelPath: /images/profiles/speakers/tMikula.webp - job: Lead Scala developer #### Links diff --git a/public/conferences/paris-2024/tools-scala-startup.md b/public/conferences/paris-2024/sessions/tools-scala-startup.md similarity index 96% rename from public/conferences/paris-2024/tools-scala-startup.md rename to public/conferences/paris-2024/sessions/tools-scala-startup.md index 830725a2..6ab90a90 100644 --- a/public/conferences/paris-2024/tools-scala-startup.md +++ b/public/conferences/paris-2024/sessions/tools-scala-startup.md @@ -26,7 +26,7 @@ I will share ### Daniel Ciocîrlan -- photoRelPath: /images/profiles/paris-2024/dCiocirlan.webp +- photoRelPath: /images/profiles/speakers/dCiocirlan.webp - job: Software Engineer & instructor @ Rock the JVM #### Links diff --git a/public/conferences/paris-2024/tools-scala-workshop.md b/public/conferences/paris-2024/sessions/tools-scala-workshop.md similarity index 96% rename from public/conferences/paris-2024/tools-scala-workshop.md rename to public/conferences/paris-2024/sessions/tools-scala-workshop.md index dd972cf6..fa059c6a 100644 --- a/public/conferences/paris-2024/tools-scala-workshop.md +++ b/public/conferences/paris-2024/sessions/tools-scala-workshop.md @@ -19,7 +19,7 @@ This hands-on workshop will teach you the essential skills and toolkit to launch ### Daniel Ciocîrlan -- photoRelPath: /images/profiles/paris-2024/dCiocirlan.webp +- photoRelPath: /images/profiles/speakers/dCiocirlan.webp - job: Software Engineer & instructor @ Rock the JVM #### Links diff --git a/public/conferences/paris-2024/web-dev-with-scala.md b/public/conferences/paris-2024/sessions/web-dev-with-scala.md similarity index 97% rename from public/conferences/paris-2024/web-dev-with-scala.md rename to public/conferences/paris-2024/sessions/web-dev-with-scala.md index 710a632b..ffeb4727 100644 --- a/public/conferences/paris-2024/web-dev-with-scala.md +++ b/public/conferences/paris-2024/sessions/web-dev-with-scala.md @@ -19,7 +19,7 @@ A case study on creating a library management system for the Franco-Ukrainian To ### Olya Mazhara -- photoRelPath: /images/profiles/paris-2024/oMazhara.webp +- photoRelPath: /images/profiles/speakers/oMazhara.webp - job: Software Engineer @ Intellias #### Links diff --git a/public/conferences/paris-2024/when-to-betray-fp-principles.md b/public/conferences/paris-2024/sessions/when-to-betray-fp-principles.md similarity index 96% rename from public/conferences/paris-2024/when-to-betray-fp-principles.md rename to public/conferences/paris-2024/sessions/when-to-betray-fp-principles.md index 7ad9af76..7d3f8e04 100644 --- a/public/conferences/paris-2024/when-to-betray-fp-principles.md +++ b/public/conferences/paris-2024/sessions/when-to-betray-fp-principles.md @@ -17,7 +17,7 @@ Of course, I’ll bring a few benchmarks to show the differences. And while we ### Gaël Renoux -- photoRelPath: /images/profiles/paris-2024/gRenoux.webp +- photoRelPath: /images/profiles/speakers/gRenoux.webp - job: Staff Engineer @ DataDome #### Links diff --git a/public/conferences/paris-2024/zero-to-prod-with-pillars.md b/public/conferences/paris-2024/sessions/zero-to-prod-with-pillars.md similarity index 98% rename from public/conferences/paris-2024/zero-to-prod-with-pillars.md rename to public/conferences/paris-2024/sessions/zero-to-prod-with-pillars.md index c0038d26..713a76ae 100644 --- a/public/conferences/paris-2024/zero-to-prod-with-pillars.md +++ b/public/conferences/paris-2024/sessions/zero-to-prod-with-pillars.md @@ -25,7 +25,7 @@ Whether you’re a seasoned Scala developer or just getting started, this sessio ### Raphaël Lemaitre -- photoRelPath: /images/profiles/paris-2024/rLemaitre.webp +- photoRelPath: /images/profiles/speakers/rLemaitre.webp - job: Senior Staff Engineer @ Ledger #### Links diff --git a/public/conferences/paris-2024/zk-voting-scala-rust.md b/public/conferences/paris-2024/sessions/zk-voting-scala-rust.md similarity index 96% rename from public/conferences/paris-2024/zk-voting-scala-rust.md rename to public/conferences/paris-2024/sessions/zk-voting-scala-rust.md index b7feca5a..b398a562 100644 --- a/public/conferences/paris-2024/zk-voting-scala-rust.md +++ b/public/conferences/paris-2024/sessions/zk-voting-scala-rust.md @@ -17,7 +17,7 @@ I’ll start by presenting the challenges of anonymous electronic voting and the ### Christophe Calvès -- photoRelPath: /images/profiles/paris-2024/cCalves.webp +- photoRelPath: /images/profiles/speakers/cCalves.webp - job: Data Architect @ Ledger #### Links diff --git a/public/sponsors/paris-2024.md b/public/conferences/paris-2024/sponsors.md similarity index 100% rename from public/sponsors/paris-2024.md rename to public/conferences/paris-2024/sponsors.md diff --git a/public/images/orgas/jWinandy.webp b/public/images/profiles/orgas/jWinandy.webp similarity index 100% rename from public/images/orgas/jWinandy.webp rename to public/images/profiles/orgas/jWinandy.webp diff --git a/public/images/orgas/jbKaiser.webp b/public/images/profiles/orgas/jbKaiser.webp similarity index 100% rename from public/images/orgas/jbKaiser.webp rename to public/images/profiles/orgas/jbKaiser.webp diff --git a/public/images/orgas/lNouguier.webp b/public/images/profiles/orgas/lNouguier.webp similarity index 100% rename from public/images/orgas/lNouguier.webp rename to public/images/profiles/orgas/lNouguier.webp diff --git a/public/images/orgas/mKarassev.webp b/public/images/profiles/orgas/mKarassev.webp similarity index 100% rename from public/images/orgas/mKarassev.webp rename to public/images/profiles/orgas/mKarassev.webp diff --git a/public/images/orgas/qAdam.webp b/public/images/profiles/orgas/qAdam.webp similarity index 100% rename from public/images/orgas/qAdam.webp rename to public/images/profiles/orgas/qAdam.webp diff --git a/public/images/orgas/wRadji.webp b/public/images/profiles/orgas/wRadji.webp similarity index 100% rename from public/images/orgas/wRadji.webp rename to public/images/profiles/orgas/wRadji.webp diff --git a/public/images/profiles/paris-2024/aWarski.webp b/public/images/profiles/paris-2024/aWarski.webp deleted file mode 100644 index c8f48eaa..00000000 Binary files a/public/images/profiles/paris-2024/aWarski.webp and /dev/null differ diff --git a/public/images/profiles/paris-2024/jim.webp b/public/images/profiles/paris-2024/jim.webp deleted file mode 100644 index 059ff65d..00000000 Binary files a/public/images/profiles/paris-2024/jim.webp and /dev/null differ diff --git a/public/images/profiles/paris-2024/oMazhara.webp b/public/images/profiles/paris-2024/oMazhara.webp deleted file mode 100644 index 2d03baa0..00000000 Binary files a/public/images/profiles/paris-2024/oMazhara.webp and /dev/null differ diff --git a/public/images/profiles/paris-2024/rLemaitre.webp b/public/images/profiles/paris-2024/rLemaitre.webp deleted file mode 100644 index 683623c3..00000000 Binary files a/public/images/profiles/paris-2024/rLemaitre.webp and /dev/null differ diff --git a/public/images/profiles/paris-2024/vBergeron.webp b/public/images/profiles/paris-2024/vBergeron.webp deleted file mode 100644 index aeac0d3b..00000000 Binary files a/public/images/profiles/paris-2024/vBergeron.webp and /dev/null differ diff --git a/public/images/profiles/nantes-2024/aBlondeau.webp b/public/images/profiles/speakers/aBlondeau.webp similarity index 100% rename from public/images/profiles/nantes-2024/aBlondeau.webp rename to public/images/profiles/speakers/aBlondeau.webp diff --git a/public/images/profiles/nantes-2024/aCros.webp b/public/images/profiles/speakers/aCros.webp similarity index 100% rename from public/images/profiles/nantes-2024/aCros.webp rename to public/images/profiles/speakers/aCros.webp diff --git a/public/images/profiles/paris-2024/aHearn.jpg b/public/images/profiles/speakers/aHearn.jpg similarity index 100% rename from public/images/profiles/paris-2024/aHearn.jpg rename to public/images/profiles/speakers/aHearn.jpg diff --git a/public/images/profiles/paris-2024/aHernandez.webp b/public/images/profiles/speakers/aHernandez.webp similarity index 100% rename from public/images/profiles/paris-2024/aHernandez.webp rename to public/images/profiles/speakers/aHernandez.webp diff --git a/public/images/profiles/paris-2024/aRainko.webp b/public/images/profiles/speakers/aRainko.webp similarity index 100% rename from public/images/profiles/paris-2024/aRainko.webp rename to public/images/profiles/speakers/aRainko.webp diff --git a/public/images/profiles/nantes-2024/aWarski.webp b/public/images/profiles/speakers/aWarski.webp similarity index 100% rename from public/images/profiles/nantes-2024/aWarski.webp rename to public/images/profiles/speakers/aWarski.webp diff --git a/public/images/profiles/nantes-2024/bJaglin.webp b/public/images/profiles/speakers/bJaglin.webp similarity index 100% rename from public/images/profiles/nantes-2024/bJaglin.webp rename to public/images/profiles/speakers/bJaglin.webp diff --git a/public/images/profiles/paris-2024/cCalves.webp b/public/images/profiles/speakers/cCalves.webp similarity index 100% rename from public/images/profiles/paris-2024/cCalves.webp rename to public/images/profiles/speakers/cCalves.webp diff --git a/public/images/profiles/paris-2024/dAmorosi.webp b/public/images/profiles/speakers/dAmorosi.webp similarity index 100% rename from public/images/profiles/paris-2024/dAmorosi.webp rename to public/images/profiles/speakers/dAmorosi.webp diff --git a/public/images/profiles/paris-2024/dAntunes.webp b/public/images/profiles/speakers/dAntunes.webp similarity index 100% rename from public/images/profiles/paris-2024/dAntunes.webp rename to public/images/profiles/speakers/dAntunes.webp diff --git a/public/images/profiles/paris-2024/dCiocirlan.webp b/public/images/profiles/speakers/dCiocirlan.webp similarity index 100% rename from public/images/profiles/paris-2024/dCiocirlan.webp rename to public/images/profiles/speakers/dCiocirlan.webp diff --git a/public/images/profiles/nantes-2024/dPlaindoux.webp b/public/images/profiles/speakers/dPlaindoux.webp similarity index 100% rename from public/images/profiles/nantes-2024/dPlaindoux.webp rename to public/images/profiles/speakers/dPlaindoux.webp diff --git a/public/images/profiles/nantes-2024/eCrance.webp b/public/images/profiles/speakers/eCrance.webp similarity index 100% rename from public/images/profiles/nantes-2024/eCrance.webp rename to public/images/profiles/speakers/eCrance.webp diff --git a/public/images/profiles/nantes-2024/fLaroche.webp b/public/images/profiles/speakers/fLaroche.webp similarity index 100% rename from public/images/profiles/nantes-2024/fLaroche.webp rename to public/images/profiles/speakers/fLaroche.webp diff --git a/public/images/profiles/nantes-2024/fSarradin.webp b/public/images/profiles/speakers/fSarradin.webp similarity index 100% rename from public/images/profiles/nantes-2024/fSarradin.webp rename to public/images/profiles/speakers/fSarradin.webp diff --git a/public/images/profiles/paris-2024/gRenoux.webp b/public/images/profiles/speakers/gRenoux.webp similarity index 100% rename from public/images/profiles/paris-2024/gRenoux.webp rename to public/images/profiles/speakers/gRenoux.webp diff --git a/public/images/profiles/paris-2024/jThompson.webp b/public/images/profiles/speakers/jThompson.webp similarity index 100% rename from public/images/profiles/paris-2024/jThompson.webp rename to public/images/profiles/speakers/jThompson.webp diff --git a/public/images/profiles/nantes-2024/jVauchel.webp b/public/images/profiles/speakers/jVauchel.webp similarity index 100% rename from public/images/profiles/nantes-2024/jVauchel.webp rename to public/images/profiles/speakers/jVauchel.webp diff --git a/public/images/profiles/nantes-2024/jbKaiser.webp b/public/images/profiles/speakers/jbKaiser.webp similarity index 100% rename from public/images/profiles/nantes-2024/jbKaiser.webp rename to public/images/profiles/speakers/jbKaiser.webp diff --git a/public/images/profiles/nantes-2024/jim.webp b/public/images/profiles/speakers/jim.webp similarity index 100% rename from public/images/profiles/nantes-2024/jim.webp rename to public/images/profiles/speakers/jim.webp diff --git a/public/images/profiles/paris-2024/kKalra.webp b/public/images/profiles/speakers/kKalra.webp similarity index 100% rename from public/images/profiles/paris-2024/kKalra.webp rename to public/images/profiles/speakers/kKalra.webp diff --git a/public/images/profiles/nantes-2024/lBialy.webp b/public/images/profiles/speakers/lBialy.webp similarity index 100% rename from public/images/profiles/nantes-2024/lBialy.webp rename to public/images/profiles/speakers/lBialy.webp diff --git a/public/images/profiles/paris-2024/lHaoyi.webp b/public/images/profiles/speakers/lHaoyi.webp similarity index 100% rename from public/images/profiles/paris-2024/lHaoyi.webp rename to public/images/profiles/speakers/lHaoyi.webp diff --git a/public/images/profiles/nantes-2024/mBaechler.webp b/public/images/profiles/speakers/mBaechler.webp similarity index 100% rename from public/images/profiles/nantes-2024/mBaechler.webp rename to public/images/profiles/speakers/mBaechler.webp diff --git a/public/images/profiles/paris-2024/mKubuszok.webp b/public/images/profiles/speakers/mKubuszok.webp similarity index 100% rename from public/images/profiles/paris-2024/mKubuszok.webp rename to public/images/profiles/speakers/mKubuszok.webp diff --git a/public/images/profiles/nantes-2024/mMcGuigan.webp b/public/images/profiles/speakers/mMcGuigan.webp similarity index 100% rename from public/images/profiles/nantes-2024/mMcGuigan.webp rename to public/images/profiles/speakers/mMcGuigan.webp diff --git a/public/images/profiles/nantes-2024/mRebiai.webp b/public/images/profiles/speakers/mRebiai.webp similarity index 100% rename from public/images/profiles/nantes-2024/mRebiai.webp rename to public/images/profiles/speakers/mRebiai.webp diff --git a/public/images/profiles/paris-2024/mStozek.webp b/public/images/profiles/speakers/mStozek.webp similarity index 100% rename from public/images/profiles/paris-2024/mStozek.webp rename to public/images/profiles/speakers/mStozek.webp diff --git a/public/images/profiles/paris-2024/nRinaudo.jpeg b/public/images/profiles/speakers/nRinaudo.jpeg similarity index 100% rename from public/images/profiles/paris-2024/nRinaudo.jpeg rename to public/images/profiles/speakers/nRinaudo.jpeg diff --git a/public/images/profiles/nantes-2024/oMazhara.webp b/public/images/profiles/speakers/oMazhara.webp similarity index 100% rename from public/images/profiles/nantes-2024/oMazhara.webp rename to public/images/profiles/speakers/oMazhara.webp diff --git a/public/images/profiles/nantes-2024/oMelois.webp b/public/images/profiles/speakers/oMelois.webp similarity index 100% rename from public/images/profiles/nantes-2024/oMelois.webp rename to public/images/profiles/speakers/oMelois.webp diff --git a/public/images/profiles/paris-2024/oNouguier.webp b/public/images/profiles/speakers/oNouguier.webp similarity index 100% rename from public/images/profiles/paris-2024/oNouguier.webp rename to public/images/profiles/speakers/oNouguier.webp diff --git a/public/images/profiles/nantes-2024/pMatthews.webp b/public/images/profiles/speakers/pMatthews.webp similarity index 100% rename from public/images/profiles/nantes-2024/pMatthews.webp rename to public/images/profiles/speakers/pMatthews.webp diff --git a/public/images/profiles/nantes-2024/rClaude.webp b/public/images/profiles/speakers/rClaude.webp similarity index 100% rename from public/images/profiles/nantes-2024/rClaude.webp rename to public/images/profiles/speakers/rClaude.webp diff --git a/public/images/profiles/paris-2024/rJolly.webp b/public/images/profiles/speakers/rJolly.webp similarity index 100% rename from public/images/profiles/paris-2024/rJolly.webp rename to public/images/profiles/speakers/rJolly.webp diff --git a/public/images/profiles/paris-2024/rKuckaertz.webp b/public/images/profiles/speakers/rKuckaertz.webp similarity index 100% rename from public/images/profiles/paris-2024/rKuckaertz.webp rename to public/images/profiles/speakers/rKuckaertz.webp diff --git a/public/images/profiles/nantes-2024/rLemaitre.webp b/public/images/profiles/speakers/rLemaitre.webp similarity index 100% rename from public/images/profiles/nantes-2024/rLemaitre.webp rename to public/images/profiles/speakers/rLemaitre.webp diff --git a/public/images/profiles/paris-2024/rTyley.webp b/public/images/profiles/speakers/rTyley.webp similarity index 100% rename from public/images/profiles/paris-2024/rTyley.webp rename to public/images/profiles/speakers/rTyley.webp diff --git a/public/images/profiles/nantes-2024/sBernard.webp b/public/images/profiles/speakers/sBernard.webp similarity index 100% rename from public/images/profiles/nantes-2024/sBernard.webp rename to public/images/profiles/speakers/sBernard.webp diff --git a/public/images/profiles/nantes-2024/sCollard.webp b/public/images/profiles/speakers/sCollard.webp similarity index 100% rename from public/images/profiles/nantes-2024/sCollard.webp rename to public/images/profiles/speakers/sCollard.webp diff --git a/public/images/profiles/paris-2024/tMikula.webp b/public/images/profiles/speakers/tMikula.webp similarity index 100% rename from public/images/profiles/paris-2024/tMikula.webp rename to public/images/profiles/speakers/tMikula.webp diff --git a/public/images/profiles/nantes-2024/toli.webp b/public/images/profiles/speakers/toli.webp similarity index 100% rename from public/images/profiles/nantes-2024/toli.webp rename to public/images/profiles/speakers/toli.webp diff --git a/public/images/profiles/nantes-2024/uli.webp b/public/images/profiles/speakers/uli.webp similarity index 100% rename from public/images/profiles/nantes-2024/uli.webp rename to public/images/profiles/speakers/uli.webp diff --git a/public/images/profiles/nantes-2024/vBergeron.webp b/public/images/profiles/speakers/vBergeron.webp similarity index 100% rename from public/images/profiles/nantes-2024/vBergeron.webp rename to public/images/profiles/speakers/vBergeron.webp diff --git a/public/images/profiles/paris-2024/vKasas.jpeg b/public/images/profiles/speakers/vKasas.jpeg similarity index 100% rename from public/images/profiles/paris-2024/vKasas.jpeg rename to public/images/profiles/speakers/vKasas.jpeg diff --git a/public/images/profiles/paris-2024/vPitula.webp b/public/images/profiles/speakers/vPitula.webp similarity index 100% rename from public/images/profiles/paris-2024/vPitula.webp rename to public/images/profiles/speakers/vPitula.webp diff --git a/public/images/profiles/paris-2024/xVanDeWoestyne.webp b/public/images/profiles/speakers/xVanDeWoestyne.webp similarity index 100% rename from public/images/profiles/paris-2024/xVanDeWoestyne.webp rename to public/images/profiles/speakers/xVanDeWoestyne.webp diff --git a/public/images/profiles/nantes-2024/xVdW.webp b/public/images/profiles/speakers/xVdW.webp similarity index 100% rename from public/images/profiles/nantes-2024/xVdW.webp rename to public/images/profiles/speakers/xVdW.webp diff --git a/public/favicon.ico b/public/logos/favicon.ico similarity index 100% rename from public/favicon.ico rename to public/logos/favicon.ico diff --git a/public/scalaio-opengraph.webp b/public/logos/scalaio-opengraph.webp similarity index 100% rename from public/scalaio-opengraph.webp rename to public/logos/scalaio-opengraph.webp diff --git a/public/scalaio.svg b/public/logos/scalaio.svg similarity index 100% rename from public/scalaio.svg rename to public/logos/scalaio.svg diff --git a/public/scalaio_black.svg b/public/logos/scalaio_black.svg similarity index 100% rename from public/scalaio_black.svg rename to public/logos/scalaio_black.svg diff --git a/src/main/scala/io/scala/Page.scala b/src/main/scala/io/scala/Page.scala index f4cb7af9..6dd30207 100644 --- a/src/main/scala/io/scala/Page.scala +++ b/src/main/scala/io/scala/Page.scala @@ -13,13 +13,14 @@ import urldsl.errors.DummyError import urldsl.vocabulary.FromString import urldsl.vocabulary.Printer +import io.scala.data.Event import io.scala.views.* import io.scala.views.IndexView sealed trait Draftable: def withDraft: Option[Boolean] sealed trait Routeable: - def conference: Option[String] + def conference: Option[Event] object Routeable: def fallback: String = "paris-2024" @@ -28,19 +29,19 @@ sealed trait Slugify: sealed trait Page: def title: String -case class IndexPage(withDraft: Option[Boolean] = None, conference: Option[String] = None) +case class IndexPage(withDraft: Option[Boolean] = None, conference: Option[Event] = None) extends Page with Draftable with Routeable: def title: String = "Home" -case class SessionsPage(withDraft: Option[Boolean] = None, conference: Option[String] = None) +case class SessionsPage(withDraft: Option[Boolean] = None, conference: Option[Event] = None) extends Page with Draftable with Routeable: def title: String = "Sessions" -case class SessionPage(conference: String, slug: String) extends Page with Slugify: +case class SessionPage(conference: Event, slug: String) extends Page with Slugify: def title: String = s"Session - $slug" -case class SponsorsPage(conference: Option[String] = None) extends Page with Routeable: +case class SponsorsPage(conference: Option[Event] = None) extends Page with Routeable: def title: String = "Sponsors" case object VenuePage extends Page: def title: String = "Venue" @@ -67,7 +68,7 @@ object Page { given pageArgBasicCodec: ReadWriter[Page] = macroRW val draftParam = param[Boolean]("withDraft").? - val conferenceParam = param[String]("conference").? + val conferenceParam = param[Event]("conference").? given FromString[Page, DummyError] = { case "sessions" => Right(SessionsPage()) @@ -92,12 +93,12 @@ object Page { case _: IndexPage => "" } - val indexRoute = Route.onlyQuery[IndexPage, (Option[Boolean], Option[String])]( + val indexRoute = Route.onlyQuery[IndexPage, (Option[Boolean], Option[Event])]( encode = x => (x.withDraft, x.conference), decode = IndexPage(_, _), (root / endOfSegments) ? draftParam & conferenceParam ) - val sessionsRoute = Route.onlyQuery[SessionsPage, (Option[Boolean], Option[String])]( + val sessionsRoute = Route.onlyQuery[SessionsPage, (Option[Boolean], Option[Event])]( encode = x => (x.withDraft, x.conference), decode = SessionsPage(_, _), (root / "sessions" / endOfSegments) ? draftParam & conferenceParam @@ -108,27 +109,27 @@ object Page { decode = SessionsPage(_, _), (root / "talks" / endOfSegments) ? draftParam & conferenceParam ) - val sessionRoute = Route[SessionPage, (String, String)]( + val sessionRoute = Route[SessionPage, (Event, String)]( encode = x => (x.conference, x.slug), decode = SessionPage(_, _), - (root / "sessions" / segment[String] / segment[String] / endOfSegments) + (root / "sessions" / segment[Event] / segment[String] / endOfSegments) ) // maintain old /talks// links - private val legacyTalkRoute = Route( + private val legacyTalkRoute = Route[SessionPage, (Event, String)]( encode = (x: SessionPage) => (x.conference, x.slug), decode = SessionPage(_, _), - root / "talks" / segment[String] / segment[String] / endOfSegments + root / "talks" / segment[Event] / segment[String] / endOfSegments ) // maintain links of Nantes 2024 edition: scala.io/talks/ private val legacyNantesTalkRoute = Route[SessionPage, String]( encode = x => x.slug, - decode = SessionPage("nantes-2024", _), + decode = SessionPage(Event.`nantes-2024`, _), root / "talks" / segment[String] / endOfSegments ) - val sponsorsRoute = Route.onlyQuery[SponsorsPage, Option[String]]( + val sponsorsRoute = Route.onlyQuery[SponsorsPage, Option[Event]]( encode = x => x.conference, decode = args => SponsorsPage(args), - (root / "sponsors" / endOfSegments) ? param[String]("conference").? + (root / "sponsors" / endOfSegments) ? conferenceParam ) val venueRoute = Route.static( VenuePage, diff --git a/src/main/scala/io/scala/app/faq/FAQView.scala b/src/main/scala/io/scala/app/faq/FAQView.scala index 09d78d44..0bb2a39e 100644 --- a/src/main/scala/io/scala/app/faq/FAQView.scala +++ b/src/main/scala/io/scala/app/faq/FAQView.scala @@ -63,19 +63,6 @@ object FAQView extends SimpleView { Links.highlighted(href := "https://forms.gle/cVTtNzPF77f4TsJW7", "this form") ) ), - question( - "Why 2023-10 was cancelled?", - p( - "It was difficult to get sponsorship to close the budget, that's why we had to work on a new format for this edition." - ) - ), - question( - "Why Nantes?", - p( - """The conference was in Paris (2013, 2014, 2022) and Lyon (2016, 2017, 2018, 2019). - |The organisers are in majority familiar with Nantes, Clever Cloud and _icilundi offered to facilitate hosting the event.""".stripMargin - ) - ), question( "Do you reimburse tickets?", p("We would prefer not to, however you can always send us an email. We always reimbursed tickets if needed.") @@ -147,7 +134,7 @@ object FAQView extends SimpleView { github ) ) - ).withFlexGrow(2) + ) ) lazy val speakerQuestions = Containers.flexCards( diff --git a/src/main/scala/io/scala/app/sessions/SessionList.scala b/src/main/scala/io/scala/app/sessions/SessionList.scala index 88650b60..e23036e1 100644 --- a/src/main/scala/io/scala/app/sessions/SessionList.scala +++ b/src/main/scala/io/scala/app/sessions/SessionList.scala @@ -4,8 +4,8 @@ import com.raquo.laminar.api.L.* import scala.collection.immutable.Queue import io.scala.SessionsPage +import io.scala.data.Event import io.scala.data.SessionsHistory -import io.scala.data.SessionsHistory.getConfName import io.scala.models.Session import io.scala.modules.SessionCard import io.scala.modules.elements.* @@ -17,7 +17,7 @@ case object SessionList extends ReactiveView[SessionsPage] { given Ordering[(String, List[Session])] = case ((cat1, talks1), (cat2, talks2)) => val sizeComparison = talks1.size.compareTo(talks2.size) - + if sizeComparison != 0 then -sizeComparison else cat1.compareTo(cat2) @@ -35,7 +35,7 @@ case object SessionList extends ReactiveView[SessionsPage] { acc .enqueue(Titles.medium(category, idAttr := category)) .enqueue( - Containers.gridCards(talks.sorted.map(SessionCard(_, getConfName(sessionArg.conference)))) + Containers.gridCards(talks.sorted.map(SessionCard(_, sessionArg.conference.getOrElse(Event.Current)))) ) } .toSeq @@ -52,10 +52,12 @@ case object SessionList extends ReactiveView[SessionsPage] { SessionsHistory.sessionsForConf(arg).partition(_.isWorkshop) val tabs = Seq( Session.Kind.Keynote -> - Containers.gridCards(talksByCategory.filter(_.isKeynote).map(SessionCard(_, getConfName(arg.conference)))), + Containers.gridCards( + talksByCategory.filter(_.isKeynote).map(SessionCard(_, arg.conference.getOrElse(Event.Current))) + ), Session.Kind.Talk -> tabWithTOC(sortedCategories(talksByCategory.filter(!_.isKeynote)), arg), Session.Kind.Workshop -> - Containers.gridCards(workshopsByCategory.map(SessionCard(_, getConfName(arg.conference)))) + Containers.gridCards(workshopsByCategory.map(SessionCard(_, arg.conference.getOrElse(Event.Current)))) ) Tabs(tabs, h => h.toPlural, Session.Kind.Talk).render } diff --git a/src/main/scala/io/scala/app/sessions/SessionView.scala b/src/main/scala/io/scala/app/sessions/SessionView.scala index d3ac33c8..e0a24b57 100644 --- a/src/main/scala/io/scala/app/sessions/SessionView.scala +++ b/src/main/scala/io/scala/app/sessions/SessionView.scala @@ -4,7 +4,6 @@ import com.raquo.laminar.api.L.* import io.scala.extensions.grayOutIf import io.scala.SessionPage -import io.scala.data.SessionsHistory import io.scala.models.Session import io.scala.modules.elements.Containers import io.scala.modules.elements.Paragraphs @@ -16,9 +15,7 @@ object SessionView extends ReactiveView[SessionPage]: def body(signal: Signal[SessionPage]): HtmlElement = val sessionSignal = signal.map: sessionPage => - SessionsHistory - .sessionsForConf(sessionPage.conference) - .getOrElse(List.empty) + sessionPage.conference.sessions .find(_.info.slug == sessionPage.slug) .getOrElse(notFoundTalk) sectionTag( diff --git a/src/main/scala/io/scala/data/History.scala b/src/main/scala/io/scala/data/History.scala index e5e4dcda..6cebaae8 100644 --- a/src/main/scala/io/scala/data/History.scala +++ b/src/main/scala/io/scala/data/History.scala @@ -1,5 +1,10 @@ package io.scala.data +import upickle.default.* +import urldsl.errors.DummyError +import urldsl.vocabulary.FromString +import urldsl.vocabulary.Printer + import io.scala.Draftable import io.scala.Routeable import io.scala.data.parsers.Parsers @@ -22,32 +27,24 @@ enum Event(val sessions: List[Session], val sponsors: List[Sponsor]): object Event: val Current: Event = Event.`paris-2024` - // makes me want to use enumeratum again... - def withName(name: String): Option[Event] = - Event.values.find(_.toString == name) - def withNameOrCurrent(name: String): Event = - withName(name).getOrElse(Current) - def withNameOrCurrent(maybeName: Option[String]): Event = - maybeName.flatMap(Event.withName).getOrElse(Current) + + given ReadWriter[Event] = macroRW + given FromString[Event, DummyError] = { + case "paris-2024" => Right(Event.`paris-2024`) + case "nantes-2024" => Right(Event.`nantes-2024`) + case _ => Left(DummyError.dummyError) + } + + given Printer[Event] = { + case Event.`paris-2024` => "paris-2024" + case Event.`nantes-2024` => "nantes-2024" + } object SessionsHistory: def sessionsForConf(args: Routeable & Draftable): List[Session] = - Event - .withNameOrCurrent(args.conference) + args.conference + .getOrElse(Event.Current) .sessions .filterWhen(args.withDraft.fold(true)(!_))(_.info.confirmed) - def sessionsForSchedule: List[Session] = - Event.Current.sessions - - def sessionsForConf(confName: String): Option[List[Session]] = - Event.withName(confName).map(_.sessions) - - inline def getConfName(confName: Option[String]): String = - confName.getOrElse(Event.Current.toString) - -object SponsorsHistory: - - def sponsorsForConf(confName: Option[String]): List[Sponsor] = - confName.flatMap(Event.withName).getOrElse(Event.Current).sponsors diff --git a/src/main/scala/io/scala/data/ScheduleInfo.scala b/src/main/scala/io/scala/data/ScheduleInfo.scala index abe0e46d..e9c706db 100644 --- a/src/main/scala/io/scala/data/ScheduleInfo.scala +++ b/src/main/scala/io/scala/data/ScheduleInfo.scala @@ -22,9 +22,7 @@ object ScheduleInfo { extension (d: HtmlElement) def gridArea(area: String) = d.amend(styleAttr := s"grid-area: $area") - lazy val session: String => Session = - val schedulables = SessionsHistory.sessionsForSchedule - (slug) => schedulables.find(_.info.slug == slug).getOrElse(Session.empty) + def session(slug: String) = Event.Current.sessions.find(_.info.slug == slug).getOrElse(Session.empty) val day1 = List( time(9, 30).render(), @@ -104,5 +102,8 @@ object ScheduleInfo { Special(Special.Kind.End).render ).zipWithIndex.map { case (x, i) => x.gridArea(s"a${i + 1}") } - val allDays = Seq((DayOfWeek.THURSDAY, div(day1, className := "day-base-layout day1")), (DayOfWeek.FRIDAY, div(day2, className := "day-base-layout day2"))) + val allDays = Seq( + (DayOfWeek.THURSDAY, div(day1, className := "day-base-layout day1")), + (DayOfWeek.FRIDAY, div(day2, className := "day-base-layout day2")) + ) } diff --git a/src/main/scala/io/scala/models/Organizer.scala b/src/main/scala/io/scala/models/Organizer.scala index 6ec2c9c9..983f56a5 100644 --- a/src/main/scala/io/scala/models/Organizer.scala +++ b/src/main/scala/io/scala/models/Organizer.scala @@ -10,4 +10,4 @@ final case class Organizer( socials: List[Social] = List.empty, representative: Boolean = false ): - def photoPath = photo.fold(io.scala.profilePlaceholder)(path => s"/images/orgas/$path") + def photoPath = photo.fold(io.scala.profilePlaceholder)(path => s"/images/profiles/orgas/$path") diff --git a/src/main/scala/io/scala/models/Session.scala b/src/main/scala/io/scala/models/Session.scala index 9b15380c..42db0091 100644 --- a/src/main/scala/io/scala/models/Session.scala +++ b/src/main/scala/io/scala/models/Session.scala @@ -34,7 +34,7 @@ case class Session( Parsers.Description.parseTalk(description).map(Paragraphs.description(_)) def duration: Int = info.kind.duration - def render(room: Session.Room | Null): Div = SessionCard(this, Event.Current.toString, room) + def render(room: Session.Room | Null): Div = SessionCard(this, Event.Current, room) def isKeynote: Boolean = info.kind == Session.Kind.Keynote def isWorkshop: Boolean = info.kind == Session.Kind.Workshop def isBreak: Boolean = false diff --git a/src/main/scala/io/scala/modules/SessionCard.scala b/src/main/scala/io/scala/modules/SessionCard.scala index 69bd02d3..b98cb567 100644 --- a/src/main/scala/io/scala/modules/SessionCard.scala +++ b/src/main/scala/io/scala/modules/SessionCard.scala @@ -10,6 +10,7 @@ import io.scala.modules.elements.Buttons import io.scala.modules.elements.Buttons.important import io.scala.modules.elements.Image import io.scala.svgs.Icons +import io.scala.data.Event object SessionKindTag: def apply(kind: Session.Kind): Span = @@ -22,7 +23,7 @@ object SessionCard: case _ => name // Remove the dependency on `conference` by having it injected in Session.Basic info for better reusability - def apply(session: Session, conference: String, room: Session.Room | Null = null): Div = + def apply(session: Session, conference: Event, room: Session.Room | Null = null): Div = def realDuration = session.info.title match case s if session.duration == 150 && (s.startsWith("Building") || s.startsWith("Quick")) => 90 case _ => session.info.kind.duration diff --git a/src/main/scala/io/scala/modules/SpeakerCard.scala b/src/main/scala/io/scala/modules/SpeakerCard.scala index bc132182..2a849ac1 100644 --- a/src/main/scala/io/scala/modules/SpeakerCard.scala +++ b/src/main/scala/io/scala/modules/SpeakerCard.scala @@ -3,23 +3,25 @@ package modules import com.raquo.laminar.api.L.* import com.raquo.laminar.nodes.ReactiveHtmlElement +import org.scalajs.dom.HTMLDivElement + +import io.scala.data.Event import io.scala.extensions.grayOutIf import io.scala.models.Session import io.scala.models.Session.Speaker import io.scala.models.Social import io.scala.modules.elements.Buttons import io.scala.modules.elements.Buttons.* -import org.scalajs.dom.HTMLDivElement import io.scala.modules.elements.Image object SpeakerCard { - def apply(speaker: Speaker, talks: List[Session], conference: String): ReactiveHtmlElement[HTMLDivElement] = + def apply(speaker: Speaker, talks: List[Session], conference: Event): ReactiveHtmlElement[HTMLDivElement] = div( className := "speaker-card", Image.photo( - src := speaker.photoRelPath, - className := "photo", - alt := s"${speaker.name}'s profile", + src := speaker.photoRelPath, + className := "photo", + alt := s"${speaker.name}'s profile", loadingAttr := "lazy" ), div( @@ -43,7 +45,7 @@ object SpeakerCard { linksToTalks(talks, conference) ).grayOutIf(talks.forall(_.cancelledReason.isDefined)) - def linksToTalks(talks: List[Session], conference: String): ReactiveHtmlElement[HTMLDivElement] = + def linksToTalks(talks: List[Session], conference: Event): ReactiveHtmlElement[HTMLDivElement] = def linkButton(info: Session.BasicInfo) = val text = if info.kind == Session.Kind.Workshop then "Workshop" else "Talk" Buttons diff --git a/src/main/scala/io/scala/modules/layout/Footer.scala b/src/main/scala/io/scala/modules/layout/Footer.scala index 3c69fa3c..62f1c7ff 100644 --- a/src/main/scala/io/scala/modules/layout/Footer.scala +++ b/src/main/scala/io/scala/modules/layout/Footer.scala @@ -17,6 +17,7 @@ import io.scala.modules.elements.Links import io.scala.modules.elements.Lists import io.scala.modules.elements.Titles import io.scala.svgs.Icons +import io.scala.data.Event object Footer { private lazy val summary: Div = @@ -56,7 +57,7 @@ object Footer { Lists.pipes( ConfsData.all .map { key => - val linkKey = key.replace("_", "-") + val linkKey = Event.valueOf(key.replace("_", "-")) li( Links .highlighted( diff --git a/src/main/scala/io/scala/views/IndexView.scala b/src/main/scala/io/scala/views/IndexView.scala index 6e275fa0..880271dc 100644 --- a/src/main/scala/io/scala/views/IndexView.scala +++ b/src/main/scala/io/scala/views/IndexView.scala @@ -6,11 +6,12 @@ import org.scalajs.dom.document import io.scala.IndexPage import io.scala.Page import io.scala.VenuePage +import io.scala.data.Event import io.scala.data.SessionsHistory import io.scala.extensions.withBinder +import io.scala.extensions.withLink import io.scala.modules.SpeakerCard import io.scala.modules.elements.* -import io.scala.extensions.withLink case object IndexView extends ReactiveView[IndexPage] { @@ -44,7 +45,7 @@ case object IndexView extends ReactiveView[IndexPage] { .flatMap: talk => talk.speakers.map((_, talk)) .groupMap(_._1)(_._2) - .mapValues(_.distinctBy(_.info.kind).sortBy(_.info.kind)) + .mapValues(_.sortBy(_.info.kind)) .toSeq .sortBy(_._1) @@ -54,7 +55,7 @@ case object IndexView extends ReactiveView[IndexPage] { div( className := "card-container", children <-- args.map: page => - speakers(page).map(SpeakerCard(_, _, SessionsHistory.getConfName(page.conference))) + speakers(page).map(SpeakerCard(_, _, page.conference.getOrElse(Event.Current))) ) ) @@ -80,7 +81,9 @@ case object IndexView extends ReactiveView[IndexPage] { idAttr("tickets"), className := "container", Titles("Tickets"), - p("We offer both on-site and online tickets for the conference (redirect to the same page, just for better readability :)"), + p( + "We offer both on-site and online tickets for the conference (redirect to the same page, just for better readability :)" + ), div( Buttons.shiny("On-site tickets").withLink("https://www.billetweb.fr/scalaio-paris-2024-epita"), Buttons.shiny("Streaming tickets").withLink("https://www.billetweb.fr/scalaio-paris-2024-epita") diff --git a/src/main/scala/io/scala/views/SponsorsList.scala b/src/main/scala/io/scala/views/SponsorsList.scala index b1921167..ba4d2197 100644 --- a/src/main/scala/io/scala/views/SponsorsList.scala +++ b/src/main/scala/io/scala/views/SponsorsList.scala @@ -5,7 +5,7 @@ import com.raquo.laminar.nodes.ReactiveHtmlElement import io.scala.Lexicon import io.scala.SponsorsPage -import io.scala.data.SponsorsHistory +import io.scala.data.Event import io.scala.modules.elements.* case object SponsorsList extends ReactiveView[SponsorsPage] { @@ -30,8 +30,9 @@ case object SponsorsList extends ReactiveView[SponsorsPage] { div( className := "container", children <-- args.map(arg => - SponsorsHistory - .sponsorsForConf(arg.conference) + arg.conference + .getOrElse(Event.Current) + .sponsors .groupBy(_.rank) .toSeq .sortBy(_._1)