Skip to main content
ajabon grinsmith
Community Expert
Community Expert
March 25, 2022
Answered

ブックマークを作成するスクリプト

こんにちは。いつも楽しみに拝見しています。

みんな大好きなスクリプトの悩みです。

 

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() などの処理も試してみましたが効果なしでした。パネルの再描画の関係でしょうか?

できればもうちょっとかっこよく書きたいです。

次の一手をお願いします。

This topic is closed to new replies. Start a new post to keep the conversation going.
yusuke.s
yusuke.sCorrect answer
Inspiring
March 25, 2022

Ten Aさんが既に書かれた通りですが,ひとつ補足すると,

もしブックマーク名だけの問題であれば,

ハイパーリンク(テキストアンカー)の名前を正しく設定すれば解決します。

 

このスクリプトだとデフォルトの「アンカー n」という名前のテキストアンカーが生成されますが,

これが二重に処理された結果,上書きされる形です。

なのでテキストアンカーに正しく名前を渡してあげればブックマーク名自体は正しいものが入ります。

for(var i = 0; i < ary.length; i++){
    var ht = doc.hyperlinkTextDestinations.add(sel, {name: ary[i]});
    var bm = doc.bookmarks.add(ht);
}

順序としてはテキストアンカーを生成する際に名前を渡してあげます。

(書かれていた処理とは逆です)

Yusuke S.

6 replies

kawamoto_α
Inspiring
March 31, 2022

これとは別の話です?

https://twitter.com/AJABON/status/1377847445099454466

Translate
ajabon grinsmith
Community Expert
Community Expert
March 31, 2022

解決法は今回ので大満足ですが疑問じたいはまったく同じですね…なんで覚えてないんだろう。。

Translate
yusuke.s
yusuke.sCorrect answer
Inspiring
March 25, 2022

Ten Aさんが既に書かれた通りですが,ひとつ補足すると,

もしブックマーク名だけの問題であれば,

ハイパーリンク(テキストアンカー)の名前を正しく設定すれば解決します。

 

このスクリプトだとデフォルトの「アンカー n」という名前のテキストアンカーが生成されますが,

これが二重に処理された結果,上書きされる形です。

なのでテキストアンカーに正しく名前を渡してあげればブックマーク名自体は正しいものが入ります。

for(var i = 0; i < ary.length; i++){
    var ht = doc.hyperlinkTextDestinations.add(sel, {name: ary[i]});
    var bm = doc.bookmarks.add(ht);
}

順序としてはテキストアンカーを生成する際に名前を渡してあげます。

(書かれていた処理とは逆です)

Translate
Yusuke S.
ajabon grinsmith
Community Expert
Community Expert
March 25, 2022

できましたっありがとうございます!

上書きされる(ハイパーリンク名で1、ブックマーク名で2)、でなんか納得いきました。

Translate
Ten A
Community Expert
Community Expert
March 25, 2022
選択範囲をary分割したあとfor分内でブックマーク当ててるのオリジナルの選択範囲だから二重に処理されている。
選択範囲を分割するのであればrangeも切らないとだめです。
Translate
ajabon grinsmith
Community Expert
Community Expert
March 25, 2022

ありがとございます。

ところがこれ10字以内の単一処理でも起こるんです。。

次の一手をお願いします(←流行ってる)

Translate