'use strict'; const { detachNodeFromParent } = require('../lib/xast.js'); const { editorNamespaces } = require('./_collections.js'); exports.type = 'visitor'; exports.name = 'removeEditorsNSData'; exports.active = true; exports.description = 'removes editors namespaces, elements and attributes'; /** * Remove editors namespaces, elements and attributes. * * @example * * * * * @author Kir Belevich * * @type {import('../lib/types').Plugin<{ * additionalNamespaces?: Array * }>} */ exports.fn = (_root, params) => { let namespaces = editorNamespaces; if (Array.isArray(params.additionalNamespaces)) { namespaces = [...editorNamespaces, ...params.additionalNamespaces]; } /** * @type {Array} */ const prefixes = []; return { element: { enter: (node, parentNode) => { // collect namespace aliases from svg element if (node.name === 'svg') { for (const [name, value] of Object.entries(node.attributes)) { if (name.startsWith('xmlns:') && namespaces.includes(value)) { prefixes.push(name.slice('xmlns:'.length)); // delete node.attributes[name]; } } } // remove editor attributes, for example // <* sodipodi:*=""> for (const name of Object.keys(node.attributes)) { if (name.includes(':')) { const [prefix] = name.split(':'); if (prefixes.includes(prefix)) { delete node.attributes[name]; } } } // remove editor elements, for example // if (node.name.includes(':')) { const [prefix] = node.name.split(':'); if (prefixes.includes(prefix)) { detachNodeFromParent(node, parentNode); } } }, }, }; };