我正在尝试开发一个可以在ePub 2 编辑器Sigil中运行的正则表达式。
小型股是当前 ePub 阅读器生态系统中的一个众所周知的问题。许多阅读器,例如 Adobe Digital Editions,不支持“font-variant: small-caps”。在尝试了几种不同的解决方法后,我决定通过将文本转换为大写并将以前的小写字母设置为“font-size: 0.75em”来创建假的小型大写字母。
这个过程非常繁琐,尤其是在处理有很多尾注并引用其他书籍的书籍时。
假设我在一个带有“SC”类标签的 HTML 页面中有一堆短语。我创建了一个测试短语:
<span class="SC">Hello World! Testing: one tWo thrEE & W.T.F.</span>
<span class="foo">Don't touch me!</span>
目标是编写一个仅匹配“SC”跨度标记内的任何小写字母的正则表达式,并将它们替换为:
<span class="FSC">LETTERS</span>
我可以设法匹配和替换第一个单词“Hello”中的字母,但在那之后一切都崩溃了。
这是我到目前为止所得到的:
寻找:
(<span class="SC">.*?)([a-z]+)(.*</span>)
代替:
\1<span class="FSC">\U\2\E</span>\3
棘手的部分是继续在该标签中找到其余的小写字母,现在引入了新的“FSC”(假小写字母)跨度标签。再次尝试相同的正则表达式会导致“span”,然后“class”得到FSC处理。理想情况下,我希望能够一直点击“全部替换”按钮,直到找不到更多匹配项。
完成后,上面的示例将如下所示:
<span class="SC">H<span class="FSC">ELLO</span> W<span class="FSC">ORLD</span>! T<span class="FSC">ESTING</span>: <span class="FSC">ONE</span> <span class="FSC">T</span>W<span class="FSC">O</span> <span class="FSC">THR</span>EE & W.T.F.</span>
<span class="foo">Don't touch me!</span>
它并不漂亮,但它适用于我测试过的每个 ePub 阅读器。
如果您在 Google 上搜索“epub small caps regex”,您会看到我编辑的 MobileRead wiki 文章以包含此正则表达式,但我认为该文章并不令人满意:
(<span class="[a-zA-Z0-9\- ]*?(?<!F)SC[a-zA-Z0-9\-]*?">(?:.+?<span class="FSC">.+?</span>)*[\.|,|:|;|-|–|—|!|\?]? ?(?:&)? ?[A-Z]+)([a-z'’\. ]+)(.*?</span>)
这最终会缩小一堆标点符号,有时会停在一个短语的中间。我重新开始,认为可能有一个更好的解决方案,它不会尝试预先计划每一种可能性。
如果有人对此提出更好的解决方案,您将成为整个 ePub 出版业的英雄。
更新
我已将接受的(也是唯一的)答案添加到Mobile Read wiki。请注意,此正则表达式已专门为在 Sigil 中使用而进行了更改;YMMV 在其他环境中。