removeEditorsNSData.js 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. 'use strict';
  2. const { detachNodeFromParent } = require('../lib/xast.js');
  3. const { editorNamespaces } = require('./_collections.js');
  4. exports.type = 'visitor';
  5. exports.name = 'removeEditorsNSData';
  6. exports.active = true;
  7. exports.description = 'removes editors namespaces, elements and attributes';
  8. /**
  9. * Remove editors namespaces, elements and attributes.
  10. *
  11. * @example
  12. * <svg xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd">
  13. * <sodipodi:namedview/>
  14. * <path sodipodi:nodetypes="cccc"/>
  15. *
  16. * @author Kir Belevich
  17. *
  18. * @type {import('../lib/types').Plugin<{
  19. * additionalNamespaces?: Array<string>
  20. * }>}
  21. */
  22. exports.fn = (_root, params) => {
  23. let namespaces = editorNamespaces;
  24. if (Array.isArray(params.additionalNamespaces)) {
  25. namespaces = [...editorNamespaces, ...params.additionalNamespaces];
  26. }
  27. /**
  28. * @type {Array<string>}
  29. */
  30. const prefixes = [];
  31. return {
  32. element: {
  33. enter: (node, parentNode) => {
  34. // collect namespace aliases from svg element
  35. if (node.name === 'svg') {
  36. for (const [name, value] of Object.entries(node.attributes)) {
  37. if (name.startsWith('xmlns:') && namespaces.includes(value)) {
  38. prefixes.push(name.slice('xmlns:'.length));
  39. // <svg xmlns:sodipodi="">
  40. delete node.attributes[name];
  41. }
  42. }
  43. }
  44. // remove editor attributes, for example
  45. // <* sodipodi:*="">
  46. for (const name of Object.keys(node.attributes)) {
  47. if (name.includes(':')) {
  48. const [prefix] = name.split(':');
  49. if (prefixes.includes(prefix)) {
  50. delete node.attributes[name];
  51. }
  52. }
  53. }
  54. // remove editor elements, for example
  55. // <sodipodi:*>
  56. if (node.name.includes(':')) {
  57. const [prefix] = node.name.split(':');
  58. if (prefixes.includes(prefix)) {
  59. detachNodeFromParent(node, parentNode);
  60. }
  61. }
  62. },
  63. },
  64. };
  65. };