Added InputPages; fixed output paths.

This commit is contained in:
Jesse Brault 2023-02-15 10:16:42 +01:00
parent 076bc9bc52
commit bbb0484a74
10 changed files with 67 additions and 46 deletions

View File

@ -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)
}
}
}

View File

@ -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 })"
}
}

View File

@ -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<Diagnostic>, Collection<GeneratedPage>> generate(Build build) {
Tuple2<Collection<Diagnostic>, Collection<OutputPage>> 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<Diagnostic> diagnostics = []
Collection<GeneratedPage> generatedPages = []
Collection<OutputPage> 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)

View File

@ -1,5 +1,7 @@
package com.jessebrault.ssg
import com.jessebrault.ssg.output.OutputPage
interface StaticSiteGenerator {
Tuple2<Collection<Diagnostic>, Collection<GeneratedPage>> generate(Build build)
Tuple2<Collection<Diagnostic>, Collection<OutputPage>> generate(Build build)
}

View File

@ -0,0 +1,5 @@
package com.jessebrault.ssg.input
interface InputPage {
String getPath()
}

View File

@ -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 })"
}
}

View File

@ -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<Diagnostic> textDiagnostics ->
diagnostics.addAll(textDiagnostics)
}),
texts: new EmbeddableTextsCollection(texts, globals, diagnostics.&addAll),
urlBuilder: new PathBasedUrlBuilder(specialPage.path)
])
new Tuple2<>(diagnostics, result.toString())

View File

@ -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

View File

@ -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

View File

@ -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('<p><strong>Hello, World!</strong></p>\n', p0.html)
assertEquals('test.html', p0.path)
assertEquals('<p><strong>Hello, World!</strong></p>\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('<p><strong>Hello, World!</strong></p>\n', p0.html)
assertEquals('nested/nested.html', p0.path)
assertEquals('<p><strong>Hello, World!</strong></p>\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('<p>Hello, World!</p>\n', specialPage.html)
assertEquals('<p>Hello, World!</p>\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())
}