ページレイアウトされているXMLタグを見つける

InDesign:XMLタグか否かを判定する InDesignスクリプト
記事内には広告が含まれている場合があります

InDesignでXMLを扱う際、XMLの構造面から各要素にアクセスするのは、比較的考えやすいです。

だけど、たとえばスクリプトで「8ページにあるテキストフレーム内のXML要素にアクセスしたい」というときは、どうすればいいだろうか…

そういうときは、「そのテキストフレームにXMLタグがついているかどうか」あるいは「その文字列がXMLタグ[ ]かどうか」というように、オブジェクトの属性を調べて判断します。

PR

ドキュメントサンプル

次のような、InDesignのページ内にテキストフレームが2つあるドキュメントを用意しました。

赤枠で囲まれているのは、<著者紹介>のXMLタグのついたテキストフレーム。
さらに、その中の文字列「リプちん」には<著者>のXMLタグがついています。

その下にある「アプりん」の文字の入ったテキストフレームにはXMLタグはついていません。

これらページアイテムに、associatedXMLElement(s)プロパティを使って「XMLタグが付いているかどうか」を調べます。

ページアイテムがXML要素かどうか判断するInDesignドキュメントページ

コードサンプル

#target indesign

var objDoc = app.activeDocument;
var toString = Object.prototype.toString;
var objTextframe_riptin = objDoc.pages[0].textFrames[1];
var objTextframe_aprin = objDoc.pages[0].textFrames[0];

// 「リプちん」のテキストフレームの4文字目
var ret_riptin= toString.call(objTextframe_riptin.characters[3].associatedXMLElements);
// 「アプりん」のテキストフレームの1文字目
var ret_aprin= toString.call(objTextframe_aprin.characters[0].associatedXMLElements);
// 「リプちん」のテキストフレーム
var ret_txtfrm= toString.call(objTextframe_riptin.associatedXMLElement);

alert("「リプちん」のテキストフレームの4文字目 :  " + ret_riptin + "\n\n" + 
        "「アプりん」のテキストフレームの1文字目 :  " + ret_aprin + "\n\n" + 
        "「リプちん」のテキストフレーム :  " + ret_txtfrm, "戻り値");

実行結果

判定結果を、alert()の文字列として表示しました。

XMLタグを認識したところは、”[object XMLElement]”と表示されています。

ページアイテムがXML要素かどうか判断した実行結果表示

サンプルの解説

associatedXMLElement(s)プロパティを使う前に、ポイントが2つあります。

JavaScriptの Object.prototype.toString()

InDesignのページアイテムに対してassociatedXMLElement(s)プロパティを使うと、戻り値として、そのアイテムがXMLのアイテムであればXMLItemが返ります。

なので、その戻り値の型を調べれば良いのですが、JavaScriptのtypeof演算子の型判定では望むところの判定ができません。

そこで Object.prototype.toStringを使って、詳細な型を調べ、さらにそれをtoStringで文字列に変換して受け取ります。

サンプルでは、4行目で次のように宣言しています。

var toString = Object.prototype.toString;

文字列のXMLタグを表している[ ]は、character

文字列にXMLタグをつけると、その文字列が[ ]で囲まれます。

この[ ]は、ただの見た目ではなく、実際にそこに[ ]があります。

試しに[ ]の前後をカーソルで移動すると、[ ]の前後にもカーソルが入るので、その存在をはっきり認識できると思います。

[ ]が認識できるなら、コイツを使わないテはありません。
「コイツ」を、characterとして捉えます。

なので「著者:リプちん」の「リ」の前の「コイツ」は、先頭から4つめのcharacterというわけです。

サンプルの9・11行目では、テキストフレーム内のcharacterをtoStringの引数として渡しています。

9行目:リプちんのテキストフレームの4文字目を評価
var ret_riptin= toString.call(objTextframe_riptin.characters[3].associatedXMLElements);
11行目:アプりんのテキストフレームの先頭文字を評価
var ret_aprin= toString.call(objTextframe_aprin.characters[0].associatedXMLElements);

associatedXMLElements と associatedXMLElement

associatedXMLElementは、sがあったり、なかったり、ミスタイプしそうですが、
characterなど文字関連には、associatedXMLElements

それ以外では、associatedXMLElementです。

戻り値は、文字列 “[object XMLElement]”

サンプルコードでは、最後にアラート表示で戻り値を表示しました。

実際には、戻り値によってその後の処理をif文で分岐させたり、あるいは、toStringに渡す引数のページアイテムをfor文でループさせたりします。

公式サイト Adobe InDesignを詳しく見てみる

コメント

タイトルとURLをコピーしました