用于在 Scribus 中自动替换文本的 Python 脚本

需要在 Scribus 中替换文本?这些脚本可能会有所帮助。
389 位读者喜欢这个。
Programming keyboard.

Opensource.com

在我的上一篇文章中,我介绍了 Autoquote,这是一个将打字机(或“直”)引号转换为印刷体(或“弯曲”)引号的脚本,这是由 Scribus 开源桌面出版软件的邮件列表中的一个问题引发的。大多数出版物都遵循一定的风格约定,包括它们使用的引号类型,而一个自动纠正与内部风格偏差的脚本是一个巨大的节省时间工具。

该脚本的核心是一种逐字符解析文本框内容的方法,其工作原理如下:首先,各种控制字符,例如,用于回车符和表示样式的字符,都保持不变。其次,沿着文本进行渐进式推进,跟踪当前正在分析的字符以及前一个和后一个字符,以确定是否应将打字机引号替换为左引号或右引号。

在我创建了这个 Autoquote 脚本之后,有人问我是否可以编写一个脚本来扰乱文档中的文本。这个人想发布一个 Scribus 文档来展示布局,但隐藏框架的文本内容。这个想法不是加密文档,而是简单地将文本变成乱码。在我看来,Autoquote 中的基本解析部分可以很好地服务于这个目的。

replacetext.py

我将最终结果称为 replacetext.py,最终得到了四个不同的版本,你可以在 wiki 页面上看到。最初的版本仅对选定的文本框进行操作,但后来出现了一个版本,可以转换常规页面上的所有文本框,另一个版本用于包括主页上的所有文本框,还有一个版本仅适用于文档的当前页面。

我选择按如下方式进行这种扰乱

    alpha = random.randint(1,26)
    letter = chr(alpha + 96)
    LETTER = chr(alpha + 64)
    if ((ord(char)>96)and(ord(char)<123)):
        scribus.deleteText(textbox)
        scribus.insertText(letter, c, textbox)
    if ((ord(char)>64)and(ord(char)<91)):
        scribus.deleteText(textbox)
        scribus.insertText(LETTER, c, textbox)

对于每个新解析的字符,都会生成一个介于 1 到 26 之间的随机整数。这个随机整数同时创建一个随机小写字母和大写字母。然后,脚本测试原始文本字符以确定它是小写字母还是大写字母,以便它可以进行适当的替换(即,保留原始字符的大小写)。只有 a-z 和 A-Z 字符会受到影响,数字和 ASCII 范围之外的字符不会受到影响(尽管扩展这一点并不难)。

由于随机化函数,没有办法逆转这个过程,但我仍然想保留带有大写字母和单词间距的文本的大致外观。在实际使用中,一个副作用是文本往往占用更多空间,我认为这与英语中比平时更宽的字形数量增加有关。在实践中,用户可以在必要时删除字符以获得布局外观。

Example of scrambled text

这是一个结果的示例。顶部段落是原始文本,只是一些来自 Scribus 的示例文本,下面是运行 replacetext.py 后的结果。正如你所看到的,只有字母字符被转换了,偶尔随机化会导致相同的字符,这是预期的。这也显示了替换后的文本倾向于占用更多空间。

en+emdash.py

许多出版物在其风格指南中指定使用 en (–) 和 em (—) 破折号。这些与连字符 (-) 不同,但有时用两个或三个连字符一起键入表示。许多 Scribus 用户在 Scribus 之外的文本编辑器中撰写文本,然后将其导入到 Scribus 文档的文本框中。与印刷体引号一样,自动将连字符转换为 en 和 em 破折号的实用程序将非常有用。

你可以在其 wiki 页面上找到 en+emdash.py 脚本。这是相关的赋值策略

    if (char == '-'):

      if (prevchar == '-'):
        if (nextchar == '-'):
          scribus.selectText(c-1, 3, textbox)
          scribus.deleteText(textbox)
          scribus.insertText(mdash, c-1, textbox)
          char = mdash
        else:
          scribus.selectText(c-1, 2, textbox)
          scribus.deleteText(textbox)
          scribus.insertText(ndash, c-1, textbox)
          char = ndash

在这种情况下,变量 mdashndash 之前已被分配了适当的 Unicode 字符。如果 en+emdash.py 脚本遇到连字符,它会检查之前的字符是否也是连字符。如果这是真的,那么它会检查后面的字符,如果这也是连字符(即 ---),它会分配一个 em 破折号,但如果不是(即 --),它会分配一个 en 破折号。单个连字符保持为单个连字符。

这不是一个强大或常用的脚本,但它的功能就像一个简单的实用程序,可以完成一项任务,很像许多 Unix/Linux 命令行函数。

这也表明,一旦你花时间完成了像文本解析这样复杂的基本操作的逻辑,你就可以继续将其应用于各种用途。

标签
Greg Pittman
Greg 是肯塔基州路易斯维尔的一位退休神经科医生,长期以来对计算机和编程感兴趣,从 1960 年代的 Fortran IV 开始。当 Linux 和开源软件出现时,它激发了学习更多知识的承诺,并最终做出贡献。他是 Scribus 团队的成员。

1 条评论

我正在尝试做类似于 en+emdash.py 的事情,但作为自动替换(= 直接从键盘)。
对于 Windows,有 AutoHotKey,但对于 Mac,似乎没有什么可比的...
有什么帮助吗?

Creative Commons License本作品根据 知识共享许可协议 署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.