在手机上搜"回南天",跳出来的第一条是一篇三千字的长文摘要,我想找的那篇两百字的手记,排在第七。
那是十月下旬的一个晚上,下班回到住处,我没像往常那样去折腾网页端,而是打开 Xcode,对着 iOS 模拟器收拾起了博客的配套阅读器,poboll/miao-reader。
给自己的博客单独写一个原生 SwiftUI 客户端,本来就有点自娱自乐的奢侈。它是给我自己和几个常来的朋友准备的掌上阅读室,所以我不想往里塞什么社交动态、弹窗卡片,只盼着它像一间收拾干净的小书房:进门光线柔和,找旧文章顺手,累了还能靠在椅背上听它念两段。
为了这几个"顺手",那几天晚上我连着改了三个小地方。
搜索框
原来的搜索栏是个不分青红皂白的大漏斗。敲进一个关键词,长篇博文(post)、几百字的手记(note)、随手发的一句碎碎念,全都挤在同一张列表里。在手机上找半年前的一篇手记,得先划过一大片长文摘要。
那天夜里我把搜索逻辑拆开重新理了一遍(ef7b387):筛选维度跟当前所在的栏目联动,博文、手记和思考各自有各自的检索范围。改完在模拟器里切了几下标签,结果一下子清爽了。找长文去长文的书架,翻日常去手记的抽屉。
再搜"回南天",那篇手记排在了第一个。
颜色
收拾完搜索,我又跟颜色较上了劲。
网页端和 App 放在一起看,最让我别扭的是深浅色总差着一口气。主站 Shiroi 主题里调了很久的暖白纸张底色和深色夜间背景,到了 iOS 原生控件上,总显得冷而硬。
我干脆打开主站的 packages/design-system/src/tokens.css,对着色值变量一行行比,把日间和夜间的配色令牌原样搬进了 miao-reader 的主题管理(3c4996f)。模拟器切到深色模式的那一下,熟悉的暗调在小屏幕上铺开,和电脑浏览器里那个世界终于对上了。
(比对色值这件事本身极其枯燥,我中途至少走神去刷了两次手机。)
朗读
最后一个改动让我折腾到了凌晨:给文章详情页加一个语音朗读的入口(293c42c)。
有时候盯了一整天屏幕,晚上洗漱完躺在床上,眼睛酸得不想再对焦任何一行小字,可脑子又想随便翻两篇旧文听个响。我用 Swift 原生的语音合成接口封装了一个轻巧的 TTSManager,把朗读按钮放在文章底栏最顺手的位置。
第一次试的时候,它把一段代码块里的花括号和反引号一个个念了出来,听得我在床上笑出了声。于是又在把正文喂给语音引擎之前加了一层纯文本清洗,代码块、链接符号和 Markdown 标记都先剥掉。
写完最后一行,我把手机连上调试,点开一篇以前写的随笔,按下那个小小的播放图标。房间里响起平稳的朗读声,系统自带的嗓音还带着一点机械质地,念到某个长句时停顿的位置也不太对。我闭着眼听了一会儿,听自己过去写下的句子一句句从耳边过去,心里很踏实。
这三次提交加起来,没有什么架构重构,也没有值得大书特书的算法。只是一些每天真正打开它的人才会留意的小角落:搜索更听话了,夜里的颜色更顺眼了,累的时候可以不看,只听。
那天我是听着它睡着的,第二天早上醒来,手机还停在那篇文章的最后一段。