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 Collection<Part> allParts
private final String path
private final String targetPath
String render(Map binding = [:]) {
def result = part.type.renderer.render(
@ -29,7 +29,8 @@ class EmbeddablePart {
this.globals,
this.text,
this.allParts,
this.path
this.path,
this.targetPath
)
if (result.v1.size() > 0) {
this.onDiagnostics.call(result.v1)
@ -41,7 +42,8 @@ class EmbeddablePart {
@Override
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,
Closure onDiagnostics,
@Nullable EmbeddableText text = null,
String path
String path,
String targetPath
) {
Objects.requireNonNull(parts)
Objects.requireNonNull(globals)
Objects.requireNonNull(onDiagnostics)
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.TemplateEngine
import groovy.transform.EqualsAndHashCode
import groovy.transform.NullCheck
import org.jetbrains.annotations.Nullable
@EqualsAndHashCode
@ -21,23 +22,33 @@ class GspPartRenderer implements PartRenderer {
Map globals,
@Nullable EmbeddableText text = null,
Collection<Part> allParts,
String path
String path,
String targetPath
) {
Objects.requireNonNull(part)
Objects.requireNonNull(binding)
Objects.requireNonNull(globals)
Objects.requireNonNull(allParts)
Objects.requireNonNull(path)
Objects.requireNonNull(targetPath)
def embeddedPartDiagnostics = []
try {
def result = engine.createTemplate(part.text).make([
binding: binding,
globals: globals,
parts: new EmbeddablePartsMap(allParts, globals, embeddedPartDiagnostics.&addAll, text, path),
parts: new EmbeddablePartsMap(
allParts,
globals,
embeddedPartDiagnostics.&addAll,
text,
path,
targetPath
),
path: path,
tagBuilder: new DynamicTagBuilder(),
targetPath: targetPath,
text: text,
urlBuilder: new PathBasedUrlBuilder(path)
urlBuilder: new PathBasedUrlBuilder(targetPath)
])
new Tuple2<>([], result.toString())
} catch (Exception e) {

View File

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

View File

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

View File

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

View File

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

View File

@ -31,7 +31,7 @@ class GspTemplateRendererTests {
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!'))
def partType = new PartType([], partRenderer)
def part = new Part('test', partType, null)
@ -56,7 +56,7 @@ class GspTemplateRendererTests {
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!'))
def partType = new PartType([], partRenderer)
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)
}
@ -84,7 +84,7 @@ class GspTemplateRendererTests {
[:],
''
)
assertTrue(r.v1.isEmpty(), getDiagnosticsMessageSupplier(r.v1))
assertEmptyDiagnostics(r)
assertEquals('Hello!', r.v2)
}
@ -99,7 +99,7 @@ class GspTemplateRendererTests {
[test: 'Hello, World!'],
''
)
assertTrue(r.v1.isEmpty(), getDiagnosticsMessageSupplier(r.v1))
assertEmptyDiagnostics(r)
assertEquals('Hello, World!', r.v2)
}

View File

@ -1,11 +1,5 @@
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.Mockito.mock
import static org.mockito.Mockito.when