用 GNU sed 开天辟地

如果你熟悉中国神话或博客众,那么你说不定听说过被半开玩笑地称作“盘古之白”的排版习惯:在中文字符(但不包括标点符号)和拉丁字符或数字之间增加一定间隔。我所实行的这一规则的变体还包括在所有 HTML 元素(如链接和强调)的周围也加上间隔。

到目前为止,我一直在源文件(Markdown 或 org 格式)中手动添加空格:这无疑是实行这一规则最糟糕的方法。除了要费额外的工夫之外,这类排版规则还应该,在我看来,仅在输出/渲染时应用。更不用说手动调整我刚刚恢复的那一大堆旧日志不是什么吸引人的差事。因为不愿加载额外的 JavaScript,我转向了万能的 GNU sed。为了将盘古之白添加到 Hugo 生成的 HTML 和 XML 文件中(通常在 ./public 目录里),我使用了以下 shell 脚本:

#! /usr/bin/env sh
# For punctuation marks to be recongnized correctly.
export LC_CTYPE=en_US.UTF-8
find . -path "./public/*" \( -name "*.html" -or -name "*.xml" \) -print -exec sed \
     -e 's/\([a-zA-Z0-9]\|<\/[a-z]*>\)\([^[:punct:][:space:]a-zA-Z0-9\s]\)/\1 \2/g' \
     -e 's/\([^[:punct:][:space:][:alnum:]]\)\([a-zA-Z0-9]\|<[a-z]\)/\1 \2/g' \
     -i {} ";"

如果你想坚持履行这一 W3C 工作草案 给出的第一选择,且并不在意生成网页的大小的话,可以换用 CSS 来生成这一间隔:

find . -path "./public/*" \( -name "*.html" -or -name "*.xml" \) -print -exec sed \
     -e 's/\([a-zA-Z0-9]\|<\/[a-z]*>\)\([^[:punct:][:space:]a-zA-Z0-9\s]\)/\1<span style="margin:0.25ch;"><\/span>\2/g' \
     -e 's/\([^[:punct:][:space:]a-zA-Z0-9]\)\([a-zA-Z0-9]\|<[a-z]\)/\1<span style="margin:0.25ch;"><\/span>\2/g' \
     -i {} ";"

如果你也是盘古之白的信徒,那么在本站留下评论时请不必担心手动添加空格:由于 Hyperskip 评论会在 Hugo 构建站点时插入,它们也会被以上的脚本影响到。请尽管坐下、放松、享受这空白一片的绝景吧。

评论区




LanternD fec0

至今在用空格之神,因为只有引入额外的 JS 才能保证我在所有网站上看到的东西都符合我的期望。

第三条评论后的感想:提交完电子邮件并关闭以后不会返回原站点,于是 Blog 页面会随着关闭窗口而彻底消失。这个会降低读者继续 Explore 的可能性。而且 Gmail 看起来没法修改邮箱的选择(我通常会登陆若干个),只能改链接。

shimmy1996 ✦

Re: LanternD

感谢反馈!我之前没有考虑过网页版邮箱的用例,且容我再想想。暂时性的解决办法的话,在邮件发送页面可以通过浏览器返回键来回到博客,也可以通过 Control+点击来在新标签页里打开邮件发送页面。

Gmail 的话,试了一下应该可以通过 改变浏览器 mailto 处理链接 的方式来选择默认的邮箱。在多用户登录状态下,每个用户的 Gamil 的地址后会增加类似 /u/1 的后缀,这时只要像上述链接中说的一样在 Gmail 页面内打开 JS 命令行执行

navigator.registerProtocolHandler(
    "mailto",
    "https://mail.google.com/mail/u/1?extsrc=mailto&url=%s",
    "Gmail"
);

就可以了。

LanternD fec0

多谢建议,经过改造,我发现可以默认选到我期望的 email 账户了。