使用 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
。
对于 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
。