@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 • 20.3 kB
Source Map (JSON)
{"version":3,"sources":["../src/index.ts","../src/commands.ts","../src/getPaths.ts","../src/getSvg.ts","../src/defaultConfig.ts","../src/resizePlugin.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","import { type Config } from 'svgo';\nimport { ResizeParams } from \"./resizePlugin\";\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: '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 {\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 { defaultConfig } from \"./defaultConfig\";\nimport type { XastChild, XastRoot } from \"svgo/lib/types\";\nimport type { Config, CustomPlugin } from \"svgo\";\nimport { resizePlugin } from \"./resizePlugin\";\nimport { commands } from \"./commands\";\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 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\nconst collectPaths = (node: XastChild | XastRoot, context: CollectPathsContext ) => {\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 { attributes } = node;\n const d = attributes.d;\n const commandsArray: string[] = [];\n\n commands.forEach(({ code, toCommand, attribute }) => {\n if (attribute in attributes) {\n const commandValue = toCommand(attributes[attribute]);\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 if (\"children\" in node) {\n node.children.forEach((node) => collectPaths(node, context));\n }\n};\n"],"mappings":"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","names":["d","node"]}