Skip to content

SweetLine 高亮

io.github.lumkit:sweetline-compose 封装 SweetLine,通过 DecorationProvider 写进编辑器。这是可选模块;editor 本身没有词法器。

每个 SweetLineHighlight 实例只能 bind 一次。编辑器离开组合时调用 close()(或放在 DisposableEffect 里)。

kotlin
implementation("io.github.lumkit:sweeteditor-compose:0.1.4")
implementation("io.github.lumkit:sweetline-compose:0.1.4")
kotlin
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.remember
import io.github.lumkit.sweeteditor.highlight.HighlightDocumentDescriptor
import io.github.lumkit.sweeteditor.highlight.HighlightFeatureFlags
import io.github.lumkit.sweeteditor.highlight.HighlightTheme
import io.github.lumkit.sweeteditor.highlight.SweetLineHighlight
import io.github.lumkit.sweeteditor.highlight.SweetLineHighlightConfig

val highlight = remember {
    SweetLineHighlight(
        SweetLineHighlightConfig(
            document = HighlightDocumentDescriptor(fileName = "Main.kt"),
            features = HighlightFeatureFlags(
                syntaxHighlight = true,
                indentGuides = false,
                bracketGuides = false,
                matchedBrackets = false,
                rainbowBrackets = false,
            ),
        ),
    )
}

DisposableEffect(controller, highlight) {
    val binding = highlight.bind(controller)
    onDispose { binding.close() }
}

语言由 fileName 后缀、languageIdsyntaxName 决定。绑定之后可用 updateDocumentupdateThemeHighlightTheme.dark() / light())、updateFeatures,或 registerSyntaxJson 追加语法(例如 Lua)。

内置语法

库的 composeResources 带 18 份 JSON:Kotlin、Java、JavaScript、TypeScript、Python、JSON、XML、HTML、Markdown、C、C++、Rust、Go、TOML、YAML、Shell、Properties、Gradle。

Web 的 C ABI 从库自己的 composeResources 加载,宿主不必改 index.html,也不必拷 wasm。

Android R8 keep 规则在 KMP AAR 和 JNI AAR 里。iOS 静态库 libsweetline.a 已带 LC_LINKER_OPTION -liconv,Xcode 不用再写。

手写 span 见 语法高亮