Index > Markdown記法をJavaで扱いたい...Scripting for the Java と showdownを組み合わせる
Wed, March 12, 2008

Markdown記法をJavaで扱いたい...Scripting for the Java と showdownを組み合わせる

軽量マークアップ言語のデファクトスタンダードと言えば、どうやら markdownらしい。
markdownは、さまざまなウェブアプリケーション、ブログライティングツールに 組み込まれているようですが、 Windows上で扱えるツールはあまりないようです。
ちょっとしたメモをmarkdown記法で書きたいときに、 メモ帳(notepad.exe)なみに簡単に扱えて、結果を即座に確認できる ツールがないかと思いましたが、 ネットで見つけられなかったので、自作しました。(自作中です。)

実現方法の検討

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の間で データ(文字列)の受け渡しをしました。

変換のたびに、new Showdown.converter() としてインスタンスをつくるのは 効率の点でどうなの?と思いますが、とりあえずこれで機能しそうです。

次回は、Java側でテキストエディタと簡易ブラウザを追加して、 {u:Markdown記法をプレビューしながらテキスト編集できるメモ帳なみに気軽なツール...mdpad.jar} を実装してみます。

参考

 Twitter
follow me on Twitter
 Categories