feat: add mdast spec to lettertrees and a placeholder renderer
This commit is contained in:
parent
9d897b6722
commit
db4015f4f6
|
|
@ -25,6 +25,7 @@ import chat.revolt.api.RevoltAPI
|
||||||
import chat.revolt.api.internals.ULID
|
import chat.revolt.api.internals.ULID
|
||||||
import chat.revolt.api.schemas.AutumnResource
|
import chat.revolt.api.schemas.AutumnResource
|
||||||
import chat.revolt.components.generic.RemoteImage
|
import chat.revolt.components.generic.RemoteImage
|
||||||
|
import chat.revolt.lettertrees.Renderer
|
||||||
import chat.revolt.api.schemas.Message as MessageSchema
|
import chat.revolt.api.schemas.Message as MessageSchema
|
||||||
|
|
||||||
fun viewAttachmentInBrowser(ctx: android.content.Context, attachment: AutumnResource) {
|
fun viewAttachmentInBrowser(ctx: android.content.Context, attachment: AutumnResource) {
|
||||||
|
|
@ -94,7 +95,7 @@ fun Message(
|
||||||
|
|
||||||
message.content?.let {
|
message.content?.let {
|
||||||
Text(
|
Text(
|
||||||
text = it
|
text = Renderer.annotateMarkdown(it),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -28,13 +28,21 @@ android {
|
||||||
kotlinOptions {
|
kotlinOptions {
|
||||||
jvmTarget = '1.8'
|
jvmTarget = '1.8'
|
||||||
}
|
}
|
||||||
|
buildFeatures {
|
||||||
|
compose true
|
||||||
|
}
|
||||||
|
composeOptions {
|
||||||
|
kotlinCompilerExtensionVersion compose_version
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
implementation 'androidx.core:core-ktx:1.9.0'
|
||||||
implementation 'androidx.core:core-ktx:1.7.0'
|
|
||||||
implementation 'androidx.appcompat:appcompat:1.6.0'
|
implementation 'androidx.appcompat:appcompat:1.6.0'
|
||||||
implementation 'com.google.android.material:material:1.7.0'
|
implementation 'com.google.android.material:material:1.7.0'
|
||||||
|
|
||||||
|
implementation "androidx.compose.ui:ui:$compose_libraries_version"
|
||||||
|
|
||||||
testImplementation 'junit:junit:4.13.2'
|
testImplementation 'junit:junit:4.13.2'
|
||||||
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
|
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
|
||||||
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
|
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
|
||||||
|
|
|
||||||
|
|
@ -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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -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()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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<Node> = 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()
|
||||||
|
|
@ -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<Int> = emptyList()
|
||||||
|
)
|
||||||
|
|
||||||
|
open class Node(
|
||||||
|
/**
|
||||||
|
* The variant of the node.
|
||||||
|
*/
|
||||||
|
open val type: String = "",
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Information from the ecosystem.
|
||||||
|
*/
|
||||||
|
val data: Map<String, Any> = 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<Node> = emptyList()
|
||||||
|
) : Node()
|
||||||
|
|
@ -0,0 +1,4 @@
|
||||||
|
package chat.revolt.lettertrees.parser
|
||||||
|
|
||||||
|
class Parser {
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue