fc2ブログ


FC2カウンター
ブログ内検索
プロフィール

流星光輝

Author:流星光輝
InDesignを仕事で使っています。
まんどい作業をScriptで解決すべく
精進の日々を過ごしております。

カレンダー
11 | 2024/12 | 01
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 - - - -

spot遊び
AFDKOに含まれてるspot.exeで遊ぶとき、めっちゃ楽しいのですが、
InDesign上の適用しているフォント情報を使えないかなぁー、
って思う時ないですか? (ありますよね?w

普段ならVBで書いてしまうのですが、今回は敢えてExtendedScriptでやってみよー、ということで書いてみました。
※VBSを絡ませてるので、winのみで動作します。
win7(x86)+InDesignCS6の環境で、試しました。

jsxファイルと同じ階層にspot.exeが必要です。

コードはspotAsobi.jsxとかで保存しちゃってください。

#target 'InDesign'
// 【基本的な使い方】
// spot.exe -t hhea <FontFileFullPath>
// というように、コマンドラインで入力しますが、
// -t hheaだけを指示して、InDesignの選択している文字からフォントの場所を得て、
// var result=get_spot("-t hhea", app.selection[0].appliedFont.location);
// のように関数に渡すと、
// -t hhea
// の結果が返ってきます。

var result=get_spot("-t hhea", app.selection[0].appliedFont.location);
alert(result);
// 発展させて、下記のように受け取った結果をさらに加工してアラートすることも出来ますよ~!
alert(get_spot("-t hhea", app.selection[0].appliedFont.location).match(/ascender\s+=(\d+)/)[1]);

function get_spot(cmd, fnt){
    // spot.exeの存在確認
    var scp=File($.fileName).parent;
    var rslt=new File(scp+'/result.txt'); // 存在しなければ作る
    rslt.open('w'); rslt.close(); // 開いて閉じる
    // .create()とか使うほうが良いのかな?
    var spotPath=File(scp+'/spot.exe');
    if(!spotPath.exists){
        // spot.exeはjsxと同じ階層に存在してないので中断する
        return "[ERROR]spot.exeが見つかりません";
    }
    // fsNameを使ってc:\表記にする
    var toolPath=spotPath.fsName;
    var rsltPath=rslt.fsName;
    // ショートパスを得る ※本Scriptが空白を含む階層に置かれた場合を想定して
    vbs='app.scriptArgs.SetValue \"myTool\", CreateObject(\"Scripting.FileSystemObject\").GetFile(\"'+toolPath+'\").ShortPath';
    app.doScript(vbs, ScriptLanguage.visualBasic);
    var toolSPath=app.scriptArgs.getValue("myTool");
    // リダイレクトするファイルのショートパスを得る
    vbs='app.scriptArgs.SetValue \"myRSLT\", CreateObject(\"Scripting.FileSystemObject\").GetFile(\"'+rsltPath+'\").ShortPath';
    app.doScript(vbs, ScriptLanguage.visualBasic);
    var rsltSPath=app.scriptArgs.getValue("myRSLT");
    // 第2引数のフォントファイルパスをショートパスに変換
    vbs='app.scriptArgs.SetValue \"myFont\", CreateObject(\"Scripting.FileSystemObject\").GetFile(\"'+fnt+'\").ShortPath';
    app.doScript(vbs, ScriptLanguage.visualBasic);
    var fontSPath=app.scriptArgs.getValue("myFont");
    // spot.exeにコマンドとフォントファイルパスを渡す
    vbs='Set WSHShell=CreateObject(\"WScript.Shell\"):';
    vbs+='WSHShell.Run(\"cmd /c '+toolSPath+' '+cmd+' '+fontSPath+' > ';
    vbs+=rsltSPath+'\")';
    app.doScript(vbs, ScriptLanguage.visualBasic);
    // リダイレクトで出力した内容を読む。
    for(;;){ // 出力されるまで待つ
        var rslt=File(scp+'/result.txt'); 
        if(rslt.length!=0){ break; }
    }
    rslt.encoding="CP932"; // CP932の指定をしておく(念為
    var flg=rslt.open("r"); // 開く
    if(flg){
        var txt=rslt.read();
        return txt;
    }else{
        return "[ERROR]リダイレクトしたファイルを読み込むことが出来ませんでした。";
    }
}

回りくどい感じがしますw。もっと良くなる気がするです(笑)
InDesign Scripting TB(0) CM(0) 

New LogTop LogOld Log

COMMENT


PREV PAGE   TOP   NEXT PAGE