Shr*_*saR 13 language-agnostic algorithm typography
我有一个包含"直"(普通,ASCII)引号的文件,我正在尝试将它们转换为真正的引号字形("卷曲"引号,U + 2018到U + 201D).由于从两个不同的引号字符转换为单个字符首先是有损的,显然没有办法自动执行这种转换; 尽管如此,我怀疑一些启发式方法将涵盖大多数情况.因此,该计划是一个脚本(在Emacs中),它执行以下操作:对于每个直引号字符,
这个问题是关于第一步:对于普通的英文文本(例如小说),使用什么是一个好的算法(一组启发式,更像是)?以下是一些初步的想法,我认为这些想法适用于双引号(欢迎反例!):
单引号比较复杂,因为a '
可能是开头引号,结束引号或撇号,我们想要单独留下撇号(不能写"绝对不能").一些与上述相同的规则适用,但'可能的撇号是在单词(或行)的开头,尽管它不像过去的'twas那样常见.我不能随便想到能够正确处理像["我喜欢'那'70年代表演''这样片段的规则,"她说.它可能需要查看不仅仅是相邻字符,并计算引号之间的距离,例如......
还有什么想法吗?如果不是所有可能的案件都包括在内,那也没关系; 我们的目标是尽可能聪明,但不能再进一步.:-)
编辑:可能值得考虑的更多事情(或者可能是不相关的,不确定):
您无法使用正则表达式解析英文引号,因为正则表达式无法解析英文引号。正则表达式的表达能力不足以解析英文引文。在某些情况下您可以应付自如,但无法使用正则表达式创建通用解决方案。请参阅我的解决方案的测试用例。
鉴于:
然后,从广义上讲,一种可能的算法如下:
消除歧义需要用可解析的等价物替换不明确的引号。基本上,您需要计算不明确的前导、滞后和不确定单引号的数量。根据树的当前级别是否已包含前导/滞后引号的某种组合,您可以确定不明确的引号是否为:右单引号、左引号或撇号。
这不是一个简单的算法,因为它可能需要:
以下是KeenQuotes的一些屏幕截图,它已集成到我的文本编辑器KeenWrite中:
尼特:是的'70s
,并不是'70's
因为几十年不能拥有任何东西。