From c0c9211b82ed127d59433a53dd73cb775d1591b7 Mon Sep 17 00:00:00 2001 From: OneWay Date: Mon, 21 Sep 2026 10:27:34 +0800 Subject: [PATCH] fix(dsl): render each margin on its own line Each [m] block occupies its own line in the article. Blank paragraphs and whitespace-only lines are dropped. --- .../research/ui/article/DslAnnotatedParser.kt | 26 ++++++++++++++----- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/example/research/ui/article/DslAnnotatedParser.kt b/app/src/main/java/com/example/research/ui/article/DslAnnotatedParser.kt index 7f61c77..af7d0ca 100644 --- a/app/src/main/java/com/example/research/ui/article/DslAnnotatedParser.kt +++ b/app/src/main/java/com/example/research/ui/article/DslAnnotatedParser.kt @@ -91,6 +91,7 @@ object DslAnnotatedParser { var accentNext = false var currentIndent = 0 var mClosedPendingBreak = false + var lastAppended: Char? = null val exampleStyle = SpanStyle(color = colorScheme.secondaryText) val labelStyle = SpanStyle(color = colorScheme.labelText) val linkStyle = SpanStyle(color = colorScheme.linkText, textDecoration = TextDecoration.Underline) @@ -108,20 +109,23 @@ object DslAnnotatedParser { } fun flushBlock() { - if (builder.length > 0) { + val text = builder.toAnnotatedString() + if (text.any { !it.isWhitespace() }) { result.add(DslBlock( - text = builder.toAnnotatedString(), + text = text, indent = currentIndent, lazyRefs = lazyRefs.toList() )) - builder = AnnotatedString.Builder() - stack.forEach { builder.pushStyle(it) } - lazyRefs.clear() } + builder = AnnotatedString.Builder() + stack.forEach { builder.pushStyle(it) } + lazyRefs.clear() + lastAppended = null mClosedPendingBreak = false } fun appendChar(char: Char) { + lastAppended = char if (mClosedPendingBreak) { mClosedPendingBreak = false if (refStack.isEmpty() && !char.isWhitespace()) { @@ -209,8 +213,8 @@ object DslAnnotatedParser { } "b" -> push(SpanStyle(fontWeight = FontWeight.Bold)) "m", "m0", "m1", "m2", "m3", "m4", "m5" -> { - if (builder.length > 0) { - if (refStack.isEmpty()) flushBlock() else builder.append("\n") + if (lastAppended != null && !lastAppended!!.isWhitespace()) { + flushBlock() } currentIndent = marginIndent(tagName) push(exampleStyle) @@ -243,6 +247,14 @@ object DslAnnotatedParser { appendChar(char) i++ } + '\n' -> { + if (refStack.isEmpty()) { + flushBlock() + } else { + appendChar(char) + } + i++ + } else -> { appendChar(char)