Skip to content

Commit 69af671

Browse files
committed
Migrated to LinkAnnotation design
This change removes linkClickHandlers. Now `Format.Link` accepts its own handler. If left null, LocalUriHandler is used instead.
1 parent 88617e9 commit 69af671

13 files changed

Lines changed: 221 additions & 188 deletions

File tree

android-sample/src/main/java/com/zachklipp/richtext/sample/LazyMarkdownSample.kt

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import androidx.compose.material3.Text
1818
import androidx.compose.material3.darkColorScheme
1919
import androidx.compose.material3.lightColorScheme
2020
import androidx.compose.runtime.Composable
21+
import androidx.compose.runtime.CompositionLocalProvider
2122
import androidx.compose.runtime.LaunchedEffect
2223
import androidx.compose.runtime.getValue
2324
import androidx.compose.runtime.mutableStateOf
@@ -27,6 +28,8 @@ import androidx.compose.ui.Alignment
2728
import androidx.compose.ui.Modifier
2829
import androidx.compose.ui.platform.LocalContext
2930
import androidx.compose.ui.platform.LocalDensity
31+
import androidx.compose.ui.platform.LocalUriHandler
32+
import androidx.compose.ui.platform.UriHandler
3033
import androidx.compose.ui.tooling.preview.Preview
3134
import androidx.compose.ui.unit.dp
3235
import com.halilibo.richtext.commonmark.CommonMarkdownParseOptions
@@ -115,14 +118,13 @@ import com.halilibo.richtext.ui.resolveDefaults
115118
parser.parse(sampleMarkdown)
116119
}
117120

118-
RichText(
119-
style = richTextStyle,
120-
linkClickHandler = {
121-
Toast.makeText(context, it, Toast.LENGTH_SHORT).show()
122-
},
123-
modifier = Modifier.padding(8.dp),
124-
) {
125-
LazyMarkdown(astNode)
121+
ProvideToastUriHandler(context) {
122+
RichText(
123+
style = richTextStyle,
124+
modifier = Modifier.padding(8.dp),
125+
) {
126+
LazyMarkdown(astNode)
127+
}
126128
}
127129
}
128130
}

android-sample/src/main/java/com/zachklipp/richtext/sample/MarkdownSample.kt

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -133,14 +133,13 @@ import com.halilibo.richtext.ui.resolveDefaults
133133
parser.parse(sampleMarkdown)
134134
}
135135

136-
RichText(
137-
style = richTextStyle,
138-
linkClickHandler = {
139-
Toast.makeText(context, it, Toast.LENGTH_SHORT).show()
140-
},
141-
modifier = Modifier.padding(8.dp),
142-
) {
143-
BasicMarkdown(astNode, HeadingAstBlockNodeComposer)
136+
ProvideToastUriHandler(context) {
137+
RichText(
138+
style = richTextStyle,
139+
modifier = Modifier.padding(8.dp),
140+
) {
141+
BasicMarkdown(astNode, HeadingAstBlockNodeComposer)
142+
}
144143
}
145144
}
146145
}

android-sample/src/main/java/com/zachklipp/richtext/sample/TextDemo.kt

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.zachklipp.richtext.sample
22

3+
import android.content.Context
4+
import android.widget.Toast
35
import androidx.compose.animation.Animatable
46
import androidx.compose.animation.core.Animatable
57
import androidx.compose.animation.core.LinearEasing
@@ -14,6 +16,7 @@ import androidx.compose.foundation.layout.size
1416
import androidx.compose.foundation.layout.wrapContentSize
1517
import androidx.compose.material3.Text
1618
import androidx.compose.runtime.Composable
19+
import androidx.compose.runtime.CompositionLocalProvider
1720
import androidx.compose.runtime.LaunchedEffect
1821
import androidx.compose.runtime.getValue
1922
import androidx.compose.runtime.mutableStateOf
@@ -28,6 +31,8 @@ import androidx.compose.ui.graphics.StrokeCap.Companion.Round
2831
import androidx.compose.ui.graphics.drawscope.withTransform
2932
import androidx.compose.ui.graphics.graphicsLayer
3033
import androidx.compose.ui.platform.LocalContext
34+
import androidx.compose.ui.platform.LocalUriHandler
35+
import androidx.compose.ui.platform.UriHandler
3136
import androidx.compose.ui.text.TextStyle
3237
import androidx.compose.ui.tooling.preview.Preview
3338
import androidx.compose.ui.unit.dp
@@ -65,7 +70,7 @@ import kotlinx.coroutines.launch
6570
appendPreviewSentence(Superscript)
6671
appendPreviewSentence(Code)
6772
appendPreviewSentence(
68-
Link(""),
73+
Link("") { toggleLink = !toggleLink },
6974
if (toggleLink) "clicked link" else "link"
7075
)
7176
append("Here, ")
@@ -96,7 +101,7 @@ import kotlinx.coroutines.launch
96101
}
97102
}
98103
}
99-
RichText(linkClickHandler = { toggleLink = !toggleLink }) {
104+
RichText {
100105
Text(text)
101106
}
102107
}
@@ -213,3 +218,16 @@ private fun Builder.appendPreviewSentence(
213218
}
214219
append(" text. ")
215220
}
221+
222+
@Composable
223+
fun ProvideToastUriHandler(context: Context, content: @Composable () -> Unit) {
224+
val uriHandler = remember(context) {
225+
object : UriHandler {
226+
override fun openUri(uri: String) {
227+
Toast.makeText(context, uri, Toast.LENGTH_SHORT).show()
228+
}
229+
}
230+
}
231+
232+
CompositionLocalProvider(LocalUriHandler provides uriHandler, content)
233+
}

desktop-sample/src/main/kotlin/com/halilibo/richtext/desktop/MarkdownSampleApp.kt

Lines changed: 31 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ import androidx.compose.runtime.setValue
3434
import androidx.compose.ui.Modifier
3535
import androidx.compose.ui.graphics.Color
3636
import androidx.compose.ui.platform.LocalDensity
37+
import androidx.compose.ui.platform.LocalUriHandler
38+
import androidx.compose.ui.platform.UriHandler
3739
import androidx.compose.ui.unit.dp
3840
import androidx.compose.ui.unit.sp
3941
import androidx.compose.ui.window.singleWindowApplication
@@ -103,30 +105,26 @@ fun main(): Unit = singleWindowApplication(
103105
icon = { Icon(Icons.Default.Favorite, "") })
104106
}
105107
}
106-
if (selectedTab == 0) {
107-
RichText(
108-
modifier = Modifier.verticalScroll(rememberScrollState()),
109-
style = richTextStyle,
110-
linkClickHandler = {
111-
println("Link clicked destination=$it")
108+
ProvidePrintUriHandler {
109+
if (selectedTab == 0) {
110+
RichText(
111+
modifier = Modifier.verticalScroll(rememberScrollState()),
112+
style = richTextStyle,
113+
) {
114+
Markdown(content = text)
112115
}
113-
) {
114-
Markdown(content = text)
115-
}
116-
} else {
117-
val parser = remember { CommonmarkAstNodeParser() }
116+
} else {
117+
val parser = remember { CommonmarkAstNodeParser() }
118118

119-
val astNode = remember(parser) {
120-
parser.parse(sampleMarkdown)
121-
}
119+
val astNode = remember(parser) {
120+
parser.parse(sampleMarkdown)
121+
}
122122

123-
RichText(
124-
style = richTextStyle,
125-
linkClickHandler = {
126-
println("Link clicked destination=$it")
123+
RichText(
124+
style = richTextStyle,
125+
) {
126+
LazyMarkdown(astNode)
127127
}
128-
) {
129-
LazyMarkdown(astNode)
130128
}
131129
}
132130
}
@@ -242,6 +240,19 @@ fun RichTextStyleConfig(
242240
}
243241
}
244242

243+
@Composable
244+
fun ProvidePrintUriHandler(content: @Composable () -> Unit) {
245+
val uriHandler = remember {
246+
object : UriHandler {
247+
override fun openUri(uri: String) {
248+
println("Link clicked destination=$uri")
249+
}
250+
}
251+
}
252+
253+
CompositionLocalProvider(LocalUriHandler provides uriHandler, content)
254+
}
255+
245256
private val sampleMarkdown = """
246257
# Demo
247258
Based on [this cheatsheet][cheatsheet]

desktop-sample/src/main/kotlin/com/halilibo/richtext/desktop/RichTextSampleApp.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@ fun main(): Unit = singleWindowApplication(
229229
appendPreviewSentence(Superscript)
230230
appendPreviewSentence(Code)
231231
appendPreviewSentence(
232-
Link(""),
232+
Link("") { toggleLink = !toggleLink },
233233
if (toggleLink) "clicked link" else "link"
234234
)
235235
append("Here, ")
@@ -260,7 +260,7 @@ fun main(): Unit = singleWindowApplication(
260260
}
261261
}
262262
}
263-
RichText(linkClickHandler = { toggleLink = !toggleLink }) {
263+
RichText {
264264
Text(text)
265265
}
266266
}

richtext-ui-material/src/commonMain/kotlin/com/halilibo/richtext/ui/material/RichText.kt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import androidx.compose.runtime.CompositionLocalProvider
88
import androidx.compose.runtime.compositionLocalOf
99
import androidx.compose.ui.Modifier
1010
import com.halilibo.richtext.ui.BasicRichText
11-
import com.halilibo.richtext.ui.LinkClickHandler
1211
import com.halilibo.richtext.ui.RichTextScope
1312
import com.halilibo.richtext.ui.RichTextStyle
1413
import com.halilibo.richtext.ui.RichTextThemeProvider
@@ -24,14 +23,12 @@ import com.halilibo.richtext.ui.RichTextThemeProvider
2423
public fun RichText(
2524
modifier: Modifier = Modifier,
2625
style: RichTextStyle? = null,
27-
linkClickHandler: LinkClickHandler? = null,
2826
children: @Composable RichTextScope.() -> Unit
2927
) {
3028
RichTextMaterialTheme {
3129
BasicRichText(
3230
modifier = modifier,
3331
style = style,
34-
linkClickHandler = linkClickHandler,
3532
children = children
3633
)
3734
}

richtext-ui-material3/src/commonMain/kotlin/com/halilibo/richtext/ui/material3/RichText.kt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import androidx.compose.runtime.CompositionLocalProvider
88
import androidx.compose.runtime.compositionLocalOf
99
import androidx.compose.ui.Modifier
1010
import com.halilibo.richtext.ui.BasicRichText
11-
import com.halilibo.richtext.ui.LinkClickHandler
1211
import com.halilibo.richtext.ui.RichTextScope
1312
import com.halilibo.richtext.ui.RichTextStyle
1413
import com.halilibo.richtext.ui.RichTextThemeProvider
@@ -24,14 +23,12 @@ import com.halilibo.richtext.ui.RichTextThemeProvider
2423
public fun RichText(
2524
modifier: Modifier = Modifier,
2625
style: RichTextStyle? = null,
27-
linkClickHandler: LinkClickHandler? = null,
2826
children: @Composable RichTextScope.() -> Unit
2927
) {
3028
RichTextMaterialTheme {
3129
BasicRichText(
3230
modifier = modifier,
3331
style = style,
34-
linkClickHandler = linkClickHandler,
3532
children = children
3633
)
3734
}

richtext-ui/src/commonMain/kotlin/com/halilibo/richtext/ui/BasicRichText.kt

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ package com.halilibo.richtext.ui
55
import androidx.compose.foundation.layout.Arrangement.spacedBy
66
import androidx.compose.foundation.layout.Column
77
import androidx.compose.runtime.Composable
8-
import androidx.compose.runtime.CompositionLocalProvider
98
import androidx.compose.ui.Modifier
109
import androidx.compose.ui.platform.LocalDensity
1110

@@ -16,21 +15,18 @@ import androidx.compose.ui.platform.LocalDensity
1615
public fun BasicRichText(
1716
modifier: Modifier = Modifier,
1817
style: RichTextStyle? = null,
19-
linkClickHandler: LinkClickHandler? = null,
2018
children: @Composable RichTextScope.() -> Unit
2119
) {
2220
with(RichTextScope) {
2321
RestartListLevel {
2422
WithStyle(style) {
25-
CompositionLocalProvider(LocalLinkClickHandler provides linkClickHandler) {
26-
val resolvedStyle = currentRichTextStyle.resolveDefaults()
27-
val blockSpacing = with(LocalDensity.current) {
28-
resolvedStyle.paragraphSpacing!!.toDp()
29-
}
23+
val resolvedStyle = currentRichTextStyle.resolveDefaults()
24+
val blockSpacing = with(LocalDensity.current) {
25+
resolvedStyle.paragraphSpacing!!.toDp()
26+
}
3027

31-
Column(modifier = modifier, verticalArrangement = spacedBy(blockSpacing)) {
32-
children()
33-
}
28+
Column(modifier = modifier, verticalArrangement = spacedBy(blockSpacing)) {
29+
children()
3430
}
3531
}
3632
}

richtext-ui/src/commonMain/kotlin/com/halilibo/richtext/ui/FormattedList.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,6 @@ private val LocalListLevel = compositionLocalOf { 0 }
204204
val contentsIndent = with(density) { listStyle.contentsIndent!!.toDp() }
205205
val itemSpacing = with(density) { listStyle.itemSpacing!!.toDp() }
206206
val currentLevel = LocalListLevel.current
207-
val currentLinkClickHandler = LocalLinkClickHandler.current
208207

209208
PrefixListLayout(
210209
count = items.size,
@@ -219,7 +218,6 @@ private val LocalListLevel = compositionLocalOf { 0 }
219218
itemForIndex = { index ->
220219
BasicRichText(
221220
style = currentRichTextStyle.copy(paragraphSpacing = listStyle.itemSpacing),
222-
linkClickHandler = currentLinkClickHandler
223221
) {
224222
CompositionLocalProvider(LocalListLevel provides currentLevel + 1) {
225223
drawItem(items[index])

richtext-ui/src/commonMain/kotlin/com/halilibo/richtext/ui/LinkClickHandler.kt

Lines changed: 0 additions & 17 deletions
This file was deleted.

0 commit comments

Comments
 (0)