From fc87c009806dcc98867f6b58efe29b042aa01dee Mon Sep 17 00:00:00 2001 From: littleblack111 Date: Mon, 18 May 2026 23:10:59 +0800 Subject: node: update --- node_modules/svgo/plugins/_collections.js | 2339 -------------------- node_modules/svgo/plugins/_path.js | 815 ------- node_modules/svgo/plugins/_transforms.js | 410 ---- .../svgo/plugins/addAttributesToSVGElement.js | 82 - .../svgo/plugins/addClassesToSVGElement.js | 82 - node_modules/svgo/plugins/applyTransforms.js | 388 ---- node_modules/svgo/plugins/cleanupAttrs.js | 49 - .../svgo/plugins/cleanupEnableBackground.js | 165 -- node_modules/svgo/plugins/cleanupIds.js | 265 --- node_modules/svgo/plugins/cleanupListOfValues.js | 147 -- node_modules/svgo/plugins/cleanupNumericValues.js | 106 - node_modules/svgo/plugins/collapseGroups.js | 134 -- node_modules/svgo/plugins/convertColors.js | 144 -- .../svgo/plugins/convertEllipseToCircle.js | 37 - .../svgo/plugins/convertOneStopGradients.js | 168 -- node_modules/svgo/plugins/convertPathData.js | 1284 ----------- node_modules/svgo/plugins/convertShapeToPath.js | 170 -- node_modules/svgo/plugins/convertStyleToAttrs.js | 136 -- node_modules/svgo/plugins/convertTransform.js | 418 ---- node_modules/svgo/plugins/inlineStyles.js | 390 ---- node_modules/svgo/plugins/mergePaths.js | 148 -- node_modules/svgo/plugins/mergeStyles.js | 98 - node_modules/svgo/plugins/minifyStyles.js | 141 -- node_modules/svgo/plugins/moveElemsAttrsToGroup.js | 128 -- node_modules/svgo/plugins/moveGroupAttrsToElems.js | 65 - node_modules/svgo/plugins/plugins-types.d.ts | 291 --- node_modules/svgo/plugins/prefixIds.js | 268 --- node_modules/svgo/plugins/preset-default.js | 82 - .../svgo/plugins/removeAttributesBySelector.js | 97 - node_modules/svgo/plugins/removeAttrs.js | 151 -- node_modules/svgo/plugins/removeComments.js | 51 - node_modules/svgo/plugins/removeDesc.js | 39 - node_modules/svgo/plugins/removeDimensions.js | 43 - node_modules/svgo/plugins/removeDoctype.js | 40 - node_modules/svgo/plugins/removeEditorsNSData.js | 64 - node_modules/svgo/plugins/removeElementsByAttr.js | 73 - node_modules/svgo/plugins/removeEmptyAttrs.js | 31 - node_modules/svgo/plugins/removeEmptyContainers.js | 59 - node_modules/svgo/plugins/removeEmptyText.js | 51 - node_modules/svgo/plugins/removeHiddenElems.js | 440 ---- node_modules/svgo/plugins/removeMetadata.js | 27 - .../svgo/plugins/removeNonInheritableGroupAttrs.js | 38 - node_modules/svgo/plugins/removeOffCanvasPaths.js | 136 -- node_modules/svgo/plugins/removeRasterImages.js | 31 - node_modules/svgo/plugins/removeScriptElement.js | 70 - node_modules/svgo/plugins/removeStyleElement.js | 27 - node_modules/svgo/plugins/removeTitle.js | 27 - .../svgo/plugins/removeUnknownsAndDefaults.js | 212 -- node_modules/svgo/plugins/removeUnusedNS.js | 59 - node_modules/svgo/plugins/removeUselessDefs.js | 65 - .../svgo/plugins/removeUselessStrokeAndFill.js | 139 -- node_modules/svgo/plugins/removeViewBox.js | 49 - node_modules/svgo/plugins/removeXMLNS.js | 29 - node_modules/svgo/plugins/removeXMLProcInst.js | 28 - node_modules/svgo/plugins/removeXlink.js | 226 -- node_modules/svgo/plugins/reusePaths.js | 195 -- node_modules/svgo/plugins/sortAttrs.js | 108 - node_modules/svgo/plugins/sortDefsChildren.js | 58 - 58 files changed, 11613 deletions(-) delete mode 100644 node_modules/svgo/plugins/_collections.js delete mode 100644 node_modules/svgo/plugins/_path.js delete mode 100644 node_modules/svgo/plugins/_transforms.js delete mode 100644 node_modules/svgo/plugins/addAttributesToSVGElement.js delete mode 100644 node_modules/svgo/plugins/addClassesToSVGElement.js delete mode 100644 node_modules/svgo/plugins/applyTransforms.js delete mode 100644 node_modules/svgo/plugins/cleanupAttrs.js delete mode 100644 node_modules/svgo/plugins/cleanupEnableBackground.js delete mode 100644 node_modules/svgo/plugins/cleanupIds.js delete mode 100644 node_modules/svgo/plugins/cleanupListOfValues.js delete mode 100644 node_modules/svgo/plugins/cleanupNumericValues.js delete mode 100644 node_modules/svgo/plugins/collapseGroups.js delete mode 100644 node_modules/svgo/plugins/convertColors.js delete mode 100644 node_modules/svgo/plugins/convertEllipseToCircle.js delete mode 100644 node_modules/svgo/plugins/convertOneStopGradients.js delete mode 100644 node_modules/svgo/plugins/convertPathData.js delete mode 100644 node_modules/svgo/plugins/convertShapeToPath.js delete mode 100644 node_modules/svgo/plugins/convertStyleToAttrs.js delete mode 100644 node_modules/svgo/plugins/convertTransform.js delete mode 100644 node_modules/svgo/plugins/inlineStyles.js delete mode 100644 node_modules/svgo/plugins/mergePaths.js delete mode 100644 node_modules/svgo/plugins/mergeStyles.js delete mode 100644 node_modules/svgo/plugins/minifyStyles.js delete mode 100644 node_modules/svgo/plugins/moveElemsAttrsToGroup.js delete mode 100644 node_modules/svgo/plugins/moveGroupAttrsToElems.js delete mode 100644 node_modules/svgo/plugins/plugins-types.d.ts delete mode 100644 node_modules/svgo/plugins/prefixIds.js delete mode 100644 node_modules/svgo/plugins/preset-default.js delete mode 100644 node_modules/svgo/plugins/removeAttributesBySelector.js delete mode 100644 node_modules/svgo/plugins/removeAttrs.js delete mode 100644 node_modules/svgo/plugins/removeComments.js delete mode 100644 node_modules/svgo/plugins/removeDesc.js delete mode 100644 node_modules/svgo/plugins/removeDimensions.js delete mode 100644 node_modules/svgo/plugins/removeDoctype.js delete mode 100644 node_modules/svgo/plugins/removeEditorsNSData.js delete mode 100644 node_modules/svgo/plugins/removeElementsByAttr.js delete mode 100644 node_modules/svgo/plugins/removeEmptyAttrs.js delete mode 100644 node_modules/svgo/plugins/removeEmptyContainers.js delete mode 100644 node_modules/svgo/plugins/removeEmptyText.js delete mode 100644 node_modules/svgo/plugins/removeHiddenElems.js delete mode 100644 node_modules/svgo/plugins/removeMetadata.js delete mode 100644 node_modules/svgo/plugins/removeNonInheritableGroupAttrs.js delete mode 100644 node_modules/svgo/plugins/removeOffCanvasPaths.js delete mode 100644 node_modules/svgo/plugins/removeRasterImages.js delete mode 100644 node_modules/svgo/plugins/removeScriptElement.js delete mode 100644 node_modules/svgo/plugins/removeStyleElement.js delete mode 100644 node_modules/svgo/plugins/removeTitle.js delete mode 100644 node_modules/svgo/plugins/removeUnknownsAndDefaults.js delete mode 100644 node_modules/svgo/plugins/removeUnusedNS.js delete mode 100644 node_modules/svgo/plugins/removeUselessDefs.js delete mode 100644 node_modules/svgo/plugins/removeUselessStrokeAndFill.js delete mode 100644 node_modules/svgo/plugins/removeViewBox.js delete mode 100644 node_modules/svgo/plugins/removeXMLNS.js delete mode 100644 node_modules/svgo/plugins/removeXMLProcInst.js delete mode 100644 node_modules/svgo/plugins/removeXlink.js delete mode 100644 node_modules/svgo/plugins/reusePaths.js delete mode 100644 node_modules/svgo/plugins/sortAttrs.js delete mode 100644 node_modules/svgo/plugins/sortDefsChildren.js (limited to 'node_modules/svgo/plugins') diff --git a/node_modules/svgo/plugins/_collections.js b/node_modules/svgo/plugins/_collections.js deleted file mode 100644 index 6f11b136..00000000 --- a/node_modules/svgo/plugins/_collections.js +++ /dev/null @@ -1,2339 +0,0 @@ -'use strict'; - -// https://www.w3.org/TR/SVG11/intro.html#Definitions - -/** - * @type {Record>} - */ -exports.elemsGroups = { - animation: new Set([ - 'animate', - 'animateColor', - 'animateMotion', - 'animateTransform', - 'set', - ]), - descriptive: new Set(['desc', 'metadata', 'title']), - shape: new Set([ - 'circle', - 'ellipse', - 'line', - 'path', - 'polygon', - 'polyline', - 'rect', - ]), - structural: new Set(['defs', 'g', 'svg', 'symbol', 'use']), - paintServer: new Set([ - 'hatch', - 'linearGradient', - 'meshGradient', - 'pattern', - 'radialGradient', - 'solidColor', - ]), - nonRendering: new Set([ - 'clipPath', - 'filter', - 'linearGradient', - 'marker', - 'mask', - 'pattern', - 'radialGradient', - 'solidColor', - 'symbol', - ]), - container: new Set([ - 'a', - 'defs', - 'foreignObject', - 'g', - 'marker', - 'mask', - 'missing-glyph', - 'pattern', - 'svg', - 'switch', - 'symbol', - ]), - textContent: new Set([ - 'altGlyph', - 'altGlyphDef', - 'altGlyphItem', - 'glyph', - 'glyphRef', - 'text', - 'textPath', - 'tref', - 'tspan', - ]), - textContentChild: new Set(['altGlyph', 'textPath', 'tref', 'tspan']), - lightSource: new Set([ - 'feDiffuseLighting', - 'feDistantLight', - 'fePointLight', - 'feSpecularLighting', - 'feSpotLight', - ]), - filterPrimitive: new Set([ - 'feBlend', - 'feColorMatrix', - 'feComponentTransfer', - 'feComposite', - 'feConvolveMatrix', - 'feDiffuseLighting', - 'feDisplacementMap', - 'feDropShadow', - 'feFlood', - 'feFuncA', - 'feFuncB', - 'feFuncG', - 'feFuncR', - 'feGaussianBlur', - 'feImage', - 'feMerge', - 'feMergeNode', - 'feMorphology', - 'feOffset', - 'feSpecularLighting', - 'feTile', - 'feTurbulence', - ]), -}; - -/** - * Elements where adding or removing whitespace may effect rendering, metadata, - * or semantic meaning. - * - * @see https://developer.mozilla.org/docs/Web/HTML/Element/pre - */ -exports.textElems = new Set([ - ...exports.elemsGroups.textContent, - 'pre', - 'title', -]); - -exports.pathElems = new Set(['glyph', 'missing-glyph', 'path']); - -/** - * @type {Record>} - * @see https://www.w3.org/TR/SVG11/intro.html#Definitions - */ -exports.attrsGroups = { - animationAddition: new Set(['additive', 'accumulate']), - animationAttributeTarget: new Set(['attributeType', 'attributeName']), - animationEvent: new Set(['onbegin', 'onend', 'onrepeat', 'onload']), - animationTiming: new Set([ - 'begin', - 'dur', - 'end', - 'fill', - 'max', - 'min', - 'repeatCount', - 'repeatDur', - 'restart', - ]), - animationValue: new Set([ - 'by', - 'calcMode', - 'from', - 'keySplines', - 'keyTimes', - 'to', - 'values', - ]), - conditionalProcessing: new Set([ - 'requiredExtensions', - 'requiredFeatures', - 'systemLanguage', - ]), - core: new Set(['id', 'tabindex', 'xml:base', 'xml:lang', 'xml:space']), - graphicalEvent: new Set([ - 'onactivate', - 'onclick', - 'onfocusin', - 'onfocusout', - 'onload', - 'onmousedown', - 'onmousemove', - 'onmouseout', - 'onmouseover', - 'onmouseup', - ]), - presentation: new Set([ - 'alignment-baseline', - 'baseline-shift', - 'clip-path', - 'clip-rule', - 'clip', - 'color-interpolation-filters', - 'color-interpolation', - 'color-profile', - 'color-rendering', - 'color', - 'cursor', - 'direction', - 'display', - 'dominant-baseline', - 'enable-background', - 'fill-opacity', - 'fill-rule', - 'fill', - 'filter', - 'flood-color', - 'flood-opacity', - 'font-family', - 'font-size-adjust', - 'font-size', - 'font-stretch', - 'font-style', - 'font-variant', - 'font-weight', - 'glyph-orientation-horizontal', - 'glyph-orientation-vertical', - 'image-rendering', - 'letter-spacing', - 'lighting-color', - 'marker-end', - 'marker-mid', - 'marker-start', - 'mask', - 'opacity', - 'overflow', - 'paint-order', - 'pointer-events', - 'shape-rendering', - 'stop-color', - 'stop-opacity', - 'stroke-dasharray', - 'stroke-dashoffset', - 'stroke-linecap', - 'stroke-linejoin', - 'stroke-miterlimit', - 'stroke-opacity', - 'stroke-width', - 'stroke', - 'text-anchor', - 'text-decoration', - 'text-overflow', - 'text-rendering', - 'transform-origin', - 'transform', - 'unicode-bidi', - 'vector-effect', - 'visibility', - 'word-spacing', - 'writing-mode', - ]), - xlink: new Set([ - 'xlink:actuate', - 'xlink:arcrole', - 'xlink:href', - 'xlink:role', - 'xlink:show', - 'xlink:title', - 'xlink:type', - ]), - documentEvent: new Set([ - 'onabort', - 'onerror', - 'onresize', - 'onscroll', - 'onunload', - 'onzoom', - ]), - documentElementEvent: new Set(['oncopy', 'oncut', 'onpaste']), - globalEvent: new Set([ - 'oncancel', - 'oncanplay', - 'oncanplaythrough', - 'onchange', - 'onclick', - 'onclose', - 'oncuechange', - 'ondblclick', - 'ondrag', - 'ondragend', - 'ondragenter', - 'ondragleave', - 'ondragover', - 'ondragstart', - 'ondrop', - 'ondurationchange', - 'onemptied', - 'onended', - 'onerror', - 'onfocus', - 'oninput', - 'oninvalid', - 'onkeydown', - 'onkeypress', - 'onkeyup', - 'onload', - 'onloadeddata', - 'onloadedmetadata', - 'onloadstart', - 'onmousedown', - 'onmouseenter', - 'onmouseleave', - 'onmousemove', - 'onmouseout', - 'onmouseover', - 'onmouseup', - 'onmousewheel', - 'onpause', - 'onplay', - 'onplaying', - 'onprogress', - 'onratechange', - 'onreset', - 'onresize', - 'onscroll', - 'onseeked', - 'onseeking', - 'onselect', - 'onshow', - 'onstalled', - 'onsubmit', - 'onsuspend', - 'ontimeupdate', - 'ontoggle', - 'onvolumechange', - 'onwaiting', - ]), - filterPrimitive: new Set(['x', 'y', 'width', 'height', 'result']), - transferFunction: new Set([ - 'amplitude', - 'exponent', - 'intercept', - 'offset', - 'slope', - 'tableValues', - 'type', - ]), -}; - -/** - * @type {Record>} - */ -exports.attrsGroupsDefaults = { - core: { 'xml:space': 'default' }, - presentation: { - clip: 'auto', - 'clip-path': 'none', - 'clip-rule': 'nonzero', - mask: 'none', - opacity: '1', - 'stop-color': '#000', - 'stop-opacity': '1', - 'fill-opacity': '1', - 'fill-rule': 'nonzero', - fill: '#000', - stroke: 'none', - 'stroke-width': '1', - 'stroke-linecap': 'butt', - 'stroke-linejoin': 'miter', - 'stroke-miterlimit': '4', - 'stroke-dasharray': 'none', - 'stroke-dashoffset': '0', - 'stroke-opacity': '1', - 'paint-order': 'normal', - 'vector-effect': 'none', - display: 'inline', - visibility: 'visible', - 'marker-start': 'none', - 'marker-mid': 'none', - 'marker-end': 'none', - 'color-interpolation': 'sRGB', - 'color-interpolation-filters': 'linearRGB', - 'color-rendering': 'auto', - 'shape-rendering': 'auto', - 'text-rendering': 'auto', - 'image-rendering': 'auto', - 'font-style': 'normal', - 'font-variant': 'normal', - 'font-weight': 'normal', - 'font-stretch': 'normal', - 'font-size': 'medium', - 'font-size-adjust': 'none', - kerning: 'auto', - 'letter-spacing': 'normal', - 'word-spacing': 'normal', - 'text-decoration': 'none', - 'text-anchor': 'start', - 'text-overflow': 'clip', - 'writing-mode': 'lr-tb', - 'glyph-orientation-vertical': 'auto', - 'glyph-orientation-horizontal': '0deg', - direction: 'ltr', - 'unicode-bidi': 'normal', - 'dominant-baseline': 'auto', - 'alignment-baseline': 'baseline', - 'baseline-shift': 'baseline', - }, - transferFunction: { - slope: '1', - intercept: '0', - amplitude: '1', - exponent: '1', - offset: '0', - }, -}; - -/** - * @type {Record, - * attrs?: Set, - * defaults?: Record, - * contentGroups?: Set, - * content?: Set, - * }>} - * @see https://www.w3.org/TR/SVG11/eltindex.html - */ -exports.elems = { - a: { - attrsGroups: new Set([ - 'conditionalProcessing', - 'core', - 'graphicalEvent', - 'presentation', - 'xlink', - ]), - attrs: new Set([ - 'class', - 'externalResourcesRequired', - 'style', - 'target', - 'transform', - ]), - defaults: { - target: '_self', - }, - contentGroups: new Set([ - 'animation', - 'descriptive', - 'paintServer', - 'shape', - 'structural', - ]), - content: new Set([ - 'a', - 'altGlyphDef', - 'clipPath', - 'color-profile', - 'cursor', - 'filter', - 'font-face', - 'font', - 'foreignObject', - 'image', - 'marker', - 'mask', - 'pattern', - 'script', - 'style', - 'switch', - 'text', - 'view', - // not spec compliant - 'tspan', - ]), - }, - altGlyph: { - attrsGroups: new Set([ - 'conditionalProcessing', - 'core', - 'graphicalEvent', - 'presentation', - 'xlink', - ]), - attrs: new Set([ - 'class', - 'dx', - 'dy', - 'externalResourcesRequired', - 'format', - 'glyphRef', - 'rotate', - 'style', - 'x', - 'y', - ]), - }, - altGlyphDef: { - attrsGroups: new Set(['core']), - content: new Set(['glyphRef']), - }, - altGlyphItem: { - attrsGroups: new Set(['core']), - content: new Set(['glyphRef', 'altGlyphItem']), - }, - animate: { - attrsGroups: new Set([ - 'animationAddition', - 'animationAttributeTarget', - 'animationEvent', - 'animationTiming', - 'animationValue', - 'conditionalProcessing', - 'core', - 'presentation', - 'xlink', - ]), - attrs: new Set(['externalResourcesRequired']), - contentGroups: new Set(['descriptive']), - }, - animateColor: { - attrsGroups: new Set([ - 'animationAddition', - 'animationAttributeTarget', - 'animationEvent', - 'animationTiming', - 'animationValue', - 'conditionalProcessing', - 'core', - 'presentation', - 'xlink', - ]), - attrs: new Set(['externalResourcesRequired']), - contentGroups: new Set(['descriptive']), - }, - animateMotion: { - attrsGroups: new Set([ - 'animationAddition', - 'animationEvent', - 'animationTiming', - 'animationValue', - 'conditionalProcessing', - 'core', - 'xlink', - ]), - attrs: new Set([ - 'externalResourcesRequired', - 'keyPoints', - 'origin', - 'path', - 'rotate', - ]), - defaults: { - rotate: '0', - }, - contentGroups: new Set(['descriptive']), - content: new Set(['mpath']), - }, - animateTransform: { - attrsGroups: new Set([ - 'animationAddition', - 'animationAttributeTarget', - 'animationEvent', - 'animationTiming', - 'animationValue', - 'conditionalProcessing', - 'core', - 'xlink', - ]), - attrs: new Set(['externalResourcesRequired', 'type']), - contentGroups: new Set(['descriptive']), - }, - circle: { - attrsGroups: new Set([ - 'conditionalProcessing', - 'core', - 'graphicalEvent', - 'presentation', - ]), - attrs: new Set([ - 'class', - 'cx', - 'cy', - 'externalResourcesRequired', - 'r', - 'style', - 'transform', - ]), - defaults: { - cx: '0', - cy: '0', - }, - contentGroups: new Set(['animation', 'descriptive']), - }, - clipPath: { - attrsGroups: new Set(['conditionalProcessing', 'core', 'presentation']), - attrs: new Set([ - 'class', - 'clipPathUnits', - 'externalResourcesRequired', - 'style', - 'transform', - ]), - defaults: { - clipPathUnits: 'userSpaceOnUse', - }, - contentGroups: new Set(['animation', 'descriptive', 'shape']), - content: new Set(['text', 'use']), - }, - 'color-profile': { - attrsGroups: new Set(['core', 'xlink']), - attrs: new Set(['local', 'name', 'rendering-intent']), - defaults: { - name: 'sRGB', - 'rendering-intent': 'auto', - }, - contentGroups: new Set(['descriptive']), - }, - cursor: { - attrsGroups: new Set(['core', 'conditionalProcessing', 'xlink']), - attrs: new Set(['externalResourcesRequired', 'x', 'y']), - defaults: { - x: '0', - y: '0', - }, - contentGroups: new Set(['descriptive']), - }, - defs: { - attrsGroups: new Set([ - 'conditionalProcessing', - 'core', - 'graphicalEvent', - 'presentation', - ]), - attrs: new Set([ - 'class', - 'externalResourcesRequired', - 'style', - 'transform', - ]), - contentGroups: new Set([ - 'animation', - 'descriptive', - 'paintServer', - 'shape', - 'structural', - ]), - content: new Set([ - 'a', - 'altGlyphDef', - 'clipPath', - 'color-profile', - 'cursor', - 'filter', - 'font-face', - 'font', - 'foreignObject', - 'image', - 'marker', - 'mask', - 'pattern', - 'script', - 'style', - 'switch', - 'text', - 'view', - ]), - }, - desc: { - attrsGroups: new Set(['core']), - attrs: new Set(['class', 'style']), - }, - ellipse: { - attrsGroups: new Set([ - 'conditionalProcessing', - 'core', - 'graphicalEvent', - 'presentation', - ]), - attrs: new Set([ - 'class', - 'cx', - 'cy', - 'externalResourcesRequired', - 'rx', - 'ry', - 'style', - 'transform', - ]), - defaults: { - cx: '0', - cy: '0', - }, - contentGroups: new Set(['animation', 'descriptive']), - }, - feBlend: { - attrsGroups: new Set(['core', 'presentation', 'filterPrimitive']), - attrs: new Set([ - 'class', - 'style', - // TODO: in - 'If no value is provided and this is the first filter primitive, - // then this filter primitive will use SourceGraphic as its input' - 'in', - 'in2', - 'mode', - ]), - defaults: { - mode: 'normal', - }, - content: new Set(['animate', 'set']), - }, - feColorMatrix: { - attrsGroups: new Set(['core', 'presentation', 'filterPrimitive']), - attrs: new Set(['class', 'style', 'in', 'type', 'values']), - defaults: { - type: 'matrix', - }, - content: new Set(['animate', 'set']), - }, - feComponentTransfer: { - attrsGroups: new Set(['core', 'presentation', 'filterPrimitive']), - attrs: new Set(['class', 'style', 'in']), - content: new Set(['feFuncA', 'feFuncB', 'feFuncG', 'feFuncR']), - }, - feComposite: { - attrsGroups: new Set(['core', 'presentation', 'filterPrimitive']), - attrs: new Set([ - 'class', - 'in', - 'in2', - 'k1', - 'k2', - 'k3', - 'k4', - 'operator', - 'style', - ]), - defaults: { - operator: 'over', - k1: '0', - k2: '0', - k3: '0', - k4: '0', - }, - content: new Set(['animate', 'set']), - }, - feConvolveMatrix: { - attrsGroups: new Set(['core', 'presentation', 'filterPrimitive']), - attrs: new Set([ - 'class', - 'in', - 'kernelMatrix', - 'order', - 'style', - // TODO: divisor - 'The default value is the sum of all values in kernelMatrix, - // with the exception that if the sum is zero, then the divisor is set to 1' - 'bias', - 'divisor', - // TODO: targetX - 'By default, the convolution matrix is centered in X over each - // pixel of the input image (i.e., targetX = floor ( orderX / 2 ))' - 'edgeMode', - 'targetX', - 'targetY', - // TODO: kernelUnitLength - 'The first number is the value. The second number - // is the value. If the value is not specified, it defaults to the same value as ' - 'kernelUnitLength', - 'preserveAlpha', - ]), - defaults: { - order: '3', - bias: '0', - edgeMode: 'duplicate', - preserveAlpha: 'false', - }, - content: new Set(['animate', 'set']), - }, - feDiffuseLighting: { - attrsGroups: new Set(['core', 'presentation', 'filterPrimitive']), - attrs: new Set([ - 'class', - 'diffuseConstant', - 'in', - 'kernelUnitLength', - 'style', - 'surfaceScale', - ]), - defaults: { - surfaceScale: '1', - diffuseConstant: '1', - }, - contentGroups: new Set(['descriptive']), - content: new Set([ - // TODO: 'exactly one light source element, in any order' - 'feDistantLight', - 'fePointLight', - 'feSpotLight', - ]), - }, - feDisplacementMap: { - attrsGroups: new Set(['core', 'presentation', 'filterPrimitive']), - attrs: new Set([ - 'class', - 'in', - 'in2', - 'scale', - 'style', - 'xChannelSelector', - 'yChannelSelector', - ]), - defaults: { - scale: '0', - xChannelSelector: 'A', - yChannelSelector: 'A', - }, - content: new Set(['animate', 'set']), - }, - feDistantLight: { - attrsGroups: new Set(['core']), - attrs: new Set(['azimuth', 'elevation']), - defaults: { - azimuth: '0', - elevation: '0', - }, - content: new Set(['animate', 'set']), - }, - feFlood: { - attrsGroups: new Set(['core', 'presentation', 'filterPrimitive']), - attrs: new Set(['class', 'style']), - content: new Set(['animate', 'animateColor', 'set']), - }, - feFuncA: { - attrsGroups: new Set(['core', 'transferFunction']), - content: new Set(['set', 'animate']), - }, - feFuncB: { - attrsGroups: new Set(['core', 'transferFunction']), - content: new Set(['set', 'animate']), - }, - feFuncG: { - attrsGroups: new Set(['core', 'transferFunction']), - content: new Set(['set', 'animate']), - }, - feFuncR: { - attrsGroups: new Set(['core', 'transferFunction']), - content: new Set(['set', 'animate']), - }, - feGaussianBlur: { - attrsGroups: new Set(['core', 'presentation', 'filterPrimitive']), - attrs: new Set(['class', 'style', 'in', 'stdDeviation']), - defaults: { - stdDeviation: '0', - }, - content: new Set(['set', 'animate']), - }, - feImage: { - attrsGroups: new Set(['core', 'presentation', 'filterPrimitive', 'xlink']), - attrs: new Set([ - 'class', - 'externalResourcesRequired', - 'href', - 'preserveAspectRatio', - 'style', - 'xlink:href', - ]), - defaults: { - preserveAspectRatio: 'xMidYMid meet', - }, - content: new Set(['animate', 'animateTransform', 'set']), - }, - feMerge: { - attrsGroups: new Set(['core', 'presentation', 'filterPrimitive']), - attrs: new Set(['class', 'style']), - content: new Set(['feMergeNode']), - }, - feMergeNode: { - attrsGroups: new Set(['core']), - attrs: new Set(['in']), - content: new Set(['animate', 'set']), - }, - feMorphology: { - attrsGroups: new Set(['core', 'presentation', 'filterPrimitive']), - attrs: new Set(['class', 'style', 'in', 'operator', 'radius']), - defaults: { - operator: 'erode', - radius: '0', - }, - content: new Set(['animate', 'set']), - }, - feOffset: { - attrsGroups: new Set(['core', 'presentation', 'filterPrimitive']), - attrs: new Set(['class', 'style', 'in', 'dx', 'dy']), - defaults: { - dx: '0', - dy: '0', - }, - content: new Set(['animate', 'set']), - }, - fePointLight: { - attrsGroups: new Set(['core']), - attrs: new Set(['x', 'y', 'z']), - defaults: { - x: '0', - y: '0', - z: '0', - }, - content: new Set(['animate', 'set']), - }, - feSpecularLighting: { - attrsGroups: new Set(['core', 'presentation', 'filterPrimitive']), - attrs: new Set([ - 'class', - 'in', - 'kernelUnitLength', - 'specularConstant', - 'specularExponent', - 'style', - 'surfaceScale', - ]), - defaults: { - surfaceScale: '1', - specularConstant: '1', - specularExponent: '1', - }, - contentGroups: new Set([ - 'descriptive', - // TODO: exactly one 'light source element' - 'lightSource', - ]), - }, - feSpotLight: { - attrsGroups: new Set(['core']), - attrs: new Set([ - 'limitingConeAngle', - 'pointsAtX', - 'pointsAtY', - 'pointsAtZ', - 'specularExponent', - 'x', - 'y', - 'z', - ]), - defaults: { - x: '0', - y: '0', - z: '0', - pointsAtX: '0', - pointsAtY: '0', - pointsAtZ: '0', - specularExponent: '1', - }, - content: new Set(['animate', 'set']), - }, - feTile: { - attrsGroups: new Set(['core', 'presentation', 'filterPrimitive']), - attrs: new Set(['class', 'style', 'in']), - content: new Set(['animate', 'set']), - }, - feTurbulence: { - attrsGroups: new Set(['core', 'presentation', 'filterPrimitive']), - attrs: new Set([ - 'baseFrequency', - 'class', - 'numOctaves', - 'seed', - 'stitchTiles', - 'style', - 'type', - ]), - defaults: { - baseFrequency: '0', - numOctaves: '1', - seed: '0', - stitchTiles: 'noStitch', - type: 'turbulence', - }, - content: new Set(['animate', 'set']), - }, - filter: { - attrsGroups: new Set(['core', 'presentation', 'xlink']), - attrs: new Set([ - 'class', - 'externalResourcesRequired', - 'filterRes', - 'filterUnits', - 'height', - 'href', - 'primitiveUnits', - 'style', - 'width', - 'x', - 'xlink:href', - 'y', - ]), - defaults: { - primitiveUnits: 'userSpaceOnUse', - x: '-10%', - y: '-10%', - width: '120%', - height: '120%', - }, - contentGroups: new Set(['descriptive', 'filterPrimitive']), - content: new Set(['animate', 'set']), - }, - font: { - attrsGroups: new Set(['core', 'presentation']), - attrs: new Set([ - 'class', - 'externalResourcesRequired', - 'horiz-adv-x', - 'horiz-origin-x', - 'horiz-origin-y', - 'style', - 'vert-adv-y', - 'vert-origin-x', - 'vert-origin-y', - ]), - defaults: { - 'horiz-origin-x': '0', - 'horiz-origin-y': '0', - }, - contentGroups: new Set(['descriptive']), - content: new Set(['font-face', 'glyph', 'hkern', 'missing-glyph', 'vkern']), - }, - 'font-face': { - attrsGroups: new Set(['core']), - attrs: new Set([ - 'font-family', - 'font-style', - 'font-variant', - 'font-weight', - 'font-stretch', - 'font-size', - 'unicode-range', - 'units-per-em', - 'panose-1', - 'stemv', - 'stemh', - 'slope', - 'cap-height', - 'x-height', - 'accent-height', - 'ascent', - 'descent', - 'widths', - 'bbox', - 'ideographic', - 'alphabetic', - 'mathematical', - 'hanging', - 'v-ideographic', - 'v-alphabetic', - 'v-mathematical', - 'v-hanging', - 'underline-position', - 'underline-thickness', - 'strikethrough-position', - 'strikethrough-thickness', - 'overline-position', - 'overline-thickness', - ]), - defaults: { - 'font-style': 'all', - 'font-variant': 'normal', - 'font-weight': 'all', - 'font-stretch': 'normal', - 'unicode-range': 'U+0-10FFFF', - 'units-per-em': '1000', - 'panose-1': '0 0 0 0 0 0 0 0 0 0', - slope: '0', - }, - contentGroups: new Set(['descriptive']), - content: new Set([ - // TODO: "at most one 'font-face-src' element" - 'font-face-src', - ]), - }, - // TODO: empty content - 'font-face-format': { - attrsGroups: new Set(['core']), - attrs: new Set(['string']), - }, - 'font-face-name': { - attrsGroups: new Set(['core']), - attrs: new Set(['name']), - }, - 'font-face-src': { - attrsGroups: new Set(['core']), - content: new Set(['font-face-name', 'font-face-uri']), - }, - 'font-face-uri': { - attrsGroups: new Set(['core', 'xlink']), - attrs: new Set(['href', 'xlink:href']), - content: new Set(['font-face-format']), - }, - foreignObject: { - attrsGroups: new Set([ - 'conditionalProcessing', - 'core', - 'graphicalEvent', - 'presentation', - ]), - attrs: new Set([ - 'class', - 'externalResourcesRequired', - 'height', - 'style', - 'transform', - 'width', - 'x', - 'y', - ]), - defaults: { - x: '0', - y: '0', - }, - }, - g: { - attrsGroups: new Set([ - 'conditionalProcessing', - 'core', - 'graphicalEvent', - 'presentation', - ]), - attrs: new Set([ - 'class', - 'externalResourcesRequired', - 'style', - 'transform', - ]), - contentGroups: new Set([ - 'animation', - 'descriptive', - 'paintServer', - 'shape', - 'structural', - ]), - content: new Set([ - 'a', - 'altGlyphDef', - 'clipPath', - 'color-profile', - 'cursor', - 'filter', - 'font-face', - 'font', - 'foreignObject', - 'image', - 'marker', - 'mask', - 'pattern', - 'script', - 'style', - 'switch', - 'text', - 'view', - ]), - }, - glyph: { - attrsGroups: new Set(['core', 'presentation']), - attrs: new Set([ - 'arabic-form', - 'class', - 'd', - 'glyph-name', - 'horiz-adv-x', - 'lang', - 'orientation', - 'style', - 'unicode', - 'vert-adv-y', - 'vert-origin-x', - 'vert-origin-y', - ]), - defaults: { - 'arabic-form': 'initial', - }, - contentGroups: new Set([ - 'animation', - 'descriptive', - 'paintServer', - 'shape', - 'structural', - ]), - content: new Set([ - 'a', - 'altGlyphDef', - 'clipPath', - 'color-profile', - 'cursor', - 'filter', - 'font-face', - 'font', - 'foreignObject', - 'image', - 'marker', - 'mask', - 'pattern', - 'script', - 'style', - 'switch', - 'text', - 'view', - ]), - }, - glyphRef: { - attrsGroups: new Set(['core', 'presentation']), - attrs: new Set([ - 'class', - 'd', - 'horiz-adv-x', - 'style', - 'vert-adv-y', - 'vert-origin-x', - 'vert-origin-y', - ]), - contentGroups: new Set([ - 'animation', - 'descriptive', - 'paintServer', - 'shape', - 'structural', - ]), - content: new Set([ - 'a', - 'altGlyphDef', - 'clipPath', - 'color-profile', - 'cursor', - 'filter', - 'font-face', - 'font', - 'foreignObject', - 'image', - 'marker', - 'mask', - 'pattern', - 'script', - 'style', - 'switch', - 'text', - 'view', - ]), - }, - hatch: { - attrsGroups: new Set(['core', 'presentation', 'xlink']), - attrs: new Set([ - 'class', - 'hatchContentUnits', - 'hatchUnits', - 'pitch', - 'rotate', - 'style', - 'transform', - 'x', - 'y', - ]), - defaults: { - hatchUnits: 'objectBoundingBox', - hatchContentUnits: 'userSpaceOnUse', - x: '0', - y: '0', - pitch: '0', - rotate: '0', - }, - contentGroups: new Set(['animation', 'descriptive']), - content: new Set(['hatchPath']), - }, - hatchPath: { - attrsGroups: new Set(['core', 'presentation', 'xlink']), - attrs: new Set(['class', 'style', 'd', 'offset']), - defaults: { - offset: '0', - }, - contentGroups: new Set(['animation', 'descriptive']), - }, - hkern: { - attrsGroups: new Set(['core']), - attrs: new Set(['u1', 'g1', 'u2', 'g2', 'k']), - }, - image: { - attrsGroups: new Set([ - 'conditionalProcessing', - 'core', - 'graphicalEvent', - 'presentation', - 'xlink', - ]), - attrs: new Set([ - 'class', - 'externalResourcesRequired', - 'height', - 'href', - 'preserveAspectRatio', - 'style', - 'transform', - 'width', - 'x', - 'xlink:href', - 'y', - ]), - defaults: { - x: '0', - y: '0', - preserveAspectRatio: 'xMidYMid meet', - }, - contentGroups: new Set(['animation', 'descriptive']), - }, - line: { - attrsGroups: new Set([ - 'conditionalProcessing', - 'core', - 'graphicalEvent', - 'presentation', - ]), - attrs: new Set([ - 'class', - 'externalResourcesRequired', - 'style', - 'transform', - 'x1', - 'x2', - 'y1', - 'y2', - ]), - defaults: { - x1: '0', - y1: '0', - x2: '0', - y2: '0', - }, - contentGroups: new Set(['animation', 'descriptive']), - }, - linearGradient: { - attrsGroups: new Set(['core', 'presentation', 'xlink']), - attrs: new Set([ - 'class', - 'externalResourcesRequired', - 'gradientTransform', - 'gradientUnits', - 'href', - 'spreadMethod', - 'style', - 'x1', - 'x2', - 'xlink:href', - 'y1', - 'y2', - ]), - defaults: { - x1: '0', - y1: '0', - x2: '100%', - y2: '0', - spreadMethod: 'pad', - }, - contentGroups: new Set(['descriptive']), - content: new Set(['animate', 'animateTransform', 'set', 'stop']), - }, - marker: { - attrsGroups: new Set(['core', 'presentation']), - attrs: new Set([ - 'class', - 'externalResourcesRequired', - 'markerHeight', - 'markerUnits', - 'markerWidth', - 'orient', - 'preserveAspectRatio', - 'refX', - 'refY', - 'style', - 'viewBox', - ]), - defaults: { - markerUnits: 'strokeWidth', - refX: '0', - refY: '0', - markerWidth: '3', - markerHeight: '3', - }, - contentGroups: new Set([ - 'animation', - 'descriptive', - 'paintServer', - 'shape', - 'structural', - ]), - content: new Set([ - 'a', - 'altGlyphDef', - 'clipPath', - 'color-profile', - 'cursor', - 'filter', - 'font-face', - 'font', - 'foreignObject', - 'image', - 'marker', - 'mask', - 'pattern', - 'script', - 'style', - 'switch', - 'text', - 'view', - ]), - }, - mask: { - attrsGroups: new Set(['conditionalProcessing', 'core', 'presentation']), - attrs: new Set([ - 'class', - 'externalResourcesRequired', - 'height', - 'mask-type', - 'maskContentUnits', - 'maskUnits', - 'style', - 'width', - 'x', - 'y', - ]), - defaults: { - maskUnits: 'objectBoundingBox', - maskContentUnits: 'userSpaceOnUse', - x: '-10%', - y: '-10%', - width: '120%', - height: '120%', - }, - contentGroups: new Set([ - 'animation', - 'descriptive', - 'paintServer', - 'shape', - 'structural', - ]), - content: new Set([ - 'a', - 'altGlyphDef', - 'clipPath', - 'color-profile', - 'cursor', - 'filter', - 'font-face', - 'font', - 'foreignObject', - 'image', - 'marker', - 'mask', - 'pattern', - 'script', - 'style', - 'switch', - 'text', - 'view', - ]), - }, - metadata: { - attrsGroups: new Set(['core']), - }, - 'missing-glyph': { - attrsGroups: new Set(['core', 'presentation']), - attrs: new Set([ - 'class', - 'd', - 'horiz-adv-x', - 'style', - 'vert-adv-y', - 'vert-origin-x', - 'vert-origin-y', - ]), - contentGroups: new Set([ - 'animation', - 'descriptive', - 'paintServer', - 'shape', - 'structural', - ]), - content: new Set([ - 'a', - 'altGlyphDef', - 'clipPath', - 'color-profile', - 'cursor', - 'filter', - 'font-face', - 'font', - 'foreignObject', - 'image', - 'marker', - 'mask', - 'pattern', - 'script', - 'style', - 'switch', - 'text', - 'view', - ]), - }, - mpath: { - attrsGroups: new Set(['core', 'xlink']), - attrs: new Set(['externalResourcesRequired', 'href', 'xlink:href']), - contentGroups: new Set(['descriptive']), - }, - path: { - attrsGroups: new Set([ - 'conditionalProcessing', - 'core', - 'graphicalEvent', - 'presentation', - ]), - attrs: new Set([ - 'class', - 'd', - 'externalResourcesRequired', - 'pathLength', - 'style', - 'transform', - ]), - contentGroups: new Set(['animation', 'descriptive']), - }, - pattern: { - attrsGroups: new Set([ - 'conditionalProcessing', - 'core', - 'presentation', - 'xlink', - ]), - attrs: new Set([ - 'class', - 'externalResourcesRequired', - 'height', - 'href', - 'patternContentUnits', - 'patternTransform', - 'patternUnits', - 'preserveAspectRatio', - 'style', - 'viewBox', - 'width', - 'x', - 'xlink:href', - 'y', - ]), - defaults: { - patternUnits: 'objectBoundingBox', - patternContentUnits: 'userSpaceOnUse', - x: '0', - y: '0', - width: '0', - height: '0', - preserveAspectRatio: 'xMidYMid meet', - }, - contentGroups: new Set([ - 'animation', - 'descriptive', - 'paintServer', - 'shape', - 'structural', - ]), - content: new Set([ - 'a', - 'altGlyphDef', - 'clipPath', - 'color-profile', - 'cursor', - 'filter', - 'font-face', - 'font', - 'foreignObject', - 'image', - 'marker', - 'mask', - 'pattern', - 'script', - 'style', - 'switch', - 'text', - 'view', - ]), - }, - polygon: { - attrsGroups: new Set([ - 'conditionalProcessing', - 'core', - 'graphicalEvent', - 'presentation', - ]), - attrs: new Set([ - 'class', - 'externalResourcesRequired', - 'points', - 'style', - 'transform', - ]), - contentGroups: new Set(['animation', 'descriptive']), - }, - polyline: { - attrsGroups: new Set([ - 'conditionalProcessing', - 'core', - 'graphicalEvent', - 'presentation', - ]), - attrs: new Set([ - 'class', - 'externalResourcesRequired', - 'points', - 'style', - 'transform', - ]), - contentGroups: new Set(['animation', 'descriptive']), - }, - radialGradient: { - attrsGroups: new Set(['core', 'presentation', 'xlink']), - attrs: new Set([ - 'class', - 'cx', - 'cy', - 'externalResourcesRequired', - 'fr', - 'fx', - 'fy', - 'gradientTransform', - 'gradientUnits', - 'href', - 'r', - 'spreadMethod', - 'style', - 'xlink:href', - ]), - defaults: { - gradientUnits: 'objectBoundingBox', - cx: '50%', - cy: '50%', - r: '50%', - }, - contentGroups: new Set(['descriptive']), - content: new Set(['animate', 'animateTransform', 'set', 'stop']), - }, - meshGradient: { - attrsGroups: new Set(['core', 'presentation', 'xlink']), - attrs: new Set(['class', 'style', 'x', 'y', 'gradientUnits', 'transform']), - contentGroups: new Set(['descriptive', 'paintServer', 'animation']), - content: new Set(['meshRow']), - }, - meshRow: { - attrsGroups: new Set(['core', 'presentation']), - attrs: new Set(['class', 'style']), - contentGroups: new Set(['descriptive']), - content: new Set(['meshPatch']), - }, - meshPatch: { - attrsGroups: new Set(['core', 'presentation']), - attrs: new Set(['class', 'style']), - contentGroups: new Set(['descriptive']), - content: new Set(['stop']), - }, - rect: { - attrsGroups: new Set([ - 'conditionalProcessing', - 'core', - 'graphicalEvent', - 'presentation', - ]), - attrs: new Set([ - 'class', - 'externalResourcesRequired', - 'height', - 'rx', - 'ry', - 'style', - 'transform', - 'width', - 'x', - 'y', - ]), - defaults: { - x: '0', - y: '0', - }, - contentGroups: new Set(['animation', 'descriptive']), - }, - script: { - attrsGroups: new Set(['core', 'xlink']), - attrs: new Set(['externalResourcesRequired', 'type', 'href', 'xlink:href']), - }, - set: { - attrsGroups: new Set([ - 'animation', - 'animationAttributeTarget', - 'animationTiming', - 'conditionalProcessing', - 'core', - 'xlink', - ]), - attrs: new Set(['externalResourcesRequired', 'to']), - contentGroups: new Set(['descriptive']), - }, - solidColor: { - attrsGroups: new Set(['core', 'presentation']), - attrs: new Set(['class', 'style']), - contentGroups: new Set(['paintServer']), - }, - stop: { - attrsGroups: new Set(['core', 'presentation']), - attrs: new Set(['class', 'style', 'offset', 'path']), - content: new Set(['animate', 'animateColor', 'set']), - }, - style: { - attrsGroups: new Set(['core']), - attrs: new Set(['type', 'media', 'title']), - defaults: { - type: 'text/css', - }, - }, - svg: { - attrsGroups: new Set([ - 'conditionalProcessing', - 'core', - 'documentEvent', - 'graphicalEvent', - 'presentation', - ]), - attrs: new Set([ - 'baseProfile', - 'class', - 'contentScriptType', - 'contentStyleType', - 'height', - 'preserveAspectRatio', - 'style', - 'version', - 'viewBox', - 'width', - 'x', - 'y', - 'zoomAndPan', - ]), - defaults: { - x: '0', - y: '0', - width: '100%', - height: '100%', - preserveAspectRatio: 'xMidYMid meet', - zoomAndPan: 'magnify', - version: '1.1', - baseProfile: 'none', - contentScriptType: 'application/ecmascript', - contentStyleType: 'text/css', - }, - contentGroups: new Set([ - 'animation', - 'descriptive', - 'paintServer', - 'shape', - 'structural', - ]), - content: new Set([ - 'a', - 'altGlyphDef', - 'clipPath', - 'color-profile', - 'cursor', - 'filter', - 'font-face', - 'font', - 'foreignObject', - 'image', - 'marker', - 'mask', - 'pattern', - 'script', - 'style', - 'switch', - 'text', - 'view', - ]), - }, - switch: { - attrsGroups: new Set([ - 'conditionalProcessing', - 'core', - 'graphicalEvent', - 'presentation', - ]), - attrs: new Set([ - 'class', - 'externalResourcesRequired', - 'style', - 'transform', - ]), - contentGroups: new Set(['animation', 'descriptive', 'shape']), - content: new Set([ - 'a', - 'foreignObject', - 'g', - 'image', - 'svg', - 'switch', - 'text', - 'use', - ]), - }, - symbol: { - attrsGroups: new Set(['core', 'graphicalEvent', 'presentation']), - attrs: new Set([ - 'class', - 'externalResourcesRequired', - 'preserveAspectRatio', - 'refX', - 'refY', - 'style', - 'viewBox', - ]), - defaults: { - refX: '0', - refY: '0', - }, - contentGroups: new Set([ - 'animation', - 'descriptive', - 'paintServer', - 'shape', - 'structural', - ]), - content: new Set([ - 'a', - 'altGlyphDef', - 'clipPath', - 'color-profile', - 'cursor', - 'filter', - 'font-face', - 'font', - 'foreignObject', - 'image', - 'marker', - 'mask', - 'pattern', - 'script', - 'style', - 'switch', - 'text', - 'view', - ]), - }, - text: { - attrsGroups: new Set([ - 'conditionalProcessing', - 'core', - 'graphicalEvent', - 'presentation', - ]), - attrs: new Set([ - 'class', - 'dx', - 'dy', - 'externalResourcesRequired', - 'lengthAdjust', - 'rotate', - 'style', - 'textLength', - 'transform', - 'x', - 'y', - ]), - defaults: { - x: '0', - y: '0', - lengthAdjust: 'spacing', - }, - contentGroups: new Set(['animation', 'descriptive', 'textContentChild']), - content: new Set(['a']), - }, - textPath: { - attrsGroups: new Set([ - 'conditionalProcessing', - 'core', - 'graphicalEvent', - 'presentation', - 'xlink', - ]), - attrs: new Set([ - 'class', - 'd', - 'externalResourcesRequired', - 'href', - 'method', - 'spacing', - 'startOffset', - 'style', - 'xlink:href', - ]), - defaults: { - startOffset: '0', - method: 'align', - spacing: 'exact', - }, - contentGroups: new Set(['descriptive']), - content: new Set([ - 'a', - 'altGlyph', - 'animate', - 'animateColor', - 'set', - 'tref', - 'tspan', - ]), - }, - title: { - attrsGroups: new Set(['core']), - attrs: new Set(['class', 'style']), - }, - tref: { - attrsGroups: new Set([ - 'conditionalProcessing', - 'core', - 'graphicalEvent', - 'presentation', - 'xlink', - ]), - attrs: new Set([ - 'class', - 'externalResourcesRequired', - 'href', - 'style', - 'xlink:href', - ]), - contentGroups: new Set(['descriptive']), - content: new Set(['animate', 'animateColor', 'set']), - }, - tspan: { - attrsGroups: new Set([ - 'conditionalProcessing', - 'core', - 'graphicalEvent', - 'presentation', - ]), - attrs: new Set([ - 'class', - 'dx', - 'dy', - 'externalResourcesRequired', - 'lengthAdjust', - 'rotate', - 'style', - 'textLength', - 'x', - 'y', - ]), - contentGroups: new Set(['descriptive']), - content: new Set([ - 'a', - 'altGlyph', - 'animate', - 'animateColor', - 'set', - 'tref', - 'tspan', - ]), - }, - use: { - attrsGroups: new Set([ - 'conditionalProcessing', - 'core', - 'graphicalEvent', - 'presentation', - 'xlink', - ]), - attrs: new Set([ - 'class', - 'externalResourcesRequired', - 'height', - 'href', - 'style', - 'transform', - 'width', - 'x', - 'xlink:href', - 'y', - ]), - defaults: { - x: '0', - y: '0', - }, - contentGroups: new Set(['animation', 'descriptive']), - }, - view: { - attrsGroups: new Set(['core']), - attrs: new Set([ - 'externalResourcesRequired', - 'preserveAspectRatio', - 'viewBox', - 'viewTarget', - 'zoomAndPan', - ]), - contentGroups: new Set(['descriptive']), - }, - vkern: { - attrsGroups: new Set(['core']), - attrs: new Set(['u1', 'g1', 'u2', 'g2', 'k']), - }, -}; - -// https://wiki.inkscape.org/wiki/index.php/Inkscape-specific_XML_attributes -exports.editorNamespaces = new Set([ - 'http://creativecommons.org/ns#', - 'http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd', - 'http://ns.adobe.com/AdobeIllustrator/10.0/', - 'http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/', - 'http://ns.adobe.com/Extensibility/1.0/', - 'http://ns.adobe.com/Flows/1.0/', - 'http://ns.adobe.com/GenericCustomNamespace/1.0/', - 'http://ns.adobe.com/Graphs/1.0/', - 'http://ns.adobe.com/ImageReplacement/1.0/', - 'http://ns.adobe.com/SaveForWeb/1.0/', - 'http://ns.adobe.com/Variables/1.0/', - 'http://ns.adobe.com/XPath/1.0/', - 'http://purl.org/dc/elements/1.1/', - 'http://schemas.microsoft.com/visio/2003/SVGExtensions/', - 'http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd', - 'http://taptrix.com/vectorillustrator/svg_extensions', - 'http://www.bohemiancoding.com/sketch/ns', - 'http://www.figma.com/figma/ns', - 'http://www.inkscape.org/namespaces/inkscape', - 'http://www.serif.com/', - 'http://www.vector.evaxdesign.sk', - 'http://www.w3.org/1999/02/22-rdf-syntax-ns#', -]); - -/** - * @see https://www.w3.org/TR/SVG11/linking.html#processingIRI - */ -exports.referencesProps = new Set([ - 'clip-path', - 'color-profile', - 'fill', - 'filter', - 'marker-end', - 'marker-mid', - 'marker-start', - 'mask', - 'stroke', - 'style', -]); - -/** - * @see https://www.w3.org/TR/SVG11/propidx.html - */ -exports.inheritableAttrs = new Set([ - 'clip-rule', - 'color-interpolation-filters', - 'color-interpolation', - 'color-profile', - 'color-rendering', - 'color', - 'cursor', - 'direction', - 'dominant-baseline', - 'fill-opacity', - 'fill-rule', - 'fill', - 'font-family', - 'font-size-adjust', - 'font-size', - 'font-stretch', - 'font-style', - 'font-variant', - 'font-weight', - 'font', - 'glyph-orientation-horizontal', - 'glyph-orientation-vertical', - 'image-rendering', - 'letter-spacing', - 'marker-end', - 'marker-mid', - 'marker-start', - 'marker', - 'paint-order', - 'pointer-events', - 'shape-rendering', - 'stroke-dasharray', - 'stroke-dashoffset', - 'stroke-linecap', - 'stroke-linejoin', - 'stroke-miterlimit', - 'stroke-opacity', - 'stroke-width', - 'stroke', - 'text-anchor', - 'text-rendering', - 'transform', - 'visibility', - 'word-spacing', - 'writing-mode', -]); - -exports.presentationNonInheritableGroupAttrs = new Set([ - 'clip-path', - 'display', - 'filter', - 'mask', - 'opacity', - 'text-decoration', - 'transform', - 'unicode-bidi', -]); - -/** - * https://www.w3.org/TR/SVG11/single-page.html#types-ColorKeywords - * - * @type {Record} - */ -exports.colorsNames = { - aliceblue: '#f0f8ff', - antiquewhite: '#faebd7', - aqua: '#0ff', - aquamarine: '#7fffd4', - azure: '#f0ffff', - beige: '#f5f5dc', - bisque: '#ffe4c4', - black: '#000', - blanchedalmond: '#ffebcd', - blue: '#00f', - blueviolet: '#8a2be2', - brown: '#a52a2a', - burlywood: '#deb887', - cadetblue: '#5f9ea0', - chartreuse: '#7fff00', - chocolate: '#d2691e', - coral: '#ff7f50', - cornflowerblue: '#6495ed', - cornsilk: '#fff8dc', - crimson: '#dc143c', - cyan: '#0ff', - darkblue: '#00008b', - darkcyan: '#008b8b', - darkgoldenrod: '#b8860b', - darkgray: '#a9a9a9', - darkgreen: '#006400', - darkgrey: '#a9a9a9', - darkkhaki: '#bdb76b', - darkmagenta: '#8b008b', - darkolivegreen: '#556b2f', - darkorange: '#ff8c00', - darkorchid: '#9932cc', - darkred: '#8b0000', - darksalmon: '#e9967a', - darkseagreen: '#8fbc8f', - darkslateblue: '#483d8b', - darkslategray: '#2f4f4f', - darkslategrey: '#2f4f4f', - darkturquoise: '#00ced1', - darkviolet: '#9400d3', - deeppink: '#ff1493', - deepskyblue: '#00bfff', - dimgray: '#696969', - dimgrey: '#696969', - dodgerblue: '#1e90ff', - firebrick: '#b22222', - floralwhite: '#fffaf0', - forestgreen: '#228b22', - fuchsia: '#f0f', - gainsboro: '#dcdcdc', - ghostwhite: '#f8f8ff', - gold: '#ffd700', - goldenrod: '#daa520', - gray: '#808080', - green: '#008000', - greenyellow: '#adff2f', - grey: '#808080', - honeydew: '#f0fff0', - hotpink: '#ff69b4', - indianred: '#cd5c5c', - indigo: '#4b0082', - ivory: '#fffff0', - khaki: '#f0e68c', - lavender: '#e6e6fa', - lavenderblush: '#fff0f5', - lawngreen: '#7cfc00', - lemonchiffon: '#fffacd', - lightblue: '#add8e6', - lightcoral: '#f08080', - lightcyan: '#e0ffff', - lightgoldenrodyellow: '#fafad2', - lightgray: '#d3d3d3', - lightgreen: '#90ee90', - lightgrey: '#d3d3d3', - lightpink: '#ffb6c1', - lightsalmon: '#ffa07a', - lightseagreen: '#20b2aa', - lightskyblue: '#87cefa', - lightslategray: '#789', - lightslategrey: '#789', - lightsteelblue: '#b0c4de', - lightyellow: '#ffffe0', - lime: '#0f0', - limegreen: '#32cd32', - linen: '#faf0e6', - magenta: '#f0f', - maroon: '#800000', - mediumaquamarine: '#66cdaa', - mediumblue: '#0000cd', - mediumorchid: '#ba55d3', - mediumpurple: '#9370db', - mediumseagreen: '#3cb371', - mediumslateblue: '#7b68ee', - mediumspringgreen: '#00fa9a', - mediumturquoise: '#48d1cc', - mediumvioletred: '#c71585', - midnightblue: '#191970', - mintcream: '#f5fffa', - mistyrose: '#ffe4e1', - moccasin: '#ffe4b5', - navajowhite: '#ffdead', - navy: '#000080', - oldlace: '#fdf5e6', - olive: '#808000', - olivedrab: '#6b8e23', - orange: '#ffa500', - orangered: '#ff4500', - orchid: '#da70d6', - palegoldenrod: '#eee8aa', - palegreen: '#98fb98', - paleturquoise: '#afeeee', - palevioletred: '#db7093', - papayawhip: '#ffefd5', - peachpuff: '#ffdab9', - peru: '#cd853f', - pink: '#ffc0cb', - plum: '#dda0dd', - powderblue: '#b0e0e6', - purple: '#800080', - rebeccapurple: '#639', - red: '#f00', - rosybrown: '#bc8f8f', - royalblue: '#4169e1', - saddlebrown: '#8b4513', - salmon: '#fa8072', - sandybrown: '#f4a460', - seagreen: '#2e8b57', - seashell: '#fff5ee', - sienna: '#a0522d', - silver: '#c0c0c0', - skyblue: '#87ceeb', - slateblue: '#6a5acd', - slategray: '#708090', - slategrey: '#708090', - snow: '#fffafa', - springgreen: '#00ff7f', - steelblue: '#4682b4', - tan: '#d2b48c', - teal: '#008080', - thistle: '#d8bfd8', - tomato: '#ff6347', - turquoise: '#40e0d0', - violet: '#ee82ee', - wheat: '#f5deb3', - white: '#fff', - whitesmoke: '#f5f5f5', - yellow: '#ff0', - yellowgreen: '#9acd32', -}; - -/** - * @type {Record} - */ -exports.colorsShortNames = { - '#f0ffff': 'azure', - '#f5f5dc': 'beige', - '#ffe4c4': 'bisque', - '#a52a2a': 'brown', - '#ff7f50': 'coral', - '#ffd700': 'gold', - '#808080': 'gray', - '#008000': 'green', - '#4b0082': 'indigo', - '#fffff0': 'ivory', - '#f0e68c': 'khaki', - '#faf0e6': 'linen', - '#800000': 'maroon', - '#000080': 'navy', - '#808000': 'olive', - '#ffa500': 'orange', - '#da70d6': 'orchid', - '#cd853f': 'peru', - '#ffc0cb': 'pink', - '#dda0dd': 'plum', - '#800080': 'purple', - '#f00': 'red', - '#ff0000': 'red', - '#fa8072': 'salmon', - '#a0522d': 'sienna', - '#c0c0c0': 'silver', - '#fffafa': 'snow', - '#d2b48c': 'tan', - '#008080': 'teal', - '#ff6347': 'tomato', - '#ee82ee': 'violet', - '#f5deb3': 'wheat', -}; - -/** - * @see https://www.w3.org/TR/SVG11/single-page.html#types-DataTypeColor - */ -exports.colorsProps = new Set([ - 'color', - 'fill', - 'flood-color', - 'lighting-color', - 'stop-color', - 'stroke', -]); - -/** @see https://developer.mozilla.org/docs/Web/CSS/Pseudo-classes */ -exports.pseudoClasses = { - displayState: new Set(['fullscreen', 'modal', 'picture-in-picture']), - input: new Set([ - 'autofill', - 'blank', - 'checked', - 'default', - 'disabled', - 'enabled', - 'in-range', - 'indetermined', - 'invalid', - 'optional', - 'out-of-range', - 'placeholder-shown', - 'read-only', - 'read-write', - 'required', - 'user-invalid', - 'valid', - ]), - linguistic: new Set(['dir', 'lang']), - location: new Set([ - 'any-link', - 'link', - 'local-link', - 'scope', - 'target-within', - 'target', - 'visited', - ]), - resourceState: new Set(['playing', 'paused']), - timeDimensional: new Set(['current', 'past', 'future']), - treeStructural: new Set([ - 'empty', - 'first-child', - 'first-of-type', - 'last-child', - 'last-of-type', - 'nth-child', - 'nth-last-child', - 'nth-last-of-type', - 'nth-of-type', - 'only-child', - 'only-of-type', - 'root', - ]), - userAction: new Set([ - 'active', - 'focus-visible', - 'focus-within', - 'focus', - 'hover', - ]), - functional: new Set(['is', 'not', 'where', 'has']), -}; diff --git a/node_modules/svgo/plugins/_path.js b/node_modules/svgo/plugins/_path.js deleted file mode 100644 index 7c3a28b9..00000000 --- a/node_modules/svgo/plugins/_path.js +++ /dev/null @@ -1,815 +0,0 @@ -'use strict'; - -/** - * @typedef {import('../lib/types').XastElement} XastElement - * @typedef {import('../lib/types').PathDataItem} PathDataItem - */ - -const { parsePathData, stringifyPathData } = require('../lib/path.js'); - -/** - * @type {[number, number]} - */ -var prevCtrlPoint; - -/** - * Convert path string to JS representation. - * - * @type {(path: XastElement) => PathDataItem[]} - */ -const path2js = (path) => { - // @ts-ignore legacy - if (path.pathJS) return path.pathJS; - /** - * @type {PathDataItem[]} - */ - const pathData = []; // JS representation of the path data - const newPathData = parsePathData(path.attributes.d); - for (const { command, args } of newPathData) { - pathData.push({ command, args }); - } - // First moveto is actually absolute. Subsequent coordinates were separated above. - if (pathData.length && pathData[0].command == 'm') { - pathData[0].command = 'M'; - } - // @ts-ignore legacy - path.pathJS = pathData; - return pathData; -}; -exports.path2js = path2js; - -/** - * Convert relative Path data to absolute. - * - * @type {(data: PathDataItem[]) => PathDataItem[]} - * - */ -const convertRelativeToAbsolute = (data) => { - /** - * @type {PathDataItem[]} - */ - const newData = []; - let start = [0, 0]; - let cursor = [0, 0]; - - for (let { command, args } of data) { - args = args.slice(); - - // moveto (x y) - if (command === 'm') { - args[0] += cursor[0]; - args[1] += cursor[1]; - command = 'M'; - } - if (command === 'M') { - cursor[0] = args[0]; - cursor[1] = args[1]; - start[0] = cursor[0]; - start[1] = cursor[1]; - } - - // horizontal lineto (x) - if (command === 'h') { - args[0] += cursor[0]; - command = 'H'; - } - if (command === 'H') { - cursor[0] = args[0]; - } - - // vertical lineto (y) - if (command === 'v') { - args[0] += cursor[1]; - command = 'V'; - } - if (command === 'V') { - cursor[1] = args[0]; - } - - // lineto (x y) - if (command === 'l') { - args[0] += cursor[0]; - args[1] += cursor[1]; - command = 'L'; - } - if (command === 'L') { - cursor[0] = args[0]; - cursor[1] = args[1]; - } - - // curveto (x1 y1 x2 y2 x y) - if (command === 'c') { - args[0] += cursor[0]; - args[1] += cursor[1]; - args[2] += cursor[0]; - args[3] += cursor[1]; - args[4] += cursor[0]; - args[5] += cursor[1]; - command = 'C'; - } - if (command === 'C') { - cursor[0] = args[4]; - cursor[1] = args[5]; - } - - // smooth curveto (x2 y2 x y) - if (command === 's') { - args[0] += cursor[0]; - args[1] += cursor[1]; - args[2] += cursor[0]; - args[3] += cursor[1]; - command = 'S'; - } - if (command === 'S') { - cursor[0] = args[2]; - cursor[1] = args[3]; - } - - // quadratic Bézier curveto (x1 y1 x y) - if (command === 'q') { - args[0] += cursor[0]; - args[1] += cursor[1]; - args[2] += cursor[0]; - args[3] += cursor[1]; - command = 'Q'; - } - if (command === 'Q') { - cursor[0] = args[2]; - cursor[1] = args[3]; - } - - // smooth quadratic Bézier curveto (x y) - if (command === 't') { - args[0] += cursor[0]; - args[1] += cursor[1]; - command = 'T'; - } - if (command === 'T') { - cursor[0] = args[0]; - cursor[1] = args[1]; - } - - // elliptical arc (rx ry x-axis-rotation large-arc-flag sweep-flag x y) - if (command === 'a') { - args[5] += cursor[0]; - args[6] += cursor[1]; - command = 'A'; - } - if (command === 'A') { - cursor[0] = args[5]; - cursor[1] = args[6]; - } - - // closepath - if (command === 'z' || command === 'Z') { - cursor[0] = start[0]; - cursor[1] = start[1]; - command = 'z'; - } - - newData.push({ command, args }); - } - return newData; -}; - -/** - * @typedef {{ floatPrecision?: number, noSpaceAfterFlags?: boolean }} Js2PathParams - */ - -/** - * Convert path array to string. - * - * @type {(path: XastElement, data: PathDataItem[], params: Js2PathParams) => void} - */ -exports.js2path = function (path, data, params) { - // @ts-ignore legacy - path.pathJS = data; - - const pathData = []; - for (const item of data) { - // remove moveto commands which are followed by moveto commands - if ( - pathData.length !== 0 && - (item.command === 'M' || item.command === 'm') - ) { - const last = pathData[pathData.length - 1]; - if (last.command === 'M' || last.command === 'm') { - pathData.pop(); - } - } - pathData.push({ - command: item.command, - args: item.args, - }); - } - - path.attributes.d = stringifyPathData({ - pathData, - precision: params.floatPrecision, - disableSpaceAfterFlags: params.noSpaceAfterFlags, - }); -}; - -/** - * @type {(dest: number[], source: number[]) => number[]} - */ -function set(dest, source) { - dest[0] = source[source.length - 2]; - dest[1] = source[source.length - 1]; - return dest; -} - -/** - * Checks if two paths have an intersection by checking convex hulls - * collision using Gilbert-Johnson-Keerthi distance algorithm - * https://web.archive.org/web/20180822200027/http://entropyinteractive.com/2011/04/gjk-algorithm/ - * - * @type {(path1: PathDataItem[], path2: PathDataItem[]) => boolean} - */ -exports.intersects = function (path1, path2) { - // Collect points of every subpath. - const points1 = gatherPoints(convertRelativeToAbsolute(path1)); - const points2 = gatherPoints(convertRelativeToAbsolute(path2)); - - // Axis-aligned bounding box check. - if ( - points1.maxX <= points2.minX || - points2.maxX <= points1.minX || - points1.maxY <= points2.minY || - points2.maxY <= points1.minY || - points1.list.every((set1) => { - return points2.list.every((set2) => { - return ( - set1.list[set1.maxX][0] <= set2.list[set2.minX][0] || - set2.list[set2.maxX][0] <= set1.list[set1.minX][0] || - set1.list[set1.maxY][1] <= set2.list[set2.minY][1] || - set2.list[set2.maxY][1] <= set1.list[set1.minY][1] - ); - }); - }) - ) - return false; - - // Get a convex hull from points of each subpath. Has the most complexity O(n·log n). - const hullNest1 = points1.list.map(convexHull); - const hullNest2 = points2.list.map(convexHull); - - // Check intersection of every subpath of the first path with every subpath of the second. - return hullNest1.some(function (hull1) { - if (hull1.list.length < 3) return false; - - return hullNest2.some(function (hull2) { - if (hull2.list.length < 3) return false; - - var simplex = [getSupport(hull1, hull2, [1, 0])], // create the initial simplex - direction = minus(simplex[0]); // set the direction to point towards the origin - - var iterations = 1e4; // infinite loop protection, 10 000 iterations is more than enough - // eslint-disable-next-line no-constant-condition - while (true) { - if (iterations-- == 0) { - console.error( - 'Error: infinite loop while processing mergePaths plugin.', - ); - return true; // true is the safe value that means “do nothing with paths” - } - // add a new point - simplex.push(getSupport(hull1, hull2, direction)); - // see if the new point was on the correct side of the origin - if (dot(direction, simplex[simplex.length - 1]) <= 0) return false; - // process the simplex - if (processSimplex(simplex, direction)) return true; - } - }); - }); - - /** - * @type {(a: Point, b: Point, direction: number[]) => number[]} - */ - function getSupport(a, b, direction) { - return sub(supportPoint(a, direction), supportPoint(b, minus(direction))); - } - - // Computes farthest polygon point in particular direction. - // Thanks to knowledge of min/max x and y coordinates we can choose a quadrant to search in. - // Since we're working on convex hull, the dot product is increasing until we find the farthest point. - /** - * @type {(polygon: Point, direction: number[]) => number[]} - */ - function supportPoint(polygon, direction) { - var index = - direction[1] >= 0 - ? direction[0] < 0 - ? polygon.maxY - : polygon.maxX - : direction[0] < 0 - ? polygon.minX - : polygon.minY, - max = -Infinity, - value; - while ((value = dot(polygon.list[index], direction)) > max) { - max = value; - index = ++index % polygon.list.length; - } - return polygon.list[(index || polygon.list.length) - 1]; - } -}; - -/** - * @type {(simplex: number[][], direction: number[]) => boolean} - */ -function processSimplex(simplex, direction) { - // we only need to handle to 1-simplex and 2-simplex - if (simplex.length == 2) { - // 1-simplex - let a = simplex[1], - b = simplex[0], - AO = minus(simplex[1]), - AB = sub(b, a); - // AO is in the same direction as AB - if (dot(AO, AB) > 0) { - // get the vector perpendicular to AB facing O - set(direction, orth(AB, a)); - } else { - set(direction, AO); - // only A remains in the simplex - simplex.shift(); - } - } else { - // 2-simplex - let a = simplex[2], // [a, b, c] = simplex - b = simplex[1], - c = simplex[0], - AB = sub(b, a), - AC = sub(c, a), - AO = minus(a), - ACB = orth(AB, AC), // the vector perpendicular to AB facing away from C - ABC = orth(AC, AB); // the vector perpendicular to AC facing away from B - - if (dot(ACB, AO) > 0) { - if (dot(AB, AO) > 0) { - // region 4 - set(direction, ACB); - simplex.shift(); // simplex = [b, a] - } else { - // region 5 - set(direction, AO); - simplex.splice(0, 2); // simplex = [a] - } - } else if (dot(ABC, AO) > 0) { - if (dot(AC, AO) > 0) { - // region 6 - set(direction, ABC); - simplex.splice(1, 1); // simplex = [c, a] - } else { - // region 5 (again) - set(direction, AO); - simplex.splice(0, 2); // simplex = [a] - } - } // region 7 - else return true; - } - return false; -} - -/** - * @type {(v: number[]) => number[]} - */ -function minus(v) { - return [-v[0], -v[1]]; -} - -/** - * @type {(v1: number[], v2: number[]) => number[]} - */ -function sub(v1, v2) { - return [v1[0] - v2[0], v1[1] - v2[1]]; -} - -/** - * @type {(v1: number[], v2: number[]) => number} - */ -function dot(v1, v2) { - return v1[0] * v2[0] + v1[1] * v2[1]; -} - -/** - * @type {(v1: number[], v2: number[]) => number[]} - */ -function orth(v, from) { - var o = [-v[1], v[0]]; - return dot(o, minus(from)) < 0 ? minus(o) : o; -} - -/** - * @typedef {{ - * list: number[][], - * minX: number, - * minY: number, - * maxX: number, - * maxY: number - * }} Point - */ - -/** - * @typedef {{ - * list: Point[], - * minX: number, - * minY: number, - * maxX: number, - * maxY: number - * }} Points - */ - -/** - * @type {(pathData: PathDataItem[]) => Points} - */ -function gatherPoints(pathData) { - /** - * @type {Points} - */ - const points = { list: [], minX: 0, minY: 0, maxX: 0, maxY: 0 }; - - // Writes data about the extreme points on each axle - /** - * @type {(path: Point, point: number[]) => void} - */ - const addPoint = (path, point) => { - if (!path.list.length || point[1] > path.list[path.maxY][1]) { - path.maxY = path.list.length; - points.maxY = points.list.length - ? Math.max(point[1], points.maxY) - : point[1]; - } - if (!path.list.length || point[0] > path.list[path.maxX][0]) { - path.maxX = path.list.length; - points.maxX = points.list.length - ? Math.max(point[0], points.maxX) - : point[0]; - } - if (!path.list.length || point[1] < path.list[path.minY][1]) { - path.minY = path.list.length; - points.minY = points.list.length - ? Math.min(point[1], points.minY) - : point[1]; - } - if (!path.list.length || point[0] < path.list[path.minX][0]) { - path.minX = path.list.length; - points.minX = points.list.length - ? Math.min(point[0], points.minX) - : point[0]; - } - path.list.push(point); - }; - - for (let i = 0; i < pathData.length; i += 1) { - const pathDataItem = pathData[i]; - let subPath = - points.list.length === 0 - ? { list: [], minX: 0, minY: 0, maxX: 0, maxY: 0 } - : points.list[points.list.length - 1]; - let prev = i === 0 ? null : pathData[i - 1]; - let basePoint = - subPath.list.length === 0 ? null : subPath.list[subPath.list.length - 1]; - let data = pathDataItem.args; - let ctrlPoint = basePoint; - - /** - * @type {(n: number, i: number) => number} - * TODO fix null hack - */ - const toAbsolute = (n, i) => n + (basePoint == null ? 0 : basePoint[i % 2]); - - switch (pathDataItem.command) { - case 'M': - subPath = { list: [], minX: 0, minY: 0, maxX: 0, maxY: 0 }; - points.list.push(subPath); - break; - - case 'H': - if (basePoint != null) { - addPoint(subPath, [data[0], basePoint[1]]); - } - break; - - case 'V': - if (basePoint != null) { - addPoint(subPath, [basePoint[0], data[0]]); - } - break; - - case 'Q': - addPoint(subPath, data.slice(0, 2)); - prevCtrlPoint = [data[2] - data[0], data[3] - data[1]]; // Save control point for shorthand - break; - - case 'T': - if ( - basePoint != null && - prev != null && - (prev.command == 'Q' || prev.command == 'T') - ) { - ctrlPoint = [ - basePoint[0] + prevCtrlPoint[0], - basePoint[1] + prevCtrlPoint[1], - ]; - addPoint(subPath, ctrlPoint); - prevCtrlPoint = [data[0] - ctrlPoint[0], data[1] - ctrlPoint[1]]; - } - break; - - case 'C': - if (basePoint != null) { - // Approximate quibic Bezier curve with middle points between control points - addPoint(subPath, [ - 0.5 * (basePoint[0] + data[0]), - 0.5 * (basePoint[1] + data[1]), - ]); - } - addPoint(subPath, [ - 0.5 * (data[0] + data[2]), - 0.5 * (data[1] + data[3]), - ]); - addPoint(subPath, [ - 0.5 * (data[2] + data[4]), - 0.5 * (data[3] + data[5]), - ]); - prevCtrlPoint = [data[4] - data[2], data[5] - data[3]]; // Save control point for shorthand - break; - - case 'S': - if ( - basePoint != null && - prev != null && - (prev.command == 'C' || prev.command == 'S') - ) { - addPoint(subPath, [ - basePoint[0] + 0.5 * prevCtrlPoint[0], - basePoint[1] + 0.5 * prevCtrlPoint[1], - ]); - ctrlPoint = [ - basePoint[0] + prevCtrlPoint[0], - basePoint[1] + prevCtrlPoint[1], - ]; - } - if (ctrlPoint != null) { - addPoint(subPath, [ - 0.5 * (ctrlPoint[0] + data[0]), - 0.5 * (ctrlPoint[1] + data[1]), - ]); - } - addPoint(subPath, [ - 0.5 * (data[0] + data[2]), - 0.5 * (data[1] + data[3]), - ]); - prevCtrlPoint = [data[2] - data[0], data[3] - data[1]]; - break; - - case 'A': - if (basePoint != null) { - // Convert the arc to bezier curves and use the same approximation - // @ts-ignore no idea what's going on here - var curves = a2c.apply(0, basePoint.concat(data)); - for ( - var cData; - (cData = curves.splice(0, 6).map(toAbsolute)).length; - - ) { - if (basePoint != null) { - addPoint(subPath, [ - 0.5 * (basePoint[0] + cData[0]), - 0.5 * (basePoint[1] + cData[1]), - ]); - } - addPoint(subPath, [ - 0.5 * (cData[0] + cData[2]), - 0.5 * (cData[1] + cData[3]), - ]); - addPoint(subPath, [ - 0.5 * (cData[2] + cData[4]), - 0.5 * (cData[3] + cData[5]), - ]); - if (curves.length) addPoint(subPath, (basePoint = cData.slice(-2))); - } - } - break; - } - - // Save final command coordinates - if (data.length >= 2) addPoint(subPath, data.slice(-2)); - } - - return points; -} - -/** - * Forms a convex hull from set of points of every subpath using monotone chain convex hull algorithm. - * https://en.wikibooks.org/wiki/Algorithm_Implementation/Geometry/Convex_hull/Monotone_chain - * - * @type {(points: Point) => Point} - */ -function convexHull(points) { - points.list.sort(function (a, b) { - return a[0] == b[0] ? a[1] - b[1] : a[0] - b[0]; - }); - - var lower = [], - minY = 0, - bottom = 0; - for (let i = 0; i < points.list.length; i++) { - while ( - lower.length >= 2 && - cross(lower[lower.length - 2], lower[lower.length - 1], points.list[i]) <= - 0 - ) { - lower.pop(); - } - if (points.list[i][1] < points.list[minY][1]) { - minY = i; - bottom = lower.length; - } - lower.push(points.list[i]); - } - - var upper = [], - maxY = points.list.length - 1, - top = 0; - for (let i = points.list.length; i--; ) { - while ( - upper.length >= 2 && - cross(upper[upper.length - 2], upper[upper.length - 1], points.list[i]) <= - 0 - ) { - upper.pop(); - } - if (points.list[i][1] > points.list[maxY][1]) { - maxY = i; - top = upper.length; - } - upper.push(points.list[i]); - } - - // last points are equal to starting points of the other part - upper.pop(); - lower.pop(); - - const hullList = lower.concat(upper); - - /** - * @type {Point} - */ - const hull = { - list: hullList, - minX: 0, // by sorting - maxX: lower.length, - minY: bottom, - maxY: (lower.length + top) % hullList.length, - }; - - return hull; -} - -/** - * @type {(o: number[], a: number[], b: number[]) => number} - */ -function cross(o, a, b) { - return (a[0] - o[0]) * (b[1] - o[1]) - (a[1] - o[1]) * (b[0] - o[0]); -} - -/** - * Based on code from Snap.svg (Apache 2 license). http://snapsvg.io/ - * Thanks to Dmitry Baranovskiy for his great work! - * - * @type {( - * x1: number, - * y1: number, - * rx: number, - * ry: number, - * angle: number, - * large_arc_flag: number, - * sweep_flag: number, - * x2: number, - * y2: number, - * recursive: number[] - * ) => number[]} - */ -const a2c = ( - x1, - y1, - rx, - ry, - angle, - large_arc_flag, - sweep_flag, - x2, - y2, - recursive, -) => { - // for more information of where this Math came from visit: - // https://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes - const _120 = (Math.PI * 120) / 180; - const rad = (Math.PI / 180) * (+angle || 0); - /** - * @type {number[]} - */ - let res = []; - /** - * @type {(x: number, y: number, rad: number) => number} - */ - const rotateX = (x, y, rad) => { - return x * Math.cos(rad) - y * Math.sin(rad); - }; - /** - * @type {(x: number, y: number, rad: number) => number} - */ - const rotateY = (x, y, rad) => { - return x * Math.sin(rad) + y * Math.cos(rad); - }; - if (!recursive) { - x1 = rotateX(x1, y1, -rad); - y1 = rotateY(x1, y1, -rad); - x2 = rotateX(x2, y2, -rad); - y2 = rotateY(x2, y2, -rad); - var x = (x1 - x2) / 2, - y = (y1 - y2) / 2; - var h = (x * x) / (rx * rx) + (y * y) / (ry * ry); - if (h > 1) { - h = Math.sqrt(h); - rx = h * rx; - ry = h * ry; - } - var rx2 = rx * rx; - var ry2 = ry * ry; - var k = - (large_arc_flag == sweep_flag ? -1 : 1) * - Math.sqrt( - Math.abs( - (rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x), - ), - ); - var cx = (k * rx * y) / ry + (x1 + x2) / 2; - var cy = (k * -ry * x) / rx + (y1 + y2) / 2; - var f1 = Math.asin(Number(((y1 - cy) / ry).toFixed(9))); - var f2 = Math.asin(Number(((y2 - cy) / ry).toFixed(9))); - - f1 = x1 < cx ? Math.PI - f1 : f1; - f2 = x2 < cx ? Math.PI - f2 : f2; - f1 < 0 && (f1 = Math.PI * 2 + f1); - f2 < 0 && (f2 = Math.PI * 2 + f2); - if (sweep_flag && f1 > f2) { - f1 = f1 - Math.PI * 2; - } - if (!sweep_flag && f2 > f1) { - f2 = f2 - Math.PI * 2; - } - } else { - f1 = recursive[0]; - f2 = recursive[1]; - cx = recursive[2]; - cy = recursive[3]; - } - var df = f2 - f1; - if (Math.abs(df) > _120) { - var f2old = f2, - x2old = x2, - y2old = y2; - f2 = f1 + _120 * (sweep_flag && f2 > f1 ? 1 : -1); - x2 = cx + rx * Math.cos(f2); - y2 = cy + ry * Math.sin(f2); - res = a2c(x2, y2, rx, ry, angle, 0, sweep_flag, x2old, y2old, [ - f2, - f2old, - cx, - cy, - ]); - } - df = f2 - f1; - var c1 = Math.cos(f1), - s1 = Math.sin(f1), - c2 = Math.cos(f2), - s2 = Math.sin(f2), - t = Math.tan(df / 4), - hx = (4 / 3) * rx * t, - hy = (4 / 3) * ry * t, - m = [ - -hx * s1, - hy * c1, - x2 + hx * s2 - x1, - y2 - hy * c2 - y1, - x2 - x1, - y2 - y1, - ]; - if (recursive) { - return m.concat(res); - } else { - res = m.concat(res); - var newres = []; - for (var i = 0, n = res.length; i < n; i++) { - newres[i] = - i % 2 - ? rotateY(res[i - 1], res[i], rad) - : rotateX(res[i], res[i + 1], rad); - } - return newres; - } -}; diff --git a/node_modules/svgo/plugins/_transforms.js b/node_modules/svgo/plugins/_transforms.js deleted file mode 100644 index 1ab6d648..00000000 --- a/node_modules/svgo/plugins/_transforms.js +++ /dev/null @@ -1,410 +0,0 @@ -'use strict'; - -const { toFixed } = require('../lib/svgo/tools'); - -/** - * @typedef {{ name: string, data: number[] }} TransformItem - * @typedef {{ - * convertToShorts: boolean, - * floatPrecision: number, - * transformPrecision: number, - * matrixToTransform: boolean, - * shortTranslate: boolean, - * shortScale: boolean, - * shortRotate: boolean, - * removeUseless: boolean, - * collapseIntoOne: boolean, - * leadingZero: boolean, - * negativeExtraSpace: boolean, - * }} TransformParams - */ - -const transformTypes = new Set([ - 'matrix', - 'rotate', - 'scale', - 'skewX', - 'skewY', - 'translate', -]); - -const regTransformSplit = - /\s*(matrix|translate|scale|rotate|skewX|skewY)\s*\(\s*(.+?)\s*\)[\s,]*/; -const regNumericValues = /[-+]?(?:\d*\.\d+|\d+\.?)(?:[eE][-+]?\d+)?/g; - -/** - * Convert transform string to JS representation. - * - * @param {string} transformString - * @returns {TransformItem[]} Object representation of transform, or an empty array if it was malformed. - */ -exports.transform2js = (transformString) => { - /** @type {TransformItem[]} */ - const transforms = []; - /** @type {?TransformItem} */ - let currentTransform = null; - - // split value into ['', 'translate', '10 50', '', 'scale', '2', '', 'rotate', '-45', ''] - for (const item of transformString.split(regTransformSplit)) { - if (!item) { - continue; - } - - if (transformTypes.has(item)) { - currentTransform = { name: item, data: [] }; - transforms.push(currentTransform); - } else { - let num; - // then split it into [10, 50] and collect as context.data - while ((num = regNumericValues.exec(item))) { - num = Number(num); - if (currentTransform != null) { - currentTransform.data.push(num); - } - } - } - } - - return currentTransform == null || currentTransform.data.length == 0 - ? [] - : transforms; -}; - -/** - * Multiply transforms into one. - * - * @param {TransformItem[]} transforms - * @returns {TransformItem} - */ -exports.transformsMultiply = (transforms) => { - const matrixData = transforms.map((transform) => { - if (transform.name === 'matrix') { - return transform.data; - } - return transformToMatrix(transform); - }); - - const matrixTransform = { - name: 'matrix', - data: - matrixData.length > 0 ? matrixData.reduce(multiplyTransformMatrices) : [], - }; - - return matrixTransform; -}; - -/** - * Math utilities in radians. - */ -const mth = { - /** - * @param {number} deg - * @returns {number} - */ - rad: (deg) => { - return (deg * Math.PI) / 180; - }, - - /** - * @param {number} rad - * @returns {number} - */ - deg: (rad) => { - return (rad * 180) / Math.PI; - }, - - /** - * @param {number} deg - * @returns {number} - */ - cos: (deg) => { - return Math.cos(mth.rad(deg)); - }, - - /** - * @param {number} val - * @param {number} floatPrecision - * @returns {number} - */ - acos: (val, floatPrecision) => { - return toFixed(mth.deg(Math.acos(val)), floatPrecision); - }, - - /** - * @param {number} deg - * @returns {number} - */ - sin: (deg) => { - return Math.sin(mth.rad(deg)); - }, - - /** - * @param {number} val - * @param {number} floatPrecision - * @returns {number} - */ - asin: (val, floatPrecision) => { - return toFixed(mth.deg(Math.asin(val)), floatPrecision); - }, - - /** - * @param {number} deg - * @returns {number} - */ - tan: (deg) => { - return Math.tan(mth.rad(deg)); - }, - - /** - * @param {number} val - * @param {number} floatPrecision - * @returns {number} - */ - atan: (val, floatPrecision) => { - return toFixed(mth.deg(Math.atan(val)), floatPrecision); - }, -}; - -/** - * Decompose matrix into simple transforms. - * - * @param {TransformItem} transform - * @param {TransformParams} params - * @returns {TransformItem[]} - * @see https://frederic-wang.fr/decomposition-of-2d-transform-matrices.html - */ -exports.matrixToTransform = (transform, params) => { - const floatPrecision = params.floatPrecision; - const data = transform.data; - const transforms = []; - - // [..., ..., ..., ..., tx, ty] → translate(tx, ty) - if (data[4] || data[5]) { - transforms.push({ - name: 'translate', - data: data.slice(4, data[5] ? 6 : 5), - }); - } - - let sx = toFixed(Math.hypot(data[0], data[1]), params.transformPrecision); - let sy = toFixed( - (data[0] * data[3] - data[1] * data[2]) / sx, - params.transformPrecision, - ); - const colsSum = data[0] * data[2] + data[1] * data[3]; - const rowsSum = data[0] * data[1] + data[2] * data[3]; - const scaleBefore = rowsSum !== 0 || sx === sy; - - // [sx, 0, tan(a)·sy, sy, 0, 0] → skewX(a)·scale(sx, sy) - if (!data[1] && data[2]) { - transforms.push({ - name: 'skewX', - data: [mth.atan(data[2] / sy, floatPrecision)], - }); - - // [sx, sx·tan(a), 0, sy, 0, 0] → skewY(a)·scale(sx, sy) - } else if (data[1] && !data[2]) { - transforms.push({ - name: 'skewY', - data: [mth.atan(data[1] / data[0], floatPrecision)], - }); - sx = data[0]; - sy = data[3]; - - // [sx·cos(a), sx·sin(a), sy·-sin(a), sy·cos(a), x, y] → rotate(a[, cx, cy])·(scale or skewX) or - // [sx·cos(a), sy·sin(a), sx·-sin(a), sy·cos(a), x, y] → scale(sx, sy)·rotate(a[, cx, cy]) (if !scaleBefore) - } else if (!colsSum || (sx === 1 && sy === 1) || !scaleBefore) { - if (!scaleBefore) { - sx = Math.hypot(data[0], data[2]); - sy = Math.hypot(data[1], data[3]); - - if (toFixed(data[0], params.transformPrecision) < 0) { - sx = -sx; - } - - if ( - data[3] < 0 || - (Math.sign(data[1]) === Math.sign(data[2]) && - toFixed(data[3], params.transformPrecision) === 0) - ) { - sy = -sy; - } - - transforms.push({ name: 'scale', data: [sx, sy] }); - } - const angle = Math.min(Math.max(-1, data[0] / sx), 1); - const rotate = [ - mth.acos(angle, floatPrecision) * - ((scaleBefore ? 1 : sy) * data[1] < 0 ? -1 : 1), - ]; - - if (rotate[0]) { - transforms.push({ name: 'rotate', data: rotate }); - } - - if (rowsSum && colsSum) - transforms.push({ - name: 'skewX', - data: [mth.atan(colsSum / (sx * sx), floatPrecision)], - }); - - // rotate(a, cx, cy) can consume translate() within optional arguments cx, cy (rotation point) - if (rotate[0] && (data[4] || data[5])) { - transforms.shift(); - const oneOverCos = 1 - data[0] / sx; - const sin = data[1] / (scaleBefore ? sx : sy); - const x = data[4] * (scaleBefore ? 1 : sy); - const y = data[5] * (scaleBefore ? 1 : sx); - const denom = (oneOverCos ** 2 + sin ** 2) * (scaleBefore ? 1 : sx * sy); - rotate.push( - (oneOverCos * x - sin * y) / denom, - (oneOverCos * y + sin * x) / denom, - ); - } - - // Too many transformations, return original matrix if it isn't just a scale/translate - } else if (data[1] || data[2]) { - return [transform]; - } - - if ((scaleBefore && (sx != 1 || sy != 1)) || !transforms.length) { - transforms.push({ - name: 'scale', - data: sx == sy ? [sx] : [sx, sy], - }); - } - - return transforms; -}; - -/** - * Convert transform to the matrix data. - * - * @type {(transform: TransformItem) => number[] } - */ -const transformToMatrix = (transform) => { - if (transform.name === 'matrix') { - return transform.data; - } - switch (transform.name) { - case 'translate': - // [1, 0, 0, 1, tx, ty] - return [1, 0, 0, 1, transform.data[0], transform.data[1] || 0]; - case 'scale': - // [sx, 0, 0, sy, 0, 0] - return [ - transform.data[0], - 0, - 0, - transform.data[1] || transform.data[0], - 0, - 0, - ]; - case 'rotate': - // [cos(a), sin(a), -sin(a), cos(a), x, y] - var cos = mth.cos(transform.data[0]), - sin = mth.sin(transform.data[0]), - cx = transform.data[1] || 0, - cy = transform.data[2] || 0; - return [ - cos, - sin, - -sin, - cos, - (1 - cos) * cx + sin * cy, - (1 - cos) * cy - sin * cx, - ]; - case 'skewX': - // [1, 0, tan(a), 1, 0, 0] - return [1, 0, mth.tan(transform.data[0]), 1, 0, 0]; - case 'skewY': - // [1, tan(a), 0, 1, 0, 0] - return [1, mth.tan(transform.data[0]), 0, 1, 0, 0]; - default: - throw Error(`Unknown transform ${transform.name}`); - } -}; - -/** - * Applies transformation to an arc. To do so, we represent ellipse as a matrix, multiply it - * by the transformation matrix and use a singular value decomposition to represent in a form - * rotate(θ)·scale(a b)·rotate(φ). This gives us new ellipse params a, b and θ. - * SVD is being done with the formulae provided by Wolffram|Alpha (svd {{m0, m2}, {m1, m3}}) - * - * @type {( - * cursor: [x: number, y: number], - * arc: number[], - * transform: number[] - * ) => number[]} - */ -exports.transformArc = (cursor, arc, transform) => { - const x = arc[5] - cursor[0]; - const y = arc[6] - cursor[1]; - let a = arc[0]; - let b = arc[1]; - const rot = (arc[2] * Math.PI) / 180; - const cos = Math.cos(rot); - const sin = Math.sin(rot); - // skip if radius is 0 - if (a > 0 && b > 0) { - let h = - Math.pow(x * cos + y * sin, 2) / (4 * a * a) + - Math.pow(y * cos - x * sin, 2) / (4 * b * b); - if (h > 1) { - h = Math.sqrt(h); - a *= h; - b *= h; - } - } - const ellipse = [a * cos, a * sin, -b * sin, b * cos, 0, 0]; - const m = multiplyTransformMatrices(transform, ellipse); - // Decompose the new ellipse matrix - const lastCol = m[2] * m[2] + m[3] * m[3]; - const squareSum = m[0] * m[0] + m[1] * m[1] + lastCol; - const root = - Math.hypot(m[0] - m[3], m[1] + m[2]) * Math.hypot(m[0] + m[3], m[1] - m[2]); - - if (!root) { - // circle - arc[0] = arc[1] = Math.sqrt(squareSum / 2); - arc[2] = 0; - } else { - const majorAxisSqr = (squareSum + root) / 2; - const minorAxisSqr = (squareSum - root) / 2; - const major = Math.abs(majorAxisSqr - lastCol) > 1e-6; - const sub = (major ? majorAxisSqr : minorAxisSqr) - lastCol; - const rowsSum = m[0] * m[2] + m[1] * m[3]; - const term1 = m[0] * sub + m[2] * rowsSum; - const term2 = m[1] * sub + m[3] * rowsSum; - arc[0] = Math.sqrt(majorAxisSqr); - arc[1] = Math.sqrt(minorAxisSqr); - arc[2] = - (((major ? term2 < 0 : term1 > 0) ? -1 : 1) * - Math.acos((major ? term1 : term2) / Math.hypot(term1, term2)) * - 180) / - Math.PI; - } - - if (transform[0] < 0 !== transform[3] < 0) { - // Flip the sweep flag if coordinates are being flipped horizontally XOR vertically - arc[4] = 1 - arc[4]; - } - - return arc; -}; - -/** - * Multiply transformation matrices. - * - * @type {(a: number[], b: number[]) => number[]} - */ -const multiplyTransformMatrices = (a, b) => { - return [ - a[0] * b[0] + a[2] * b[1], - a[1] * b[0] + a[3] * b[1], - a[0] * b[2] + a[2] * b[3], - a[1] * b[2] + a[3] * b[3], - a[0] * b[4] + a[2] * b[5] + a[4], - a[1] * b[4] + a[3] * b[5] + a[5], - ]; -}; diff --git a/node_modules/svgo/plugins/addAttributesToSVGElement.js b/node_modules/svgo/plugins/addAttributesToSVGElement.js deleted file mode 100644 index 845cb056..00000000 --- a/node_modules/svgo/plugins/addAttributesToSVGElement.js +++ /dev/null @@ -1,82 +0,0 @@ -'use strict'; - -exports.name = 'addAttributesToSVGElement'; -exports.description = 'adds attributes to an outer element'; - -var ENOCLS = `Error in plugin "addAttributesToSVGElement": absent parameters. -It should have a list of "attributes" or one "attribute". -Config example: - -plugins: [ - { - name: 'addAttributesToSVGElement', - params: { - attribute: "mySvg" - } - } -] - -plugins: [ - { - name: 'addAttributesToSVGElement', - params: { - attributes: ["mySvg", "size-big"] - } - } -] - -plugins: [ - { - name: 'addAttributesToSVGElement', - params: { - attributes: [ - { - focusable: false - }, - { - 'data-image': icon - } - ] - } - } -] -`; - -/** - * Add attributes to an outer element. Example config: - * - * @author April Arcus - * - * @type {import('./plugins-types').Plugin<'addAttributesToSVGElement'>} - */ -exports.fn = (root, params) => { - if (!Array.isArray(params.attributes) && !params.attribute) { - console.error(ENOCLS); - return null; - } - const attributes = params.attributes || [params.attribute]; - return { - element: { - enter: (node, parentNode) => { - if (node.name === 'svg' && parentNode.type === 'root') { - for (const attribute of attributes) { - if (typeof attribute === 'string') { - if (node.attributes[attribute] == null) { - // @ts-ignore disallow explicit nullable attribute value - node.attributes[attribute] = undefined; - } - } - if (typeof attribute === 'object') { - for (const key of Object.keys(attribute)) { - if (node.attributes[key] == null) { - // @ts-ignore disallow explicit nullable attribute value - node.attributes[key] = attribute[key]; - } - } - } - } - } - }, - }, - }; -}; diff --git a/node_modules/svgo/plugins/addClassesToSVGElement.js b/node_modules/svgo/plugins/addClassesToSVGElement.js deleted file mode 100644 index 1e773d85..00000000 --- a/node_modules/svgo/plugins/addClassesToSVGElement.js +++ /dev/null @@ -1,82 +0,0 @@ -'use strict'; - -exports.name = 'addClassesToSVGElement'; -exports.description = 'adds classnames to an outer 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 element. Example config: - * - * plugins: [ - * { - * name: "addClassesToSVGElement", - * params: { - * className: "mySvg" - * } - * } - * ] - * - * plugins: [ - * { - * name: "addClassesToSVGElement", - * params: { - * classNames: ["mySvg", "size-big"] - * } - * } - * ] - * - * @author April Arcus - * - * @type {import('./plugins-types').Plugin<'addClassesToSVGElement'>} - */ -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(' '); - } - }, - }, - }; -}; diff --git a/node_modules/svgo/plugins/applyTransforms.js b/node_modules/svgo/plugins/applyTransforms.js deleted file mode 100644 index ae492d54..00000000 --- a/node_modules/svgo/plugins/applyTransforms.js +++ /dev/null @@ -1,388 +0,0 @@ -'use strict'; - -/** - * @typedef {import('../lib/types').PathDataItem} PathDataItem - * @typedef {import('../lib/types').XastElement} XastElement - */ - -const { collectStylesheet, computeStyle } = require('../lib/style.js'); -const { - transformsMultiply, - transform2js, - transformArc, -} = require('./_transforms.js'); -const { path2js } = require('./_path.js'); -const { - removeLeadingZero, - includesUrlReference, -} = require('../lib/svgo/tools.js'); -const { referencesProps, attrsGroupsDefaults } = require('./_collections.js'); - -/** - * @typedef {PathDataItem[]} PathData - * @typedef {number[]} Matrix - */ - -const regNumericValues = /[-+]?(\d*\.\d+|\d+\.?)(?:[eE][-+]?\d+)?/g; - -/** - * Apply transformation(s) to the Path data. - * - * @type {import('../lib/types').Plugin<{ - * transformPrecision: number, - * applyTransformsStroked: boolean, - * }>} - */ -const applyTransforms = (root, params) => { - const stylesheet = collectStylesheet(root); - return { - element: { - enter: (node) => { - if (node.attributes.d == null) { - return; - } - - // stroke and stroke-width can be redefined with - if (node.attributes.id != null) { - return; - } - - // if there are no 'stroke' attr and references to other objects such as - // gradients or clip-path which are also subjects to transform. - if ( - node.attributes.transform == null || - node.attributes.transform === '' || - // styles are not considered when applying transform - // can be fixed properly with new style engine - node.attributes.style != null || - Object.entries(node.attributes).some( - ([name, value]) => - referencesProps.has(name) && includesUrlReference(value), - ) - ) { - return; - } - - const computedStyle = computeStyle(stylesheet, node); - const transformStyle = computedStyle.transform; - - // Transform overridden in