diff --git a/briar-desktop/build.gradle.kts b/briar-desktop/build.gradle.kts index 46303cba6e94d6faa0866160a0a432e4c8e0e8a4..e9bb07b9587309ee9ec4c32705ffbc0df88fa5bf 100644 --- a/briar-desktop/build.gradle.kts +++ b/briar-desktop/build.gradle.kts @@ -144,6 +144,7 @@ dependencies { exclude(group = "net.java.dev.jna", module = "jna") } + implementation("com.vladsch.flexmark:flexmark-all:0.64.8") implementation("com.vladsch.flexmark:flexmark-html2md-converter:0.64.8") kapt("com.google.dagger:dagger-compiler:$dagger_version") diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/blog/BlogPostView.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/blog/BlogPostView.kt index 1578e40444a68f6bc832ffb6a6629c899b0057a0..b173af058213c92dae445635590db9b45726aaec 100644 --- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/blog/BlogPostView.kt +++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/blog/BlogPostView.kt @@ -54,7 +54,14 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp +import com.vladsch.flexmark.ast.Text import com.vladsch.flexmark.html2md.converter.FlexmarkHtmlConverter +import com.vladsch.flexmark.parser.Parser +import com.vladsch.flexmark.util.ast.Document +import com.vladsch.flexmark.util.ast.NodeVisitor +import com.vladsch.flexmark.util.ast.VisitHandler +import com.vladsch.flexmark.util.ast.Visitor +import com.vladsch.flexmark.util.data.MutableDataSet import org.briarproject.bramble.api.sync.GroupId import org.briarproject.bramble.api.sync.MessageId import org.briarproject.briar.api.blog.BlogCommentHeader @@ -80,6 +87,7 @@ import org.briarproject.briar.desktop.utils.getRandomId import org.briarproject.briar.desktop.utils.getRandomString import kotlin.random.Random + @Suppress("HardCodedStringLiteral") fun main() = preview { Column(verticalArrangement = spacedBy(8.dp)) { @@ -139,6 +147,25 @@ fun main() = preview { } } +class MarkdownVisitor { + + fun run(document: Document) { + visitor.visit(document) + } + + // example of visitor for a node or nodes, just add VisitHandlers<> to the list + // any node type not handled by the visitor will default to visiting its children + var visitor: NodeVisitor = NodeVisitor( + VisitHandler(Text::class.java, Visitor { text: Text -> visit(text) }) + ) + + fun visit(text: Text) { + val string = text.getChars().unescape() + // TODO: do stuff with string + visitor.visitChildren(text) + } +} + @Composable @OptIn(ExperimentalFoundationApi::class) fun BlogPostView( @@ -151,6 +178,13 @@ fun BlogPostView( val text = item.text ?: "" val markdown = FlexmarkHtmlConverter.Builder().build().convert(text) + val options = MutableDataSet() + val parser: Parser = Parser.builder(options).build() + val md = parser.parse(markdown) + + val visitor = MarkdownVisitor() + visitor.run(md) + Row(modifier = Modifier.height(IntrinsicSize.Min)) { Column(modifier = Modifier.weight(1f)) { BlogPostViewHeader(item, onItemRepeat, onAuthorClicked, Modifier.padding(8.dp))