removeElementsByAttr.js 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. 'use strict';
  2. const { detachNodeFromParent } = require('../lib/xast.js');
  3. exports.name = 'removeElementsByAttr';
  4. exports.type = 'visitor';
  5. exports.active = false;
  6. exports.description =
  7. 'removes arbitrary elements by ID or className (disabled by default)';
  8. /**
  9. * Remove arbitrary SVG elements by ID or className.
  10. *
  11. * @example id
  12. * > single: remove element with ID of `elementID`
  13. * ---
  14. * removeElementsByAttr:
  15. * id: 'elementID'
  16. *
  17. * > list: remove multiple elements by ID
  18. * ---
  19. * removeElementsByAttr:
  20. * id:
  21. * - 'elementID'
  22. * - 'anotherID'
  23. *
  24. * @example class
  25. * > single: remove all elements with class of `elementClass`
  26. * ---
  27. * removeElementsByAttr:
  28. * class: 'elementClass'
  29. *
  30. * > list: remove all elements with class of `elementClass` or `anotherClass`
  31. * ---
  32. * removeElementsByAttr:
  33. * class:
  34. * - 'elementClass'
  35. * - 'anotherClass'
  36. *
  37. * @author Eli Dupuis (@elidupuis)
  38. *
  39. * @type {import('../lib/types').Plugin<{
  40. * id?: string | Array<string>,
  41. * class?: string | Array<string>
  42. * }>}
  43. */
  44. exports.fn = (root, params) => {
  45. const ids =
  46. params.id == null ? [] : Array.isArray(params.id) ? params.id : [params.id];
  47. const classes =
  48. params.class == null
  49. ? []
  50. : Array.isArray(params.class)
  51. ? params.class
  52. : [params.class];
  53. return {
  54. element: {
  55. enter: (node, parentNode) => {
  56. // remove element if it's `id` matches configured `id` params
  57. if (node.attributes.id != null && ids.length !== 0) {
  58. if (ids.includes(node.attributes.id)) {
  59. detachNodeFromParent(node, parentNode);
  60. }
  61. }
  62. // remove element if it's `class` contains any of the configured `class` params
  63. if (node.attributes.class && classes.length !== 0) {
  64. const classList = node.attributes.class.split(' ');
  65. for (const item of classes) {
  66. if (classList.includes(item)) {
  67. detachNodeFromParent(node, parentNode);
  68. break;
  69. }
  70. }
  71. }
  72. },
  73. },
  74. };
  75. };