diff --git a/core/src/commonMain/kotlin/com/boswelja/markdown/MarkdownDocument.kt b/core/src/commonMain/kotlin/com/boswelja/markdown/MarkdownDocument.kt index 7214c0c..895fa18 100644 --- a/core/src/commonMain/kotlin/com/boswelja/markdown/MarkdownDocument.kt +++ b/core/src/commonMain/kotlin/com/boswelja/markdown/MarkdownDocument.kt @@ -6,6 +6,7 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.text.LinkAnnotation import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.TextUnit @@ -50,7 +51,7 @@ public fun MarkdownDocument( codeBlockStyle: CodeBlockStyle, ruleStyle: RuleStyle, tableStyle: TableStyle, - onLinkClick: (String) -> Unit, + onLinkClick: (LinkAnnotation) -> Unit, modifier: Modifier = Modifier, sectionSpacing: Dp = textStyles.textStyle.fontSize.toDp() ) { @@ -94,7 +95,7 @@ internal fun MarkdownNode( codeBlockStyle: CodeBlockStyle, ruleStyle: RuleStyle, tableStyle: TableStyle, - onLinkClick: (String) -> Unit, + onLinkClick: (LinkAnnotation) -> Unit, modifier: Modifier = Modifier ) { when (node) { diff --git a/core/src/commonMain/kotlin/com/boswelja/markdown/components/MarkdownBlockQuote.kt b/core/src/commonMain/kotlin/com/boswelja/markdown/components/MarkdownBlockQuote.kt index 9877382..4fa3e05 100644 --- a/core/src/commonMain/kotlin/com/boswelja/markdown/components/MarkdownBlockQuote.kt +++ b/core/src/commonMain/kotlin/com/boswelja/markdown/components/MarkdownBlockQuote.kt @@ -13,6 +13,7 @@ import androidx.compose.foundation.layout.width import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip +import androidx.compose.ui.text.LinkAnnotation import com.boswelja.markdown.MarkdownNode import com.boswelja.markdown.generator.MarkdownBlockQuote import com.boswelja.markdown.style.BlockQuoteStyle @@ -35,7 +36,7 @@ internal fun MarkdownBlockQuote( codeBlockStyle: CodeBlockStyle, ruleStyle: RuleStyle, tableStyle: TableStyle, - onLinkClick: (String) -> Unit, + onLinkClick: (LinkAnnotation) -> Unit, modifier: Modifier = Modifier, ) { Box( diff --git a/core/src/commonMain/kotlin/com/boswelja/markdown/components/MarkdownList.kt b/core/src/commonMain/kotlin/com/boswelja/markdown/components/MarkdownList.kt index acf1d16..d8bf66c 100644 --- a/core/src/commonMain/kotlin/com/boswelja/markdown/components/MarkdownList.kt +++ b/core/src/commonMain/kotlin/com/boswelja/markdown/components/MarkdownList.kt @@ -7,6 +7,7 @@ import androidx.compose.foundation.text.BasicText import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.text.LinkAnnotation import androidx.compose.ui.unit.dp import com.boswelja.markdown.MarkdownNode import com.boswelja.markdown.generator.MarkdownOrderedList @@ -33,7 +34,7 @@ internal fun MarkdownOrderedList( codeBlockStyle: CodeBlockStyle, ruleStyle: RuleStyle, tableStyle: TableStyle, - onLinkClick: (String) -> Unit, + onLinkClick: (LinkAnnotation) -> Unit, modifier: Modifier = Modifier, ) { Column(modifier) { @@ -78,7 +79,7 @@ internal fun MarkdownUnorderedList( codeBlockStyle: CodeBlockStyle, ruleStyle: RuleStyle, tableStyle: TableStyle, - onLinkClick: (String) -> Unit, + onLinkClick: (LinkAnnotation) -> Unit, modifier: Modifier = Modifier, ) { Column(modifier) { diff --git a/core/src/commonMain/kotlin/com/boswelja/markdown/components/MarkdownParagraph.kt b/core/src/commonMain/kotlin/com/boswelja/markdown/components/MarkdownParagraph.kt index 59c4e0e..53f565b 100644 --- a/core/src/commonMain/kotlin/com/boswelja/markdown/components/MarkdownParagraph.kt +++ b/core/src/commonMain/kotlin/com/boswelja/markdown/components/MarkdownParagraph.kt @@ -7,7 +7,7 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.input.pointer.pointerInput -import androidx.compose.ui.text.ExperimentalTextApi +import androidx.compose.ui.text.LinkAnnotation import androidx.compose.ui.text.TextLayoutResult import androidx.compose.ui.text.TextStyle import androidx.compose.ui.unit.sp @@ -19,13 +19,12 @@ import com.boswelja.markdown.style.TextUnitSize * Displays a [MarkdownParagraph]. A paragraph is a group of "spans". Spans are stylized sections of * text, but can also include inline images and links. */ -@OptIn(ExperimentalTextApi::class) @Composable internal fun MarkdownParagraph( paragraph: MarkdownParagraph, textStyle: TextStyle, textStyleModifiers: TextStyleModifiers, - onLinkClick: (String) -> Unit, + onLinkClick: (LinkAnnotation) -> Unit, modifier: Modifier = Modifier, ) { val (annotatedString, inlineContent) = remember(paragraph) { @@ -36,9 +35,11 @@ internal fun MarkdownParagraph( detectTapGestures { pos -> layoutResult.value?.let { layoutResult -> val offset = layoutResult.getOffsetForPosition(pos) - annotatedString.getUrlAnnotations(start = offset, end = offset).firstOrNull()?.let { annotation -> - onLinkClick(annotation.item.url) - } + annotatedString.getLinkAnnotations(start = offset, end = offset) + .firstOrNull() + ?.let { annotation -> + annotation.item.linkInteractionListener?.onClick(annotation.item) + } } } } diff --git a/core/src/commonMain/kotlin/com/boswelja/markdown/components/MarkdownSpanNodeExt.kt b/core/src/commonMain/kotlin/com/boswelja/markdown/components/MarkdownSpanNodeExt.kt index a2efa0d..659f686 100644 --- a/core/src/commonMain/kotlin/com/boswelja/markdown/components/MarkdownSpanNodeExt.kt +++ b/core/src/commonMain/kotlin/com/boswelja/markdown/components/MarkdownSpanNodeExt.kt @@ -5,13 +5,12 @@ import androidx.compose.foundation.text.InlineTextContent import androidx.compose.foundation.text.appendInlineContent import androidx.compose.ui.Modifier import androidx.compose.ui.text.AnnotatedString -import androidx.compose.ui.text.ExperimentalTextApi +import androidx.compose.ui.text.LinkAnnotation import androidx.compose.ui.text.Placeholder import androidx.compose.ui.text.PlaceholderVerticalAlign import androidx.compose.ui.text.TextStyle -import androidx.compose.ui.text.UrlAnnotation import androidx.compose.ui.text.buildAnnotatedString -import androidx.compose.ui.text.withAnnotation +import androidx.compose.ui.text.withLink import androidx.compose.ui.text.withStyle import coil3.compose.AsyncImage import coil3.compose.LocalPlatformContext @@ -73,7 +72,6 @@ internal data class TextWithContent( val content: Map ) -@OptIn(ExperimentalTextApi::class) internal fun MarkdownSpanNode.toAnnotatedString( textStyle: TextStyle, textStyleModifiers: TextStyleModifiers, @@ -87,7 +85,7 @@ internal fun MarkdownSpanNode.toAnnotatedString( appendInlineContent(imageUrl, contentDescription) } is MarkdownLink -> buildAnnotatedString { - withAnnotation(UrlAnnotation(url)) { + withLink(LinkAnnotation.Url(url)) { withStyle(textStyleModifiers.link(textStyle).toSpanStyle()) { displayText.forEach { append(it.toAnnotatedString(textStyle, textStyleModifiers)) diff --git a/core/src/commonMain/kotlin/com/boswelja/markdown/components/MarkdownTable.kt b/core/src/commonMain/kotlin/com/boswelja/markdown/components/MarkdownTable.kt index 2328d20..5685789 100644 --- a/core/src/commonMain/kotlin/com/boswelja/markdown/components/MarkdownTable.kt +++ b/core/src/commonMain/kotlin/com/boswelja/markdown/components/MarkdownTable.kt @@ -5,6 +5,7 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.padding import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.compose.ui.text.LinkAnnotation import androidx.compose.ui.text.TextStyle import com.boswelja.markdown.generator.MarkdownTable import com.boswelja.markdown.style.RuleStyle @@ -22,7 +23,7 @@ internal fun MarkdownTable( textStyle: TextStyle, textStyleModifiers: TextStyleModifiers, ruleStyle: RuleStyle, - onLinkClick: (String) -> Unit, + onLinkClick: (LinkAnnotation) -> Unit, modifier: Modifier = Modifier, ) { Column(modifier) { diff --git a/core/src/commonTest/kotlin/com/nasdroid/core/markdown/MarkdownNodeBuilders.kt b/core/src/commonTest/kotlin/com/boswelja/markdown/generator/MarkdownNodeBuilders.kt similarity index 78% rename from core/src/commonTest/kotlin/com/nasdroid/core/markdown/MarkdownNodeBuilders.kt rename to core/src/commonTest/kotlin/com/boswelja/markdown/generator/MarkdownNodeBuilders.kt index bbb5637..5157a77 100644 --- a/core/src/commonTest/kotlin/com/nasdroid/core/markdown/MarkdownNodeBuilders.kt +++ b/core/src/commonTest/kotlin/com/boswelja/markdown/generator/MarkdownNodeBuilders.kt @@ -1,19 +1,4 @@ -package com.nasdroid.core.markdown - -import com.boswelja.markdown.generator.MarkdownBlockQuote -import com.boswelja.markdown.generator.MarkdownCodeBlock -import com.boswelja.markdown.generator.MarkdownCodeSpan -import com.boswelja.markdown.generator.MarkdownHeading -import com.boswelja.markdown.generator.MarkdownImage -import com.boswelja.markdown.generator.MarkdownLink -import com.boswelja.markdown.generator.MarkdownListItem -import com.boswelja.markdown.generator.MarkdownNode -import com.boswelja.markdown.generator.MarkdownOrderedList -import com.boswelja.markdown.generator.MarkdownParagraph -import com.boswelja.markdown.generator.MarkdownSpanNode -import com.boswelja.markdown.generator.MarkdownTable -import com.boswelja.markdown.generator.MarkdownText -import com.boswelja.markdown.generator.MarkdownUnorderedList +package com.boswelja.markdown.generator internal object MarkdownNodeBuilders { fun markdownUnorderedList(vararg listItems: MarkdownListItem): MarkdownUnorderedList { diff --git a/core/src/commonTest/kotlin/com/nasdroid/core/markdown/MarkdownNodeGeneratorTest.kt b/core/src/commonTest/kotlin/com/boswelja/markdown/generator/MarkdownNodeGeneratorTest.kt similarity index 92% rename from core/src/commonTest/kotlin/com/nasdroid/core/markdown/MarkdownNodeGeneratorTest.kt rename to core/src/commonTest/kotlin/com/boswelja/markdown/generator/MarkdownNodeGeneratorTest.kt index 9be774c..674f807 100644 --- a/core/src/commonTest/kotlin/com/nasdroid/core/markdown/MarkdownNodeGeneratorTest.kt +++ b/core/src/commonTest/kotlin/com/boswelja/markdown/generator/MarkdownNodeGeneratorTest.kt @@ -1,28 +1,18 @@ -package com.nasdroid.core.markdown - -import com.boswelja.markdown.generator.MarkdownEol -import com.boswelja.markdown.generator.MarkdownHeading -import com.boswelja.markdown.generator.MarkdownNode -import com.boswelja.markdown.generator.MarkdownNodeGenerator -import com.boswelja.markdown.generator.MarkdownParagraph -import com.boswelja.markdown.generator.MarkdownRule -import com.boswelja.markdown.generator.MarkdownSpanNode -import com.boswelja.markdown.generator.MarkdownTable -import com.boswelja.markdown.generator.MarkdownWhitespace -import com.boswelja.markdown.generator.TestMarkdown -import com.nasdroid.core.markdown.MarkdownNodeBuilders.markdownBlockQuote -import com.nasdroid.core.markdown.MarkdownNodeBuilders.markdownCodeBlock -import com.nasdroid.core.markdown.MarkdownNodeBuilders.markdownCodeSpan -import com.nasdroid.core.markdown.MarkdownNodeBuilders.markdownHeader -import com.nasdroid.core.markdown.MarkdownNodeBuilders.markdownImage -import com.nasdroid.core.markdown.MarkdownNodeBuilders.markdownLink -import com.nasdroid.core.markdown.MarkdownNodeBuilders.markdownListItem -import com.nasdroid.core.markdown.MarkdownNodeBuilders.markdownOrderedList -import com.nasdroid.core.markdown.MarkdownNodeBuilders.markdownParagraph -import com.nasdroid.core.markdown.MarkdownNodeBuilders.markdownTable -import com.nasdroid.core.markdown.MarkdownNodeBuilders.markdownTableColumn -import com.nasdroid.core.markdown.MarkdownNodeBuilders.markdownText -import com.nasdroid.core.markdown.MarkdownNodeBuilders.markdownUnorderedList +package com.boswelja.markdown.generator + +import com.boswelja.markdown.generator.MarkdownNodeBuilders.markdownBlockQuote +import com.boswelja.markdown.generator.MarkdownNodeBuilders.markdownCodeBlock +import com.boswelja.markdown.generator.MarkdownNodeBuilders.markdownCodeSpan +import com.boswelja.markdown.generator.MarkdownNodeBuilders.markdownHeader +import com.boswelja.markdown.generator.MarkdownNodeBuilders.markdownImage +import com.boswelja.markdown.generator.MarkdownNodeBuilders.markdownLink +import com.boswelja.markdown.generator.MarkdownNodeBuilders.markdownListItem +import com.boswelja.markdown.generator.MarkdownNodeBuilders.markdownOrderedList +import com.boswelja.markdown.generator.MarkdownNodeBuilders.markdownParagraph +import com.boswelja.markdown.generator.MarkdownNodeBuilders.markdownTable +import com.boswelja.markdown.generator.MarkdownNodeBuilders.markdownTableColumn +import com.boswelja.markdown.generator.MarkdownNodeBuilders.markdownText +import com.boswelja.markdown.generator.MarkdownNodeBuilders.markdownUnorderedList import org.intellij.markdown.ast.ASTNode import org.intellij.markdown.flavours.gfm.GFMFlavourDescriptor import org.intellij.markdown.parser.MarkdownParser diff --git a/core/src/commonTest/kotlin/com/nasdroid/core/markdown/TestContents.kt b/core/src/commonTest/kotlin/com/boswelja/markdown/generator/TestContents.kt similarity index 100% rename from core/src/commonTest/kotlin/com/nasdroid/core/markdown/TestContents.kt rename to core/src/commonTest/kotlin/com/boswelja/markdown/generator/TestContents.kt diff --git a/material3/src/commonMain/kotlin/com/boswelja/markdown/material3/MarkdownDocument.kt b/material3/src/commonMain/kotlin/com/boswelja/markdown/material3/MarkdownDocument.kt index 0314f73..7359e40 100644 --- a/material3/src/commonMain/kotlin/com/boswelja/markdown/material3/MarkdownDocument.kt +++ b/material3/src/commonMain/kotlin/com/boswelja/markdown/material3/MarkdownDocument.kt @@ -4,6 +4,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalUriHandler +import androidx.compose.ui.text.LinkAnnotation import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.TextUnit import com.boswelja.markdown.style.BlockQuoteStyle @@ -27,7 +28,7 @@ public fun MarkdownDocument( ruleStyle: RuleStyle = m3RuleStyle(), tableStyle: TableStyle = m3TableStyle(), sectionSpacing: Dp = textStyles.textStyle.fontSize.toDp(), - onLinkClick: ((String) -> Unit)? = null + onLinkClick: ((LinkAnnotation) -> Unit)? = null ) { val uriHandler = LocalUriHandler.current com.boswelja.markdown.MarkdownDocument( @@ -38,7 +39,15 @@ public fun MarkdownDocument( codeBlockStyle = codeBlockStyle, ruleStyle = ruleStyle, tableStyle = tableStyle, - onLinkClick = { onLinkClick?.invoke(it) ?: uriHandler.openUri(it) }, + onLinkClick = { + if (onLinkClick != null) { + onLinkClick(it) + } else if (it is LinkAnnotation.Url) { + uriHandler.openUri(it.url) + } else { + // The link wasn't a URL, and a handler wasn't provided. + } + }, modifier = modifier, sectionSpacing = sectionSpacing ) diff --git a/settings.gradle.kts b/settings.gradle.kts index 13e82a8..73fbaea 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,5 +1,3 @@ -import com.android.build.api.dsl.SettingsExtension - pluginManagement { repositories { gradlePluginPortal() @@ -28,7 +26,7 @@ dependencyResolutionManagement { } plugins { - id("com.android.settings") version("8.7.2") + id("com.android.settings") version("8.7.3") } rootProject.name = "Compose Markdown" @@ -40,7 +38,7 @@ include( ) android { - buildToolsVersion = "34.0.0" - compileSdk = 34 + buildToolsVersion = "35.0.0" + compileSdk = 35 minSdk = 28 }