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}] + }, + ] + })