From 65e1ced04c75ce6d7983cd1a02b7fcdbbeb67a66 Mon Sep 17 00:00:00 2001 From: thecodrr Date: Sat, 20 Nov 2021 12:26:39 +0500 Subject: [PATCH] feat: add improved dom filtering logic --- .../tinymce-plugins/contenthandler/filters.js | 24 +++++++++++++++++++ .../tinymce-plugins/contenthandler/index.js | 14 ++++++----- 2 files changed, 32 insertions(+), 6 deletions(-) create mode 100644 packages/tinymce-plugins/contenthandler/filters.js diff --git a/packages/tinymce-plugins/contenthandler/filters.js b/packages/tinymce-plugins/contenthandler/filters.js new file mode 100644 index 000000000..202606923 --- /dev/null +++ b/packages/tinymce-plugins/contenthandler/filters.js @@ -0,0 +1,24 @@ +const ATTRIBUTE_DELETE_FILTERS = [ + "[data-mce-selected]", + "[data-mce-src]", + "[data-mce-style]", + "[data-mce-type]", +]; +const ELEMENT_DELETE_FILTERS = ["[data-mce-bogus]", "[data-mce-bookmark]"]; +const ELEMENT_MODIFY_FILTERS = ["img[src]"]; + +export const QUERY = [ + ...ATTRIBUTE_DELETE_FILTERS, + ...ELEMENT_DELETE_FILTERS, + ...ELEMENT_MODIFY_FILTERS, +].join(","); + +export const ATTRIBUTES = { + strip: [ + "data-mce-selected", + "data-mce-src", + "data-mce-style", + "data-mce-type", + ], + elementDelete: ["data-mce-bogus", "data-mce-bookmark"], +}; diff --git a/packages/tinymce-plugins/contenthandler/index.js b/packages/tinymce-plugins/contenthandler/index.js index 7eadcf0ac..9b54e9f38 100644 --- a/packages/tinymce-plugins/contenthandler/index.js +++ b/packages/tinymce-plugins/contenthandler/index.js @@ -1,4 +1,5 @@ const { addPluginToPluginManager } = require("../utils"); +const { QUERY, ATTRIBUTES } = require("./filters"); function register(editor) { /** @@ -10,9 +11,7 @@ function register(editor) { editor.getHTML = async function () { const html = editor.getBody().innerHTML; const document = new DOMParser().parseFromString(html, "text/html"); - const elements = document.querySelectorAll( - "img[src],[data-mce-bogus],[data-mce-selected]" - ); + const elements = document.querySelectorAll(QUERY); for (let element of elements) { switch (element.nodeName) { case "IMG": { @@ -28,9 +27,12 @@ function register(editor) { image.src = datauri; } default: { - if (element.hasAttribute("data-mce-bogus")) element.remove(); - else if (element.hasAttribute("data-mce-selected")) { - element.removeAttribute("data-mce-selected"); + for (let attr of element.attributes) { + if (ATTRIBUTES.strip.indexOf(attr.name) > -1) + element.removeAttribute(attr.name); + else if (ATTRIBUTES.elementDelete.indexOf(attr.name) > -1) { + element.remove(); + } } } }