マーカーの微妙なお話 2.6.0

  1. --------------------------------------------------------------------------------
    マーカーの設定
    マーカー を複数選択して、
      「上へ」「下へ」「削除」

      ☐ 単語のみ
      ☑ 大文字小文字を区別
      ☑ 正規表現
      ☑ 有効
    が一度に操作できると、
    ひとまとまりのマーカーの設定に便利でありがたいです。
    お時間がゆるせばご検討を、お願いいたします。_o_
    --------------------------------------------------------------------------------
    マーカーで色がついた文字では、IVS が表示されません(基底文字の表示)。
    SVS は表示されます。

    【基底文字】
    侮 U+4FAE

    【IVS (VS-17 ~ VS-256)】

     |  inuuik  |  返信
  2. IVS で切れてしまったので、再掲
    --------------------------------------------------------------------------------
    マーカーの設定
    マーカー を複数選択して、
      「上へ」「下へ」「削除」

      ☐ 単語のみ
      ☑ 大文字小文字を区別
      ☑ 正規表現
      ☑ 有効
    が一度に操作できると、
    ひとまとまりのマーカーの設定に便利でありがたいです。
    お時間がゆるせばご検討を、お願いいたします。_o_
    --------------------------------------------------------------------------------
    マーカーで色がついた文字では、IVS が表示されません(基底文字の表示)。
    SVS は表示されます。

    【基底文字】
    侮 U+4FAE

    【IVS (VS-17 ~ VS-256)】
    侮 U+4FAE U+E0100; Adobe-Japan1; CID+3552
    侮 U+4FAE U+E0101; Adobe-Japan1; CID+13382
    侮 U+4FAE U+E0102; Hanyo-Denshi; JA4178
    侮 U+4FAE U+E0103; Hanyo-Denshi; JC1424

    【互換漢字SVS (VS-1 ~ VS-3)】
    侮 U+4FAE U+FE00

    (U+4FAE U+E0101 と U+4FAE U+E0103 と U+4FAE U+FE00 は同じグリフ)
    フォントは Noto Sans Mono や 花園明朝 など
    --------------------------------------------------------------------------------
    全文字マーカー  作りました… (^^;
    ※全文字※ **改行以外すべて** に8色でマーカー

    (?#1).(?=(?:.{8})*?(?:.{7})$)
    (?#2).(?=(?:.{8})*?(?:.{6})$)
    (?#3).(?=(?:.{8})*?(?:.{5})$)
    (?#4).(?=(?:.{8})*?(?:.{4})$)
    (?#5).(?=(?:.{8})*?(?:.{3})$)
    (?#6).(?=(?:.{8})*?(?:.{2})$)
    (?#7).(?=(?:.{8})*?(?:.{1})$)
    (?#8).(?=(?:.{8})*?(?:.{0})$)

    これをテキストに張り付けて、一行ずつ、右クリックから「マーカーに追加/削除」

    ツール - マーカー - マーカーの設定
      ↓
      マーカーの一覧の中から、正規表現の左橋の (?#1) から (?#8) を目印にして
        その番号の色を設定
        ☑ 正規表現
        ☑ 有効
      を8つすべてに設定して OK

    これで、改行を除くすべての文字にマーカーが設定できます。
    行末からの文字数で色を選ぶので、隣り合った文字の色が違います。

    Unicode のサロゲートペアの文字は1字の扱いで色がつきます。
    VS や結合文字は見えなくても1色を使うので、その左側では色が
    ずれます。
    --------------------------------------------------------------------------------
    マーカーの色を変えてから、さて、元に戻したいときの控え

    ※以下の (255,240,176) 表記は
    背景色 カスタム → 色の作成

    赤(R):255 緑(G):240 青(U):176 

    を設定して OK をクリックすると適用されることをさす

    文字色はすべて 自動

    自動マーカー  (216,216,220)
    マーカー(1)   (254,185,184)
    マーカー(2)   (254,224,179)
    マーカー(3)   (255,240,176)
    マーカー(4)   (194,249,173)
    マーカー(5)   (179,214,255)
    マーカー(6)   (246,210,255)
    マーカー(7)   (254,189,210)
    マーカー(8)   (237,222,202)
    --------------------------------------------------------------------------------

     |  inuuik  |  返信
  3. こんばんは、ご報告ありがとうございますw

    「微妙」って件名から、恐らく察してくださっているのだと思いますが… ^^;

    > マーカーで色がついた文字では、IVS が表示されません(基底文字の表示)。

    基底文字にマーカーつけた場合の、その基底文字を使った IVS の描画ですよね。Mery の IVS 対応は描画のみで、検索とか色付けロジックのほうは IVS 対応してないんですよねぇ。(マーカー以前の問題です……)

    > ひとまとまりのマーカーの設定に便利でありがたいです。

    開発時からうすうす気づいてましたが、複数同時に設定するタイプの画面は作るのがちょっと大変なので、そのうち暇になったらやろうかなーと思っていますw

    > 全文字マーカー  作りました… (^^;

    すっごーい!正規表現が得意なフレンズなんだね!(知ってた)
    (ケモフレマーカー、全手動で登録してた私の黒歴史)

    ホントは最初からコレがやりたかっただけなんです、マーカー機能。

    なるほど、この正規表現をマーカー登録していて思いました。
    マーカー設定画面での複数同時選択、欲しいわ ^^;

     |  Kuro  |  返信
  4. いつもたいへんお世話になっています。

    > 件名から、恐らく

    ついにメタ言語によるメッセージ伝達に成功したのかな?…ヽ(^o^)丿

    > 描画のみで、検索とか色付けロジックのほうは IVS 対応してない…

    はい、その伝説は聞いています (^^;  お察しします、しますが、でも…

    基底文字 侮 U+4FAE 
    の直後に、IVS の U+E0101 や U+E0103 が続いていると、正しく異体字が
    描画されています。
    同様に SVS の U+FE00 が続いていると、異体字(互換漢字)が表示されます。

    (U+4FAE U+E0101 と U+4FAE U+E0103 と U+4FAE U+FE00 は同じグリフ)

    ここにマーカーで色が付くと、
      SVS の方は正しい異体字の字体そのままに色がついてバッチリです。
      IVS では、IVS がついていない状態の基底文字の表示に変化します。

    フォントの仕組みでは、IVS (異体字) と SVS (互換漢字) の違いは、
    VS (バリエーションシーケンス) だけで、フォント内の置換設定は
    同じはず…、SVS は cmap_format_14 です。

    結合文字として認識しないので、グリフランを分断してフォントに渡しているの
    なら SVS も描画できないはずなのに。

    IVS と SVS のプログラムでの扱いの違いは何かな? ということをお伝え
    したかった、のです、が、
    え、ふれたくない、、、、 (^.^)/~~~

    > (知ってた)

    ゴホッ。パークのことはなんでも知ってるフレンズさんにしつもんしようと、
    やっと としょかん まできました w

    > ケモフレマーカー、全手動

    すっごーい、がんばったー!

    > マーカー設定画面での複数同時選択、欲しいわ ^^;

    わーい ‼

    いちおう動く正規表現 ^^; たくさんつくったので、どんどんお持ちくださいね。

    ※全文字 短縮※
    (?#1).(?=(?:.{8})*?.{7}$)
    (?#2).(?=(?:.{8})*?.{6}$)
    (?#3).(?=(?:.{8})*?.{5}$)
    (?#4).(?=(?:.{8})*?.{4}$)
    (?#5).(?=(?:.{8})*?...$)
    (?#6).(?=(?:.{8})*?..$)
    (?#7).(?=(?:.{8})*?.$)
    (?#8).(?=(?:.{8})*?$)

    ※全文字※    ※これは普通に、先読み → 一致文字列 の順番※
    (?#1)(?=(?:.{8})*?(?:.{8})$).
    (?#2)(?=(?:.{8})*?(?:.{7})$).
    (?#3)(?=(?:.{8})*?(?:.{6})$).
    (?#4)(?=(?:.{8})*?(?:.{5})$).
    (?#5)(?=(?:.{8})*?(?:.{4})$).
    (?#6)(?=(?:.{8})*?(?:.{3})$).
    (?#7)(?=(?:.{8})*?(?:.{2})$).
    (?#8)(?=(?:.{8})*?(?:.{1})$).

    【バリエーション】
    ※半角空白・タブ文字※
    (?#a1)[ \t](?=(?:.{8})*?(?:.{7})$)
    (?#a2)[ \t](?=(?:.{8})*?(?:.{6})$)
    (?#a3)[ \t](?=(?:.{8})*?(?:.{5})$)
    (?#a4)[ \t](?=(?:.{8})*?(?:.{4})$)
    (?#a5)[ \t](?=(?:.{8})*?(?:.{3})$)
    (?#a6)[ \t](?=(?:.{8})*?(?:.{2})$)
    (?#a7)[ \t](?=(?:.{8})*?(?:.{1})$)
    (?#a8)[ \t](?=(?:.{8})*?(?:.{0})$)

    ※半角空白・タブ文字以外すべて※
    (?#c1)[^ \t](?=(?:.{8})*?(?:.{7})$)
    (?#c2)[^ \t](?=(?:.{8})*?(?:.{6})$)
    (?#c3)[^ \t](?=(?:.{8})*?(?:.{5})$)
    (?#c4)[^ \t](?=(?:.{8})*?(?:.{4})$)
    (?#c5)[^ \t](?=(?:.{8})*?(?:.{3})$)
    (?#c6)[^ \t](?=(?:.{8})*?(?:.{2})$)
    (?#c7)[^ \t](?=(?:.{8})*?(?:.{1})$)
    (?#c8)[^ \t](?=(?:.{8})*?(?:.{0})$)

    ※半角全角空白・タブ文字※
    (?#b1)[ \t\x{3000}](?=(?:.{8})*?(?:.{7})$)
    (?#b2)[ \t\x{3000}](?=(?:.{8})*?(?:.{6})$)
    (?#b3)[ \t\x{3000}](?=(?:.{8})*?(?:.{5})$)
    (?#b4)[ \t\x{3000}](?=(?:.{8})*?(?:.{4})$)
    (?#b5)[ \t\x{3000}](?=(?:.{8})*?(?:.{3})$)
    (?#b6)[ \t\x{3000}](?=(?:.{8})*?(?:.{2})$)
    (?#b7)[ \t\x{3000}](?=(?:.{8})*?(?:.{1})$)
    (?#b8)[ \t\x{3000}](?=(?:.{8})*?(?:.{0})$)

    ※ケモフレマーカー※
    ※半角全角空白・タブ文字以外すべて※
    (?#d1)[^ \t\x{3000}](?=(?:.{8})*?(?:.{7})$)
    (?#d2)[^ \t\x{3000}](?=(?:.{8})*?(?:.{6})$)
    (?#d3)[^ \t\x{3000}](?=(?:.{8})*?(?:.{5})$)
    (?#d4)[^ \t\x{3000}](?=(?:.{8})*?(?:.{4})$)
    (?#d5)[^ \t\x{3000}](?=(?:.{8})*?(?:.{3})$)
    (?#d6)[^ \t\x{3000}](?=(?:.{8})*?(?:.{2})$)
    (?#d7)[^ \t\x{3000}](?=(?:.{8})*?(?:.{1})$)
    (?#d8)[^ \t\x{3000}](?=(?:.{8})*?(?:.{0})$)

    【バリエーション】は目印に (?#a1) みたいに a b c d がついてます。
    お互いに逆で補完する間柄なのが a c と b d の組です。
    同時に組の16コを有効にすると、全文字マーカーの8つと同じです。

    このオンオフがキー割り当てできたら、おもしろいかも (^^;;
    (…デフォでビルトインしません? ww)

    おしまい

     |  inuuik  |  返信
  5. ご返信ありがとうございます。

    > はい、その伝説は聞いています (^^;  お察しします、しますが、でも…

    IVS アーアーなにそれ聞こえなーい (∩゚д゚)

    > 結合文字として認識しないので、グリフランを分断してフォントに渡しているの
    > なら SVS も描画できないはずなのに。

    なるほど、そういうことでしたか。(SVS を知らなかったです ^^;)
    プログラム的には、一応分断はしているもののある程度は結合文字の判定ロジックを入れています。

    U+4FAE U+FE00
    ↑ これの場合は FE00 が 2 バイトなので判定ロジックに引っかかってくれていますね。

    U+4FAE U+E0101
    ↑ こっちは E0101 が 4 バイトなので、ちょっと判定が足りてなかったようです。たぶん、対応できるような気がします ^^

    > いちおう動く正規表現 ^^; たくさんつくったので、どんどんお持ちくださいね。

    すごすぎます!ありがたく使わせていただきます。
    文字を入力するたびにカラーリングが変わるのは素敵ですね ٩( ''ω'' )و

    これだけ色分けしてもそこそこ速度出てるので良かったです。
    さすがに DirectWrite + 全文字マーカーだとちょっと重くなりますが… ^^;

     |  Kuro  |  返信
  6. いつも本当にありがとうございます。

    > こっちは E0101 が 4 バイトなので、ちょっと判定が… たぶん、対応できるような…

    もう Unicode は 1 文字に 6 バイトや 8 バイト、さらに長いものも続々…、
    ご対応に頭が下がります。

    > 文字を入力するたびにカラーリングが変わるのは素敵…

    全文字マーカー、最初は負荷テストのつもりで作ったのですが、
    まったく予想外なことに自分には実用的で (^^;;

    色の選択がとても綺麗なので、見ているだけで楽しい、というのがまず第一ですが、
    考えてみれば、このように各文字の幅を広い範囲で表示するものを
    テキストエディタで見たことがありませんでした。
    フォントのアドバンス幅が一目でわかって、文も読めることに驚きました。

    当たり前ながら、タブの幅が可変しながら桁を揃えていく様子も、色で見ると新鮮
    でした。
    DirectWrite で等幅フォントでも全角 1 字が半角 2 字より微妙に狭いことも
    ハッキリとわかります。
    プロポーショナルフォントの詰め込みも文字通りに一目瞭然です。
    行の文字数を揃えれば、結合文字の存在が視覚に乱れとして感じるのも面白くて、
    前後の行とのずれがいろいろなことを知らせてくれます。
    これは斬新。

    フォントの調査ツールとして、とても大切なものとなりました。

    > これだけ色分けしてもそこそこ速度出てるので良かったです。

    このように高速な色付けを実装して下さって、心から感謝です。

    申し訳ないです。先日の正規表現に無駄なところがありました。
      [^ \t]  →  [^ \t\n]
      [^ \t\x{3000}]  →  [^ \t\x{3000}\n]

    お手数てすが、以下と差し替えお願いします。

    ※半角空白・タブ文字以外すべて※
    (?#c1)[^ \t\n](?=(?:.{8})*?(?:.{7})$)
    (?#c2)[^ \t\n](?=(?:.{8})*?(?:.{6})$)
    (?#c3)[^ \t\n](?=(?:.{8})*?(?:.{5})$)
    (?#c4)[^ \t\n](?=(?:.{8})*?(?:.{4})$)
    (?#c5)[^ \t\n](?=(?:.{8})*?(?:.{3})$)
    (?#c6)[^ \t\n](?=(?:.{8})*?(?:.{2})$)
    (?#c7)[^ \t\n](?=(?:.{8})*?(?:.{1})$)
    (?#c8)[^ \t\n](?=(?:.{8})*?(?:.{0})$)

    ※ケモフレマーカー※
    ※半角全角空白・タブ文字以外すべて※
    (?#d1)[^ \t\x{3000}\n](?=(?:.{8})*?(?:.{7})$)
    (?#d2)[^ \t\x{3000}\n](?=(?:.{8})*?(?:.{6})$)
    (?#d3)[^ \t\x{3000}\n](?=(?:.{8})*?(?:.{5})$)
    (?#d4)[^ \t\x{3000}\n](?=(?:.{8})*?(?:.{4})$)
    (?#d5)[^ \t\x{3000}\n](?=(?:.{8})*?(?:.{3})$)
    (?#d6)[^ \t\x{3000}\n](?=(?:.{8})*?(?:.{2})$)
    (?#d7)[^ \t\x{3000}\n](?=(?:.{8})*?(?:.{1})$)
    (?#d8)[^ \t\x{3000}\n](?=(?:.{8})*?(?:.{0})$)

    これでほんとにおしまい w

     |  inuuik  |  返信