Globals proliferated throughout.

This commit is contained in:
JesseBrault0709 2023-01-07 17:28:18 -06:00
parent f205d0b543
commit fd09b720bb
17 changed files with 68 additions and 37 deletions

View File

@ -8,12 +8,12 @@ import com.jessebrault.ssg.specialpage.GspSpecialPageRenderer
import com.jessebrault.ssg.specialpage.SpecialPageFileSpecialPagesProvider
import com.jessebrault.ssg.specialpage.SpecialPageType
import com.jessebrault.ssg.template.GspTemplateRenderer
import com.jessebrault.ssg.template.TemplateType
import com.jessebrault.ssg.template.TemplateFileTemplatesProvider
import com.jessebrault.ssg.template.TemplateType
import com.jessebrault.ssg.text.MarkdownFrontMatterGetter
import com.jessebrault.ssg.text.MarkdownTextRenderer
import com.jessebrault.ssg.text.TextType
import com.jessebrault.ssg.text.TextFileTextsProvider
import com.jessebrault.ssg.text.TextType
import org.slf4j.Logger
import org.slf4j.LoggerFactory
@ -50,7 +50,7 @@ class StaticSiteGeneratorCli {
}
def ssg = new SimpleStaticSiteGenerator(config)
ssg.generate(new File('build'))
ssg.generate(new File('build'), globals)
}
}

View File

@ -1,9 +1,5 @@
package com.jessebrault.ssg
import com.jessebrault.ssg.part.PartsProvider
import com.jessebrault.ssg.specialpage.SpecialPagesProvider
import com.jessebrault.ssg.template.TemplatesProvider
import com.jessebrault.ssg.text.TextsProvider
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import org.slf4j.Marker
@ -22,8 +18,8 @@ class SimpleStaticSiteGenerator implements StaticSiteGenerator {
}
@Override
void generate(File buildDir) {
logger.trace(enter, 'buildDir: {}', buildDir)
void generate(File buildDir, Map globals) {
logger.trace(enter, 'buildDir: {}, globals: {}', buildDir, globals)
// Get all texts, templates, parts, and specialPages
def texts = this.config.textProviders.collectMany { it.getTextFiles() }
@ -50,7 +46,7 @@ class SimpleStaticSiteGenerator implements StaticSiteGenerator {
logger.info('processing text: {}', it.path)
// Render the text (i.e., transform text to html)
def renderedText = it.type.renderer.render(it.text)
def renderedText = it.type.renderer.render(it.text, globals)
logger.debug('renderedText: {}', renderedText)
// Extract frontMatter from text
@ -75,7 +71,7 @@ class SimpleStaticSiteGenerator implements StaticSiteGenerator {
}
// Render the template using the result of rendering the text earlier
def result = template.type.renderer.render(template, frontMatter, renderedText, parts)
def result = template.type.renderer.render(template, frontMatter, renderedText, parts, globals)
logger.debug('result: {}', result)
// Output the result to the outfile, an .html file
@ -86,7 +82,7 @@ class SimpleStaticSiteGenerator implements StaticSiteGenerator {
specialPages.each {
logger.info('processing specialPage: {}', it)
def result = it.type.renderer.render(it.text, texts, parts)
def result = it.type.renderer.render(it.text, texts, parts, globals)
logger.info('result: {}', result)
// Output result to file

View File

@ -1,5 +1,5 @@
package com.jessebrault.ssg
interface StaticSiteGenerator {
void generate(File buildDir)
void generate(File buildDir, Map globals)
}

View File

@ -6,9 +6,10 @@ import groovy.transform.TupleConstructor
class EmbeddablePart {
private final Part part
private final Map globals
String render(Map binding) {
part.type.renderer.render(part.text, binding)
part.type.renderer.render(this.part.text, binding, this.globals)
}
}

View File

@ -8,10 +8,10 @@ class EmbeddablePartsMap {
@Delegate
private final Map<String, EmbeddablePart> partsMap = [:]
EmbeddablePartsMap(Collection<Part> parts) {
EmbeddablePartsMap(Collection<Part> parts, Map globals) {
Objects.requireNonNull(parts)
parts.each {
this.put(it.name, new EmbeddablePart(it))
this.put(it.name, new EmbeddablePart(it, globals))
}
}

View File

@ -8,8 +8,10 @@ class GspPartRenderer implements PartRenderer {
private static final TemplateEngine engine = new GStringTemplateEngine()
@Override
String render(String partText, Map binding) {
engine.createTemplate(partText).make(binding)
String render(String partText, Map binding, Map globals) {
def bindingCopy = new LinkedHashMap(binding)
bindingCopy['globals'] = globals
engine.createTemplate(partText).make(bindingCopy)
}
}

View File

@ -1,5 +1,5 @@
package com.jessebrault.ssg.part
interface PartRenderer {
String render(String partText, Map binding)
String render(String partText, Map binding, Map globals)
}

View File

@ -12,10 +12,11 @@ class GspSpecialPageRenderer implements SpecialPageRenderer {
private static final TemplateEngine engine = new GStringTemplateEngine()
@Override
String render(String text, Collection<Text> texts, Collection<Part> parts) {
String render(String text, Collection<Text> texts, Collection<Part> parts, Map globals) {
engine.createTemplate(text).make([
texts: new EmbeddableTextsCollection(texts),
parts: new EmbeddablePartsMap(parts)
globals: globals,
parts: new EmbeddablePartsMap(parts, globals),
texts: new EmbeddableTextsCollection(texts, globals)
])
}

View File

@ -4,5 +4,12 @@ import com.jessebrault.ssg.part.Part
import com.jessebrault.ssg.text.Text
interface SpecialPageRenderer {
String render(String text, Collection<Text> texts, Collection <Part> parts)
String render(
String text,
Collection<Text> texts,
Collection <Part> parts,
Map globals
)
}

View File

@ -11,11 +11,18 @@ class GspTemplateRenderer implements TemplateRenderer {
private static final TemplateEngine engine = new GStringTemplateEngine()
@Override
String render(Template template, FrontMatter frontMatter, String text, Collection<Part> parts) {
String render(
Template template,
FrontMatter frontMatter,
String text,
Collection<Part> parts,
Map globals
) {
engine.createTemplate(template.text).make([
frontMatter: frontMatter,
text: text,
parts: new EmbeddablePartsMap(parts)
globals: globals,
parts: new EmbeddablePartsMap(parts, globals),
text: text
])
}

View File

@ -4,5 +4,13 @@ import com.jessebrault.ssg.part.Part
import com.jessebrault.ssg.text.FrontMatter
interface TemplateRenderer {
String render(Template template, FrontMatter frontMatter, String text, Collection<Part> parts)
String render(
Template template,
FrontMatter frontMatter,
String text,
Collection<Part> parts,
Map globals
)
}

View File

@ -7,10 +7,11 @@ import groovy.transform.TupleConstructor
class EmbeddableText {
private final Text text
private final Map globals
@Memoized
String render() {
this.text.type.renderer.render(this.text.text)
this.text.type.renderer.render(this.text.text, globals)
}
@Memoized

View File

@ -8,9 +8,9 @@ class EmbeddableTextsCollection {
@Delegate
private final Collection<EmbeddableText> embeddableTexts = []
EmbeddableTextsCollection(Collection<Text> texts) {
EmbeddableTextsCollection(Collection<Text> texts, Map globals) {
Objects.requireNonNull(texts).each {
this << new EmbeddableText(it)
this << new EmbeddableText(it, globals)
}
}

View File

@ -12,7 +12,7 @@ class MarkdownTextRenderer implements TextRenderer {
private static final HtmlRenderer htmlRenderer = HtmlRenderer.builder().build()
@Override
String render(String text) {
String render(String text, Map globals) {
htmlRenderer.render(parser.parse(text))
}

View File

@ -1,5 +1,13 @@
package com.jessebrault.ssg.text
interface TextRenderer {
String render(String text)
/**
* Renders the text from its raw form to html.
*
* @param text in raw form
* @return the rendered text in html
*/
String render(String text, Map globals)
}

View File

@ -60,7 +60,7 @@ class StaticSiteGeneratorTests {
new File(this.templatesDir, 'test.gsp').write('<%= text %>')
def buildDir = File.createTempDir()
this.ssg.generate(buildDir)
this.ssg.generate(buildDir, [:])
def outFile = new File(buildDir, 'test.html')
assertTrue(outFile.exists())
@ -78,7 +78,7 @@ class StaticSiteGeneratorTests {
new File(this.templatesDir, 'nested.gsp').write('<%= text %>')
def buildDir = File.createTempDir()
this.ssg.generate(buildDir)
this.ssg.generate(buildDir, [:])
def outFile = new File(new File(buildDir, 'nested'), 'nested.html')
assertTrue(outFile.exists())
@ -92,7 +92,7 @@ class StaticSiteGeneratorTests {
new FileTreeBuilder(this.textsDir).file('test.md', '---\ntemplate: template.gsp\n---\nHello, World!')
def buildDir = File.createTempDir()
this.ssg.generate(buildDir)
this.ssg.generate(buildDir, [:])
def outFile = new File(buildDir, 'special.html')
assertTrue(outFile.exists())

View File

@ -24,7 +24,7 @@ class GspTemplateRendererTests {
new PartType(['.gsp'], new GspPartRenderer()),
'Hello, $person!'
)
def r = this.renderer.render(template, new FrontMatter([:]), '', [part])
def r = this.renderer.render(template, new FrontMatter([:]), '', [part], [:])
assertEquals('Hello, World!', r)
}
@ -35,7 +35,7 @@ class GspTemplateRendererTests {
null,
null
)
def r = this.renderer.render(template, new FrontMatter([title: ['Hello!']]), '', [])
def r = this.renderer.render(template, new FrontMatter([title: ['Hello!']]), '', [], [:])
assertEquals('Hello!', r)
}