diff --git a/cli/src/main/groovy/com/jessebrault/ssg/AbstractBuildCommand.groovy b/cli/src/main/groovy/com/jessebrault/ssg/AbstractBuildCommand.groovy index 80b8cd0..dba4ed5 100644 --- a/cli/src/main/groovy/com/jessebrault/ssg/AbstractBuildCommand.groovy +++ b/cli/src/main/groovy/com/jessebrault/ssg/AbstractBuildCommand.groovy @@ -1,6 +1,7 @@ package com.jessebrault.ssg import com.jessebrault.ssg.buildscript.GroovyBuildScriptRunner +import com.jessebrault.ssg.output.OutputPage import com.jessebrault.ssg.part.GspPartRenderer import com.jessebrault.ssg.part.PartFilePartsProvider import com.jessebrault.ssg.part.PartType @@ -75,10 +76,10 @@ abstract class AbstractBuildCommand extends AbstractSubCommand { logger.error(it.message) } } else { - result.v2.each { GeneratedPage generatedPage -> - def target = new File(it.outDir, generatedPage.path + '.html') + result.v2.each { OutputPage outputPage -> + def target = new File(it.outDir, outputPage.path) target.createParentDirectories() - target.write(generatedPage.html) + target.write(outputPage.content) } } } diff --git a/lib/src/main/groovy/com/jessebrault/ssg/GeneratedPage.groovy b/lib/src/main/groovy/com/jessebrault/ssg/GeneratedPage.groovy deleted file mode 100644 index 6b92787..0000000 --- a/lib/src/main/groovy/com/jessebrault/ssg/GeneratedPage.groovy +++ /dev/null @@ -1,20 +0,0 @@ -package com.jessebrault.ssg - -import groovy.transform.EqualsAndHashCode -import groovy.transform.NullCheck -import groovy.transform.TupleConstructor - -@TupleConstructor(includeFields = true, defaults = false) -@NullCheck -@EqualsAndHashCode -class GeneratedPage { - - String path - String html - - @Override - String toString() { - "GeneratedPage(path: ${ this.path })" - } - -} diff --git a/lib/src/main/groovy/com/jessebrault/ssg/SimpleStaticSiteGenerator.groovy b/lib/src/main/groovy/com/jessebrault/ssg/SimpleStaticSiteGenerator.groovy index 04504ed..53d2a43 100644 --- a/lib/src/main/groovy/com/jessebrault/ssg/SimpleStaticSiteGenerator.groovy +++ b/lib/src/main/groovy/com/jessebrault/ssg/SimpleStaticSiteGenerator.groovy @@ -1,5 +1,6 @@ package com.jessebrault.ssg +import com.jessebrault.ssg.output.OutputPage import com.jessebrault.ssg.text.FrontMatter import groovy.transform.EqualsAndHashCode import groovy.transform.NullCheck @@ -19,7 +20,7 @@ class SimpleStaticSiteGenerator implements StaticSiteGenerator { private static final Marker exit = MarkerFactory.getMarker('EXIT') @Override - Tuple2, Collection> generate(Build build) { + Tuple2, Collection> generate(Build build) { logger.trace(enter, 'build: {}', build) logger.info('processing build with name: {}', build.name) @@ -35,7 +36,7 @@ class SimpleStaticSiteGenerator implements StaticSiteGenerator { def globals = build.globals Collection diagnostics = [] - Collection generatedPages = [] + Collection generatedPages = [] // Generate pages from each text, but only those that have a 'template' frontMatter field with a valid value texts.each { @@ -87,7 +88,7 @@ class SimpleStaticSiteGenerator implements StaticSiteGenerator { } // Create a GeneratedPage - generatedPages << new GeneratedPage(it.path, renderedTemplate) + generatedPages << OutputPage.of(it, '.html', renderedTemplate) } // Generate special pages @@ -105,7 +106,7 @@ class SimpleStaticSiteGenerator implements StaticSiteGenerator { } // Create a GeneratedPage - generatedPages << new GeneratedPage(it.path, renderedSpecialPage) + generatedPages << OutputPage.of(it, '.html', renderedSpecialPage) } logger.trace(exit, '\n\tdiagnostics: {}\n\tgeneratedPages: {}', diagnostics, generatedPages) diff --git a/lib/src/main/groovy/com/jessebrault/ssg/StaticSiteGenerator.groovy b/lib/src/main/groovy/com/jessebrault/ssg/StaticSiteGenerator.groovy index 8553be4..37573c9 100644 --- a/lib/src/main/groovy/com/jessebrault/ssg/StaticSiteGenerator.groovy +++ b/lib/src/main/groovy/com/jessebrault/ssg/StaticSiteGenerator.groovy @@ -1,5 +1,7 @@ package com.jessebrault.ssg +import com.jessebrault.ssg.output.OutputPage + interface StaticSiteGenerator { - Tuple2, Collection> generate(Build build) + Tuple2, Collection> generate(Build build) } diff --git a/lib/src/main/groovy/com/jessebrault/ssg/input/InputPage.groovy b/lib/src/main/groovy/com/jessebrault/ssg/input/InputPage.groovy new file mode 100644 index 0000000..1e37f22 --- /dev/null +++ b/lib/src/main/groovy/com/jessebrault/ssg/input/InputPage.groovy @@ -0,0 +1,5 @@ +package com.jessebrault.ssg.input + +interface InputPage { + String getPath() +} \ No newline at end of file diff --git a/lib/src/main/groovy/com/jessebrault/ssg/output/OutputPage.groovy b/lib/src/main/groovy/com/jessebrault/ssg/output/OutputPage.groovy new file mode 100644 index 0000000..c4a17b1 --- /dev/null +++ b/lib/src/main/groovy/com/jessebrault/ssg/output/OutputPage.groovy @@ -0,0 +1,30 @@ +package com.jessebrault.ssg.output + +import com.jessebrault.ssg.input.InputPage +import groovy.transform.EqualsAndHashCode +import groovy.transform.NullCheck + +import static com.jessebrault.ssg.util.ExtensionsUtil.stripExtension + +@NullCheck +@EqualsAndHashCode +final class OutputPage { + + static OutputPage of(InputPage inputFile, String extension, String content) { + new OutputPage(stripExtension(inputFile.path) + extension, content) + } + + final String path + final String content + + private OutputPage(String path, String content) { + this.path = path + this.content = content + } + + @Override + String toString() { + "GeneratedPage(path: ${ this.path })" + } + +} diff --git a/lib/src/main/groovy/com/jessebrault/ssg/specialpage/GspSpecialPageRenderer.groovy b/lib/src/main/groovy/com/jessebrault/ssg/specialpage/GspSpecialPageRenderer.groovy index df607f1..d084d16 100644 --- a/lib/src/main/groovy/com/jessebrault/ssg/specialpage/GspSpecialPageRenderer.groovy +++ b/lib/src/main/groovy/com/jessebrault/ssg/specialpage/GspSpecialPageRenderer.groovy @@ -32,9 +32,7 @@ class GspSpecialPageRenderer implements SpecialPageRenderer { parts: new EmbeddablePartsMap(parts, globals, diagnostics.&addAll, specialPage.path), path: specialPage.path, tagBuilder: new DynamicTagBuilder(), - texts: new EmbeddableTextsCollection(texts, globals, { Collection textDiagnostics -> - diagnostics.addAll(textDiagnostics) - }), + texts: new EmbeddableTextsCollection(texts, globals, diagnostics.&addAll), urlBuilder: new PathBasedUrlBuilder(specialPage.path) ]) new Tuple2<>(diagnostics, result.toString()) diff --git a/lib/src/main/groovy/com/jessebrault/ssg/specialpage/SpecialPage.groovy b/lib/src/main/groovy/com/jessebrault/ssg/specialpage/SpecialPage.groovy index 869a412..c3df5fa 100644 --- a/lib/src/main/groovy/com/jessebrault/ssg/specialpage/SpecialPage.groovy +++ b/lib/src/main/groovy/com/jessebrault/ssg/specialpage/SpecialPage.groovy @@ -1,5 +1,6 @@ package com.jessebrault.ssg.specialpage +import com.jessebrault.ssg.input.InputPage import groovy.transform.EqualsAndHashCode import groovy.transform.NullCheck import groovy.transform.TupleConstructor @@ -7,7 +8,7 @@ import groovy.transform.TupleConstructor @TupleConstructor(defaults = false) @NullCheck @EqualsAndHashCode -class SpecialPage { +class SpecialPage implements InputPage { String text String path diff --git a/lib/src/main/groovy/com/jessebrault/ssg/text/Text.groovy b/lib/src/main/groovy/com/jessebrault/ssg/text/Text.groovy index ad6fccc..a81275d 100644 --- a/lib/src/main/groovy/com/jessebrault/ssg/text/Text.groovy +++ b/lib/src/main/groovy/com/jessebrault/ssg/text/Text.groovy @@ -1,5 +1,6 @@ package com.jessebrault.ssg.text +import com.jessebrault.ssg.input.InputPage import groovy.transform.EqualsAndHashCode import groovy.transform.NullCheck import groovy.transform.TupleConstructor @@ -7,7 +8,7 @@ import groovy.transform.TupleConstructor @TupleConstructor(defaults = false) @NullCheck @EqualsAndHashCode -class Text { +class Text implements InputPage { String text String path diff --git a/lib/src/test/groovy/com/jessebrault/ssg/SimpleStaticSiteGeneratorIntegrationTests.groovy b/lib/src/test/groovy/com/jessebrault/ssg/SimpleStaticSiteGeneratorIntegrationTests.groovy index 614df3d..2a009b1 100644 --- a/lib/src/test/groovy/com/jessebrault/ssg/SimpleStaticSiteGeneratorIntegrationTests.groovy +++ b/lib/src/test/groovy/com/jessebrault/ssg/SimpleStaticSiteGeneratorIntegrationTests.groovy @@ -17,6 +17,7 @@ import com.jessebrault.ssg.text.TextType import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test +import static com.jessebrault.ssg.testutil.DiagnosticsUtil.assertEmptyDiagnostics import static org.junit.jupiter.api.Assertions.* class SimpleStaticSiteGeneratorIntegrationTests { @@ -65,12 +66,12 @@ class SimpleStaticSiteGeneratorIntegrationTests { def result = this.ssg.generate(this.build) - assertTrue(result.v1.size() == 0) + assertEmptyDiagnostics(result) assertTrue(result.v2.size() == 1) def p0 = result.v2[0] - assertEquals('test', p0.path) - assertEquals('

Hello, World!

\n', p0.html) + assertEquals('test.html', p0.path) + assertEquals('

Hello, World!

\n', p0.content) } @Test @@ -85,39 +86,40 @@ class SimpleStaticSiteGeneratorIntegrationTests { def result = this.ssg.generate(this.build) - assertTrue(result.v1.size() == 0) + assertEmptyDiagnostics(result) assertTrue(result.v2.size() == 1) def p0 = result.v2[0] - assertEquals('nested/nested', p0.path) - assertEquals('

Hello, World!

\n', p0.html) + assertEquals('nested/nested.html', p0.path) + assertEquals('

Hello, World!

\n', p0.content) } @Test void outputsSpecialPage() { - new FileTreeBuilder(this.specialPagesDir).file('special.gsp', $/<%= texts.find { it.path == 'test' }.render() %>/$) + new FileTreeBuilder(this.specialPagesDir) + .file('special.gsp', $/<%= texts.find { it.path == 'test.md' }.render() %>/$) new FileTreeBuilder(this.templatesDir).file('template.gsp', '<%= 1 + 1 %>') new FileTreeBuilder(this.textsDir).file('test.md', '---\ntemplate: template.gsp\n---\nHello, World!') def result = this.ssg.generate(this.build) - assertEquals(0, result.v1.size()) + assertEmptyDiagnostics(result) assertEquals(2, result.v2.size()) - def testPage = result.v2.find { it.path == 'test' } + def testPage = result.v2.find { it.path == 'test.html' } assertNotNull(testPage) - assertEquals('2', testPage.html) + assertEquals('2', testPage.content) - def specialPage = result.v2.find { it.path == 'special' } + def specialPage = result.v2.find { it.path == 'special.html' } assertNotNull(specialPage) - assertEquals('

Hello, World!

\n', specialPage.html) + assertEquals('

Hello, World!

\n', specialPage.content) } @Test void doesNotGenerateIfNoTemplateInFrontMatter() { new File(this.textsDir, 'test.md').write('Hello, World!') def result = this.ssg.generate(this.build) - assertEquals(0, result.v1.size()) + assertEmptyDiagnostics(result) assertEquals(0, result.v2.size()) }