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.
87 lines
1.8 KiB
87 lines
1.8 KiB
'use strict'; |
|
|
|
exports.name = 'addClassesToSVGElement'; |
|
exports.type = 'visitor'; |
|
exports.active = false; |
|
exports.description = 'adds classnames to an outer <svg> element'; |
|
|
|
var ENOCLS = `Error in plugin "addClassesToSVGElement": absent parameters. |
|
It should have a list of classes in "classNames" or one "className". |
|
Config example: |
|
|
|
plugins: [ |
|
{ |
|
name: "addClassesToSVGElement", |
|
params: { |
|
className: "mySvg" |
|
} |
|
} |
|
] |
|
|
|
plugins: [ |
|
{ |
|
name: "addClassesToSVGElement", |
|
params: { |
|
classNames: ["mySvg", "size-big"] |
|
} |
|
} |
|
] |
|
`; |
|
|
|
/** |
|
* Add classnames to an outer <svg> element. Example config: |
|
* |
|
* plugins: [ |
|
* { |
|
* name: "addClassesToSVGElement", |
|
* params: { |
|
* className: "mySvg" |
|
* } |
|
* } |
|
* ] |
|
* |
|
* plugins: [ |
|
* { |
|
* name: "addClassesToSVGElement", |
|
* params: { |
|
* classNames: ["mySvg", "size-big"] |
|
* } |
|
* } |
|
* ] |
|
* |
|
* @author April Arcus |
|
* |
|
* @type {import('../lib/types').Plugin<{ |
|
* className?: string, |
|
* classNames?: Array<string> |
|
* }>} |
|
*/ |
|
exports.fn = (root, params) => { |
|
if ( |
|
!(Array.isArray(params.classNames) && params.classNames.some(String)) && |
|
!params.className |
|
) { |
|
console.error(ENOCLS); |
|
return null; |
|
} |
|
const classNames = params.classNames || [params.className]; |
|
return { |
|
element: { |
|
enter: (node, parentNode) => { |
|
if (node.name === 'svg' && parentNode.type === 'root') { |
|
const classList = new Set( |
|
node.attributes.class == null |
|
? null |
|
: node.attributes.class.split(' ') |
|
); |
|
for (const className of classNames) { |
|
if (className != null) { |
|
classList.add(className); |
|
} |
|
} |
|
node.attributes.class = Array.from(classList).join(' '); |
|
} |
|
}, |
|
}, |
|
}; |
|
};
|
|
|