Globals proliferated throughout.
This commit is contained in:
parent
f205d0b543
commit
fd09b720bb
@ -8,12 +8,12 @@ import com.jessebrault.ssg.specialpage.GspSpecialPageRenderer
|
|||||||
import com.jessebrault.ssg.specialpage.SpecialPageFileSpecialPagesProvider
|
import com.jessebrault.ssg.specialpage.SpecialPageFileSpecialPagesProvider
|
||||||
import com.jessebrault.ssg.specialpage.SpecialPageType
|
import com.jessebrault.ssg.specialpage.SpecialPageType
|
||||||
import com.jessebrault.ssg.template.GspTemplateRenderer
|
import com.jessebrault.ssg.template.GspTemplateRenderer
|
||||||
import com.jessebrault.ssg.template.TemplateType
|
|
||||||
import com.jessebrault.ssg.template.TemplateFileTemplatesProvider
|
import com.jessebrault.ssg.template.TemplateFileTemplatesProvider
|
||||||
|
import com.jessebrault.ssg.template.TemplateType
|
||||||
import com.jessebrault.ssg.text.MarkdownFrontMatterGetter
|
import com.jessebrault.ssg.text.MarkdownFrontMatterGetter
|
||||||
import com.jessebrault.ssg.text.MarkdownTextRenderer
|
import com.jessebrault.ssg.text.MarkdownTextRenderer
|
||||||
import com.jessebrault.ssg.text.TextType
|
|
||||||
import com.jessebrault.ssg.text.TextFileTextsProvider
|
import com.jessebrault.ssg.text.TextFileTextsProvider
|
||||||
|
import com.jessebrault.ssg.text.TextType
|
||||||
import org.slf4j.Logger
|
import org.slf4j.Logger
|
||||||
import org.slf4j.LoggerFactory
|
import org.slf4j.LoggerFactory
|
||||||
|
|
||||||
@ -50,7 +50,7 @@ class StaticSiteGeneratorCli {
|
|||||||
}
|
}
|
||||||
|
|
||||||
def ssg = new SimpleStaticSiteGenerator(config)
|
def ssg = new SimpleStaticSiteGenerator(config)
|
||||||
ssg.generate(new File('build'))
|
ssg.generate(new File('build'), globals)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,5 @@
|
|||||||
package com.jessebrault.ssg
|
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.Logger
|
||||||
import org.slf4j.LoggerFactory
|
import org.slf4j.LoggerFactory
|
||||||
import org.slf4j.Marker
|
import org.slf4j.Marker
|
||||||
@ -22,8 +18,8 @@ class SimpleStaticSiteGenerator implements StaticSiteGenerator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
void generate(File buildDir) {
|
void generate(File buildDir, Map globals) {
|
||||||
logger.trace(enter, 'buildDir: {}', buildDir)
|
logger.trace(enter, 'buildDir: {}, globals: {}', buildDir, globals)
|
||||||
|
|
||||||
// Get all texts, templates, parts, and specialPages
|
// Get all texts, templates, parts, and specialPages
|
||||||
def texts = this.config.textProviders.collectMany { it.getTextFiles() }
|
def texts = this.config.textProviders.collectMany { it.getTextFiles() }
|
||||||
@ -50,7 +46,7 @@ class SimpleStaticSiteGenerator implements StaticSiteGenerator {
|
|||||||
logger.info('processing text: {}', it.path)
|
logger.info('processing text: {}', it.path)
|
||||||
|
|
||||||
// Render the text (i.e., transform text to html)
|
// 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)
|
logger.debug('renderedText: {}', renderedText)
|
||||||
|
|
||||||
// Extract frontMatter from text
|
// Extract frontMatter from text
|
||||||
@ -75,7 +71,7 @@ class SimpleStaticSiteGenerator implements StaticSiteGenerator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Render the template using the result of rendering the text earlier
|
// 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)
|
logger.debug('result: {}', result)
|
||||||
|
|
||||||
// Output the result to the outfile, an .html file
|
// Output the result to the outfile, an .html file
|
||||||
@ -86,7 +82,7 @@ class SimpleStaticSiteGenerator implements StaticSiteGenerator {
|
|||||||
specialPages.each {
|
specialPages.each {
|
||||||
logger.info('processing specialPage: {}', it)
|
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)
|
logger.info('result: {}', result)
|
||||||
|
|
||||||
// Output result to file
|
// Output result to file
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
package com.jessebrault.ssg
|
package com.jessebrault.ssg
|
||||||
|
|
||||||
interface StaticSiteGenerator {
|
interface StaticSiteGenerator {
|
||||||
void generate(File buildDir)
|
void generate(File buildDir, Map globals)
|
||||||
}
|
}
|
||||||
|
@ -6,9 +6,10 @@ import groovy.transform.TupleConstructor
|
|||||||
class EmbeddablePart {
|
class EmbeddablePart {
|
||||||
|
|
||||||
private final Part part
|
private final Part part
|
||||||
|
private final Map globals
|
||||||
|
|
||||||
String render(Map binding) {
|
String render(Map binding) {
|
||||||
part.type.renderer.render(part.text, binding)
|
part.type.renderer.render(this.part.text, binding, this.globals)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -8,10 +8,10 @@ class EmbeddablePartsMap {
|
|||||||
@Delegate
|
@Delegate
|
||||||
private final Map<String, EmbeddablePart> partsMap = [:]
|
private final Map<String, EmbeddablePart> partsMap = [:]
|
||||||
|
|
||||||
EmbeddablePartsMap(Collection<Part> parts) {
|
EmbeddablePartsMap(Collection<Part> parts, Map globals) {
|
||||||
Objects.requireNonNull(parts)
|
Objects.requireNonNull(parts)
|
||||||
parts.each {
|
parts.each {
|
||||||
this.put(it.name, new EmbeddablePart(it))
|
this.put(it.name, new EmbeddablePart(it, globals))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,8 +8,10 @@ class GspPartRenderer implements PartRenderer {
|
|||||||
private static final TemplateEngine engine = new GStringTemplateEngine()
|
private static final TemplateEngine engine = new GStringTemplateEngine()
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
String render(String partText, Map binding) {
|
String render(String partText, Map binding, Map globals) {
|
||||||
engine.createTemplate(partText).make(binding)
|
def bindingCopy = new LinkedHashMap(binding)
|
||||||
|
bindingCopy['globals'] = globals
|
||||||
|
engine.createTemplate(partText).make(bindingCopy)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
package com.jessebrault.ssg.part
|
package com.jessebrault.ssg.part
|
||||||
|
|
||||||
interface PartRenderer {
|
interface PartRenderer {
|
||||||
String render(String partText, Map binding)
|
String render(String partText, Map binding, Map globals)
|
||||||
}
|
}
|
||||||
|
@ -12,10 +12,11 @@ class GspSpecialPageRenderer implements SpecialPageRenderer {
|
|||||||
private static final TemplateEngine engine = new GStringTemplateEngine()
|
private static final TemplateEngine engine = new GStringTemplateEngine()
|
||||||
|
|
||||||
@Override
|
@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([
|
engine.createTemplate(text).make([
|
||||||
texts: new EmbeddableTextsCollection(texts),
|
globals: globals,
|
||||||
parts: new EmbeddablePartsMap(parts)
|
parts: new EmbeddablePartsMap(parts, globals),
|
||||||
|
texts: new EmbeddableTextsCollection(texts, globals)
|
||||||
])
|
])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,5 +4,12 @@ import com.jessebrault.ssg.part.Part
|
|||||||
import com.jessebrault.ssg.text.Text
|
import com.jessebrault.ssg.text.Text
|
||||||
|
|
||||||
interface SpecialPageRenderer {
|
interface SpecialPageRenderer {
|
||||||
String render(String text, Collection<Text> texts, Collection <Part> parts)
|
|
||||||
|
String render(
|
||||||
|
String text,
|
||||||
|
Collection<Text> texts,
|
||||||
|
Collection <Part> parts,
|
||||||
|
Map globals
|
||||||
|
)
|
||||||
|
|
||||||
}
|
}
|
@ -11,11 +11,18 @@ class GspTemplateRenderer implements TemplateRenderer {
|
|||||||
private static final TemplateEngine engine = new GStringTemplateEngine()
|
private static final TemplateEngine engine = new GStringTemplateEngine()
|
||||||
|
|
||||||
@Override
|
@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([
|
engine.createTemplate(template.text).make([
|
||||||
frontMatter: frontMatter,
|
frontMatter: frontMatter,
|
||||||
text: text,
|
globals: globals,
|
||||||
parts: new EmbeddablePartsMap(parts)
|
parts: new EmbeddablePartsMap(parts, globals),
|
||||||
|
text: text
|
||||||
])
|
])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,5 +4,13 @@ import com.jessebrault.ssg.part.Part
|
|||||||
import com.jessebrault.ssg.text.FrontMatter
|
import com.jessebrault.ssg.text.FrontMatter
|
||||||
|
|
||||||
interface TemplateRenderer {
|
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
|
||||||
|
)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -7,10 +7,11 @@ import groovy.transform.TupleConstructor
|
|||||||
class EmbeddableText {
|
class EmbeddableText {
|
||||||
|
|
||||||
private final Text text
|
private final Text text
|
||||||
|
private final Map globals
|
||||||
|
|
||||||
@Memoized
|
@Memoized
|
||||||
String render() {
|
String render() {
|
||||||
this.text.type.renderer.render(this.text.text)
|
this.text.type.renderer.render(this.text.text, globals)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Memoized
|
@Memoized
|
||||||
|
@ -8,9 +8,9 @@ class EmbeddableTextsCollection {
|
|||||||
@Delegate
|
@Delegate
|
||||||
private final Collection<EmbeddableText> embeddableTexts = []
|
private final Collection<EmbeddableText> embeddableTexts = []
|
||||||
|
|
||||||
EmbeddableTextsCollection(Collection<Text> texts) {
|
EmbeddableTextsCollection(Collection<Text> texts, Map globals) {
|
||||||
Objects.requireNonNull(texts).each {
|
Objects.requireNonNull(texts).each {
|
||||||
this << new EmbeddableText(it)
|
this << new EmbeddableText(it, globals)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,7 +12,7 @@ class MarkdownTextRenderer implements TextRenderer {
|
|||||||
private static final HtmlRenderer htmlRenderer = HtmlRenderer.builder().build()
|
private static final HtmlRenderer htmlRenderer = HtmlRenderer.builder().build()
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
String render(String text) {
|
String render(String text, Map globals) {
|
||||||
htmlRenderer.render(parser.parse(text))
|
htmlRenderer.render(parser.parse(text))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,13 @@
|
|||||||
package com.jessebrault.ssg.text
|
package com.jessebrault.ssg.text
|
||||||
|
|
||||||
interface TextRenderer {
|
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)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -60,7 +60,7 @@ class StaticSiteGeneratorTests {
|
|||||||
new File(this.templatesDir, 'test.gsp').write('<%= text %>')
|
new File(this.templatesDir, 'test.gsp').write('<%= text %>')
|
||||||
|
|
||||||
def buildDir = File.createTempDir()
|
def buildDir = File.createTempDir()
|
||||||
this.ssg.generate(buildDir)
|
this.ssg.generate(buildDir, [:])
|
||||||
|
|
||||||
def outFile = new File(buildDir, 'test.html')
|
def outFile = new File(buildDir, 'test.html')
|
||||||
assertTrue(outFile.exists())
|
assertTrue(outFile.exists())
|
||||||
@ -78,7 +78,7 @@ class StaticSiteGeneratorTests {
|
|||||||
new File(this.templatesDir, 'nested.gsp').write('<%= text %>')
|
new File(this.templatesDir, 'nested.gsp').write('<%= text %>')
|
||||||
|
|
||||||
def buildDir = File.createTempDir()
|
def buildDir = File.createTempDir()
|
||||||
this.ssg.generate(buildDir)
|
this.ssg.generate(buildDir, [:])
|
||||||
|
|
||||||
def outFile = new File(new File(buildDir, 'nested'), 'nested.html')
|
def outFile = new File(new File(buildDir, 'nested'), 'nested.html')
|
||||||
assertTrue(outFile.exists())
|
assertTrue(outFile.exists())
|
||||||
@ -92,7 +92,7 @@ class StaticSiteGeneratorTests {
|
|||||||
new FileTreeBuilder(this.textsDir).file('test.md', '---\ntemplate: template.gsp\n---\nHello, World!')
|
new FileTreeBuilder(this.textsDir).file('test.md', '---\ntemplate: template.gsp\n---\nHello, World!')
|
||||||
|
|
||||||
def buildDir = File.createTempDir()
|
def buildDir = File.createTempDir()
|
||||||
this.ssg.generate(buildDir)
|
this.ssg.generate(buildDir, [:])
|
||||||
|
|
||||||
def outFile = new File(buildDir, 'special.html')
|
def outFile = new File(buildDir, 'special.html')
|
||||||
assertTrue(outFile.exists())
|
assertTrue(outFile.exists())
|
||||||
|
@ -24,7 +24,7 @@ class GspTemplateRendererTests {
|
|||||||
new PartType(['.gsp'], new GspPartRenderer()),
|
new PartType(['.gsp'], new GspPartRenderer()),
|
||||||
'Hello, $person!'
|
'Hello, $person!'
|
||||||
)
|
)
|
||||||
def r = this.renderer.render(template, new FrontMatter([:]), '', [part])
|
def r = this.renderer.render(template, new FrontMatter([:]), '', [part], [:])
|
||||||
assertEquals('Hello, World!', r)
|
assertEquals('Hello, World!', r)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -35,7 +35,7 @@ class GspTemplateRendererTests {
|
|||||||
null,
|
null,
|
||||||
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)
|
assertEquals('Hello!', r)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user