From a89427dd8b58203fba8761ed06b300a9fca705a6 Mon Sep 17 00:00:00 2001 From: Shawn Erquhart Date: Thu, 28 Sep 2017 11:11:43 -0400 Subject: [PATCH] add editor rule to ensure plain text in code blocks --- .../MarkdownControl/VisualEditor/rules.js | 35 ++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/src/components/Widgets/Markdown/MarkdownControl/VisualEditor/rules.js b/src/components/Widgets/Markdown/MarkdownControl/VisualEditor/rules.js index 7d0aa68d..27cb8d3a 100644 --- a/src/components/Widgets/Markdown/MarkdownControl/VisualEditor/rules.js +++ b/src/components/Widgets/Markdown/MarkdownControl/VisualEditor/rules.js @@ -40,6 +40,39 @@ const shortcodesAtRoot = { }, }; -const rules = [ enforceNeverEmpty, shortcodesAtRoot ]; +/** + * Ensure that trailing shortcodes are followed by an empty paragraph. + */ +const noTrailingShortcodes = { + match: object => object.kind === 'document', + validate: doc => { + return doc.findDescendant(node => { + return node.type === 'shortcode' && doc.getBlocks().last().key === node.key; + }); + }, + normalize: (change, doc, node) => { + const text = Text.create(''); + const block = Block.create({ type: 'paragraph', nodes: [ text ] }); + return change.insertNodeByKey(doc.key, doc.get('nodes').size, block); + }, +}; + +/** + * Ensure that code blocks contain no marks. + */ +const codeBlocksContainPlainText = { + match: node => node.type === 'code', + validate: node => { + const invalidChild = node.getTexts().find(text => !text.getMarks().isEmpty()); + return invalidChild || null; + }, + normalize: (change, node, invalidChild) => { + invalidChild.getMarks().forEach(mark => { + change.removeMarkByKey(invalidChild.key, 0, invalidChild.get('characters').size, mark); + }); + }, +}; + +const rules = [ enforceNeverEmpty, shortcodesAtRoot, codeBlocksContainPlainText ]; export default rules;