Added ExcerptGetter and fixed potential FrontMatter bug.

This commit is contained in:
JesseBrault0709 2023-01-12 19:52:15 -06:00
parent 61669966d5
commit 480c794047
9 changed files with 125 additions and 6 deletions

View File

@ -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())

View File

@ -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
}

View File

@ -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)
}

View File

@ -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], '')
}
}
}

View File

@ -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 })"
}
}

View File

@ -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())

View File

@ -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)

View File

@ -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)
}
}

View File

@ -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