Added targetPath to parts dsl.

This commit is contained in:
Jesse Brault 2023-02-15 12:15:45 +01:00
parent 6de83dff10
commit 06499a9616
10 changed files with 84 additions and 30 deletions

View File

@ -19,8 +19,8 @@ class EmbeddablePart {
private final EmbeddableText text private final EmbeddableText text
private final Collection<Part> allParts private final Collection<Part> allParts
private final String path private final String path
private final String targetPath
String render(Map binding = [:]) { String render(Map binding = [:]) {
def result = part.type.renderer.render( def result = part.type.renderer.render(
@ -29,7 +29,8 @@ class EmbeddablePart {
this.globals, this.globals,
this.text, this.text,
this.allParts, this.allParts,
this.path this.path,
this.targetPath
) )
if (result.v1.size() > 0) { if (result.v1.size() > 0) {
this.onDiagnostics.call(result.v1) this.onDiagnostics.call(result.v1)
@ -41,7 +42,8 @@ class EmbeddablePart {
@Override @Override
String toString() { String toString() {
"EmbeddablePart(part: ${ this.part }, globals: ${ this.globals })" "EmbeddablePart(part: ${ this.part }, globals: ${ this.globals }, path: ${ this.path }, " +
"targetPath: ${ this.targetPath })"
} }
} }

View File

@ -15,13 +15,14 @@ class EmbeddablePartsMap {
Map globals, Map globals,
Closure onDiagnostics, Closure onDiagnostics,
@Nullable EmbeddableText text = null, @Nullable EmbeddableText text = null,
String path String path,
String targetPath
) { ) {
Objects.requireNonNull(parts) Objects.requireNonNull(parts)
Objects.requireNonNull(globals) Objects.requireNonNull(globals)
Objects.requireNonNull(onDiagnostics) Objects.requireNonNull(onDiagnostics)
parts.each { parts.each {
this.put(it.path, new EmbeddablePart(it, globals, onDiagnostics, text, parts, path)) this.put(it.path, new EmbeddablePart(it, globals, onDiagnostics, text, parts, path, targetPath))
} }
} }

View File

@ -7,6 +7,7 @@ import com.jessebrault.ssg.url.PathBasedUrlBuilder
import groovy.text.GStringTemplateEngine import groovy.text.GStringTemplateEngine
import groovy.text.TemplateEngine import groovy.text.TemplateEngine
import groovy.transform.EqualsAndHashCode import groovy.transform.EqualsAndHashCode
import groovy.transform.NullCheck
import org.jetbrains.annotations.Nullable import org.jetbrains.annotations.Nullable
@EqualsAndHashCode @EqualsAndHashCode
@ -21,23 +22,33 @@ class GspPartRenderer implements PartRenderer {
Map globals, Map globals,
@Nullable EmbeddableText text = null, @Nullable EmbeddableText text = null,
Collection<Part> allParts, Collection<Part> allParts,
String path String path,
String targetPath
) { ) {
Objects.requireNonNull(part) Objects.requireNonNull(part)
Objects.requireNonNull(binding) Objects.requireNonNull(binding)
Objects.requireNonNull(globals) Objects.requireNonNull(globals)
Objects.requireNonNull(allParts) Objects.requireNonNull(allParts)
Objects.requireNonNull(path) Objects.requireNonNull(path)
Objects.requireNonNull(targetPath)
def embeddedPartDiagnostics = [] def embeddedPartDiagnostics = []
try { try {
def result = engine.createTemplate(part.text).make([ def result = engine.createTemplate(part.text).make([
binding: binding, binding: binding,
globals: globals, globals: globals,
parts: new EmbeddablePartsMap(allParts, globals, embeddedPartDiagnostics.&addAll, text, path), parts: new EmbeddablePartsMap(
allParts,
globals,
embeddedPartDiagnostics.&addAll,
text,
path,
targetPath
),
path: path, path: path,
tagBuilder: new DynamicTagBuilder(), tagBuilder: new DynamicTagBuilder(),
targetPath: targetPath,
text: text, text: text,
urlBuilder: new PathBasedUrlBuilder(path) urlBuilder: new PathBasedUrlBuilder(targetPath)
]) ])
new Tuple2<>([], result.toString()) new Tuple2<>([], result.toString())
} catch (Exception e) { } catch (Exception e) {

View File

@ -12,7 +12,8 @@ interface PartRenderer {
Map globals, Map globals,
@Nullable EmbeddableText text, @Nullable EmbeddableText text,
Collection<Part> allParts, Collection<Part> allParts,
String path String path,
String targetPath
) )
} }

View File

@ -30,7 +30,7 @@ class GspSpecialPageRenderer implements SpecialPageRenderer {
Collection<Diagnostic> diagnostics = [] Collection<Diagnostic> diagnostics = []
def result = engine.createTemplate(specialPage.text).make([ def result = engine.createTemplate(specialPage.text).make([
globals: globals, globals: globals,
parts: new EmbeddablePartsMap(parts, globals, diagnostics.&addAll, specialPage.path), parts: new EmbeddablePartsMap(parts, globals, diagnostics.&addAll, specialPage.path, targetPath),
path: specialPage.path, path: specialPage.path,
tagBuilder: new DynamicTagBuilder(), tagBuilder: new DynamicTagBuilder(),
targetPath: targetPath, targetPath: targetPath,

View File

@ -38,7 +38,7 @@ class GspTemplateRenderer implements TemplateRenderer {
def result = engine.createTemplate(template.text).make([ def result = engine.createTemplate(template.text).make([
frontMatter: frontMatter, frontMatter: frontMatter,
globals: globals, globals: globals,
parts: new EmbeddablePartsMap(parts, globals, onDiagnostics, embeddableText, text.path), parts: new EmbeddablePartsMap(parts, globals, onDiagnostics, embeddableText, text.path, targetPath),
path: text.path, path: text.path,
tagBuilder: new DynamicTagBuilder(), tagBuilder: new DynamicTagBuilder(),
targetPath: targetPath, targetPath: targetPath,

View File

@ -16,7 +16,15 @@ class GspPartRendererTests {
@Test @Test
void rendersWithNoBindingOrGlobals() { void rendersWithNoBindingOrGlobals() {
def part = new Part('', null, 'Hello, World!') def part = new Part('', null, 'Hello, World!')
def r = this.renderer.render(part, [:], [:], null, [part], '') def r = this.renderer.render(
part,
[:],
[:],
null,
[part],
'',
''
)
assertTrue(r.v1.size() == 0) assertTrue(r.v1.size() == 0)
assertEquals('Hello, World!', r.v2) assertEquals('Hello, World!', r.v2)
} }
@ -30,6 +38,7 @@ class GspPartRendererTests {
[:], [:],
null, null,
[part], [part],
'',
'' ''
) )
assertTrue(r.v1.size() == 0) assertTrue(r.v1.size() == 0)
@ -45,6 +54,7 @@ class GspPartRendererTests {
[greeting: 'Hello, World!'], [greeting: 'Hello, World!'],
null, null,
[part], [part],
'',
'' ''
) )
assertTrue(r.v1.size() == 0) assertTrue(r.v1.size() == 0)
@ -61,6 +71,7 @@ class GspPartRendererTests {
[:], [:],
new EmbeddableText(renderableText('Hello, World!'), [:], textDiagnostics.&addAll), new EmbeddableText(renderableText('Hello, World!'), [:], textDiagnostics.&addAll),
[part], [part],
'',
'' ''
) )
assertTrue(textDiagnostics.isEmpty()) assertTrue(textDiagnostics.isEmpty())
@ -71,7 +82,15 @@ class GspPartRendererTests {
@Test @Test
void tagBuilderAvailable() { void tagBuilderAvailable() {
def part = new Part('', null, '<%= tagBuilder.test() %>') def part = new Part('', null, '<%= tagBuilder.test() %>')
def r = this.renderer.render(part, [:], [:], null, [part], '') def r = this.renderer.render(
part,
[:],
[:],
null,
[part],
'',
''
)
assertTrue(r.v1.isEmpty()) assertTrue(r.v1.isEmpty())
assertEquals('<test />', r.v2) assertEquals('<test />', r.v2)
} }
@ -81,7 +100,15 @@ class GspPartRendererTests {
def partType = new PartType(['.gsp'], this.renderer) def partType = new PartType(['.gsp'], this.renderer)
def part0 = new Part('part0.gsp', partType, '<%= parts["part1.gsp"].render() %>') def part0 = new Part('part0.gsp', partType, '<%= parts["part1.gsp"].render() %>')
def part1 = new Part('part1.gsp', partType, 'Hello, World!') def part1 = new Part('part1.gsp', partType, 'Hello, World!')
def r = this.renderer.render(part0, [:], [:], null, [part0, part1], '') def r = this.renderer.render(
part0,
[:],
[:],
null,
[part0, part1],
'',
''
)
assertTrue(r.v1.isEmpty(), getDiagnosticsMessageSupplier(r.v1)) assertTrue(r.v1.isEmpty(), getDiagnosticsMessageSupplier(r.v1))
assertEquals('Hello, World!', r.v2) assertEquals('Hello, World!', r.v2)
} }
@ -95,7 +122,8 @@ class GspPartRendererTests {
[:], [:],
null, null,
[part], [part],
'test.md' 'test.md',
''
) )
assertEmptyDiagnostics(r) assertEmptyDiagnostics(r)
assertEquals('test.md', r.v2) assertEquals('test.md', r.v2)
@ -110,10 +138,27 @@ class GspPartRendererTests {
[:], [:],
null, null,
[part], [part],
'test.md' '',
'test/test.html'
) )
assertEmptyDiagnostics(r) assertEmptyDiagnostics(r)
assertEquals('images/test.jpg', r.v2) assertEquals('../images/test.jpg', r.v2)
}
@Test
void targetPathAvailable() {
def part = new Part('', null, '<%= targetPath %>')
def r = this.renderer.render(
part,
[:],
[:],
null,
[part],
'',
'test/test.html'
)
assertEmptyDiagnostics(r)
assertEquals('test/test.html', r.v2)
} }
} }

View File

@ -31,7 +31,7 @@ class GspSpecialPageRendererTests {
@Test @Test
void rendersPartWithNoBinding(@Mock PartRenderer partRenderer) { void rendersPartWithNoBinding(@Mock PartRenderer partRenderer) {
when(partRenderer.render(any(), any(), any(), any(), any(), any())) when(partRenderer.render(any(), any(), any(), any(), any(), any(), any()))
.thenReturn(new Tuple2<>([], 'Hello, World!')) .thenReturn(new Tuple2<>([], 'Hello, World!'))
def partType = new PartType([], partRenderer) def partType = new PartType([], partRenderer)
def part = new Part('test', partType , '') def part = new Part('test', partType , '')
@ -45,7 +45,7 @@ class GspSpecialPageRendererTests {
@Test @Test
void rendersPartWithBinding(@Mock PartRenderer partRenderer) { void rendersPartWithBinding(@Mock PartRenderer partRenderer) {
when(partRenderer.render( when(partRenderer.render(
any(), argThat { Map m -> m.get('greeting') == 'Hello, World!'}, any(), any(), any(), any() any(), argThat { Map m -> m.get('greeting') == 'Hello, World!'}, any(), any(), any(), any(), any()
)).thenReturn(new Tuple2<>([], 'Hello, World!')) )).thenReturn(new Tuple2<>([], 'Hello, World!'))
def partType = new PartType([], partRenderer) def partType = new PartType([], partRenderer)
def part = new Part('test', partType, '') def part = new Part('test', partType, '')

View File

@ -31,7 +31,7 @@ class GspTemplateRendererTests {
null null
) )
when(partRenderer.render(any(), any(), any(), any(), any(), any())) when(partRenderer.render(any(), any(), any(), any(), any(), any(), any()))
.thenReturn(new Tuple2<>([], 'Hello, World!')) .thenReturn(new Tuple2<>([], 'Hello, World!'))
def partType = new PartType([], partRenderer) def partType = new PartType([], partRenderer)
def part = new Part('test', partType, null) def part = new Part('test', partType, null)
@ -56,7 +56,7 @@ class GspTemplateRendererTests {
null null
) )
when(partRenderer.render(any(), argThat { Map m -> m.get('person') == 'World' }, any(), any(), any(), any())) when(partRenderer.render(any(), argThat { Map m -> m.get('person') == 'World' }, any(), any(), any(), any(), any()))
.thenReturn(new Tuple2<>([], 'Hello, World!')) .thenReturn(new Tuple2<>([], 'Hello, World!'))
def partType = new PartType([], partRenderer) def partType = new PartType([], partRenderer)
def part = new Part('greeting', partType, null) def part = new Part('greeting', partType, null)
@ -69,7 +69,7 @@ class GspTemplateRendererTests {
[:], [:],
'' ''
) )
assertTrue(r.v1.isEmpty(), getDiagnosticsMessageSupplier(r.v1)) assertEmptyDiagnostics(r)
assertEquals('Hello, World!', r.v2) assertEquals('Hello, World!', r.v2)
} }
@ -84,7 +84,7 @@ class GspTemplateRendererTests {
[:], [:],
'' ''
) )
assertTrue(r.v1.isEmpty(), getDiagnosticsMessageSupplier(r.v1)) assertEmptyDiagnostics(r)
assertEquals('Hello!', r.v2) assertEquals('Hello!', r.v2)
} }
@ -99,7 +99,7 @@ class GspTemplateRendererTests {
[test: 'Hello, World!'], [test: 'Hello, World!'],
'' ''
) )
assertTrue(r.v1.isEmpty(), getDiagnosticsMessageSupplier(r.v1)) assertEmptyDiagnostics(r)
assertEquals('Hello, World!', r.v2) assertEquals('Hello, World!', r.v2)
} }

View File

@ -1,11 +1,5 @@
package com.jessebrault.ssg.text package com.jessebrault.ssg.text
import com.jessebrault.ssg.text.ExcerptGetter
import com.jessebrault.ssg.text.FrontMatterGetter
import com.jessebrault.ssg.text.Text
import com.jessebrault.ssg.text.TextRenderer
import com.jessebrault.ssg.text.TextType
import static org.mockito.ArgumentMatchers.any import static org.mockito.ArgumentMatchers.any
import static org.mockito.Mockito.mock import static org.mockito.Mockito.mock
import static org.mockito.Mockito.when import static org.mockito.Mockito.when