概要
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 を使えとのことでした。
以上で 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 が、使われるようになりました。