当サイトのプラグイン、 「thx.jp²」。 専用ページも作成し、 厨二っぽく
thx.jp² = (Typesetting with Half-width-space eXtra in Japanese)(made by thx.jp/)
なんて命名 (旧名: thx.jp/ から改名) までしていますが、 プラグインのアップ時点 (v.0.4.0) ではこんな表示になっていました。

組版や詰めをカッコよくするプラグインの紹介ページがコレではさすがにマズイので修正です。
ふたつの原因
この様に、 パラパラになってしまった原因は二つあります。
- 「²」が欧文扱いになっていない。
- 「T」 などのマーカー部に <span> が使用されている。
「²」 が欧文扱いになっていない
まずは 「²」 の件ですが、 これは欧文の判定に 「²」 を追加すればイイだけです。
例えばこんな感じ、
'#' .
'[ !-;=-~\p{Ll}²\x{200b}]{2,}' .
'|' .
'[ !-;=-~\p{Ll}²]+' .
'#uis'
、、、 ん〜、、、 何か見栄えが悪いというか、 対処療法が過ぎるというか、 なんかもっとこぉ
'[ !-;=-~\p{Ll}\p{**}\x{200b}]{2,}'
みたく Unicode 文字プロパティで表記したいですね。 しかし、 {**} をどの様に記述すればよいかが分かりませんでした ;;
「T」 などのマーカー部分
そこで、 Unicode 文字プロパティの件は宿題として、 別の手段を考えました。 考えようとしました。 思い付きませんでしたので、 先にマーカー部分の対策を考えます。
マーカー部分の件ですが、 これは <span> タグが原因と分かっています。
thx.jp² は、 まず html を 「タグ」 と 「それ以外」 に分割し、 「それ以外」 を順に処理&結合をしていきます。
処理前の状態を html で表記すると、
<p>
thx.jp² = (
<span class="marker-under-blue">
T
</span>
ypesetting with
<span class="marker-under-blue">
H
</span>
以下略
となってます。 これを処理すると、
<p>
<span class="thx_wao_spc"> </span>
<span class="thx_pwid">
thx.jp
</span>
<span class="thx_wao_spc"> </span>
<span class="thx_fwid">
²
</span>
<span class="thx_wao_spc"> </span>
<span class="thx_pwid">
= (
</span>
<span class="thx_wao_spc"> </span>
<span class="marker-under-blue">
<span class="thx_wao_spc"> </span>
<span class="thx_pwid">
T
</span>
<span class="thx_wao_spc"> </span>
</span>
<span class="thx_wao_spc"> </span>
<span class="thx_pwid">
ypesetting with
</span>
<span class="thx_wao_spc"> </span>
以下略
こんなに冗長になります ;;
ここで頭を切り替えて、 理想の完成形を考えてみました。
<p>
<span class="thx_pwid">
thx.jp²= (
<span class="marker-under-blue">
T
</span>
ypesetting with
<span class="marker-under-blue">
H
</span>
alf-width-space e
<span class="marker-under-blue">
X
</span>
tra in
<span class="marker-under-blue">
Japanese
</span>
)(made by
<span class="marker-under-blue">
thx.jp
</span>
/)
</span>
</p>
うんうん、 こうありたいですね。 ここで思い付いたのが処理のスキップです。 今回の例ですと、 「class="thx_pwid"」 や 「class="marker-」 を持つ <span> をスキップすれば良さそうです。 現状でも <style> などはスキップしていますし。
そこで、 現状では </style> など閉じタグでのスキップ判定から、 開始タグでの判定に変更します。
差分はこちらになります。
この処理に併せて、 文字列前後のスペース除去を取り止めます。
不要な改行コードを削除するために文字列を trim() していましたが、 「ypesetting with 」 など必要な半角スペースが除去されてしまうのを回避します。
で、 上手く処理できる様になったのですが、 「class="marker-」 は Cocoon の機能で付与するクラスです。 thx.jp² は Cocoon 以外のテーマでも機能する汎用的なプラグインを目指していますので、 他のテーマなどで 「class="marker-」 がどの様に使われるかは不明です。
そこで、 「class="marker-」 はスキップ対象から除外し、 マーカー部に発生している和欧間スペースを別の手段で取り除く必要があります。
ここまで来てやっと閃きました。
欧文の途中で和欧間スペースが発生してしまうのは <span> や </span> が欧文を分割しているからです。
つまり、 <span> や </span> の前後両方に和欧間スペースが発生しているのは欧文の途中を意味しているワケで、 つまり消去可能です。
対策
はい、 まとめますと、
「T」 などのマーカー部分の対策
タグの前後両方に和欧間スペースが隣接している場合、 それらは不要なので削除する
といった、 安直・確実な対策が取れました。 また、 副産物として開始タグでのスキップ設定が可能になりましたので、 「。」 ではなく、 「。」 と全角送りで表記したい場合も、 ゼロ幅スペースなどを使わずとも、 改行可能位置が発生するリスクなどを負わずとも、
「<span class="thx_fwid"> 。 </span>」
と直接クラス指定をする事が可能になりました。
「²」 の対策
同様の手法で、 thx.jp² の場合も
thx.jp<span class="thx_pwid">²</span>
と直接クラス指定は可能ですが、 thx.jp の前後には和欧間スペースが追加されるため、 もう一手間必要になります。
まとめ
thx.jp² などという厨二っぽい名前を付けたが為に発生した問題でした。 しかしまぁ、 何れは行き逢うであろう問題でしたので、 早期に対処できたと前向きに捉えます。
という訳で、 ver.0.4.2 のアップです。 アップデートは WordPress のプラグイン画面から通知&更新が可能 (なハズ) です。
宿題となっている Unicode 文字プロパティも今後のアップデートで対応予定です。 具体的には ver.0.4.3 くらい?
コメント