{"version":3,"file":"parseSVGDocument.mjs","names":[],"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 * @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"],"mappings":";;;;;;;;AAUA,MAAM,iBAAiB,OACrB,sBAAsB,KAAK,WAAW,GAAG,CAAC;AAE5C,MAAa,6BAA+C;CAC1D,SAAS,EAAE;CACX,UAAU,EAAE;CACZ,SAAS,EAAE;CACX,aAAa,EAAE;CAChB;;;;;;;;;;;;;;;AAgBD,eAAsB,iBACpB,KACA,SACA,EAAE,aAAa,WAA6B,EAAE,EACnB;AAC3B,KAAI,UAAU,OAAO,SAAS;AAC5B,MAAI,OAAO,IAAI,mBAAmB,mBAAmB,CAAC;AAEtD,SAAO,qBAAqB;;CAE9B,MAAM,kBAAkB,IAAI;AAC5B,oBAAmB,IAAI;CAEvB,MAAM,cAAc,MAAM,KAAK,gBAAgB,qBAAqB,IAAI,CAAC,EACvE,UAAU;EACR,GAAG,sBAAsB,gBAAgB;EACzC;EACA;EACD;CACH,MAAM,WAAW,YAAY,QAAQ,OAAO;AAC1C,wBAAsB,GAAG;AACzB,SAAO,cAAc,GAAG,IAAI,CAAC,mBAAmB,GAAG;GACnD;AACF,KAAI,CAAC,YAAa,YAAY,CAAC,SAAS,OACtC,QAAO;EACL,GAAG,qBAAqB;EACxB;EACA,aAAa;EACd;CAEH,MAAM,iBAA4C,EAAE;AACpD,aACG,QAAQ,OAAO,WAAW,GAAG,KAAK,WAAW,CAC7C,SAAS,OAAO;AACf,KAAG,aAAa,qBAAqB,GAAG,aAAa,YAAY,IAAI,GAAG;EACxE,MAAM,KAAK,GAAG,aAAa,KAAK;AAChC,iBAAe,MAAM,MAAM,KAAK,GAAG,qBAAqB,IAAI,CAAC,CAAC,QAC3D,OAAO,cAAc,GAAG,CAC1B;GACD;AAaJ,QAAO;EACL,SAHgB,MARI,IAAI,eACxB,UACA,SACA,SACA,KACA,eACD,CAEqC,OAAO;EAI3C;EACA;EACA,aAAa;EACd"}