chore: remove finalmarkdown

This commit is contained in:
infi 2026-04-05 20:45:04 +02:00
parent 5c2e6bc02e
commit cc721e9b53
6 changed files with 0 additions and 202 deletions

View File

@ -1,14 +0,0 @@
package chat.stoat.ndk
import kotlinx.serialization.Serializable
@Serializable
data class FinalMarkdownNodeTest(
val test: Int,
)
@Suppress("KotlinJniMissingFunction")
object FinalMarkdown {
external fun init(debug: Boolean)
external fun process(input: String): FinalMarkdownNodeTest
}

View File

@ -1,19 +1,14 @@
package chat.stoat.ndk package chat.stoat.ndk
import chat.stoat.BuildConfig
annotation class NativeLibrary(val name: String) { annotation class NativeLibrary(val name: String) {
companion object { companion object {
const val LIB_NAME_NATIVE_MARKDOWN = "stendal" const val LIB_NAME_NATIVE_MARKDOWN = "stendal"
const val LIB_NAME_NATIVE_MARKDOWN_V2 = "finalmarkdown"
} }
} }
object NativeLibraries { object NativeLibraries {
fun init() { fun init() {
System.loadLibrary(NativeLibrary.LIB_NAME_NATIVE_MARKDOWN) System.loadLibrary(NativeLibrary.LIB_NAME_NATIVE_MARKDOWN)
System.loadLibrary(NativeLibrary.LIB_NAME_NATIVE_MARKDOWN_V2)
Stendal.init() Stendal.init()
FinalMarkdown.init(BuildConfig.DEBUG)
} }
} }

View File

@ -28,13 +28,10 @@ import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.SpanStyle
import androidx.compose.ui.text.buildAnnotatedString
import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.navigation.NavController import androidx.navigation.NavController
import chat.stoat.R import chat.stoat.R
import chat.stoat.ui.theme.FragmentMono
enum class LabsHomeScreenTab { enum class LabsHomeScreenTab {
Home, Home,
@ -178,15 +175,6 @@ fun LabsHomeScreen(navController: NavController, topNav: NavController) {
} }
) )
HorizontalDivider() HorizontalDivider()
ListItem(
headlineContent = {
Text("Final Markdown")
},
modifier = Modifier.clickable {
navController.navigate("sandboxes/finalmarkdown")
}
)
HorizontalDivider()
ListItem( ListItem(
headlineContent = { headlineContent = {
Text("Gradient Editor") Text("Gradient Editor")

View File

@ -13,7 +13,6 @@ import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController import androidx.navigation.compose.rememberNavController
import chat.stoat.api.settings.FeatureFlags import chat.stoat.api.settings.FeatureFlags
import chat.stoat.screens.labs.ui.mockups.NewLoginExperienceMockup import chat.stoat.screens.labs.ui.mockups.NewLoginExperienceMockup
import chat.stoat.screens.labs.ui.sandbox.FinalMarkdownSandbox
import chat.stoat.screens.labs.ui.sandbox.GradientEditorSandbox import chat.stoat.screens.labs.ui.sandbox.GradientEditorSandbox
import chat.stoat.screens.labs.ui.sandbox.JBMSandbox import chat.stoat.screens.labs.ui.sandbox.JBMSandbox
import chat.stoat.screens.labs.ui.sandbox.NewCardSandboxScreen import chat.stoat.screens.labs.ui.sandbox.NewCardSandboxScreen
@ -75,9 +74,6 @@ fun LabsRootScreen(topNav: NavController) {
composable("sandboxes/jbm") { composable("sandboxes/jbm") {
JBMSandbox(labsNav) JBMSandbox(labsNav)
} }
composable("sandboxes/finalmarkdown") {
FinalMarkdownSandbox(labsNav)
}
composable("sandboxes/gradienteditor") { composable("sandboxes/gradienteditor") {
GradientEditorSandbox(labsNav) GradientEditorSandbox(labsNav)
} }

View File

@ -1,87 +0,0 @@
package chat.stoat.screens.labs.ui.sandbox
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.material3.TextField
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.style.TextOverflow
import androidx.navigation.NavController
import chat.stoat.ndk.FinalMarkdown
import chat.stoat.settings.dsl.SettingsPage
@Composable
fun FinalMarkdownSandbox(navController: NavController) {
var mdSource by remember { mutableStateOf("") }
var submitMdSource by remember { mutableStateOf<String?>(null) }
LaunchedEffect(submitMdSource) {
submitMdSource?.let {
FinalMarkdown.process(it)
}
}
SettingsPage(
navController = navController,
title = {
Text(
text = "Final Markdown Sandbox",
maxLines = 1,
overflow = TextOverflow.Ellipsis,
)
}
) {
Subcategory(
title = { Text("Source", maxLines = 1, overflow = TextOverflow.Ellipsis) },
) {
TextField(
value = mdSource,
onValueChange = { mdSource = it },
label = { Text("Markdown source") },
modifier = Modifier.fillMaxWidth()
)
TextButton(onClick = {
submitMdSource = mdSource
}) {
Text("Submit")
}
TextButton(onClick = {
submitMdSource = """# Full range of MD now supported!
1. Text with **bold**, *italics*, and ***both***!
2. You ~~can't see me~~.
3. [I'm a link to another website.](<https://revolt.chat>)
4. I'm a spoiler with ||**bold text inside it**||
- I'm a sub-item on this list...
- Let's go even deeper...
`Inline code`
```js
let x = "I'm a multi-line code block!";
```
> > ${'$'}${'$'}E = mc^2${'$'}${'$'}
>
> Albert Einstein
| Timestamp | Mention | Channel Link | Message Link |
|:-:|:-:|:-:|:-:|
| <t:1663846662:f> | <@01EX2NCWQ0CHS3QJF0FEQS1GR4> | <#01H73F4RAHTPBHKJ1XBQDXK3NQ> | https://revolt.chat/server/01F7ZSBSFHQ8TA81725KQCSDDP/channel/01F92C5ZXBQWQ8KY7J8KY917NM/01J25XZM9JXVVJDDKFPB7Q48HZ |"""
}) {
Text("Submit test document")
}
Subcategory(
title = { Text("Output", maxLines = 1, overflow = TextOverflow.Ellipsis) },
) {
Text("TBD!")
}
}
}
}

View File

@ -1,6 +1,5 @@
import { resolve } from "jsr:@std/path" import { resolve } from "jsr:@std/path"
import { parseArgs } from "jsr:@std/cli/parse-args" import { parseArgs } from "jsr:@std/cli/parse-args"
import { ZipReader, Uint8ArrayReader, Uint8ArrayWriter } from "jsr:@zip-js/zip-js"
const args = parseArgs(Deno.args, { const args = parseArgs(Deno.args, {
boolean: ["yes", "y", "auto-accept"], boolean: ["yes", "y", "auto-accept"],
@ -12,11 +11,8 @@ const args = parseArgs(Deno.args, {
const autoAccept = args.yes || args["auto-accept"] const autoAccept = args.yes || args["auto-accept"]
const outputFolderParent = resolve(Deno.cwd(), "app", "src", "main", "assets") const outputFolderParent = resolve(Deno.cwd(), "app", "src", "main", "assets")
const jniLibsFolder = resolve(Deno.cwd(), "app", "src", "main", "jniLibs")
try { try {
Deno.statSync(outputFolderParent) Deno.statSync(outputFolderParent)
Deno.statSync(jniLibsFolder)
} catch (_) { } catch (_) {
console.error( console.error(
"\x1b[31m" + // red "\x1b[31m" + // red
@ -333,80 +329,4 @@ for (const dep of deps) {
console.log(`Downloaded ${dep.file} to ${file}`) console.log(`Downloaded ${dep.file} to ${file}`)
} }
const libsQuery = "https://git.revolt.chat/api/v1/repos/android/final-markdown/releases/latest"
console.log("The script will now query the Revolt version control server for the latest version"
+ " of the final-markdown native library and download it. If you do not wish to use pre-built"
+ " libraries, you can build final-markdown yourself from the source code at"
+ " https://git.revolt.chat/android/final-markdown, and copy the files to the"
+ " app/src/main/jniLibs folder. Note the files that are downloaded are exactly the same as"
+ " the ones we use for the app on Google Play, so you can be sure they are safe to use.")
if (!autoAccept) {
console.log(`Will now query ${libsQuery} for the latest version of the library and download it.`)
if (!confirm("Continue?")) {
console.log("Aborted.")
Deno.exit(0)
}
} else {
console.log(`Will now query ${libsQuery} for the latest version of the library and download it. (auto-accepted)`)
}
const queryLibsRes = await fetch(libsQuery)
if (!queryLibsRes.ok) {
console.error(`Failed to fetch the latest library version: ${queryLibsRes.status} ${queryLibsRes.statusText}`)
Deno.exit(1)
}
const libsJson = await queryLibsRes.json()
const zipUrl = libsJson
.assets
.find((asset: { name: string }) => asset.name === "jniLibs.zip")?.browser_download_url
if (!zipUrl) {
console.error("No jniLibs.zip found in the latest release.")
Deno.exit(1)
}
const libsRes = await fetch(zipUrl)
if (!libsRes.ok) {
console.error(`Failed to fetch the jniLibs.zip: ${libsRes.status} ${libsRes.statusText}`)
Deno.exit(1)
}
const libsData = await libsRes.arrayBuffer()
const libArchitectures = ["arm64-v8a", "armeabi-v7a", "x86", "x86_64"]
const zipFileBytes = new Uint8Array(libsData)
const zipReader = new ZipReader(new Uint8ArrayReader(zipFileBytes))
const entries = await zipReader.getEntries()
const createDirPromises = libArchitectures.map(arch => {
const dirPath = resolve(jniLibsFolder, arch)
return Deno.mkdir(dirPath, { recursive: true })
})
await Promise.all(createDirPromises)
const writeFilePromises = libArchitectures.map(async arch => {
const filePathInZip = `${arch}/libfinalmarkdown.so`
const entry = entries.find(e => e.filename === filePathInZip)
if (!entry) {
throw new Error(`Expected file not found in zip: ${filePathInZip}`)
}
const writer = new Uint8ArrayWriter()
const fileData = await entry.getData!(writer)
const destinationPath = resolve(jniLibsFolder, filePathInZip)
return Deno.writeFile(destinationPath, fileData)
})
await Promise.all(writeFilePromises)
// Close the zip reader
await zipReader.close()