テキストをファイルに書き出す
次に、選択されたテキストフレーム内の文字をファイルに書き出してみましょう。InDesignは以下の手順でファイルを書き出せます。
- 保存するファイル名と場所を指定
- 書き込みモードでファイルを開く
- 文字コードを設定する
- 改行コードを設定する
- ファイルに書き出す
- ファイルを閉じる
まず1.の保存するファイル名と場所の指定方法です。WindowsやMac OS Xでファイルを保存する場合、専用のダイアログが表示されます。InDesignのJavaScriptでは以下のようにしてファイル保存ダイアログを表示できます。
var fileObj = File.saveDialog("保存テキストファイル名を入れて下さい");
File.saveDialog()の引数にはダイアログ上に表示するメッセージを指定します。ファイル名が入力され保存ボタンがクリックされると、File.saveDialog()は戻り値としてファイルオブジェクトを返します。ファイル名や保存先などは、このファイルオブジェクトに格納されています。一方、保存ボタンがクリックされずにキャンセルボタンがクリックされるとnullが返されます。
一連の処理をまとめると以下のようになります。
var fileObj = File.saveDialog("保存テキストファイル名を入れて下さい");
if (!fileObj) {
return; // キャンセルされた場合は何もせずに終わる
}
if()の中に書かれている!fileObjの!は否定演算子で真(true)であれば偽(false)に、偽(false)であれば真(true)になります。File.saveDialog()でキャンセルボタンがクリックされるとnullが返されるのでnullの逆、つまり真となり条件を満たすことになります。条件を満たせばif(){...}部分が実行され、returnにより処理を終了します。
次に2.の書き込みモードでファイルを開く処理では、ファイルオブジェクトに対してopen()メソッドを呼び出します。open()メソッドの引数には書き込みモードにするための"w"の文字を指定します。ファイルモードは以下の3つが用意されています。
r | 読み込み専用 |
---|---|
w | 書き込み用 |
e | 編集(読み書き可能) |
3.の文字コードを設定する処理では、出力するテキストの文字コードを、ファイルオブジェクトのencodingプロパティに文字列で指定します。InDesignのファイルオブジェクトに指定できる代表的な文字コードは以下のとおりです。なお、文字コード名は大文字でも小文字でも構いません。
UTF8 | ユニコード |
---|---|
UTF16 | ユニコード(UTF 16) |
ASCII | ASCIIコード |
ISO-8859-1 | ISO 8859-1 |
4.の改行コードはファイルオブジェクトのlineFeedプロパティに設定します。改行コードは以下のようにOS名で指定します。今回は青空文庫形式なので改行コードはWindowsにします。OS名は大文字でも小文字でも構いません。
Windows | CR, LF |
---|---|
Macintosh | CR |
Unix | LF |
5.のファイルに書き出す処理は、ファイルオブジェクトのwrite()メソッドを使います。write()メソッドは、書き出したい文字を引数に指定するだけです。正常に書き込まれるとtrueを返します。
すべてのテキストを書き終わったら、最後に6.のファイルを閉じる処理を実行します。ファイルを閉じるにはファイルオブジェクトのclose()メソッドを使います。close()メソッドには引数はありません。InDesignの場合、ファイルを閉じ忘れても自動的にアプリケーションがファイルを閉じてくれます。
ここまでをまとめたのがサンプル3です。
●サンプル3
// 選択されたテキストフレームの全ての文字を出力
(function(){
var sel = app.activeDocument.selection;
var text = sel[0].parentStory.contents; // 全て読み出す
var fileObj = File.saveDialog("保存テキストファイル名を入れて下さい");
if (!fileObj) {
return; // キャンセルされた場合は何もせずに終わる
}
var flag = fileObj.open("w"); // 書き込みモードで開く
if (!flag){
alert("ファイルが作成できませんでした");
return; // 以後の処理はしない
}
fileObj.encoding = "UTF8"; // 出力する文字コードを指定
fileObj.lineFeed = "windows"; // 改行コードをWindows(CR+LF)にする
fileObj.write(text); // ファイルに書き込む
fileObj.close(); // ファイルを閉じる
})();