You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
1.9 KiB
64 lines
1.9 KiB
'use strict'; |
|
|
|
const { detachNodeFromParent } = require('../lib/xast.js'); |
|
const { editorNamespaces } = require('./_collections.js'); |
|
|
|
exports.name = 'removeEditorsNSData'; |
|
exports.description = 'removes editors namespaces, elements and attributes'; |
|
|
|
/** |
|
* Remove editors namespaces, elements and attributes. |
|
* |
|
* @example |
|
* <svg xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"> |
|
* <sodipodi:namedview/> |
|
* <path sodipodi:nodetypes="cccc"/> |
|
* |
|
* @author Kir Belevich |
|
* |
|
* @type {import('./plugins-types').Plugin<'removeEditorsNSData'>} |
|
*/ |
|
exports.fn = (_root, params) => { |
|
let namespaces = editorNamespaces; |
|
if (Array.isArray(params.additionalNamespaces)) { |
|
namespaces = [...editorNamespaces, ...params.additionalNamespaces]; |
|
} |
|
/** |
|
* @type {Array<string>} |
|
*/ |
|
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)); |
|
// <svg xmlns:sodipodi=""> |
|
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 |
|
// <sodipodi:*> |
|
if (node.name.includes(':')) { |
|
const [prefix] = node.name.split(':'); |
|
if (prefixes.includes(prefix)) { |
|
detachNodeFromParent(node, parentNode); |
|
} |
|
} |
|
}, |
|
}, |
|
}; |
|
};
|
|
|