2022-01-15

英単語やコードの前後に空白を入れるスクリプトを書いた

何百回とされてきたであろうこの話題について考えた。

空白をいれたい

(特定の)英単語やコードと日本語の境界にはスペースを入れたい。

  • 最近Fritterを使っている
    • 英単語の前後に空白が欲しい
  • 最近 Fritter を使っている
    • OK
  • ここではfetch()を使う
    • コードの前後に空白が欲しい
  • ここでは fetch() を使う
    • OK

たまに入ったり入らなかったりするが嫌なので自動的に挿入して欲しい。

str.replace() する

とりあえず愚直にやる。正規表現で「日本語、英単語、日本語」になっている部分を見つけて「日本語、スペース、英単語、スペース、日本語」に直す。正規表現は以下のように書ける……が、もっといい書き方はあると思う。

/[\p{sc=Hiragana}\p{sc=Katakana}\p{sc=Han}][a-zA-Z]+?[\p{sc=Hiragana}\p{sc=Katakana}\p{sc=Han}]/gu,

\p{sc=なんとか} を並べて日本語にマッチさせる。[a-zA-Z] の部分を [`.+`] にすればコードの場合に対応できる。

また、片側だけしかスペースがないときも対応する必要がある。それは上記の正規表現をコピペしてスペースを入れてやれば実現できる……本当はひとつの正規表現でいい感じに全部カバーできればいいんだけど、今はできない。

置き換えたくないとき

置き換えたくない文字列にマッチする正規表現を使う。置き換えたくない文字列にはマッチしないように正規表現を書けば良さそうだが、正規表現が複雑になるし変更が大変そうである。ここも愚直に ignorePatterns という置き換えたくない文字列にマッチする正規表現を用意して対応することにする。

const ignorePatterns: RegExp[] = [/*置き換えたくない文字列にマッチする正規表現*/];
if (ignorePatterns.some(pattern => pattern.test(text))) {
	continue;
}

無駄な計算が多くなるが記事あたりの文字数は大したことがないし、正規表現の数もそんなにないので気にしない。

できたもの

bloglint/spacing.ts at main · noy72/bloglint · GitHub

ひどいコードだけど後から直せばいいんだよ。未完成だからね。