InDesign JavaScript チートシート

記事に画像を入れると重たくなるので、ソースコード例をメインに掲載。

ソースコード例中の変数

| 変数名 | 型 | 説明 |
|:-----|:--|:---|
| doc | Document | InDesignドキュメント |
| docList | Array | InDesignドキュメントのリスト |
| pageItem | PageItem | ページ内オブジェクト  |
| exportPDFFilePath | String | PDFの出力ファイルパス |
| strText | String | 何かしらの文字列 |
| fileName | String | 処理対象のファイルパス |

### ドキュメント操作

##### ファイル名を指定してInDesignファイルを開く

```js
var doc = app.open("/Users/efla/Desktop/test.indd");
```

##### フォルダをユーザが指定したフォルダ内のすべてのInDesignファイルを開く

```js
var folderObj = Folder.selectDialog("Select Folder");
fileList = folderObj.getFiles("*.indd");
    
var i = 0;
var docList = new Array();
for (i=0; i<fileList.length; i++ ) {
    
   docList.push(app.open(fileList[i]));
}
```

##### ドキュメントを保存する

```js
doc.save(filePath);
```

##### ドキュメントを閉じる

```js

doc.close();
```

##### ドキュメントを保存して閉じる

```js
doc.close(SaveOptions.yes);
```

##### ドキュメントのファイル名を取得する

```js
var filename;
filename = doc.name;
```

##### ドキュメントのファイルパス取得する



### エラーチェック・ユーザインタフェース

##### 警告ダイアログを表示する

```js
var message = 'エラーが発生しました。';
alert(message);
```

### ファイル操作

##### ファイル選択画面を表示してユーザにファイルを選択させる

```js
var fileObj = File.openDialog("Select File");
```

##### テキストファイルを新規作成して書き込みを行う

注意：処理系がWindowsの場合、出力先のパスのフォルダ区切り文字は「¥」マークに置き換える必要があります。（CS５で検証）

```js
var fileObj = new File(fileName); //fileNameは処理したいファイルのパス
var flag = fileObj.open("w");

if ( flag ) {
        
    fileObj.writeln("１行目");
    fileObj.writeln("２行目");
 
    fileObj.close();
}
else {
        
    alert("ファイルを作成できませんでした");
}
```

### 論理演算

これ言語によって違うからメモ書き。
if文で使った時の動作を記載。

| 演算子 | 動作 | 結果 |
|:-----|:--|:---|
| = | 代入 | 代入した値が入る。booleanの条件判定は「0をfalseとみなす」ので、「0以外の代入は真」とみなされる。 |
| == | 等価演算 | 左辺と右辺の結果が同じ場合に真、そうでない場合は偽とみなされる。 |
| != | 等価演算（否定） | 左辺と右辺の結果が同じ場合に真、そうでない場合は偽とみなされる。|
| && | AND演算 | 省略 |
| ｜｜ | OR演算 | 省略 |

### オブジェクトの種別や構造を取得する

##### オブジェクトの型の判定

```js
var typeName = pageItem.constructor.name;
if (typeName == "Group") {
   //...
}
```

| 型 | オブジェクトモデル | 説明 |
|:-----|:--|:---|
|Group||
|Page||
|Image||
|Polygon||
|Oval||
|EPS||

##### オブジェクトのコンテンツタイプを判定

```js
if (pageItem.contentType == contentType.TextType) {
   //...
}
```

| コンテンツタイプ | クラス | 説明 |
|:------------- |:------|:----|
|contentType.TextType||
|contentType.GraphicType||

#### よく使うオブジェクトの構造判定と種別の判定
##### オブジェクトがTextFrameかどうか判別する

```js
var typeName = pageItem.constructor.name;
if (typeName == "TextFrame") {
   //...
}
```

##### オブジェクトの座標を取得する

オブジェクトの可視範囲の取得。例えば、オブジェクトに線が設定されている場合、線の太さも加味した領域。

| 座標 | 取得方法 |
|:------------- |:------|
|左上のX座標|pageItem.visibleBounds[0]|
|左上のY座標|pageItem.visibleBounds[1]|
|右下のX座標|pageItem.visibleBounds[2]|
|右下のX座標|pageItem.visibleBounds[3]|

### オブジェクトを加工する

##### オブジェクトの不透明度を設定する。

代入する値は0-100（％）

```js
pageItem.transparencySettings.blendingSettings.opacity = 50;
```

### スクリプトラベル操作

##### スクリプトラベルを取得する

```js
var label = pageItem.label;
```

### レイヤー操作

##### 名前を指定してレイヤーを削除する

以前の投稿にコメントでいただいたサンプルです。

```js
var l = app.activeDocument.layers.itemByName("test");
if (l.isValid){
   l.remove();
} 
```

##### 名前を指定してレイヤーを非表示にする

```js
var l = app.activeDocument.layers.itemByName("test");
if (l.isValid) {
   l.remove();
}
```

### 出力

##### PDFファイルに出力する

注意：処理系がWindowsの場合、出力先のパスのフォルダ区切り文字は「¥」マークに置き換える必要があります。（CS５で検証）

```js
doc.exportFile(ExportFormat.pdfType, exportPDFFilePath);
```

##### PDFファイルに出力する

注意：処理系がWindowsの場合、出力先のパスのフォルダ区切り文字は「¥」マークに置き換える必要があります。（CS５で検証）

```js
doc.exportFile(ExportFormat.pdfType, exportPDFFilePath);
```

### 文字列操作

##### 文字列の指定した文字数目を取り出す

```js
var strText = "テスト用1文字列";
var strCharAt = strText.charAt(3);
```

##### 文字列の指定した文字数目の文字コードを取り出す

```js
var strText = var strText = "テスト用1文字列";
var intCharCodeAt = strText.charCodeAt(3);
```

##### 文字列から改行を取り除く

処理系で¥nや¥rの条件が結構変わるので。
一番安定した方法。

```js
var CRCODE = String.fromCharCode(13);
var LFCODE = String.fromCharCode(10);

strText = strText.split(CRCODE); strText = strText.join("");
strText = strText.split(LFCODE); strText = strText.join("");
```

##### ルビ情報を取得する（文字単位）

ルビは１文字に対しての設定。文章にルビが含まれているかどうかは、for文を使って１文字ずつ確認する必要がある。

```js
var flag = pageItem.paragraphs[0].characters[0].rubyFlag;  /* boolean:true/false */
var rubyString = pageItem.paragraphs[0].characters[0].rubyString; /* brank is <![CDATA[]]> */
var rubySize = pageItem.paragraphs[0].characters[0].rubyFontSize; /* integer */
```

##### ルビを設定する（文字単位） 

ルビは１文字に対して設定する。

```js
pageItem.paragraphs[0].characters[0].rubyFlag = true;
pageItem.paragraphs[0].characters[0].rubyString = "ほげ";
pageItem.paragraphs[0].characters[0].rubyFontSize = 8;
```

##### 文字列を置換する

正規表現を使わない場合

```js
strText = strText.replace("a","b");
```

### XML操作

検証中：もしかして、JavaScriptのXML操作の全てが実装されてはいないか？素直にjQuery使った方がいいのかもしれない。

##### XMLオブジェクトのパース

プロパティ経由でアクセスする。

```js
var str_xml = '<root><item att="hoge">１つめ</item><item att="hogehoge">２つめ</item></root>'
var x_data = new XML(str_xml);
    
var text = x_data.item[0];
    
$.writeln(t);
```

XPath経由でアクセスする

```js
var str_xml = '<root><item att="hoge">１つめ</item><item att="hogehoge">２つめ</item></root>'
var x_data = new XML(str_xml);
    
var text = x_data.xpath("/root/item")[0];
    
$.writeln(text);
```

属性値を取り出す

```js
var str_xml = '<root><item att="hoge">１つめ</item><item att="hogehoge">２つめ</item></root>'
    var x_data = new XML(str_xml);
    
    var text = x_data.item[0].@att;
    
    $.writeln(text);
```

### 列挙体

##### 列挙体を定義して使う

マジックナンバーは使わないようにしたい。

```js
var type = {
    title : "100",
    author : "200",
    content : "300"
 }

function main () {

    var a = "100";
    
    $.writeln(a==type.title);
}

main();
```

### ユーザインタフェース

##### 処理を止めてウィンドウを表示する
```js
var w = new Window('window', 'ウィンドウ',[100,100,100,100]);
w.show():
```

#### 処理を止めないでウィンドウを表示する
```js
var w = new Window('palette', 'ウィンドウ',[100,100,100,100]);
w.show():
```