Added ExcerptGetter and fixed potential FrontMatter bug.
This commit is contained in:
parent
61669966d5
commit
480c794047
@ -11,6 +11,7 @@ import com.jessebrault.ssg.specialpage.SpecialPageType
|
|||||||
import com.jessebrault.ssg.template.GspTemplateRenderer
|
import com.jessebrault.ssg.template.GspTemplateRenderer
|
||||||
import com.jessebrault.ssg.template.TemplateFileTemplatesProvider
|
import com.jessebrault.ssg.template.TemplateFileTemplatesProvider
|
||||||
import com.jessebrault.ssg.template.TemplateType
|
import com.jessebrault.ssg.template.TemplateType
|
||||||
|
import com.jessebrault.ssg.text.MarkdownExcerptGetter
|
||||||
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.TextFileTextsProvider
|
import com.jessebrault.ssg.text.TextFileTextsProvider
|
||||||
@ -85,7 +86,7 @@ class StaticSiteGeneratorCli implements Callable<Integer> {
|
|||||||
context.updateLoggers()
|
context.updateLoggers()
|
||||||
|
|
||||||
// Configure
|
// Configure
|
||||||
def markdownText = new TextType(['.md'], new MarkdownTextRenderer(), new MarkdownFrontMatterGetter())
|
def markdownText = new TextType(['.md'], new MarkdownTextRenderer(), new MarkdownFrontMatterGetter(), new MarkdownExcerptGetter())
|
||||||
def gspTemplate = new TemplateType(['.gsp'], new GspTemplateRenderer())
|
def gspTemplate = new TemplateType(['.gsp'], new GspTemplateRenderer())
|
||||||
def gspPart = new PartType(['.gsp'], new GspPartRenderer())
|
def gspPart = new PartType(['.gsp'], new GspPartRenderer())
|
||||||
def gspSpecialPage = new SpecialPageType(['.gsp'], new GspSpecialPageRenderer())
|
def gspSpecialPage = new SpecialPageType(['.gsp'], new GspSpecialPageRenderer())
|
||||||
|
@ -30,7 +30,18 @@ class EmbeddableText {
|
|||||||
def result = this.text.type.frontMatterGetter.get(this.text)
|
def result = this.text.type.frontMatterGetter.get(this.text)
|
||||||
if (result.v1.size() > 0) {
|
if (result.v1.size() > 0) {
|
||||||
this.onDiagnostics.call(result.v1)
|
this.onDiagnostics.call(result.v1)
|
||||||
new FrontMatter([:])
|
new FrontMatter(this.text, [:])
|
||||||
|
} else {
|
||||||
|
result.v2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Memoized
|
||||||
|
String getExcerpt(int limit) {
|
||||||
|
def result = this.text.type.excerptGetter.getExcerpt(this.text, limit)
|
||||||
|
if (result.v1.size() > 0) {
|
||||||
|
this.onDiagnostics.call(result.v1)
|
||||||
|
''
|
||||||
} else {
|
} else {
|
||||||
result.v2
|
result.v2
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,7 @@
|
|||||||
|
package com.jessebrault.ssg.text
|
||||||
|
|
||||||
|
import com.jessebrault.ssg.Diagnostic
|
||||||
|
|
||||||
|
interface ExcerptGetter {
|
||||||
|
Tuple2<Collection<Diagnostic>, String> getExcerpt(Text text, int limit)
|
||||||
|
}
|
@ -0,0 +1,54 @@
|
|||||||
|
package com.jessebrault.ssg.text
|
||||||
|
|
||||||
|
import com.jessebrault.ssg.Diagnostic
|
||||||
|
import org.commonmark.ext.front.matter.YamlFrontMatterExtension
|
||||||
|
import org.commonmark.node.AbstractVisitor
|
||||||
|
import org.commonmark.parser.Parser
|
||||||
|
|
||||||
|
class MarkdownExcerptGetter implements ExcerptGetter {
|
||||||
|
|
||||||
|
private static class ExcerptVisitor extends AbstractVisitor {
|
||||||
|
|
||||||
|
final int limit
|
||||||
|
List<String> words = []
|
||||||
|
|
||||||
|
ExcerptVisitor(int limit) {
|
||||||
|
this.limit = limit
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
void visit(org.commonmark.node.Text text) {
|
||||||
|
if (this.words.size() <= limit) {
|
||||||
|
def textWords = text.literal.split('\\s+').toList()
|
||||||
|
def taken = textWords.take(this.limit - this.words.size())
|
||||||
|
this.words.addAll(taken)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String getResult() {
|
||||||
|
this.words.take(this.limit).join(' ')
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final Parser parser = Parser.builder()
|
||||||
|
.extensions([YamlFrontMatterExtension.create()])
|
||||||
|
.build()
|
||||||
|
|
||||||
|
@Override
|
||||||
|
Tuple2<Collection<Diagnostic>, String> getExcerpt(Text text, int limit) {
|
||||||
|
try {
|
||||||
|
def node = parser.parse(text.text)
|
||||||
|
def visitor = new ExcerptVisitor(limit)
|
||||||
|
node.accept(visitor)
|
||||||
|
new Tuple2<>([], visitor.result)
|
||||||
|
} catch (Exception e) {
|
||||||
|
def diagnostic = new Diagnostic(
|
||||||
|
"There was an exception while getting the excerpt for ${ text }:\n${ e }",
|
||||||
|
e
|
||||||
|
)
|
||||||
|
new Tuple2<>([diagnostic], '')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -12,10 +12,11 @@ class TextType {
|
|||||||
Collection<String> ids
|
Collection<String> ids
|
||||||
TextRenderer renderer
|
TextRenderer renderer
|
||||||
FrontMatterGetter frontMatterGetter
|
FrontMatterGetter frontMatterGetter
|
||||||
|
ExcerptGetter excerptGetter
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
String toString() {
|
String toString() {
|
||||||
"TextType(ids: ${ this.ids }, renderer: ${ this.renderer }, frontMatterGetter: ${ this.renderer })"
|
"TextType(ids: ${ this.ids }, renderer: ${ this.renderer }, frontMatterGetter: ${ this.renderer }, excerptGetter: ${ this.excerptGetter })"
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -9,6 +9,7 @@ import com.jessebrault.ssg.specialpage.SpecialPageType
|
|||||||
import com.jessebrault.ssg.template.GspTemplateRenderer
|
import com.jessebrault.ssg.template.GspTemplateRenderer
|
||||||
import com.jessebrault.ssg.template.TemplateFileTemplatesProvider
|
import com.jessebrault.ssg.template.TemplateFileTemplatesProvider
|
||||||
import com.jessebrault.ssg.template.TemplateType
|
import com.jessebrault.ssg.template.TemplateType
|
||||||
|
import com.jessebrault.ssg.text.MarkdownExcerptGetter
|
||||||
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.TextFileTextsProvider
|
import com.jessebrault.ssg.text.TextFileTextsProvider
|
||||||
@ -35,7 +36,7 @@ class SimpleStaticSiteGeneratorIntegrationTests {
|
|||||||
this.partsDir = File.createTempDir()
|
this.partsDir = File.createTempDir()
|
||||||
this.specialPagesDir = File.createTempDir()
|
this.specialPagesDir = File.createTempDir()
|
||||||
|
|
||||||
def markdownTextType = new TextType(['.md'], new MarkdownTextRenderer(), new MarkdownFrontMatterGetter())
|
def markdownTextType = new TextType(['.md'], new MarkdownTextRenderer(), new MarkdownFrontMatterGetter(), new MarkdownExcerptGetter())
|
||||||
def gspTemplateType = new TemplateType(['.gsp'], new GspTemplateRenderer())
|
def gspTemplateType = new TemplateType(['.gsp'], new GspTemplateRenderer())
|
||||||
def gspPartType = new PartType(['.gsp'], new GspPartRenderer())
|
def gspPartType = new PartType(['.gsp'], new GspPartRenderer())
|
||||||
def gspSpecialPageType = new SpecialPageType(['.gsp'], new GspSpecialPageRenderer())
|
def gspSpecialPageType = new SpecialPageType(['.gsp'], new GspSpecialPageRenderer())
|
||||||
|
@ -4,6 +4,7 @@ import com.jessebrault.ssg.part.Part
|
|||||||
import com.jessebrault.ssg.part.PartRenderer
|
import com.jessebrault.ssg.part.PartRenderer
|
||||||
import com.jessebrault.ssg.part.PartType
|
import com.jessebrault.ssg.part.PartType
|
||||||
import com.jessebrault.ssg.text.FrontMatterGetter
|
import com.jessebrault.ssg.text.FrontMatterGetter
|
||||||
|
import com.jessebrault.ssg.text.MarkdownExcerptGetter
|
||||||
import com.jessebrault.ssg.text.Text
|
import com.jessebrault.ssg.text.Text
|
||||||
import com.jessebrault.ssg.text.TextRenderer
|
import com.jessebrault.ssg.text.TextRenderer
|
||||||
import com.jessebrault.ssg.text.TextType
|
import com.jessebrault.ssg.text.TextType
|
||||||
@ -59,7 +60,7 @@ class GspSpecialPageRendererTests {
|
|||||||
@Test
|
@Test
|
||||||
void rendersText(@Mock TextRenderer textRenderer, @Mock FrontMatterGetter frontMatterGetter) {
|
void rendersText(@Mock TextRenderer textRenderer, @Mock FrontMatterGetter frontMatterGetter) {
|
||||||
when(textRenderer.render(any(), any())).thenReturn(new Tuple2<>([], '<p><strong>Hello, World!</strong></p>\n'))
|
when(textRenderer.render(any(), any())).thenReturn(new Tuple2<>([], '<p><strong>Hello, World!</strong></p>\n'))
|
||||||
def textType = new TextType([], textRenderer, frontMatterGetter)
|
def textType = new TextType([], textRenderer, frontMatterGetter, new MarkdownExcerptGetter())
|
||||||
def text = new Text('', 'test', textType)
|
def text = new Text('', 'test', textType)
|
||||||
|
|
||||||
def specialPage = new SpecialPage("<%= texts.find { it.path == 'test' }.render() %>", null, null)
|
def specialPage = new SpecialPage("<%= texts.find { it.path == 'test' }.render() %>", null, null)
|
||||||
|
@ -0,0 +1,43 @@
|
|||||||
|
package com.jessebrault.ssg.text
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals
|
||||||
|
|
||||||
|
class ExcerptGetterTests {
|
||||||
|
|
||||||
|
ExcerptGetter excerptGetter = new MarkdownExcerptGetter()
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void takesAllIfTextLessThanLimit() {
|
||||||
|
def text = new Text('One Two Three Four Five', null, null)
|
||||||
|
def result = this.excerptGetter.getExcerpt(text, 10)
|
||||||
|
assertEquals(0, result.v1.size())
|
||||||
|
assertEquals('One Two Three Four Five', result.v2)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void takesTheLimit() {
|
||||||
|
def text = new Text('One Two Three Four Five', null, null)
|
||||||
|
def result = this.excerptGetter.getExcerpt(text, 2)
|
||||||
|
assertEquals(0, result.v1.size())
|
||||||
|
assertEquals('One Two', result.v2)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void worksWithHeading() {
|
||||||
|
def text = new Text('# Heading\nOne Two Three', null, null)
|
||||||
|
def result = this.excerptGetter.getExcerpt(text, 1)
|
||||||
|
assertEquals(0, result.v1.size())
|
||||||
|
assertEquals('Heading', result.v2)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void worksWithFrontMatter() {
|
||||||
|
def text = new Text('---\ntest: hello\n---\nOne Two Three', null, null)
|
||||||
|
def result = this.excerptGetter.getExcerpt(text, 1)
|
||||||
|
assertEquals(0, result.v1.size())
|
||||||
|
assertEquals('One', result.v2)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -7,7 +7,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals
|
|||||||
|
|
||||||
class TextFileTextsProviderTests {
|
class TextFileTextsProviderTests {
|
||||||
|
|
||||||
private static final TextType markdownType = new TextType(['.md'], null, null)
|
private static final TextType markdownType = new TextType(['.md'], null, null, null)
|
||||||
|
|
||||||
private File textsDir
|
private File textsDir
|
||||||
private TextsProvider textsProvider
|
private TextsProvider textsProvider
|
||||||
|
Loading…
Reference in New Issue
Block a user