Illustrators RE 3

日曜日は海水浴に行ってきました。やはり台風の影響で少々うねりがあったのですが泳げない事も無い感じでした。娘をだっこして海へと入っていき胸ぐらいまでつかる深さまで進んだとき、大きな波が白い波頭をたたえて迫ってきました。
二人でモロ並みをかぶったのですが、わたしは眼鏡を流されてしまいました。
良いんだ…どうせ買い替えようと思っていたやつだし。まあ、そんなこんなで、日焼け跡がひりひりしています。
今回はファンクションひとつだけです。しかしながら重要な部分です。
以前にも書きましたがreplaceで強引に置換してしまう訳にはいかないのですが、じゃあ、どうするかって言う所が悩ましい所なのです。

まあ、置換作業は置いておいて、今回は対象の位置を特定してしまいましょう。色々と考えてはいるのですが、処理の単位はtextFrameごとにしようと思います。ですから今回のファンクションと言うのはtextFrameのcontentsにマッチした文字列が幾つあってそれは何文字目から始まって、何文字がヒットしているのかと言う所を明らかにするものです。
引数として渡すものはtextFrameもしくはtextRangeと正規表現オブジェクトです。
帰ってくるのは2次元配列で、Arrayのlength自体がマッチした数。個々の配列はスタートポジションと文字列の長さで構成されたものです。

var grepper1 = function(obj, re){ //obj:TextFrame
    var result =new Array();
    var swp,st;
    var pos = 0, len = 0;
    var tgcStyle,tgpStyle,cstyle,pstyle,tg,tgtStr;
    var ofst =0;

    if (ls0.selection.index==0){ //get target characterStyle
        cstyle= null;
        } else {
            cstyle = charStyles.list()[ls0.selection.index-1];
            }
    if (ls1.selection.index==0){ //get target paragraphStyle
        pstyle= null;
        } else {
            pstyle = paraStyles.list()[ls1.selection.index-1];
            }

    tgtStr = obj.contents;
    
    while(re.test(tgtStr)){
        st = tgtStr.match(re)+””;
        swp = “”;
        for(var i=0;i<st.length;i++) swp += “`”;
        pos = tgtStr.indexOf(st);
        len = st.length;
        if (r0.value||(cstyle==null&&pstyle==null)){
            result.push([pos, len]);
            } else {
                tgcStyle = tg.characters[pos+ofst].characterStyles;
                tgpStyle = tg.characters[pos+ofst].paragraphStyles;
                if (tgcStyle!=cstyle&&cstyle!=null) continue;
                if (tgpStyle!=pstyle&&pstyle!=null) continue;
                //if (cstyle==null&&tgpStyle!=pstyle) continue;
                result.push([pos, len]);
                }
        tgtStr = tgtStr.replace(st, swp);
        }
    return result;
    }<st.length;i++) swp="" +="`" ;="" pos="tgtStr.indexOf(st);" len="st.length;" if="" (r0.value||(cstyle="=null&&pstyle==null)){" result.push([pos,="" len]);="" }="" else="" {="" tgcstyle="tg.characters[pos+ofst].characterStyles;" tgpstyle="tg.characters[pos+ofst].paragraphStyles;" (tgcstyle!="cstyle&&cstyle!=null)" continue;="" (tgpstyle!="pstyle&&pstyle!=null)" (cstyle="=null&&tgpStyle!=pstyle)" tgtstr="tgtStr.replace(st," swp);="" return="" result;="" }

本当に色々試しているのですがtextFrameとtextRangeでの処理の切り替えをどうしようか未だに決めかねています。とりあえずファンクションを分ける方向で進めますね。
処理は先に記述した解説でほぼ完結しているのですが、詳細を見ていきましょう。

    if (ls0.selection.index==0){ //get target characterStyle
        cstyle= null;
        } else {
            cstyle = charStyles.list()[ls0.selection.index-1];
            }
    if (ls1.selection.index==0){ //get target paragraphStyle
        pstyle= null;
        } else {
            pstyle = paraStyles.list()[ls1.selection.index-1];
            }

この部分というのはUIで入力されたstyle情報の取得です。未選択の場合はindexが0で来るのでとりあえずnullを設定しておきます。

    tgtStr = obj.contents;
    
    while(re.test(tgtStr)){
        st = tgtStr.match(re)+””;
        swp = “”;
        for(var i=0;i<st.length;i++) swp += “`”;
        pos = tgtStr.indexOf(st);
        len = st.length;
        if (r0.value||(cstyle==null&&pstyle==null)){
            result.push([pos, len]);
            } else {
                tgcStyle = tg.characters[pos+ofst].characterStyles;
                tgpStyle = tg.characters[pos+ofst].paragraphStyles;
                if (tgcStyle!=cstyle&&cstyle!=null) continue;
                if (tgpStyle!=pstyle&&pstyle!=null) continue;
                //if (cstyle==null&&tgpStyle!=pstyle) continue;
                result.push([pos, len]);
                }
        tgtStr = tgtStr.replace(st, swp);
        }<st.length;i++) swp="" +="`" ;="" pos="tgtStr.indexOf(st);" len="st.length;" if="" (r0.value||(cstyle="=null&&pstyle==null)){" result.push([pos,="" len]);="" }="" else="" {="" tgcstyle="tg.characters[pos+ofst].characterStyles;" tgpstyle="tg.characters[pos+ofst].paragraphStyles;" (tgcstyle!="cstyle&&cstyle!=null)" continue;="" (tgpstyle!="pstyle&&pstyle!=null)" (cstyle="=null&&tgpStyle!=pstyle)" tgtstr="tgtStr.replace(st," swp);="" }

tgtStrはtextFrameのcontentsを抜き出し処理する為のテンポラリです。つづいてループの中
stはmatchメソッドの返り値をstringにキャストしたもの。ヒットした内容ですね。続く処理はヒットした内容がcontentsの頭から何文字目に当たるのかをindexOfメソッドを利用して調べます。そして文字数を調べれば知りたいパラメータは取得完了です。
結果をresultにpushするのですが、条件があります。ターゲットスタイルがマッチしているかどうかです。
最後に、テンポラリのヒットした部分を再度ヒットしない様に置換してしまいます。これをreに対するtestメソッドがfalseを返すまで繰り返すと前述の2次元配列が取得出来る訳です。

そして、ここまで書いて気がついたんですけど…「スレッデッドテキストフレームまたいだ部分が検索対象だったら2つともテキストフレーム選んでても引っかからないよね…」と言う訳で急遽方針変更です。対象を全てStoryに一本化します。
ですから上記のコードはお払い箱とします。ぐだぐだだあ〜

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中