Skip to content

Commit

Permalink
Add support for custom string annotations and Compose inline content (#3
Browse files Browse the repository at this point in the history
)
  • Loading branch information
wingio committed Nov 30, 2023
1 parent ae52b4b commit e5f5941
Show file tree
Hide file tree
Showing 16 changed files with 239 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ class AndroidTestActivity : ComponentActivity() {

val testString = """
# Header
**Bold** *Italic* __Underline__ ~~Strikethrough~~ <@1234>
**Bold** *Italic* __Underline__ ~~Strikethrough~~ <@1234> :heart:
""".trimIndent()

findViewById<TextView>(R.id.test_text).render(
Expand Down
17 changes: 17 additions & 0 deletions demo/src/main/java/xyz/wingio/syntakts/demo/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,13 @@ import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.text.InlineTextContent
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Favorite
import androidx.compose.material3.Button
import androidx.compose.material3.Icon
import androidx.compose.material3.LocalTextStyle
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.ProvideTextStyle
Expand All @@ -28,6 +33,8 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.text.Placeholder
import androidx.compose.ui.text.PlaceholderVerticalAlign
import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
Expand Down Expand Up @@ -74,6 +81,16 @@ class MainActivity : ComponentActivity() {
) {
ClickableText(
text = TestSyntakts.rememberRendered(text, Context(LocalContext.current)),
inlineContent = mapOf(
"heart" to InlineTextContent(
Placeholder(LocalTextStyle.current.fontSize, LocalTextStyle.current.fontSize, PlaceholderVerticalAlign.Center)
) {
Icon(
imageVector = Icons.Filled.Favorite,
contentDescription = it
)
}
),
modifier = Modifier
.weight(1f)
.fillMaxWidth()
Expand Down
8 changes: 8 additions & 0 deletions demo/src/main/java/xyz/wingio/syntakts/demo/TestSyntakts.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package xyz.wingio.syntakts.demo

import android.content.Context as AndroidContext
import android.widget.Toast
import xyz.wingio.syntakts.compose.style.appendInlineContent
import xyz.wingio.syntakts.markdown.addMarkdownRules
import xyz.wingio.syntakts.style.Color
import xyz.wingio.syntakts.style.Style
Expand All @@ -25,6 +26,13 @@ val TestSyntakts = syntakts<Context> {
)
}

rule(":heart:") { result, _ ->
appendInlineContent(
id = "heart",
alternateText = result.value
)
}

addMarkdownRules()
}

Expand Down
11 changes: 11 additions & 0 deletions syntakts-android/api/syntakts-android.api
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,12 @@ public final class xyz/wingio/syntakts/android/markdown/MarkdownKt {
public static final fun renderMarkdown (Landroid/widget/TextView;Ljava/lang/CharSequence;)V
}

public final class xyz/wingio/syntakts/android/spans/AnnotationSpan {
public fun <init> (Ljava/lang/String;Ljava/lang/String;)V
public final fun getAnnotation ()Ljava/lang/String;
public final fun getTag ()Ljava/lang/String;
}

public class xyz/wingio/syntakts/android/spans/ClickableSpan : android/text/style/ClickableSpan {
public fun <init> (Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;)V
public fun onClick (Landroid/view/View;)V
Expand Down Expand Up @@ -50,6 +56,9 @@ public final class xyz/wingio/syntakts/android/style/ColorKt {

public final class xyz/wingio/syntakts/android/style/SpannableStyledTextBuilder : xyz/wingio/syntakts/style/StyledTextBuilder {
public fun <init> (Landroid/content/Context;)V
public fun addAnnotation (Ljava/lang/String;Ljava/lang/String;II)Lxyz/wingio/syntakts/android/style/SpannableStyledTextBuilder;
public synthetic fun addAnnotation (Ljava/lang/String;Ljava/lang/String;II)Lxyz/wingio/syntakts/style/StyledTextBuilder;
public fun addAnnotation (Ljava/lang/String;Ljava/lang/String;Lkotlin/ranges/IntRange;)Lxyz/wingio/syntakts/style/StyledTextBuilder;
public fun addClickable (IILkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;)Lxyz/wingio/syntakts/android/style/SpannableStyledTextBuilder;
public synthetic fun addClickable (IILkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;)Lxyz/wingio/syntakts/style/StyledTextBuilder;
public fun addClickable (Lkotlin/ranges/IntRange;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;)Lxyz/wingio/syntakts/style/StyledTextBuilder;
Expand All @@ -63,6 +72,8 @@ public final class xyz/wingio/syntakts/android/style/SpannableStyledTextBuilder
public synthetic fun append (Ljava/lang/CharSequence;Lkotlin/jvm/functions/Function1;)Lxyz/wingio/syntakts/style/StyledTextBuilder;
public fun append (Ljava/lang/CharSequence;Lxyz/wingio/syntakts/style/Style;)Lxyz/wingio/syntakts/android/style/SpannableStyledTextBuilder;
public synthetic fun append (Ljava/lang/CharSequence;Lxyz/wingio/syntakts/style/Style;)Lxyz/wingio/syntakts/style/StyledTextBuilder;
public fun appendAnnotated (Ljava/lang/CharSequence;Ljava/lang/String;Ljava/lang/String;)Lxyz/wingio/syntakts/android/style/SpannableStyledTextBuilder;
public synthetic fun appendAnnotated (Ljava/lang/CharSequence;Ljava/lang/String;Ljava/lang/String;)Lxyz/wingio/syntakts/style/StyledTextBuilder;
public fun appendClickable (Ljava/lang/CharSequence;Lxyz/wingio/syntakts/style/Style;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;)Lxyz/wingio/syntakts/android/style/SpannableStyledTextBuilder;
public synthetic fun appendClickable (Ljava/lang/CharSequence;Lxyz/wingio/syntakts/style/Style;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;)Lxyz/wingio/syntakts/style/StyledTextBuilder;
public fun build ()Ljava/lang/CharSequence;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package xyz.wingio.syntakts.android.spans

/**
* Represents an annotation applied to some text
*
* @param tag Used to distinguish annotations
* @param annotation Annotation to attach
*/
public class AnnotationSpan(
public val tag: String,
public val annotation: String
)
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package xyz.wingio.syntakts.android.style
import android.content.Context
import android.text.Spannable
import android.text.SpannableStringBuilder
import xyz.wingio.syntakts.android.spans.AnnotationSpan
import xyz.wingio.syntakts.android.spans.ClickableSpan
import xyz.wingio.syntakts.android.spans.SyntaktsStyleSpan
import xyz.wingio.syntakts.style.Style
Expand Down Expand Up @@ -66,6 +67,17 @@ public class SpannableStyledTextBuilder(
return this
}

override fun appendAnnotated(
text: CharSequence,
tag: String,
annotation: String
): SpannableStyledTextBuilder {
val i = length
append(text)
addAnnotation(tag, annotation, i, length)
return this
}

override fun addClickable(
startIndex: Int,
endIndex: Int,
Expand Down Expand Up @@ -112,6 +124,21 @@ public class SpannableStyledTextBuilder(
return this
}

override fun addAnnotation(
tag: String,
annotation: String,
startIndex: Int,
endIndex: Int
): SpannableStyledTextBuilder {
builder.setSpan(
/* what = */ AnnotationSpan(tag, annotation),
/* start = */ startIndex,
/* end = */ endIndex,
/* flags = */ Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)
return this
}

override fun clear() {
builder.clear()
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
public final class xyz/wingio/syntakts/compose/material3/clickable/ClickableTextKt {
public static final fun ClickableText-iU_0S-8 (Landroidx/compose/ui/text/AnnotatedString;Landroidx/compose/ui/Modifier;JJLandroidx/compose/ui/text/font/FontWeight;Landroidx/compose/ui/text/font/FontStyle;Landroidx/compose/ui/text/font/FontFamily;JLandroidx/compose/ui/text/style/TextDecoration;Landroidx/compose/ui/text/style/TextAlign;JLandroidx/compose/ui/text/TextStyle;IZILandroidx/compose/runtime/Composer;III)V
public static final fun ClickableText-1hOE65M (Landroidx/compose/ui/text/AnnotatedString;Landroidx/compose/ui/Modifier;JJLandroidx/compose/ui/text/font/FontWeight;Landroidx/compose/ui/text/font/FontStyle;Landroidx/compose/ui/text/font/FontFamily;JLandroidx/compose/ui/text/style/TextDecoration;Landroidx/compose/ui/text/style/TextAlign;JLandroidx/compose/ui/text/TextStyle;IZILjava/util/Map;Landroidx/compose/runtime/Composer;III)V
}

Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
public final class xyz/wingio/syntakts/compose/material3/clickable/ClickableTextKt {
public static final fun ClickableText-iU_0S-8 (Landroidx/compose/ui/text/AnnotatedString;Landroidx/compose/ui/Modifier;JJLandroidx/compose/ui/text/font/FontWeight;Landroidx/compose/ui/text/font/FontStyle;Landroidx/compose/ui/text/font/FontFamily;JLandroidx/compose/ui/text/style/TextDecoration;Landroidx/compose/ui/text/style/TextAlign;JLandroidx/compose/ui/text/TextStyle;IZILandroidx/compose/runtime/Composer;III)V
public static final fun ClickableText-1hOE65M (Landroidx/compose/ui/text/AnnotatedString;Landroidx/compose/ui/Modifier;JJLandroidx/compose/ui/text/font/FontWeight;Landroidx/compose/ui/text/font/FontStyle;Landroidx/compose/ui/text/font/FontFamily;JLandroidx/compose/ui/text/style/TextDecoration;Landroidx/compose/ui/text/style/TextAlign;JLandroidx/compose/ui/text/TextStyle;IZILjava/util/Map;Landroidx/compose/runtime/Composer;III)V
}

Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package xyz.wingio.syntakts.compose.material3.clickable

import androidx.compose.foundation.text.BasicText
import androidx.compose.foundation.text.InlineTextContent
import androidx.compose.material3.LocalContentColor
import androidx.compose.material3.LocalTextStyle
import androidx.compose.runtime.Composable
Expand Down Expand Up @@ -41,6 +42,7 @@ import xyz.wingio.syntakts.compose.clickable.clickableText
* @param overflow How the text should handle visual overflow
* @param softWrap Whether the text should break at soft line breaks
* @param maxLines An optional maximum number of lines for the text to span, wrapping if necessary
* @param inlineContent A map store composables that replaces certain ranges of the text
*/
@Composable
public fun ClickableText(
Expand All @@ -58,7 +60,8 @@ public fun ClickableText(
style: TextStyle = LocalTextStyle.current,
overflow: TextOverflow = TextOverflow.Clip,
softWrap: Boolean = true,
maxLines: Int = Int.MAX_VALUE
maxLines: Int = Int.MAX_VALUE,
inlineContent: Map<String, InlineTextContent> = mapOf()
) {
var layoutResult by remember { mutableStateOf<TextLayoutResult?>(null) }
val textColor = color.takeOrElse {
Expand Down Expand Up @@ -87,6 +90,7 @@ public fun ClickableText(
overflow = overflow,
softWrap = softWrap,
maxLines = maxLines,
inlineContent = inlineContent,
onTextLayout = {
layoutResult = it
}
Expand Down
14 changes: 13 additions & 1 deletion syntakts-compose/api/android/syntakts-compose.api
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public final class xyz/wingio/syntakts/compose/clickable/ClickHandlerStore {
}

public final class xyz/wingio/syntakts/compose/clickable/ClickableTextKt {
public static final fun ClickableText-iU_0S-8 (Landroidx/compose/ui/text/AnnotatedString;Landroidx/compose/ui/Modifier;JJLandroidx/compose/ui/text/font/FontWeight;Landroidx/compose/ui/text/font/FontStyle;Landroidx/compose/ui/text/font/FontFamily;JLandroidx/compose/ui/text/style/TextDecoration;Landroidx/compose/ui/text/style/TextAlign;JLandroidx/compose/ui/text/TextStyle;IZILandroidx/compose/runtime/Composer;III)V
public static final fun ClickableText-1hOE65M (Landroidx/compose/ui/text/AnnotatedString;Landroidx/compose/ui/Modifier;JJLandroidx/compose/ui/text/font/FontWeight;Landroidx/compose/ui/text/font/FontStyle;Landroidx/compose/ui/text/font/FontFamily;JLandroidx/compose/ui/text/style/TextDecoration;Landroidx/compose/ui/text/style/TextAlign;JLandroidx/compose/ui/text/TextStyle;IZILjava/util/Map;Landroidx/compose/runtime/Composer;III)V
public static final fun clickableText (Landroidx/compose/ui/Modifier;Landroidx/compose/ui/text/AnnotatedString;Landroidx/compose/ui/text/TextLayoutResult;Landroidx/compose/runtime/Composer;I)Landroidx/compose/ui/Modifier;
}

Expand All @@ -25,6 +25,9 @@ public final class xyz/wingio/syntakts/compose/style/AnnotatedStyledTextBuilder
public fun <init> (Landroidx/compose/ui/text/AnnotatedString$Builder;)V
public synthetic fun <init> (Landroidx/compose/ui/text/AnnotatedString$Builder;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public fun <init> (Ljava/lang/String;)V
public fun addAnnotation (Ljava/lang/String;Ljava/lang/String;II)Lxyz/wingio/syntakts/compose/style/AnnotatedStyledTextBuilder;
public synthetic fun addAnnotation (Ljava/lang/String;Ljava/lang/String;II)Lxyz/wingio/syntakts/style/StyledTextBuilder;
public fun addAnnotation (Ljava/lang/String;Ljava/lang/String;Lkotlin/ranges/IntRange;)Lxyz/wingio/syntakts/style/StyledTextBuilder;
public fun addClickable (IILkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;)Lxyz/wingio/syntakts/style/StyledTextBuilder;
public fun addClickable (Lkotlin/ranges/IntRange;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;)Lxyz/wingio/syntakts/style/StyledTextBuilder;
public fun addStyle (IILkotlin/jvm/functions/Function1;)Lxyz/wingio/syntakts/compose/style/AnnotatedStyledTextBuilder;
Expand All @@ -37,6 +40,8 @@ public final class xyz/wingio/syntakts/compose/style/AnnotatedStyledTextBuilder
public synthetic fun append (Ljava/lang/CharSequence;Lkotlin/jvm/functions/Function1;)Lxyz/wingio/syntakts/style/StyledTextBuilder;
public fun append (Ljava/lang/CharSequence;Lxyz/wingio/syntakts/style/Style;)Lxyz/wingio/syntakts/compose/style/AnnotatedStyledTextBuilder;
public synthetic fun append (Ljava/lang/CharSequence;Lxyz/wingio/syntakts/style/Style;)Lxyz/wingio/syntakts/style/StyledTextBuilder;
public fun appendAnnotated (Ljava/lang/CharSequence;Ljava/lang/String;Ljava/lang/String;)Lxyz/wingio/syntakts/compose/style/AnnotatedStyledTextBuilder;
public synthetic fun appendAnnotated (Ljava/lang/CharSequence;Ljava/lang/String;Ljava/lang/String;)Lxyz/wingio/syntakts/style/StyledTextBuilder;
public fun appendClickable (Ljava/lang/CharSequence;Lxyz/wingio/syntakts/style/Style;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;)Lxyz/wingio/syntakts/compose/style/AnnotatedStyledTextBuilder;
public synthetic fun appendClickable (Ljava/lang/CharSequence;Lxyz/wingio/syntakts/style/Style;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;)Lxyz/wingio/syntakts/style/StyledTextBuilder;
public fun build ()Landroidx/compose/ui/text/AnnotatedString;
Expand All @@ -45,6 +50,13 @@ public final class xyz/wingio/syntakts/compose/style/AnnotatedStyledTextBuilder
public fun getLength ()I
}

public final class xyz/wingio/syntakts/compose/style/AnnotatedStyledTextBuilderKt {
public static final fun addInlineContent (Lxyz/wingio/syntakts/style/StyledTextBuilder;Ljava/lang/String;II)Lxyz/wingio/syntakts/style/StyledTextBuilder;
public static final fun addInlineContent (Lxyz/wingio/syntakts/style/StyledTextBuilder;Ljava/lang/String;Lkotlin/ranges/IntRange;)Lxyz/wingio/syntakts/style/StyledTextBuilder;
public static final fun appendInlineContent (Lxyz/wingio/syntakts/style/StyledTextBuilder;Ljava/lang/String;Ljava/lang/CharSequence;)Lxyz/wingio/syntakts/style/StyledTextBuilder;
public static synthetic fun appendInlineContent$default (Lxyz/wingio/syntakts/style/StyledTextBuilder;Ljava/lang/String;Ljava/lang/CharSequence;ILjava/lang/Object;)Lxyz/wingio/syntakts/style/StyledTextBuilder;
}

public final class xyz/wingio/syntakts/compose/style/ColorKt {
public static final fun toComposeColor (Lxyz/wingio/syntakts/style/Color;)J
public static final fun toSyntaktsColor-8_81llA (J)Lxyz/wingio/syntakts/style/Color;
Expand Down
Loading

0 comments on commit e5f5941

Please sign in to comment.