diff --git a/wagtail/admin/rich_text/converters/html_to_contentstate.py b/wagtail/admin/rich_text/converters/html_to_contentstate.py
index 545165a01..6a429944f 100644
--- a/wagtail/admin/rich_text/converters/html_to_contentstate.py
+++ b/wagtail/admin/rich_text/converters/html_to_contentstate.py
@@ -6,6 +6,7 @@ from wagtail.admin.rich_text.converters.contentstate_models import (
)
from wagtail.admin.rich_text.converters.html_ruleset import HTMLRuleset
from wagtail.core.models import Page
+from wagtail.documents.models import get_document_model
class HandlerState(object):
@@ -171,6 +172,20 @@ class PageLinkElementHandler(LinkElementHandler):
return data
+class DocumentLinkElementHandler(LinkElementHandler):
+ def get_attribute_data(self, attrs):
+ Document = get_document_model()
+ try:
+ doc = Document.objects.get(id=attrs['id'])
+ except Document.DoesNotExist:
+ return {}
+
+ return {
+ 'id': doc.id,
+ 'url': doc.url,
+ }
+
+
class AtomicBlockEntityElementHandler(object):
"""
Handler for elements like that exist as a single immutable item at the block level
@@ -237,6 +252,9 @@ ELEMENT_HANDLERS_BY_FEATURE = {
'a[href]': ExternalLinkElementHandler('LINK'),
'a[linktype="page"]': PageLinkElementHandler('LINK'),
},
+ 'document-link': {
+ 'a[linktype="document"]': DocumentLinkElementHandler('DOCUMENT'),
+ },
# 'img': ImageElementHandler(),
}
diff --git a/wagtail/admin/tests/test_contentstate.py b/wagtail/admin/tests/test_contentstate.py
index 877aad182..fa034e9e4 100644
--- a/wagtail/admin/tests/test_contentstate.py
+++ b/wagtail/admin/tests/test_contentstate.py
@@ -278,3 +278,47 @@ class TestHtmlToContentState(TestCase):
},
]
})
+
+ def test_document_link(self):
+ converter = ContentstateConverter(features=['document-link'])
+ result = json.loads(converter.from_database_format(
+ '''
+
a document link
+ ''' + )) + self.assertContentStateEqual(result, { + 'entityMap': { + '0': { + 'mutability': 'MUTABLE', 'type': 'DOCUMENT', + 'data': {'id': 1, 'url': '/documents/1/test.pdf'} + } + }, + 'blocks': [ + { + 'inlineStyleRanges': [], 'text': 'a document link', 'depth': 0, 'type': 'unstyled', 'key': '00000', + 'entityRanges': [{'offset': 2, 'length': 8, 'key': 0}] + }, + ] + }) + + def test_broken_document_link(self): + converter = ContentstateConverter(features=['document-link']) + result = json.loads(converter.from_database_format( + ''' +a document link
+ ''' + )) + self.assertContentStateEqual(result, { + 'entityMap': { + '0': { + 'mutability': 'MUTABLE', 'type': 'DOCUMENT', + 'data': {} + } + }, + 'blocks': [ + { + 'inlineStyleRanges': [], 'text': 'a document link', 'depth': 0, 'type': 'unstyled', 'key': '00000', + 'entityRanges': [{'offset': 2, 'length': 8, 'key': 0}] + }, + ] + })