◀Unicode版開発トップへ
  • 932 正規表現キーワードで文字列の色分けができません。
    • 933 Re:正規表現キーワードで文字列の色分けができません。
      • 934 Re2:正規表現キーワードで文字列の色分けができません。
        • 936 Re3:正規表現キーワードで文字列の色分けができません。
  • [932] 正規表現キーワードで文字列の色分けができません。 ds14050 2009年05月27日 00:52

    sakuraW_r1574で試したのですが、表題の通りです。

    クォーテーション文字列の色分けを組み込みの機能を使わずに
    正規表現キーワードで行っています。
    そのときに色指定を「シングル(ダブル)クォーテーション」に
    しているのです。

    組み込みの色分け機能を使わないので色指定でクォーテーション文字列の
    チェックを外しているのですが、チェックが外れていると正規表現キーワード
    の色指定も無効になってしまっているようです。

    みなさんは大丈夫ですか?

    # 一年ほど前にソースコードを見たときはコメントで明示して
    # こういう状況に対応していたはずなのです。
    • [933] Re:正規表現キーワードで文字列の色分けができません。 ds14050 2009年05月27日 06:13

      追加です。

      以前見たコメントというのは
      sakura/trunk2/sakura_core/CRegexKeyword.cpp
      のものでした。

      242行目> //色指定でチェックが入ってなければ検索しなくてもよい
      249行目> //正規表現では色指定のチェックを見る。
      255行目> //正規表現以外では、色指定チェックは見ない。
      256行目> //例えば、半角数値は正規表現を使い、基本機能を使わないという指定もあり

      まずいのは以下の 2点だと思います。

      sakura/trunk2/sakura_core/view/colors/CColor_RegexKeyword.cpp
      bool CColor_RegexKeyword::BeginColor(const CStringRef& cStr, int nPos)
      21行目> this->m_nCOMMENTMODE = ToColorIndexType_RegularExpression(nMatc
      hColor);

      nMatchColorは正規表現キーワード1,2,3,...の何番目の配色か
      を表しているのではないと思います。

      ----

      sakura/trunk2/sakura_core/view/CEditView_Paint.cpp
      void CEditView::SetCurrentColor( CGraphics& gr, EColorIndexType eColorIndex )
      232行目> if( info.m_bDisp ){

      これは色指定のチェック状態をチェックしてるのだと思いますが
      正規表現キーワードにとって正規表現キーワード1,2,3,...以外の
      色指定のチェック状態はチェックしてはいけません。

      この ifを外してしまうとどういう影響があるのかわかりませんが
      色指定のチェックなしでも正規表現キーワードが有効にはなるようです。
      つまり、以前の通りに。
      • [934] Re2:正規表現キーワードで文字列の色分けができません。 ryoji 2009年05月27日 20:54

        ▼ ds14050さん
        > 以前見たコメントというのは
        > sakura/trunk2/sakura_core/CRegexKeyword.cpp
        > のものでした。

        うぉ。現状の挙動は知ってましたが、昔からのものとばかり思い込んでいました。使い込みが足りてないのがばれちゃいますね。σ(^^;;;
        「(謎の引用>)仕様がねじれている気もするが」、以前の挙動のほうが柔軟ですよね。僕もそっちのが好みです。ていうか、このままじゃ、これ絡みで別の誤動作も確実なので...
        正規表現URLをクリッカブルにする件(>>unicode:922)にも影響があるし、急いで修正しようと思います。

        > sakura/trunk2/sakura_core/view/colors/CColor_RegexKeyword.cpp

        えぇ、と。
        こちらは現在の処理で正しいです(のはず)。下駄はあとで外して使うことになっています。
        「(謎の引用2>)nMatchColorとはそのまま色指定なのだから COLORIDX_REGEX_FIRST という下駄をはかせる必要はなくて」とご推察のようですが、この下駄をはかせておかないと CColorStrategyPool::GetStrategyByColor の機能(色指定からCColorStrategy*へ辿る)が正しく動かなくなってしまいます。あと、ここでは「正規表現キーワード1,2,3,...の何番目の配色か」を覚えるほうが賢明な気もしますが(また、そうしているかのように読み違えやすいですが)、今のところはそうなっていません。
        #ちなみに、従来のANSI版でも同様に色指定に下駄をはかせて処理しています。

        > sakura/trunk2/sakura_core/view/CEditView_Paint.cpp

        こちらがビンゴですね~。
        色指定の有無は、ご指摘の CEditView::SetCurrentColor が呼ばれるよりも以前にチェック済みのはずで、ここでのチェックは念のためのガードのつもりではないかと思います。でも、この位置でのガードは内部矛盾を誘発するだけで何の利点も無さそうです。このガードを外して何か問題が起きるようなら、もともと事前のチェックのほうが間違っているわけで...
        実は、rev1443あたりでこの近辺に見られた多くの描画関連デグレードを修復しています。で、このガードは不要なのでは?と、そのときに気が付きつつも、特に害がありそうにも見えなかったので除去してませんでした。

        「(謎の引用3>)待ってても直らないかもしれないので調べた。」
        色分け関連のデグレードは見つけにくく修正も厄介なので、こういう報告があると、皆、助かると思いますよ。(^-^)
        • [936] Re3:正規表現キーワードで文字列の色分けができません。 ds14050 2009年05月28日 02:02

          >この下駄をはかせておかないと CColorStrategyPool::GetStrategyByColor
          >の機能 (色指定からCColorStrategy*へ辿る)が正しく動かなくなってしまいます。

          ですよね。これが機能する理由がわからなくて、正規表現キーワードを
          プールに一番最初に push_backするから、ストラテジを先頭から
          検索したときに正規表現キーワードを優先的にみつけられるのかな
          と想像していました。実際、ここを変更しても正規表現キーワードが
          正しく動いているように見えたので、勘違いしました。

          ともあれ、素早いチェックと修正ありがとうございます。