プログラム用のエディターは賑やかだ。変数や修飾子、プロパティ、関数、制御用の予約語などが異なる色でハイライトされている。下のスクリーンショットはnovel-writerの「〜た」「〜る」変換を行うコードの一部だが、この短い部分だけでも、色分けされていなければコードを読み解くのに苦労してしまう。

// 対象の文だけ処理する if (processingSentence === targetSentence) { // 自立「〜る」の変換 if ( token.conjugated_form === "基本形" && token.conjugated_type.match(/.+ガ行$/) && nextToken.pos_detail_1 === "句点" && nextToken.surface_form === "。" ) { const attributedVerbeForm = token.surface_form.replace( /(.+)[ぐ]/, "$1いだ" );
もちろん読める。だけど括弧やクォーテーションの閉じ忘れひとつとっても、色分けされているのに越したことはない。
というわけで、日本語でも品詞ごとにハイライトするといいんじゃないかと思った次第。VS Codeを使い始めて三日目で作ったのが、会話の部分を色分けする言語拡張だった。行頭が「、行末が」で終わる行を、プログラミング言語のコメントアウトに指定するだけの簡単な色分けだ。ついでに、青空文庫のルビにも色をつけることにした。

もちろん鉤括弧があるかどうかなんて読めばわかる。しかし色分けをしたことで視認性は上がった。エディターの右にあるミニマップ(テキストの縮小表示)では、会話が続くか続かないかを俯瞰することもできた。
書いている時に見やすくても、出版した後で読みにくければ意味がない。そこで縦書きプレビューを表示することにした。VS Codeを使い始めた時は、n-fukujuさんの作った縦書きプレビューを使っていた。これが想像していたよりもずっと良かったので、自分でも機能拡張を作ろうと決意したのだ。

色分け機能だけだったnovel-writerは縦書きプレビューを内蔵してサーバー化し、原稿用紙のような見た目に変え、文字数カウントをつけ、バラバラに書いたテキストファイルをひとつに結合する機能をつけて、PDF出力もできるようにした。Textlintも導入して、正規表現を使う校正機能や、タイプミスで生まれる助詞の連続をエラー表示できるようにもなった。
仕事に使えるようになったVS Codeだが、どうしようもない弱点もあった。
テキストが単語分割されていないので、カーソルを単語ごとに移動できなかったのだ。「てにをは」や「、。」などを区切り文字にして凌いでいたがストレスから解放されるには、日本語を単語に分解する形態素解析をするしかない。形態素解析ができれば、日本語のハイライトをもう一段階進められるし、「です・ます」を「だ・である」に変換したり、「していた」を「している」に変換できることもわかっていた。ルビの読み仮名も自動で挿入できる。
というわけで、昨年の秋にようやくKuromoji.jsという形態素解析ライブラリを導入することに成功した。日本語をハイライトできるようになったのだ。

動き出した時にようやく気づいたのだけど、日本語の品詞がハイライトされているのを見るのは初めてだった。色分けはちょっとだけ難航した。

文法が緩い会話はグリーン系統で統一することにした。「あはははっ」のように、2文字目の「は」と3文字目の「は」が異なる品詞に分解されてしまう可能性がある。地の文の色分けは、品詞の種類が多いので少し悩んだ。名詞グループの中でも、普通名詞と代名詞、固有名詞は扱いを変えたいのだ。
特に代名詞は可読性を落とすので積極的に消していきたい品詞のひとつだ。逆に名詞の中でも接尾語として使われる単語は目立たせたくないし、普通名詞には主張してほしくない。動詞は重要なので目立ってほしい。副詞は本質的に不要だ。なければない方がいいので思い切り目立たせたい。助詞は、タイプミスが一番多く現れる部分なので見えてほしいが意味は欲しくない――そんな基準で色をつけてみた。
結果的にびっくりするような色合いになってしまったが、使うと違和感はすぐに消えると思う。単語は探しやすくなるし、入力ミスにも気付きやすくなる。読む速度も上がるはずだ。難点は、見た目がちょっと煩雑ということか。いずれ、カラーリングを簡単に指定できる画面も作ってみようとは思う。