'use strict'; // https://www.w3.org/TR/SVG11/intro.html#Definitions /** * @type {Record>} */ exports.elemsGroups = { animation: [ 'animate', 'animateColor', 'animateMotion', 'animateTransform', 'set', ], descriptive: ['desc', 'metadata', 'title'], shape: ['circle', 'ellipse', 'line', 'path', 'polygon', 'polyline', 'rect'], structural: ['defs', 'g', 'svg', 'symbol', 'use'], paintServer: [ 'solidColor', 'linearGradient', 'radialGradient', 'meshGradient', 'pattern', 'hatch', ], nonRendering: [ 'linearGradient', 'radialGradient', 'pattern', 'clipPath', 'mask', 'marker', 'symbol', 'filter', 'solidColor', ], container: [ 'a', 'defs', 'g', 'marker', 'mask', 'missing-glyph', 'pattern', 'svg', 'switch', 'symbol', 'foreignObject', ], textContent: [ 'altGlyph', 'altGlyphDef', 'altGlyphItem', 'glyph', 'glyphRef', 'textPath', 'text', 'tref', 'tspan', ], textContentChild: ['altGlyph', 'textPath', 'tref', 'tspan'], lightSource: [ 'feDiffuseLighting', 'feSpecularLighting', 'feDistantLight', 'fePointLight', 'feSpotLight', ], filterPrimitive: [ 'feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feDropShadow', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology', 'feOffset', 'feSpecularLighting', 'feTile', 'feTurbulence', ], }; exports.textElems = exports.elemsGroups.textContent.concat('title'); exports.pathElems = ['path', 'glyph', 'missing-glyph']; // https://www.w3.org/TR/SVG11/intro.html#Definitions /** * @type {Record>} */ exports.attrsGroups = { animationAddition: ['additive', 'accumulate'], animationAttributeTarget: ['attributeType', 'attributeName'], animationEvent: ['onbegin', 'onend', 'onrepeat', 'onload'], animationTiming: [ 'begin', 'dur', 'end', 'min', 'max', 'restart', 'repeatCount', 'repeatDur', 'fill', ], animationValue: [ 'calcMode', 'values', 'keyTimes', 'keySplines', 'from', 'to', 'by', ], conditionalProcessing: [ 'requiredFeatures', 'requiredExtensions', 'systemLanguage', ], core: ['id', 'tabindex', 'xml:base', 'xml:lang', 'xml:space'], graphicalEvent: [ 'onfocusin', 'onfocusout', 'onactivate', 'onclick', 'onmousedown', 'onmouseup', 'onmouseover', 'onmousemove', 'onmouseout', 'onload', ], presentation: [ 'alignment-baseline', 'baseline-shift', 'clip', 'clip-path', 'clip-rule', 'color', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'cursor', 'direction', 'display', 'dominant-baseline', 'enable-background', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', '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', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke-width', 'text-anchor', 'text-decoration', 'text-overflow', 'text-rendering', 'transform', 'transform-origin', 'unicode-bidi', 'vector-effect', 'visibility', 'word-spacing', 'writing-mode', ], xlink: [ 'xlink:href', 'xlink:show', 'xlink:actuate', 'xlink:type', 'xlink:role', 'xlink:arcrole', 'xlink:title', ], documentEvent: [ 'onunload', 'onabort', 'onerror', 'onresize', 'onscroll', 'onzoom', ], filterPrimitive: ['x', 'y', 'width', 'height', 'result'], transferFunction: [ 'type', 'tableValues', 'slope', 'intercept', 'amplitude', 'exponent', 'offset', ], }; /** * @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', }, }; // https://www.w3.org/TR/SVG11/eltindex.html /** * @type {Record, * attrs?: Array, * defaults?: Record, * contentGroups?: Array, * content?: Array, * }>} */ exports.elems = { a: { attrsGroups: [ 'conditionalProcessing', 'core', 'graphicalEvent', 'presentation', 'xlink', ], attrs: [ 'class', 'style', 'externalResourcesRequired', 'transform', 'target', ], defaults: { target: '_self', }, contentGroups: [ 'animation', 'descriptive', 'shape', 'structural', 'paintServer', ], content: [ 'a', 'altGlyphDef', 'clipPath', 'color-profile', 'cursor', 'filter', 'font', 'font-face', 'foreignObject', 'image', 'marker', 'mask', 'pattern', 'script', 'style', 'switch', 'text', 'view', // not spec compliant 'tspan', ], }, altGlyph: { attrsGroups: [ 'conditionalProcessing', 'core', 'graphicalEvent', 'presentation', 'xlink', ], attrs: [ 'class', 'style', 'externalResourcesRequired', 'x', 'y', 'dx', 'dy', 'glyphRef', 'format', 'rotate', ], }, altGlyphDef: { attrsGroups: ['core'], content: ['glyphRef'], }, altGlyphItem: { attrsGroups: ['core'], content: ['glyphRef', 'altGlyphItem'], }, animate: { attrsGroups: [ 'conditionalProcessing', 'core', 'animationAddition', 'animationAttributeTarget', 'animationEvent', 'animationTiming', 'animationValue', 'presentation', 'xlink', ], attrs: ['externalResourcesRequired'], contentGroups: ['descriptive'], }, animateColor: { attrsGroups: [ 'conditionalProcessing', 'core', 'animationEvent', 'xlink', 'animationAttributeTarget', 'animationTiming', 'animationValue', 'animationAddition', 'presentation', ], attrs: ['externalResourcesRequired'], contentGroups: ['descriptive'], }, animateMotion: { attrsGroups: [ 'conditionalProcessing', 'core', 'animationEvent', 'xlink', 'animationTiming', 'animationValue', 'animationAddition', ], attrs: [ 'externalResourcesRequired', 'path', 'keyPoints', 'rotate', 'origin', ], defaults: { rotate: '0', }, contentGroups: ['descriptive'], content: ['mpath'], }, animateTransform: { attrsGroups: [ 'conditionalProcessing', 'core', 'animationEvent', 'xlink', 'animationAttributeTarget', 'animationTiming', 'animationValue', 'animationAddition', ], attrs: ['externalResourcesRequired', 'type'], contentGroups: ['descriptive'], }, circle: { attrsGroups: [ 'conditionalProcessing', 'core', 'graphicalEvent', 'presentation', ], attrs: [ 'class', 'style', 'externalResourcesRequired', 'transform', 'cx', 'cy', 'r', ], defaults: { cx: '0', cy: '0', }, contentGroups: ['animation', 'descriptive'], }, clipPath: { attrsGroups: ['conditionalProcessing', 'core', 'presentation'], attrs: [ 'class', 'style', 'externalResourcesRequired', 'transform', 'clipPathUnits', ], defaults: { clipPathUnits: 'userSpaceOnUse', }, contentGroups: ['animation', 'descriptive', 'shape'], content: ['text', 'use'], }, 'color-profile': { attrsGroups: ['core', 'xlink'], attrs: ['local', 'name', 'rendering-intent'], defaults: { name: 'sRGB', 'rendering-intent': 'auto', }, contentGroups: ['descriptive'], }, cursor: { attrsGroups: ['core', 'conditionalProcessing', 'xlink'], attrs: ['externalResourcesRequired', 'x', 'y'], defaults: { x: '0', y: '0', }, contentGroups: ['descriptive'], }, defs: { attrsGroups: [ 'conditionalProcessing', 'core', 'graphicalEvent', 'presentation', ], attrs: ['class', 'style', 'externalResourcesRequired', 'transform'], contentGroups: [ 'animation', 'descriptive', 'shape', 'structural', 'paintServer', ], content: [ 'a', 'altGlyphDef', 'clipPath', 'color-profile', 'cursor', 'filter', 'font', 'font-face', 'foreignObject', 'image', 'marker', 'mask', 'pattern', 'script', 'style', 'switch', 'text', 'view', ], }, desc: { attrsGroups: ['core'], attrs: ['class', 'style'], }, ellipse: { attrsGroups: [ 'conditionalProcessing', 'core', 'graphicalEvent', 'presentation', ], attrs: [ 'class', 'style', 'externalResourcesRequired', 'transform', 'cx', 'cy', 'rx', 'ry', ], defaults: { cx: '0', cy: '0', }, contentGroups: ['animation', 'descriptive'], }, feBlend: { attrsGroups: ['core', 'presentation', 'filterPrimitive'], attrs: [ '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: ['animate', 'set'], }, feColorMatrix: { attrsGroups: ['core', 'presentation', 'filterPrimitive'], attrs: ['class', 'style', 'in', 'type', 'values'], defaults: { type: 'matrix', }, content: ['animate', 'set'], }, feComponentTransfer: { attrsGroups: ['core', 'presentation', 'filterPrimitive'], attrs: ['class', 'style', 'in'], content: ['feFuncA', 'feFuncB', 'feFuncG', 'feFuncR'], }, feComposite: { attrsGroups: ['core', 'presentation', 'filterPrimitive'], attrs: ['class', 'style', 'in', 'in2', 'operator', 'k1', 'k2', 'k3', 'k4'], defaults: { operator: 'over', k1: '0', k2: '0', k3: '0', k4: '0', }, content: ['animate', 'set'], }, feConvolveMatrix: { attrsGroups: ['core', 'presentation', 'filterPrimitive'], attrs: [ 'class', 'style', 'in', 'order', 'kernelMatrix', // 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' 'divisor', 'bias', // TODO: targetX - 'By default, the convolution matrix is centered in X over each // pixel of the input image (i.e., targetX = floor ( orderX / 2 ))' 'targetX', 'targetY', 'edgeMode', // 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: ['animate', 'set'], }, feDiffuseLighting: { attrsGroups: ['core', 'presentation', 'filterPrimitive'], attrs: [ 'class', 'style', 'in', 'surfaceScale', 'diffuseConstant', 'kernelUnitLength', ], defaults: { surfaceScale: '1', diffuseConstant: '1', }, contentGroups: ['descriptive'], content: [ // TODO: 'exactly one light source element, in any order' 'feDistantLight', 'fePointLight', 'feSpotLight', ], }, feDisplacementMap: { attrsGroups: ['core', 'presentation', 'filterPrimitive'], attrs: [ 'class', 'style', 'in', 'in2', 'scale', 'xChannelSelector', 'yChannelSelector', ], defaults: { scale: '0', xChannelSelector: 'A', yChannelSelector: 'A', }, content: ['animate', 'set'], }, feDistantLight: { attrsGroups: ['core'], attrs: ['azimuth', 'elevation'], defaults: { azimuth: '0', elevation: '0', }, content: ['animate', 'set'], }, feFlood: { attrsGroups: ['core', 'presentation', 'filterPrimitive'], attrs: ['class', 'style'], content: ['animate', 'animateColor', 'set'], }, feFuncA: { attrsGroups: ['core', 'transferFunction'], content: ['set', 'animate'], }, feFuncB: { attrsGroups: ['core', 'transferFunction'], content: ['set', 'animate'], }, feFuncG: { attrsGroups: ['core', 'transferFunction'], content: ['set', 'animate'], }, feFuncR: { attrsGroups: ['core', 'transferFunction'], content: ['set', 'animate'], }, feGaussianBlur: { attrsGroups: ['core', 'presentation', 'filterPrimitive'], attrs: ['class', 'style', 'in', 'stdDeviation'], defaults: { stdDeviation: '0', }, content: ['set', 'animate'], }, feImage: { attrsGroups: ['core', 'presentation', 'filterPrimitive', 'xlink'], attrs: [ 'class', 'style', 'externalResourcesRequired', 'preserveAspectRatio', 'href', 'xlink:href', ], defaults: { preserveAspectRatio: 'xMidYMid meet', }, content: ['animate', 'animateTransform', 'set'], }, feMerge: { attrsGroups: ['core', 'presentation', 'filterPrimitive'], attrs: ['class', 'style'], content: ['feMergeNode'], }, feMergeNode: { attrsGroups: ['core'], attrs: ['in'], content: ['animate', 'set'], }, feMorphology: { attrsGroups: ['core', 'presentation', 'filterPrimitive'], attrs: ['class', 'style', 'in', 'operator', 'radius'], defaults: { operator: 'erode', radius: '0', }, content: ['animate', 'set'], }, feOffset: { attrsGroups: ['core', 'presentation', 'filterPrimitive'], attrs: ['class', 'style', 'in', 'dx', 'dy'], defaults: { dx: '0', dy: '0', }, content: ['animate', 'set'], }, fePointLight: { attrsGroups: ['core'], attrs: ['x', 'y', 'z'], defaults: { x: '0', y: '0', z: '0', }, content: ['animate', 'set'], }, feSpecularLighting: { attrsGroups: ['core', 'presentation', 'filterPrimitive'], attrs: [ 'class', 'style', 'in', 'surfaceScale', 'specularConstant', 'specularExponent', 'kernelUnitLength', ], defaults: { surfaceScale: '1', specularConstant: '1', specularExponent: '1', }, contentGroups: [ 'descriptive', // TODO: exactly one 'light source element' 'lightSource', ], }, feSpotLight: { attrsGroups: ['core'], attrs: [ 'x', 'y', 'z', 'pointsAtX', 'pointsAtY', 'pointsAtZ', 'specularExponent', 'limitingConeAngle', ], defaults: { x: '0', y: '0', z: '0', pointsAtX: '0', pointsAtY: '0', pointsAtZ: '0', specularExponent: '1', }, content: ['animate', 'set'], }, feTile: { attrsGroups: ['core', 'presentation', 'filterPrimitive'], attrs: ['class', 'style', 'in'], content: ['animate', 'set'], }, feTurbulence: { attrsGroups: ['core', 'presentation', 'filterPrimitive'], attrs: [ 'class', 'style', 'baseFrequency', 'numOctaves', 'seed', 'stitchTiles', 'type', ], defaults: { baseFrequency: '0', numOctaves: '1', seed: '0', stitchTiles: 'noStitch', type: 'turbulence', }, content: ['animate', 'set'], }, filter: { attrsGroups: ['core', 'presentation', 'xlink'], attrs: [ 'class', 'style', 'externalResourcesRequired', 'x', 'y', 'width', 'height', 'filterRes', 'filterUnits', 'primitiveUnits', 'href', 'xlink:href', ], defaults: { primitiveUnits: 'userSpaceOnUse', x: '-10%', y: '-10%', width: '120%', height: '120%', }, contentGroups: ['descriptive', 'filterPrimitive'], content: ['animate', 'set'], }, font: { attrsGroups: ['core', 'presentation'], attrs: [ 'class', 'style', 'externalResourcesRequired', 'horiz-origin-x', 'horiz-origin-y', 'horiz-adv-x', 'vert-origin-x', 'vert-origin-y', 'vert-adv-y', ], defaults: { 'horiz-origin-x': '0', 'horiz-origin-y': '0', }, contentGroups: ['descriptive'], content: ['font-face', 'glyph', 'hkern', 'missing-glyph', 'vkern'], }, 'font-face': { attrsGroups: ['core'], attrs: [ '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: ['descriptive'], content: [ // TODO: "at most one 'font-face-src' element" 'font-face-src', ], }, // TODO: empty content 'font-face-format': { attrsGroups: ['core'], attrs: ['string'], }, 'font-face-name': { attrsGroups: ['core'], attrs: ['name'], }, 'font-face-src': { attrsGroups: ['core'], content: ['font-face-name', 'font-face-uri'], }, 'font-face-uri': { attrsGroups: ['core', 'xlink'], attrs: ['href', 'xlink:href'], content: ['font-face-format'], }, foreignObject: { attrsGroups: [ 'core', 'conditionalProcessing', 'graphicalEvent', 'presentation', ], attrs: [ 'class', 'style', 'externalResourcesRequired', 'transform', 'x', 'y', 'width', 'height', ], defaults: { x: '0', y: '0', }, }, g: { attrsGroups: [ 'conditionalProcessing', 'core', 'graphicalEvent', 'presentation', ], attrs: ['class', 'style', 'externalResourcesRequired', 'transform'], contentGroups: [ 'animation', 'descriptive', 'shape', 'structural', 'paintServer', ], content: [ 'a', 'altGlyphDef', 'clipPath', 'color-profile', 'cursor', 'filter', 'font', 'font-face', 'foreignObject', 'image', 'marker', 'mask', 'pattern', 'script', 'style', 'switch', 'text', 'view', ], }, glyph: { attrsGroups: ['core', 'presentation'], attrs: [ 'class', 'style', 'd', 'horiz-adv-x', 'vert-origin-x', 'vert-origin-y', 'vert-adv-y', 'unicode', 'glyph-name', 'orientation', 'arabic-form', 'lang', ], defaults: { 'arabic-form': 'initial', }, contentGroups: [ 'animation', 'descriptive', 'shape', 'structural', 'paintServer', ], content: [ 'a', 'altGlyphDef', 'clipPath', 'color-profile', 'cursor', 'filter', 'font', 'font-face', 'foreignObject', 'image', 'marker', 'mask', 'pattern', 'script', 'style', 'switch', 'text', 'view', ], }, glyphRef: { attrsGroups: ['core', 'presentation'], attrs: [ 'class', 'style', 'd', 'horiz-adv-x', 'vert-origin-x', 'vert-origin-y', 'vert-adv-y', ], contentGroups: [ 'animation', 'descriptive', 'shape', 'structural', 'paintServer', ], content: [ 'a', 'altGlyphDef', 'clipPath', 'color-profile', 'cursor', 'filter', 'font', 'font-face', 'foreignObject', 'image', 'marker', 'mask', 'pattern', 'script', 'style', 'switch', 'text', 'view', ], }, hatch: { attrsGroups: ['core', 'presentation', 'xlink'], attrs: [ 'class', 'style', 'x', 'y', 'pitch', 'rotate', 'hatchUnits', 'hatchContentUnits', 'transform', ], defaults: { hatchUnits: 'objectBoundingBox', hatchContentUnits: 'userSpaceOnUse', x: '0', y: '0', pitch: '0', rotate: '0', }, contentGroups: ['animation', 'descriptive'], content: ['hatchPath'], }, hatchPath: { attrsGroups: ['core', 'presentation', 'xlink'], attrs: ['class', 'style', 'd', 'offset'], defaults: { offset: '0', }, contentGroups: ['animation', 'descriptive'], }, hkern: { attrsGroups: ['core'], attrs: ['u1', 'g1', 'u2', 'g2', 'k'], }, image: { attrsGroups: [ 'core', 'conditionalProcessing', 'graphicalEvent', 'xlink', 'presentation', ], attrs: [ 'class', 'style', 'externalResourcesRequired', 'preserveAspectRatio', 'transform', 'x', 'y', 'width', 'height', 'href', 'xlink:href', ], defaults: { x: '0', y: '0', preserveAspectRatio: 'xMidYMid meet', }, contentGroups: ['animation', 'descriptive'], }, line: { attrsGroups: [ 'conditionalProcessing', 'core', 'graphicalEvent', 'presentation', ], attrs: [ 'class', 'style', 'externalResourcesRequired', 'transform', 'x1', 'y1', 'x2', 'y2', ], defaults: { x1: '0', y1: '0', x2: '0', y2: '0', }, contentGroups: ['animation', 'descriptive'], }, linearGradient: { attrsGroups: ['core', 'presentation', 'xlink'], attrs: [ 'class', 'style', 'externalResourcesRequired', 'x1', 'y1', 'x2', 'y2', 'gradientUnits', 'gradientTransform', 'spreadMethod', 'href', 'xlink:href', ], defaults: { x1: '0', y1: '0', x2: '100%', y2: '0', spreadMethod: 'pad', }, contentGroups: ['descriptive'], content: ['animate', 'animateTransform', 'set', 'stop'], }, marker: { attrsGroups: ['core', 'presentation'], attrs: [ 'class', 'style', 'externalResourcesRequired', 'viewBox', 'preserveAspectRatio', 'refX', 'refY', 'markerUnits', 'markerWidth', 'markerHeight', 'orient', ], defaults: { markerUnits: 'strokeWidth', refX: '0', refY: '0', markerWidth: '3', markerHeight: '3', }, contentGroups: [ 'animation', 'descriptive', 'shape', 'structural', 'paintServer', ], content: [ 'a', 'altGlyphDef', 'clipPath', 'color-profile', 'cursor', 'filter', 'font', 'font-face', 'foreignObject', 'image', 'marker', 'mask', 'pattern', 'script', 'style', 'switch', 'text', 'view', ], }, mask: { attrsGroups: ['conditionalProcessing', 'core', 'presentation'], attrs: [ 'class', 'style', 'externalResourcesRequired', 'x', 'y', 'width', 'height', 'mask-type', 'maskUnits', 'maskContentUnits', ], defaults: { maskUnits: 'objectBoundingBox', maskContentUnits: 'userSpaceOnUse', x: '-10%', y: '-10%', width: '120%', height: '120%', }, contentGroups: [ 'animation', 'descriptive', 'shape', 'structural', 'paintServer', ], content: [ 'a', 'altGlyphDef', 'clipPath', 'color-profile', 'cursor', 'filter', 'font', 'font-face', 'foreignObject', 'image', 'marker', 'mask', 'pattern', 'script', 'style', 'switch', 'text', 'view', ], }, metadata: { attrsGroups: ['core'], }, 'missing-glyph': { attrsGroups: ['core', 'presentation'], attrs: [ 'class', 'style', 'd', 'horiz-adv-x', 'vert-origin-x', 'vert-origin-y', 'vert-adv-y', ], contentGroups: [ 'animation', 'descriptive', 'shape', 'structural', 'paintServer', ], content: [ 'a', 'altGlyphDef', 'clipPath', 'color-profile', 'cursor', 'filter', 'font', 'font-face', 'foreignObject', 'image', 'marker', 'mask', 'pattern', 'script', 'style', 'switch', 'text', 'view', ], }, mpath: { attrsGroups: ['core', 'xlink'], attrs: ['externalResourcesRequired', 'href', 'xlink:href'], contentGroups: ['descriptive'], }, path: { attrsGroups: [ 'conditionalProcessing', 'core', 'graphicalEvent', 'presentation', ], attrs: [ 'class', 'style', 'externalResourcesRequired', 'transform', 'd', 'pathLength', ], contentGroups: ['animation', 'descriptive'], }, pattern: { attrsGroups: ['conditionalProcessing', 'core', 'presentation', 'xlink'], attrs: [ 'class', 'style', 'externalResourcesRequired', 'viewBox', 'preserveAspectRatio', 'x', 'y', 'width', 'height', 'patternUnits', 'patternContentUnits', 'patternTransform', 'href', 'xlink:href', ], defaults: { patternUnits: 'objectBoundingBox', patternContentUnits: 'userSpaceOnUse', x: '0', y: '0', width: '0', height: '0', preserveAspectRatio: 'xMidYMid meet', }, contentGroups: [ 'animation', 'descriptive', 'paintServer', 'shape', 'structural', ], content: [ 'a', 'altGlyphDef', 'clipPath', 'color-profile', 'cursor', 'filter', 'font', 'font-face', 'foreignObject', 'image', 'marker', 'mask', 'pattern', 'script', 'style', 'switch', 'text', 'view', ], }, polygon: { attrsGroups: [ 'conditionalProcessing', 'core', 'graphicalEvent', 'presentation', ], attrs: [ 'class', 'style', 'externalResourcesRequired', 'transform', 'points', ], contentGroups: ['animation', 'descriptive'], }, polyline: { attrsGroups: [ 'conditionalProcessing', 'core', 'graphicalEvent', 'presentation', ], attrs: [ 'class', 'style', 'externalResourcesRequired', 'transform', 'points', ], contentGroups: ['animation', 'descriptive'], }, radialGradient: { attrsGroups: ['core', 'presentation', 'xlink'], attrs: [ 'class', 'style', 'externalResourcesRequired', 'cx', 'cy', 'r', 'fx', 'fy', 'fr', 'gradientUnits', 'gradientTransform', 'spreadMethod', 'href', 'xlink:href', ], defaults: { gradientUnits: 'objectBoundingBox', cx: '50%', cy: '50%', r: '50%', }, contentGroups: ['descriptive'], content: ['animate', 'animateTransform', 'set', 'stop'], }, meshGradient: { attrsGroups: ['core', 'presentation', 'xlink'], attrs: ['class', 'style', 'x', 'y', 'gradientUnits', 'transform'], contentGroups: ['descriptive', 'paintServer', 'animation'], content: ['meshRow'], }, meshRow: { attrsGroups: ['core', 'presentation'], attrs: ['class', 'style'], contentGroups: ['descriptive'], content: ['meshPatch'], }, meshPatch: { attrsGroups: ['core', 'presentation'], attrs: ['class', 'style'], contentGroups: ['descriptive'], content: ['stop'], }, rect: { attrsGroups: [ 'conditionalProcessing', 'core', 'graphicalEvent', 'presentation', ], attrs: [ 'class', 'style', 'externalResourcesRequired', 'transform', 'x', 'y', 'width', 'height', 'rx', 'ry', ], defaults: { x: '0', y: '0', }, contentGroups: ['animation', 'descriptive'], }, script: { attrsGroups: ['core', 'xlink'], attrs: ['externalResourcesRequired', 'type', 'href', 'xlink:href'], }, set: { attrsGroups: [ 'conditionalProcessing', 'core', 'animation', 'xlink', 'animationAttributeTarget', 'animationTiming', ], attrs: ['externalResourcesRequired', 'to'], contentGroups: ['descriptive'], }, solidColor: { attrsGroups: ['core', 'presentation'], attrs: ['class', 'style'], contentGroups: ['paintServer'], }, stop: { attrsGroups: ['core', 'presentation'], attrs: ['class', 'style', 'offset', 'path'], content: ['animate', 'animateColor', 'set'], }, style: { attrsGroups: ['core'], attrs: ['type', 'media', 'title'], defaults: { type: 'text/css', }, }, svg: { attrsGroups: [ 'conditionalProcessing', 'core', 'documentEvent', 'graphicalEvent', 'presentation', ], attrs: [ 'class', 'style', 'x', 'y', 'width', 'height', 'viewBox', 'preserveAspectRatio', 'zoomAndPan', 'version', 'baseProfile', 'contentScriptType', 'contentStyleType', ], 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: [ 'animation', 'descriptive', 'shape', 'structural', 'paintServer', ], content: [ 'a', 'altGlyphDef', 'clipPath', 'color-profile', 'cursor', 'filter', 'font', 'font-face', 'foreignObject', 'image', 'marker', 'mask', 'pattern', 'script', 'style', 'switch', 'text', 'view', ], }, switch: { attrsGroups: [ 'conditionalProcessing', 'core', 'graphicalEvent', 'presentation', ], attrs: ['class', 'style', 'externalResourcesRequired', 'transform'], contentGroups: ['animation', 'descriptive', 'shape'], content: [ 'a', 'foreignObject', 'g', 'image', 'svg', 'switch', 'text', 'use', ], }, symbol: { attrsGroups: ['core', 'graphicalEvent', 'presentation'], attrs: [ 'class', 'style', 'externalResourcesRequired', 'preserveAspectRatio', 'viewBox', 'refX', 'refY', ], defaults: { refX: '0', refY: '0', }, contentGroups: [ 'animation', 'descriptive', 'shape', 'structural', 'paintServer', ], content: [ 'a', 'altGlyphDef', 'clipPath', 'color-profile', 'cursor', 'filter', 'font', 'font-face', 'foreignObject', 'image', 'marker', 'mask', 'pattern', 'script', 'style', 'switch', 'text', 'view', ], }, text: { attrsGroups: [ 'conditionalProcessing', 'core', 'graphicalEvent', 'presentation', ], attrs: [ 'class', 'style', 'externalResourcesRequired', 'transform', 'lengthAdjust', 'x', 'y', 'dx', 'dy', 'rotate', 'textLength', ], defaults: { x: '0', y: '0', lengthAdjust: 'spacing', }, contentGroups: ['animation', 'descriptive', 'textContentChild'], content: ['a'], }, textPath: { attrsGroups: [ 'conditionalProcessing', 'core', 'graphicalEvent', 'presentation', 'xlink', ], attrs: [ 'class', 'style', 'externalResourcesRequired', 'href', 'xlink:href', 'startOffset', 'method', 'spacing', 'd', ], defaults: { startOffset: '0', method: 'align', spacing: 'exact', }, contentGroups: ['descriptive'], content: [ 'a', 'altGlyph', 'animate', 'animateColor', 'set', 'tref', 'tspan', ], }, title: { attrsGroups: ['core'], attrs: ['class', 'style'], }, tref: { attrsGroups: [ 'conditionalProcessing', 'core', 'graphicalEvent', 'presentation', 'xlink', ], attrs: [ 'class', 'style', 'externalResourcesRequired', 'href', 'xlink:href', ], contentGroups: ['descriptive'], content: ['animate', 'animateColor', 'set'], }, tspan: { attrsGroups: [ 'conditionalProcessing', 'core', 'graphicalEvent', 'presentation', ], attrs: [ 'class', 'style', 'externalResourcesRequired', 'x', 'y', 'dx', 'dy', 'rotate', 'textLength', 'lengthAdjust', ], contentGroups: ['descriptive'], content: [ 'a', 'altGlyph', 'animate', 'animateColor', 'set', 'tref', 'tspan', ], }, use: { attrsGroups: [ 'core', 'conditionalProcessing', 'graphicalEvent', 'presentation', 'xlink', ], attrs: [ 'class', 'style', 'externalResourcesRequired', 'transform', 'x', 'y', 'width', 'height', 'href', 'xlink:href', ], defaults: { x: '0', y: '0', }, contentGroups: ['animation', 'descriptive'], }, view: { attrsGroups: ['core'], attrs: [ 'externalResourcesRequired', 'viewBox', 'preserveAspectRatio', 'zoomAndPan', 'viewTarget', ], contentGroups: ['descriptive'], }, vkern: { attrsGroups: ['core'], attrs: ['u1', 'g1', 'u2', 'g2', 'k'], }, }; // https://wiki.inkscape.org/wiki/index.php/Inkscape-specific_XML_attributes exports.editorNamespaces = [ 'http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd', 'http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd', 'http://www.inkscape.org/namespaces/inkscape', 'http://www.bohemiancoding.com/sketch/ns', 'http://ns.adobe.com/AdobeIllustrator/10.0/', 'http://ns.adobe.com/Graphs/1.0/', 'http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/', 'http://ns.adobe.com/Variables/1.0/', 'http://ns.adobe.com/SaveForWeb/1.0/', 'http://ns.adobe.com/Extensibility/1.0/', 'http://ns.adobe.com/Flows/1.0/', 'http://ns.adobe.com/ImageReplacement/1.0/', 'http://ns.adobe.com/GenericCustomNamespace/1.0/', 'http://ns.adobe.com/XPath/1.0/', 'http://schemas.microsoft.com/visio/2003/SVGExtensions/', 'http://taptrix.com/vectorillustrator/svg_extensions', 'http://www.figma.com/figma/ns', 'http://purl.org/dc/elements/1.1/', 'http://creativecommons.org/ns#', 'http://www.w3.org/1999/02/22-rdf-syntax-ns#', 'http://www.serif.com/', 'http://www.vector.evaxdesign.sk', ]; // https://www.w3.org/TR/SVG11/linking.html#processingIRI exports.referencesProps = [ 'clip-path', 'color-profile', 'fill', 'filter', 'marker-start', 'marker-mid', 'marker-end', 'mask', 'stroke', 'style', ]; // https://www.w3.org/TR/SVG11/propidx.html exports.inheritableAttrs = [ 'clip-rule', 'color', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'cursor', 'direction', 'dominant-baseline', 'fill', 'fill-opacity', 'fill-rule', 'font', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'glyph-orientation-horizontal', 'glyph-orientation-vertical', 'image-rendering', 'letter-spacing', 'marker', 'marker-end', 'marker-mid', 'marker-start', 'paint-order', 'pointer-events', 'shape-rendering', 'stroke', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke-width', 'text-anchor', 'text-rendering', 'transform', 'visibility', 'word-spacing', 'writing-mode', ]; exports.presentationNonInheritableGroupAttrs = [ 'display', 'clip-path', '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', }; // https://www.w3.org/TR/SVG11/single-page.html#types-DataTypeColor exports.colorsProps = [ 'color', 'fill', 'stroke', 'stop-color', 'flood-color', 'lighting-color', ];