指定した順番でテキストを書き出す
サンプル3は選択した1つのテキストフレームの文字をファイルに書き出していましたが、実際のInDesignのドキュメントでは複数のテキストフレームを扱う場合もあります。そこで、サンプル3を改良し、指定したテキストファイルに、InDesign上で選択したテキストフレームの内容を追記していくプログラムを作成します。これなら、複数のテキストフレームの内容を任意の順番で次々と追加できます。
サンプル3はファイル保存ダイアログを使っていましたが、今度はすでに存在するテキストファイルを開いて追記するのでファイルオープンダイアログを呼び出します。ファイルオープンダイアログはFile.openDialog()を使い、引数にはダイアログに表示するメッセージを指定します。File.openDialog()はファイルが選択されるとファイルオブジェクトを返し、キャンセルボタンがクリックされるとnullを返します。サンプル3で説明したFile.saveDialog()の戻り値と同じです。
既存のファイルの内容を操作する場合はファイルをオープンするopen()メソッドの引数に"e"を指定します。"e"を指定すると編集モードになり、ファイルの内容を追加・削除できます。
ただし、編集モードで開いたファイルにwrite()で文字を書き出すと、ファイルの元の内容を上書きしてしまいます。そこで、データを書き込む位置をファイルの末尾に変更する必要があります。データを書き込む位置はファイルポインタが示しています。open("e")したときファイルポインタはファイルの先頭にありますので、seek()メソッドを使って最後に変更します。
seek()メソッドには引数が2つあります。第1引数がファイルポインタの位置、第2引数が位置の基準です。位置の基準は以下のいずれかを指定します。
0 | 先頭からの絶対位置 |
---|---|
1 | 現在の位置からの相対位置 |
2 | 末尾からの絶対位置 |
ファイル末尾にファイルポインタを移動する場合はseek(0,2)とします。この処理の後にwrite()メソッドで文字を書き込むとファイルの末尾に追加されるわけです。
実際のプログラムはサンプル4です。選択したテキストフレームの文字がファイルに追記されていきます。
●サンプル4
// 選択されたテキストフレーム内だけの文字を出力
(function(){
var sel = app.activeDocument.selection;
var text = sel[0].contents; // 選択された範囲だけ読み出す
var fileObj = File.openDialog("保存テキストファイル名を選択して下さい");
if (!fileObj) {
return; // キャンセルされた場合は何もせずに終わる
}
var flag = fileObj.open("e"); // 編集(読み込み/書き込み)モードで開く
if (!flag){
alert("ファイルが開けませんでした");
return; // 以後の処理はしない
}
fileObj.encoding = "UTF8"; // 出力する文字コードを指定
fileObj.lineFeed = "windows"; // 改行コードをWindows(CR+LF)にする
fileObj.seek(0,2); // 書き込み位置をファイルの末尾に移動
fileObj.write(text); // ファイルに書き込む
fileObj.close(); // ファイルを閉じる
})();