xvcd で九九の表をつくる: jruby を利用したケース
なんとか、xfy + jruby で 九九の表を生成/表示させることができた。
以下にソース一式を置いた。
- http://homepage2.nifty.com/youichi_kato/src.html
xfy で jruby を実行して九九の表をつくる (2007-03-24)
jruby 実行のスクリーンショット
jruby で生成した html のデータをそのままつかうのはあきらめ、template を apply させて table を生成した。
その前に jruby インタープリターインスタンスを毎回作らずに、 xpah 関数インスタンスのなかで一度だけ作るようにした。
--------
private final Ruby runtime = Ruby.getDefaultInstance();
public Value call(final Arguments args, final Context context)
throws ValueException {
// Checking the Number of Function Arguments
// example:hello(string) takes single argument
FunctionUtility.checkCount(context, args, 1);
// Evaluates the first argument as a string.
final Value v = args.getArgument(0);
final String rubyCode = v.getAsString();
String ans;
try {
RubyObject rubyStr = (RubyObject) runtime.evalScript(rubyCode);
ans = rubyStr.toString();
} catch (final Exception e) {
System.err.println(e);
ans = e.getMessage();
}
// Returns the result
if (ans == null) {
ans = "[null]";
}
return new StringValue(ans);
}
jruby のコードはこれ。
a = ""
a << "<table>¥n"
a << " <tr>¥n"
a << " <th></th>"
for x in 1..9
a << sprintf("<th>%d</th>", x)
end
a << " </tr>¥n"
for y in 1..9
a << " <tr>¥n"
a << sprintf(" <td>%d</td>", y)
for x in 1..9
a << sprintf("<td>%d</td>", x * y)
end
a << "¥n"
a << " </tr>¥n"
end
a << "</table>¥n"
a
実際の xml ファイル中では <, > を<, > に置換して書き込んでいる。
mx、my はテーブルの横、縦の数を設定することができるようにしてある。
xml の内容の抜粋はこれ。
<h:ruby1>
a = ""
a << "<table>¥n"
省略
a << "</table>¥n"
a
</h:ruby1>
xvcd の内容の抜粋はこれ。
<!-- ============== -->
<!-- eval ./text(), insert result in ../h:div -->
<xvcd:template match="h:ruby1">
<ctrl:trigger>
<ctrl:label>Show matrix</ctrl:label>
<xvcd:action event="ctrl:triggered">
<instruction:variable name="val"
select="example:ruby(./text())" />
<xvcd:delete select="../h:div/*" />
<xvcd:insert ref="../h:div" position="last-child">
<xvcd:copy-of select="function:xml-string-to-dom($val)" />
</xvcd:insert>
</xvcd:action>
</ctrl:trigger>
<ctrl:trigger>
<ctrl:label>Clear</ctrl:label>
<xvcd:action event="ctrl:triggered">
<xvcd:delete select="../h:div/*" />
</xvcd:action>
</ctrl:trigger>
</xvcd:template>
ループ処理は、xvcd よりは jruby だと格段に手軽に書けるなぁ。
ただ スクリプトに <, > をそのまま書けないので、読みにくい。
(CDATA で記述すればいいのか?)
jruby スクリプトを別ファイルに置いて、それを xvcd で読み込んで、<, > の置換をしてから実行するということも試みているが、まだうまく動作していない。
(公開ファイル中にはその試行ファイルも含まれています)
次は jruby 側の変数の read/write を xvcd 側から行うこと試していきたい。
複合文書を扱える xfy なら、アプリ(プラグイン)記述も複合言語(XSLT 系、他のスクリプト言語系) を扱えるようにするのが良いかもしれない。
« xvcd で九九の表をつくる: jruby を利用して try中 | トップページ | ピックアップ:質疑問答の技術、Wikiで生産性を上げた企業, etc... »
この記事へのコメントは終了しました。
« xvcd で九九の表をつくる: jruby を利用して try中 | トップページ | ピックアップ:質疑問答の技術、Wikiで生産性を上げた企業, etc... »
コメント