JavaScriptでの一斉置換

[1861]JavaScriptでの一斉置換 | 投稿者:たぐ | 投稿日:2008/10/20(Mon) 19:18:46
はじめまして。

複数の文字列を同時に置き換えつつ、それらの書体を変更する、
というJavaScriptを作ろうとしているのですが
(JSでなければならない理由はとくにありません)、
難儀してしまい、以前から勉強させていただいていたこちらにご相談に上がりました。

やりたいことは、
  プリンター → プリンタ
  第三セクター → 第三セクタ
  デザイナー → デザイナ
などと一度に複数の置換をしつつ、その部分だけを
別の書体に置き換えるという作業です。
例えば、全体の文章が明朝で書かれているとして、置き換えられた
「プリンタ」「第三セクタ」「デザイナ」といった部分だけが
太字ゴシックになっている、という状態です。

ネットで検索したサンプルを元に、下記のようにしています。

---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----

FindString = "プリンター";
ChangeString = "プリンタ";
Kana = true; //カナ識別
ZenHan = true; //全半角識別
findChange();

FindString = "第三セクター";
ChangeString = "第三セクタ";
Kana = true;
ZenHan = true;
findChange();

FindString = "デザイナー";
ChangeString = "デザイナ";
Kana = true;
ZenHan = true;
findChange();

function findChange(){
   app.findPreferences = NothingEnum.nothing;
   app.changePreferences = NothingEnum.nothing;
   FindString = app.activeDocument.search(FindString,Kana,ZenHan, false, false, ChangeString);
}

---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----

いちおう、複数の置換を一度に行なう、という所までは出来たのですが、
同時に書体を変更する、ということが出来ずにいます。

findChange()内で、FontItem = app.fonts.item("書体名");などとしたうえで、
FindStringやChangeStringに対しappliedFont = FontItem;などとしてみたりと
種々試してみたものの、目的部分を取得して書体を適用するというのが出来ずにいます。

類似のサンプルも探してみたのですが、今のところ見つけられず、
こちらにご相談にあがりました。
動作させたい環境は、MacOS 10.5のInDesign CS3です。

何卒よろしくお願い申し上げます。
» 1
[1862]Re: JavaScriptでの一斉置換 | 投稿者:せうぞー | 投稿日:2008/10/20(Mon) 22:53:26
なんとなく書き方がCS2っぽく見えるのが気になりますが...
InDesign CS3ならばこんな感じになります。

var my_font = app.fonts.item("小塚明朝 Pro    R");
app.changeTextPreferences.appliedFont= my_font;

少し前に、クエリを連続適用するってのを書きました。参考になれば幸いです。
http://d.hatena.ne.jp/seuzo/20080725/1216913353
» 2
[1864]Re: JavaScriptでの一斉置換 | 投稿者:たぐ | 投稿日:2008/10/21(Tue) 00:00:22
ご回答ありがとうございます。

しかし、すみません…。
CS2と3を行ったり来たりで実験してたので
記憶がごっちゃになっておりました。
上記のスクリプトはCS2でだけ動いておりました…。

CS3では20行目で
「オブジェクトはプロパティまたはメソッド'findPreferences'を
 サポートしていません」とエラーが出てしまい、
そもそも上記のスクリプトが動いてませんでした。

まずここのCS3への対応のさせ方が分からず、アドバイスいただいた
「var my_font = app.fonts.item("小塚明朝 Pro R");
 app.changeTextPreferences.appliedFont= my_font;」
の部分については、今のところ確かめられてません。
せうぞー様のお手元ではCS3環境で20?22あたりも動きましたでしょうか…?

var my_font以下の2行については、きっと関数findChange()の
どこかに追加するんですよね?

たびたびで申し訳ありません。よろしくお願い申し上げます。

p.s.
「クエリを連続適用」は存じ上げておりました。
私にはまだ敷居が高そうですが、勉強したいと思います。
» 3
[1865]Re: JavaScriptでの一斉置換 | 投稿者:せうぞー | 投稿日:2008/10/21(Tue) 00:42:04
>せうぞー様のお手元ではCS3環境で20?22あたりも動きましたでしょうか…?

えーっと、このへんの書き方はInDesign CS3で変更されました。
単なるテキスト置換ならばfindPreferencesはfindTextPreferencesになるかと思います。くわしくはオブジェクトモデルなどをご覧ください。

>var my_font以下の2行については、きっと関数findChange()の
どこかに追加するんですよね?
search()する前なら、いつでもいいと思います。
» 4
[1866]Re: JavaScriptでの一斉置換 | 投稿者:せうぞー | 投稿日:2008/10/21(Tue) 00:53:11
>JSでなければならない理由はとくにありません

ということでしたら、InDesign CS3の正規表現で
↓検索
(プリンタ|第三セクタ|デザイナ)ー
↓置換
$1
↓置換形式
ゴシック
みたいな感じで一度に検索置換できます。
» 5
[1869]Re: JavaScriptでの一斉置換 | 投稿者:たぐ | 投稿日:2008/10/22(Wed) 00:21:42
CS2では
function findChange(){
   app.findPreferences = NothingEnum.nothing;
   app.changePreferences = NothingEnum.nothing;
   my_font = app.fonts.item("書体名");
   app.changePreferences.appliedFont= my_font;
   FindString = app.activeDocument.search(FindString,Kana,ZenHan, false, false, ChangeString);
}
とすることで、目的の置換が出来ました
(おそらくRとかMとかのウェイトは別途設定する必要があるのだと思いますが)。

ただ、本来の目的のCS3では
function findChange(){
   app.findTextPreferences = NothingEnum.nothing;
   app.changeTextPreferences = NothingEnum.nothing;
   var my_font = app.fonts.item("書体名 ウェイト");
   app.changeTextPreferences.appliedFont= my_font;
   FindString = app.activeDocument.search(FindString,Kana,ZenHan, false, false, ChangeString);
}
としたときに、最後の行で「activeDocument.search();」が関数でない、
とエラー(エラー番号:24)が出てしまいます。
恐らくこれも、私がCS2以前とCS3の書き方の違いを理解できてないだけなのだろうと
思いますが、search();が関数でない…、というのはどういうことなのでしょう…。
かといってapp.activeDocumentを改変したり削ったりするとundefindになってしまい(当然か)、
findTextやchangeTextでは、受け取る値が違うと…。
CS3ではsearch();に変わる別の書き方があるのでしょうか?
» 6
[1870]Re: JavaScriptでの一斉置換 | 投稿者:せうぞー | 投稿日:2008/10/22(Wed) 01:34:06
>search();が関数でない…、というのはどういうことなのでしょう…。

InDesign CS3では廃止されたメソッドだからです。

>changeTextでは、受け取る値が違うと…

引数が違うと思います。
あるいは引数なしで
findChangeGrepOptions
findTextPreferences
changeTextPreferences
の各属性でコントロールするとか。
この記事の書き込み元へのリンク (コメントや質問などはこちらへどうぞ)

このページをシェア