10年以上待ち続けていたtext-autospaceプロパティーの最適な値を探っている。実装がSafari 18.4にしかないので、比較的安全に遊べる。後方互換性と巷の文書を考慮した結果、意外な複雑さがある。

現状の仕様

2024年5月29日のWDでは以下のような値が取れるようになっている。

normal |
no-autospace |
[ ideograph-alpha || ideograph-numeric || punctuation ] || [ insert | replace ] |
auto

autoにすると環境依存で最適化されるようだが、単にno-autospaceになりそうだ。つまりautono-autospaceは無指定と考えて良い。実際にはnormalと複数指定を使うことになるだろう。

normalideograph-alpha ideograph-numericと見做され、英数字との間に空白が挿入される。punctuationは半角記号との間に非改行空白が挿入される。ideograph-*はそれぞれアルファベットのみと数字のみとの間に空白が挿入される

挿入の制御も可能で、replaceを追加しておくと、既に半角空白がある場合はそれを置き換えてくれる。text-autospaceプロパティーの挿入する空白は1/8空白とされているので、半角空白よりも印刷媒体に近くなり、可読性が向上することが期待できる。insertは既定の挙動で、指定しなくても良い。

Safari 18.4での実装

Can I Useでは、実験的と注意書きはあるものの、実装済みとなっている。確かにnormalや複数指定の仕組み自体は実装されているようだ。しかし、punctuationreplaceは実装されていない。そのためこれらの値を指定してしまうと、自動挿入されなくなる。完全実装には遠い。

また、丁度要素の終わりと空白の自動挿入場所が重なると、挿入されなかったりすることもあるようだ。再現不能な挿入失敗もあったり、なかなか挙動不審だ。しかし、概ね期待通りに動くようで、安心して使えると考えて良いだろう。


つまり現状ではnormalくらいしかやることがないように思える。問題はどこでどう指定するか、になる。雑にルート要素で指定すると、挿入して欲しくなさそうな場所でも挿入されてしまう。しかし、個々の要素それぞれで指定するのは面倒臭い。色々な要素で有効と向こうを切り替えながら見ていると、最低でも無効にするべき要素が分かってきた。

:root {
  text-autospace: normal;
}

:is(pre, time, input, textarea) {
  text-autospace: no-autospace;
}

pre要素では、等幅フォントでずれるようになるからだ。time要素では、紙の本などで「」のような日付表記には空白が入らないからだ。input要素やtextarea要素では、入力中に自動挿入が入ると挙動不審になる恐れがあるからだ。


実装が進むと、また挙動が変わるかもしれない。最終的にはideograph-alpha ideograph-numeric punctuation replaceで落ち着くような気もするが、良い名前のショートカットも作られるだろうし、要素ごとに違う既定値が与えられるかもしれない。理想的な未来では、autoがそうなるような気もする。