UNPKG

fabric

Version:

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

1 lines 14.4 kB
{"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","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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"}