fabric
Version:
Object model for HTML5 canvas, and SVG-to-canvas parser. Backed by jsdom and node-canvas.
1 lines • 14.7 kB
Source Map (JSON)
{"version":3,"file":"FabricObjectSVGExportMixin.mjs","sources":["../../../../src/shapes/Object/FabricObjectSVGExportMixin.ts"],"sourcesContent":["import type { TSVGReviver } from '../../typedefs';\nimport { uid } from '../../util/internals/uid';\nimport { colorPropToSVG } from '../../util/misc/svgParsing';\nimport { FILL, NONE, STROKE } from '../../constants';\nimport type { FabricObject } from './FabricObject';\nimport { isFiller } from '../../util/typeAssertions';\nimport { matrixToSVG } from '../../util/misc/svgExport';\n\nexport class FabricObjectSVGExportMixin {\n /**\n * When an object is being exported as SVG as a clippath, a reference inside the SVG is needed.\n * This reference is a UID in the fabric namespace and is temporary stored here.\n * @type {String}\n */\n declare clipPathId?: string;\n\n /**\n * Returns styles-string for svg-export\n * @param {Boolean} skipShadow a boolean to skip shadow filter output\n * @return {String}\n */\n getSvgStyles(\n this: FabricObjectSVGExportMixin & FabricObject,\n skipShadow?: boolean,\n ) {\n const fillRule = this.fillRule ? this.fillRule : 'nonzero',\n strokeWidth = this.strokeWidth ? this.strokeWidth : '0',\n strokeDashArray = this.strokeDashArray\n ? this.strokeDashArray.join(' ')\n : NONE,\n strokeDashOffset = this.strokeDashOffset ? this.strokeDashOffset : '0',\n strokeLineCap = this.strokeLineCap ? this.strokeLineCap : 'butt',\n strokeLineJoin = this.strokeLineJoin ? this.strokeLineJoin : 'miter',\n strokeMiterLimit = this.strokeMiterLimit ? this.strokeMiterLimit : '4',\n opacity = typeof this.opacity !== 'undefined' ? this.opacity : '1',\n visibility = this.visible ? '' : ' visibility: hidden;',\n filter = skipShadow ? '' : this.getSvgFilter(),\n fill = colorPropToSVG(FILL, this.fill),\n stroke = colorPropToSVG(STROKE, this.stroke);\n\n return [\n stroke,\n 'stroke-width: ',\n strokeWidth,\n '; ',\n 'stroke-dasharray: ',\n strokeDashArray,\n '; ',\n 'stroke-linecap: ',\n strokeLineCap,\n '; ',\n 'stroke-dashoffset: ',\n strokeDashOffset,\n '; ',\n 'stroke-linejoin: ',\n strokeLineJoin,\n '; ',\n 'stroke-miterlimit: ',\n strokeMiterLimit,\n '; ',\n fill,\n 'fill-rule: ',\n fillRule,\n '; ',\n 'opacity: ',\n opacity,\n ';',\n filter,\n visibility,\n ].join('');\n }\n\n /**\n * Returns filter for svg shadow\n * @return {String}\n */\n getSvgFilter(this: FabricObjectSVGExportMixin & FabricObject) {\n return this.shadow ? `filter: url(#SVGID_${this.shadow.id});` : '';\n }\n\n /**\n * Returns id attribute for svg output\n * @return {String}\n */\n getSvgCommons(\n this: FabricObjectSVGExportMixin & FabricObject & { id?: string },\n ) {\n return [\n this.id ? `id=\"${this.id}\" ` : '',\n this.clipPath\n ? `clip-path=\"url(#${\n (this.clipPath as FabricObjectSVGExportMixin & FabricObject)\n .clipPathId\n })\" `\n : '',\n ].join('');\n }\n\n /**\n * Returns transform-string for svg-export\n * @param {Boolean} use the full transform or the single object one.\n * @return {String}\n */\n getSvgTransform(\n this: FabricObjectSVGExportMixin & FabricObject,\n full?: boolean,\n additionalTransform = '',\n ) {\n const transform = full ? this.calcTransformMatrix() : this.calcOwnMatrix(),\n svgTransform = `transform=\"${matrixToSVG(transform)}`;\n return `${svgTransform}${additionalTransform}\" `;\n }\n\n /**\n * Returns svg representation of an instance\n * This function is implemented in each subclass\n * This is just because typescript otherwise cryies all the time\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG(_reviver?: TSVGReviver): string[] {\n return [''];\n }\n\n /**\n * Returns svg representation of an instance\n * @param {TSVGReviver} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toSVG(\n this: FabricObjectSVGExportMixin & FabricObject,\n reviver?: TSVGReviver,\n ) {\n return this._createBaseSVGMarkup(this._toSVG(reviver), {\n reviver,\n });\n }\n\n /**\n * Returns svg clipPath representation of an instance\n * @param {TSVGReviver} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toClipPathSVG(\n this: FabricObjectSVGExportMixin & FabricObject,\n reviver?: TSVGReviver,\n ) {\n return (\n '\\t' +\n this._createBaseClipPathSVGMarkup(this._toSVG(reviver), {\n reviver,\n })\n );\n }\n\n /**\n * @private\n */\n _createBaseClipPathSVGMarkup(\n this: FabricObjectSVGExportMixin & FabricObject,\n objectMarkup: string[],\n {\n reviver,\n additionalTransform = '',\n }: { reviver?: TSVGReviver; additionalTransform?: string } = {},\n ) {\n const commonPieces = [\n this.getSvgTransform(true, additionalTransform),\n this.getSvgCommons(),\n ].join(''),\n // insert commons in the markup, style and svgCommons\n index = objectMarkup.indexOf('COMMON_PARTS');\n objectMarkup[index] = commonPieces;\n return reviver ? reviver(objectMarkup.join('')) : objectMarkup.join('');\n }\n\n /**\n * @private\n */\n _createBaseSVGMarkup(\n this: FabricObjectSVGExportMixin & FabricObject,\n objectMarkup: string[],\n {\n noStyle,\n reviver,\n withShadow,\n additionalTransform,\n }: {\n noStyle?: boolean;\n reviver?: TSVGReviver;\n withShadow?: boolean;\n additionalTransform?: string;\n } = {},\n ): string {\n const styleInfo = noStyle ? '' : `style=\"${this.getSvgStyles()}\" `,\n shadowInfo = withShadow ? `style=\"${this.getSvgFilter()}\" ` : '',\n clipPath = this.clipPath as FabricObjectSVGExportMixin & FabricObject,\n vectorEffect = this.strokeUniform\n ? 'vector-effect=\"non-scaling-stroke\" '\n : '',\n absoluteClipPath = clipPath && clipPath.absolutePositioned,\n stroke = this.stroke,\n fill = this.fill,\n shadow = this.shadow,\n markup = [],\n // insert commons in the markup, style and svgCommons\n index = objectMarkup.indexOf('COMMON_PARTS');\n let clipPathMarkup;\n if (clipPath) {\n clipPath.clipPathId = `CLIPPATH_${uid()}`;\n clipPathMarkup = `<clipPath id=\"${\n clipPath.clipPathId\n }\" >\\n${clipPath.toClipPathSVG(reviver)}</clipPath>\\n`;\n }\n if (absoluteClipPath) {\n markup.push('<g ', shadowInfo, this.getSvgCommons(), ' >\\n');\n }\n markup.push(\n '<g ',\n this.getSvgTransform(false),\n !absoluteClipPath ? shadowInfo + this.getSvgCommons() : '',\n ' >\\n',\n );\n const commonPieces = [\n styleInfo,\n vectorEffect,\n noStyle ? '' : this.addPaintOrder(),\n ' ',\n additionalTransform ? `transform=\"${additionalTransform}\" ` : '',\n ].join('');\n objectMarkup[index] = commonPieces;\n if (isFiller(fill)) {\n markup.push(fill.toSVG(this));\n }\n if (isFiller(stroke)) {\n markup.push(stroke.toSVG(this));\n }\n if (shadow) {\n markup.push(shadow.toSVG(this));\n }\n if (clipPath) {\n markup.push(clipPathMarkup);\n }\n markup.push(objectMarkup.join(''));\n markup.push('</g>\\n');\n absoluteClipPath && markup.push('</g>\\n');\n return reviver ? reviver(markup.join('')) : markup.join('');\n }\n\n addPaintOrder(this: FabricObjectSVGExportMixin & FabricObject) {\n return this.paintFirst !== FILL ? ` paint-order=\"${this.paintFirst}\" ` : '';\n }\n}\n"],"names":["FabricObjectSVGExportMixin","getSvgStyles","skipShadow","fillRule","strokeWidth","strokeDashArray","join","NONE","strokeDashOffset","strokeLineCap","strokeLineJoin","strokeMiterLimit","opacity","visibility","visible","filter","getSvgFilter","fill","colorPropToSVG","FILL","stroke","STROKE","shadow","concat","id","getSvgCommons","clipPath","clipPathId","getSvgTransform","full","additionalTransform","arguments","length","undefined","transform","calcTransformMatrix","calcOwnMatrix","svgTransform","matrixToSVG","_toSVG","_reviver","toSVG","reviver","_createBaseSVGMarkup","toClipPathSVG","_createBaseClipPathSVGMarkup","objectMarkup","commonPieces","index","indexOf","noStyle","withShadow","styleInfo","shadowInfo","vectorEffect","strokeUniform","absoluteClipPath","absolutePositioned","markup","clipPathMarkup","uid","push","addPaintOrder","isFiller","paintFirst"],"mappings":"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"}