{"version":3,"file":"TextSVGExportMixin.mjs","sources":["../../../../src/shapes/Text/TextSVGExportMixin.ts"],"sourcesContent":["import { config } from '../../config';\nimport type { TSVGReviver } from '../../typedefs';\nimport { escapeXml } from '../../util/lang_string';\nimport { colorPropToSVG, createSVGRect } from '../../util/misc/svgParsing';\nimport { hasStyleChanged } from '../../util/misc/textStyles';\nimport { toFixed } from '../../util/misc/toFixed';\nimport { FabricObjectSVGExportMixin } from '../Object/FabricObjectSVGExportMixin';\nimport { type TextStyleDeclaration } from './StyledText';\nimport { JUSTIFY } from '../Text/constants';\nimport type { FabricText, GraphemeBBox } from './Text';\nimport { STROKE, FILL } from '../../constants';\nimport { Path } from '../Path';\nimport { createRotateMatrix } from '../../util/misc/matrix';\nimport { radiansToDegrees } from '../../util/misc/radiansDegreesConversion';\nimport { Point } from '../../Point';\nimport { matrixToSVG } from '../../util/misc/svgExport';\n\nconst multipleSpacesRegex = /  +/g;\nconst dblQuoteRegex = /\"/g;\n\nfunction createSVGInlineRect(\n  color: string,\n  left: number,\n  top: number,\n  width: number,\n  height: number,\n) {\n  return `\\t\\t${createSVGRect(color, { left, top, width, height })}\\n`;\n}\n\nexport class TextSVGExportMixin extends FabricObjectSVGExportMixin {\n  _toSVG(this: TextSVGExportMixin & FabricText): string[] {\n    const offsets = this._getSVGLeftTopOffsets();\n    let textAndBg;\n    if (this.path) {\n      // James added\n      textAndBg = this._getTextPath();\n    } else {\n      textAndBg = this._getSVGTextAndBg(offsets.textTop, offsets.textLeft);\n    }\n    return this._wrapSVGTextAndBg(textAndBg);\n  }\n\n  toSVG(this: TextSVGExportMixin & FabricText, reviver?: TSVGReviver): string {\n    const textSvg = this._createBaseSVGMarkup(this._toSVG(), {\n        reviver,\n        noStyle: true,\n        withShadow: true,\n      }),\n      path = this.path;\n    if (path) {\n      return (\n        textSvg +\n        path._createBaseSVGMarkup(path._toSVG(), {\n          reviver,\n          withShadow: true,\n          additionalTransform: matrixToSVG(this.calcOwnMatrix()),\n        })\n      );\n    }\n    return textSvg;\n  }\n\n  /**\n   * James added\n   * @param this\n   * @returns\n   */\n  private _getTextPath(\n    this: TextSVGExportMixin & FabricText & { id?: string },\n  ) {\n    const textSpans: string[] = [];\n    const textBgRects: string[] = [];\n    const content = this._textLines.map((v) => v.join('')).join('');\n\n    let visibleContent = '';\n    // 隐藏状态的文字 __charBounds 为空\n    if (this.__charBounds.length) {\n      Array.from(content).forEach((c, i) => {\n        const charBox = this.__charBounds[0][i];\n        if (!charBox || !charBox.visible) return;\n        visibleContent += c;\n      });\n    }\n\n    const align: string[] = [];\n    const alignMap: { [key: string]: { anchor: string; offset: string } } = {\n      center: { anchor: 'middle', offset: '50%' },\n      right: { anchor: 'end', offset: '100%' },\n    };\n    if (this.textAlign === 'center' || this.textAlign === 'right') {\n      align.push(\n        `text-anchor=\"${alignMap[this.textAlign].anchor}\" `,\n        `startOffset=\"${alignMap[this.textAlign].offset}\" `,\n      );\n    }\n\n    const pathId = `TEXTPATH_${this.id}`;\n    const textPath = [\n      `<textPath href=\"#${pathId}\" `,\n      align.join(''),\n      '>',\n      escapeXml(visibleContent),\n      '</textPath>',\n    ].join('');\n\n    textSpans.push(textPath);\n    return {\n      textSpans,\n      textBgRects,\n    };\n  }\n\n  private _getSVGLeftTopOffsets(this: TextSVGExportMixin & FabricText) {\n    return {\n      textLeft: -this.width / 2,\n      textTop: -this.height / 2,\n      lineTop: this.getHeightOfLine(0),\n    };\n  }\n\n  private _wrapSVGTextAndBg(\n    this: TextSVGExportMixin & FabricText,\n    {\n      textBgRects,\n      textSpans,\n    }: {\n      textSpans: string[];\n      textBgRects: string[];\n    },\n  ) {\n    const noShadow = true,\n      textDecoration = this.getSvgTextDecoration(this);\n    return [\n      textBgRects.join(''),\n      '\\t\\t<text xml:space=\"preserve\" ',\n      `font-family=\"${this.fontFamily.replace(dblQuoteRegex, \"'\")}\" `,\n      `font-size=\"${this.fontSize}\" `,\n      this.fontStyle ? `font-style=\"${this.fontStyle}\" ` : '',\n      this.fontWeight ? `font-weight=\"${this.fontWeight}\" ` : '',\n      // James modified\n      // 增加 letter-space line-height textalign，用于 Vectr2.0导入\n      this.charSpacing\n        ? 'letter-spacing=\"' + this._getWidthOfCharSpacing() + '\" '\n        : '',\n      // svg 暂时不支持该属性，只能用于 Vectr2.0导入\n      this.lineHeight ? 'line-height=\"' + this.lineHeight + '\" ' : '',\n      textDecoration ? `text-decoration=\"${textDecoration}\" ` : '',\n      this.direction === 'rtl' ? `direction=\"${this.direction}\" ` : '',\n      'style=\"',\n      this.getSvgStyles(noShadow),\n      '\"',\n      this.addPaintOrder(),\n      ' >',\n      textSpans.join(''),\n      '</text>\\n',\n    ];\n  }\n\n  /**\n   * @private\n   * @param {Number} textTopOffset Text top offset\n   * @param {Number} textLeftOffset Text left offset\n   * @return {Object}\n   */\n  private _getSVGTextAndBg(\n    this: TextSVGExportMixin & FabricText,\n    textTopOffset: number,\n    textLeftOffset: number,\n  ) {\n    const textSpans: string[] = [],\n      textBgRects: string[] = [];\n    let height = textTopOffset,\n      lineOffset;\n\n    // bounding-box background\n    this.backgroundColor &&\n      textBgRects.push(\n        ...createSVGInlineRect(\n          this.backgroundColor,\n          -this.width / 2,\n          -this.height / 2,\n          this.width,\n          this.height,\n        ),\n      );\n\n    // text and text-background\n    for (let i = 0, len = this._textLines.length; i < len; i++) {\n      // James modified\n      let heightOfLine = this.getHeightOfLine(i);\n      let realHeightOfLine = heightOfLine / this.lineHeight;\n\n      // 2022.3.1 超过box高度，不显示 text\n      if (height + realHeightOfLine * 0.8 > this.height / 2) {\n        break;\n      }\n\n      lineOffset = this._getLineLeftOffset(i);\n      if (this.direction === 'rtl') {\n        lineOffset += this.width;\n      }\n      if (this.textBackgroundColor || this.styleHas('textBackgroundColor', i)) {\n        this._setSVGTextLineBg(\n          textBgRects,\n          i,\n          textLeftOffset + lineOffset,\n          height,\n        );\n      }\n      this._setSVGTextLineText(\n        textSpans,\n        i,\n        textLeftOffset + lineOffset,\n        height,\n      );\n      height += heightOfLine;\n    }\n\n    return {\n      textSpans,\n      textBgRects,\n    };\n  }\n\n  private _createTextCharSpan(\n    this: TextSVGExportMixin & FabricText,\n    char: string,\n    styleDecl: TextStyleDeclaration,\n    left: number,\n    top: number,\n    charBox: GraphemeBBox,\n  ) {\n    const numFractionDigit = config.NUM_FRACTION_DIGITS;\n    const styleProps = this.getSvgSpanStyles(\n        styleDecl,\n        char !== char.trim() || !!char.match(multipleSpacesRegex),\n      ),\n      fillStyles = styleProps ? `style=\"${styleProps}\"` : '',\n      dy = styleDecl.deltaY,\n      dySpan = dy ? ` dy=\"${toFixed(dy, numFractionDigit)}\" ` : '',\n      { angle, renderLeft, renderTop, width } = charBox;\n    let angleAttr = '';\n    if (renderLeft !== undefined) {\n      const wBy2 = width / 2;\n      angle &&\n        (angleAttr = ` rotate=\"${toFixed(radiansToDegrees(angle), numFractionDigit)}\"`);\n      const m = createRotateMatrix({ angle: radiansToDegrees(angle!) });\n      m[4] = renderLeft!;\n      m[5] = renderTop!;\n      const renderPoint = new Point(-wBy2, 0).transform(m);\n      left = renderPoint.x;\n      top = renderPoint.y;\n    }\n\n    return `<tspan x=\"${toFixed(left, numFractionDigit)}\" y=\"${toFixed(\n      top,\n      numFractionDigit,\n    )}\" ${dySpan}${angleAttr}${fillStyles}>${escapeXml(char)}</tspan>`;\n  }\n  /**\n   * James modified\n   */\n  private _setSVGTextLineText(\n    this: TextSVGExportMixin & FabricText,\n    textSpans: string[],\n    lineIndex: number,\n    textLeftOffset: number,\n    textTopOffset: number,\n  ) {\n    const lineHeight = this.getHeightOfLine(lineIndex),\n      isJustify = this.textAlign.includes(JUSTIFY),\n      line = this._textLines[lineIndex];\n    let actualStyle,\n      nextStyle,\n      charsToRender = '',\n      charBox,\n      style,\n      boxWidth = 0,\n      timeToRender;\n\n    textTopOffset +=\n      (lineHeight * (1 - this._fontSizeFraction)) / this.lineHeight;\n\n    // James modified\n    // 空行增加空tspan用于 Vectr2.0导入时表示空行\n    if (line.length === 0) {\n      style = {};\n      textSpans.push(\n        this._createTextCharSpan(\n          '',\n          style,\n          textLeftOffset,\n          textTopOffset,\n          {} as GraphemeBBox,\n        ),\n      );\n    }\n\n    for (let i = 0, len = line.length - 1; i <= len; i++) {\n      timeToRender = i === len || this.charSpacing || this.path;\n      charsToRender += line[i];\n      charBox = this.__charBounds[lineIndex][i];\n      if (boxWidth === 0) {\n        textLeftOffset += charBox.kernedWidth - charBox.width;\n        boxWidth += charBox.width;\n      } else {\n        boxWidth += charBox.kernedWidth;\n      }\n      if (isJustify && !timeToRender) {\n        if (this._reSpaceAndTab.test(line[i])) {\n          timeToRender = true;\n        }\n      }\n      if (!timeToRender) {\n        // if we have charSpacing or a path, we render char by char\n        actualStyle =\n          actualStyle || this.getCompleteStyleDeclaration(lineIndex, i);\n        nextStyle = this.getCompleteStyleDeclaration(lineIndex, i + 1);\n        // James modified forTextSpan = false\n        timeToRender = hasStyleChanged(actualStyle, nextStyle, false);\n      }\n      if (timeToRender) {\n        style = this._getStyleDeclaration(lineIndex, i);\n        textSpans.push(\n          this._createTextCharSpan(\n            charsToRender,\n            style,\n            textLeftOffset,\n            textTopOffset,\n            charBox,\n          ),\n        );\n        charsToRender = '';\n        actualStyle = nextStyle;\n        if (this.direction === 'rtl') {\n          textLeftOffset -= boxWidth;\n        } else {\n          textLeftOffset += boxWidth;\n        }\n        boxWidth = 0;\n      }\n    }\n  }\n\n  private _setSVGTextLineBg(\n    this: TextSVGExportMixin & FabricText,\n    textBgRects: (string | number)[],\n    i: number,\n    leftOffset: number,\n    textTopOffset: number,\n  ) {\n    const line = this._textLines[i],\n      heightOfLine = this.getHeightOfLine(i) / this.lineHeight;\n    let boxWidth = 0,\n      boxStart = 0,\n      currentColor,\n      lastColor = this.getValueOfPropertyAt(i, 0, 'textBackgroundColor');\n    for (let j = 0; j < line.length; j++) {\n      const { left, width, kernedWidth } = this.__charBounds[i][j];\n      currentColor = this.getValueOfPropertyAt(i, j, 'textBackgroundColor');\n      if (currentColor !== lastColor) {\n        lastColor &&\n          textBgRects.push(\n            ...createSVGInlineRect(\n              lastColor,\n              leftOffset + boxStart,\n              textTopOffset,\n              boxWidth,\n              heightOfLine,\n            ),\n          );\n        boxStart = left;\n        boxWidth = width;\n        lastColor = currentColor;\n      } else {\n        boxWidth += kernedWidth;\n      }\n    }\n    currentColor &&\n      textBgRects.push(\n        ...createSVGInlineRect(\n          lastColor,\n          leftOffset + boxStart,\n          textTopOffset,\n          boxWidth,\n          heightOfLine,\n        ),\n      );\n  }\n\n  /**\n   * @deprecated unused\n   */\n  _getSVGLineTopOffset(\n    this: TextSVGExportMixin & FabricText,\n    lineIndex: number,\n  ) {\n    let lineTopOffset = 0,\n      j;\n    for (j = 0; j < lineIndex; j++) {\n      lineTopOffset += this.getHeightOfLine(j);\n    }\n    const lastHeight = this.getHeightOfLine(j);\n    return {\n      lineTop: lineTopOffset,\n      offset:\n        ((this._fontSizeMult - this._fontSizeFraction) * lastHeight) /\n        (this.lineHeight * this._fontSizeMult),\n    };\n  }\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(this: TextSVGExportMixin & FabricText, skipShadow?: boolean) {\n    return `${super.getSvgStyles(skipShadow)} text-decoration-thickness: ${toFixed((this.textDecorationThickness * this.getObjectScaling().y) / 10, config.NUM_FRACTION_DIGITS)}%; white-space: pre;`;\n  }\n\n  /**\n   * Returns styles-string for svg-export\n   * @param {Object} style the object from which to retrieve style properties\n   * @param {Boolean} useWhiteSpace a boolean to include an additional attribute in the style.\n   * @return {String}\n   */\n  getSvgSpanStyles(\n    this: TextSVGExportMixin & FabricText,\n    style: TextStyleDeclaration,\n    useWhiteSpace?: boolean,\n  ) {\n    const {\n      fontFamily,\n      strokeWidth,\n      stroke,\n      fill,\n      fontSize,\n      fontStyle,\n      fontWeight,\n      deltaY,\n      textDecorationThickness,\n      linethrough,\n      overline,\n      underline,\n    } = style;\n\n    const textDecoration = this.getSvgTextDecoration({\n      underline: underline ?? this.underline,\n      overline: overline ?? this.overline,\n      linethrough: linethrough ?? this.linethrough,\n    });\n    const thickness = textDecorationThickness || this.textDecorationThickness;\n    return [\n      stroke ? colorPropToSVG(STROKE, stroke) : '',\n      strokeWidth ? `stroke-width: ${strokeWidth}; ` : '',\n      fontFamily\n        ? `font-family: ${\n            !fontFamily.includes(\"'\") && !fontFamily.includes('\"')\n              ? `'${fontFamily}'`\n              : fontFamily\n          }; `\n        : '',\n      fontSize ? `font-size: ${fontSize}px; ` : '',\n      fontStyle ? `font-style: ${fontStyle}; ` : '',\n      fontWeight ? `font-weight: ${fontWeight}; ` : '',\n      textDecoration\n        ? `text-decoration: ${textDecoration}; text-decoration-thickness: ${toFixed((thickness * this.getObjectScaling().y) / 10, config.NUM_FRACTION_DIGITS)}%; `\n        : '',\n      fill ? colorPropToSVG(FILL, fill) : '',\n      deltaY ? `baseline-shift: ${-deltaY}; ` : '',\n      useWhiteSpace ? 'white-space: pre; ' : '',\n    ].join('');\n  }\n\n  /**\n   * Returns text-decoration property for svg-export\n   * @param {Object} style the object from which to retrieve style properties\n   * @return {String}\n   */\n  getSvgTextDecoration(\n    this: TextSVGExportMixin & FabricText,\n    style: TextStyleDeclaration,\n  ) {\n    return (['overline', 'underline', 'line-through'] as const)\n      .filter(\n        (decoration) =>\n          style[\n            decoration.replace('-', '') as\n              | 'overline'\n              | 'underline'\n              | 'linethrough'\n          ],\n      )\n      .join(' ');\n  }\n}\n"],"names":["multipleSpacesRegex","dblQuoteRegex","createSVGInlineRect","color","left","top","width","height","createSVGRect","TextSVGExportMixin","FabricObjectSVGExportMixin","_toSVG","offsets","_getSVGLeftTopOffsets","textAndBg","path","_getTextPath","_getSVGTextAndBg","textTop","textLeft","_wrapSVGTextAndBg","toSVG","reviver","textSvg","_createBaseSVGMarkup","noStyle","withShadow","additionalTransform","matrixToSVG","calcOwnMatrix","textSpans","textBgRects","content","_textLines","map","v","join","visibleContent","__charBounds","length","Array","from","forEach","c","i","charBox","visible","align","alignMap","center","anchor","offset","right","textAlign","push","pathId","id","textPath","escapeXml","lineTop","getHeightOfLine","_ref","noShadow","textDecoration","getSvgTextDecoration","fontFamily","replace","fontSize","fontStyle","fontWeight","charSpacing","_getWidthOfCharSpacing","lineHeight","direction","getSvgStyles","addPaintOrder","textTopOffset","textLeftOffset","lineOffset","backgroundColor","len","heightOfLine","realHeightOfLine","_getLineLeftOffset","textBackgroundColor","styleHas","_setSVGTextLineBg","_setSVGTextLineText","_createTextCharSpan","char","styleDecl","numFractionDigit","config","NUM_FRACTION_DIGITS","styleProps","getSvgSpanStyles","trim","match","fillStyles","dy","deltaY","dySpan","toFixed","angle","renderLeft","renderTop","angleAttr","undefined","wBy2","radiansToDegrees","m","createRotateMatrix","renderPoint","Point","transform","x","y","lineIndex","isJustify","includes","JUSTIFY","line","actualStyle","nextStyle","charsToRender","style","boxWidth","timeToRender","_fontSizeFraction","kernedWidth","_reSpaceAndTab","test","getCompleteStyleDeclaration","hasStyleChanged","_getStyleDeclaration","leftOffset","boxStart","currentColor","lastColor","getValueOfPropertyAt","j","_getSVGLineTopOffset","lineTopOffset","lastHeight","_fontSizeMult","skipShadow","textDecorationThickness","getObjectScaling","useWhiteSpace","strokeWidth","stroke","fill","linethrough","overline","underline","thickness","colorPropToSVG","STROKE","FILL","filter","decoration"],"mappings":"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"}