summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinnea Gräf <nea@nea.moe>2024-03-24 15:24:05 +0100
committerLinnea Gräf <nea@nea.moe>2024-03-24 15:24:05 +0100
commitbe66c61d729fe642e3dd3ed2214990f9f2273c5e (patch)
tree9a360bc61aaedd6b69518914b1c76ed0cd512ea3
parentc57016dc5a1f502b637c2f77bcf724165387ef83 (diff)
downloadblog-infra-be66c61d729fe642e3dd3ed2214990f9f2273c5e.tar.gz
blog-infra-be66c61d729fe642e3dd3ed2214990f9f2273c5e.tar.bz2
blog-infra-be66c61d729fe642e3dd3ed2214990f9f2273c5e.zip
Fix whitespace trimming
-rw-r--r--src/main/kotlin/moe/nea/blog/md/BlogPost.kt2
-rw-r--r--src/main/kotlin/moe/nea/blog/md/ItalicsParser.kt8
-rw-r--r--src/main/kotlin/moe/nea/blog/md/MarkdownParser.kt34
3 files changed, 36 insertions, 8 deletions
diff --git a/src/main/kotlin/moe/nea/blog/md/BlogPost.kt b/src/main/kotlin/moe/nea/blog/md/BlogPost.kt
index 25ec13f..8343b85 100644
--- a/src/main/kotlin/moe/nea/blog/md/BlogPost.kt
+++ b/src/main/kotlin/moe/nea/blog/md/BlogPost.kt
@@ -8,4 +8,4 @@ fun main() {
parser.addDefaultParsers()
val doc = parser.readDocument()
doc.debugFormat(System.out)
-} \ No newline at end of file
+}
diff --git a/src/main/kotlin/moe/nea/blog/md/ItalicsParser.kt b/src/main/kotlin/moe/nea/blog/md/ItalicsParser.kt
index afecf79..30b5c38 100644
--- a/src/main/kotlin/moe/nea/blog/md/ItalicsParser.kt
+++ b/src/main/kotlin/moe/nea/blog/md/ItalicsParser.kt
@@ -23,7 +23,7 @@ object ItalicsParser : InlineParser {
val firstSequence = mutableListOf<MarkdownFormat>()
var remainingText = text.substring(firstStarCount)
var lastToken: MarkdownFormat = Begin() // TODO: dedicated begin token
- while (true) {
+ while (remainingText.isNotEmpty()) {
val (element, next) = parser.parseInlineTextOnce(lastToken, remainingText)
remainingText = next
lastToken = element
@@ -42,7 +42,7 @@ object ItalicsParser : InlineParser {
if (secondStarCount < 1) error("Invalid italics/bold sequence")
remainingText = remainingText.substring(secondStarCount)
- var firstElement = parser.collapseInlineFormat(firstSequence)
+ var firstElement = parser.collapseInlineFormat(firstSequence, false)
if (secondStarCount == 2)
firstElement = Bold(firstElement)
if (secondStarCount == 1)
@@ -57,7 +57,7 @@ object ItalicsParser : InlineParser {
val secondSequence = mutableListOf<MarkdownFormat>()
lastToken = Begin()
- while (true) {
+ while (remainingText.isNotEmpty()) {
val (element, next) = parser.parseInlineTextOnce(lastToken, remainingText)
remainingText = next
lastToken = element
@@ -79,7 +79,7 @@ object ItalicsParser : InlineParser {
if (thirdStarCount != firstStarCount - secondStarCount) {
error("Invalid italics/bold sequence")
}
- var secondElement = parser.collapseInlineFormat(secondSequence)
+ var secondElement = parser.collapseInlineFormat(secondSequence, false)
var combined: MarkdownFormat = FormatSequence(firstElement, secondElement)
if (thirdStarCount == 1)
combined = Italics(combined)
diff --git a/src/main/kotlin/moe/nea/blog/md/MarkdownParser.kt b/src/main/kotlin/moe/nea/blog/md/MarkdownParser.kt
index 86b92d2..f8095ad 100644
--- a/src/main/kotlin/moe/nea/blog/md/MarkdownParser.kt
+++ b/src/main/kotlin/moe/nea/blog/md/MarkdownParser.kt
@@ -71,11 +71,39 @@ class MarkdownParser(source: String) {
lastToken = tok
remaining = next
}
- return collapseInlineFormat(seq)
+ return collapseInlineFormat(seq, true)
}
- fun collapseInlineFormat(sequence: List<MarkdownFormat>): MarkdownFormat {
- return FormatSequence(sequence)
+ private fun expandMarkdownFormats(sequence: List<MarkdownFormat>): List<MarkdownFormat> {
+ val elongated = mutableListOf<MarkdownFormat>()
+ for (markdownFormat in sequence) {
+ if (markdownFormat is FormatSequence) {
+ elongated.addAll(expandMarkdownFormats(markdownFormat.list))
+ } else {
+ elongated.add(markdownFormat)
+ }
+ }
+ return elongated
+ }
+
+ private fun collapseMarkdownFormats(
+ sequence: List<MarkdownFormat>,
+ trimWhitespace: Boolean
+ ): MutableList<MarkdownFormat> {
+ val shortened = mutableListOf<MarkdownFormat>()
+ var last: MarkdownFormat = if (trimWhitespace) Whitespace() else Begin()
+ for (format in sequence) {
+ if (format is Whitespace && last is Whitespace) {
+ continue
+ }
+ last = format
+ shortened.add(format)
+ }
+ return shortened
+ }
+
+ fun collapseInlineFormat(sequence: List<MarkdownFormat>, trimWhitespace: Boolean): MarkdownFormat {
+ return FormatSequence(collapseMarkdownFormats(expandMarkdownFormats(sequence), trimWhitespace))
}
fun readDocument(): Document {