=begin
= Ruby/JS Javascript engine for Ruby

これは、NJS Javascript Interpreter ((<URL:http://www.bbassett.net/njs/>))
を Ruby から利用するための拡張モジュールです。

現在の Version(0.0.4)では、以下のようなことが出来ます。

  % ruby -rjs -e 'p JS::evaluate(%!true!)'
  true
  % ruby -rjs -e 'p JS::evaluate(%!Math.PI!)'
  3.141592654
  % ruby -rjs -e 'p JS::evaluate(%q!new Date().toString()!)'
  "Mon Feb 24 12:39:15 2003"
  % ruby -r./js -e \
     'js = JS.new;p js.eval("a = new Array(5); a.length;"); \
      p js.eval("a.toString()")'
  5
  "undefined,undefined,undefined,undefined,undefined"
  % ruby -r./js -e \
     'js = JS.new;p js.eval(%q!a = new Array("a","b","cc",new Array(1,2,3.1414));!)' 
  ["a", "b", "cc", [1, 2, 3.1414]]

js.h には、たくさん API がありますが基本的には eval() を利用することで
ほぼ全ての機能が Rubyから使えるようです。

ただし、過度な期待は禁物です:-) 当然ですが NJS が提供する機能以上のことは
出来ません。
例えば window オブジェクトなどは存在しないので、alert()などはできませんし、 document.write() もムリです。利用する側がクラス宣言などをしてやる必要が
あります。

実装には、
* examples/simple.c
* w3m((<URL:http://w3m.sourceforge.net/>)) の js拡張((<URL:http://abe.nwr.jp/w3m/w3m-js.html>))
* Python用モジュール njsmodule ((<URL:http://www.itee.uq.edu.au/~leonard/personal/software/>))
を参考にさせてもらいました。

== インストール

まずは、NJS をインストールしてください。((% ./configure && make %)) してから((% sudo make install %)) するだけです。0.2.5 のみを Linux(Kondara-2.1/Plamo-3.0) のみで動作確認していますが、 他の OS でも動くでしょう。

拡張モジュール自体のインストールは
 % ruby extconf.rb
 % make
 % sudo make install

だけです。

== リファレンス

=== JS class
==== Class Method:
--- JS.evaluate(code)
    Javascript のコードを評価した値を返します。
    エラーの場合 JSError 例外を起こします。

--- JS.new()
    Javascript インタプリタのインスタンスを作ります。
--- JS#eval(code)
    インタプリタがコードを評価し結果の値を返します。
    エラーの場合 JSError 例外を起こします。

==== Constants:
--- JS::LIB_VERSION
    NJS のバージョンを返します。

=== JSError class
--- JSクラスの発生させる例外で、StandardError を継承してます。

== お約束

無保証です。ライセンスは、NJS同様 GPL2 とします。js.c を御覧ください。

== ChangeLog

Sat Mar 11 00:00:00 2003 
        * Version 0.0.4 release.
        * Add shim16to18.h
        * tested ruby-1.8.0-preview2
        * use SafeStringValue at rb_js_evalcode
        * rb_obj_taint() as result  at rb_js_evalcode

Sat Feb 29 00:00:00 2003 
        * Version 0.0.4rc.
        * rb_js_evaluate() change module_method to singleton_method
        * Add JS::new,JS#eval,rb_js_evalcode()
        * Add rb_js_convertvalue() recognize JS_TYPE_ARRAY
        * Add secure check in rb_js_evalcode() [$SAFE: 1]

Wed Feb 26 18:00:00 2003 
        * Version 0.0.3 released.
        * js.c(rb_js_evaluate): Add Check_Type()
        * README.rd.ja: rd2 strict.(thanx ZnZ.)
        * Add README.rd

Mon Feb 24 18:00:00 2003 
        * Version 0.0.2(RAA:ruby-js/[ruby-list:37169])
        * Add JS::evaluate
        * Add README.rd.ja

Sun Feb 23 18:00:00 2003 
        * Version 0.0.1(just start.)

たむらけんいち ((<tamura@ruby-lang.org|URL:mailto:tamura@ruby-lang.org>))
=end
