Skip to content

Commit

Permalink
Replace SimplerAST with Syntakts
Browse files Browse the repository at this point in the history
  • Loading branch information
wingio committed Dec 4, 2023
1 parent 2f1d038 commit 683ac0c
Show file tree
Hide file tree
Showing 14 changed files with 238 additions and 477 deletions.
1 change: 1 addition & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ dependencies {
implementation(libs.bundles.voyager)

implementation(libs.pullrefresh)
implementation(libs.syntakts)

ksp(libs.androidx.room.compiler)
}
48 changes: 0 additions & 48 deletions app/src/main/java/xyz/wingio/dimett/ast/AnnotatedBuilder.kt

This file was deleted.

93 changes: 44 additions & 49 deletions app/src/main/java/xyz/wingio/dimett/ast/Renderer.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,60 +2,55 @@ package xyz.wingio.dimett.ast

import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import com.materii.simplerast.core.node.Node
import com.materii.simplerast.core.parser.Parser
import androidx.compose.runtime.remember
import androidx.compose.ui.platform.LocalUriHandler
import xyz.wingio.dimett.ast.rendercontext.DefaultRenderContext
import xyz.wingio.syntakts.Syntakts
import xyz.wingio.syntakts.compose.rememberAsyncRendered
import xyz.wingio.syntakts.markdown.addBasicMarkdownRules
import xyz.wingio.syntakts.syntakts

object Renderer {
private val stringParser = createStringParser()
private val regularParser = createRegularParser()
@Composable
fun Syntakts<DefaultRenderContext>.render(
text: String,
emojiMap: Map<String, String> = emptyMap(),
mentionMap: Map<String, String> = emptyMap(),
actionHandler: (String) -> Unit = {}
) = rememberAsyncRendered(
text = text,
context = rememberRenderContext(emojiMap, mentionMap, actionHandler)
)

private fun Parser<DefaultRenderContext, Node<DefaultRenderContext>, Any>.render(
text: String,
renderContext: DefaultRenderContext
) = AnnotatedBuilder("").apply {
for (node in parse(
text
.replace("\uD83C\uDFF3\u200D", "\uD83C\uDFF3\u200D⚧️") // trans flag fix
.replace(
"\uD83C\uDFF3\u200D\uD83C\uDF08",
"\uD83C\uDFF3\u200D\uD83C\uDF08"
), // pride flag fix
""
))
node.render(this, renderContext)
}
@Composable
fun rememberRenderContext(
emojiMap: Map<String, String>,
mentionMap: Map<String, String>,
actionHandler: (String) -> Unit = {}
): DefaultRenderContext {
val uriHandler = LocalUriHandler.current
val linkColor = MaterialTheme.colorScheme.primary

private fun createStringParser() =
Parser<DefaultRenderContext, Node<DefaultRenderContext>, Any>(false).apply {
// addRule(hyperlinkRule)
addRule(urlRule)
addRule(clickableRule)
addRule(unicodeEmojiRule)
addRules(basicRules)
}
return remember(emojiMap, mentionMap, uriHandler, linkColor, actionHandler) {
DefaultRenderContext(emojiMap, mentionMap, linkColor, uriHandler, actionHandler)
}
}

private fun createRegularParser() =
Parser<DefaultRenderContext, Node<DefaultRenderContext>, Any>(false).apply {
addRule(hashtagRule)
addRule(mentionRule)
addRule(urlRule)
addRule(emojiRule)
addRule(unicodeEmojiRule)
addRule(plainTextRule)
}
val DefaultSyntakts = syntakts {
addHashtagRule()
addMentionRule()
addUrlRule()
addEmojiRule()
addUnicodeEmojiRule()
}

@Composable
fun renderString(
text: String,
renderContext: DefaultRenderContext = DefaultRenderContext.BLANK.copy(linkColor = MaterialTheme.colorScheme.secondary)
) =
stringParser.render(text, renderContext)
val StringSyntakts = syntakts {
addUrlRule()
addClickableRule()
addBasicMarkdownRules()
addUnicodeEmojiRule()
}

@Composable
fun render(text: String, emojiMap: Map<String, String>, mentionMap: Map<String, String>) =
regularParser.render(
text,
DefaultRenderContext(emojiMap, mentionMap, MaterialTheme.colorScheme.secondary)
)
val EmojiSyntakts = syntakts {
addEmojiRule()
addUnicodeEmojiRule()
}
Loading

0 comments on commit 683ac0c

Please sign in to comment.