Markdown記法をJavaで扱いたい...Scripting for the Java と showdownを組み合わせる
軽量マークアップ言語のデファクトスタンダードと言えば、どうやら
markdownらしい。
markdownは、さまざまなウェブアプリケーション、ブログライティングツールに
組み込まれているようですが、
Windows上で扱えるツールはあまりないようです。
ちょっとしたメモをmarkdown記法で書きたいときに、
メモ帳(notepad.exe)なみに簡単に扱えて、結果を即座に確認できる
ツールがないかと思いましたが、
ネットで見つけられなかったので、自作しました。(自作中です。)
実現方法の検討
- markdownj というmarkdownのJava版を使う
- showdownというJavaScriptによる実装を使って、Java6で実装された JSR233 Scripting for the Java Platform 経由で変換 という二つの方法が考えられる。
markdownjというJava版の実装を使うのが一番素直な方法なのだが、 今後の展開・つぶしの利き具合いから判断して、 JavaScript版Markdown=showdown を使うことにしました。
JavaからJavaScriptを使う
Sunのサイト Javaプラットフォームのスクリプトにあるように、Java SE 6 からは、Javax.script パッケージが追加され、 フツーにJavaからJavaScript(などのスクリプト)が使えるようになりました。
お約束のHelloWorldは、Javaスクリプトプラグラマーズガイドにありますので、そちらをご覧ください。
Javaからshowdownを使う
showdown のサイトからソースコード(showdown-v0.9.zip)を入手します。 展開して、showdown.js を入手します。
showdown.js を見るとファイルの先頭に使い方が書いてあります。(簡単ですね)
// Showdown usage:
//
// var text = "Markdown *rocks*.";
//
// var converter = new Showdown.converter();
// var html = converter.makeHtml(text);
//
// alert(html);
今回のポイントは、 単にJavaScriptをJavaから実行するだけでなく、 JavaとJavaScriptの間でデータの受け渡しが必要なことです。
結局以下のようにしました。
import java.io.*;
import javax.script.*;
public class HelloShowdown {
public static void main(String[] args) throws Exception {
ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine engine = factory.getEngineByName("JavaScript");
File f=new File("showdown.js");
FileReader r=new FileReader(f);
engine.eval(r);
r.close();
engine.eval("function toHtml(text){ var html=new Showdown.converter().makeHtml(text); return html; }");
String text="Markdown *rocks*.";
Invocable inv = (Invocable) engine;
Object obj=inv.invokeFunction("toHtml", text );
System.out.println( obj );
}
}
いろいろやり方はあるのでしょうが、
以下のようにしてJavaとJavaScriptの間で
データ(文字列)の受け渡しをしました。
- (基本方針)Invocable インタフェースの invokeFunction() メソッドを使う
- invokeFunction() メソッドでトップレベルの関数にアクセスする方法しかわからなかったので、トップレベルにtoHtml() という関数を追加
- invokeFunction("toHtml",text) でJavaからJavaScript(showdown.js)の関数を呼び出してMarkdown記法のテキストをHTMLに変換
変換のたびに、new Showdown.converter() としてインスタンスをつくるのは 効率の点でどうなの?と思いますが、とりあえずこれで機能しそうです。
次回は、Java側でテキストエディタと簡易ブラウザを追加して、 {u:Markdown記法をプレビューしながらテキスト編集できるメモ帳なみに気軽なツール...mdpad.jar} を実装してみます。