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.TemplateFileTemplatesProvider
|
||||
import com.jessebrault.ssg.template.TemplateType
|
||||
import com.jessebrault.ssg.text.MarkdownExcerptGetter
|
||||
import com.jessebrault.ssg.text.MarkdownFrontMatterGetter
|
||||
import com.jessebrault.ssg.text.MarkdownTextRenderer
|
||||
import com.jessebrault.ssg.text.TextFileTextsProvider
|
||||
@ -85,7 +86,7 @@ class StaticSiteGeneratorCli implements Callable<Integer> {
|
||||
context.updateLoggers()
|
||||
|
||||
// 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 gspPart = new PartType(['.gsp'], new GspPartRenderer())
|
||||
def gspSpecialPage = new SpecialPageType(['.gsp'], new GspSpecialPageRenderer())
|
||||
|
@ -30,7 +30,18 @@ class EmbeddableText {
|
||||
def result = this.text.type.frontMatterGetter.get(this.text)
|
||||
if (result.v1.size() > 0) {
|
||||
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 {
|
||||
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
|
||||
TextRenderer renderer
|
||||
FrontMatterGetter frontMatterGetter
|
||||
ExcerptGetter excerptGetter
|
||||
|
||||
@Override
|
||||
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.TemplateFileTemplatesProvider
|
||||
import com.jessebrault.ssg.template.TemplateType
|
||||
import com.jessebrault.ssg.text.MarkdownExcerptGetter
|
||||
import com.jessebrault.ssg.text.MarkdownFrontMatterGetter
|
||||
import com.jessebrault.ssg.text.MarkdownTextRenderer
|
||||
import com.jessebrault.ssg.text.TextFileTextsProvider
|
||||
@ -35,7 +36,7 @@ class SimpleStaticSiteGeneratorIntegrationTests {
|
||||
this.partsDir = 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 gspPartType = new PartType(['.gsp'], new GspPartRenderer())
|
||||
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.PartType
|
||||
import com.jessebrault.ssg.text.FrontMatterGetter
|
||||
import com.jessebrault.ssg.text.MarkdownExcerptGetter
|
||||
import com.jessebrault.ssg.text.Text
|
||||
import com.jessebrault.ssg.text.TextRenderer
|
||||
import com.jessebrault.ssg.text.TextType
|
||||
@ -59,7 +60,7 @@ class GspSpecialPageRendererTests {
|
||||
@Test
|
||||
void rendersText(@Mock TextRenderer textRenderer, @Mock FrontMatterGetter frontMatterGetter) {
|
||||
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 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 {
|
||||
|
||||
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 TextsProvider textsProvider
|
||||
|
Loading…
Reference in New Issue
Block a user