最近正逢各种职业资格考试,有读者熬夜备考,从 PDF 文献里拷贝出大段文字,没成想格式错乱,通篇都是重复的空行、多余的空格以及中英混用的标点。这位仁兄也是坚毅过人,连续几个晚上没睡,手动把所有格式错误修正了过来。事后他才知道,原来用自动化工具可以一键清理错误的文字格式。
为当事人惋惜的同时,我也反思了自己的工作流,其中同样有过这些繁琐操作:
手动在中英文之间插入空格
手动帮挤成一团的文字换行
手动把普通引号 ” 换成直角引号 「
……
从 PDF 复制出来的文本往往格式错乱
这些事情,其实都可以、也应该通过自动化工具瞬间完成。具体来说,我们主要有这些清理文字格式需求:
添加符号:如 Markdown 符号
添加空格:在中英文之间加入空格
文本替换:有普通文本替换和正则文本替换
文本去重:去掉多余的文字或者空格、空行
……
这篇文章我主要以 TextExpander 为例,它同时支持 macOS、iOS 和 Windows 等多个平台,而且其所用的 JavaScript 脚本通用性强,可以轻松移植到其他自动化工具中。
[rihide]文中每个案例中都会提供现成的自动化动作下载,绝大部分动作稍作修改后可用于任何支持 JavaScript 的文字处理工具(参考《iOS 文本处理中的 JavaScript》)。
> 所有 TextExpander Snippet 下载 ?
小科普:为什么是 TextExpander
选 TextExpander 作为清理工具,除了文章开头提到的跨平台通用性考虑,还因为它的操作比较独特,比起最常见的快捷键操作更适合在大量的文字输入中进行。
TextExpander 不依靠快捷键,而是利用文本缩写(abbrevation)来快速输入和处理文字,比如默认的 ddate
就表示输入日期(date),比快捷键更直观好记。通过 TextExpander 来清理文字格式,体验就像打字一样自然。
插入符号:以 Markdown 符号为例
Markdown 符号很简洁,一般我们都是手动输入的。直到 Hum 找我做一个「自动添加引用符号」的脚本,我才发现原来 Markdown 符号的输入也有优化空间。
下面的 Snippet(TextExpander 中的缩写片段)用到了一小段 JavaScript,功能很简单,就是在每行文字前面都加上 >
,把好几行文字一次性转换成一大段的引用格式。
这个 Snippet 最早被用于在 Slack 发送祝福 ?。使用中它又有了衍生版本,比如:
- 把
>
替换成-
,就能批量把段落转换成列表。 - 把
>
替换成\t
,就能让整段文字向右缩进一格。 - 把单个新行符
\n
替换成\n\n
,在每段文字后添加空行。 - ……
下面是添加空行的动作演示,在某些基础 Markdown 编辑器中进行预览时,添加空行就可以避免文字挤成一团。
在中英文之间插入空格
中英文之间要不要加空格,这没有强制标准,但是有空格的确会更清晰好看,少数派编辑部在排版时也默认会添加空格。
不过多数时候,我们引来的资料、收到的原稿都是中英文挤成一团的,手动加空格非常累,也容易漏加、重复加。所以我写了一个 TextExpander Snippet 来完成自动添加。利用下面的 Snippet,拷贝原文后,在编辑器内输入 addsp
(add space,增加空格),TextExpander 就会粘上一段已加好空格的文本。
在编辑工作中,这个脚本帮了我不少忙,大大降低了手动加空格的工作量。
仔细看 Snippet 中的脚本,其实不光是中英文,它还可以在中文和数字、英文和数字之间也插入空格。事实上,这段脚本在运行时会进行 6 轮的「添加空格」操作(.replace(pn, "$1 $2")
),每次检测成功就会来一波空格添加。
如果有你不需要的部分,也可以自行删除:
- 英中空格:删除
.replace(p1, "$1 $2")
- 中英空格:删除
.replace(p2, "$1 $2")
- 中文数字空格:删除
.replace(p3, "$1 $2")
- 数字中文空格:删除
.replace(p4, "$1 $2")
- 英文数字空格:删除
.replace(p5, "$1 $2")
- 数字英文空格:删除
.replace(p6, "$1 $2")
特别提醒一下,诸如 U盘
这类可能被认为不用加空格的词语,这个 Snippet 无法识别,大家如果不慎动到这些特殊的专有名词,还是需要手动改回来。另外,不要用这个 Snippet 清理链接,多出来的空格会导致链接格式出错。
文本替换
文本替换是很常见的一类操作,甚至有人调侃,会不会用 Word 的文本替换是辨别电脑「小白」的指标。现在,文本替换不只是各类文本编辑器的标配功能,也是每个人的必备技能——而最常用的文本替换操作,还可以进一步打包成自动化的流程。下面我们就用 TextExpander 来实现文本替换,进行格式清理。
和中英文之间要不要加空格一样,用直角引号还是弯引号并不是绝对的,具体用哪个,更多还是处于审美的考虑。不过设置一个自动切换的 Snippet,在需要时就能避免恶心的手动操作。
下面演示的是弯引号变直角引号,复制好参考资料的文本后,输入替换码 rpqt
(replace qoute,替换引号),新的文本就跃然「屏」上:
这个需求,原先来自写文章的场景,用到的很多参考资料普遍采用弯引号,为了和少数派整体风格统一,我经常用这个 Snippet 来清理文本。后来发现,San Francisco 下的弯引号和闭引号不易辨认,明明是弯引号,看不到、搜不出来,只能靠 JavaScript 来处理,于是 TextExpander 的必要性又增强了。
打开脚本,可以看到我设置了两次替换,分别对应左右两个引号:
- 替换左引号:
var re1 = /“/g;
和result = result.replace(re1,"「");
- 替换右引号:
var re2 = /”/g;
和result = result.replace(re2,"」");
你可以把 “
和 「
、”
和 」
分别换成自己需要的替换前后文本,来制作自己的文本替换 Snippet。
顺带一提,JavaScript 里的文本替换函数(replace()
)是支持正则表达式的,我们可以随手做出很灵活的文本替换,比如把下面这一大段书名换成列表:
正则表达式的玩法远远不止这些。在文章末尾,我们还会学用 TextExpander 来清理重复文本。
清理重复文本
注:有些自动化工具,比如 LaunchBar 自带了清理多余空格、空行的功能,有这些工具的读者可以直接使用。
让我们回到开头的场景。和 PDF 打过交道的人,估计都被这种「所见不是所得」的文档格式折磨过,复制下来大量错乱的文本。
各种文本错乱中,多余的空格和空行是最常见的,这一节我们就来解决这些文本重复问题。下面是一个清理多余空行的 Snippet:
它的脚本其实很简单,就是在文本替换 Snippet的基础上做了一点修改,把多个重复文本替换成单个文本(空格和换行符也可以用正则符号来表示)。下图红色和蓝色区域分别就是替换前后的文本:
- 替换前:
\n(\n)*( )*(\n)*\n
,表示多个空行 - 替换后:
\n\n
,表示两个空行(为了方便 Markdown 格式下进行预览所以多加了一行空行)
你可能已经想到,既然重复的空行能精简,其他多余符号也可以如法炮制。没错,把上面脚本中的 \n(\n)*( )*(\n)*\n
换成表示重复空格的 \s(\s)*( )*(\s)*\s
,再将替换后的文本设为空值 ""
,即可实现重复空格的清除。
注意,如果中英文之间有重复空格,这个 Snippet 也会把它们一并清理掉。如果有给中英文添加空格的需求,可以在清理后在运行一遍添加空格的 Snippet。
小结
有人觉得,只有作者、编辑才需要清理文字,其实越是不常写东西的人,越是需要掌握文字格式清理的方法,不然为了给报告换行、删空格这种小事,而在日常工作之外又熬夜加班,实在亏待自己。
这篇文章里,我们以跨平台的 TextExpander 为例,借助最通用的脚本语言——JavaScript——实现了一系列的文本格式清理。从最简单的插入符号,到文本替换、重复文本精简,以后遇到这些常见的格式错误,我们能够更轻松地处理。
最后还是那句话,工具不是唯一的,学会思路,用自己习惯的其他工具也能实现[/rihide]
暂无评论内容