Colour markdown, which is the one language that is not tokens
The token scanner asks what a character is; markdown's meaning is where it sits, so a `#` opens a heading at the start of a line and is an ordinary character three words in. `MarkdownSyntax.kt` reads structure a line at a time and then each line's prose left to right, and `spansOf` is the one entry point that hides which of the two scanners a language got. Conservative wherever a guess would be invisible: emphasis needs a closer on the same line with no space beside either marker, so the `*p = *q` of a C fragment opens nothing; an underscore may not start or end inside a word; and an indented code block is left plain, since four spaces after a blank line and four after a bullet are the same line. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
a401e6a7e3
commit
68c5180260
8 files changed
+476
-12
No files matched your search
@@ -73,8 +73,7 @@ private constructor(
|
||||
DebugStats.timed("file scanned and cut into lines") {
|
||||
val body = text.removeSuffix("\n")
|
||||
val lines = body.split('\n')
|
||||
val rules = language?.let { rulesOf(it) }
|
||||
val scanned = if (rules == null) emptyList() else scan(body, rules)
|
||||
val scanned = if (language == null) emptyList() else spansOf(body, language)
|
||||
FileLines(lines, bucket(lines, scanned), lines.maxOf(::columnsOf))
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user