0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

flexmark-java で WikiLink を有効にし、リンク URL の解決をカスタマイズする

Last updated at Posted at 2025-12-02

概要

Java の Markdown パーサーライブラリ flexmark-java を利用してMarkdown を HTML に変換する際、WikiLink を有効にし、リンク URL の解決をカスタマイズする 例です。

発端は、自作の GitBucket Markdown Enhanced Pluginが、GitBucketの Wiki・Issues・コメントでも使えるようにするため GitBucket を修正している中、自作プラグインが WikiLink を期待通りにレンダリングしないことに気づいたためです。

Scala で開発している関係上、Java ではなく Scala での例です。Java で同様のことをしたい場合は、参考リンクを参照してください。

前回の記事

関連記事

そもそも WikiLink とは

ソースに [[ページ名]] と記述すると HTML に変換した際に Wiki の当該ページへのリンクに変換される記法です。

WikiLinkExtension の有効化

Parser.EXTENSIONS に渡す拡張機能のシーケンスに WikiLinkExtension.create() を加えます。

    val extension: Seq[Extension] = Seq(
      ...
      WikiLinkExtension.create(),
      ...
    )

    options.set(Parser.EXTENSIONS, extension.asJava)

asJava による変換は、Scala 2.13.0 以降、deprecated らしいので近日修正予定です。
deprecated なのは、collection.JavaConverters であり、代わりに scala.jdk.CollectionConverters を使えとのことでした。

JavaConverters による変換は、Scala 2.13.0 以降、deprecated だってさ(今さら?)

以上で WikiLink の変換が有効になりますが、生成されるリンクが期待通りに解決できません。

前回作成した LinkResolver の派生クラス MarkdownEnhancedLinkResolver が適用されず、内部の WikiLinkLinkResolver を使うようです。

独自のノードレンダラーを使用する

既存の MarkdownEnhancedNodeRenderer に NodeRenderingHandler とレンダリングメソッドを加えました。

getNodeRenderingHandlers メソッドで追加予定の renderWikiLink メソッドを登録しました。

  override def getNodeRenderingHandlers()
      : util.Set[NodeRenderingHandler[_ <: Object]] = {
    // 既存の処理は省略
    set.add(new NodeRenderingHandler[WikiLink](
      classOf[WikiLink],
      this.renderWikiLink
    ))
    set
  }

renderWikiLink メソッドを実装しました。

  private def renderWikiLink(
      node: WikiLink,
      context: NodeRendererContext,
      html: HtmlWriter
  ): Unit = {
    val link = node.getLink()
    val resolvedLink = context.resolveLink(
      com.vladsch.flexmark.html.renderer.LinkType.LINK,
      link,
      null
    )
    html
      .withAttr()
      .attr("href", resolvedLink.getUrl())
      .tag("a")
    html.text(node.getLink())
    html.tag("/a")
  }

以上で前回作成した LinkResolver の派生クラス MarkdownEnhancedLinkResolver が、使われるようになりました。

参考リンク

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?