UNPKG

fabric

Version:

Object model for HTML5 canvas, and SVG-to-canvas parser. Backed by jsdom and node-canvas.

1 lines 6.71 kB
{"version":3,"file":"parseSVGDocument.mjs","sources":["../../../src/parser/parseSVGDocument.ts"],"sourcesContent":["import { applyViewboxTransform } from './applyViewboxTransform';\nimport { svgValidTagNamesRegEx } from './constants';\nimport { hasInvalidAncestor } from './hasInvalidAncestor';\nimport { parseUseDirectives } from './parseUseDirectives';\nimport type { SVGParsingOutput, TSvgReviverCallback } from './typedefs';\nimport type { LoadImageOptions } from '../util/misc/objectEnlive';\nimport { ElementsParser } from './elements_parser';\nimport { log, SignalAbortedError } from '../util/internals/console';\nimport { getTagName } from './getTagName';\n\nconst isValidSvgTag = (el: Element) =>\n svgValidTagNamesRegEx.test(getTagName(el));\n\nexport const createEmptyResponse = (): SVGParsingOutput => ({\n objects: [],\n elements: [],\n options: {},\n allElements: [],\n});\n\n/**\n * Parses an SVG document, converts it to an array of corresponding fabric.* instances and passes them to a callback\n * @static\n * @function\n * @memberOf fabric\n * @param {HTMLElement} doc SVG document to parse\n * @param {TSvgParsedCallback} callback Invoked when the parsing is done, with null if parsing wasn't possible with the list of svg nodes.\n * @param {TSvgReviverCallback} [reviver] Extra callback for further parsing of SVG elements, called after each fabric object has been created.\n * Takes as input the original svg element and the generated `FabricObject` as arguments. Used to inspect extra properties not parsed by fabric,\n * or extra custom manipulation\n * @param {Object} [options] Object containing options for parsing\n * @param {String} [options.crossOrigin] crossOrigin setting to use for external resources\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @return {SVGParsingOutput}\n * {@link SVGParsingOutput} also receives `allElements` array as the last argument. This is the full list of svg nodes available in the document.\n * You may want to use it if you are trying to regroup the objects as they were originally grouped in the SVG. ( This was the reason why it was added )\n */\nexport async function parseSVGDocument(\n doc: Document,\n reviver?: TSvgReviverCallback,\n { crossOrigin, signal }: LoadImageOptions = {},\n): Promise<SVGParsingOutput> {\n if (signal && signal.aborted) {\n log('log', new SignalAbortedError('parseSVGDocument'));\n // this is an unhappy path, we dont care about speed\n return createEmptyResponse();\n }\n const documentElement = doc.documentElement;\n parseUseDirectives(doc);\n\n const descendants = Array.from(documentElement.getElementsByTagName('*')),\n options = {\n ...applyViewboxTransform(documentElement),\n crossOrigin,\n signal,\n };\n const elements = descendants.filter((el) => {\n applyViewboxTransform(el);\n return isValidSvgTag(el) && !hasInvalidAncestor(el); // http://www.w3.org/TR/SVG/struct.html#DefsElement\n });\n if (!elements || (elements && !elements.length)) {\n return {\n ...createEmptyResponse(),\n options,\n allElements: descendants,\n };\n }\n const localClipPaths: Record<string, Element[]> = {};\n descendants\n .filter((el) => getTagName(el) === 'clipPath')\n .forEach((el) => {\n el.setAttribute('originalTransform', el.getAttribute('transform') || '');\n const id = el.getAttribute('id')!;\n localClipPaths[id] = Array.from(el.getElementsByTagName('*')).filter(\n (el) => isValidSvgTag(el),\n );\n });\n\n // Precedence of rules: style > class > attribute\n const elementParser = new ElementsParser(\n elements,\n options,\n reviver,\n doc,\n localClipPaths,\n );\n\n const instances = await elementParser.parse();\n\n return {\n objects: instances,\n elements,\n options,\n allElements: descendants,\n };\n}\n"],"names":["isValidSvgTag","el","svgValidTagNamesRegEx","test","getTagName","createEmptyResponse","objects","elements","options","allElements","parseSVGDocument","doc","reviver","crossOrigin","signal","arguments","length","undefined","aborted","log","SignalAbortedError","documentElement","parseUseDirectives","descendants","Array","from","getElementsByTagName","_objectSpread","applyViewboxTransform","filter","hasInvalidAncestor","localClipPaths","forEach","setAttribute","getAttribute","id","elementParser","ElementsParser","instances","parse"],"mappings":"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"}