超麻煩的「盤古之白」

又有人在嘮嘮叨叨「盤古之白」,發現自己這類沒遵守戒律的人的人權值好像持續被降低。

有些「盤古之白」支持者的用詞還挺混球的。這真他媽的,誰知道CSS的text-spacing一直搞到現在還在擬議中,等新規定錯了嗎?

火大歸火大,基本上我承認空格在排版上是比較好看,但我也贊成「強烈反對手動加入空白」,所以找到Space Lover來試試。

對目前正在努力加入250KB俱樂部的我來說,pangu.js太大了。而且依現行快取設定會有類似FOUC(我不知道JavaScript造成的應該叫做什麼,Layout Thrashing?Force Reflows?)的問題。

問題

1)斷句

例如「想想B計畫」,「B計畫」是一個單獨詞彙,但安裝後「B」前後加上空格被分開成奇怪的斷句。

2)符號

符號的通例。「Paramount+」的加號還好說;但「.htaccess」,若讓「.」前也加入空白,使用「怕.jpg」這個哏時排版就顯得很怪。很難有泛用的設定。

至於「<>」、「””」等特殊字元在WordPress本身就有HTML轉換問題,這下更是麻煩。要在此處添加設定:

$content = preg_replace('~(&amp;?(?:amp)?;) (\p{Han})(?![^<]*>)~u', '\1\2', $content);

同樣也是有例外存在。

3)全形括號

作者設計為半形括號也加上空格。但會影響全形的括號和部分標點符號,作者的修正不是很齊全,所以要嘛就是改掉括號加空白這點,要嘛就是另外修正。

常用的「。」、「、」、「〈〉」都會出現多餘空白,加入到:

$content = preg_replace('~[ ]*([「」『』()〈〉《》【】〔〕〖〗〘〙〚〛])[ ]*~u', '\1', $content);

4)多重標籤

作者有考慮到加了超連結後中文與英文會被HTML標籤「<a>」隔開,導致中英之間無法自動判斷是否加入空格。作者為此設定了標籤的正規表達式實現添加空格功能。

// <HTML tag>
<(?!ruby)[a-zA-Z]+?[^>]*?>
// </HTML tag>
<\/(?!ruby)[a-zA-Z]+>

但是有時候,譬如英文書名要加超連結與斜體字,這樣中文就與英文隔了兩個標籤,致使無法加空格的情況發生。所以要複製處理標籤的preg_replace,然後在裡面再加一個標籤的正規表達式,讓隔兩個標籤也能得到空格。

這也導致了程式碼的冗長,直接多了4行,現在總共有14行preg_replace

5)W3C規定

W3C的《中文排版需求》規定:

「原則上,漢字與西文字母、數字間使用不多於四分之一個漢字寬的字距或空白。但西文出現在行頭或行尾時,則毋須加入空白。」

https://www.w3.org/TR/clreq/#mixed_text_composition_in_horizontal_writing_mode

空格是二分之一漢字寬,要符合這個標準,實現四分之一寬還要另外設定。

像是「'\1\2 \3'」改為:

'\1\2<span class="half-space-size"> </span>\3'

最後一行則是:

$content = preg_replace('~(<span class="half-space-size"> <\/span>)*([「」『』()〈〉〈〉《》[]【】〔〕〖〗〘〙〚〛。、])(<span class="half-space-size"> <\/span>)*~u', '\2', $content);

再添加CSS:

.half-space-size{font-size:.5em}

這樣改的問題在於純中文與純英文這兩個場景中的空格寬度將異於中英文雜處時的空格寬度,造成排版不一致,並且網頁程式碼將無比臃腫。

另外還要視情況為span標籤的CSS增加white-space: pre;以確保空格存在。

總結

試了各種方案,也順便問了AI,方法有很多但根本問題就是自動代換的通則缺乏靈活適應性,要不斷補充條件變得繁雜。

「但無論如何,當有人在自己的頁面裡加入中西文留空時,不要去修改,這不是錯誤,同樣的,當有人沒有在自己的頁面裡留空時,也不要去修改,這也不是錯誤。這都是習慣問題。」

文字排版——從入門到出門 – The Backrooms中文維基