ブックマークを作成するスクリプト
こんにちは。いつも楽しみに拝見しています。
みんな大好きなスクリプトの悩みです。
InDesign上でブックマークを手動作成するにあたり、
①テキスト中の改行文字がしおり名では半角スペースに変換される
②先頭から100文字までしか拾われない
という個人的難点がありまして、
いつもブックマークパネル上なりPDF上なりでちまちまと修正していたので、
ここはひとつスクリプトで、と思いたち、簡単なものを書いてみました。
長すぎる文言は100字ごとに分けて作成しておき、
あとでAcrobat上でしおりの名前をコピペしてニコイチするという、ださい作戦です。
var doc = app.activeDocument;
var sel = doc.selection[0]; //Text
var ary = sel.contents.replace(/[\n\r]/g, "").match(/.{1,10}/g); //テストなので10字刻み
for(var i = 0; i < ary.length; i++){
var ht = doc.hyperlinkTextDestinations.add(sel);
var bm = doc.bookmarks.add(ht, {name: ary[i]});
}
しかし。実行結果がこんなことになりました。
1つ飛ばしで名前が付けられていない。

処理が追いついてないのかと思い、やや書き換えました。
が、結果はまったく変わりませんでした。
var doc = app.activeDocument;
var sel = doc.selection[0]; //Text
var ary = sel.contents.replace(/[\n\r]/g, "").match(/.{1,100}/g);
for(var i = 0; i < ary.length; i++){
var ht = doc.hyperlinkTextDestinations.add(sel);
var bm = doc.bookmarks.add(ht);
$.sleep(500); //すごく待つ
bm.name = ary[i]; //名前を付ける
}
テストを繰り返すうち、取り消しまくってる最中に「アンカー 1」の名前が本来定義した文言になっている瞬間があることに気がつきました。
これが正常な結果を得られた最終のコードです。
var doc = app.activeDocument;
var sel = doc.selection[0]; //Text
var ary = sel.contents.replace(/[\n\r]/g, "").match(/.{1,100}/g);
for(var i = 0; i < ary.length; i++){
var ht = doc.hyperlinkTextDestinations.add(sel);
var bm = doc.bookmarks.add(ht, {name: ary[i]});
doc.undo(); //やめる
doc.redo(); //やっぱりやる
}
…なんでなんでしょうか。
だめもとで recompose() などの処理も試してみましたが効果なしでした。パネルの再描画の関係でしょうか?
できればもうちょっとかっこよく書きたいです。
次の一手をお願いします。

