addClassesToSVGElement.js 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. 'use strict';
  2. exports.name = 'addClassesToSVGElement';
  3. exports.type = 'visitor';
  4. exports.active = false;
  5. exports.description = 'adds classnames to an outer <svg> element';
  6. var ENOCLS = `Error in plugin "addClassesToSVGElement": absent parameters.
  7. It should have a list of classes in "classNames" or one "className".
  8. Config example:
  9. plugins: [
  10. {
  11. name: "addClassesToSVGElement",
  12. params: {
  13. className: "mySvg"
  14. }
  15. }
  16. ]
  17. plugins: [
  18. {
  19. name: "addClassesToSVGElement",
  20. params: {
  21. classNames: ["mySvg", "size-big"]
  22. }
  23. }
  24. ]
  25. `;
  26. /**
  27. * Add classnames to an outer <svg> element. Example config:
  28. *
  29. * plugins: [
  30. * {
  31. * name: "addClassesToSVGElement",
  32. * params: {
  33. * className: "mySvg"
  34. * }
  35. * }
  36. * ]
  37. *
  38. * plugins: [
  39. * {
  40. * name: "addClassesToSVGElement",
  41. * params: {
  42. * classNames: ["mySvg", "size-big"]
  43. * }
  44. * }
  45. * ]
  46. *
  47. * @author April Arcus
  48. *
  49. * @type {import('../lib/types').Plugin<{
  50. * className?: string,
  51. * classNames?: Array<string>
  52. * }>}
  53. */
  54. exports.fn = (root, params) => {
  55. if (
  56. !(Array.isArray(params.classNames) && params.classNames.some(String)) &&
  57. !params.className
  58. ) {
  59. console.error(ENOCLS);
  60. return null;
  61. }
  62. const classNames = params.classNames || [params.className];
  63. return {
  64. element: {
  65. enter: (node, parentNode) => {
  66. if (node.name === 'svg' && parentNode.type === 'root') {
  67. const classList = new Set(
  68. node.attributes.class == null
  69. ? null
  70. : node.attributes.class.split(' ')
  71. );
  72. for (const className of classNames) {
  73. if (className != null) {
  74. classList.add(className);
  75. }
  76. }
  77. node.attributes.class = Array.from(classList).join(' ');
  78. }
  79. },
  80. },
  81. };
  82. };