sample, add exclude from parsing

This commit is contained in:
Dimitry Ivanov 2020-11-12 01:54:33 +03:00
parent ac578906d3
commit 08a8cece61
4 changed files with 148 additions and 1 deletions

View File

@ -1,4 +1,29 @@
[
{
"javaClassName": "io.noties.markwon.app.samples.ExcludeFromParsingSample",
"id": "20201111221945",
"title": "Exclude part of input from parsing",
"description": "Exclude part of input from parsing by splitting input with delimiters",
"artifacts": [
"CORE"
],
"tags": [
"parsing"
]
},
{
"javaClassName": "io.noties.markwon.app.samples.parser.CustomHeadingParserSample",
"id": "20201111221207",
"title": "Custom heading parser",
"description": "Custom heading block parser. Actual parser is not implemented",
"artifacts": [
"CORE"
],
"tags": [
"heading",
"parsing"
]
},
{
"javaClassName": "io.noties.markwon.app.samples.editor.WYSIWYGEditorSample",
"id": "20200908133515",

View File

@ -0,0 +1,75 @@
package io.noties.markwon.app.samples
import android.text.SpannableStringBuilder
import io.noties.debug.Debug
import io.noties.markwon.Markwon
import io.noties.markwon.app.sample.Tags
import io.noties.markwon.app.sample.ui.MarkwonTextViewSample
import io.noties.markwon.sample.annotations.MarkwonArtifact
import io.noties.markwon.sample.annotations.MarkwonSampleInfo
import java.util.regex.Pattern
@MarkwonSampleInfo(
id = "20201111221945",
title = "Exclude part of input from parsing",
description = "Exclude part of input from parsing by splitting input with delimiters",
artifacts = [MarkwonArtifact.CORE],
tags = [Tags.parsing]
)
class ExcludeFromParsingSample : MarkwonTextViewSample() {
override fun render() {
// cannot have continuous markdown between parts (so a node started in one part and ended in other)
// with this approach
// also exclude will start a new block and won't seamlessly continue any existing markdown one (so
// if started inside a blockquote, then blockquote would be closed)
val md = """
# Hello
we are **going** to exclude some parts of this input _from_ parsing
$EXCLUDE_START
what is **good** is that we
> do not need to care about blocks or inlines
* and
* everything
* else
$EXCLUDE_END
**then** markdown _again_
and empty exclude at end: $EXCLUDE_START$EXCLUDE_END
""".trimIndent()
val markwon = Markwon.create(context)
val matcher = Pattern.compile(RE, Pattern.MULTILINE).matcher(md)
val builder by lazy(LazyThreadSafetyMode.NONE) {
SpannableStringBuilder()
}
var end: Int = 0
while (matcher.find()) {
val start = matcher.start()
Debug.i(end, start, md.substring(end, start))
builder.append(markwon.toMarkdown(md.substring(end, start)))
builder.append(matcher.group(1))
end = matcher.end()
}
if (end != md.length) {
builder.append(markwon.toMarkdown(md.substring(end)))
}
markwon.setParsedMarkdown(textView, builder)
}
private companion object {
const val EXCLUDE_START = "##IGNORE##"
const val EXCLUDE_END = "--IGNORE--"
const val RE = "${EXCLUDE_START}([\\s\\S]*?)${EXCLUDE_END}"
}
}

View File

@ -0,0 +1,47 @@
package io.noties.markwon.app.samples.parser
import io.noties.markwon.AbstractMarkwonPlugin
import io.noties.markwon.Markwon
import io.noties.markwon.app.sample.Tags
import io.noties.markwon.app.sample.ui.MarkwonTextViewSample
import io.noties.markwon.core.CorePlugin
import io.noties.markwon.sample.annotations.MarkwonArtifact
import io.noties.markwon.sample.annotations.MarkwonSampleInfo
import org.commonmark.node.Heading
import org.commonmark.parser.Parser
import org.commonmark.parser.block.BlockParserFactory
import org.commonmark.parser.block.BlockStart
import org.commonmark.parser.block.MatchedBlockParser
import org.commonmark.parser.block.ParserState
@MarkwonSampleInfo(
id = "20201111221207",
title = "Custom heading parser",
description = "Custom heading block parser. Actual parser is not implemented",
artifacts = [MarkwonArtifact.CORE],
tags = [Tags.parsing, Tags.heading]
)
class CustomHeadingParserSample : MarkwonTextViewSample() {
override fun render() {
val md = "#Head"
val markwon = Markwon.builder(context)
.usePlugin(object : AbstractMarkwonPlugin() {
override fun configureParser(builder: Parser.Builder) {
val enabled = CorePlugin.enabledBlockTypes()
.filter { it != Heading::class.java }
.toSet()
builder.enabledBlockTypes(enabled)
builder.customBlockParserFactory(MyHeadingBlockParserFactory)
}
})
.build()
markwon.setMarkdown(textView, md)
}
object MyHeadingBlockParserFactory : BlockParserFactory {
override fun tryStart(state: ParserState, matchedBlockParser: MatchedBlockParser): BlockStart {
// TODO("Not yet implemented")
return BlockStart.none()
}
}
}