このブログの更新は Twitterアカウント @m_hiyama で通知されます。
Follow @m_hiyama

メールでのご連絡は hiyama{at}chimaira{dot}org まで。

はじめてのメールはスパムと判定されることがあります。最初は、信頼されているドメインから差し障りのない文面を送っていただけると、スパムと判定されにくいと思います。

参照用 記事

RhinoのreadFileとload、カレントディレクトリ対応

「Rhinoに基本ディレクトリコマンドを実装する」

pwdやcdを作っても、もともとの目的は達成されませんでした。その目的とは、loadやreadFileのデフォルトディレクトリを変えることです。Javaのレベルでuser.dirを変更しても、Rhinoが保持している(と思われる)デフォルトディレクトリに影響はないようです。残念。

readFile, loadを上書きしてしまえばいいようです。例外が起きたときのエラーメッセージとかが不格好なんですが、とりあえず動作します。


/* load.js */

// このファイルが2度以上読まれたときへの対処
if (!("orig_load" in this)) {
this.orig_load = load;
}
if (!("orig_readFile" in this)) {
this.orig_readFile = readFile;
}

// 相対パス絶対パスに直す、絶対パスならそのまま
function completePath(file) {
var path;
if (file.match(/^[\\\/]/) || file.match(/^[A-Z]:[\\\/]/i)) {
// absolute path
path = file;
} else {
var sep = environment["file.separator"];
path = environment["user.dir"] + sep + file;
}
return path;
}

// カレントディレクトリを考慮するreadFile
function my_readFile(file) {
var path = completePath(file);
return orig_readFile(path);
}

// カレントディレクトリを考慮するload
function my_load(file) {
var path = completePath(file);
return orig_load(path);
}

// load, readFileを、自前関数で上書きする
this.load = my_load;
this.readFile = my_readFile;

loadは、eval(my_readFile(file)) でいいかと思いましたが、オリジナルのloadとは挙動が変わってしまいますね。