UNPKG

fabric

Version:

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

2 lines 2.72 kB
import{CENTER as e,FILL as t,STROKE as n}from"../constants.min.mjs";import{classRegistry as r}from"../ClassRegistry.min.mjs";import{Point as i}from"../Point.min.mjs";import{invertTransform as a,multiplyTransformMatrices as o,qrDecompose as s}from"../util/misc/matrix.min.mjs";import{parseTransformAttribute as c}from"./parseTransformAttribute.min.mjs";import{Group as l}from"../shapes/Group.min.mjs";import{removeTransformMatrixForSvgParsing as u}from"../util/transform_matrix_removal.min.mjs";import{Gradient as d}from"../gradient/Gradient.min.mjs";import{FabricImage as f}from"../shapes/Image.min.mjs";import{getTagName as p}from"./getTagName.min.mjs";import{getGradientDefs as m}from"./getGradientDefs.min.mjs";import{getCSSRules as h}from"./getCSSRules.min.mjs";const g=e=>r.getSVGClass(p(e).toLowerCase());var _=class{constructor(e,t,n,r,i){this.elements=e,this.options=t,this.reviver=n,this.regexUrl=/^url\(['"]?#([^'"]+)['"]?\)/g,this.doc=r,this.clipPaths=i,this.gradientDefs=m(r),this.cssRules=h(r)}parse(){return Promise.all(this.elements.map(e=>this.createObject(e)))}async createObject(e){let r=g(e);if(r){let i=await r.fromElement(e,this.options,this.cssRules);return this.resolveGradient(i,e,t),this.resolveGradient(i,e,n),i instanceof f&&i._originalElement?u(i,i.parsePreserveAspectRatioAttribute()):u(i),await this.resolveClipPath(i,e),this.reviver&&this.reviver(e,i),i}return null}extractPropertyDefinition(e,t,n){let r=e[t],i=this.regexUrl;if(!i.test(r))return;i.lastIndex=0;let a=i.exec(r)[1];return i.lastIndex=0,n[a]}resolveGradient(e,t,n){let r=this.extractPropertyDefinition(e,n,this.gradientDefs);if(r){let i=t.getAttribute(n+`-opacity`),a=d.fromElement(r,e,{...this.options,opacity:i});e.set(n,a)}}async resolveClipPath(t,n,r){let d=this.extractPropertyDefinition(t,`clipPath`,this.clipPaths);if(d){let f=a(t.calcTransformMatrix()),p=d[0].parentElement,m=n;for(;!r&&m.parentElement&&m.getAttribute(`clip-path`)!==t.clipPath;)m=m.parentElement;m.parentElement.appendChild(p);let h=c(`${m.getAttribute(`transform`)||``} ${p.getAttribute(`originalTransform`)||``}`);p.setAttribute(`transform`,`matrix(${h.join(`,`)})`);let _=await Promise.all(d.map(e=>g(e).fromElement(e,this.options,this.cssRules).then(e=>(u(e),e.fillRule=e.clipRule,delete e.clipRule,e)))),v=_.length===1?_[0]:new l(_),y=o(f,v.calcTransformMatrix());v.clipPath&&await this.resolveClipPath(v,m,p.getAttribute(`clip-path`)?m:void 0);let{scaleX:b,scaleY:x,angle:S,skewX:C,translateX:w,translateY:T}=s(y);v.set({flipX:!1,flipY:!1}),v.set({scaleX:b,scaleY:x,angle:S,skewX:C,skewY:0}),v.setPositionByOrigin(new i(w,T),e,e),t.clipPath=v}else delete t.clipPath}};export{_ as ElementsParser}; //# sourceMappingURL=elements_parser.min.mjs.map