使用Archetypes从RichText字段获取文本的规范方法是什么?

时间:2016-06-17 14:12:19

标签: plone 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

1 个答案:

答案 0 :(得分:8)

在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会在具有RichTextValue的DX内容上返回实际内容,例如obj.text.raw

您可以检查内容是否提供IBaseObject而非抓住AttributeError