テキストエディタの禁則処理

SourceForge.JP で運営しているプライベートプロジェクトの Azuki の開発が止まっています。ただしプロジェクト管理システムから見ると止まっているだけで、水面下では次期バージョンに向けて「禁則処理」と呼ばれる処理を試し実装しています。何もしていないワケではないのです🙂

禁則処理は日本語特有と思われるルールです。代表例は「行を句読点で始めてはいけない」というルールでしょうか。要するに読みにくい「見た目」にならないようにするのが目的のルールです。しかしこの禁則処理、実は私自身がまったく普段使わないのです。はい。そのため、普段とはまったく違った作業の進め方を試しています。普段の開発では、複雑な処理であっても「設計、実装、テスト」の3段階で進めていきます。しかし今回の禁則処理については自分が使わない=知らないことが原因で多くの問題を設計時に見落とすのではないかと考えました。そこで現在は、捨てることを前提にしたプロジェクトのコピーを作って試行錯誤をしています。ガチャガチャと無責任にコーディングするのは楽しいものです。

捨てることを前提に雑な実装を重ねてガチャガチャやった結果、やはりいくつか気付いていなかった問題が出てきました。その中で一番大きな収穫は、次のような場合の対応です。

  • 折り返し幅が[(あ)]という文字列の最後の文字あたりに該当している
  • 行頭禁則と行末禁則により、[(あ)]が次の行の頭に表示されている
  • この状態での後ろにもう一つを追加する

このような状況になった場合、正しくは[(あという前半の文字列が前の行に移動しなくてはいけません。もし最初から[(ああ)]だった場合を考えると禁則処理は次のように進むからですね。

  1. 折り返し幅が[(ああ)]という文字列の最後の文字あたりに該当している
  2. 通常の折り返し処理でが次の行の頭に移動
  3. しかしは行頭禁則によって行頭にあってはいけないので一文字余分に次の行へ送る、つまり次の行頭に)]が来る
  4. しかし)]は行頭禁則により行頭に来てはいけないのでさらに一文字余分に次の行へ送る、つまりあ)]が次の行頭に来る
  5. ここで禁則に反する状態ではなくなるので、折り返し位置を確定する

ある行で文字を追加したときに「その行より前の行に」影響が出る場合は珍しいので、完全に想定外でした。いやはや、勉強になったです(なお単純な英文ワードラップでもスペース入力によって割られた単語の前半が前の行末に移動するケースがあるので、禁則処理特有の話ではありません)。

ちなみに[(あ)]の場合、さきほどの禁則処理の 5 番目の時点で行末がになり、禁則に反する状態になります。そのためが次の行へ送られ、さらに行末禁則でが次の行に送られる結果となります。さらにちなみに、のかわりにa、つまり[(aa)]だった場合は英文ワードラップによって真ん中で割られることなく全体が次の行へと送られます。うーん、複雑です…もう一回設計しなおすべきかな。

なおこの水準まで禁則処理をしっかり実装しているテキストエディタは少なかったです。参考にした 15 種類の日本語テキストエディタの中では、秀丸、Ginnie、真魚[まな]、Mery の4つ。まあここまで要求するユーザもほとんどいないと思いますので、開発者のこだわりの成果だろうなと思います。あっぱれ😉