diff --git a/api/build.gradle b/api/build.gradle index dca3560..edd1c17 100644 --- a/api/build.gradle +++ b/api/build.gradle @@ -21,6 +21,10 @@ dependencies { // https://mvnrepository.com/artifact/org.jgrapht/jgrapht-core implementation 'org.jgrapht:jgrapht-core:1.5.2' + + // So we can use Grape dependency management + // https://mvnrepository.com/artifact/org.apache.ivy/ivy + runtimeOnly 'org.apache.ivy:ivy:2.5.1' } jar { diff --git a/api/src/main/groovy/com/jessebrault/ssg/dsl/ModelCollection.groovy b/api/src/main/groovy/com/jessebrault/ssg/dsl/ModelCollection.groovy index 99d623a..6e7f6e7 100644 --- a/api/src/main/groovy/com/jessebrault/ssg/dsl/ModelCollection.groovy +++ b/api/src/main/groovy/com/jessebrault/ssg/dsl/ModelCollection.groovy @@ -5,25 +5,27 @@ import groovy.transform.EqualsAndHashCode import groovy.transform.NullCheck import org.jetbrains.annotations.Nullable +import java.util.function.Predicate + @NullCheck @EqualsAndHashCode(includeFields = true) final class ModelCollection { @Delegate - private final Collection> ts = [] + private final Collection> models = [] - ModelCollection(Collection> ts) { - this.ts.addAll(ts) + ModelCollection(Collection> models) { + this.models.addAll(models) } @Nullable Model getByName(String name) { - this.ts.find { it.name == name } + this.models.find { it.name == name } } @Nullable Model getByNameAndType(String name, Class type) { - this.ts.find { it.name == name && type.isAssignableFrom(it.get().class) } as Model + this.models.find { it.name == name && type.isAssignableFrom(it.get().class) } as Model } Optional> findByName(String name) { @@ -35,10 +37,31 @@ final class ModelCollection { } def ModelCollection findAllByType(Class type) { - def es = this.ts.findResults { + def es = this.models.findResults { type.isAssignableFrom(it.get().class) ? it as Model : null } new ModelCollection<>(es) } + def Optional> findOne(Class type, Predicate filter) { + Optional.ofNullable(this.models.find { + def t = it.get() + if (type.isAssignableFrom(t.class)) { + filter.test(t as E) ? it : null + } else { + null + } + } as Model) + } + + def Optional> findOne(Class type) { + this.findOne(type) { true } + } + + Optional> findOne(Predicate filter) { + Optional.ofNullable(this.models.find { + filter.test(it.get()) ? it : null + }) + } + } diff --git a/api/src/main/groovy/com/jessebrault/ssg/text/MarkdownTextRenderer.groovy b/api/src/main/groovy/com/jessebrault/ssg/text/MarkdownTextRenderer.groovy index e87ea76..95d049a 100644 --- a/api/src/main/groovy/com/jessebrault/ssg/text/MarkdownTextRenderer.groovy +++ b/api/src/main/groovy/com/jessebrault/ssg/text/MarkdownTextRenderer.groovy @@ -20,7 +20,7 @@ final class MarkdownTextRenderer implements TextRenderer { @Override Result render(Text text) { try { - Result.of(htmlRenderer.render(parser.parse(text.text))) + Result.of(TextUtil.renderMarkdown(text.text)) } catch (Exception e) { Result.of( [new Diagnostic("There was an exception while rendering ${ text.path }:\n${ e }", e)], diff --git a/api/src/main/groovy/com/jessebrault/ssg/text/TextUtil.java b/api/src/main/groovy/com/jessebrault/ssg/text/TextUtil.java new file mode 100644 index 0000000..03507a7 --- /dev/null +++ b/api/src/main/groovy/com/jessebrault/ssg/text/TextUtil.java @@ -0,0 +1,23 @@ +package com.jessebrault.ssg.text; + +import org.commonmark.ext.front.matter.YamlFrontMatterExtension; +import org.commonmark.parser.Parser; +import org.commonmark.renderer.html.HtmlRenderer; + +import java.util.List; + +public final class TextUtil { + + private static final Parser parser = Parser.builder() + .extensions(List.of(YamlFrontMatterExtension.create())) + .build(); + + private static final HtmlRenderer htmlRenderer = HtmlRenderer.builder().build(); + + public static String renderMarkdown(String markdown) { + return htmlRenderer.render(parser.parse(markdown)); + } + + private TextUtil() {} + +} diff --git a/buildSrc/src/main/groovy/ssg.common.gradle b/buildSrc/src/main/groovy/ssg.common.gradle index e90b57d..760d0cd 100644 --- a/buildSrc/src/main/groovy/ssg.common.gradle +++ b/buildSrc/src/main/groovy/ssg.common.gradle @@ -22,9 +22,9 @@ dependencies { * Logging */ // https://mvnrepository.com/artifact/org.slf4j/slf4j-api - implementation 'org.slf4j:slf4j-api:1.7.36' + api 'org.slf4j:slf4j-api:1.7.36' - testFixturesImplementation 'org.slf4j:slf4j-api:1.7.36' + testFixturesApi 'org.slf4j:slf4j-api:1.7.36' /** * TESTING diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index f398c33..37aef8d 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists