修飾文字の置換え2
以前、
このサイトでお世話になって、
修飾文字の置換えjavascriptを教えていただきました。
//検索/置換設定のクリア
app.findPreferences = NothingEnum.nothing;
app.changePreferences = NothingEnum.nothing;
// 検索条件の設定
app.findPreferences.findText = "(i)";
// 検索(範囲:カーソルを立ててあるストーリー全体)
var range = app.selection[0].parentStory;
// 検索の実行
var findList = range.search();
// 後ろから置換を実行
for (var i=findList.length-1; i>=0; i--){
with (findList[i]){
contents = String.fromCharCode(0x2170);
opentypeFeatures = [["nalt",1]];
}
}
という感じなのですが、
検索する文字数分置換えされてしまうのです。
普通に置換えしたいのですが、
どなたか、
教えてください。
宜しくお願いいたします。
このサイトでお世話になって、
修飾文字の置換えjavascriptを教えていただきました。
//検索/置換設定のクリア
app.findPreferences = NothingEnum.nothing;
app.changePreferences = NothingEnum.nothing;
// 検索条件の設定
app.findPreferences.findText = "(i)";
// 検索(範囲:カーソルを立ててあるストーリー全体)
var range = app.selection[0].parentStory;
// 検索の実行
var findList = range.search();
// 後ろから置換を実行
for (var i=findList.length-1; i>=0; i--){
with (findList[i]){
contents = String.fromCharCode(0x2170);
opentypeFeatures = [["nalt",1]];
}
}
という感じなのですが、
検索する文字数分置換えされてしまうのです。
普通に置換えしたいのですが、
どなたか、
教えてください。
宜しくお願いいたします。
[ミニカー]-2007/08/03 16:49:27 [Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; InfoPath.1)]
» 001
https://dtp-bbs.com/dtpbbs/archives/indesign_cs2nalt_20070525114211.html
この件ですね。
ミニカーさんにとってはつい先日のことかもしれませんが、環境を書いていただかないと。
上記のトピックでは InDesign CS2 とのことでしたね。
もし InDesign CS3 なら、findPreferences など廃止(変更)されたプロパティがありますのでそのままではスクリプトが動きませんが……
> 検索する文字数分置換えされてしまうのです。
との事なのでバージョンアップされたわけではないのだろうと想像します。
読解力がなくて申し訳ありませんが、ご質問の意図自体を理解できておりません。
もしかして、文字列をひとつずつ置換したいということでしょうか?
https://dtp-bbs.com/dtpbbs/archives/indesign_cs2nalt_20070525114211.html
この件ですね。
ミニカーさんにとってはつい先日のことかもしれませんが、環境を書いていただかないと。
上記のトピックでは InDesign CS2 とのことでしたね。
もし InDesign CS3 なら、findPreferences など廃止(変更)されたプロパティがありますのでそのままではスクリプトが動きませんが……
> 検索する文字数分置換えされてしまうのです。
との事なのでバージョンアップされたわけではないのだろうと想像します。
読解力がなくて申し訳ありませんが、ご質問の意図自体を理解できておりません。
もしかして、文字列をひとつずつ置換したいということでしょうか?
[いき]-2007/08/03 19:40:18 [Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6]
[ミニカー]-2007/08/03 20:27:32 [Mozilla/5.0 (Macintosh; U; PPC; ja-JP; rv:1.0.2) Gecko/20030208 Netscape/7.02]
[いき]-2007/08/03 20:49:45 [Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6]
[ミニカー]-2007/08/04 11:31:18 [Mozilla/5.0 (Macintosh; U; PPC; ja-JP; rv:1.0.2) Gecko/20030208 Netscape/7.02]
[ミニカー]-2007/08/06 16:02:40 [Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; InfoPath.1)]
» 006
要は、3文字ある"(i)"を、1文字の
contents = String.fromCharCode(0x2170);
opentypeFeatures = [["nalt",1]];
で置き換えようとしているために意図通りの置換ができないのです。
スクリプト先頭に
keyword = "(i)";
repWord = "●";
result = app.selection[0].parentStory.search(keyword, false, false, false, false, repWord);
を挿入し、元のスクリプトの
app.findPreferences.findText = "(i)";
を
app.findPreferences.findText = "●";
にすればとりあえず置換できます。
●は、たとえば★など、フレーム中の他の文字とかぶらないようなものが望ましいのですが。
もっとも、スクリプト先頭で●を別の文字に置換しておき、スクリプト末尾で戻し置換するのもアリです。
スマートな方法とは言い難いですが(^^;
要は、3文字ある"(i)"を、1文字の
contents = String.fromCharCode(0x2170);
opentypeFeatures = [["nalt",1]];
で置き換えようとしているために意図通りの置換ができないのです。
スクリプト先頭に
keyword = "(i)";
repWord = "●";
result = app.selection[0].parentStory.search(keyword, false, false, false, false, repWord);
を挿入し、元のスクリプトの
app.findPreferences.findText = "(i)";
を
app.findPreferences.findText = "●";
にすればとりあえず置換できます。
●は、たとえば★など、フレーム中の他の文字とかぶらないようなものが望ましいのですが。
もっとも、スクリプト先頭で●を別の文字に置換しておき、スクリプト末尾で戻し置換するのもアリです。
スマートな方法とは言い難いですが(^^;
[いき]-2007/08/06 16:49:06 [Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6]
» 007
修飾字形のopentypeFeaturesを設定する部分を変更してください。
//検索/置換設定のクリア
app.findPreferences = NothingEnum.nothing;
app.changePreferences = NothingEnum.nothing;
// 検索条件の設定
app.findPreferences.findText = "(i)";
// 検索(範囲:カーソルを立ててあるストーリー全体)
var range = app.selection[0].parentStory;
// 検索の実行
var findList = range.search();
// 後ろから置換を実行
for (var i=findList.length-1; i>=0; i--){
with (findList[i]){
contents = String.fromCharCode(0x2170);
characters[0].opentypeFeatures = [["nalt",1]];//ここを修正
}
}
修飾字形のopentypeFeaturesを設定する部分を変更してください。
//検索/置換設定のクリア
app.findPreferences = NothingEnum.nothing;
app.changePreferences = NothingEnum.nothing;
// 検索条件の設定
app.findPreferences.findText = "(i)";
// 検索(範囲:カーソルを立ててあるストーリー全体)
var range = app.selection[0].parentStory;
// 検索の実行
var findList = range.search();
// 後ろから置換を実行
for (var i=findList.length-1; i>=0; i--){
with (findList[i]){
contents = String.fromCharCode(0x2170);
characters[0].opentypeFeatures = [["nalt",1]];//ここを修正
}
}
[ななし]-2007/08/06 17:19:12 [Mozilla/5.0 (Macintosh; U; PPC Mac OS X; ja-jp) AppleWebKit/419 (KHTML, like Gecko) Safari/419.3]
[いき]-2007/08/06 17:24:12 [Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6]
[ミニカー]-2007/08/06 23:01:54 [Mozilla/5.0 (Macintosh; U; PPC; ja-JP; rv:1.0.2) Gecko/20030208 Netscape/7.02]
» 010
すみません。
前の質問とちょっと違うのですが、
//検索/置換設定のクリア
app.findPreferences = NothingEnum.nothing;
app.changePreferences = NothingEnum.nothing;
// 検索条件の設定
app.findPreferences.findText = "(i)";
// 検索(範囲:カーソルを立ててあるストーリー全体)
var range = app.selection[0].parentStory;
// 検索の実行
var findList = range.search();
// 後ろから置換を実行
for (var i=findList.length-1; i>=0; i--){
with (findList[i]){
contents = String.fromCharCode(0x2170);
characters[0].opentypeFeatures = [["nalt",1]];//
}
}
を教えていただいて検証していて、
新たに問題が発生しました。
大文字と小文字(例・(A)と(a)など)の区別ができず、
困っています。
大文字でも小文字でも指定した修飾文字に変換されてしまいます。
大文字は大文字で小文字は小文字で変換したいのですが、
色々やってみていますがうまくいきません。
なにが悪いのか教えていただけませんでしょうか。
宜しくお願いいたします。
すみません。
前の質問とちょっと違うのですが、
//検索/置換設定のクリア
app.findPreferences = NothingEnum.nothing;
app.changePreferences = NothingEnum.nothing;
// 検索条件の設定
app.findPreferences.findText = "(i)";
// 検索(範囲:カーソルを立ててあるストーリー全体)
var range = app.selection[0].parentStory;
// 検索の実行
var findList = range.search();
// 後ろから置換を実行
for (var i=findList.length-1; i>=0; i--){
with (findList[i]){
contents = String.fromCharCode(0x2170);
characters[0].opentypeFeatures = [["nalt",1]];//
}
}
を教えていただいて検証していて、
新たに問題が発生しました。
大文字と小文字(例・(A)と(a)など)の区別ができず、
困っています。
大文字でも小文字でも指定した修飾文字に変換されてしまいます。
大文字は大文字で小文字は小文字で変換したいのですが、
色々やってみていますがうまくいきません。
なにが悪いのか教えていただけませんでしょうか。
宜しくお願いいたします。
[ミニカー]-2007/08/22 20:05:44 [Mozilla/5.0 (Macintosh; U; PPC; ja-JP; rv:1.0.2) Gecko/20030208 Netscape/7.02]
» 011
// 検索の実行
var findList = range.search();
この行で、大文字・小文字のフラグを入れてあげれば区別しますね。
検索文字列[KanaSensitive][WidthSensitive][WholeWord][CaseSensitive]置換文字列
なので、第5引数にTrueを入れてあげて下さい。
// 検索の実行
var findList = range.search();
この行で、大文字・小文字のフラグを入れてあげれば区別しますね。
検索文字列[KanaSensitive][WidthSensitive][WholeWord][CaseSensitive]置換文字列
なので、第5引数にTrueを入れてあげて下さい。
[流星光輝]-2007/08/22 23:33:14 [Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727) Picea/1.45]
» 012
流星様、
いつもご相談にお答え頂きありがとうございます。
こういうことで、
いいのでしょうか?
// 検索の実行
var findList = range.search('', false, false, false, false, True);
流星様、
いつもご相談にお答え頂きありがとうございます。
こういうことで、
いいのでしょうか?
// 検索の実行
var findList = range.search('', false, false, false, false, True);
[ミニカー]-2007/08/23 07:31:45 [Mozilla/5.0 (Macintosh; U; PPC; ja-JP; rv:1.0.2) Gecko/20030208 Netscape/7.02]
[ミニカー]-2007/08/23 07:33:24 [Mozilla/5.0 (Macintosh; U; PPC; ja-JP; rv:1.0.2) Gecko/20030208 Netscape/7.02]
» 014
実際に走らせてみて、期待通りに動けば、とりあえずは正解です。
動かなければ、どこかに問題があるということが解ります。
まず、JavaScriptだとTrueではダメで、trueです。
ExtendScript Toolkitなどを使っていれば、色が変わるのでわかるところです。
また、searchメソッドの引数の検索文字列に、''をいれても動かないようですね。
''や""だと空白文字列になります。
こういう場合は、CS2に付いているサンプルスクリプトを参考にするのがよいですね。検索/置換だとTextCleanup_J.jsxが参考に出来るでしょう。
引数の検索文字列にはapp.findPreferences.findTextを入れています。
また、実際に試してみればわかりますが、undefinedでも大丈夫です。
なお、searchメソッドの引数を入れないで、あらかじめプリファレンスの方で必要なものにtrueを代入しておく方法もあります。こちらの方が私の好みではあります。
app.findPreferences.caseSensitive //大文字と小文字を区別
app.findPreferences.kanaSensitive //カナを区別
app.findPreferences.wholeWord //単語として検索
app.findPreferences.widthSensitive //半角・全角を区別
実際に走らせてみて、期待通りに動けば、とりあえずは正解です。
動かなければ、どこかに問題があるということが解ります。
まず、JavaScriptだとTrueではダメで、trueです。
ExtendScript Toolkitなどを使っていれば、色が変わるのでわかるところです。
また、searchメソッドの引数の検索文字列に、''をいれても動かないようですね。
''や""だと空白文字列になります。
こういう場合は、CS2に付いているサンプルスクリプトを参考にするのがよいですね。検索/置換だとTextCleanup_J.jsxが参考に出来るでしょう。
引数の検索文字列にはapp.findPreferences.findTextを入れています。
また、実際に試してみればわかりますが、undefinedでも大丈夫です。
なお、searchメソッドの引数を入れないで、あらかじめプリファレンスの方で必要なものにtrueを代入しておく方法もあります。こちらの方が私の好みではあります。
app.findPreferences.caseSensitive //大文字と小文字を区別
app.findPreferences.kanaSensitive //カナを区別
app.findPreferences.wholeWord //単語として検索
app.findPreferences.widthSensitive //半角・全角を区別
[ななし]-2007/08/23 09:35:45 [Mozilla/5.0 (Macintosh; U; PPC Mac OS X; ja-jp) AppleWebKit/419 (KHTML, like Gecko) Safari/419.3]
[匿名]-2007/08/23 09:47:18 [Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30)]
» 016
ななし様、
ありがとうございます。
しかし、
私がいまいち理解ができていません。
app.findPreferences = NothingEnum.nothing;
app.changePreferences = NothingEnum.nothing;
app.findPreferences.findText = "(A)";
var range = app.selection[0].parentStory;
var findList = range.search(app.findPreferences.findText, false, false, false, true, app.changePreferences.changeText);
for (var i=findList.length-1; i>=0; i--){
with (findList[i]){
contents = String.fromCharCode(0x0041);
characters[0].opentypeFeatures = [["nalt",1]];
}
}
でやってみたのですが、
characters[0].opentypeFeatures = [["nalt",1]];
でエラーになってしまいます。
app.findPreferences.caseSensitive //大文字と小文字を区別
app.findPreferences.kanaSensitive //カナを区別
app.findPreferences.wholeWord //単語として検索
app.findPreferences.widthSensitive //半角・全角を区別
もやってみましたが、
やはり区別なく変換されてしまいます。
具体的に教えていただけると助かります。
宜しくお願いいたします。
ななし様、
ありがとうございます。
しかし、
私がいまいち理解ができていません。
app.findPreferences = NothingEnum.nothing;
app.changePreferences = NothingEnum.nothing;
app.findPreferences.findText = "(A)";
var range = app.selection[0].parentStory;
var findList = range.search(app.findPreferences.findText, false, false, false, true, app.changePreferences.changeText);
for (var i=findList.length-1; i>=0; i--){
with (findList[i]){
contents = String.fromCharCode(0x0041);
characters[0].opentypeFeatures = [["nalt",1]];
}
}
でやってみたのですが、
characters[0].opentypeFeatures = [["nalt",1]];
でエラーになってしまいます。
app.findPreferences.caseSensitive //大文字と小文字を区別
app.findPreferences.kanaSensitive //カナを区別
app.findPreferences.wholeWord //単語として検索
app.findPreferences.widthSensitive //半角・全角を区別
もやってみましたが、
やはり区別なく変換されてしまいます。
具体的に教えていただけると助かります。
宜しくお願いいたします。
[ミニカー]-2007/08/23 10:50:29 [Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; InfoPath.1)]
» 017
まず、プリファレンスを設定して、という方は、
大文字と小文字を区別したいわけですから、
app.findPreferences.caseSensitive = true;
という文を、3行めの
app.findPreferences.findText = "(A)";
の次あたりに入れておき、
5行め(変更後の6行め)は
var findList = range.search();
でOK。これで動くはず、というか、ちゃんと区別して置換できることを確認して書いています。
さて、問題の
var findList = range.search(app.findPreferences.findText, false, false, false, true, app.changePreferences.changeText);
なのですが、これがちょっと厄介。
こう書くと、実は検索だけでなく、置換まで実行されているのです。
置換されているとダメかというと、そうでもなく3行めの次あたりに
app.changePreferences.changeText = "A";
を入れておけば、大丈夫。あるいは、
app.changePreferences.changeText = "(A)";
であっても、8行めの
contents = String.fromCharCode(0x0041);
で置き換えられるのでOK。
エラーが出る場合は?というと、
app.changePreferences.changeText = "";
とした場合。つまり、一旦、文字列"(A)"が空白文字列に置換されてしまう場合。
これであっても、8行めのところで"A"(=String.fromCharCode(0x0041))が挿入されるのですが、9行めが実行される時には、まだ、その文字の挿入が確定していない。それで、エラーとなるのです。
こういうパターンは時たま遭遇します。
慣れの問題ですね。
まぁ、かくいう私も、単なるいちDTPオペレーターに過ぎません。
スクリプトを書く時間を持てるか否かは、それぞれのおかれた立場、環境によって異なりますから、頑張ってくださいとしか言いようがありませんけれど、いろいろ考えて試してみるのが早道です。
app.changePreferences.changeTextを設定しなくても、
var findList = range.search(app.findPreferences.findText, false, false, false, true);
ないし、
var findList = range.search(app.findPreferences.findText, false, false, false, true, undefined);
だと、検索のみ実行しますからエラーになりません。
まず、プリファレンスを設定して、という方は、
大文字と小文字を区別したいわけですから、
app.findPreferences.caseSensitive = true;
という文を、3行めの
app.findPreferences.findText = "(A)";
の次あたりに入れておき、
5行め(変更後の6行め)は
var findList = range.search();
でOK。これで動くはず、というか、ちゃんと区別して置換できることを確認して書いています。
さて、問題の
var findList = range.search(app.findPreferences.findText, false, false, false, true, app.changePreferences.changeText);
なのですが、これがちょっと厄介。
こう書くと、実は検索だけでなく、置換まで実行されているのです。
置換されているとダメかというと、そうでもなく3行めの次あたりに
app.changePreferences.changeText = "A";
を入れておけば、大丈夫。あるいは、
app.changePreferences.changeText = "(A)";
であっても、8行めの
contents = String.fromCharCode(0x0041);
で置き換えられるのでOK。
エラーが出る場合は?というと、
app.changePreferences.changeText = "";
とした場合。つまり、一旦、文字列"(A)"が空白文字列に置換されてしまう場合。
これであっても、8行めのところで"A"(=String.fromCharCode(0x0041))が挿入されるのですが、9行めが実行される時には、まだ、その文字の挿入が確定していない。それで、エラーとなるのです。
こういうパターンは時たま遭遇します。
慣れの問題ですね。
まぁ、かくいう私も、単なるいちDTPオペレーターに過ぎません。
スクリプトを書く時間を持てるか否かは、それぞれのおかれた立場、環境によって異なりますから、頑張ってくださいとしか言いようがありませんけれど、いろいろ考えて試してみるのが早道です。
app.changePreferences.changeTextを設定しなくても、
var findList = range.search(app.findPreferences.findText, false, false, false, true);
ないし、
var findList = range.search(app.findPreferences.findText, false, false, false, true, undefined);
だと、検索のみ実行しますからエラーになりません。
[ななし]-2007/08/23 11:51:53 [Mozilla/5.0 (Macintosh; U; PPC Mac OS X; ja-jp) AppleWebKit/419 (KHTML, like Gecko) Safari/419.3]
» 018
ななし様、
ありがとうございます。
しかし、
私がいまいち理解ができていません。
app.findPreferences = NothingEnum.nothing;
app.changePreferences = NothingEnum.nothing;
app.findPreferences.findText = "(A)";
var range = app.selection[0].parentStory;
var findList = range.search(app.findPreferences.findText, false, false, false, true, app.changePreferences.changeText);
for (var i=findList.length-1; i>=0; i--){
with (findList[i]){
contents = String.fromCharCode(0x0041);
characters[0].opentypeFeatures = [["nalt",1]];
}
}
でやってみたのですが、
characters[0].opentypeFeatures = [["nalt",1]];
でエラーになってしまいます。
app.findPreferences.caseSensitive //大文字と小文字を区別
app.findPreferences.kanaSensitive //カナを区別
app.findPreferences.wholeWord //単語として検索
app.findPreferences.widthSensitive //半角・全角を区別
もやってみましたが、
やはり区別なく変換されてしまいます。
具体的に教えていただけると助かります。
宜しくお願いいたします。
ななし様、
ありがとうございます。
しかし、
私がいまいち理解ができていません。
app.findPreferences = NothingEnum.nothing;
app.changePreferences = NothingEnum.nothing;
app.findPreferences.findText = "(A)";
var range = app.selection[0].parentStory;
var findList = range.search(app.findPreferences.findText, false, false, false, true, app.changePreferences.changeText);
for (var i=findList.length-1; i>=0; i--){
with (findList[i]){
contents = String.fromCharCode(0x0041);
characters[0].opentypeFeatures = [["nalt",1]];
}
}
でやってみたのですが、
characters[0].opentypeFeatures = [["nalt",1]];
でエラーになってしまいます。
app.findPreferences.caseSensitive //大文字と小文字を区別
app.findPreferences.kanaSensitive //カナを区別
app.findPreferences.wholeWord //単語として検索
app.findPreferences.widthSensitive //半角・全角を区別
もやってみましたが、
やはり区別なく変換されてしまいます。
具体的に教えていただけると助かります。
宜しくお願いいたします。
[ミニカー]-2007/08/23 12:07:27 [Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; InfoPath.1)]
» 019
すみませんでした。
app.findPreferences = NothingEnum.nothing;
app.changePreferences = NothingEnum.nothing;
app.findPreferences.findText = "(A)";
var range = app.selection[0].parentStory;
var findList = range.search(app.findPreferences.findText, false, false, false, true);
for (var i=findList.length-1; i>=0; i--){
with (findList[i]){
contents = String.fromCharCode(0x0041);
characters[0].opentypeFeatures = [["nalt",1]];
}
}
でいけました。
流星様、
ななし様、
ありがとうございました。
すみませんでした。
app.findPreferences = NothingEnum.nothing;
app.changePreferences = NothingEnum.nothing;
app.findPreferences.findText = "(A)";
var range = app.selection[0].parentStory;
var findList = range.search(app.findPreferences.findText, false, false, false, true);
for (var i=findList.length-1; i>=0; i--){
with (findList[i]){
contents = String.fromCharCode(0x0041);
characters[0].opentypeFeatures = [["nalt",1]];
}
}
でいけました。
流星様、
ななし様、
ありがとうございました。
[ミニカー]-2007/08/23 13:33:18 [Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; InfoPath.1)]