7 返信 最新の回答 日時: Jun 29, 2009 6:49 PM ユーザー:Sakayama

    文章途中文字の削除を行うには cs2 vb2005

    Sakayama

      初めて投稿致します。

       

      InDesignのCS2を使用し、Paragraph 単位で文字の検索を行い、ヒットした所から1文字目までの削除を行います。

       

      最初は、For 文を使用し、1 文字ずつの削除を行っていたのですが、処理量が多くなると作業時間もかなりかかってしまったので、

      現状では、ヒットした箇所から1文字目までを For 文で回しながら、文字を Select し、アプリケーションのメソッドで Cut しています。

       

       

      とても困っていますので、どなたか、ご教授お願いいたします。

        • 1. Re: 文章途中文字の削除を行うには cs2 vb2005
          Sakayama Level 1

          追記致します。

           

          Replace 関数 や String.Remove メソッド を使用して試してみたのですが、
          削除を行わない部分に載っていた文章中のイラストが消えてしまった為、
          1文字ずつの Delete や Cut メソッドを 使用しました。
          どうぞ、宜しくお願い致します。
          • 2. Re: 文章途中文字の削除を行うには cs2 vb2005
            k-ooishi Level 1

            CS3では、FindTextとFindGrepという関数が新設され、正規表現を使った検索が出来るようになりました。正規表現が使えると、この課題は一発で解決できますね。CS2では正規 表現の検索が出来ないと思います。機能不足をスクリプトの側で補うことになるので、効率の悪いことになるということでしょうか。
            ここらへんの文字列の検索関係の関数はすくなくともCS2、CS3の間でかなり設計が変わっているようなので、あまり文字列検索の機能の弱いCS2にこだわるのも得策ではないように思います。 (CS4でどうなってるのかは未確認ですが…)
            CS2でどう効率的に記述するかという問題の直接の答えにはなっていません。すみません。

            1 人が役に立つと言っています
            • 3. Re: 文章途中文字の削除を行うには cs2 vb2005
              Sakayama Level 1

              k-ooishi 様

              ありがとうございます。

               

              正規表現が使えるとなると、考え方も変わってきますね。

              現在は、CS2を使用していますので、また何か良い方法がありましたら、

              ご報告を宜しくお願い致します。

              (行く行くは、CS3~CS4にしたいと思っています。)

              • 4. Re: 文章途中文字の削除を行うには cs2 vb2005
                bykamo

                Mac環境なのでVBでどう書くかは分からないのですが、JavaScriptならば以下のようにすればできると思います。

                 

                //検索置換設定の退避
                var findPreferencesOld = app.findPreferences.properties;
                var changePreferencesOld = app.changePreferences.properties;
                app.findPreferences = 1851876449; //NothingEnum.nothing;
                app.changePreferences = 1851876449; //NothingEnum.nothing;
                var range = app.selection[0].parentStory; //検索範囲は文字キャレットのある親ストーリー
                app.findPreferences.findText = "●●"; //検索文字列
                var Hit_Texts = range.search(); //検索実行
                for (var i = Hit_Texts.length-1; i>= 0; i--){
                try {
                var pindex = Hit_Texts[i].paragraphs[0].characters[0].index;//パラグラフの先頭文字のindex
                Hit_Texts[i].parent.characters.itemByRange(pindex,Hit_Texts[i].characters[-1].index).remov e();//文字列の削除
                } catch(e) {}
                }
                //検索置換設定の復帰
                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;

                1 人が役に立つと言っています
                • 5. Re: 文章途中文字の削除を行うには cs2 vb2005
                  Sakayama Level 1

                  bykamo様
                  ありがとうございます。

                  記載頂いたJavaScriptでの処理は、完璧でした。

                  このJavaScriptを元に、vbの作成を行いました。

                   

                  pindex = Hit_Texts(cnt_i).characters(1).index
                  pindex_2 = Hit_Texts(cnt_i).characters(-1).index
                  Hit_Texts(i).Parent.Characters.ItemByRange(pindex, pindex_2).Remove(pindex_2 - pindex)

                   

                   

                  プログラム上では、エラー無く動くのですが、検索該当文字が削除されないまま残ってしまいます。
                  vbの ItemByRange、Remove などを使用して、範囲文字の削除を行うことは可能でしょうか?

                   

                  どうぞ、宜しくお願い致します。(vbに拘ってすみません。)

                  • 6. Re: 文章途中文字の削除を行うには cs2 vb2005
                    bykamo Level 1

                    InDesign CS2スクリプトリファレンスを確認してみたのですが、JavaScriptのremove()メソッドはVBScriptだとDelete()(引数は無し)になるようです。

                    それから、検索してHitした文字列を消したいだけならば、.Parent.Characters.ItemByRangeの部分は不要で、単にHit_Texts(i).Delete()で いいはずです。

                    • 7. Re: 文章途中文字の削除を行うには cs2 vb2005
                      Sakayama Level 1

                      bykamo様
                      ありがとうございます。

                       

                      Hit_Texts(i) .Delete() でいろいろ出来そうです!
                      ご教授有難うございます。