我正在寻找一个自定义的BlockFeature到w尾草稿编辑器中,该编辑器将转换为具有特定类的段落标签。
<p>A normal paragraph</p>
<p class="margin-0">A special paragraph using my custom feature</p>
这是我的尝试:
@hooks.register('register_rich_text_features')
def register_margin0_feature(features):
"""
Registering the `margin-0` feature, which uses the `blockquote` Draft.js block type,
and is stored as HTML with a `<p class="margin-0">` tag.
"""
feature_name = 'margin-0'
type_ = 'custom'
tag = 'p'
classname = "margin-0"
control = {
'type': type_,
'label': '❝',
'description': 'Paragraph with margin-0',
# Optionally, we can tell Draftail what element to use when displaying those blocks in the editor.
'element': 'blockquote',
}
features.register_editor_plugin(
'draftail', feature_name, draftail_features.BlockFeature(control)
)
features.register_converter_rule('contentstate', feature_name, {
'from_database_format': {'p[margin-0]': BlockElementHandler(type_)},
'to_database_format': {
'block_map': {
type_: {
'element': tag,
'props': {
'class': 'margin-0',
},
},
},
},
})
这可以正确保存到数据库并生成正确的页面标记,但是,当我在wagtail admin中打开页面时,drawiail编辑器将其误认为是普通段落。
翻阅w源,我在html_ruleset.py中注意到了这一点:
查找与具有给定名称和属性dict的HTML元素匹配的规则,并返回相应的结果对象。如果没有规则匹配,则返回None。 如果有多个规则匹配,则选择的规则不确定。
由于有一个内置的'p'标签处理程序,这是否使识别'p class =“ margin-0”'成为不可能?
能够在编辑器中的每个段落上编写所需的自定义类,真是太好了。
答案 0 :(得分:1)
是的,不幸的是,规则集系统当前不优先于更具体的规则,因此无法定义取代默认<p>
规则的规则。这是一个开放功能请求:https://github.com/wagtail/wagtail/pull/4527
但是,请注意,选择器p[margin-0]
是不正确的,因为这将使具有<p>
属性而不是margin-0
属性的class
元素匹配-应该为{ {1}}。