@svgd/core
Version:
An SVG optimization tool that converts SVG files into a single path 'd' attribute string for efficient storage and rendering.
1 lines • 35.7 kB
Source Map (JSON)
{"version":3,"sources":["../src/index.ts","../src/commands.ts","../src/getPaths.ts","../src/getSvg.ts","../src/convertRoundedRectToPath.ts","../src/defaultConfig.ts","../src/resizePlugin.ts","../src/inlineUsePlugin.ts","../src/moveGroupOpacityToElementsPlugin.ts","../src/getSvgoConfig.ts"],"sourcesContent":["export { getPaths } from './getPaths';\nexport { getSvg } from './getSvg';\nexport { getSvgoConfig } from './getSvgoConfig';\nexport { defaultConfig } from './defaultConfig';\n\nexport type { SVGDConfig } from \"./defaultConfig\";\nexport type { ResizeParams } from \"./resizePlugin\";\nexport type { PathAttributes, Comand } from \"./commands\";\n","export interface PathAttributes {\n d: string;\n opacity?: string;\n \"fill-opacity\"?: string;\n \"stroke-opacity\"?: string;\n stroke?: string;\n fill?: string;\n \"stroke-width\"?: string;\n \"fill-rule\"?: string;\n}\n\nexport interface Comand {\n code: string,\n attribute: keyof PathAttributes,\n regexp: string,\n toAttribute: (codeValue: string) => string,\n toCommand: (attributeValue: string) => string | null,\n}\n\nexport const commands: Comand[] = [\n {\n code: \"o\",\n attribute: \"opacity\",\n regexp: \"[\\\\d.]+\",\n toAttribute: (codeValue) => codeValue,\n toCommand: (attributeValue) => attributeValue,\n },\n {\n code: \"of\",\n attribute: \"fill-opacity\",\n regexp: \"[\\\\d.]+\",\n toAttribute: (codeValue) => codeValue,\n toCommand: (attributeValue) => attributeValue,\n },\n {\n code: \"os\",\n attribute: \"stroke-opacity\",\n regexp: \"[\\\\d.]+\",\n toAttribute: (codeValue) => codeValue,\n toCommand: (attributeValue) => attributeValue,\n },\n {\n code: \"f\",\n attribute: \"stroke\",\n regexp: \"[#0-9a-zA-Z]+\",\n toAttribute: (codeValue) => {\n switch (codeValue) {\n case 'c': return 'currentColor';\n case 'n': return 'none';\n default: return codeValue;\n }\n },\n toCommand: (attributeValue) => {\n switch (attributeValue) {\n case 'currentColor': return 'c';\n case 'none': return 'n';\n default: return attributeValue;\n }\n },\n },\n {\n code: \"F\",\n attribute: \"fill\",\n regexp: \"[#0-9a-zA-Z]+\",\n toAttribute: (codeValue) => {\n switch (codeValue) {\n case 'c': return 'currentColor';\n case 'n': return 'none';\n default: return codeValue;\n }\n },\n toCommand: (attributeValue) => {\n switch (attributeValue) {\n case 'currentColor': return null;\n case 'none': return 'n';\n default: return attributeValue;\n }\n },\n },\n {\n code: \"w\",\n attribute: \"stroke-width\",\n regexp: \"[\\\\d.]+\",\n toAttribute: (codeValue) => codeValue,\n toCommand: (attributeValue) => attributeValue,\n },\n {\n code: \"e\",\n attribute: \"fill-rule\",\n regexp: \"\",\n toAttribute: () => 'evenodd',\n toCommand: (attributeValue) => attributeValue === 'evenodd' ? '' : null,\n }\n]\n","import { commands, PathAttributes } from \"./commands\";\n\n\nexport function getPaths(d: string): PathAttributes[] {\n const paths: PathAttributes[] = [];\n let attributes: Partial<PathAttributes> = {};\n\n const pathCommands: string[] = d.split(new RegExp(\n `(${commands.map(cmd => `${cmd.code}${cmd.regexp}`).join('|')})`\n ));\n pathCommands.forEach((text, i) => {\n const isCommand = i % 2 === 1;\n if (isCommand) {\n commands.forEach(({ code, attribute, regexp, toAttribute }) => {\n const match = text.match(new RegExp(`^${code}(${regexp})$`));\n if (match) {\n attributes[attribute] = toAttribute(match[1]);\n }\n });\n return;\n }\n const d = text.trim();\n if (d) {\n paths.push({ ...attributes, d });\n attributes = {};\n }\n });\n\n return paths;\n}\n","import { getPaths } from \"./getPaths\";\nimport type { ViewBox } from \"./resizePlugin\";\n\nexport function getSvg(d: string, viewbox?: ViewBox): string {\n const svgParts = getPaths(d).map((attributes) => (\n `<path ${attributes ? Object.entries(attributes).map(([k, v]) => `${k}=\"${v}\"`).join(' ') : ''} />`\n ));\n const { minX = 0, minY = 0, width = 24, height = 24 } = viewbox ?? {};\n const content = svgParts.length ? `\n ${svgParts.join(`\n `)}\n` : '';\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"${minX} ${minY} ${width} ${height}\" width=\"${width}\" height=\"${height}\">${content}</svg>`;\n}\n","type XastElement = {\n name: string;\n attributes?: Record<string, string>;\n};\n\ntype Visitor = {\n element?: {\n enter?: (node: XastElement) => void;\n };\n};\n\ntype SvgoCustomPlugin = {\n name: string;\n description: string;\n fn: () => Visitor;\n};\n\nexport const convertRoundedRectToPath: SvgoCustomPlugin = {\n name: 'convertRoundedRectToPath',\n description: 'Convert only rounded <rect> elements to <path>.',\n fn: () => {\n return {\n element: {\n enter: (node: XastElement) => {\n if (node.name !== 'rect' || node.attributes == null) {\n return;\n }\n\n const attrs = node.attributes;\n\n const x = toNumber(attrs.x, 0);\n const y = toNumber(attrs.y, 0);\n const width = toNumber(attrs.width, null);\n const height = toNumber(attrs.height, null);\n\n if (\n width == null ||\n height == null ||\n !Number.isFinite(width) ||\n !Number.isFinite(height) ||\n width <= 0 ||\n height <= 0\n ) {\n return;\n }\n\n const hasRx = attrs.rx != null;\n const hasRy = attrs.ry != null;\n\n // Only process rects that explicitly have rounded corners.\n if (!hasRx && !hasRy) {\n return;\n }\n\n let rx = hasRx ? toNumber(attrs.rx, 0) : null;\n let ry = hasRy ? toNumber(attrs.ry, 0) : null;\n\n // SVG behavior:\n // - if only rx is set, ry = rx\n // - if only ry is set, rx = ry\n if (rx != null && ry == null) {\n ry = rx;\n } else if (rx == null && ry != null) {\n rx = ry;\n }\n\n rx = clamp(rx ?? 0, 0, width / 2);\n ry = clamp(ry ?? 0, 0, height / 2);\n\n // Skip non-rounded rects, including rx=\"0\"/ry=\"0\".\n if (rx <= 0 && ry <= 0) {\n return;\n }\n\n const d = buildRoundedRectPath(x, y, width, height, rx, ry);\n\n node.name = 'path';\n node.attributes = {\n ...attrs,\n d,\n };\n\n delete node.attributes.x;\n delete node.attributes.y;\n delete node.attributes.width;\n delete node.attributes.height;\n delete node.attributes.rx;\n delete node.attributes.ry;\n },\n },\n };\n },\n};\n\nfunction toNumber<Fallback extends number | null>(value: string | undefined, fallback: Fallback): number | Fallback {\n if (value == null) {\n return fallback;\n }\n\n const num = Number.parseFloat(String(value).trim());\n return Number.isFinite(num) ? num : fallback;\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\nfunction buildRoundedRectPath(\n x: number,\n y: number,\n width: number,\n height: number,\n rx: number,\n ry: number,\n): string {\n const x2 = x + width;\n const y2 = y + height;\n\n return [\n 'M', fmt(x + rx), fmt(y),\n 'H', fmt(x2 - rx),\n 'A', fmt(rx), fmt(ry), '0', '0', '1', fmt(x2), fmt(y + ry),\n 'V', fmt(y2 - ry),\n 'A', fmt(rx), fmt(ry), '0', '0', '1', fmt(x2 - rx), fmt(y2),\n 'H', fmt(x + rx),\n 'A', fmt(rx), fmt(ry), '0', '0', '1', fmt(x), fmt(y2 - ry),\n 'V', fmt(y + ry),\n 'A', fmt(rx), fmt(ry), '0', '0', '1', fmt(x + rx), fmt(y),\n 'Z',\n ].join(' ');\n}\n\nfunction fmt(value: number): string {\n return Number.parseFloat(value.toFixed(6)).toString();\n}","import { type Config } from 'svgo';\nimport { ResizeParams } from \"./resizePlugin\";\nimport { convertRoundedRectToPath } from \"./convertRoundedRectToPath\";\n\nexport interface SVGDConfig {\n resize: ResizeParams;\n colors?: boolean;\n svgo: Config;\n}\n\nexport const defaultConfig: SVGDConfig = {\n resize: {\n targetViewBox: {\n minX: 0,\n minY: 0,\n width: 24,\n height: 24,\n }\n },\n colors: false,\n svgo: {\n plugins: [\n {\n name: 'removeAttrs',\n params: {\n attrs: [\n 'overflow',\n 'filter'\n ]\n }\n },\n {\n name: 'preset-default',\n params: {\n overrides: {\n convertShapeToPath: false,\n convertColors: false,\n mergePaths: false,\n moveElemsAttrsToGroup: false,\n moveGroupAttrsToElems: false,\n },\n },\n },\n {\n name: \"inlineStyles\",\n params: {\n onlyMatchedOnce: false,\n }\n },\n {\n name: \"convertStyleToAttrs\",\n },\n {\n name: \"removeUselessStrokeAndFill\",\n params: {\n stroke: true,\n fill: true,\n removeNone: true\n }\n },\n {\n name: 'convertColors',\n params: {\n currentColor: false,\n names2hex: true,\n rgb2hex: true,\n shorthex: true,\n shortname: false,\n },\n },\n {\n name: 'convertShapeToPath',\n params: {\n convertArcs: true,\n },\n },\n convertRoundedRectToPath,\n {\n name: 'mergePaths',\n params: {\n force: true,\n },\n },\n {\n name: 'moveGroupAttrsToElems',\n },\n {\n name: 'collapseGroups',\n },\n {\n name: \"convertPathData\",\n },\n {\n name: \"removeHiddenElems\",\n },\n {\n name: \"removeUselessDefs\",\n },\n ],\n }\n};\n","import type { CustomPlugin } from 'svgo';\nimport type { XastElement, XastRoot } from 'svgo/lib/types';\n\nexport interface ViewBox {\n minX: number;\n minY: number;\n width: number;\n height: number;\n}\n\nexport interface ResizeParams {\n targetViewBox: ViewBox;\n overrideSvgAttributes?: boolean;\n preserveAspectRatio?: boolean;\n}\n\n/**\n * Resizes an SVG by wrapping its content in a <g> transform element.\n */\nexport function resizePlugin(params: ResizeParams): CustomPlugin {\n return {\n name: 'resizePlugin',\n fn: (ast) => {\n const svgNode = getSvgNode(ast);\n if (!svgNode) return null;\n\n const originalDims = getOriginalDimensions(svgNode);\n const transform = computeTransformations(originalDims, params);\n wrapChildrenInGroup(svgNode, transform);\n overrideSvgAttributesIfNeeded(svgNode, params);\n\n return null;\n },\n };\n}\n\nfunction getSvgNode(ast: XastRoot): XastElement | undefined {\n return ast.children.find(\n (node) => node.type === 'element' && node.name === 'svg'\n ) as XastElement | undefined;\n}\n\n/**\n * Extracts original dimensions from an SVG node.\n */\nfunction getOriginalDimensions(svgNode: XastElement): ViewBox {\n const viewBox = svgNode.attributes.viewBox;\n\n if (viewBox) {\n const [minX, minY, width, height] = viewBox.split(/[\\s,]+/).map(parseFloat);\n return { minX, minY, width, height };\n }\n\n return {\n minX: 0,\n minY: 0,\n width: parseFloat(svgNode.attributes.width ?? '100'),\n height: parseFloat(svgNode.attributes.height ?? '100'),\n };\n}\n\n/**\n * Computes the transformations (translate and scale) for resizing an SVG.\n */\nfunction computeTransformations(originalDims: ViewBox, params: ResizeParams): string {\n const { targetViewBox, preserveAspectRatio = true } = params;\n const { minX: origMinX, minY: origMinY, width: origWidth, height: origHeight } = originalDims;\n const { minX, minY, width, height } = targetViewBox;\n\n const scaleX = width / origWidth;\n const scaleY = height / origHeight;\n const scale = preserveAspectRatio ? Math.min(scaleX, scaleY) : NaN;\n\n const translateX =\n minX - origMinX * (preserveAspectRatio ? scale : scaleX) +\n (preserveAspectRatio ? (width - origWidth * scale) / 2 : 0);\n\n const translateY =\n minY - origMinY * (preserveAspectRatio ? scale : scaleY) +\n (preserveAspectRatio ? (height - origHeight * scale) / 2 : 0);\n\n if (preserveAspectRatio) {\n return `translate(${translateX}, ${translateY}) scale(${scale}, ${scale})`;\n }\n return `translate(${translateX}, ${translateY}) scale(${scaleX}, ${scaleY})`;\n}\n\n/**\n * Wraps the current children of an SVG node in a <g> element\n * with the specified transform attribute.\n */\nfunction wrapChildrenInGroup(svgNode: XastElement, transform: string): void {\n const groupNode: XastElement = {\n type: 'element',\n name: 'g',\n attributes: { transform },\n children: [],\n };\n\n groupNode.children = svgNode.children.splice(0, svgNode.children.length);\n svgNode.children.push(groupNode);\n}\n\n/**\n * Optionally overrides the SVG node attributes with the new viewBox\n * and removes width/height attributes.\n */\nfunction overrideSvgAttributesIfNeeded(svgNode: XastElement, params: ResizeParams): void {\n const { overrideSvgAttributes = true, targetViewBox } = params;\n if (!overrideSvgAttributes) return;\n\n const { minX, minY, width, height } = targetViewBox;\n svgNode.attributes.viewBox = `${minX} ${minY} ${width} ${height}`;\n delete svgNode.attributes.width;\n delete svgNode.attributes.height;\n}\n","import type { CustomPlugin } from \"svgo\";\nimport type { XastNode } from \"svgo/lib/types\";\n\nexport const inlineUsePlugin: CustomPlugin = {\n name: 'inlineUse',\n fn: () => {\n const defsMap = new Map();\n function collectDefs(node: XastNode) {\n if (node.type === \"element\" || node.type === \"root\") {\n if (node.type === \"element\" && node.name === 'defs' && Array.isArray(node.children)) {\n node.children = node.children.filter((defEl) => {\n if(defEl.type !== \"element\" || defEl.name !== 'path') {\n return true;\n }\n const {id, ...attributes} = defEl?.attributes ?? {};\n if (id) {\n defsMap.set(id, {...defEl, attributes });\n return false;\n }\n return true;\n });\n } else if (Array.isArray(node.children)) {\n for (const child of node.children) {\n collectDefs(child);\n }\n }\n }\n\n }\n return {\n root: {\n enter(rootNode) {\n collectDefs(rootNode);\n },\n },\n element: {\n enter(node, parentNode) {\n if (node.name !== 'use') return;\n const href = node.attributes.href || node.attributes['xlink:href'];\n if (!href || !href.startsWith('#')) return;\n const id = href.slice(1);\n const defEl = defsMap.get(id);\n if (!defEl) return;\n\n // shallow clone of defEl + merge attributes\n const clone = {\n name: defEl.name,\n type: defEl.type,\n attributes: { ...defEl.attributes, ...node.attributes },\n children: defEl.children\n };\n\n // replace <use> в parentNode.children\n const idx = parentNode.children.indexOf(node);\n if (idx >= 0) {\n parentNode.children.splice(idx, 1, clone);\n }\n }\n }\n };\n }\n}\n","import type { CustomPlugin } from \"svgo\";\nimport { XastElement } from \"svgo/lib/types\";\n\nexport const name = 'moveGroupAttrsToElems';\nexport const description =\n 'moves some group attributes to the content elements';\n\nconst opacityAttibutes = [\"opacity\", \"fill-opacity\", \"stroke-opacity\"];\n\nexport const moveGroupOpacityToElementsPlugin: CustomPlugin = {\n name: 'inlineUse',\n fn: () => {\n return {\n element: {\n enter: (node) => {\n if (\n node.name === 'g' &&\n node.children.length !== 0\n ) {\n\n const mergers = opacityAttibutes\n .map((opacityAttibute) => getMergeOpacity(node, opacityAttibute))\n .filter(Boolean) as Array<(node: XastElement) => void>;\n\n for (const child of node.children) {\n\n if (child.type === 'element') {\n mergers.forEach((merge)=> merge(child));\n }\n }\n\n opacityAttibutes.forEach((opacityAttibute)=>{\n delete node.attributes[opacityAttibute];\n })\n }\n },\n },\n };\n }\n}\n\nfunction getMergeOpacity(parent: XastElement, attributeName: string) {\n if (!(attributeName in parent.attributes)) return null;\n const parentValue = parent.attributes[attributeName];\n const parsedParentValue = Number.parseFloat(parentValue);\n return (node: XastElement) => {\n if (node.type === 'element') {\n const value = node.attributes[attributeName];\n node.attributes[attributeName] = (value !== null && value !== undefined)\n ? String(Number.parseFloat(node.attributes[attributeName]) * parsedParentValue)\n : parentValue;\n\n }\n }\n}\n","import { defaultConfig } from \"./defaultConfig\";\nimport type { XastChild, XastRoot } from \"svgo/lib/types\";\nimport type { Config, CustomPlugin } from \"svgo\";\nimport { resizePlugin } from \"./resizePlugin\";\nimport { inlineUsePlugin } from \"./inlineUsePlugin\";\nimport { commands } from \"./commands\";\nimport { moveGroupOpacityToElementsPlugin } from \"./moveGroupOpacityToElementsPlugin\";\n\nexport const getSvgoConfig = (config = defaultConfig): Config => {\n const plugins = (config.svgo.plugins ?? []);\n const pluginsByColor = config.colors\n ? plugins\n : plugins.map((plugin) => (typeof plugin === \"object\" && plugin.name === \"convertColors\") ? {\n ...plugin,\n params: {\n currentColor: true\n }\n } : plugin);\n return {\n ...config.svgo,\n plugins: [\n inlineUsePlugin,\n moveGroupOpacityToElementsPlugin,\n resizePlugin(config.resize),\n ...pluginsByColor,\n extractPathDPlugin(),\n ],\n };\n}\n\nexport const extractPathDPlugin = (): CustomPlugin => ({\n name: 'extractPathD',\n fn: (ast: XastRoot) => {\n const collectPathsContext: CollectPathsContext = {\n paths: [],\n wasCommand: false,\n }\n collectPaths(ast, collectPathsContext);\n ast.children = [{\n type: \"text\",\n value: collectPathsContext.paths.join(' ')\n }];\n return null;\n },\n});\n\ninterface CollectPathsContext {\n paths: string[];\n wasCommand: boolean;\n}\n\ntype CollectableAttribute = typeof commands[number][\"attribute\"];\ntype InheritedAttributes = Partial<Record<CollectableAttribute, string>>;\n\nconst pickCollectableAttributes = (attributes: Record<string, string>): InheritedAttributes => {\n const pickedAttributes: InheritedAttributes = {};\n commands.forEach(({ attribute }) => {\n if (attributes[attribute] !== undefined) {\n pickedAttributes[attribute] = attributes[attribute];\n }\n });\n return pickedAttributes;\n};\n\nconst collectPaths = (\n node: XastChild | XastRoot,\n context: CollectPathsContext,\n inheritedAttributes: InheritedAttributes = {},\n) => {\n if (\n node.type === 'element' &&\n !['path', 'g', 'svg', 'title'].includes(node.name)\n ) {\n throw new Error(`[SVGD ERROR] svg has other tag \"${node.name}\"`);\n }\n if (\n node.type === 'element' &&\n node.name === 'path' &&\n node.attributes.d\n ) {\n const effectiveAttributes = {\n ...inheritedAttributes,\n ...node.attributes,\n };\n const d = node.attributes.d;\n const commandsArray: string[] = [];\n\n commands.forEach(({ code, toCommand, attribute }) => {\n if (attribute in effectiveAttributes) {\n const commandValue = toCommand(effectiveAttributes[attribute] as string);\n if (commandValue !== null) {\n commandsArray.push(`${code}${commandValue}`);\n }\n }\n });\n\n if (commandsArray.length) {\n context.wasCommand = true;\n context.paths.push(...commandsArray);\n } else if (context.wasCommand) {\n context.paths.push(\"o1\");\n }\n context.paths.push(d);\n }\n\n const childrenInheritedAttributes = (\n node.type === \"element\" && ['g', 'svg'].includes(node.name)\n )\n ? { ...inheritedAttributes, ...pickCollectableAttributes(node.attributes) }\n : inheritedAttributes;\n\n if (\"children\" in node) {\n node.children.forEach((node) => collectPaths(node, context, childrenInheritedAttributes));\n }\n};\n"],"mappings":"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","names":["d","node"]}