image

  • フォト Amazonギフト券
    ※この時計の時刻は、閲覧しているパソコンのものであり、必ずしも正確な時間とは限りません

検索

最近のトラックバック

無料ブログはココログ

« xvcd で九九の表をつくる: jruby を利用して try中 | トップページ | ピックアップ:質疑問答の技術、Wikiで生産性を上げた企業, etc... »

2007-03-25

xvcd で九九の表をつくる: jruby を利用したケース

Xfytutorialplugin20070324

なんとか、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 ファイル中では <, > を&lt;, &gt; に置換して書き込んでいる。
mx、my はテーブルの横、縦の数を設定することができるようにしてある。

xml の内容の抜粋はこれ。

  <h:ruby1>

a = ""
a &lt;&lt; "&lt;table&gt;¥n"

  省略

a &lt;&lt; "&lt;/table&gt;¥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 を利用したケース:

« xvcd で九九の表をつくる: jruby を利用して try中 | トップページ | ピックアップ:質疑問答の技術、Wikiで生産性を上げた企業, etc... »

mokuji

2013年12月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        

google

  • twitter
  • __
  • _
    Googleボットチェッカー

合わせて読む

  • 合わせて読む
    フィードメーター - katoy: cocolog あわせて読みたい

リンク