@@ -13,24 +13,28 @@ import androidx.compose.foundation.verticalScroll
1313import androidx.compose.runtime.Composable
1414import androidx.compose.runtime.LaunchedEffect
1515import androidx.compose.runtime.getValue
16+ import androidx.compose.runtime.remember
1617import androidx.compose.runtime.setValue
1718import androidx.compose.ui.Alignment
1819import androidx.compose.ui.Modifier
1920import androidx.compose.ui.graphics.SolidColor
21+ import androidx.compose.ui.text.AnnotatedString
2022import androidx.compose.ui.text.TextStyle
2123import androidx.compose.ui.text.input.OffsetMapping
2224import androidx.compose.ui.text.input.TransformedText
2325import androidx.compose.ui.text.style.TextAlign
2426import androidx.compose.ui.unit.dp
27+ import dev.snipme.highlights.DefaultHighlightsResultListener
2528import dev.snipme.highlights.Highlights
29+ import dev.snipme.highlights.model.CodeHighlight
2630import dev.snipme.highlights.model.SyntaxLanguage
2731import dev.snipme.highlights.model.SyntaxThemes
2832import io.github.composegears.valkyrie.jewel.VerticalDivider
2933import io.github.composegears.valkyrie.jewel.tooling.PreviewTheme
3034import io.github.composegears.valkyrie.sdk.compose.foundation.layout.Spacer
3135import io.github.composegears.valkyrie.sdk.compose.foundation.rememberMutableIntState
3236import io.github.composegears.valkyrie.sdk.compose.foundation.rememberMutableState
33- import io.github.composegears.valkyrie.sdk.compose.highlights.core.buildAnnotatedString
37+ import io.github.composegears.valkyrie.sdk.compose.highlights.core.generateAnnotatedString
3438import org.jetbrains.compose.ui.tooling.preview.Preview
3539import org.jetbrains.jewel.foundation.theme.JewelTheme
3640import org.jetbrains.jewel.ui.component.HorizontalScrollbar
@@ -54,6 +58,27 @@ fun CodeEditor(
5458
5559 val isDark = JewelTheme .isDark
5660
61+ val highlights = remember(syntaxLanguage, isDark) {
62+ Highlights .Builder ()
63+ .language(syntaxLanguage)
64+ .theme(SyntaxThemes .darcula(darkMode = isDark))
65+ .build()
66+ }
67+
68+ var transformText by rememberMutableState { AnnotatedString (text) }
69+ var highlightedText by rememberMutableState { AnnotatedString (text) }
70+
71+ LaunchedEffect (transformText) {
72+ highlights.getBuilder()
73+ .code(transformText.text)
74+ .build()
75+ .getHighlightsAsync(object : DefaultHighlightsResultListener () {
76+ override fun onSuccess (result : List <CodeHighlight >) {
77+ highlightedText = result.generateAnnotatedString(text)
78+ }
79+ })
80+ }
81+
5782 val linesCount by rememberMutableIntState(text) { text.count { it == ' \n ' } + 1 }
5883
5984 LaunchedEffect (linesTextScroll.value) {
@@ -91,17 +116,19 @@ fun CodeEditor(
91116 value = text,
92117 onValueChange = { onValueChange(it.updateTabs(translateTabToSpaces)) },
93118 visualTransformation = { text ->
94- val code = Highlights .Builder ()
95- .code(text.text)
96- .language(syntaxLanguage)
97- .theme(SyntaxThemes .darcula(darkMode = isDark))
98- .build()
99- .buildAnnotatedString()
100-
101- TransformedText (
102- text = code,
103- offsetMapping = OffsetMapping .Identity ,
104- )
119+ if (transformText != text) {
120+ transformText = text
121+
122+ TransformedText (
123+ text = text,
124+ offsetMapping = OffsetMapping .Identity ,
125+ )
126+ }else {
127+ TransformedText (
128+ text = highlightedText,
129+ offsetMapping = OffsetMapping .Identity ,
130+ )
131+ }
105132 },
106133 cursorBrush = SolidColor (JewelTheme .textFieldStyle.colors.caret),
107134 textStyle = textStyle,
0 commit comments