概要
GitBucket用のプラグイン GitBucket Markdown Enhanced Pluginを開発しています。
GitBucket Markdown Enhanced Plugin は、GitBucket 標準のマークダウンレンダリングエンジンを置き換えるプラグインです。
目標は、Visual Studio Code の Markdown Preview Enhanced 向けの markdown ファイルを軽易に Web で共有できる環境です。
今まで以下のインライン要素を独自で追加してきました。
-
Mark(
==Marked==と書くと<mark>Marked</mark>に変換されます。) - URLの自動リンク
- Markdown Preview Enhanced 互換の数式
ところが、数式の記法について職場向けに説明を作っている際に表に埋め込むと例外が発生して描画に失敗する事象に気づいたので対処した話です。
前回の記事
表に独自のインライン要素を入れる例外が発生し描画に失敗していた
KaTeX による数式を表に埋め込むと以下の例外が発生してページ全体の表示ができない問題に気づきました。
java.lang.StringIndexOutOfBoundsException: endIndex: 321 out of range: [0, 0]
この際、flexmark-java の GitLab Flavoured Markdown という拡張機能による記法では、同事象は発生しませんでした。
GitLab Flavoured Markdown での処理を調査してみる
GitLab Flavoured Markdown における 数式用の AST1 用ノードは、flexmark-ext-gitlab/src/main/java/com/vladsch/flexmark/ext/gitlab/GitLabInlineMath.java で定義されていました。
public class GitLabInlineMath extends Node implements DelimitedNode {
src/main/scala/io/github/yasumichi/gme/InlineKaTeX.scala との違いは、com.vladsch.flexmark.util.ast.Node クラスを継承するだけではなく、com.vladsch.flexmark.util.ast.DelimitedNode インターフェースを同時に継承していることです。
同様の方法に実装を修正すれば、問題に対処できるのではないか思い、インラインパーサーの処理を確認してみることにしました。
GitLab Flavoured Markdown における 数式用のインラインパーサーは、flexmark-ext-gitlab/src/main/java/com/vladsch/flexmark/ext/gitlab/internal/GitLabInlineMathParser.javaで定義されていました。
対処を行ったコミット
調査を元に対処を行ったのが以下3つのコミットです。(数式、マーク、自動リンクの順)
- Fixed a bug that caused an exception when writing a formula in a table. · yasumichi/gitbucket-markdown-enhanced@bd3f62a
- Fixed a bug that caused an exception when writing a mark in a table. · yasumichi/gitbucket-markdown-enhanced@6ea3b56
- Fixed a bug that caused an exception when writing a URI in a table · yasumichi/gitbucket-markdown-enhanced@0bca60a
数式とマークは、com.vladsch.flexmark.util.ast.DelimitedNode インターフェースを継承しました。
自動リンクは、対象部分を囲む書式がないので com.vladsch.flexmark.util.ast インターフェースを継承するようにしました。
以上で表に埋め込んでも例外が発生しないようになりました。