From db4015f4f608d5f9e22f6ad30b4ddcc3f5a82c81 Mon Sep 17 00:00:00 2001 From: Infi Date: Sun, 15 Jan 2023 20:35:25 +0100 Subject: [PATCH] feat: add mdast spec to lettertrees and a placeholder renderer --- .../chat/revolt/components/chat/Message.kt | 3 +- lettertrees/build.gradle | 12 ++- .../lettertrees/ExampleInstrumentedTest.kt | 24 ----- .../java/chat/revolt/lettertrees/Renderer.kt | 26 ++++++ .../java/chat/revolt/lettertrees/ast/MdAst.kt | 91 +++++++++++++++++++ .../java/chat/revolt/lettertrees/ast/UniSt.kt | 67 ++++++++++++++ .../chat/revolt/lettertrees/parser/Parser.kt | 4 + 7 files changed, 200 insertions(+), 27 deletions(-) delete mode 100644 lettertrees/src/androidTest/java/chat/revolt/lettertrees/ExampleInstrumentedTest.kt create mode 100644 lettertrees/src/main/java/chat/revolt/lettertrees/Renderer.kt create mode 100644 lettertrees/src/main/java/chat/revolt/lettertrees/ast/MdAst.kt create mode 100644 lettertrees/src/main/java/chat/revolt/lettertrees/ast/UniSt.kt create mode 100644 lettertrees/src/main/java/chat/revolt/lettertrees/parser/Parser.kt diff --git a/app/src/main/java/chat/revolt/components/chat/Message.kt b/app/src/main/java/chat/revolt/components/chat/Message.kt index 56ed5023..04a9d88e 100644 --- a/app/src/main/java/chat/revolt/components/chat/Message.kt +++ b/app/src/main/java/chat/revolt/components/chat/Message.kt @@ -25,6 +25,7 @@ import chat.revolt.api.RevoltAPI import chat.revolt.api.internals.ULID import chat.revolt.api.schemas.AutumnResource import chat.revolt.components.generic.RemoteImage +import chat.revolt.lettertrees.Renderer import chat.revolt.api.schemas.Message as MessageSchema fun viewAttachmentInBrowser(ctx: android.content.Context, attachment: AutumnResource) { @@ -94,7 +95,7 @@ fun Message( message.content?.let { Text( - text = it + text = Renderer.annotateMarkdown(it), ) } diff --git a/lettertrees/build.gradle b/lettertrees/build.gradle index 039cf9e9..57ac653e 100644 --- a/lettertrees/build.gradle +++ b/lettertrees/build.gradle @@ -28,13 +28,21 @@ android { kotlinOptions { jvmTarget = '1.8' } + buildFeatures { + compose true + } + composeOptions { + kotlinCompilerExtensionVersion compose_version + } } dependencies { - - implementation 'androidx.core:core-ktx:1.7.0' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.appcompat:appcompat:1.6.0' implementation 'com.google.android.material:material:1.7.0' + + implementation "androidx.compose.ui:ui:$compose_libraries_version" + testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.5' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' diff --git a/lettertrees/src/androidTest/java/chat/revolt/lettertrees/ExampleInstrumentedTest.kt b/lettertrees/src/androidTest/java/chat/revolt/lettertrees/ExampleInstrumentedTest.kt deleted file mode 100644 index c1a9c822..00000000 --- a/lettertrees/src/androidTest/java/chat/revolt/lettertrees/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,24 +0,0 @@ -package chat.revolt.lettertrees - -import androidx.test.platform.app.InstrumentationRegistry -import androidx.test.ext.junit.runners.AndroidJUnit4 - -import org.junit.Test -import org.junit.runner.RunWith - -import org.junit.Assert.* - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("chat.revolt.lettertrees.test", appContext.packageName) - } -} \ No newline at end of file diff --git a/lettertrees/src/main/java/chat/revolt/lettertrees/Renderer.kt b/lettertrees/src/main/java/chat/revolt/lettertrees/Renderer.kt new file mode 100644 index 00000000..689481c1 --- /dev/null +++ b/lettertrees/src/main/java/chat/revolt/lettertrees/Renderer.kt @@ -0,0 +1,26 @@ +package chat.revolt.lettertrees + +import androidx.compose.ui.text.AnnotatedString +import androidx.compose.ui.text.SpanStyle +import androidx.compose.ui.text.buildAnnotatedString +import androidx.compose.ui.text.font.FontWeight + +object Renderer { + fun annotateMarkdown(text: String): AnnotatedString { + // TODO this is all placeholder code + val boldRegex = Regex("\\*\\*(.*?)\\*\\*") + return buildAnnotatedString { + append(text) + + boldRegex.findAll(text).forEach { match -> + addStyle( + style = SpanStyle(fontWeight = FontWeight.Bold), + start = match.groups[1]!!.range.first, + end = match.groups[1]!!.range.last + 1 + ) + } + + toAnnotatedString() + } + } +} \ No newline at end of file diff --git a/lettertrees/src/main/java/chat/revolt/lettertrees/ast/MdAst.kt b/lettertrees/src/main/java/chat/revolt/lettertrees/ast/MdAst.kt new file mode 100644 index 00000000..af6032ff --- /dev/null +++ b/lettertrees/src/main/java/chat/revolt/lettertrees/ast/MdAst.kt @@ -0,0 +1,91 @@ +package chat.revolt.lettertrees.ast + +/* + * SPECS: + * - Unist, the universal syntax tree @ https://github.com/syntax-tree/unist + * - Mdast, the markdown syntax tree @ https://github.com/syntax-tree/mdast + */ + +open class Literal( + /** + * The value of a node. + */ + open val value: String = "" +) : Node() + +open class Parent( + /** + * List representing the children of a node. + */ + val children: List = emptyList() +) : Node() + +open class Root( + override val type: String = "root" +) : Parent() + +open class Paragraph( + override val type: String = "paragraph" +) : Parent() + +open class Text( + override val type: String = "text", + override val value: String = "" +) : Literal() + +open class Heading( + override val type: String = "heading", + val depth: Int = 1 +) : Parent() + +open class ThematicBreak( + override val type: String = "thematicBreak" +) : Node() + +open class Blockquote( + override val type: String = "blockquote" +) : Parent() + +open class MdList( + override val type: String = "list", + val ordered: Boolean = false, + val start: Int = 1, + val spread: Boolean = false +) : Parent() + +open class ListItem( + override val type: String = "listItem", + val spread: Boolean = false +) : Parent() + +open class Code( + override val type: String = "code", + val lang: String? = null, + val meta: String? = null +) : Literal() + +open class Emphasis( + override val type: String = "emphasis" +) : Parent() + +open class Strong( + override val type: String = "strong" +) : Parent() + +open class Delete( + override val type: String = "delete" +) : Parent() + +open class InlineCode( + override val type: String = "inlineCode" +) : Literal() + +open class Break( + override val type: String = "break" +) : Node() + +open class Link( + override val type: String = "link", + val title: String? = null, + val url: String = "" +) : Parent() \ No newline at end of file diff --git a/lettertrees/src/main/java/chat/revolt/lettertrees/ast/UniSt.kt b/lettertrees/src/main/java/chat/revolt/lettertrees/ast/UniSt.kt new file mode 100644 index 00000000..8e2c4ed2 --- /dev/null +++ b/lettertrees/src/main/java/chat/revolt/lettertrees/ast/UniSt.kt @@ -0,0 +1,67 @@ +package chat.revolt.lettertrees.ast + +/* + * SPECS: + * - Unist, the universal syntax tree @ https://github.com/syntax-tree/unist + * - Mdast, the markdown syntax tree @ https://github.com/syntax-tree/mdast + */ + +class Point( + /** + * Line number in the document, starting at 1. + */ + val line: Int = 1, + + /** + * Column on line in the document, starting at 1. + */ + val column: Int = 1, + + /** + * Character offset in the document, starting at 0. + */ + val offset: Int = 0 +) + +class Position( + /** + * Place of the first character of the parsed source region. + */ + val start: Point = Point(), + + /** + * Place of the first character after the parsed source region. + */ + val end: Point = Point(), + + /** + * Start column at each index (plus start line) in the source region, + * for elements that span multiple lines. + */ + val indent: List = emptyList() +) + +open class Node( + /** + * The variant of the node. + */ + open val type: String = "", + + /** + * Information from the ecosystem. + */ + val data: Map = emptyMap(), + + /** + * Location of the node in a source document. + * Must not be present if a node is generated. + */ + val position: Position = Position() +) + +open class UnistParent( + /** + * List representing the children of a node. + */ + val children: List = emptyList() +) : Node() diff --git a/lettertrees/src/main/java/chat/revolt/lettertrees/parser/Parser.kt b/lettertrees/src/main/java/chat/revolt/lettertrees/parser/Parser.kt new file mode 100644 index 00000000..164260c4 --- /dev/null +++ b/lettertrees/src/main/java/chat/revolt/lettertrees/parser/Parser.kt @@ -0,0 +1,4 @@ +package chat.revolt.lettertrees.parser + +class Parser { +}