色付き置換 (RichTextBox)
カテゴリ:.Net Framework
たまたま昨日書いた3つのエントリのうち2つを合わせたかのようなタイトルではありますが、今日はそんなことをしました。
.Net Framework で 名前付き タグ付き置換(正規表現置換)を行う
色付きコード
今、置換メソッドを使うプログラムを作っています。
どういう目的で置換をするのかというと、テキストの修正です。
このことはもう1つのエントリとも関連していきます。別のプログラム、テンプレートを使って作られたテキストベースのファイルを正しい、統一された書式に近づけていく作業です。
#わずらわしいですね。もう1回言ってしまうと、今やっているのはWebサイトの移行作業です。
修正後のファイルをWebブラウザ(WebBrowserコントロール)とテキストボックス(TextBoxコントロール)に表示して、確認してから上書きすることにしているのですが、利用する立場になると「変更箇所を提示する」という改良案を優先して実装したくなります。
案は3つあります。
1.HTMLのタグで色付けしてWebブラウザで表示する。
2.RichTextBox に読み込み、プログラムで制御して色付けする。
3..Net Framework 3.0 の RichTextBox 、 FlowDocument を作る。
1の場合、ブログ投稿ツールのようなHTML編集機能が使えるとしても、置換処理の際には関係のない装飾タグを挿入することができないので、装飾情報を別途保管し、HTML化まで行わないといけません。またテキストに含まれる<,>を文字参照に置き換えないといけません。色付けするのがHTMLソースなので置換箇所は多いです。
今まで一度もテキストエディタ、HTMLエディタを製作しようと思ったことがないので、 RichTextBox なんて使ったことがなかったのですが、使ってみました。
余談になります。テキストエディタなんて作っても今あるフリーソフトに実用性で勝てるわけないと考えている私ですが、文書エディタの開発を構想中です。
以下が実行してみた2のサンプルコードです。
(3はしませんでした。System.Windows.Forms.Form で Fx3.0 の System.Windows.Controls.Control を使うにはホストをするはずだけど、それって難しいのかな?)
richTextBox_Preview.Select(20, 5);
richTextBox_Preview.SelectionColor = Color.Red;
richTextBox_Preview.SelectedText = "置換してやったぜ~~~。";
開始位置と長さを引数にして Select することで部分が選択され、 SelectionColor で色指定しています。
さらに SelectedText を設定することで選択部分が新たな文字列が置き換わります。
このすごいところが、
文字数は違ってもきちんとテキストが置き換わっていること、(普通ですが、1でやろうと思うと・・・。)
そして、文字数が違っても(「置換してやったぜ~~~。」の部分全てが)赤色で置き換わっていること、(これもブログ投稿ツールやWebページエディタの挙動と一致しますが、一からやろうと思うと・・・。)
です。
RichTextBox は内部的にテキストと装飾情報に分かれているようです。なので単純な置換であれば Replace ではなく、 Select メソッドと SelectedText プロパティを使用するようにすれば、後はその間に SelectedColor 等の変更を入れてあげるだけで、従来のテキストの置換と同じ感覚で変更箇所を装飾できるようになります。
ただし、問題もあります。
・処理が遅くなる。
(一括自動処理ではなく)プレビューで使われるので、何倍時間がかかったかではなく、使う人の感覚次第ってことでシビアな問題ではなさそうです。私はするつもりはありませんが、高速化の情報については下の覚え書きを参考にししてください。
・置換処理の書き方に互換性がない。
プログラムソースそのものを置換して RichTextBox を使った方法に変更できなくはないが、どちらを使うのにもほとんど変更しなくていいようなユーティリティクラスを作って利用したいところです。
参考になるリンク(覚え書き) http://www.geocities.jp/hatanero/
「ソフト工房 波田」というページにリンクします。「プログラムはプロブレム」の中にRichTextBoxについてのリンクがあります。