404 motivation not found | t_ishidaのブログ

11月/07

29

外部ファイルの読み込み

前置き

JScriptで何かする時、毎度毎度、

いつも使うやつをコピペするのがめんどくさくて

共通関数を別ファイルに保存しておいて、

そいつを読み込むにはどうしたら良いか?

で、書いたのがこれ

テンプレート

//これは消しちゃイヤン
//実際使う時には、全部改行とインデントを削除してもOKです
function $(l,m){
var W=WScript,src='',f=new ActiveXObject("Scripting.FileSystemObject");
try{
for(var i in l){
var fn=l[i];
if(!fn.match(/:/)){
var d=W.ScriptFullName.split("\\");
d.pop();
fn=d.join('/')+"/"+fn.replace(/^\//,'');
}
src+=f.OpenTextFile(fn).ReadALL();
}
eval("m="+m.toString().replace(/\( *\) *\{/,'(src){eval(src)')+";");
m(src);
}catch(e){
W.Echo(e.message);
}
}
/**************************************
 * 外部JSを読み込んでライブラリの機能を
 * 追加するためのテンプレート
 **************************************/
$(
//ライブラリのパスをここに書く
[
'lib.js'
] ,

//メインルーチンをここに書く
function(){
say('hello,world!!');
}
);

lib.js(コピるのが面倒だったファイルね)

function say( s ){ WScript.Echo(s); }
/***************************************
 * ログを書く
 ***************************************/
function writeLog( msg ){
var f = new ActiveXObject('Scripting.FileSystemObject');
try {
f.OpenTextFile(LOG_PATH).WriteLine( getDate(true) + ':' + msg  );
} catch(e) {
}
}
/***************************************
 * 日付
 ***************************************/
function getDate( nead_time ){
var d   = new Date();
var ret = d.getYear() + '/' +
( d.getMonth() + 1 ) + '/' +
d.getDate();
if( nead_time ){
ret += ' ';
ret += d.getHours() + ':' +
d.getMinutes() + ':' +
d.getSeconds();
}
return ret;
}
/**********************************************
 * ファイルをコピーする
 * @param from コピー元
 * @param to   コピー先
 ***********************************************/
function copyFile( from, to )  {
if( !F.FileExists(from) ) return from + 'って言われても、んなの無いよ。';
if( !F.FileExists(to) )   return to + 'って言われても、んなの無いよ。';
F.FileCopy(from , to );
}
/**********************************************
 * 指定文字数分だけ、左に指定文字を付け加える
 * @param path 読み込むテキストファイル
 ***********************************************/
function LPAD( s, len ,chr)        {
var x = s   || '';
var c = chr || ' ';
while( len > x.length ) x = c + x;
return x;
}
/**********************************************
 * 指定文字数分だけ、右に指定文字を付け加える
 * @param path 読み込むテキストファイル
 ***********************************************/
function RPAD( s, len ,chr )        {
var x = s   || '';
var c = chr || ' ';
while( len > x.length ) x = x + c;
return x;
}

・・・・

・・・

いや、言いたい事は分かる。

僕も、これは気持ち悪いんだ。

はじめperlなrequireにしようと思って、

//実装イメージね
require("lib.js");
function require(f){
eval( new ActiveXObject("Scripting.FileSystemObject").OpenTextFile(f).ReadALL() );
}
say("Hello,World!!");

と、脊髄反射的にやってみたんだが、なんだか上手くいかない。

これは「ひょっとして、function抜けたら、evalの内容がクリアされるの?」と、

思って以下を試してみた。

function require(f){
eval( new ActiveXObject("Scripting.FileSystemObject").OpenTextFile(f).ReadALL() );
say("Hello,World・・・");
}
say("Hello,World!!");

そしたら、やっぱりrequireの中のHello,World・・・は成功して、

外に戻ってきたHello,World!!は上手くいかない。

ちょっと、考えたら当たり前なんだけどね。

function require(f){
eval( new ActiveXObject("Scripting.FileSystemObject").OpenTextFile(f).ReadALL() );
//で、evalした事により↓がここに書かれたイメージ
//function say(s){WScript.Echo(s); }
say("Hello,World・・・");
}
//で、↓が、ここで呼べるわけが無い。 
say("Hello,World!!");

と、言うわけで、

メインルーチンでもevalした結果を使えるようにって考えたら、

ああなったの。

何しているか見えないと気持ち悪いと思うんで、

一行目の謎コードにインデントつけた奴を以下に。

function $(l,m){
var W=WScript,src='',f=new ActiveXObject("Scripting.FileSystemObject");
try{
for(var i in l){
var fn=l[i];
if(!fn.match(/:/)){
//パスの保管
var d=W.ScriptFullName.split("\\");
d.pop();
fn=d.join('/')+"/"+fn.replace(/^\//,'');
}
src+=f.OpenTextFile(fn).ReadALL();
}
//メインルーチンのところの「function(){」を「function(src){eval(src)」
//として、mainルーチンのアタマで強制的にevalする
eval("m="+m.toString().replace(/\( *\) *\{/,'(src){eval(src)')+";");
m(src);
}catch(e){
W.Echo(e.message);
}
}

今、気づいたんだけど、

ここまで外部ファイルのincludeを隠蔽する必要が有ったのか?

結局、テンプレートは貼らなきゃイケナイじゃん。

なら普通にメインルーチンでevalしてやれば良いじゃん。

と言う訳で、orz

Share and Enjoy:
  • Digg
  • del.icio.us
  • Google Bookmarks
  • Tumblr
  • email
  • Facebook
  • FriendFeed

RSS Feed

コメントはまだありません。

Leave a comment!

<< 後で書いた

次の構想 >>

Find it!

Theme Design by devolux.org

Tag Cloud