【问题标题】:how to tokenize/parse/search&replace document by font AND font style in LibreOffice Writer?如何在 LibreOffice Writer 中通过字体和字体样式标记/解析/搜索和替换文档?
【发布时间】:2017-02-23 04:49:02
【问题描述】:

我需要通过首先将所有条目解析为其部分来更新用 Writer 编写的双语词典,例如

  • 主词(字体 1,粗体)
  • 外文等效音译(字体 1,斜体)
  • 外文等价物(字体 2,粗体)
  • 词性(字体 1,斜体)

文档的每一行都是主要单词,后面是上面列出的部分,每个部分用空格或标点符号分隔。

我需要自动执行逐行遍历整个文件的过程,并在每个部分之间放置一个分隔符,忽略空格和标点符号,这样我就可以将它大量导入到 Calc 文件中。换句话说,“每个部分”是具有相同字体和字体样式的字符序列(忽略空格和标点符号)。

我尝试了标准的 Search&Replace 功能和 AltSearch 扩展,但都无法完成任务。主要问题是我无法编写这样的搜索查询:

查找: 具有相同字体和 font_style 的连续字符,忽略空格和标点符号

替换: 上面找到的术语 + “分隔符”

任何建议我可以如何为此编写脚本,或者现有工具是否可以解决问题?

谢谢!

所需效果的伪代码:

var delimiter = "|"

Go to beginning of document

While not end of document do:
     var $currLine = get line from doc
     var $currChar = get next character which is not space or punctuation;
     var $font = currChar.font
     var $font_style - currChar.font_style (e.g. bold, italic, normal)

     While not end of line do:
         $currChar = next character which is not space or punctuation;

          if (currChar.font != $font || currChar.font_style != $font_style) { // font or style has changed
               print $delimiter

               $font = currChar.font
               $font_style - currChar.font_style (e.g. bold, italic, normal)
          }
     end While

end While

【问题讨论】:

    标签: parsing scripting tokenize libreoffice writer


    【解决方案1】:

    这里是您的伪代码所做的每件事的提示。

    首先,逐行移动的最简单方法是使用TextViewCursor,尽管它很慢。注意 XLineCursor 部分。对于 while 循环,oVC.goDown() 将在到达文档末尾时返回 false。 (oVC 是 TextViewCursor 的变量)。

    通过调用oVC.goRight(0, False) 取消选择,然后调用oVC.goRight(1, True) 来选择每个字符。然后通过oVC.getString()获得选中的值。要忽略空格和标点符号,可以使用 python 的 isalnum()re 模块。

    要确定字符的字体,请调用oVC.getPropertyValue(attr)attr 的值可以简单地为 CharAutoStyleNameCharStyleName 以检查格式的任何更改。

    或获取特定属性的列表,例如'CharFontFamily', 'CharFontFamilyAsian', 'CharFontFamilyComplex', 'CharFontPitch', 'CharFontPitchAsian' 等。字符属性在https://wiki.openoffice.org/wiki/Documentation/DevGuide/Text/Formatting 中进行了描述。

    在文本中插入分隔符:oVC.getText().insertString(oVC, "|", 0)

    This python code from github 展示了如何做大部分这些事情,尽管您需要通读它才能找到相关部分。

    或者,不使用 LibreOffice API,解压缩 .odt 文件并使用脚本解析 content.xml

    【讨论】:

    • 解压缩 .odt 并提取 .xml 文件是一个有用的建议!我没有意识到 .odt 是一种 zip 格式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-22
    • 1970-01-01
    • 2018-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多