使用 Archetypes 从 Rich Text 字段中获取文本的规范方法是什么

What is the canonical way to get text from RichText field with Archetypes

对于 Dexterity 内容类型,规范的方法是使用转换器:

from plone.app.textfield.interfaces import ITransformer
from plone.app.textfield.value import IRichTextValue


def get_text_field(obj):
    """Get text field in object on Dexterity."""
    transformer = ITransformer(obj)
    text = ''
    if IRichTextValue.providedBy(obj.text):  # Dexterity
        text = transformer(obj.text, 'text/plain')
    return text

但我找不到使用 Archetypes 的规范方法,转换器不适用于 raw html,仅适用于 RichTextValue对象。

我现在的做法是用lxml.html把html转成文本,但不知是否能正常工作:

def get_text_field(obj):
    """Get text field in object on both, Archetypes and Dexterity."""
    text = ''
    try:
        raw = obj.getText()  # Archetypes
        if raw != '':
            from lxml import html
            el = html.fromstring(raw)
            text = el.text_content()
    except AttributeError:
        from plone.app.textfield.value import IRichTextValue
        if IRichTextValue.providedBy(obj.text):  # Dexterity
            from plone.app.textfield.interfaces import ITransformer
            transformer = ITransformer(obj)
            text = transformer(obj.text, 'text/plain')
    return text

在 Archetypes 中,常规 getter 会为您完成此操作。

因此,如果您对具有文本字段的特定 AT 类型调用 getText,您将获得转换后的值:检查 https://github.com/plone/Products.Archetypes/blob/e9ad0f4e76544b7890835ca93d25adeca4fc064f/Products/Archetypes/Field.py#L1564

它使用字段中指定的 mimetype。

如果输出类型是 text/html 而你想要 text/plain

可以通过mimetype参数调用字段getter得到:

obj.getField('text').get(obj, mimetype='text/plain')

进一步: obj.getRawText returns 实际内容,例如 obj.text.raw 在具有 RichTextValue 的 DX 内容上。

并且您可以检查内容是否提供IBaseObject而不是捕获AttributeError