正規表現置換でフォントや異体字属性が抜け落ちました

[4301]正規表現置換でフォントや異体字属性が抜け落ちました | 投稿者:五月 貴 | 投稿日:2010/02/27(Sat) 13:02:20
先日教えて頂いたJavaScriptによる正規表現置換の後日談です。
他所で試したところ,「フォントが全て替わる」「異体字情報が抜け落ちて別の文字になる」という報告を受けました。
もしかしたら一括置換をする場合は,1文字ごとにフォント情報や異体字情報などを記憶した後で置換し,再度割り当てる作業が必要なのでしょうか?
ソースが思い浮かばずまた難儀してしまっており,再度皆様のお力をお借りできればと思っております。
どうぞよろしくお願い申し上げます。
» 1
[4306]Re: 正規表現置換でフォントや異体字属性が抜け落ちました | 投稿者:ミシマバイカモ | 投稿日:2010/03/01(Mon) 11:12:05
「先日教えて頂いたJavaScriptによる正規表現置換」というのは
*http://www2.rocketbbs.com/11/bbs.cgi?id=thats&mode=pickup&no=4093
のことだとしますと、

txt = CellObj[ccc].contents;
txt.replace(/[0-9A-Za-z、<><>]/g,repFunc);

のようにcontentsに(というか複数文字に)対してreplace()で正規表現置換をするというのは問題が多い方法です。
文字属性などいろいろ飛んでしまいます。
それに、applyParagraphStyle(pStyle)で段落スタイルをかけていますから、文字スタイルを使わずにオーバーライドして文字属性をつけている箇所もダメですね。
(それ以前に、replace()で置換されたことによって飛ぶとは思いますけれど)

CS3ならば、検索置換機能で正規表現置換がありますから、それをスクリプトで使ってやればいいと思います。
replace()を使う場合でも、まず検索置換機能で「数字(^9)」なり「アルファベット(^$)」なりを検索して、HITした文字に対してreplace()で正規表現置換をしてやるという手もあります。
(当方のMacにはCS3,CS4も入れてあるのですが、仕事の方はCS2で組まなければならないんで、下に書いた方法を使っています。CS3,CS4のスクリプトも勉強したいんですが時間がとれないんですよ。泣)
» 2
[4312]Re: 正規表現置換でフォントや異体字属性が抜け落ちました | 投稿者:五月 貴 | 投稿日:2010/03/01(Mon) 23:01:20
コメントありがとうございます。
既にスクリプトからapplyParagraphStyleは外しています。
おっしゃる通り、1文字ごとに確認をとればよいのだろうと想像はつくのですが、それを実現するにはどうすればよいかとまた頭が回らなくなってきています。
» 3
[4313]Re: 正規表現置換でフォントや異体字属性が抜け落ちました | 投稿者:ミシマバイカモ | 投稿日:2010/03/02(Tue) 10:43:32
必ずしも1文字ごとの確認は必要が無いような気もしますが、確認をとる方法としては、
 選択して再描画し、確認ダイアログを出す
というところでしょう。
ただ、選択したものを中心に再描画するので、確認ダイアログと重なってしまい確認しづらいという問題があります。
それから、行頭に選択文字列がきた時、前の行の行末を中心に再描画してしまうとか......

むかし書いた、CS2のスクリプトを貼りますので参考にしてください。

//パーレンで挟まれた文字を括弧つき文字(修飾字形1)に変換
var zoom = app.activeWindow.zoomPercentage;//再描画のために拡大率を記憶
var myStory = app.selection[0].parentStory;//検索置換範囲は親ストーリー
var otfnalt1 = Array();
otfnalt1[0] = Array("nalt",1);//修飾字形1(回りくどいのは初期(よく解ってない頃)に書いたスクリプトだから)
findPreferencesOld = app.findPreferences.properties;
changePreferencesOld = app.changePreferences.properties;
app.findPreferences =  NothingEnum.nothing;
app.changePreferences = NothingEnum.nothing;
app.findPreferences.findText = "(^?)";//検索文字列:パーレンで挟まれた文字
var findList = myStory.search();//検索実行
for (var i=findList.length-1;i>=0;i--){//HITした文字列を後ろから調べていく
   app.selection = findList[i];//HITした文字列選択
   app.activeWindow.zoomPercentage = zoom;//再描画
   var repstr = "" + app.selection[0].contents;//var repstr = "" + findList[i].contents;の方が解りやすいかな
   var prechar = repstr.substr(1,1);//パーレンで挟まれた中の1文字だけ
   repchar = prechar.replace(/[ヲア-ン]/g, repFunc);//半角カナを全角カナに置換
   if (confirm("括弧つき文字に換えますか?OK")){
       app.selection[0].contents = repchar;
       app.selection[0].tatechuyoko = false;//縦中横はオフ
       app.selection[0].opentypeFeatures = otfnalt1;//修飾字形1に
   }
}
app.findPreferences.properties = findPreferencesOld;
app.changePreferences.properties = changePreferencesOld;
if (app.findPreferences.kerningMethod=="None") app.findPreferences.kerningMethod = 1851876449;
if (app.changePreferences.kerningMethod=="None") app.changePreferences.kerningMethod = 1851876449;

function repFunc(chr,ptr,allStr){
   var hankaku = "ヲアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン";
   var zenkaku = "ヲアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン";
   var n = hankaku.indexOf(chr);
   return zenkaku.charAt(n);
}
» 4
[4320]Re: 正規表現置換でフォントや異体字属性が抜け落ちました | 投稿者:五月 貴 | 投稿日:2010/03/02(Tue) 19:31:53
ソースまでご提示頂きまして恐れ入ります。
近日中に試してみてご報告致します。
(ちなみに,使う環境はMac版CS3とWin版CS4です)
この記事の書き込み元へのリンク (コメントや質問などはこちらへどうぞ)