Index > Markdown記法をJavaで変換する 【showdown.js + Rhino】の利用(showdown,markdown,javascript,rhino,java)
Wed, February 18, 2009

Markdown記法をJavaで変換する 【showdown.js + Rhino】の利用(showdown,markdown,javascript,rhino,java)

Markdown記法をJavaで扱いたい では、Java6の JSR233 Scripting for the Java Platform のJavaにJavaScriptを埋め込んで使う方法を使った。

Java5以前の環境で showdown.js をJavaから使いたくなったので、その調査結果のメモ。

JavaにJavaScriptを埋め込む

Java5以前の環境でJavaからJavascriptを使うには、以下のページがそのまま参考になります。

いきなり、org.mozilla.javascript というパッケージが出てきそれどこにあるの?と思いましたが、 rhinoをダウンロードして展開した、js.jar の中に含まれています。

Javaから showdown.js を使う

それでは、Javaから showdown.js を使って、markdown記法されたテキストファイルをHTMLに変換します。

必要なファイル1) showdown.js

showdown からソースコード(showdown-v0.9.zip)を入手します。 展開して、showdown.js をカレントディレクトリにコピーしておきます。

必要なファイル2) js.jar

http://www.mozilla.org/rhino/から rhino1_7R1.zip をダウンロードして展開、js.jar をカレントディレクトリにコピーしておきます。

必要なファイル3) HelloShowdown.java

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;

import org.mozilla.javascript.Context;
import org.mozilla.javascript.Function;
import org.mozilla.javascript.Scriptable;

public class HelloShowdown {

    private static final String RET=System.getProperty("line.separator");

    private static String getShowdownCode() throws Exception {

        StringBuffer sb=new StringBuffer();
        {
            File f=new File("showdown.js");
            BufferedReader br=new BufferedReader( new FileReader(f) );

            String line=null;
            while ( (line=br.readLine())!=null ) {
                sb.append(line).append(RET);
            }
            br.close();
        }

        return sb.toString();
    }

    public static void main(String args[]) {

        // 1)

        String mdtext = "";
        for (int i=0; i < args.length; i++) {
            mdtext += args[i];
        }

        System.out.println( mdtext );

        if (mdtext.equals("")) {
            mdtext="#Hello World.";
        }


        // 2)

        Context cx = Context.enter();

        try {
            Scriptable scope = cx.initStandardObjects();

            String s = "function toHtml(text){ var html=new Showdown.converter().makeHtml(text); return html; }";
            s += RET;
            s += getShowdownCode();

            cx.evaluateString(scope, s, "<cmd>", 1, null);
            Object fObj = scope.get("toHtml", scope);
            if (!(fObj instanceof Function)) {
                System.out.println("error");
            } else {
                Object functionArgs[] = { mdtext };

                Function f = (Function)fObj;
                Object result = f.call(cx, scope, scope, functionArgs);
                String html = Context.toString(result);

                System.out.println(html);
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        finally {
            Context.exit();
        }
    }
}

HelloShowdown.java の名前で カレントディレクトリにコピーしておきます。

コンパイルとテスト

コンパイル

$ javac -classpath js.jar HelloShowdown.java

作動テスト

$ java -cp .:js.jar HelloShowdown "*Hello Showdown*"
<p><em>Hello Showdown</em></p>
 Twitter
follow me on Twitter
 Categories