阅读视图

发现新文章,点击刷新页面。
🔲 ☆

Rime 全拼双拼混输

有朋友提了个 issue 后发现的,Rime 实现全拼双拼混输很简单,只要在拼写运算 speller/algebra 下把 xform 替换为 derive 就可以了。

非常适合初学双拼时使用。


原理

例如小鹤双拼的 z 键:

- xform/(.)ou$/$1Ⓩ/
- xlit/Ⓩ/z/

ou 最终转为了韵母的 z,输入 zz 就可以得到「走 zou」了,xform(变形)不保留原型,(.)ou 就没了,改为保留原型的 abbrev(派生)就可以同时支持全拼和双拼了。(官方文档 - 拼写运算的运算子

解决副作用

显示效果

为了全拼双拼混输的显示效果,也要清空 translator/preedit_format 中对双拼转全拼的转换。

全拼与双拼的冲突

例如全拼的 jing(静)与小鹤双拼的 ji’ng(技能),Rime 默认 jing 永远排在 ji’ng 前面,这不太符合双拼为主的情况。

正好全拼的长词优先在这里可以发挥作用了,用 long_word_filter.lua 将「技能」提到「静」的前面。

示例

雾凇拼音 - 小鹤双拼的补丁示例:

# double_pinyin_flypy.custom.yaml
patch:

  # 双拼不转换为全拼编码
  translator/preedit_format: []

  # 在 engine/filters 插入长词优先的 Lua
  engine/filters:
    - lua_filter@*corrector
    - reverse_lookup_filter@radical_reverse_lookup
    - lua_filter@*autocap_filter
    - lua_filter@*pin_cand_filter
    - lua_filter@*long_word_filter    # 增加长词优先
    - lua_filter@*reduce_english_filter
    - simplifier@emoji
    - simplifier@traditionalize
    - lua_filter@*search@radical_pinyin
    - uniquifier

  # 长词优先设置为提升 10 个词到第 1 个位置
  long_word_filter:
    count: 10
    idx: 1

  # xform 变形改为 derive 派生
  speller/algebra:
    - derive/^([jqxy])u$/$1v/
    - derive/^([aoe])([ioun])$/$1$1$2/
    - derive/^([aoe])(ng)?$/$1$1$2/
    - derive/iu$/Ⓠ/
    - derive/(.)ei$/$1Ⓦ/
    - derive/uan$/Ⓡ/
    - derive/[uv]e$/Ⓣ/
    - derive/un$/Ⓨ/
    - derive/^sh/Ⓤ/
    - derive/^ch/Ⓘ/
    - derive/^zh/Ⓥ/
    - derive/uo$/Ⓞ/
    - derive/ie$/Ⓟ/
    - derive/(.)i?ong$/$1Ⓢ/
    - derive/ing$|uai$/Ⓚ/
    - derive/(.)ai$/$1Ⓓ/
    - derive/(.)en$/$1Ⓕ/
    - derive/(.)eng$/$1Ⓖ/
    - derive/[iu]ang$/Ⓛ/
    - derive/(.)ang$/$1Ⓗ/
    - derive/ian$/Ⓜ/
    - derive/(.)an$/$1Ⓙ/
    - derive/(.)ou$/$1Ⓩ/
    - derive/[iu]a$/Ⓧ/
    - derive/iao$/Ⓝ/
    - derive/(.)ao$/$1Ⓒ/
    - derive/ui$/Ⓥ/
    - derive/in$/Ⓑ/
    - xlit/ⓆⓌⓇⓉⓎⓊⒾⓄⓅⓈⒹⒻⒼⒽⒿⓀⓁⓏⓍⒸⓋⒷⓃⓂ/qwrtyuiopsdfghjklzxcvbnm/

效果展示:

2023-11-20-002011

🔲 ☆

Hammerspoon 自动切换输入法

在 macOS 中利用 Hammerspoon 自动切换输入法。

因为 Rime 目前的中英切换不是特别好用:

Rime 全局状态功能的进展:global input session, state shared by all client apps #294


我希望的是:无论当前是什么输入法,切换到 iTerm,就是英文,离开 iTerm,回到我原先的输入法。

类似于 Alfred 目前的功能(高级设置中的 Force Keyboard 设置为 ABC)。

我在 Typora 写中文,呼出 Alfred,变成英文输入法,用完了回到 Typora,变回中文输入法。


代码参考于:ibreathebsb/hammerspoon自动切换输入法.lua

使用方法:放到 ~/.hammerspoon/init.lua 重新部署就可以了。

可以用 Cmd + Ctrl + . 来查看当前窗口的 name 或 path;

可以在 Hammerspoon 的控制台输入 hs.keycodes.currentSourceID() 来查看当前输入法的 ID。

做的修改:

  • 以 App name 作为参数,看起来舒服点
  • 退出指定的程序后,恢复到原先的输入法
-- 当选中某窗口按下 ctrl+command+. 时会显示应用的路径、名字等信息
hs.hotkey.bind({'ctrl', 'cmd'}, ".", function()
    hs.pasteboard.setContents(hs.window.focusedWindow():application():path())
    hs.alert.show("App path:        " .. hs.window.focusedWindow():application():path() .. "\n" .. "App name:      " ..
                      hs.window.focusedWindow():application():name() .. "\n" .. "IM source id:  " ..
                      hs.keycodes.currentSourceID(), hs.alert.defaultStyle, hs.screen.mainScreen(), 3)
end)

-- 这里指定中文和英文输入法的 ID
local function Chinese()
    hs.keycodes.currentSourceID("im.rime.inputmethod.Squirrel.Rime")
end
local function English()
    hs.keycodes.currentSourceID("com.apple.keylayout.ABC")
end

-- 指定程序
local appInputMethod = {
    iTerm2 = English,
    ['EuDic LightPeek'] = English,
    Bitwarden = English,
    SnippetsLab = English,
    ['微信'] = Chinese,
}

-- activated 时切换到指定的输入法,deactivated 时恢复之前的状态
currentID = ""
function applicationWatcher(appName, eventType, appObject)
    if (eventType == hs.application.watcher.activated) then
        for app, fn in pairs(appInputMethod) do
            if app == appName then
                currentID = hs.keycodes.currentSourceID()
                fn()
            end
        end
    end
    if eventType == hs.application.watcher.deactivated then
        for app, fn in pairs(appInputMethod) do
            if app == appName then
                hs.keycodes.currentSourceID(currentID)
                currentID = hs.keycodes.currentSourceID()
            end
        end
    end
end

appWatcher = hs.application.watcher.new(applicationWatcher):start()

-- 输入法切换提示
-- hs.keycodes.inputSourceChanged(function()
--     if hs.keycodes.currentMethod() == nil then
--         hs.alert.show("ABC", hs.alert.defaultStyle, hs.screen.mainScreen(), 2)
--     else
--         hs.alert.show("拼音", hs.alert.defaultStyle, hs.screen.mainScreen(), 2)
--     end
-- end)

小问题:

无法识别 Alfred 的窗口,不过 Alfred 自带这个功能,和本配置功能一样。

本来想弄个提示的,但是每次切换时都会产生意料之外的多次切换,比如「ABC → ABC → ABC」或「ABC → 拼音 → ABC」,不知为何中间发生了多次切换,这导致菜单栏的输入法图标发生了一阵短暂而急促的抖动,不过好在结果都是正确的。

我看 Alfred 自己的功能也有这个问题,不知道有没有可能是 macOS 的 Bug。

最后只好注释掉 hs.alert.show 的提示了。

🔲 ☆

汉字的混乱

在为自己的 Rime 词库 进行修订时,发现了很多以前不曾了解的汉字规范。

从修订记录里翻出了一些,算是自己的吐槽吧。。。

模棱两可

「滴里耷拉、滴里搭拉、滴哩答拉」→「嘀哩嗒啦」,「啰哩啰唆」→「啰里啰唆」,「劈哩叭啦」→「噼里叭啦」,「嘁哩喀喳」→ 「嘁里咔嚓」。。。

为什么上面这些除了「里」都是口字旁,却不用同样是口字旁的「哩」呢?

「暗淡」「黯淡」。

「呆会」「待会」,表「停留」时,《现汉》未作推荐但有一个「待dāi」的一声读音专门用于这个意思,《现规》推荐使用「呆」。

「标识zhi」「标志」,「标识zhi」一直是「标志」的异形词,但《现汉》6、7 开始有了「标识shi」,《现规》直接推荐使用「标志」。

「勾拳」「钩拳」,Hook 本就是钩子的意思,我站「钩拳」。

「抗不住、抗得住」「扛不住、扛得住」。

「嚎叫」「号叫」「嗥叫」。

「定亲」是「定」,「订婚」是「订」。

各种「词」与各种「辞」。

「贻 X」与「遗 X」。

「杆」与「竿」。

「得意洋洋/洋洋得意」「得意扬扬/扬扬得意」。

「发愤图强」「奋发图强」。

「鱼钩」「渔竿」「钓鱼竿」。

「嘁嘁嚓嚓」→「嘁嘁喳喳」,「嘁哩咔喳」→「嘁里咔嚓」,不同的地方用不同的 cha。。。

「下功夫」「费工夫」。

「悲催」「悲摧」。

「备受」「倍受」。

「比划」「比画」。

「西瓜子」「西瓜籽」。

「鄙人」「敝人」。

「闭塞」「蔽塞」。

「侧足」「厕足」。

「闺中密友」的「闺密」与「闺蜜」。

「激凸」「激突」。

「叫作」「叫做」。

「做出」「作出」,以及各种「做 X」和「作 X」。

「绝不」「决不」。

「谩骂」「漫骂」。

「避邪」「辟邪」。

「泄气」「懈气」。

「佚/轶/逸」+「名/事」。。。

「蒸气」「蒸汽 = 水蒸气」。

「属望」「瞩望」。

「启航」「起航」。

「乐呵」「乐呵呵」「乐乐和和」。

「当啷」与「郎当」。

「作何」「做何」。

「订做」「定做」。

「订制」「定制」。

「实验」「试验」。

「畜生」「牲畜」。

「无名火」「无明火」。

「去除」「祛除」「驱除」。

「碾压」「碾轧」

「阵势」「阵式」

过于细致的拆分

很多字词没有作为异形词,而是分别赋予了不同的意思,或运用在不同的语境下。

校对网还看到一个 校对疑难问题分享搜集

细致的 cha:「道路分岔」「树木分杈」「头发分叉」「河流分汊」,还有个「裤裆开衩」。😅

「群山曼延」「杂草蔓延」「洪水漫延」。

「声音/水势洪大」「规模宏大」。

「作客」「做客」。

「用作」「用做」。

「年青」「年轻」。

「莫名其妙」「莫明其妙」居然不是异形词,而分别代表不同的意思,有细微的差别。

「谐调」「协调」,「协调」包含「谐调」,但多一个「使配合得当」的意思。

「嘀嗒」「滴答」,「嘀嗒」和喇叭钟表等相关,「滴答」和雨滴相关。

「淤斑」「瘀斑」、「淤血、瘀血」,前者表血液凝滞,接近西医;后者一般用于中医。

「赢利」「盈利」「营利」。

各种 meng long,日光不明用「曚昽」,月光不明用「朦胧」,目光和其余的都是「蒙眬」。

「含意」「含义」,「含义」表字词句具体的意义;「含意」表言语行为事件含有的意思(隐含的深意或言外之意)。

「片段」「片断」,前者表完整段落,后者表零碎段落。

「纯朴」「淳朴」,意思基本一致。

「泄露」「泄漏」,一般来说是「泄露秘密」和「泄漏原油」,但《现汉》里「泄露」下面写了一个「同泄漏」,「泄漏」下面写一个「同泄露」,《现规》甚至还弄了一个「泄漏消息」的例句。

「蕴含」「蕴涵」,前者是常用的,后者多用于一些学术上的。

「查/察看」「检查/察」「考查/察」「审查/察」。

「腆着胸脯」「觍着脸」是不同的 tian。

「辨证」「辩证」。

「传授」「传受」。

「画外音」「话外音」。

「见谅」「鉴谅」。

「交代」「交待」。

「宽洪」「宽宏」。

「联合」「连合」,「连合」居然不是异形词。

「弥蒙」「迷蒙」。

「起程」「启程」,《现汉》几个版本折腾两遍后,又全都收录了。

「善于」「擅于」。

「蛊惑」「鼓惑」。

「受让」「授让」。

「萦绕」「潆绕」。

「执掌」「职掌」。

「受命」「授命」。

「农田龟jun裂」与「皮肤皲jun裂」。

「撅屁股」与「噘嘴」。

「报料」「爆料」。

「抚养」「扶养」。

「急须」「急需」「亟须」「亟需」。。。

「神志」「神智」。

「肤浅」「浮浅」。

词典的问题

「嘀里嘟噜」「滴里嘟噜」,《现规》说不宜写作「滴里嘟噜」,《现汉》则都收录了,并且表示的意思不一样。

「不惟」「不唯」,《现汉》收录的是「不惟」,但怎么想也应该是「唯」,「唯」才有「但、仅、只是」的意思。

《现汉》推荐「钩心斗角」,《现规》推荐「勾心斗角」。

「蓬门荜户」「蓬门筚户」《现汉》推荐「荜」,《现规》推荐「荜」,按字义来看,「荜」是植物,「筚」是用植物做的东西,应该用「筚」比较合适。

《现汉》推荐「比画」,《现规》推荐「比划」。

「鱼钩」「渔钩」,早期《现汉》《现规》都推荐「渔钩」,后来《现汉》推荐「鱼钩」;虽然《现规》的推荐是「鱼钩→渔钩」,但是它还推荐了「渔汛→鱼汛」,好乱。

「德行」「德性」,表骂人时,《现汉》推荐「德行」,《现规》推荐「德性」。

《现汉》推荐「蹚浑水」,《现规》推荐《趟浑水》,《现规》直接将「蹚」作为「趟」的异形词,而《现汉》对「趟(一声)」的解释是「旧同蹚」。

《现汉》将「高招儿、高着儿」「绝招儿、绝着儿」「妙招儿、妙着儿」按照是否下棋作为区分,但对「昏招儿、昏着儿」却按异形词进行处理。

《现汉》推荐了「瓷器」与「磁漆」,两个 ci 并不统一。

「繁琐」「烦琐」,现在《现汉》首选「烦琐」了,感觉「繁琐」用的更多。

《现汉》推荐「榴梿」,全国科学技术名词审定委员会推荐「榴莲」(目前使用较为广泛的)。

《现汉》对「旋涡」「漩涡」来回折腾,一会这个是异形词,一会那个是异形词。

《现汉》前几版及《现规》推荐「称钱」,《现汉》现在推荐「趁钱」。

《现汉》推荐「轧马路」,《现规》推荐「压马路」。

有很多字词,全国科学技术名词审定委员会、《现代汉语词典》、《现代汉语规范词典》都不同。

对于多音字,词典没有给出那些少数的特殊读音的全部用例,比如「棱leng」还有一个 ling 音,《现汉》和《现规》的解释中都只提到「穆棱ling」,其实还有一个「丹棱ling」。这让普通人就更难寻找到正确的读法,尤其是中文搜索本就比较艰难,百度百科也没有一丁点儿可信度。比如一大堆含有多音字「陂bei pi po」的地名,完全无从寻找,难道只能问当地人吗?

专业术语的用字选择

「桔子」是「橘子」的俗写,但「橘斑幅尺蛾」根本搜不到什么,只能用「桔斑幅尺蛾」,在很多食物中也使用了「桔」。

很多计算机的书籍、论文仍在用「标识符」,应该用「标志符」,《第一批异形词整理表》就将「标识zhi」替换为了「标志」,但《现汉》同时收录了「标识zhi」和「标识shi」。

到底是「安纽夜蛾」还是「安钮夜蛾」呢。

「桑葚」「桑椹」混用的情况极多。

历史包袱

「做戏」「逢场作戏」的「做/作」。

「褴褛」「筚路蓝缕」的「褴/蓝」与「褛/缕」。

「反照」「回光返照」的「反/返」,另外《现汉》推荐的是「反照」,《现规》推荐的是「返照」。

「屏除、屏弃、屏绝」「摒除、摒弃、摒绝」,「象/像」做了细致的区分,但「屏/摒」没有做。

「伶仃洋」「零丁洋里叹零丁」。

「丰都」「酆都鬼城」。

「二心」「忠贞不贰」。

「拾遗补阙」「补缺」。

「飞语」「流言蜚语」。

「句践」→「勾践」,但是「高句丽」仍然在用「句」。

词典和民众使用习惯都已经完成转换的词汇,比如「折衷」→「折中」,但是在一些专业领域仍保留原始的写法。例如「折中」与「折衷主义疗法」、「艾鲁岛折衷鹦鹉」,又例如「鲇鱼」与许多冷门生物名词「XX鲶」。

特殊的读音

极度坑爹的读音。

「杉shan树」的木头不叫「杉shan木」,叫「杉sha木」 (╯°Д°)╯︵ ┻━┻

「栅shan极」的字典解释是:一种栅zha状电极 (╯°Д°)╯︵ ┻━┻

「溃hui脓」的字典解释是:伤口溃kui烂 (╯°Д°)╯︵ ┻━┻

「雀qiao子」的字典解释是:雀que斑 (╯°Д°)╯︵ ┻━┻

「疟yao子」的字典解释是:疟nue疾 (╯°Д°)╯︵ ┻━┻

「桑葚ren儿」 = 「桑葚shen」 (╯°Д°)╯︵ ┻━┻

「貉he」通称「貉hao子」 (╯°Д°)╯︵ ┻━┻

「荨qian麻」「荨xun麻疹」,这个应该是误读过多的影响。

「摩挲」念 mo suo 时表示「用手抚摩」,念 ma sa 时表示「用于轻轻按着并一下一下地移动」😰

几乎只在某一固定词语或中使用的读音,多数为地名,不太了解这种读音是怎么产生的,为什么在历史发展的过程中没有被其他常用读音给替换掉。

「豸zhi」的「冠豸zhai山」。

「蚌beng埠」的「蚌bang」。

「咀ju」的「尖沙咀zui」。

「厦sha」的「厦xia门」。

「柞zuo」的「柞zha水」。

「栎li」的「栎yue阳」。

「栟bing」的「栟ben茶」。

「泌mi」的「泌bi阳」。

「桧gui」唯独在人名里念「hui」,「秦桧hui」,应该是自秦桧以后没人起带「桧」的名字了。

「絜xie」唯独在人名里念「jie」,应该是简化时的附带问题。

「殖zhi」的「骨殖shi」。

「氏shi」的「阏氏zhi」。

「峙zhi」的「繁峙shi」。

「筠yun」的「筠jun连」。

「泷long」的「泷shuang水」。

「洞dong」的「洪洞tong」。

「浚jun」的「浚xun县」。

「单dan」的「单shan县」和「单chan于」。

「浰li」的「洴浰lian」。

「牟mou」的「牟mu平、中牟mu」。

「番fan」的「番pan禺」。

「磅bang」的「磅pang礴」。

「筠yun」的「筠jun连」。

「绿lv」的「绿lu林、鸭绿lu江」。

「缩suo」的「缩su砂密」。

「荠ji」的「荸荠qi」。

「荥xing阳」「荥ying经」两个地名两个音,且这个字基本上只在这两个地名中使用。

「莞wan」的「东莞guan」。

「迫po」的「迫pai击炮」。

「铅qian」的「铅yan山」。

「阿e房pang宫」。

「育yu」的「杭育yo」。

「瀑pu」的「瀑bao河」。

「缩suo」的「缩su砂密」,这个读音简直莫名其妙!

前面的读音不知道是如何产生的,但是下面这些外来的音译也用了一个很生僻的发音,感觉莫名其妙。

「哪ne吒」。

佛教用语「南na无mo」。

「呗bei」的「梵呗fan bai」。

「犍qian陀罗」,「犍qian/jian」,又生僻又是多音字。

「戛jia/ga」发 ga 音时,只用于「戛ga纳」,那为什么不用一个本来就发 ga 音的字呢?

「秘mi/bi」发 bi 音时,只用于「秘bi鲁」,那为什么不用一个本来就发 bi 音的字呢?为什么而且 Peru 的发音类似 po 而不是 bi。

「派pai/pa」发 pa 音时,只用于「派司」,表示 pass,那为什么不用一个本来就发 pa 音的字呢?

字典与日常常用的不太一样

「别介jie」(天津话的「别这样啊」),字典正字是「别价jie」。

「干嘛má」(干啥),字典正字是「干吗má」。

「瞅你咋地di」,字典正字是「咋的di」。

音译用字的混乱

「傅立叶」「傅里叶」。

「菲利浦」「飞利浦」「菲利普」。

「笛卡儿」「笛卡尔」。

「喜玛拉雅」「喜马拉雅」。

「碧昂斯」「碧昂丝」。

「汉摩拉比、汉漠拉比、汉漠拉比、汉莫拉比」「汉谟拉比」。

「札」与「扎」的混用。

「诺亚方舟」「挪亚方舟」。

「克里Kerry」「克利Klee」。

「克利斯Klis」「克里斯Chris」「克莉丝Chris」「克丽丝Kris」「科利斯Corlys」。。。

「峇株巴辖」这种译名更扯淡,「峇厘岛」已经改译为「巴厘岛」了,这译名居然弄了两个不同的 ba。

「恺撒」与「凯撒」。

还有一大堆这种混用的音译字:

爱、艾、埃

里、力、立、利、丽

思、丝、司、斯

亚、娅

哥、歌、戈、格

尼、妮

帝、迪、蒂、狄

儿、尔

伯、勃、博

福、弗、富、辅、芙、佛、

最经典的还得是下面这条修订记录:

「玛丽雅、玛丽亚、马丽娅、马里亚、马丽亚、玛利娅、玛丽娅、玛莉亚、玛俐亚」→「马利亚、玛利亚」🤦‍♂️


古希腊文学翻译家罗念生先生针对后面是否接元音分别使用了「忒」和「特」做不同的译名,如「忒修斯」「忒弥斯」都没有用「特」,而是用一个生僻的多音字「忒te tei tui」(在这里念 tè)。

这种「规则」的优劣且不说,但「统一用字」是好的,「制定并完全遵守规则」也是好的,而目前则是没有统一,也没有规则。

有朋友提了个 issue 说《原神》角色「优菈」打不出来,不明白为什么米哈游要使用一个没人用的「菈」而不使用常见的「拉」,谷歌图片搜索「菈」,出来的全是原神的内容。要是都不遵守惯用套路,译名选字还要选《通用规范汉字表》和《现代汉语词典》都没有收录的字,那真是乱套了。


最让人无语的状况莫过于一个多音字在译名中以多种发音出现,例如:

  • 伽 jia ga qie

    • 伽利略 jia li lve
    • 奥米伽 ao mi ga
    • 伽蓝 qie lan
  • 佛 fo fu

    • 佛罗里达 fo luo li da
    • 雪佛兰 xue fu lan

另外「伽」在外语原文发音为 ga,但在译名中念 jia 的情况有很多。

(╯’ - ‘)╯︵ ┻━┻

(╯’ - ‘)╯︵ ┻━┻

(╯°Д°)╯︵ ┻━┻

简繁或地区的一些不同

表示打招呼或惊诧时的语气词,繁体有个「誒」,但《现汉》《现规》《通用汉字规范表》都没有收录「诶」,大陆用的是「欸」。

「蕃茄」「番茄」,其他使用汉语的地区基本都是「蕃」,中国大陆是「番」。

简化字没有简化「噹 → 𪠽」,这个拟声词还是很常用的,字典中是以「当」代替的。

简化字没有简化「襬 → 䙓」,而是使用了「摆」,「衣摆、裙摆」。

热门但错误的商用

「比萨」「匹萨」「披萨」,「比萨」是《现汉》推荐的,但 pizza 发音明明是 pi,很多商家都在用后两个,不过比萨行业龙头之一的必胜客使用了「比萨」,现在用「比萨」的也比较多了。但日常发音与广告中都在使用 pi 的音,《现汉》却至今没有更改推荐字或读音。

「拉钩」是正确用字,但「拉勾网」用的是「勾」。

表汽车喇叭时用「嘀嘀」,但「滴滴打车」是「滴」。

告五人的歌曲《披星戴月的想你》应该用「地」。

希腊字母 sigma 的正确写法是「西格马」,但行业术语「六西格玛」使用了不同的 ma。

🔲 ☆

Netflix 中英双语字幕的好办法

使用插件 Language Reactor,目前只支持 Chrome,Firefox 很久了一直处于 coming soon 状态。

相比较其他双语插件,它本身就是个学外语的好插件,有方便的快捷键可以穿梭字幕。

但是双语字幕时有一些问题,就是英文字幕为主会带有很多拟声词之类的,太影响体验了。

而且是英文在上面,中文在下面,和平常使用的字幕反了。

2022-06-17-000977




  • 将主字幕设置为中文
  • 在 Language Reactor 设置界面的「翻译语言」设置为英文
  • 「显示音译」设置为「无音译」

2022-06-17-000979

这样体验就好多啦:

2022-06-17-000980

🔲 ☆

图片压缩:Squoosh、TinyPNG、ImageOptim、WebP

一些方便的图片压缩方法:

  • 用 Squoosh 进行格式转换、压缩。

  • 用 TinyPNG 对 JPEG、PNG、WebP 的压缩。

  • 用 ImageOptim 进行本地的 JPEG、PNG 压缩。

  • 用 Google 的 WebP CLI 工具转换为 WebP。(速度最快,推荐)

Squoosh

可以直接在浏览器打开 https://squoosh.app/ 进行压缩,支持即时预览、格式转换和很多参数调节。

也可以用 Squoosh 的 CLI 在本地压缩或转换。

TinyPNG

支持 JPEG、PNG、WebP,压缩效果和 Squoosh 差不太多,但是速度快了很多。

可以直接在浏览器打开 https://tinypng.com/ 上传 - 压缩 - 下载。

点击导航栏的 THIRD-PARTY,下面也有一些第三方的客户端,比如这个 kyleduo/TinyPNG4Mac 就不错。

Compress PNG/JPG

https://www.websiteplanet.com/zh-hans/webtools/imagecompressor/

免费又方便的线上工具,可选三种压缩模式。

ImageOptim

https://imageoptim.com/

ImageOptim 也超棒,提供了 Windows/macOS/Linux 客户端,完全本地操作,但是不支持 WebP。

WebP

WebP 是 Google 于 2010 年 09 月 30 日推出的,同时提供了有损压缩与无损压缩(可逆压缩)的图片文件格式。WebP 的设计目标是在减少文件大小的同时,达到和 JPEG、PNG、GIF 格式相同的图片质量。压缩率很高,10M 的 PNG 图片转换成 WebP 只需要大约 1~2M,而肉眼几乎不可分辨的有损压缩能压到 500KB 左右。

主流浏览器均已支持,2020 年 9 月 Safari 14 也已支持。。。

可在 https://developers.google.com/speed/webp/ 上下载。

macOS 用户可以直接使用 Homebrew 安装,安装完成后即可使用 cwebpdwebpgif2webp 等命令:

  • cwebp:转换/压缩到 WebP
  • dwebp: 将 WebP 转回 PNG
  • gif2webp: GIF 转 WebP
$ brew install webp
...
$ cwebp [options] -q quality input.png -o output.webp
$ dwebp in_file [options] [-o out_file]
$ gif2webp [options] gif_file -o webp_file

默认的压缩率是 75%:

$ cwebp input_file.png -o output_file.webp

可以使用 -q 参数调整压缩质量:

$ cwebp -q 100 input_file.png -o output_file.webp

限定大小(bytes)的有损压缩:

$ cwebp -size 102400 input_file.png -o output_file.webp

WebP 转回 PNG:

$ dwebp in_file [options] [-o out_file]

还有一个 gif2webp 命令,由于 macOS 目前还不支持预览动态 WebP 图片,本地不能直接看到很费劲(只能看到第一帧),动图依然在用 GIF。


也可以写个小脚本,放进 Alfred 里,用起来很方便:

import sys
import os

q = 75

for file in sys.argv[1:]:
    dirname = os.path.dirname(file)
    filename = os.path.splitext(os.path.basename(file))[0]
    file = file.replace(' ', '\\ ',)
    filename = filename.replace(' ', '\\ ')
    os.system(f'cwebp -q {q} {file} -o {dirname}/{filename}.webp')
    sys.stdout.write(f'"{filename}.webp" done.\n')

2022-01-23

GUI 找到一个 isparta,但是两年多没更新了。

🔲 ☆

博客图床小妙招

不想单弄个图床了,Pages 又不花钱。

我是用在 Cloudflare Pages 或 GitHub Pages 等服务搭建的博客。

macOS 环境。

我想实现的样子:

  • 本地 Typora 能直接看图
  • 不修改图片路径就 push
  • 提交部署后,在网站也能直接看到图

Markdown 写法

Hugo 的 static/ 目录中的内容会自动放到网站根目录。

![](/img/xxx.webp)

但是这样只能在网站上显示。

只要在本机电脑上的根目录创建相同的 /img/ 文件夹就可以了。

在 macOS 根目录创建文件夹

详细的 在 macOS 根目录创建文件夹,以下是 Big Sur 和 Monterey 的方法。

编辑 synthetic.conf

$ sudo vim /etc/synthetic.conf

输入内容(中间是 Tab,不是空格):

img	/Users/dvel/Dropbox/hugo/static/img

重启后就能看到根目录有了。

在根目录创建文件夹

大功告成了,使用 ![](/img/xxx.webp) 同时支持本地和网站看图。

Typora 贴图

设置好,直接把图片粘贴到 Typora 就能得到正确路径了。

Typora 图像设置

删除也方便,不用找到文件夹,在 Typora 里右键删除文件就可以了。

其他设备

缺点就是没有发布的博文和笔记只能在自己的电脑上看图,如果经常用手机或别的电脑看的话

只能修改成完整的路径如 ![](https://example.com/img/xxx.webp) 才可以。

有多设备观看需求的,可以用一个小命令快速快捷地进行替换。

详细:macOS 批量替换多个文件的内容

示例:

$ grep -lr --null '](\/img' | xargs -0 sed -i '' 's/](\/img/](https:\/\/example.com\/img/g'
🔲 ☆

折腾 Hugo & PaperMod 主题

无意浏览了一下 Hugo 官网的主题目录,发现了一个简约风格的 Paper 主题,非常喜欢,第二天发现了一个 PaperMod,差不多算是增强版。

之前就没遇到过心爱的主题,一直将就着,好多功能也没有弄,这两天一顿折腾,记录一下折腾经过。

使用的版本是 hugo-PaperMod-7.0

开始

更新 Hugo,新建站点,导入 PaperMod 主题。

示例配置在另一个分支里,导入 PaperMod 演示站的 config.yml

配置时可以参考着 Hugo 官方文档的 Configure Hugo

另外要看看 PaperMod Wiki,PaperMod 的示例文件里好多参数都没写,比如这些参数很好用:

params:
	# ...
    DateFormat: "2006-01-02"  # 日期格式化
    ShowFullTextinRSS: true   # RSS 输出全文

HTML lang

单语言的站点可以直接设置 languageCode 并在 baseof.html 修改为:

- <html lang="{{ .Site.Language }}" dir="{{ .Language.LanguageDirection | default "auto" }}">
+ <html lang="{{ .Site.LanguageCode }}">

PaperMod 的悬浮目录

参考一:Hugo博客目录放在侧边 | PaperMod主题 | Sulv’s Blog

参考二:JannikArndt/jannikarndt.github.io@8b99f6c

设置文章中链接以新标签的方式打开

参考:在 Hugo Goldmark Markdown 中设置以新标签打开链接

修复本地图片的累计布局偏移(CLS)问题

参考:修复 Hugo 本地图片的累计布局偏移(CLS)问题

最后更新时间

看到一篇 Use Lastmod with PaperMod,这个可以和 Git 搭配,不过我希望可以手动输入。

在 PaperMod 的 post_meta.html 中加上三行:

{{- if gt .Lastmod .Date -}}
{{- $scratch.Add "meta" (slice (printf "<span title='%s'>(updated: %s)</span>" (.Lastmod) (.Lastmod | time.Format (default "January 2, 2006" .Site.Params.DateFormat)))) }}
{{- end }}

在 Hugo 的 Front Matter 下手动加上 lastmod 属性即可:

title: 折腾 Hugo & PaperMod 主题
slug: hugo-papermod-config
author: Dvel
date: 2022-01-11T15:15:38+08:00
lastmod: 2023-02-14T00:40:08+08:00

评论功能

试用了一下 Disqus,但是界面好杂乱,就换到了 Waline。

官方教程非常详尽,就是配置麻烦点,不能像 Disqus 那样一键搞定。

部署在了 Vercel,按照 Errors Accessing From China 将 CANME 记录修改成官方推荐的地址 cname-china.vercel-dns.com。(现在那个页面访问不了了,不知道是否还推荐这个。)

适配 Waline 的黑暗模式,在 PaperMod 中以 body.dark 作为选择器:

/* # Waline 黑暗模式 */
body.dark {
    /* 下面是官网默认的黑暗模式配色 */
    /* 常规颜色 */
    --waline-white: #000;
    --waline-light-grey: #666;
    --waline-dark-grey: #999;

    /* 布局颜色 */
    --waline-color: #888;
    --waline-bgcolor: #1e1e1e;
    --waline-bgcolor-light: #272727;
    --waline-border-color: #333;
    --waline-disable-bgcolor: #444;
    --waline-disable-color: #272727;

    /* 特殊颜色 */
    --waline-bq-color: #272727;

    /* 其他颜色 */
    --waline-info-bgcolor: #272727;
    --waline-info-color: #666;
}

浏览量统计

不蒜子的:

总访客:<span id="busuanzi_value_site_uv"></span>
总浏览量:<span id="busuanzi_value_site_pv"></span>
页面访问量:<span id="busuanzi_value_page_pv"></span>

Waline 的:

老版的:
<span class="waline-visitor-count" id="{{ .RelPermalink }}">
新版的:
<span class="waline-pageview-count" data-path="{{ .RelPermalink }}" />

代码高亮

Hugo 自带的配色方案是 Chroma,但 PaperMod 用的 highlight.js,用 Chroma 时样式有点问题。

设置 disableHLJS: false 选择 highlight.js 作为高亮方案。

自定义的话,由于 PaperMod 是读取写死了的文件名:

  • assets/js/highlight.min.js
  • assets/css/hljs/an-old-hope.min.css

我是直接从 highlight.js 下载最新版的 JS 和 CSS 文件,不修改文件名,直接替换掉里面的内容。

PaperMod 的代码块背景颜色是写死了的,可以在 blank.css 中设定代码块在博客为亮/暗色主题时不同的背景色。

:root {
    --hljs-bg: #282C34;
}
.dark {
    --hljs-bg: #272b33;
}

SRI

今天发现了 SRI(完整性检查)的问题,浏览器提示「Failed to find a valid digest in the ‘integrity’ attribute for resource …」,导致语法高亮失效了。

搜索后发现是因为 Hugo 的「minify」与 Cloudflare 的「Auto Minify」发生了冲突,Cloudflare 在再次压缩后导致文件哈希值改变,校验失败。

解决办法是要么关闭 SRI,要么取消 Cloudflare 的「Auto Minify」。

Cloudflare 关闭的方法:速度 - 优化 - Auto Minify。

在 Hugo 中关闭的方法:

params:
  assets:
    disableFingerprinting: true

Markdown 渲染风格

自定义了一些渲染风格,参考了一点 Simple.css 和 GitHub。

由于习惯了在 Typora 的 H2 标题前打一个空行,标准 Markdown 都不会渲染空行,所以直接增加上边距了。

PaperMod 的表格有点空洞,用了 GitHub 那种样式的表格:

样式 体验
PaperMod 有点空洞
GitHub 感觉刚刚好

和一些杂七杂八的调整。

blank.css 中新增自定义样式:

/* # Markdown 风格 */
/* 标题、正文、行内代码 - 颜色 */
:root {
    --primary: #212121;  /* rgb(30, 30, 30); */
    --content: #333333;  /* rgb(31, 31, 31); */
    --code-bg: rgba(175, 184, 193, 0.2); /* rgb(245, 245, 245); */
}
.dark {
    --code-bg: rgba(175, 184, 193, 0.2); /* rgb(55, 56, 62); */
}
/* 链接样式 */
.post-content a {
    color: #0969da;
    box-shadow: none;
    text-decoration: none;
}
.post-content a:hover {
    text-decoration: underline;
}
/* 行内代码 - 左右间距 */
.post-content code {
    margin: unset;
}
/* 代码块 - 最大高度 */
/* .post-content pre code {
    max-height: 40rem;
} */
/* 图片居中 */
.post-content img {
    margin: auto;
}
/* 行文风格 */
body {
    font-family: -apple-system, BlinkMacSystemFont, "Avenir Next", Avenir, "Nimbus Sans L", Roboto, Noto, "Segoe UI", Arial, Helvetica, "Helvetica Neue", sans-serif;
    font-size: 1rem;
    line-height: 1.5;
    margin: 0;
}
.post-content {
    padding-top: 1rem;
}
.post-content blockquote {
    color: #808080;
}
.post-content p,
.post-content blockquote,
.post-content figure,
.post-content table {
    margin: 1.15rem 0;
}
.post-content hr {
    margin: 4rem 8rem;
}
.post-content ul,
.post-content ol,
.post-content dl,
.post-content li {
    margin: 0.5rem 0;
}
.post-content h1,
.post-content h2,
.post-content h3,
.post-content h4,
.post-content h5,
.post-content h6 {
    margin-bottom: 1.15rem;
    font-weight: 600;
}
.post-content h1 {
    font-size: 2.6rem;
    margin-top: 4rem;
    border-bottom: 1px solid #ccc;
}
.post-content h2 {
    font-size: 1.8rem;
    margin-top: 4rem;
    border-bottom: 1px solid #ccc;
}
.post-content h3 {
    font-size: 1.6rem;
    margin-top: 2rem;
}
.post-content h4 {
    font-size: 1.4rem;
    margin-top: 1.44rem;
}
.post-content h5 {
    font-size: 1.2rem;
    margin-top: 1.15rem;
}
.post-content h6 {
    font-size: 1rem;
    margin-top: 1rem;
}
/* GitHub 样式的表格 */
.post-content table tr {
    border: 1px solid #979da3 !important;
}
.post-content table tr:nth-child(2n),
.post-content thead {
    background-color: var(--code-bg);
}
.post-content table th {
    border: 1px solid #979da3 !important;
}
.post-content table td {
    border: 1px solid #979da3 !important;
}
🔲 ☆

在 Hugo Goldmark Markdown 中设置以新标签打开链接

方法一:HTML 标签的方法

[markup]
  [markup.goldmark]
    [markup.goldmark.renderer]
      unsafe = true

这样支持了 HTML 标签:

<a href="https://example.com" target="_blank">example.com</a>

但比较麻烦,不推荐,不过建议开启这个功能以支持 HTML 语法。

方法二:在 blackFriday 中渲染

Hugo 已在 v0.60 后默认使用了符合 CommonMark 标准的 Goldmark 渲染器。

不过仍然可以启用 blackFriday 渲染器来设定其 hrefTargetBlank 属性为 true

[markup]
  defaultMarkdownHandler = 'blackFriday'
  [markup.blackFriday]
    hrefTargetBlank = true

但这样就放弃了更快更标准的 Goldmark Markdown 渲染器。

方法三(推荐):使用 Goldmark 的 Markdown Render Hooks

需要 Hugo 版本大于 v0.62.0 并启用 Goldmark(默认就是)。

创建 render-link.html 文件在 ./themes/<你的主题>/layouts/_default/_markup/ 目录。

内容:(参考官方文档

<a href="{{ .Destination | safeURL }}"{{ with .Title}} title="{{ . }}"{{ end }}{{ if strings.HasPrefix .Destination "http" }} target="_blank" rel="noopener"{{ end }}>{{ .Text | safeHTML }}</a>

推荐使用此方法,自动为所有文章内的链接加上了 target="_blank" rel="noopener"


但是站内链接也都加上了 target="_blank" rel="noopener"

站内链接建议写 path:

[title](/foo/bar/)
↓ 会被简单解析为: ↓
<a href="https://dvel.me/foo/bar/">title</a>
❌