vsch / flexmark-java

CommonMark/Markdown Java parser with source level AST. CommonMark 0.28, emulation of: pegdown, kramdown, markdown.pl, MultiMarkdown. With HTML to MD, MD to PDF, MD to DOCX conversion modules.
BSD 2-Clause "Simplified" License
2.21k stars 260 forks source link

Unable to load custom FormatterExtension #579

Open SageJustus opened 1 year ago

SageJustus commented 1 year ago

I follow CustomLinkResolverSample.java example and Render AST as Markdown with Formatting Options to implement custom parsing link, but not working.

fun main() {
    val str = "![cover](https://www.google.com)"
    val options = PegdownOptionsAdapter.flexmarkOptions(
        Extensions.ALL
    )
    val parser = Parser.builder(options).build()
    val document = parser.parse(str)
    val formatOptions = MutableDataSet()
        .set(Parser.EXTENSIONS, Parser.EXTENSIONS.get(options))
        .set(
            Parser.EXTENSIONS,
            Collections.singletonList(SageFormatterExtension.create()) as Collection<Extension>
        )
    val render = Formatter.builder(formatOptions).build()
    val result = render.render(document)
    println(result)
}

SageFormatterExtension

class SageFormatterExtension: FormatterExtension {
    override fun rendererOptions(options: MutableDataHolder?) {
    }

    override fun extend(formatterBuilder: Formatter.Builder) {
        formatterBuilder.linkResolverFactory(DocxLinkResolver.Factory)
    }

    companion object {
        fun create(): SageFormatterExtension {
            return SageFormatterExtension()
        }
    }
}

DocxLinkResolver

class DocxLinkResolver(val context: LinkResolverBasicContext) : LinkResolver {

    override fun resolveLink(node: Node, context: LinkResolverBasicContext, link: ResolvedLink): ResolvedLink {
        println("resolveLink")
        return link
    }

    object Factory : LinkResolverFactory {
        override fun apply(context: LinkResolverBasicContext): LinkResolver {
            return DocxLinkResolver(context)
        }

        override fun getAfterDependents(): MutableSet<Class<*>>? {
            return null
        }

        override fun getBeforeDependents(): MutableSet<Class<*>>? {
            return null
        }

        override fun affectsGlobalScope(): Boolean {
            return false
        }

    }

}

println("resolveLink") did not run, indicating that the extension was not loaded.