diff --git a/components/groovy/com/jessebrault/site/CompositionCategory.groovy b/components/groovy/com/jessebrault/site/CompositionCategory.groovy new file mode 100644 index 0000000..78d1a0b --- /dev/null +++ b/components/groovy/com/jessebrault/site/CompositionCategory.groovy @@ -0,0 +1,22 @@ +package com.jessebrault.site + +import com.jessebrault.site.composition.Composition +import groowt.view.component.web.BaseWebViewComponent + +class CompositionCategory extends BaseWebViewComponent { + + final String category + private final Set compositions + + CompositionCategory(Map attr) { + this.category = attr.category + this.compositions = attr.compositions + } + + List getCompositions() { + this.compositions.sort { c0, c1 -> + c1.date <=> c0.date + } + } + +} diff --git a/components/groovy/com/jessebrault/site/CompositionListing.groovy b/components/groovy/com/jessebrault/site/CompositionListing.groovy index 2368bac..eb4076b 100644 --- a/components/groovy/com/jessebrault/site/CompositionListing.groovy +++ b/components/groovy/com/jessebrault/site/CompositionListing.groovy @@ -3,6 +3,8 @@ package com.jessebrault.site import com.jessebrault.site.composition.Composition import groowt.view.component.web.BaseWebViewComponent +import java.time.format.DateTimeFormatter + class CompositionListing extends BaseWebViewComponent { final Composition composition @@ -11,4 +13,8 @@ class CompositionListing extends BaseWebViewComponent { this.composition = composition } + String renderDate() { + composition.date.format(DateTimeFormatter.ofPattern('yyyy')) + } + } diff --git a/components/resources/com/jessebrault/site/CompositionCategoryTemplate.wvc b/components/resources/com/jessebrault/site/CompositionCategoryTemplate.wvc new file mode 100644 index 0000000..f507889 --- /dev/null +++ b/components/resources/com/jessebrault/site/CompositionCategoryTemplate.wvc @@ -0,0 +1,7 @@ +--- +package com.jessebrault.site +--- +
+

$category

+ } /> +
diff --git a/components/resources/com/jessebrault/site/CompositionListingTemplate.wvc b/components/resources/com/jessebrault/site/CompositionListingTemplate.wvc index ee3726f..5ce3756 100644 --- a/components/resources/com/jessebrault/site/CompositionListingTemplate.wvc +++ b/components/resources/com/jessebrault/site/CompositionListingTemplate.wvc @@ -1,4 +1,19 @@ --- package com.jessebrault.site --- -

$composition.title

+
+
+

$composition.title

+ $it} /> + $it} /> +
+
+ $composition.instrumentation +
+ $composition.shortInfo
+ } /> +
+ ${renderDate()} +
+ diff --git a/pages/groovy/com/jessebrault/site/CompositionsPage.groovy b/pages/groovy/com/jessebrault/site/CompositionsPage.groovy index 91099ee..2eac342 100644 --- a/pages/groovy/com/jessebrault/site/CompositionsPage.groovy +++ b/pages/groovy/com/jessebrault/site/CompositionsPage.groovy @@ -1,10 +1,9 @@ package com.jessebrault.site -import com.jessebrault.site.composition.Composition +import com.jessebrault.site.composition.CompositionContainer import com.jessebrault.site.util.TitleMaker -import com.jessebrault.ssg.di.InjectTexts +import com.jessebrault.ssg.di.Global import com.jessebrault.ssg.page.PageSpec -import com.jessebrault.ssg.text.Text import com.jessebrault.ssg.view.WvcPageView import jakarta.inject.Inject @@ -12,14 +11,18 @@ import jakarta.inject.Inject class CompositionsPage extends WvcPageView { private final TitleMaker titleMaker - final Set compositions + final CompositionContainer compositions + final List categories @Inject - CompositionsPage(TitleMaker titleMaker, @InjectTexts('/compositions/*.md') Set compositions) { + CompositionsPage( + TitleMaker titleMaker, + CompositionContainer compositions, + @Global('compositionCategories') List categories + ) { this.titleMaker = titleMaker - this.compositions = compositions.collect { - new Composition(it, it.frontMatter.title) - } + this.compositions = compositions + this.categories = categories } String getTitle() { diff --git a/pages/resources/com/jessebrault/site/CompositionsPageTemplate.wvc b/pages/resources/com/jessebrault/site/CompositionsPageTemplate.wvc index f92edd0..0edc296 100644 --- a/pages/resources/com/jessebrault/site/CompositionsPageTemplate.wvc +++ b/pages/resources/com/jessebrault/site/CompositionsPageTemplate.wvc @@ -2,8 +2,14 @@ package com.jessebrault.site --- -
+

Compositions

- } /> -
+ } + /> +
diff --git a/src/main/groovy/com/jessebrault/site/composition/Composition.groovy b/src/main/groovy/com/jessebrault/site/composition/Composition.groovy index df75f9a..bb00c40 100644 --- a/src/main/groovy/com/jessebrault/site/composition/Composition.groovy +++ b/src/main/groovy/com/jessebrault/site/composition/Composition.groovy @@ -2,15 +2,20 @@ package com.jessebrault.site.composition import com.jessebrault.ssg.text.Text import groovy.transform.EqualsAndHashCode -import groovy.transform.NullCheck import groovy.transform.ToString -import groovy.transform.TupleConstructor +import org.jetbrains.annotations.Nullable + +import java.time.LocalDate -@TupleConstructor(defaults = false) -@NullCheck(includeGenerated = true) @EqualsAndHashCode @ToString class Composition { - final Text text - final String title + Text text + String title + @Nullable String subTitle + @Nullable String version + String instrumentation + @Nullable String shortInfo + LocalDate date + Set categories } diff --git a/src/main/groovy/com/jessebrault/site/composition/CompositionContainer.groovy b/src/main/groovy/com/jessebrault/site/composition/CompositionContainer.groovy new file mode 100644 index 0000000..45f3eba --- /dev/null +++ b/src/main/groovy/com/jessebrault/site/composition/CompositionContainer.groovy @@ -0,0 +1,37 @@ +package com.jessebrault.site.composition + +import com.jessebrault.ssg.di.InjectTexts +import com.jessebrault.ssg.text.Text +import jakarta.inject.Inject + +import java.time.LocalDate + +class CompositionContainer { + + private final Set compositions + + @Inject + CompositionContainer(@InjectTexts('/compositions/*.md') Set compositionTexts) { + this.compositions = compositionTexts.collect { text -> + new Composition( + text: text, + title: text.frontMatter.title, + subTitle: text.frontMatter.subTitle, + version: text.frontMatter.version, + instrumentation: text.frontMatter.instrumentation, + shortInfo: text.frontMatter.shortInfo, + date: LocalDate.parse(text.frontMatter.date), + categories: text.frontMatter.categories as Set + ) + } + } + + Set getAll() { + this.compositions + } + + Set getByCategory(String category) { + this.compositions.findAll { it.categories.contains(category) } + } + +} diff --git a/ssg/default.groovy b/ssg/default.groovy index faf5054..acb8d84 100644 --- a/ssg/default.groovy +++ b/ssg/default.groovy @@ -1,3 +1,4 @@ +import com.jessebrault.site.composition.CompositionContainer import com.jessebrault.site.util.TitleMaker import com.jessebrault.ssg.buildscript.BuildScriptBase import groovy.transform.BaseScript @@ -14,10 +15,12 @@ build { globals { siteTagLine = 'Conductor and Composer' menuItems = ['Biography', 'Compositions'] + compositionCategories = ['Chamber'] } objectFactoryBuilder.configure { configureRegistry { bind(TitleMaker, toSelf()) + bind(CompositionContainer, toSelf()) } } } diff --git a/texts/compositions/SpiritTravels.md b/texts/compositions/SpiritTravels.md index dfe506e..d8bfbf4 100644 --- a/texts/compositions/SpiritTravels.md +++ b/texts/compositions/SpiritTravels.md @@ -1,4 +1,10 @@ --- title: Spirit Travels +version: Chamber orchestra version +instrumentation: For fl, ob, cl, hn, 2 perc, pno, and strings 2.2.2.2.1. +shortInfo: In memoriam Jane H. Kim. +date: 2023-12-01 +categories: + - Chamber --- Information about _Spirit Travels_.