UNPKG

fabric

Version:

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

1 lines 18.7 kB
{"version":3,"file":"StyledText.mjs","sources":["../../../../src/shapes/Text/StyledText.ts"],"sourcesContent":["import type { ObjectEvents } from '../../EventTypeDefs';\nimport type { FabricObjectProps, SerializedObjectProps } from '../Object/types';\nimport type { TOptions } from '../../typedefs';\nimport { FabricObject } from '../Object/FabricObject';\nimport { styleProperties } from './constants';\nimport type { StylePropertiesType } from './constants';\nimport type { FabricText } from './Text';\nimport { pick } from '../../util';\nimport { pickBy } from '../../util/misc/pick';\n\nexport type CompleteTextStyleDeclaration = Pick<\n FabricText,\n StylePropertiesType\n>;\n\nexport type TextStyleDeclaration = Partial<CompleteTextStyleDeclaration>;\n\nexport type TextStyle = {\n [line: number | string]: { [char: number | string]: TextStyleDeclaration };\n};\n\nexport abstract class StyledText<\n Props extends TOptions<FabricObjectProps> = Partial<FabricObjectProps>,\n SProps extends SerializedObjectProps = SerializedObjectProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n> extends FabricObject<Props, SProps, EventSpec> {\n declare abstract styles: TextStyle;\n protected declare abstract _textLines: string[][];\n protected declare _forceClearCache: boolean;\n static _styleProperties: Readonly<StylePropertiesType[]> = styleProperties;\n abstract get2DCursorLocation(\n selectionStart: number,\n skipWrapping?: boolean,\n ): { charIndex: number; lineIndex: number };\n\n /**\n * Returns true if object has no styling or no styling in a line\n * @param {Number} lineIndex , lineIndex is on wrapped lines.\n * @return {Boolean}\n */\n isEmptyStyles(lineIndex?: number): boolean {\n if (!this.styles) {\n return true;\n }\n if (typeof lineIndex !== 'undefined' && !this.styles[lineIndex]) {\n return true;\n }\n const obj =\n typeof lineIndex === 'undefined'\n ? this.styles\n : { line: this.styles[lineIndex] };\n for (const p1 in obj) {\n for (const p2 in obj[p1]) {\n // eslint-disable-next-line no-unused-vars\n for (const p3 in obj[p1][p2]) {\n return false;\n }\n }\n }\n return true;\n }\n\n /**\n * Returns true if object has a style property or has it ina specified line\n * This function is used to detect if a text will use a particular property or not.\n * @param {String} property to check for\n * @param {Number} lineIndex to check the style on\n * @return {Boolean}\n */\n styleHas(property: keyof TextStyleDeclaration, lineIndex?: number): boolean {\n if (!this.styles) {\n return false;\n }\n if (typeof lineIndex !== 'undefined' && !this.styles[lineIndex]) {\n return false;\n }\n const obj =\n typeof lineIndex === 'undefined'\n ? this.styles\n : { 0: this.styles[lineIndex] };\n // eslint-disable-next-line\n for (const p1 in obj) {\n // eslint-disable-next-line\n for (const p2 in obj[p1]) {\n if (typeof obj[p1][p2][property] !== 'undefined') {\n return true;\n }\n }\n }\n return false;\n }\n\n /**\n * Check if characters in a text have a value for a property\n * whose value matches the textbox's value for that property. If so,\n * the character-level property is deleted. If the character\n * has no other properties, then it is also deleted. Finally,\n * if the line containing that character has no other characters\n * then it also is deleted.\n */\n cleanStyle(property: keyof TextStyleDeclaration) {\n if (!this.styles) {\n return false;\n }\n const obj = this.styles;\n let stylesCount = 0,\n letterCount,\n stylePropertyValue,\n allStyleObjectPropertiesMatch = true,\n graphemeCount = 0;\n for (const p1 in obj) {\n letterCount = 0;\n for (const p2 in obj[p1]) {\n const styleObject = obj[p1][p2] || {},\n stylePropertyHasBeenSet = styleObject[property] !== undefined;\n\n stylesCount++;\n\n if (stylePropertyHasBeenSet) {\n if (!stylePropertyValue) {\n stylePropertyValue = styleObject[property];\n } else if (styleObject[property] !== stylePropertyValue) {\n allStyleObjectPropertiesMatch = false;\n }\n\n if (styleObject[property] === this[property as keyof this]) {\n delete styleObject[property];\n }\n } else {\n allStyleObjectPropertiesMatch = false;\n }\n\n if (Object.keys(styleObject).length !== 0) {\n letterCount++;\n } else {\n delete obj[p1][p2];\n }\n }\n\n if (letterCount === 0) {\n delete obj[p1];\n }\n }\n // if every grapheme has the same style set then\n // delete those styles and set it on the parent\n for (let i = 0; i < this._textLines.length; i++) {\n graphemeCount += this._textLines[i].length;\n }\n if (allStyleObjectPropertiesMatch && stylesCount === graphemeCount) {\n this[property as keyof this] = stylePropertyValue as any;\n this.removeStyle(property);\n }\n }\n\n /**\n * Remove a style property or properties from all individual character styles\n * in a text object. Deletes the character style object if it contains no other style\n * props. Deletes a line style object if it contains no other character styles.\n *\n * @param {String} props The property to remove from character styles.\n */\n removeStyle(property: keyof TextStyleDeclaration) {\n if (!this.styles) {\n return;\n }\n const obj = this.styles;\n let line, lineNum, charNum;\n for (lineNum in obj) {\n line = obj[lineNum];\n for (charNum in line) {\n delete line[charNum][property];\n if (Object.keys(line[charNum]).length === 0) {\n delete line[charNum];\n }\n }\n if (Object.keys(line).length === 0) {\n delete obj[lineNum];\n }\n }\n }\n\n private _extendStyles(index: number, style: TextStyleDeclaration): void {\n const { lineIndex, charIndex } = this.get2DCursorLocation(index);\n\n if (!this._getLineStyle(lineIndex)) {\n this._setLineStyle(lineIndex);\n }\n\n const newStyle = pickBy(\n {\n // first create a new object that is a merge of existing and new\n ...this._getStyleDeclaration(lineIndex, charIndex),\n ...style,\n // use the predicate to discard undefined values\n },\n (value) => value !== undefined,\n );\n\n // finally assign to the old position the new style\n this._setStyleDeclaration(lineIndex, charIndex, newStyle);\n }\n\n /**\n * Gets style of a current selection/cursor (at the start position)\n * @param {Number} startIndex Start index to get styles at\n * @param {Number} endIndex End index to get styles at, if not specified startIndex + 1\n * @param {Boolean} [complete] get full style or not\n * @return {Array} styles an array with one, zero or more Style objects\n */\n getSelectionStyles(\n startIndex: number,\n endIndex?: number,\n complete?: boolean,\n ): TextStyleDeclaration[] {\n const styles: TextStyleDeclaration[] = [];\n for (let i = startIndex; i < (endIndex || startIndex); i++) {\n styles.push(this.getStyleAtPosition(i, complete));\n }\n return styles;\n }\n\n /**\n * Gets style of a current selection/cursor position\n * @param {Number} position to get styles at\n * @param {Boolean} [complete] full style if true\n * @return {Object} style Style object at a specified index\n * @private\n */\n getStyleAtPosition(position: number, complete?: boolean) {\n const { lineIndex, charIndex } = this.get2DCursorLocation(position);\n return complete\n ? this.getCompleteStyleDeclaration(lineIndex, charIndex)\n : this._getStyleDeclaration(lineIndex, charIndex);\n }\n\n /**\n * Sets style of a current selection, if no selection exist, do not set anything.\n * @param {Object} styles Styles object\n * @param {Number} startIndex Start index to get styles at\n * @param {Number} [endIndex] End index to get styles at, if not specified startIndex + 1\n */\n setSelectionStyles(styles: object, startIndex: number, endIndex?: number) {\n for (let i = startIndex; i < (endIndex || startIndex); i++) {\n this._extendStyles(i, styles);\n }\n /* not included in _extendStyles to avoid clearing cache more than once */\n this._forceClearCache = true;\n }\n\n /**\n * Get a reference, not a clone, to the style object for a given character,\n * if no style is set for a line or char, return a new empty object.\n * This is tricky and confusing because when you get an empty object you can't\n * determine if it is a reference or a new one.\n * @TODO this should always return a reference or always a clone or undefined when necessary.\n * @protected\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @return {TextStyleDeclaration} a style object reference to the existing one or a new empty object when undefined\n */\n _getStyleDeclaration(\n lineIndex: number,\n charIndex: number,\n ): TextStyleDeclaration {\n const lineStyle = this.styles && this.styles[lineIndex];\n return lineStyle ? lineStyle[charIndex] ?? {} : {};\n }\n\n /**\n * return a new object that contains all the style property for a character\n * the object returned is newly created\n * @param {Number} lineIndex of the line where the character is\n * @param {Number} charIndex position of the character on the line\n * @return {Object} style object\n */\n getCompleteStyleDeclaration(\n lineIndex: number,\n charIndex: number,\n ): CompleteTextStyleDeclaration {\n return {\n ...pick(\n this,\n (this.constructor as typeof StyledText)\n ._styleProperties as (keyof this)[],\n ),\n ...this._getStyleDeclaration(lineIndex, charIndex),\n } as CompleteTextStyleDeclaration;\n }\n\n /**\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @param {Object} style\n * @private\n */\n protected _setStyleDeclaration(\n lineIndex: number,\n charIndex: number,\n style: object,\n ) {\n this.styles[lineIndex][charIndex] = style;\n }\n\n /**\n *\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @private\n */\n protected _deleteStyleDeclaration(lineIndex: number, charIndex: number) {\n delete this.styles[lineIndex][charIndex];\n }\n\n /**\n * @param {Number} lineIndex\n * @return {Boolean} if the line exists or not\n * @private\n */\n protected _getLineStyle(lineIndex: number): boolean {\n return !!this.styles[lineIndex];\n }\n\n /**\n * Set the line style to an empty object so that is initialized\n * @param {Number} lineIndex\n * @private\n */\n protected _setLineStyle(lineIndex: number) {\n this.styles[lineIndex] = {};\n }\n\n protected _deleteLineStyle(lineIndex: number) {\n delete this.styles[lineIndex];\n }\n}\n"],"names":["StyledText","FabricObject","isEmptyStyles","lineIndex","styles","obj","line","p1","p2","p3","styleHas","property","cleanStyle","stylesCount","letterCount","stylePropertyValue","allStyleObjectPropertiesMatch","graphemeCount","styleObject","stylePropertyHasBeenSet","undefined","Object","keys","length","i","_textLines","removeStyle","lineNum","charNum","_extendStyles","index","style","charIndex","get2DCursorLocation","_getLineStyle","_setLineStyle","newStyle","pickBy","_objectSpread","_getStyleDeclaration","value","_setStyleDeclaration","getSelectionStyles","startIndex","endIndex","complete","push","getStyleAtPosition","position","getCompleteStyleDeclaration","setSelectionStyles","_forceClearCache","_lineStyle$charIndex","lineStyle","pick","constructor","_styleProperties","_deleteStyleDeclaration","_deleteLineStyle","_defineProperty","styleProperties"],"mappings":"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"}