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>