※公開しているソースではエラー処理とか省略してます
※使用は自己責任でねー
※このスクリプトの動作確認はInDesign CS5.5 でやりました
今回は「右インデントで揃えたい文字が行幅の関係で折り返されていたら改行する」という処理。あー、文章では非常に伝わりにくいですね。とまあ、編集後記とか編集後記とか編集後記とかによくある(これしか思いつかなかった)形のあれです。ペンネームを「段落の最後に右揃え」でっていう形式ね。
「ライターさんの名前が行幅の関係で自然改行されちゃってたら改行して奇麗に揃えたい」をスクリプトで自動的に処理しようという試みです。今回は、
「右インデント」が最終行にない場合、右インデントの前に改行をいれます。
それではレッツトライ。
ちょっと解説
・右インデントの判定には「SpecialCharacters.RIGHT_INDENT_TAB」を使いました。コントロールコードでチェックしてたら最初は動作してたのに途中で動かなくなる変な現象に、まあよくわからんのですがこっちのほうが動作は安定。
・改行の追加部分ですがここは強引に Character の contents に文字を突っ込む方法をとります。たけうちさんのスクリプトでも紹介されていましたがCharacterのcontentsに文字をくっつけると、該当箇所にそのCharacterと同じ設定の文字が追加されてしまうのです(@_@; これ始めて気がついた時は驚愕しました。いやー、お手軽で素晴らしい。ちなみに contents への右インデントの入れこみですが判定時に利用した「SpecialCharacters.RIGHT_INDENT_TAB」ではうまくいかなかったのでここでは直接 String.fromCharCode(8) で入れています。
//各段落の最終行をCheck
function LAST_LINE_Check() {
var myDoc = app.activeDocument;
var myPage= null;
var myItems = null;
var myParagraphs = null;
var myParagraph = null;
var myCharacters = null;
var myCharacter = null;
var myBox = "";
//ページのループ
for (var p=0; p<myDoc.pages.length; p++) {
myPage = myDoc.pages.item(p);
myItems = myPage.allPageItems;
//ページアイテムのループ
for (var i=0;i<=myItems.length-1;i++) {
if (myItems[i].constructor.name !== "TextFrame") {
continue;
}
myBox = myItems[i];
myParagraphs = myBox.paragraphs;
//段落のループ
for (var j = 0;j<=myParagraphs.length-1;j++) {
myParagraph = myParagraphs[j];
myCharacters = myParagraph.characters;
//文字列のループ
for (var t=myCharacters.length-1;t>=0;t--) {
myCharacter = myCharacters[t];
//右インデントのチェック
if (myCharacter.contents === SpecialCharacters.RIGHT_INDENT_TAB) {
//右インデントの位置が最終行かどうか判定
if (No_LastLine(myParagraph,t)) {
//conntentsに強引に複数文字を割り当てると
//該当箇所に文字が追加されます
myCharacter.contents = "\015" + String.fromCharCode(8);
}
break;
}
}
}
}
}
}
//段落の最終行か否かのチェック
function No_LastLine(NowParagraph,NowIndex) {
var myLines = NowParagraph.lines;
var total = 0;
var myPosition = NowIndex;
//最終行の文字を除いた文字数を計算
for (var i = 0;i<myLines.length-1;i++) {
total = total + myLines[i].characters.length;
}
//境目の文字がトータルより小さい=最終行では無いので改行が必要
if (total > myPosition) {
return true
} else {
return false
}
}
LAST_LINE_Check();