UNPKG

fabric

Version:

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

47 lines (44 loc) 2.27 kB
import { request } from '../util/internals/dom_request'; import { parseSVGDocument, createEmptyResponse } from './parseSVGDocument'; import type { SVGParsingOutput, TSvgReviverCallback } from './typedefs'; import type { LoadImageOptions } from '../util/misc/objectEnlive'; /** * Takes url corresponding to an SVG document, and parses it into a set of fabric objects. * Note that SVG is fetched via XMLHttpRequest, so it needs to conform to SOP (Same Origin Policy) * @memberOf fabric * @param {string} url where the SVG is * @param {TSvgParsedCallback} callback Invoked when the parsing is done, with null if parsing wasn't possible with the list of svg nodes. * {@link TSvgParsedCallback} also receives `allElements` array as the last argument. This is the full list of svg nodes available in the document. * 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 ) * @param {TSvgReviverCallback} [reviver] Extra callback for further parsing of SVG elements, called after each fabric object has been created. * Takes as input the original svg element and the generated `FabricObject` as arguments. Used to inspect extra properties not parsed by fabric, * or extra custom manipulation * @param {Object} [options] Object containing options for parsing * @param {String} [options.crossOrigin] crossOrigin setting to use for external resources * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal */ export function loadSVGFromURL( url: string, reviver?: TSvgReviverCallback, options: LoadImageOptions = {}, ): Promise<SVGParsingOutput> { // need to handle error properly return new Promise<Document>((resolve, reject) => { const onComplete = (r: XMLHttpRequest) => { const xml = r.responseXML; if (xml) { resolve(xml); } reject(); }; request(url.replace(/^\n\s*/, '').trim(), { onComplete, signal: options.signal, }); }) .then((parsedDoc) => parseSVGDocument(parsedDoc, reviver, options)) .catch(() => { // this is an unhappy path, we dont care about speed return createEmptyResponse(); }); }