2008年5月30日金曜日

Illustratorで文字あふれしたテキストフレームを全選択する

Illustratorで、文字あふれしているテキストフレームだけををすべて選択するスクリプトです。
...


#target Illustrator

Application.active

//まず選択解除
app.activeDocument.selection = null;

doc = app.activeDocument;
Frs = doc.textFrames;
visibleText = "";

for(Fr=0; Fr < Frs.length; Fr++){

//あふれ部分含む全テキスト抽出
allText = Frs[Fr].contents;

//改行をすべて取る
allText = allText.replace(/\r/g, "");

//あふれていないテキスト部分だけを抽出する
for(i=0; i < Frs[Fr].lines.length; i++) {
visibleText = visibleText + Frs[Fr].lines[i].contents;
}

if(allText != visibleText) {
Frs[Fr].selected = true;
}
}

alert("文字あふれは" + doc.selection.length + "個所");


textFrameのlinesプロパティでは表示されているテキストだけが取得されることを利用して、フレーム内の全テキストと表示テキストの文字列が違った場合に、文字あふれしていると判断します。
なぜこんな処理をするかというと、テキストフレームにオーバーフローのプロパティがない(らしい)からです(あったら教えて…)。

表示テキストを取得する際に、linesプロパティでは改行コードが取り出せません。表示テキストには改行がなくて、全テキストには改行があるということでは両者を正しく比較できないので改行を戻してやる必要がある…ところが、linesプロパティで取り出されるのは段落ではなく、あくまで見かけの行なので、lineの後ろに必ず改行が入るわけではありません。すると、ちょっと面倒な処理になりそうです。
考えた結果、押してだめなら引いてみな、ということで全テキストの方から改行をすべて取る処理

allText = allText.replace(/\r/g, "");

をしています。
「/\r/g」は、「すべての改行(キャリッジリターン)」という意味です。よくわからない方は「正規表現」でググってください。Illustratorでの改行コードは、Windows版でも「\r」のみで扱われているようなので、このままでOKです(つーかWin版でしか動作確認してない)。

0 件のコメント: