1from django.urls import include, path, reverse
2from django.utils.html import format_html
3from django.utils.translation import gettext as _
4
5import wagtail.admin.rich_text.editors.draftail.features as draftail_features
6
7from wagtail.admin.rich_text import HalloPlugin
8from wagtail.core import hooks
9from wagtail.embeds import urls
10from wagtail.embeds.rich_text import MediaEmbedHandler
11from wagtail.embeds.rich_text.contentstate import ContentstateMediaConversionRule
12from wagtail.embeds.rich_text.editor_html import EditorHTMLEmbedConversionRule
13
14
15@hooks.register('register_admin_urls')
16def register_admin_urls():
17    return [
18        path('embeds/', include(urls, namespace='wagtailembeds')),
19    ]
20
21
22@hooks.register('insert_editor_js')
23def editor_js():
24    return format_html(
25        """
26            <script>
27                window.chooserUrls.embedsChooser = '{0}';
28            </script>
29        """,
30        reverse('wagtailembeds:chooser')
31    )
32
33
34@hooks.register('register_rich_text_features')
35def register_embed_feature(features):
36    # define a handler for converting <embed embedtype="media"> tags into frontend HTML
37    features.register_embed_type(MediaEmbedHandler)
38
39    # define a hallo.js plugin to use when the 'embed' feature is active
40    features.register_editor_plugin(
41        'hallo', 'embed',
42        HalloPlugin(
43            name='hallowagtailembeds',
44            js=[
45                'wagtailembeds/js/embed-chooser-modal.js',
46                'wagtailembeds/js/hallo-plugins/hallo-wagtailembeds.js',
47            ],
48        )
49    )
50
51    # define how to convert between editorhtml's representation of embeds and
52    # the database representation
53    features.register_converter_rule('editorhtml', 'embed', EditorHTMLEmbedConversionRule)
54
55    # define a draftail plugin to use when the 'embed' feature is active
56    features.register_editor_plugin(
57        'draftail', 'embed', draftail_features.EntityFeature({
58            'type': 'EMBED',
59            'icon': 'media',
60            'description': _('Embed'),
61        }, js=['wagtailembeds/js/embed-chooser-modal.js'])
62    )
63
64    # define how to convert between contentstate's representation of embeds and
65    # the database representation-
66    features.register_converter_rule('contentstate', 'embed', ContentstateMediaConversionRule)
67
68    # add 'embed' to the set of on-by-default rich text features
69    features.default_features.append('embed')
70