diff options
| author | littleblack111 <littleblack11111@gmail.com> | 2026-05-18 23:10:59 +0800 |
|---|---|---|
| committer | littleblack111 <littleblack11111@gmail.com> | 2026-05-18 23:41:44 +0800 |
| commit | fc87c009806dcc98867f6b58efe29b042aa01dee (patch) | |
| tree | 8f59b3f4a5b66e9dfef2d40c8d318e258a521228 /node_modules/svgo/plugins/convertOneStopGradients.js | |
| parent | 3336b2356ee6152d9c6ae59bd9b87ccbc0958407 (diff) | |
node: updatemain
Diffstat (limited to 'node_modules/svgo/plugins/convertOneStopGradients.js')
| -rw-r--r-- | node_modules/svgo/plugins/convertOneStopGradients.js | 168 |
1 files changed, 0 insertions, 168 deletions
diff --git a/node_modules/svgo/plugins/convertOneStopGradients.js b/node_modules/svgo/plugins/convertOneStopGradients.js deleted file mode 100644 index 1cf0d66b..00000000 --- a/node_modules/svgo/plugins/convertOneStopGradients.js +++ /dev/null @@ -1,168 +0,0 @@ -'use strict'; - -/** - * @typedef {import('../lib/types').XastElement} XastElement - * @typedef {import('../lib/types').XastParent} XastParent - */ - -const { attrsGroupsDefaults, colorsProps } = require('./_collections'); -const { - detachNodeFromParent, - querySelectorAll, - querySelector, -} = require('../lib/xast'); -const { computeStyle, collectStylesheet } = require('../lib/style'); - -exports.name = 'convertOneStopGradients'; -exports.description = - 'converts one-stop (single color) gradients to a plain color'; - -/** - * Converts one-stop (single color) gradients to a plain color. - * - * @author Seth Falco <seth@falco.fun> - * @type {import('./plugins-types').Plugin<'convertOneStopGradients'>} - * @see https://developer.mozilla.org/docs/Web/SVG/Element/linearGradient - * @see https://developer.mozilla.org/docs/Web/SVG/Element/radialGradient - */ -exports.fn = (root) => { - const stylesheet = collectStylesheet(root); - - /** - * Parent defs that had gradients elements removed from them. - * - * @type {Set<XastElement>} - */ - const effectedDefs = new Set(); - - /** - * @type {Map<XastElement, XastParent>} - */ - const allDefs = new Map(); - - /** - * @type {Map<XastElement, XastParent>} - */ - const gradientsToDetach = new Map(); - - /** Number of references to the xlink:href attribute. */ - let xlinkHrefCount = 0; - - return { - element: { - enter: (node, parentNode) => { - if (node.attributes['xlink:href'] != null) { - xlinkHrefCount++; - } - - if (node.name === 'defs') { - allDefs.set(node, parentNode); - return; - } - - if (node.name !== 'linearGradient' && node.name !== 'radialGradient') { - return; - } - - const stops = node.children.filter((child) => { - return child.type === 'element' && child.name === 'stop'; - }); - - const href = node.attributes['xlink:href'] || node.attributes['href']; - let effectiveNode = - stops.length === 0 && href != null && href.startsWith('#') - ? querySelector(root, href) - : node; - - if (effectiveNode == null || effectiveNode.type !== 'element') { - gradientsToDetach.set(node, parentNode); - return; - } - - const effectiveStops = effectiveNode.children.filter((child) => { - return child.type === 'element' && child.name === 'stop'; - }); - - if ( - effectiveStops.length !== 1 || - effectiveStops[0].type !== 'element' - ) { - return; - } - - if (parentNode.type === 'element' && parentNode.name === 'defs') { - effectedDefs.add(parentNode); - } - - gradientsToDetach.set(node, parentNode); - - let color; - const style = computeStyle(stylesheet, effectiveStops[0])['stop-color']; - if (style != null && style.type === 'static') { - color = style.value; - } - - const selectorVal = `url(#${node.attributes.id})`; - - const selector = [...colorsProps] - .map((attr) => `[${attr}="${selectorVal}"]`) - .join(','); - const elements = querySelectorAll(root, selector); - for (const element of elements) { - if (element.type !== 'element') { - continue; - } - - for (const attr of colorsProps) { - if (element.attributes[attr] !== selectorVal) { - continue; - } - - if (color != null) { - element.attributes[attr] = color; - } else { - delete element.attributes[attr]; - } - } - } - - const styledElements = querySelectorAll( - root, - `[style*=${selectorVal}]`, - ); - for (const element of styledElements) { - if (element.type !== 'element') { - continue; - } - - element.attributes.style = element.attributes.style.replace( - selectorVal, - color || attrsGroupsDefaults.presentation['stop-color'], - ); - } - }, - - exit: (node) => { - if (node.name === 'svg') { - for (const [gradient, parent] of gradientsToDetach.entries()) { - if (gradient.attributes['xlink:href'] != null) { - xlinkHrefCount--; - } - - detachNodeFromParent(gradient, parent); - } - - if (xlinkHrefCount === 0) { - delete node.attributes['xmlns:xlink']; - } - - for (const [defs, parent] of allDefs.entries()) { - if (effectedDefs.has(defs) && defs.children.length === 0) { - detachNodeFromParent(defs, parent); - } - } - } - }, - }, - }; -}; |
