Python 如何通过从底部(运行)到顶部(docDefaults)遍历来获取样式值?

Python 如何通过从底部(运行)到顶部(docDefaults)遍历来获取样式值?,python,ms-word,python-docx,Python,Ms Word,Python Docx,TLDR:哪个优先级更高,或者,当我们想在运行属性中查找值时,它返回无作为输出 示例:打印文档中所有运行的字体名称 doc=Document() 对于文件段落中的段落: 如果第1.2段: 对于磨合段运行: 打印(run.font.name) 问题: 目前,我正在编写一个用例,以检查给定文档是否具有特定的字体/语言/字体大小等 例如:为了获得整个文档的语言(拼写和语法)。目前,我按照以下步骤使用样式层次结构获取值: 加载文档 反复阅读段落 反复浏览段落 检查它的(当前运行)rPr是否为lang

TLDR:哪个优先级更高,或者,当我们想在
运行
属性中查找值时,它返回
作为输出

示例:打印文档中所有运行的字体名称

doc=Document()
对于文件段落中的段落:
如果第1.2段:
对于磨合段运行:
打印(run.font.name)
问题:

目前,我正在编写一个用例,以检查给定文档是否具有特定的字体/语言/字体大小等

例如:为了获得整个文档的语言(拼写和语法)。目前,我按照以下步骤使用
样式层次结构获取值:

  • 加载文档
  • 反复阅读段落
  • 反复浏览段落
  • 检查它的(当前运行)rPr是否为
    lang
  • 如果运行中没有值,则检查当前段落的
    rPr
    ,查看
    lang
  • 如果段落中没有值,则从
    docDefaults rPr
  • 如果在步骤4-6之间得到一个值,我会将该值视为Run值
  • 这种方法帮助我获得了lang和font的预期结果(至少对于我所拥有的文档)

    但是在某些情况下,
    docDefaults
    本身没有价值,而且这种方法也没有帮助,我听说了

    因此,如果当前样式没有值,我只实现了一个递归函数,从
    base\u样式
    获取值

    我在实现中做了一个小改动,因为每当
    rPr
    中没有值时,我只需检查它的
    base\u样式的值,然后在层次结构中向上移动一步

    我不确定我采用的方法是否正确。如果有一个简单的方法来实现这一点。请帮忙


    我认为这里的最终答案只能可靠地来自一组测试用例,这些测试用例基于您可以开发的最小穷举组合集,每个测试用例“手工”确认它们的预期值

    我之所以这样说,是因为尽管.docx格式的ISO规范非常好,但它通常避免指定行为,包括格式/样式继承层次结构的细节

    你似乎在正确的轨道上,但我会把人物风格添加到你的候选人名单中。例如,运行可以应用显式字体,但也可以应用本身指定字体的字符样式。直接应用于运行的字体将获胜(根据“最近的说明符”原则),但这是一个有趣的问题,它将在运行级别/字符样式和直接应用的段落字体之间获胜。我敢打赌运行级角色样式,但这将是您将开发并最初手动验证的测试用例的主题

    我将以下内容作为继承层次结构的草稿。在Word中进行实验时,您可以确认并填写位:

    • 直接应用于运行的字符格式(
      run.font
    • 直接应用于运行的字符样式(
      run.style
    • 直接应用于段落的默认运行字符格式(
      段落.font
      注意:在
      python docx
      中可能无法实现)
    • 段落样式中明确指定的字符格式(
      段落.style
    • 按段落样式链接的字符样式(不确定,可能是
      段落.style.character\u style
    • 表格样式可能会影响某些事情,但可能不会影响
      lang
      。不确定这是否符合层次结构,这需要研究,可能还需要实验
    • 默认段落样式(可能是
      document.styles[“Normal”]
      ,但可能是可配置的,名称可能会随区域设置而变化,比如“Normale”可能是一些语言)
    • 显式文档默认值
    • Word内置默认值

    不确定这是否完全回答了你的问题;如果你还需要其他东西,也许你可以澄清一下。

    谢谢你的精彩套餐和你的支持。我将添加所有缺少的层次结构并对其进行实验。任何想法,比如,我应该什么时候检查某个特定样式的
    base\u样式
    ,或者我可以简单地遵循这个层次结构?这是一个好问题,整个样式继承层次结构都被遍历以计算“有效样式”,所以我想说,您需要遍历base\u样式,直到到达死胡同为止(
    base_style是None
    我想),然后再从样式开始。