Replace register_link_handler_rules and register_embed_handler_rules with register_converter_rule

pull/4079/merge
Matt Westcott 2017-12-08 16:38:32 +00:00
rodzic 68d09e15e7
commit 0f42c7af9e
6 zmienionych plików z 62 dodań i 59 usunięć

Wyświetl plik

@ -15,6 +15,18 @@ class WhitelistRule:
self.handler = handler
class EmbedTypeRule:
def __init__(self, embed_type, handler):
self.embed_type = embed_type
self.handler = handler
class LinkTypeRule:
def __init__(self, link_type, handler):
self.link_type = link_type
self.handler = handler
# Whitelist rules which are always active regardless of the rich text features that are enabled
BASE_WHITELIST_RULES = {
@ -40,9 +52,10 @@ class DbWhitelister(Whitelister):
determined by the handler for that type defined in link_handlers, while keeping the
element content intact.
"""
def __init__(self, converter_rules, features):
def __init__(self, converter_rules):
self.converter_rules = converter_rules
self.element_rules = BASE_WHITELIST_RULES.copy()
for rule in converter_rules:
for rule in self.converter_rules:
if isinstance(rule, WhitelistRule):
self.element_rules[rule.element] = rule.handler
@ -58,23 +71,19 @@ class DbWhitelister(Whitelister):
for fn in construct_whitelist_hooks:
self.element_rules.update(fn())
self.features = features
@cached_property
def embed_handlers(self):
embed_handlers = {}
for feature in self.features:
embed_handlers.update(feature_registry.get_embed_handler_rules(feature))
return embed_handlers
return {
rule.embed_type: rule.handler for rule in self.converter_rules
if isinstance(rule, EmbedTypeRule)
}
@cached_property
def link_handlers(self):
link_handlers = {}
for feature in self.features:
link_handlers.update(feature_registry.get_link_handler_rules(feature))
return link_handlers
return {
rule.link_type: rule.handler for rule in self.converter_rules
if isinstance(rule, LinkTypeRule)
}
def clean_tag_node(self, doc, tag):
if 'data-embedtype' in tag.attrs:
@ -120,12 +129,10 @@ class DbWhitelister(Whitelister):
class EditorHTMLConverter:
def __init__(self, features=None):
if features is None:
self.features = feature_registry.get_default_features()
else:
self.features = features
features = feature_registry.get_default_features()
self.converter_rules = []
for feature in self.features:
for feature in features:
rule = feature_registry.get_converter_rule('editorhtml', feature)
if rule is not None:
# rule should be a list of WhitelistRule() instances - append this to
@ -134,7 +141,7 @@ class EditorHTMLConverter:
@cached_property
def whitelister(self):
return DbWhitelister(self.converter_rules, self.features)
return DbWhitelister(self.converter_rules)
def to_database_format(self, html):
return self.whitelister.clean(html)
@ -143,14 +150,11 @@ class EditorHTMLConverter:
def html_rewriter(self):
embed_rules = {}
link_rules = {}
for feature in self.features:
embed_handlers = feature_registry.get_embed_handler_rules(feature)
for handler_name, handler in embed_handlers.items():
embed_rules[handler_name] = handler.expand_db_attributes
link_handlers = feature_registry.get_link_handler_rules(feature)
for handler_name, handler in link_handlers.items():
link_rules[handler_name] = handler.expand_db_attributes
for rule in self.converter_rules:
if isinstance(rule, EmbedTypeRule):
embed_rules[rule.embed_type] = rule.handler.expand_db_attributes
elif isinstance(rule, LinkTypeRule):
link_rules[rule.link_type] = rule.handler.expand_db_attributes
return MultiRuleRewriter([
LinkRewriter(link_rules), EmbedRewriter(embed_rules)

Wyświetl plik

@ -44,14 +44,6 @@ class FeatureRegistry:
# The API of that rule object is not defined here, and is specific to each converter backend.
self.converter_rules_by_converter = {}
# a mapping of feature names to embed_handler rules that should be merged into the
# list of recognised embedtypes when the feature is active
self.embed_handler_rules = {}
# a mapping of feature names to link_handler rules that should be merged into the
# list of recognised linktypes when the feature is active
self.link_handler_rules = {}
def get_default_features(self):
if not self.has_scanned_for_features:
self._scan_for_features()
@ -104,21 +96,3 @@ class FeatureRegistry:
return self.converter_rules_by_converter[converter_name][feature_name]
except KeyError:
return None
def register_embed_handler_rules(self, feature_name, ruleset):
self.embed_handler_rules[feature_name] = ruleset
def get_embed_handler_rules(self, feature_name):
if not self.has_scanned_for_features:
self._scan_for_features()
return self.embed_handler_rules.get(feature_name, {})
def register_link_handler_rules(self, feature_name, ruleset):
self.link_handler_rules[feature_name] = ruleset
def get_link_handler_rules(self, feature_name):
if not self.has_scanned_for_features:
self._scan_for_features()
return self.link_handler_rules.get(feature_name, {})

Wyświetl plik

@ -2,7 +2,7 @@ from django.conf import settings
from django.contrib.auth.views import redirect_to_login
from django.urls import reverse
from wagtail.admin.rich_text.converters.editor_html import WhitelistRule
from wagtail.admin.rich_text.converters.editor_html import LinkTypeRule, WhitelistRule
from wagtail.core import hooks
from wagtail.core.models import PageViewRestriction
from wagtail.core.rich_text.pages import PageLinkHandler, page_linktype_handler
@ -45,10 +45,10 @@ def register_core_features(features):
features.default_features.append('link')
features.register_converter_rule('editorhtml', 'link', [
WhitelistRule('a', attribute_rule({'href': check_url}))
WhitelistRule('a', attribute_rule({'href': check_url})),
LinkTypeRule('page', PageLinkHandler),
])
features.register_link_type('page', page_linktype_handler)
features.register_link_handler_rules('link', {'page': PageLinkHandler})
features.default_features.append('bold')
features.register_converter_rule('editorhtml', 'bold', [

Wyświetl plik

@ -9,6 +9,7 @@ from django.utils.translation import ungettext
from wagtail.admin.menu import MenuItem
from wagtail.admin.rich_text import HalloPlugin
from wagtail.admin.rich_text.converters.editor_html import LinkTypeRule
from wagtail.admin.search import SearchArea
from wagtail.admin.site_summary import SummaryItem
from wagtail.core import hooks
@ -81,7 +82,9 @@ def register_document_feature(features):
js=['wagtaildocs/js/hallo-plugins/hallo-wagtaildoclink.js'],
)
)
features.register_link_handler_rules('document-link', {'document': DocumentLinkHandler})
features.register_converter_rule('editorhtml', 'document-link', [
LinkTypeRule('document', DocumentLinkHandler),
])
features.default_features.append('document-link')

Wyświetl plik

@ -3,6 +3,7 @@ from django.urls import reverse
from django.utils.html import format_html
from wagtail.admin.rich_text import HalloPlugin
from wagtail.admin.rich_text.converters.editor_html import EmbedTypeRule
from wagtail.core import hooks
from wagtail.embeds import urls
from wagtail.embeds.rich_text import MediaEmbedHandler, media_embedtype_handler
@ -29,7 +30,10 @@ def editor_js():
@hooks.register('register_rich_text_features')
def register_embed_feature(features):
# define a handler for converting <embed embedtype="media"> tags into frontend HTML
features.register_embed_type('media', media_embedtype_handler)
# define a hallo.js plugin to use when the 'embed' feature is active
features.register_editor_plugin(
'hallo', 'embed',
HalloPlugin(
@ -37,5 +41,12 @@ def register_embed_feature(features):
js=['wagtailembeds/js/hallo-plugins/hallo-wagtailembeds.js'],
)
)
features.register_embed_handler_rules('embed', {'media': MediaEmbedHandler})
# define how to convert between editorhtml's representation of embeds and
# the database representation
features.register_converter_rule('editorhtml', 'embed', [
EmbedTypeRule('media', MediaEmbedHandler)
])
# add 'embed' to the set of on-by-default rich text features
features.default_features.append('embed')

Wyświetl plik

@ -7,6 +7,7 @@ from django.utils.translation import ungettext
from wagtail.admin.menu import MenuItem
from wagtail.admin.rich_text import HalloPlugin
from wagtail.admin.rich_text.converters.editor_html import EmbedTypeRule
from wagtail.admin.search import SearchArea
from wagtail.admin.site_summary import SummaryItem
from wagtail.core import hooks
@ -65,7 +66,10 @@ def editor_js():
@hooks.register('register_rich_text_features')
def register_image_feature(features):
# define a handler for converting <embed embedtype="image"> tags into frontend HTML
features.register_embed_type('image', image_embedtype_handler)
# define a hallo.js plugin to use when the 'image' feature is active
features.register_editor_plugin(
'hallo', 'image',
HalloPlugin(
@ -73,7 +77,14 @@ def register_image_feature(features):
js=['wagtailimages/js/hallo-plugins/hallo-wagtailimage.js'],
)
)
features.register_embed_handler_rules('image', {'image': ImageEmbedHandler})
# define how to convert between editorhtml's representation of images and
# the database representation
features.register_converter_rule('editorhtml', 'image', [
EmbedTypeRule('image', ImageEmbedHandler)
])
# add 'image' to the set of on-by-default rich text features
features.default_features.append('image')