@galacean/effects-plugin-rich-text 2.7.4 → 2.8.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/alipay.js +1 -1
- package/dist/alipay.js.map +1 -1
- package/dist/alipay.mjs +1 -1
- package/dist/alipay.mjs.map +1 -1
- package/dist/douyin.js +1 -1
- package/dist/douyin.js.map +1 -1
- package/dist/douyin.mjs +1 -1
- package/dist/douyin.mjs.map +1 -1
- package/dist/index.js +992 -272
- package/dist/index.js.map +1 -1
- package/dist/index.min.js +2 -2
- package/dist/index.min.js.map +1 -1
- package/dist/index.mjs +993 -273
- package/dist/index.mjs.map +1 -1
- package/dist/rich-text-component.d.ts +49 -17
- package/dist/rich-text-layout.d.ts +54 -0
- package/dist/strategies/align/rich-horizontal-align.d.ts +10 -0
- package/dist/strategies/align/rich-vertical-align.d.ts +10 -0
- package/dist/strategies/overflow/rich-clipped-overflow.d.ts +10 -0
- package/dist/strategies/overflow/rich-display-overflow.d.ts +10 -0
- package/dist/strategies/overflow/rich-visible-overflow.d.ts +10 -0
- package/dist/strategies/rich-text-factory.d.ts +26 -0
- package/dist/strategies/rich-text-interfaces.d.ts +104 -0
- package/dist/strategies/wrap/rich-wrap-disabled.d.ts +15 -0
- package/dist/strategies/wrap/rich-wrap-enabled.d.ts +15 -0
- package/dist/weapp.js +1 -1
- package/dist/weapp.js.map +1 -1
- package/dist/weapp.mjs +1 -1
- package/dist/weapp.mjs.map +1 -1
- package/package.json +2 -2
package/dist/weapp.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"weapp.mjs","sources":["../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_set_prototype_of.js","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_inherits.js","../src/rich-text-loader.ts","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_array_like_to_array.js","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_create_for_of_iterator_helper_loose.js","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_unsupported_iterable_to_array.js","../src/rich-text-parser.ts","../src/color-utils.ts","../../../node_modules/.pnpm/tslib@2.8.1/node_modules/tslib/tslib.es6.mjs","../src/rich-text-component.ts","../src/index.ts"],"sourcesContent":["function _set_prototype_of(o, p) {\n _set_prototype_of = Object.setPrototypeOf || function setPrototypeOf(o, p) {\n o.__proto__ = p;\n\n return o;\n };\n\n return _set_prototype_of(o, p);\n}\nexport { _set_prototype_of as _ };\n","import { _ as _set_prototype_of } from \"./_set_prototype_of.js\";\n\nfunction _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } });\n\n if (superClass) _set_prototype_of(subClass, superClass);\n}\nexport { _inherits as _ };\n","import { AbstractPlugin } from '@galacean/effects';\n\nexport class RichTextLoader extends AbstractPlugin {\n override name = 'rich-text';\n}\n","function _array_like_to_array(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n return arr2;\n}\nexport { _array_like_to_array as _ };\n","import { _ as _unsupported_iterable_to_array } from \"./_unsupported_iterable_to_array.js\";\n\nfunction _create_for_of_iterator_helper_loose(o, allowArrayLike) {\n var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"];\n\n if (it) return (it = it.call(o)).next.bind(it);\n // Fallback for engines without symbol support\n if (Array.isArray(o) || (it = _unsupported_iterable_to_array(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n if (it) o = it;\n\n var i = 0;\n\n return function() {\n if (i >= o.length) return { done: true };\n\n return { done: false, value: o[i++] };\n };\n }\n\n throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nexport { _create_for_of_iterator_helper_loose as _ };\n","import { _ as _array_like_to_array } from \"./_array_like_to_array.js\";\n\nfunction _unsupported_iterable_to_array(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _array_like_to_array(o, minLen);\n\n var n = Object.prototype.toString.call(o).slice(8, -1);\n\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(n);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);\n}\nexport { _unsupported_iterable_to_array as _ };\n","enum TokenType {\n ContextStart = 'ContextStart',\n Text = 'Text',\n ContextEnd = 'ContextEnd',\n EscapedChar = 'EscapedChar',\n}\n\nexport type Token = {\n tokenType: TokenType,\n value: string,\n};\n\nconst contextStartRegexp = /^<([a-z]+)(=([^>]+))?>$/;\nconst contextEndRegexp = /^<\\/([a-z]+)>$/;\n\nconst rules: [TokenType, RegExp][] = [\n [TokenType.EscapedChar, /^\\\\([=<>\\\\/])/],\n [TokenType.ContextStart, /^<[a-z]+(=[^>]+)?>/],\n [TokenType.ContextEnd, /^<\\/[a-z]+>/],\n [TokenType.Text, /^[^</>=\\\\]+/],\n];\n\nexport const lexer = (input: string, lexed: Token[] = [], cursor = 0): Token[] => {\n if (!input) {\n return lexed;\n }\n\n const escapedMatch = /^\\\\([=<>\\\\/])/.exec(input);\n\n if (escapedMatch) {\n const actualChar = escapedMatch[1];\n\n return lexer(input.slice(2), lexed.concat({ tokenType: TokenType.Text, value: actualChar }), cursor + 2);\n }\n\n for (const [tokenType, regex] of rules) {\n if (tokenType === TokenType.EscapedChar) { continue; }\n\n const match = regex.exec(input);\n\n if (!match) { continue; }\n\n const tokenMatch = match[0];\n const len = tokenMatch.length;\n\n return lexer(input.slice(len), lexed.concat({ tokenType, value: tokenMatch }), cursor + len);\n }\n\n if (input.length > 0) {\n return lexer(input.slice(1), lexed.concat({ tokenType: TokenType.Text, value: input[0] }), cursor + 1);\n }\n\n throw new Error(`Unexpected token: \"${input[0]}\" at position ${cursor} while reading \"${input}\"`);\n};\n\nexport type Attribute = {\n attributeName?: string,\n attributeParam?: string,\n};\n\nexport type RichTextAST = {\n attributes: Attribute[],\n text: string,\n};\n\nexport const richTextParser = (input: string): RichTextAST[] => {\n const lexed = lexer(input);\n let cursor = 0;\n\n const shift = () => {\n const shifted = lexed.shift();\n\n cursor += shifted?.value.length ?? 0;\n\n return shifted;\n };\n\n const peek = () => {\n return lexed[0];\n };\n\n const ast: RichTextAST[] = [];\n\n function Grammar (attributes: Attribute[] = [], expectedEndAttributeName = '') {\n const parsing = true;\n\n while (parsing) {\n const maybeText = Text();\n\n if (maybeText) {\n ast.push({\n attributes,\n text: maybeText,\n });\n\n continue;\n }\n\n const { attributeName, attributeParam } = ContextStart();\n\n if (attributeName) {\n Grammar(attributes.concat({ attributeName, attributeParam: attributeParam ?? '' }), attributeName);\n\n continue;\n }\n\n if (expectedEndAttributeName) {\n const { attributeName: endAttributeName } = ContextEnd();\n\n if (!endAttributeName) {\n throw new Error(`Expect an end tag marker \"${expectedEndAttributeName}\" at position ${cursor} but found no tag!`);\n }\n\n if (endAttributeName !== expectedEndAttributeName) {\n throw new Error(`Expect an end tag marker \"${expectedEndAttributeName}\" at position ${cursor} but found tag \"${endAttributeName}\"`);\n }\n\n return;\n }\n\n break;\n }\n }\n\n function Text (): string | undefined {\n let combinedText = '';\n let hasTextToken = false;\n\n while (lexed.length > 0 && lexed[0]?.tokenType === TokenType.Text) {\n const textToken = shift();\n\n if (textToken) {\n combinedText += textToken.value;\n hasTextToken = true;\n }\n }\n\n return hasTextToken ? combinedText : undefined;\n }\n\n function ContextStart (): { attributeName?: string, attributeParam?: string } {\n const maybeContextStart = peek();\n\n if (maybeContextStart?.tokenType === TokenType.ContextStart) {\n shift();\n\n const matches = maybeContextStart.value.match(contextStartRegexp);\n\n if (matches) {\n const attributeName = matches[1];\n const attributeParam = matches[3] ?? '';\n\n return { attributeName, attributeParam };\n }\n\n throw new Error(`Expected a start tag marker at position ${cursor}`);\n }\n\n return {};\n }\n\n function ContextEnd (): { attributeName?: string } {\n const maybeContextEnd = peek();\n\n if (maybeContextEnd?.tokenType === TokenType.ContextEnd) {\n shift();\n\n const matches = maybeContextEnd.value.match(contextEndRegexp);\n\n if (matches) {\n const attributeName = matches[1];\n\n return { attributeName };\n }\n\n throw new Error(`Expect an end tag marker at position ${cursor}`);\n }\n\n return {};\n }\n\n Grammar();\n\n return ast;\n};\n\nexport function generateProgram (textHandler: (text: string, context: Record<string, string | undefined>) => void) {\n return (richText: string) => {\n const ast = richTextParser(richText);\n\n for (const node of ast) {\n const text = node.text;\n const context = node.attributes.reduce<Record<string, string | undefined>>((ctx, { attributeName, attributeParam }) => {\n if (attributeName) {\n ctx[attributeName] = attributeParam;\n }\n\n return ctx;\n }, {});\n\n textHandler(text, context);\n }\n };\n}\n\nexport function isRichText (text: string): boolean {\n const lexed = lexer(text);\n\n const contextTokens = lexed.filter(({ tokenType }) => tokenType === TokenType.ContextStart || tokenType === TokenType.ContextEnd);\n\n const contextStartTokens = contextTokens.filter(({ tokenType }) => tokenType === TokenType.ContextStart);\n const contextEndTokens = contextTokens.filter(({ tokenType }) => tokenType === TokenType.ContextEnd);\n\n if (contextStartTokens.length !== contextEndTokens.length || !contextStartTokens.length) {\n return false;\n }\n\n const tokensOfAttribute = contextTokens.map(({ tokenType, value }) => ({ tokenType, value: tokenType === TokenType.ContextStart ? value.match(contextStartRegexp)![1] : value.match(contextEndRegexp)![1] }));\n\n function checkPaired ([token, ...restToken]: Token[], startContextAttributes: string[] = []): boolean {\n if (!token) {\n return startContextAttributes.length === 0;\n }\n\n if (token.tokenType === TokenType.ContextStart) {\n return checkPaired(restToken, startContextAttributes.concat(token.value));\n } else if (token.tokenType === TokenType.ContextEnd) {\n const attributeName = startContextAttributes[startContextAttributes.length - 1];\n\n if (attributeName !== token.value) {\n return false;\n }\n\n return checkPaired(restToken, startContextAttributes.slice(0, -1));\n }\n\n throw new Error(`Unexpected token: ${token.tokenType}`);\n }\n\n return checkPaired(tokensOfAttribute);\n}\n\n/**\n * 转义富文本中的特殊字符\n * @param input - 需要转义的输入字符串\n * @returns 转义后的字符串\n */\nexport function escape (input: string): string {\n if (typeof input !== 'string') {\n throw new Error('Input must be a string');\n }\n\n return input\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/=/g, '\\\\=')\n .replace(/</g, '\\\\<')\n .replace(/>/g, '\\\\>')\n .replace(/\\//g, '\\\\/');\n}\n\n/**\n * 反转义富文本中的特殊字符\n * @param input - 需要反转义的输入字符串\n * @returns 反转义后的字符串\n */\nexport function unescape (input: string): string {\n if (typeof input !== 'string') {\n throw new Error('Input must be a string');\n }\n\n return input\n .replace(/\\\\\\//g, '/')\n .replace(/\\\\>/g, '>')\n .replace(/\\\\</g, '<')\n .replace(/\\\\=/g, '=')\n .replace(/\\\\\\\\/g, '\\\\');\n}\n","import type { spec } from '@galacean/effects';\n\n/**\n * 将颜色名称转换为 RGBA\n * @param colorName - 颜色名称\n * @returns RGBA 颜色字符串\n */\nexport function colorNameToRGBA (colorName: string): string {\n if (typeof colorName !== 'string' || !colorName) {\n throw new Error('Invalid color name provided');\n }\n if (typeof document === 'undefined') {\n throw new Error('This method requires a browser environment');\n }\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n\n if (context) {\n try {\n context.fillStyle = colorName;\n const result = context.fillStyle;\n\n return result;\n } finally {\n // Clean up DOM element\n canvas.remove();\n }\n }\n\n throw new Error('Failed to get 2D context for color conversion!');\n}\n\n/**\n * 将 16 进制颜色转换为 RGBA\n * @param hex - 16 进制颜色\n * @param alpha - 透明度\n * @returns - RGBA 颜色\n */\nexport function hexToRGBA (hex: string, alpha: number = 1): spec.vec4 {\n hex = hex.replace(/^#/, '');\n\n if (hex.length === 3 || hex.length === 4) {\n hex = hex.split('').map(char => char + char).join('');\n }\n\n // Handle alpha channel in hex\n if (hex.length === 8) {\n const a = parseInt(hex.slice(6, 8), 16) / 255;\n\n hex = hex.slice(0, 6);\n alpha = a;\n }\n const bigint = parseInt(hex, 16);\n const r = (bigint >> 16) & 255;\n const g = (bigint >> 8) & 255;\n const b = bigint & 255;\n\n return [r, g, b, alpha];\n}\n\n/**\n * 将颜色字符串转换为 RGBA\n * @param color - 颜色字符串\n * @param alpha - 透明度\n * @returns - RGBA 颜色\n */\nexport function toRGBA (color: string, alpha: number = 1): spec.vec4 {\n if (typeof color !== 'string' || !color) {\n throw new Error('Invalid color string');\n }\n if (color.startsWith('#')) {\n return hexToRGBA(color, alpha);\n } else {\n return hexToRGBA(colorNameToRGBA(color));\n }\n}\n","/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\n\nvar extendStatics = function(d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n }\n return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n var _, done = false;\n for (var i = decorators.length - 1; i >= 0; i--) {\n var context = {};\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n if (kind === \"accessor\") {\n if (result === void 0) continue;\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n if (_ = accept(result.get)) descriptor.get = _;\n if (_ = accept(result.set)) descriptor.set = _;\n if (_ = accept(result.init)) initializers.unshift(_);\n }\n else if (_ = accept(result)) {\n if (kind === \"field\") initializers.unshift(_);\n else descriptor[key] = _;\n }\n }\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\n done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n var useValue = arguments.length > 2;\n for (var i = 0; i < initializers.length; i++) {\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n }\n return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\n\nexport function __generator(thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++)\n ar = ar.concat(__read(arguments[i]));\n return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n function fulfill(value) { resume(\"next\", value); }\n function reject(value) { resume(\"throw\", value); }\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n var i, p;\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var m = o[Symbol.asyncIterator], i;\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n};\n\nvar ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n};\n\nexport function __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n}\n\nexport function __importDefault(mod) {\n return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport function __addDisposableResource(env, value, async) {\n if (value !== null && value !== void 0) {\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\n var dispose, inner;\n if (async) {\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\n dispose = value[Symbol.asyncDispose];\n }\n if (dispose === void 0) {\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\n dispose = value[Symbol.dispose];\n if (async) inner = dispose;\n }\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\n env.stack.push({ value: value, dispose: dispose, async: async });\n }\n else if (async) {\n env.stack.push({ async: true });\n }\n return value;\n}\n\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n var e = new Error(message);\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\nexport function __disposeResources(env) {\n function fail(e) {\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\n env.hasError = true;\n }\n var r, s = 0;\n function next() {\n while (r = env.stack.pop()) {\n try {\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\n if (r.dispose) {\n var result = r.dispose.call(r.value);\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\n }\n else s |= 1;\n }\n catch (e) {\n fail(e);\n }\n }\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\n if (env.hasError) throw env.error;\n }\n return next();\n}\n\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\n });\n }\n return path;\n}\n\nexport default {\n __extends,\n __assign,\n __rest,\n __decorate,\n __param,\n __esDecorate,\n __runInitializers,\n __propKey,\n __setFunctionName,\n __metadata,\n __awaiter,\n __generator,\n __createBinding,\n __exportStar,\n __values,\n __read,\n __spread,\n __spreadArrays,\n __spreadArray,\n __await,\n __asyncGenerator,\n __asyncDelegator,\n __asyncValues,\n __makeTemplateObject,\n __importStar,\n __importDefault,\n __classPrivateFieldGet,\n __classPrivateFieldSet,\n __classPrivateFieldIn,\n __addDisposableResource,\n __disposeResources,\n __rewriteRelativeImportExtension,\n};\n","import type { Engine } from '@galacean/effects';\nimport { assertExist, math, effectsClass, glContext, spec, TextComponent, Texture, TextLayout, TextStyle } from '@galacean/effects';\nimport { generateProgram } from './rich-text-parser';\nimport { toRGBA } from './color-utils';\n\n/**\n *\n */\nexport interface RichTextOptions {\n text: string,\n fontSize: number,\n fontFamily?: string,\n fontWeight?: spec.TextWeight,\n fontStyle?: spec.FontStyle,\n fontColor?: spec.vec4,\n textStyle?: TextStyle,\n isNewLine: boolean,\n}\n\ninterface CharDetail {\n /**\n * 字符内容\n */\n char: string,\n /**\n * 当前字符在本行内的起始 x 坐标(相对行起点)\n */\n x: number,\n /**\n * 当前字符的宽度\n */\n width: number,\n}\n\ninterface RichCharInfo {\n /**\n * 每个富文本片段的起始 x 坐标\n */\n offsetX: number[],\n /**\n * 字符参数\n */\n richOptions: RichTextOptions[],\n /**\n * 段落宽度\n */\n width: number,\n /**\n * 段落高度\n */\n lineHeight: number,\n /**\n * 字体偏移高度\n */\n offsetY: number,\n /**\n * 当前富文本片段内所有字符的详细信息\n */\n chars: CharDetail[][],\n}\n\nlet seed = 0;\n\n/**\n * RichText component class\n */\n@effectsClass(spec.DataType.RichTextComponent)\nexport class RichTextComponent extends TextComponent {\n processedTextOptions: RichTextOptions[] = [];\n // 字体高度的倍数(字体高度上下多出来的部分就是行间距)\n private singleLineHeight: number = 1.571;\n private size: math.Vector2 | null = null;\n /**\n * 获取第一次渲染的 size\n */\n private initialized: boolean = false;\n /**\n * canvas 大小\n */\n private canvasSize: math.Vector2 | null = null;\n\n constructor (engine: Engine) {\n super(engine);\n\n this.name = 'MRichText' + seed++;\n }\n\n private generateTextProgram (text: string) {\n this.processedTextOptions = [];\n const program = generateProgram((text, context) => {\n // 如果富文本仅包含换行符,则在每个换行符后添加一个空格\n if (/^\\n+$/.test(text)) {\n text = text.replace(/\\n/g, '\\n ');\n }\n const textArr = text.split('\\n');\n\n textArr.forEach((text, index) => {\n const options: RichTextOptions = {\n text,\n fontSize: this.textStyle.fontSize,\n isNewLine: false,\n };\n\n if (index > 0) {\n options.isNewLine = true;\n }\n if ('b' in context) {\n options.fontWeight = spec.TextWeight.bold;\n }\n\n if ('i' in context) {\n options.fontStyle = spec.FontStyle.italic;\n }\n\n if ('size' in context && context.size) {\n options.fontSize = parseInt(context.size, 10);\n }\n\n if ('color' in context && context.color) {\n options.fontColor = toRGBA(context.color);\n }\n this.processedTextOptions.push(options);\n });\n\n });\n\n program(text);\n }\n\n override updateTexture (flipY = true) {\n if (!this.isDirty || !this.context || !this.canvas) {\n return;\n }\n\n // 根据 useLegacyRichText 字段来判断使用哪种渲染模式\n const useLegacy = this.textLayout.useLegacyRichText === true;\n\n this.singleLineHeight = useLegacy ? 1.571 : 1.0;\n\n if (useLegacy) {\n this.updateTextureLegacy(flipY);\n } else {\n this.updateTextureModern(flipY);\n }\n }\n\n private updateTextureLegacy (flipY: boolean) {\n if (!this.isDirty || !this.context || !this.canvas) {\n return;\n }\n\n // 解析富文本\n this.generateTextProgram(this.text);\n\n const { textLayout, textStyle } = this;\n const { overflow, letterSpace = 0 } = textLayout;\n const context = this.context;\n let width = 0;\n let height = 0;\n\n context.save();\n\n const charsInfo: Omit<RichCharInfo, 'chars'>[] = [];\n const fontHeight = textStyle.fontSize * this.textStyle.fontScale;\n let charInfo: Omit<RichCharInfo, 'chars'> = {\n richOptions: [],\n offsetX: [],\n width: 0,\n // 包括字体和上下行间距的高度\n lineHeight: fontHeight * this.singleLineHeight,\n // 字体偏移高度(也就是行间距)\n offsetY: fontHeight * (this.singleLineHeight - 1) / 2,\n };\n\n // 遍历解析后的文本选项\n this.processedTextOptions.forEach(options => {\n const { text, isNewLine, fontSize } = options;\n\n // 如果是新行,则将之前行的信息存入 charsInfo 并且初始化新行的 charInfo\n if (isNewLine) {\n charsInfo.push(charInfo);\n width = Math.max(width, charInfo.width);\n charInfo = {\n richOptions: [],\n offsetX: [],\n width: 0,\n lineHeight: fontHeight * this.singleLineHeight,\n offsetY: fontHeight * (this.singleLineHeight - 1) / 2,\n };\n // 管理行的总高度调整 canvas 尺寸\n height += charInfo.lineHeight;\n }\n\n // 恢复默认设置\n context.font = `${options.fontWeight || textStyle.textWeight} 10px ${options.fontFamily || textStyle.fontFamily}`;\n\n // 计算得到每个字段的宽度 textWidth\n const textMetrics = context.measureText(text);\n let textWidth = textMetrics.width;\n\n if (textMetrics.actualBoundingBoxLeft !== undefined && textMetrics.actualBoundingBoxRight !== undefined) {\n const actualWidth = textMetrics.actualBoundingBoxLeft + textMetrics.actualBoundingBoxRight;\n\n if (actualWidth > 0) {\n textWidth = Math.max(textWidth, actualWidth);\n }\n }\n\n const textHeight = fontSize * this.singleLineHeight * this.textStyle.fontScale;\n\n if (textHeight > charInfo.lineHeight) {\n height += textHeight - charInfo.lineHeight;\n charInfo.lineHeight = textHeight;\n charInfo.offsetY = fontSize * this.textStyle.fontScale * (this.singleLineHeight - 1) / 2;\n }\n\n charInfo.offsetX.push(charInfo.width);\n // 计算字段宽度*富文本字体大小*缩放因子*整体文本大小+每个字符的间距(每个字符间距存疑,因为实际测量的宽度已经包含了间距)\n charInfo.width += (textWidth <= 0 ? 0 : textWidth) * fontSize * this.SCALE_FACTOR * this.textStyle.fontScale + text.length * letterSpace;\n\n // 将富文本数据存入 charInfo\n charInfo.richOptions.push(options);\n });\n\n // 存储最后一行的字符信息,并且更新最终的宽度和高度用于确定 canvas 尺寸\n charsInfo.push(charInfo);\n width = Math.max(width, charInfo.width);\n height += charInfo.lineHeight;\n\n if (width === 0 || height === 0) {\n this.isDirty = false;\n context.restore();\n\n return;\n }\n\n if (this.size === undefined || this.size === null) {\n this.size = this.item.transform.size.clone();\n }\n\n const { x = 1, y = 1 } = this.size;\n\n // 首次渲染时初始化 canvas 尺寸和组件变换\n if (!this.initialized) {\n this.canvasSize = !this.canvasSize ? new math.Vector2(width, height) : this.canvasSize;\n const { x: canvasWidth, y: canvasHeight } = this.canvasSize;\n\n this.item.transform.size.set(\n x * canvasWidth * this.SCALE_FACTOR * this.SCALE_FACTOR,\n y * canvasHeight * this.SCALE_FACTOR * this.SCALE_FACTOR,\n );\n this.size = this.item.transform.size.clone();\n this.initialized = true;\n }\n\n assertExist(this.canvasSize);\n\n const { x: canvasWidth, y: canvasHeight } = this.canvasSize;\n\n this.textLayout.width = canvasWidth / textStyle.fontScale;\n this.textLayout.height = canvasHeight / textStyle.fontScale;\n this.canvas.width = canvasWidth;\n this.canvas.height = canvasHeight;\n\n context.clearRect(0, 0, canvasWidth, canvasHeight);\n // fix bug 1/255\n context.fillStyle = `rgba(255, 255, 255, ${this.ALPHA_FIX_VALUE})`;\n\n if (!flipY) {\n context.translate(0, canvasHeight);\n context.scale(1, -1);\n }\n\n if (charsInfo.length === 0) {\n context.restore();\n\n return;\n }\n\n let charsLineHeight = textLayout.getOffsetY(textStyle, charsInfo.length, fontHeight * this.singleLineHeight, textStyle.fontSize);\n\n charsInfo.forEach((charInfo, index) => {\n const { richOptions, offsetX, width } = charInfo;\n let charWidth = width;\n let offset = offsetX;\n\n if (overflow === spec.TextOverflow.display) {\n if (width > canvasWidth) {\n const canvasScale = canvasWidth / width;\n\n charWidth *= canvasScale;\n offset = offsetX.map(x => x * canvasScale);\n }\n }\n\n const x = this.textLayout.getOffsetX(textStyle, charWidth);\n\n if (index > 0) {\n charsLineHeight += charInfo.lineHeight - charInfo.offsetY;\n }\n\n richOptions.forEach((options, index) => {\n const { fontScale, textColor, fontFamily: textFamily, textWeight, fontStyle: richStyle } = textStyle;\n const { text, fontSize, fontColor = textColor, fontFamily = textFamily, fontWeight = textWeight, fontStyle = richStyle } = options;\n let textSize = fontSize;\n\n if (overflow === spec.TextOverflow.display) {\n if (width > canvasWidth) {\n textSize /= width / canvasWidth;\n }\n }\n\n const strOffsetX = offset[index] + x;\n\n context.font = `${fontStyle} ${fontWeight} ${textSize * fontScale}px ${fontFamily}`;\n context.fillStyle = `rgba(${fontColor[0]}, ${fontColor[1]}, ${fontColor[2]}, ${fontColor[3]})`;\n\n context.fillText(text, strOffsetX, charsLineHeight);\n });\n });\n\n // 与 toDataURL() 两种方式都需要像素读取操作\n const imageData = context.getImageData(0, 0, this.canvas.width, this.canvas.height);\n\n const texture = Texture.createWithData(\n this.engine,\n {\n data: new Uint8Array(imageData.data),\n width: imageData.width,\n height: imageData.height,\n },\n {\n flipY,\n magFilter: glContext.LINEAR,\n minFilter: glContext.LINEAR,\n wrapS: glContext.CLAMP_TO_EDGE,\n wrapT: glContext.CLAMP_TO_EDGE,\n },\n );\n\n this.disposeTextTexture();\n this.renderer.texture = texture;\n this.material.setTexture('_MainTex', texture);\n this.isDirty = false;\n\n context.restore();\n }\n\n private updateTextureModern (flipY: boolean) {\n // 解析富文本\n this.generateTextProgram(this.text);\n\n const { textLayout, textStyle } = this;\n const { overflow, letterSpace = 0 } = textLayout;\n const context = this.context;\n let width = 0;\n let height = 0;\n\n if (!context) {\n return;\n }\n\n context.save();\n\n const charsInfo: RichCharInfo[] = [];\n const fontHeight = textStyle.fontSize * this.textStyle.fontScale;\n let charInfo: RichCharInfo = {\n richOptions: [],\n offsetX: [],\n width: 0,\n // 包括字体和上下行间距的高度\n lineHeight: fontHeight * this.singleLineHeight + (this.textLayout.lineGap || 0) * this.textStyle.fontScale,\n // 字体偏移高度(也就是行间距)\n offsetY: (this.textLayout.lineGap || 0) * this.textStyle.fontScale / 2,\n chars: [],\n };\n\n // 遍历解析后的文本选项\n this.processedTextOptions.forEach(options => {\n const { text, isNewLine, fontSize } = options;\n\n // 如果是新行,则结束上一行并开始新行\n if (isNewLine) {\n // 结束上一行:累加行高并重置charInfo\n height += charInfo.lineHeight;\n charsInfo.push(charInfo);\n width = Math.max(width, charInfo.width);\n\n // 初始化新行\n charInfo = {\n richOptions: [],\n offsetX: [],\n width: 0,\n lineHeight: fontHeight * this.singleLineHeight + (this.textLayout.lineGap || 0) * this.textStyle.fontScale,\n offsetY: (this.textLayout.lineGap || 0) * this.textStyle.fontScale / 2,\n chars: [],\n };\n }\n\n // 恢复默认设置\n context.font = `${options.fontWeight || textStyle.textWeight} 10px ${options.fontFamily || textStyle.fontFamily}`;\n\n const textHeight = fontSize * this.singleLineHeight * this.textStyle.fontScale + (this.textLayout.lineGap || 0) * this.textStyle.fontScale;\n\n // 更新当前行的最大行高\n if (textHeight > charInfo.lineHeight) {\n charInfo.lineHeight = textHeight;\n charInfo.offsetY = (this.textLayout.lineGap || 0) * this.textStyle.fontScale / 2;\n }\n\n charInfo.offsetX.push(charInfo.width);\n\n // 逐字计算宽度以实现字符间距\n let segmentInnerX = 0;\n const charArr: CharDetail[] = [];\n\n for (let i = 0; i < text.length; i++) {\n const char = text[i];\n const tempcharWidth = context.measureText(char).width;\n const charWidth = (tempcharWidth <= 0 ? 0 : tempcharWidth) * fontSize * this.SCALE_FACTOR * this.textStyle.fontScale;\n\n charArr.push({\n char,\n x: segmentInnerX,\n width: charWidth,\n });\n segmentInnerX += charWidth + letterSpace;\n }\n\n charInfo.chars.push(charArr);\n charInfo.width += segmentInnerX;\n charInfo.richOptions.push(options);\n });\n\n // 结束最后一行\n height += charInfo.lineHeight;\n charsInfo.push(charInfo);\n width = Math.max(width, charInfo.width);\n\n if (width === 0 || height === 0) {\n this.isDirty = false;\n context.restore();\n\n return;\n }\n\n if (this.size === undefined || this.size === null) {\n this.size = this.item.transform.size.clone();\n }\n\n const { x = 1, y = 1 } = this.size;\n\n // 首次渲染时初始化 canvas 尺寸和组件变换\n if (!this.initialized) {\n this.canvasSize = !this.canvasSize ? new math.Vector2(width, height) : this.canvasSize;\n const { x: canvasWidth, y: canvasHeight } = this.canvasSize;\n\n this.item.transform.size.set(x * canvasWidth * this.SCALE_FACTOR * this.SCALE_FACTOR, y * canvasHeight * this.SCALE_FACTOR * this.SCALE_FACTOR);\n this.size = this.item.transform.size.clone();\n this.initialized = true;\n }\n\n assertExist(this.canvasSize);\n\n const { x: canvasWidth, y: canvasHeight } = this.canvasSize;\n\n this.textLayout.width = canvasWidth / textStyle.fontScale;\n this.textLayout.height = canvasHeight / textStyle.fontScale;\n this.canvas.width = canvasWidth;\n this.canvas.height = canvasHeight;\n\n context.clearRect(0, 0, canvasWidth, canvasHeight);\n // fix bug 1/255\n context.fillStyle = `rgba(255, 255, 255, ${this.ALPHA_FIX_VALUE})`;\n\n if (!flipY) {\n context.translate(0, canvasHeight);\n context.scale(1, -1);\n }\n\n if (charsInfo.length === 0) {\n context.restore();\n\n return;\n }\n\n // 行高数组\n const lineHeights = charsInfo.map(l => l.lineHeight);\n\n // 计算第一行基线Y坐标\n const firstLine = charsInfo[0];\n const firstLineMaxFontSize = Math.max(...(firstLine?.richOptions?.map(opt => opt.fontSize) ?? [this.textStyle.fontSize]));\n const fontSizeForOffset = firstLineMaxFontSize * this.textStyle.fontScale * this.singleLineHeight;\n\n let baselineY = textLayout.getOffsetYRich(this.textStyle, lineHeights, fontSizeForOffset);\n\n // 逐行绘制\n charsInfo.forEach((charInfo, index) => {\n const { richOptions, offsetX, width, chars } = charInfo;\n const charsArr = chars;\n let charWidth = width;\n let offset = offsetX;\n\n if (overflow === spec.TextOverflow.display) {\n if (width > canvasWidth) {\n const canvasScale = canvasWidth / width;\n\n charWidth *= canvasScale;\n offset = offsetX.map(x => x * canvasScale);\n charsArr.forEach(charArr => {\n charArr.forEach(charDetail => {\n charDetail.x *= canvasScale;\n charDetail.width *= canvasScale;\n });\n });\n }\n }\n\n const x = this.textLayout.getOffsetX(textStyle, charWidth);\n\n richOptions.forEach((options, segIndex) => {\n const { fontScale, textColor, fontFamily: textFamily, textWeight, fontStyle: richStyle } = textStyle;\n const { fontSize, fontColor = textColor, fontFamily = textFamily, fontWeight = textWeight, fontStyle = richStyle } = options;\n let textSize = fontSize;\n\n if (overflow === spec.TextOverflow.display && width > canvasWidth) {\n textSize /= width / canvasWidth;\n }\n\n const strOffsetX = offset[segIndex] + x;\n\n context.font = `${fontStyle} ${fontWeight} ${textSize * fontScale}px ${fontFamily}`;\n context.fillStyle = `rgba(${fontColor[0]}, ${fontColor[1]}, ${fontColor[2]}, ${fontColor[3]})`;\n\n // 逐字绘制\n const charArr = charInfo.chars[segIndex];\n\n charArr.forEach(charDetail => {\n context.fillText(charDetail.char, strOffsetX + charDetail.x, baselineY);\n });\n });\n\n // 推进到下一行\n if (index < charsInfo.length - 1) {\n baselineY += lineHeights[index + 1];\n }\n });\n\n const imageData = context.getImageData(0, 0, this.canvas.width, this.canvas.height);\n const texture = Texture.createWithData(\n this.engine,\n {\n data: new Uint8Array(imageData.data),\n width: imageData.width,\n height: imageData.height,\n },\n {\n flipY,\n magFilter: glContext.LINEAR,\n minFilter: glContext.LINEAR,\n wrapS: glContext.CLAMP_TO_EDGE,\n wrapT: glContext.CLAMP_TO_EDGE,\n },\n );\n\n this.renderer.texture = texture;\n this.material.setTexture('_MainTex', texture);\n this.isDirty = false;\n\n context.restore();\n }\n\n /**\n * 该方法富文本组件不支持\n * @param value - 水平偏移距离\n * @returns\n */\n override setShadowOffsetY (value: number): void {\n throw new Error('Method not implemented.');\n }\n\n /**\n * 该方法富文本组件不支持\n * @param value - 模糊程度\n */\n override setShadowBlur (value: number): void {\n throw new Error('Method not implemented.');\n }\n\n /**\n * 该方法富文本组件不支持\n * @param value - 水平偏移距离\n */\n override setShadowOffsetX (value: number): void {\n throw new Error('Method not implemented.');\n }\n\n /**\n * 该方法富文本组件不支持\n * @param value - 阴影颜色\n */\n override setShadowColor (value: spec.RGBAColorValue): void {\n throw new Error('Method not implemented.');\n }\n\n /**\n * 该方法富文本组件不支持\n * @param value - 外描边宽度\n * @returns\n */\n override setOutlineWidth (value: number): void {\n throw new Error('Method not implemented.');\n }\n\n /**\n * 该方法富文本组件不支持\n * @param value - 是否自动设置宽度\n */\n override setAutoWidth (value: boolean): void {\n throw new Error('Method not implemented.');\n }\n\n override updateWithOptions (options: spec.TextContentOptions) {\n this.textStyle = new TextStyle(options);\n this.textLayout = new TextLayout(options);\n this.textLayout.textBaseline = options.textBaseline || spec.TextBaseline.middle;\n this.text = options.text ? options.text.toString() : ' ';\n }\n\n protected override renderText (options: spec.RichTextContentOptions) {\n const { size } = options;\n\n if (size) {\n this.canvasSize = new math.Vector2(size[0], size[1]);\n }\n this.updateTexture();\n }\n\n}\n","import * as EFFECTS from '@galacean/effects';\nimport { logger, registerPlugin, VFXItem } from '@galacean/effects';\nimport { RichTextLoader } from './rich-text-loader';\n\nexport * from './rich-text-parser';\nexport * from './rich-text-component';\nexport * from './rich-text-loader';\n\n/**\n * 插件版本号\n */\nexport const version = __VERSION__;\n\nregisterPlugin('rich-text', RichTextLoader, VFXItem);\n\nlogger.info(`Plugin rich text version: ${version}.`);\n\nif (version !== EFFECTS.version) {\n console.error(\n '注意:请统一 RichText 插件与 Player 版本,不统一的版本混用会有不可预知的后果!',\n '\\nAttention: Please ensure the RichText plugin is synchronized with the Player version. Mixing and matching incompatible versions may result in unpredictable consequences!'\n );\n}\n"],"names":["_set_prototype_of","o","p","Object","setPrototypeOf","__proto__","_inherits","subClass","superClass","TypeError","prototype","create","constructor","value","writable","configurable","RichTextLoader","AbstractPlugin","name","_array_like_to_array","arr","len","length","i","arr2","Array","_create_for_of_iterator_helper_loose","allowArrayLike","it","Symbol","iterator","call","next","bind","isArray","minLen","n","toString","slice","from","test","_unsupported_iterable_to_array","done","TokenType","contextStartRegexp","contextEndRegexp","rules","lexer","input","lexed","cursor","escapedMatch","exec","actualChar","concat","tokenType","_step","_iterator","regex","match","tokenMatch","Error","richTextParser","Text","combinedText","hasTextToken","textToken","shift","undefined","ContextStart","maybeContextStart","peek","matches","attributeName","attributeParam","ContextEnd","maybeContextEnd","shifted","ast","Grammar","attributes","expectedEndAttributeName","maybeText","push","text","endAttributeName","generateProgram","textHandler","richText","node","context","reduce","ctx","isRichText","contextTokens","filter","param","contextStartTokens","contextEndTokens","checkPaired","startContextAttributes","token","restToken","map","escape","replace","unescape","hexToRGBA","hex","alpha","split","char","join","a","parseInt","bigint","toRGBA","color","startsWith","colorName","document","canvas","createElement","getContext","fillStyle","remove","colorNameToRGBA","SuppressedError","seed","RichTextComponent","TextComponent","engine","processedTextOptions","singleLineHeight","size","_this","initialized","canvasSize","_proto","generateTextProgram","this","program","forEach","index","options","fontSize","textStyle","isNewLine","fontWeight","spec","TextWeight","bold","fontStyle","FontStyle","italic","fontColor","updateTexture","flipY","isDirty","useLegacy","textLayout","useLegacyRichText","updateTextureLegacy","updateTextureModern","overflow","letterSpace","_textLayout_letterSpace","width","height","save","charsInfo","fontHeight","fontScale","charInfo","richOptions","offsetX","lineHeight","offsetY","Math","max","font","textWeight","fontFamily","textMetrics","measureText","textWidth","actualBoundingBoxLeft","actualBoundingBoxRight","actualWidth","textHeight","SCALE_FACTOR","restore","item","transform","clone","_this_size","_this_size_x","x","_this_size_y","y","math","Vector2","_this_canvasSize","set","canvasWidth","canvasHeight","assertExist","_this_canvasSize1","clearRect","ALPHA_FIX_VALUE","translate","scale","charsLineHeight","getOffsetY","charWidth","offset","TextOverflow","display","canvasScale","getOffsetX","textColor","textFamily","richStyle","textSize","strOffsetX","fillText","imageData","getImageData","texture","Texture","createWithData","data","Uint8Array","magFilter","glContext","LINEAR","minFilter","wrapS","CLAMP_TO_EDGE","wrapT","disposeTextTexture","renderer","material","setTexture","firstLine","lineGap","chars","segmentInnerX","charArr","tempcharWidth","lineHeights","l","fontSizeForOffset","opt","baselineY","getOffsetYRich","charsArr","charDetail","segIndex","setShadowOffsetY","setShadowBlur","setShadowOffsetX","setShadowColor","setOutlineWidth","setAutoWidth","updateWithOptions","TextStyle","TextLayout","textBaseline","TextBaseline","middle","renderText","decorators","target","key","desc","d","c","arguments","r","getOwnPropertyDescriptor","Reflect","decorate","defineProperty","effectsClass","DataType","version","registerPlugin","VFXItem","logger","info","EFFECTS","console","error"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"weapp.mjs","sources":["../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_set_prototype_of.js","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_inherits.js","../src/rich-text-loader.ts","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_array_like_to_array.js","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_create_for_of_iterator_helper_loose.js","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_unsupported_iterable_to_array.js","../src/rich-text-parser.ts","../../../node_modules/.pnpm/tslib@2.8.1/node_modules/tslib/tslib.es6.mjs","../src/rich-text-layout.ts","../src/color-utils.ts","../src/strategies/wrap/rich-wrap-disabled.ts","../src/strategies/wrap/rich-wrap-enabled.ts","../src/strategies/overflow/rich-display-overflow.ts","../src/strategies/overflow/rich-clipped-overflow.ts","../src/strategies/overflow/rich-visible-overflow.ts","../src/strategies/align/rich-horizontal-align.ts","../src/strategies/align/rich-vertical-align.ts","../src/strategies/rich-text-factory.ts","../src/rich-text-component.ts","../src/index.ts"],"sourcesContent":["function _set_prototype_of(o, p) {\n _set_prototype_of = Object.setPrototypeOf || function setPrototypeOf(o, p) {\n o.__proto__ = p;\n\n return o;\n };\n\n return _set_prototype_of(o, p);\n}\nexport { _set_prototype_of as _ };\n","import { _ as _set_prototype_of } from \"./_set_prototype_of.js\";\n\nfunction _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } });\n\n if (superClass) _set_prototype_of(subClass, superClass);\n}\nexport { _inherits as _ };\n","import { AbstractPlugin } from '@galacean/effects';\n\nexport class RichTextLoader extends AbstractPlugin {\n override name = 'rich-text';\n}\n","function _array_like_to_array(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n return arr2;\n}\nexport { _array_like_to_array as _ };\n","import { _ as _unsupported_iterable_to_array } from \"./_unsupported_iterable_to_array.js\";\n\nfunction _create_for_of_iterator_helper_loose(o, allowArrayLike) {\n var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"];\n\n if (it) return (it = it.call(o)).next.bind(it);\n // Fallback for engines without symbol support\n if (Array.isArray(o) || (it = _unsupported_iterable_to_array(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n if (it) o = it;\n\n var i = 0;\n\n return function() {\n if (i >= o.length) return { done: true };\n\n return { done: false, value: o[i++] };\n };\n }\n\n throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nexport { _create_for_of_iterator_helper_loose as _ };\n","import { _ as _array_like_to_array } from \"./_array_like_to_array.js\";\n\nfunction _unsupported_iterable_to_array(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _array_like_to_array(o, minLen);\n\n var n = Object.prototype.toString.call(o).slice(8, -1);\n\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(n);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);\n}\nexport { _unsupported_iterable_to_array as _ };\n","enum TokenType {\n ContextStart = 'ContextStart',\n Text = 'Text',\n ContextEnd = 'ContextEnd',\n EscapedChar = 'EscapedChar',\n}\n\nexport type Token = {\n tokenType: TokenType,\n value: string,\n};\n\nconst contextStartRegexp = /^<([a-z]+)(=([^>]+))?>$/;\nconst contextEndRegexp = /^<\\/([a-z]+)>$/;\n\nconst rules: [TokenType, RegExp][] = [\n [TokenType.EscapedChar, /^\\\\([=<>\\\\/])/],\n [TokenType.ContextStart, /^<[a-z]+(=[^>]+)?>/],\n [TokenType.ContextEnd, /^<\\/[a-z]+>/],\n [TokenType.Text, /^[^</>=\\\\]+/],\n];\n\nexport const lexer = (input: string, lexed: Token[] = [], cursor = 0): Token[] => {\n if (!input) {\n return lexed;\n }\n\n const escapedMatch = /^\\\\([=<>\\\\/])/.exec(input);\n\n if (escapedMatch) {\n const actualChar = escapedMatch[1];\n\n return lexer(input.slice(2), lexed.concat({ tokenType: TokenType.Text, value: actualChar }), cursor + 2);\n }\n\n for (const [tokenType, regex] of rules) {\n if (tokenType === TokenType.EscapedChar) { continue; }\n\n const match = regex.exec(input);\n\n if (!match) { continue; }\n\n const tokenMatch = match[0];\n const len = tokenMatch.length;\n\n return lexer(input.slice(len), lexed.concat({ tokenType, value: tokenMatch }), cursor + len);\n }\n\n if (input.length > 0) {\n return lexer(input.slice(1), lexed.concat({ tokenType: TokenType.Text, value: input[0] }), cursor + 1);\n }\n\n throw new Error(`Unexpected token: \"${input[0]}\" at position ${cursor} while reading \"${input}\"`);\n};\n\nexport type Attribute = {\n attributeName?: string,\n attributeParam?: string,\n};\n\nexport type RichTextAST = {\n attributes: Attribute[],\n text: string,\n};\n\nexport const richTextParser = (input: string): RichTextAST[] => {\n const lexed = lexer(input);\n let cursor = 0;\n\n const shift = () => {\n const shifted = lexed.shift();\n\n cursor += shifted?.value.length ?? 0;\n\n return shifted;\n };\n\n const peek = () => {\n return lexed[0];\n };\n\n const ast: RichTextAST[] = [];\n\n function Grammar (attributes: Attribute[] = [], expectedEndAttributeName = '') {\n const parsing = true;\n\n while (parsing) {\n const maybeText = Text();\n\n if (maybeText) {\n ast.push({\n attributes,\n text: maybeText,\n });\n\n continue;\n }\n\n const { attributeName, attributeParam } = ContextStart();\n\n if (attributeName) {\n Grammar(attributes.concat({ attributeName, attributeParam: attributeParam ?? '' }), attributeName);\n\n continue;\n }\n\n if (expectedEndAttributeName) {\n const { attributeName: endAttributeName } = ContextEnd();\n\n if (!endAttributeName) {\n throw new Error(`Expect an end tag marker \"${expectedEndAttributeName}\" at position ${cursor} but found no tag!`);\n }\n\n if (endAttributeName !== expectedEndAttributeName) {\n throw new Error(`Expect an end tag marker \"${expectedEndAttributeName}\" at position ${cursor} but found tag \"${endAttributeName}\"`);\n }\n\n return;\n }\n\n break;\n }\n }\n\n function Text (): string | undefined {\n let combinedText = '';\n let hasTextToken = false;\n\n while (lexed.length > 0 && lexed[0]?.tokenType === TokenType.Text) {\n const textToken = shift();\n\n if (textToken) {\n combinedText += textToken.value;\n hasTextToken = true;\n }\n }\n\n return hasTextToken ? combinedText : undefined;\n }\n\n function ContextStart (): { attributeName?: string, attributeParam?: string } {\n const maybeContextStart = peek();\n\n if (maybeContextStart?.tokenType === TokenType.ContextStart) {\n shift();\n\n const matches = maybeContextStart.value.match(contextStartRegexp);\n\n if (matches) {\n const attributeName = matches[1];\n const attributeParam = matches[3] ?? '';\n\n return { attributeName, attributeParam };\n }\n\n throw new Error(`Expected a start tag marker at position ${cursor}`);\n }\n\n return {};\n }\n\n function ContextEnd (): { attributeName?: string } {\n const maybeContextEnd = peek();\n\n if (maybeContextEnd?.tokenType === TokenType.ContextEnd) {\n shift();\n\n const matches = maybeContextEnd.value.match(contextEndRegexp);\n\n if (matches) {\n const attributeName = matches[1];\n\n return { attributeName };\n }\n\n throw new Error(`Expect an end tag marker at position ${cursor}`);\n }\n\n return {};\n }\n\n Grammar();\n\n return ast;\n};\n\nexport function generateProgram (textHandler: (text: string, context: Record<string, string | undefined>) => void) {\n return (richText: string) => {\n const ast = richTextParser(richText);\n\n for (const node of ast) {\n const text = node.text;\n const context = node.attributes.reduce<Record<string, string | undefined>>((ctx, { attributeName, attributeParam }) => {\n if (attributeName) {\n ctx[attributeName] = attributeParam;\n }\n\n return ctx;\n }, {});\n\n textHandler(text, context);\n }\n };\n}\n\nexport function isRichText (text: string): boolean {\n const lexed = lexer(text);\n\n const contextTokens = lexed.filter(({ tokenType }) => tokenType === TokenType.ContextStart || tokenType === TokenType.ContextEnd);\n\n const contextStartTokens = contextTokens.filter(({ tokenType }) => tokenType === TokenType.ContextStart);\n const contextEndTokens = contextTokens.filter(({ tokenType }) => tokenType === TokenType.ContextEnd);\n\n if (contextStartTokens.length !== contextEndTokens.length || !contextStartTokens.length) {\n return false;\n }\n\n const tokensOfAttribute = contextTokens.map(({ tokenType, value }) => ({ tokenType, value: tokenType === TokenType.ContextStart ? value.match(contextStartRegexp)![1] : value.match(contextEndRegexp)![1] }));\n\n function checkPaired ([token, ...restToken]: Token[], startContextAttributes: string[] = []): boolean {\n if (!token) {\n return startContextAttributes.length === 0;\n }\n\n if (token.tokenType === TokenType.ContextStart) {\n return checkPaired(restToken, startContextAttributes.concat(token.value));\n } else if (token.tokenType === TokenType.ContextEnd) {\n const attributeName = startContextAttributes[startContextAttributes.length - 1];\n\n if (attributeName !== token.value) {\n return false;\n }\n\n return checkPaired(restToken, startContextAttributes.slice(0, -1));\n }\n\n throw new Error(`Unexpected token: ${token.tokenType}`);\n }\n\n return checkPaired(tokensOfAttribute);\n}\n\n/**\n * 转义富文本中的特殊字符\n * @param input - 需要转义的输入字符串\n * @returns 转义后的字符串\n */\nexport function escape (input: string): string {\n if (typeof input !== 'string') {\n throw new Error('Input must be a string');\n }\n\n return input\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/=/g, '\\\\=')\n .replace(/</g, '\\\\<')\n .replace(/>/g, '\\\\>')\n .replace(/\\//g, '\\\\/');\n}\n\n/**\n * 反转义富文本中的特殊字符\n * @param input - 需要反转义的输入字符串\n * @returns 反转义后的字符串\n */\nexport function unescape (input: string): string {\n if (typeof input !== 'string') {\n throw new Error('Input must be a string');\n }\n\n return input\n .replace(/\\\\\\//g, '/')\n .replace(/\\\\>/g, '>')\n .replace(/\\\\</g, '<')\n .replace(/\\\\=/g, '=')\n .replace(/\\\\\\\\/g, '\\\\');\n}\n","/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\n\nvar extendStatics = function(d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n }\n return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n var _, done = false;\n for (var i = decorators.length - 1; i >= 0; i--) {\n var context = {};\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n if (kind === \"accessor\") {\n if (result === void 0) continue;\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n if (_ = accept(result.get)) descriptor.get = _;\n if (_ = accept(result.set)) descriptor.set = _;\n if (_ = accept(result.init)) initializers.unshift(_);\n }\n else if (_ = accept(result)) {\n if (kind === \"field\") initializers.unshift(_);\n else descriptor[key] = _;\n }\n }\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\n done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n var useValue = arguments.length > 2;\n for (var i = 0; i < initializers.length; i++) {\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n }\n return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\n\nexport function __generator(thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++)\n ar = ar.concat(__read(arguments[i]));\n return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n function fulfill(value) { resume(\"next\", value); }\n function reject(value) { resume(\"throw\", value); }\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n var i, p;\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var m = o[Symbol.asyncIterator], i;\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n};\n\nvar ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n};\n\nexport function __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n}\n\nexport function __importDefault(mod) {\n return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport function __addDisposableResource(env, value, async) {\n if (value !== null && value !== void 0) {\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\n var dispose, inner;\n if (async) {\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\n dispose = value[Symbol.asyncDispose];\n }\n if (dispose === void 0) {\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\n dispose = value[Symbol.dispose];\n if (async) inner = dispose;\n }\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\n env.stack.push({ value: value, dispose: dispose, async: async });\n }\n else if (async) {\n env.stack.push({ async: true });\n }\n return value;\n}\n\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n var e = new Error(message);\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\nexport function __disposeResources(env) {\n function fail(e) {\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\n env.hasError = true;\n }\n var r, s = 0;\n function next() {\n while (r = env.stack.pop()) {\n try {\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\n if (r.dispose) {\n var result = r.dispose.call(r.value);\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\n }\n else s |= 1;\n }\n catch (e) {\n fail(e);\n }\n }\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\n if (env.hasError) throw env.error;\n }\n return next();\n}\n\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\n });\n }\n return path;\n}\n\nexport default {\n __extends,\n __assign,\n __rest,\n __decorate,\n __param,\n __esDecorate,\n __runInitializers,\n __propKey,\n __setFunctionName,\n __metadata,\n __awaiter,\n __generator,\n __createBinding,\n __exportStar,\n __values,\n __read,\n __spread,\n __spreadArrays,\n __spreadArray,\n __await,\n __asyncGenerator,\n __asyncDelegator,\n __asyncValues,\n __makeTemplateObject,\n __importStar,\n __importDefault,\n __classPrivateFieldGet,\n __classPrivateFieldSet,\n __classPrivateFieldIn,\n __addDisposableResource,\n __disposeResources,\n __rewriteRelativeImportExtension,\n};\n","import type { TextStyle, BaseLayout } from '@galacean/effects';\nimport { spec } from '@galacean/effects';\n\nexport class RichTextLayout implements BaseLayout {\n textVerticalAlign: spec.TextVerticalAlign;\n textAlign: spec.TextAlignment;\n letterSpace: number;\n overflow: spec.TextOverflow;\n width = 0;\n height = 0;\n\n /**\n * 是否使用旧版富文本渲染\n */\n useLegacyRichText: boolean;\n\n /**\n * 文本框是否开启自动换行\n */\n wrapEnabled: boolean;\n\n /**\n * 文本框最大宽度限制\n */\n maxTextWidth: number;\n\n /**\n * 文本框最大高度限制\n */\n maxTextHeight: number;\n\n /**\n * 文本框大小模式\n */\n sizeMode: spec.TextSizeMode;\n\n /**\n * 文本行高\n */\n lineHeight: number;\n\n constructor (options: spec.RichTextContentOptions) {\n const {\n size,\n textOverflow = spec.TextOverflow.clip,\n textVerticalAlign = spec.TextVerticalAlign.middle,\n textAlign = spec.TextAlignment.left,\n letterSpace = 0,\n lineHeight = 0.571,\n wrapEnabled = false,\n maxTextWidth = 350,\n maxTextHeight = 1000,\n sizeMode = spec.TextSizeMode.autoWidth,\n // @ts-expect-error 兼容旧版\n useLegacyRichText = false,\n } = options;\n\n this.letterSpace = letterSpace;\n this.lineHeight = lineHeight * 300;\n this.useLegacyRichText = useLegacyRichText;\n this.overflow = textOverflow;\n this.textVerticalAlign = textVerticalAlign;\n this.textAlign = textAlign;\n this.width = size ? size[0] : 100;\n this.height = size ? size[1] : 100;\n\n this.wrapEnabled = wrapEnabled;\n this.maxTextWidth = maxTextWidth;\n this.maxTextHeight = maxTextHeight;\n this.sizeMode = sizeMode;\n }\n\n getOffsetY (\n style: TextStyle,\n lineCount: number,\n lineHeight: number,\n fontSize: number,\n totalLineHeight?: number,\n ): number {\n const { outlineWidth, fontScale } = style;\n // /3 计算Y轴偏移量,以匹配编辑器行为\n const offsetY = (lineHeight - fontSize) / 3;\n // 计算基础偏移量\n const baseOffset = fontSize + outlineWidth * fontScale;\n const commonCalculation = totalLineHeight !== undefined ? totalLineHeight : lineHeight * (lineCount - 1);\n let offsetResult = 0;\n\n switch (this.textVerticalAlign) {\n case spec.TextVerticalAlign.top:\n offsetResult = baseOffset + offsetY;\n\n break;\n case spec.TextVerticalAlign.middle:\n offsetResult = (this.height * fontScale - commonCalculation + baseOffset) / 2;\n\n break;\n case spec.TextVerticalAlign.bottom:\n offsetResult = (this.height * fontScale - commonCalculation) - offsetY;\n\n break;\n default:\n break;\n }\n\n return offsetResult;\n }\n\n getOffsetX (style: TextStyle, maxWidth: number): number {\n let offsetX = 0;\n\n switch (this.textAlign) {\n case spec.TextAlignment.left:\n offsetX = style.outlineWidth * style.fontScale;\n\n break;\n case spec.TextAlignment.middle:\n offsetX = (this.width * style.fontScale - maxWidth) / 2;\n\n break;\n case spec.TextAlignment.right:\n offsetX = (this.width * style.fontScale - maxWidth);\n\n break;\n default:\n break;\n }\n\n return offsetX;\n }\n\n /**\n * 富文本垂直对齐计算\n * @param style - 字体样式\n * @param lineHeights - 每行高度数组\n * @param fontSize - 字体大小\n * @returns 第一行基线的Y坐标\n */\n getOffsetYRich (\n style: TextStyle,\n lineHeights: number[],\n fontSize: number,\n ): number {\n if (lineHeights.length === 0) {\n // 空文本时返回 0,避免计算异常;后续策略可按需要再调整\n return 0;\n }\n const { outlineWidth, fontScale } = style;\n const total = lineHeights.reduce((a, b) => a + b, 0);\n const offsetY = (lineHeights[0] - fontSize) / 3;\n const baseOffset = fontSize + outlineWidth * fontScale;\n const commonCalculation = total - lineHeights[0];\n let offsetResult = 0;\n\n switch (this.textVerticalAlign) {\n case spec.TextVerticalAlign.top:\n offsetResult = baseOffset + offsetY;\n\n break;\n case spec.TextVerticalAlign.middle:\n offsetResult = (this.height * fontScale - total) / 2 + baseOffset;\n\n break;\n case spec.TextVerticalAlign.bottom:\n offsetResult = (this.height * fontScale - commonCalculation) - offsetY;\n\n break;\n default:\n break;\n }\n\n return offsetResult;\n }\n\n /**\n * 富文本横向对齐计算\n * @param style - 字体样式\n * @param maxWidth - 文本框最大宽度\n * @param contentW - 文本实际宽度\n * @returns 水平偏移量\n */\n getOffsetXRich (style: TextStyle, maxWidth: number, contentW: number): number {\n switch (this.textAlign) {\n case spec.TextAlignment.left:\n return style.outlineWidth;\n case spec.TextAlignment.middle:\n return (maxWidth - contentW) / 2;\n case spec.TextAlignment.right:\n return maxWidth - contentW;\n default:\n return 0;\n }\n }\n\n setSize (width: number, height: number): void {\n this.width = width;\n this.height = height;\n }\n}\n","import type { spec } from '@galacean/effects';\n\n/**\n * 将颜色名称转换为 RGBA\n * @param colorName - 颜色名称\n * @returns RGBA 颜色字符串\n */\nexport function colorNameToRGBA (colorName: string): string {\n if (typeof colorName !== 'string' || !colorName) {\n throw new Error('Invalid color name provided');\n }\n if (typeof document === 'undefined') {\n throw new Error('This method requires a browser environment');\n }\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n\n if (context) {\n try {\n context.fillStyle = colorName;\n const result = context.fillStyle;\n\n return result;\n } finally {\n // Clean up DOM element\n canvas.remove();\n }\n }\n\n throw new Error('Failed to get 2D context for color conversion!');\n}\n\n/**\n * 将 16 进制颜色转换为 RGBA\n * @param hex - 16 进制颜色\n * @param alpha - 透明度\n * @returns - RGBA 颜色\n */\nexport function hexToRGBA (hex: string, alpha: number = 1): spec.vec4 {\n hex = hex.replace(/^#/, '');\n\n if (hex.length === 3 || hex.length === 4) {\n hex = hex.split('').map(char => char + char).join('');\n }\n\n // Handle alpha channel in hex\n if (hex.length === 8) {\n const a = parseInt(hex.slice(6, 8), 16) / 255;\n\n hex = hex.slice(0, 6);\n alpha = a;\n }\n const bigint = parseInt(hex, 16);\n const r = (bigint >> 16) & 255;\n const g = (bigint >> 8) & 255;\n const b = bigint & 255;\n\n return [r, g, b, alpha];\n}\n\n/**\n * 将颜色字符串转换为 RGBA\n * @param color - 颜色字符串\n * @param alpha - 透明度\n * @returns - RGBA 颜色\n */\nexport function toRGBA (color: string, alpha: number = 1): spec.vec4 {\n if (typeof color !== 'string' || !color) {\n throw new Error('Invalid color string');\n }\n if (color.startsWith('#')) {\n return hexToRGBA(color, alpha);\n } else {\n return hexToRGBA(colorNameToRGBA(color));\n }\n}\n","import type { TextStyle } from '@galacean/effects';\nimport type { RichTextLayout } from '../../rich-text-layout';\nimport type { RichTextOptions } from '../../rich-text-component';\nimport type { RichCharDetail, RichLine, RichWrapStrategy, WrapResult } from '../rich-text-interfaces';\n\n/**\n * 富文本换行禁用策略\n * 实现逻辑:仅基于\\n换行,无自动换行\n */\nexport class RichWrapDisabledStrategy implements RichWrapStrategy {\n computeLines (\n processedOptions: RichTextOptions[],\n context: CanvasRenderingContext2D,\n style: TextStyle,\n layout: RichTextLayout,\n singleLineHeight: number,\n fontScale: number,\n letterSpace: number,\n scaleFactor: number\n ): WrapResult {\n const lines: RichLine[] = [];\n const baselines: number[] = [];\n const gapPx = (layout.lineHeight || 0) * fontScale;\n let currentLine: RichLine = this.createNewLine();\n let maxLineWidth = 0;\n let totalHeight = 0;\n\n const finishCurrentLine = () => {\n if (currentLine.chars.length === 0) { return; }\n\n // 第1行用真实首行高度,其余行用 gapPx\n currentLine.lineHeight = lines.length === 0\n ? (currentLine.lineAscent || 0) + (currentLine.lineDescent || 0)\n : gapPx;\n\n // 记录本行基线\n const baseline = lines.length === 0 ? 0 : (baselines[baselines.length - 1] + gapPx);\n\n baselines.push(baseline);\n\n totalHeight += currentLine.lineHeight;\n lines.push(currentLine);\n maxLineWidth = Math.max(maxLineWidth, currentLine.width);\n currentLine = this.createNewLine();\n };\n\n processedOptions.forEach(options => {\n const { text, isNewLine, fontSize } = options;\n\n if (isNewLine) {\n // 先结束上一行\n finishCurrentLine();\n }\n\n // 用当前片段字体(权重/家族)设置测量字体\n const fontStyle = options.fontStyle || style.fontStyle || 'normal';\n\n context.font = `${fontStyle} ${options.fontWeight || style.textWeight} 10px ${options.fontFamily || style.fontFamily}`;\n\n // 记录段起始 x\n currentLine.offsetX.push(currentLine.width);\n\n // 逐字宽度和高度测量(asc/desc 测量)\n let segmentInnerX = 0;\n const charArr: RichCharDetail[] = [];\n let lineAscent = 0;\n let lineDescent = 0;\n\n for (let i = 0; i < text.length; i++) {\n const ch = text[i];\n const m = context.measureText(ch);\n const w = m.width;\n const charWidth = (w <= 0 ? 0 : w) * fontSize * scaleFactor * fontScale;\n\n // 测量 asc/desc 并按目标字号缩放\n const scale = fontSize * fontScale * scaleFactor;\n const asc = m.actualBoundingBoxAscent * scale;\n const desc = m.actualBoundingBoxDescent * scale;\n\n lineAscent = Math.max(lineAscent, asc);\n lineDescent = Math.max(lineDescent, desc);\n\n if (i > 0) {\n segmentInnerX += letterSpace; // 先加\"前一个字符与当前字符之间\"的间距\n }\n charArr.push({ char: ch, x: segmentInnerX });\n segmentInnerX += charWidth;\n }\n\n currentLine.chars.push(charArr);\n currentLine.width += segmentInnerX;\n currentLine.richOptions.push(options);\n\n // 累计行级 asc/desc\n currentLine.lineAscent = Math.max(currentLine.lineAscent || 0, lineAscent);\n currentLine.lineDescent = Math.max(currentLine.lineDescent || 0, lineDescent);\n });\n\n // 结束最后一行\n finishCurrentLine();\n\n // 计算 bbox\n let bboxTop = Infinity;\n let bboxBottom = -Infinity;\n\n if (lines.length === 0) {\n return {\n lines,\n maxLineWidth,\n totalHeight,\n bboxTop: 0,\n bboxBottom: 0,\n bboxHeight: 0,\n };\n }\n\n for (let i = 0; i < lines.length; i++) {\n bboxTop = Math.min(bboxTop, baselines[i] - (lines[i].lineAscent || 0));\n bboxBottom = Math.max(bboxBottom, baselines[i] + (lines[i].lineDescent || 0));\n }\n const bboxHeight = bboxBottom - bboxTop;\n\n return {\n lines,\n maxLineWidth,\n totalHeight,\n bboxTop,\n bboxBottom,\n bboxHeight,\n };\n }\n\n /**\n * 创建新行\n */\n private createNewLine (): RichLine {\n return {\n richOptions: [],\n offsetX: [],\n width: 0,\n lineHeight: 0,\n offsetY: 0,\n chars: [],\n lineAscent: 0,\n lineDescent: 0,\n };\n }\n}\n","import type { TextStyle } from '@galacean/effects';\nimport type { RichTextLayout } from '../../rich-text-layout';\nimport type { RichTextOptions } from '../../rich-text-component';\nimport type { RichCharDetail, RichLine, WrapResult, RichWrapStrategy } from '../rich-text-interfaces';\n\n/**\n * 富文本自动换行策略\n * 实现逻辑:基于\\n换行及自动换行\n */\nexport class RichWrapEnabledStrategy implements RichWrapStrategy {\n computeLines (\n processedOptions: RichTextOptions[],\n context: CanvasRenderingContext2D,\n style: TextStyle,\n layout: RichTextLayout,\n singleLineHeight: number,\n fontScale: number,\n letterSpace: number,\n scaleFactor: number\n ): WrapResult {\n const lines: RichLine[] = [];\n const baselines: number[] = [];\n const gapPx = (layout.lineHeight || 0) * fontScale;\n let currentLine: RichLine = this.createNewLine();\n let maxLineWidth = 0;\n let totalHeight = 0;\n\n // 切块缓冲变量\n let segStartX: number | null = null;\n let segmentInnerX = 0;\n let chunkChars: RichCharDetail[] = [];\n let chunkOptions: RichTextOptions | null = null; // 跟踪当前切块所属options\n\n // 结束当前行(含缓冲切块)\n const finishCurrentLine = () => {\n flushChunk();\n if (currentLine.chars.length === 0) { return; }\n\n // 第1行用真实首行高度,其余行用 gapPx\n currentLine.lineHeight = lines.length === 0\n ? (currentLine.lineAscent || 0) + (currentLine.lineDescent || 0)\n : gapPx;\n\n // 记录本行基线\n const baseline = lines.length === 0 ? 0 : (baselines[baselines.length - 1] + gapPx);\n\n baselines.push(baseline);\n\n totalHeight += currentLine.lineHeight;\n lines.push(currentLine);\n maxLineWidth = Math.max(maxLineWidth, currentLine.width);\n currentLine = this.createNewLine();\n segStartX = null;\n segmentInnerX = 0;\n chunkChars = [];\n chunkOptions = null;\n };\n\n // 刷新当前切块\n const flushChunk = () => {\n if (chunkChars.length === 0) { return; }\n\n if (segStartX === null) {\n segStartX = currentLine.width;\n }\n\n currentLine.offsetX.push(segStartX);\n currentLine.chars.push(chunkChars);\n if (chunkOptions) {\n currentLine.richOptions.push(chunkOptions);\n }\n\n // 重置缓冲\n segStartX = null;\n segmentInnerX = 0;\n chunkChars = [];\n chunkOptions = null;\n };\n\n processedOptions.forEach(options => {\n const { text, isNewLine, fontSize } = options;\n\n // 设置测量字体(包含fontStyle)\n const fontStyle = options.fontStyle || style.fontStyle || 'normal';\n\n context.font = `${fontStyle} ${options.fontWeight || style.textWeight} 10px ${options.fontFamily || style.fontFamily}`;\n\n // 显式换行符优先处理\n if (isNewLine) {\n flushChunk();\n finishCurrentLine();\n }\n\n // 逐字符处理\n for (let i = 0; i < text.length; i++) {\n const ch = text[i];\n\n // 获取基础宽度并计算实际宽度(动态缩放)\n const m = context.measureText(ch);\n const baseW = m.width;\n const charWidth = (baseW <= 0 ? 0 : baseW) * fontSize * scaleFactor * fontScale;\n\n // 测量 asc/desc 并按目标字号缩放\n const scale = fontSize * fontScale * scaleFactor;\n const asc = m.actualBoundingBoxAscent * scale;\n const desc = m.actualBoundingBoxDescent * scale;\n\n // 计算预期宽度(包含字符间距)\n const spacing = chunkChars.length > 0 ? letterSpace : 0;\n const willWidth = currentLine.width + spacing + charWidth;\n\n // 自动换行判断\n if (willWidth > (layout.maxTextWidth || Infinity)) {\n flushChunk();\n finishCurrentLine();\n }\n\n // 初始化切块起点和所属options\n if (segStartX === null) {\n segStartX = currentLine.width;\n chunkOptions = options; // 绑定当前切块到options\n }\n\n // 添加字符间距(非首字符)\n if (chunkChars.length > 0) {\n segmentInnerX += letterSpace;\n currentLine.width += letterSpace;\n }\n\n // 添加字符到切块(x为切块内相对坐标)\n chunkChars.push({\n char: ch,\n x: segmentInnerX, // 切块内相对坐标\n });\n\n // 累计行级 asc/desc\n currentLine.lineAscent = Math.max(currentLine.lineAscent || 0, asc);\n currentLine.lineDescent = Math.max(currentLine.lineDescent || 0, desc);\n\n // 更新位置和宽度\n segmentInnerX += charWidth;\n currentLine.width += charWidth;\n }\n\n // 文本段结束,落盘当前切块\n flushChunk();\n });\n\n // 结束最后一行\n finishCurrentLine();\n\n // 计算 bbox\n let bboxTop = Infinity;\n let bboxBottom = -Infinity;\n\n for (let i = 0; i < lines.length; i++) {\n bboxTop = Math.min(bboxTop, baselines[i] - (lines[i].lineAscent || 0));\n bboxBottom = Math.max(bboxBottom, baselines[i] + (lines[i].lineDescent || 0));\n }\n const bboxHeight = bboxBottom - bboxTop;\n\n return {\n lines,\n maxLineWidth,\n totalHeight,\n bboxTop,\n bboxBottom,\n bboxHeight,\n };\n }\n\n /**\n * 创建新行\n */\n private createNewLine (): RichLine {\n return {\n richOptions: [],\n offsetX: [], // 切块起点(相对行起点)\n width: 0,\n lineHeight: 0, // 仅用 gapPx 作为行步进\n offsetY: 0,\n chars: [], // 每个元素为RichCharDetail数组(切块内字符)\n lineAscent: 0,\n lineDescent: 0,\n };\n }\n}\n","\nimport type { TextStyle } from '@galacean/effects';\nimport type { RichTextLayout } from '../../rich-text-layout';\nimport type { RichLine, OverflowResult, SizeResult, RichOverflowStrategy } from '../rich-text-interfaces';\n\n/**\n * 富文本 Display 溢出策略\n * 在溢出策略中对所有几何量进行一次性缩放\n */\nexport class RichDisplayOverflowStrategy implements RichOverflowStrategy {\n apply (\n lines: RichLine[],\n sizeResult: SizeResult,\n layout: RichTextLayout,\n style: TextStyle,\n ): OverflowResult {\n // 安全处理除零情况\n const safeDiv = (a: number, b: number) =>\n Math.abs(b) > 1e-5 ? a / b : 1;\n\n const availableW = Math.max(1, layout.maxTextWidth || sizeResult.canvasWidth);\n const availableH = Math.max(1, layout.maxTextHeight || sizeResult.canvasHeight);\n const contentW = Math.max(1, (sizeResult.contentWidth ?? sizeResult.canvasWidth));\n const contentH = Math.max(1, (sizeResult.bboxHeight ?? sizeResult.canvasHeight));\n\n // 只缩小不放大\n const s = Math.min(1,\n safeDiv(availableW, contentW),\n safeDiv(availableH, contentH)\n );\n\n // 浮点精度处理\n if (s > 0.9999) {\n return { globalScale: 1 };\n }\n\n // 统一缩放所有几何量\n for (const line of lines) {\n line.width *= s;\n line.lineHeight *= s; // 缩小行距(你的 gap-only 模式行高=gapPx)\n if (line.offsetX) {\n for (let i = 0; i < line.offsetX.length; i++) { line.offsetX[i] *= s; }\n }\n for (const seg of (line.chars || [])) {\n for (const ch of seg) { ch.x *= s; }\n }\n for (const opt of (line.richOptions || [])) {\n opt.fontSize *= s; // 缩小字形\n }\n // 同步缩放 asc/desc\n if (line.lineAscent != null) { line.lineAscent *= s; }\n if (line.lineDescent != null) { line.lineDescent *= s; }\n }\n\n return { globalScale: s };\n }\n}\n","import type { TextStyle } from '@galacean/effects';\nimport type { RichLine, RichOverflowStrategy, OverflowResult, SizeResult } from '../rich-text-interfaces';\nimport type { RichTextLayout } from '../../rich-text-layout';\n\n/**\n * Clip 溢出策略\n * 超出画布部分自然裁切\n */\nexport class RichClippedOverflowStrategy implements RichOverflowStrategy {\n apply (\n lines: RichLine[],\n sizeResult: SizeResult,\n layout: RichTextLayout,\n style: TextStyle\n ): OverflowResult {\n // 不进行任何缩放,直接返回单位缩放系数\n return {\n globalScale: 1,\n };\n }\n}\n","import type { TextStyle } from '@galacean/effects';\nimport type { RichTextLayout } from '../../rich-text-layout';\nimport type { RichLine, RichOverflowStrategy, OverflowResult, SizeResult } from '../rich-text-interfaces';\n\n/**\n * Visible 溢出策略\n * 允许内容超出画布可见\n */\nexport class RichVisibleOverflowStrategy implements RichOverflowStrategy {\n apply (\n lines: RichLine[],\n sizeResult: SizeResult,\n layout: RichTextLayout,\n style: TextStyle\n ): OverflowResult {\n // 不进行任何缩放或裁剪\n return {\n globalScale: 1,\n };\n }\n}\n","import { spec } from '@galacean/effects';\nimport type { TextStyle } from '@galacean/effects';\nimport type { RichTextLayout } from '../../rich-text-layout';\nimport type {\n RichLine, HorizontalAlignResult, SizeResult, OverflowResult, RichHorizontalAlignStrategy,\n} from '../rich-text-interfaces';\n\n/**\n * 富文本水平对齐策略\n * 直接使用已缩放的行宽计算偏移量\n */\nexport class RichHorizontalAlignStrategyImpl implements RichHorizontalAlignStrategy {\n getHorizontalOffsets (\n lines: RichLine[],\n sizeResult: SizeResult,\n overflowResult: OverflowResult,\n layout: RichTextLayout,\n style: TextStyle,\n ): HorizontalAlignResult {\n const frameW = layout.maxTextWidth;\n const compX = (sizeResult as any).baselineCompensationX || 0;\n\n // 统一用 frame 宽做容器\n const baseOffsets = lines.map(line =>\n (layout as any).getOffsetXRich(style, frameW, line.width)\n );\n\n // 仅 visible 叠加水平补偿,clip/display 不加\n const lineOffsets =\n layout.overflow === spec.TextOverflow.visible\n ? baseOffsets.map(x => x + compX)\n : baseOffsets;\n\n return { lineOffsets };\n }\n}\n","import { spec } from '@galacean/effects';\nimport type { TextStyle } from '@galacean/effects';\nimport type { RichTextLayout } from '../../rich-text-layout';\nimport type {\n RichLine, VerticalAlignResult, SizeResult, OverflowResult, RichVerticalAlignStrategy,\n} from '../rich-text-interfaces';\n\n/**\n * 富文本垂直对齐策略\n * 直接使用已缩放的行高\n */\nexport class RichVerticalAlignStrategyImpl implements RichVerticalAlignStrategy {\n getVerticalOffsets (\n lines: RichLine[],\n sizeResult: SizeResult,\n overflowResult: OverflowResult,\n layout: RichTextLayout,\n style: TextStyle,\n singleLineHeight: number,\n ): VerticalAlignResult {\n const lineHeights = lines.map(line => line.lineHeight);\n const compY = (sizeResult as any).baselineCompensationY || 0;\n let baselineY = 0;\n\n if (lines.length === 0) {\n return { baselineY: 0, lineYOffsets: [] };\n }\n\n switch (layout.overflow) {\n case spec.TextOverflow.visible: {\n // frame-based 计算\n const frameH = layout.maxTextHeight;\n const bboxTop = sizeResult.bboxTop ?? 0;\n const bboxBottom = sizeResult.bboxBottom ?? (bboxTop + (sizeResult.bboxHeight ?? 0));\n const bboxHeight = sizeResult.bboxHeight ?? (bboxBottom - bboxTop);\n\n // 计算 frame 基线\n let baselineYFrame = 0;\n\n switch (layout.textVerticalAlign) {\n case spec.TextVerticalAlign.top:\n baselineYFrame = -bboxTop;\n\n break;\n case spec.TextVerticalAlign.middle:\n baselineYFrame = (frameH - bboxHeight) / 2 - bboxTop;\n\n break;\n case spec.TextVerticalAlign.bottom:\n baselineYFrame = (frameH - bboxHeight) - bboxTop;\n\n break;\n }\n\n baselineY = baselineYFrame + compY; // 关键:叠加\"向下移动 E\"\n\n break;\n }\n case spec.TextOverflow.clip: {\n const firstLine = lines[0];\n\n if (firstLine) {\n const richSizes = firstLine.richOptions.map(o => o.fontSize);\n const firstMax = Math.max(...(richSizes.length ? richSizes : [style.fontSize]));\n const fontSizeForOffset = firstMax * style.fontScale * singleLineHeight;\n\n baselineY = (layout as any).getOffsetYRich(style, lineHeights, fontSizeForOffset) + compY;\n } else {\n baselineY = (layout as any).getOffsetYRich(style, lineHeights, style.fontSize * style.fontScale) + compY;\n }\n\n break;\n }\n case spec.TextOverflow.display: {\n // display 垂直对齐改为基于 bbox,而不是 getOffsetYRich\n const frameH = layout.maxTextHeight;\n\n // 用缩放后的行数据重建 baselines 和 bbox\n const baselines: number[] = [0];\n\n for (let i = 1; i < lines.length; i++) {\n baselines[i] = baselines[i - 1] + lines[i].lineHeight;\n }\n\n // 计算 bboxTop / bboxBottom(使用行的测量值 lineAscent/lineDescent)\n let bboxTop = Infinity;\n let bboxBottom = -Infinity;\n\n for (let i = 0; i < lines.length; i++) {\n const asc = lines[i].lineAscent ?? 0;\n const desc = lines[i].lineDescent ?? 0;\n\n bboxTop = Math.min(bboxTop, baselines[i] - asc);\n bboxBottom = Math.max(bboxBottom, baselines[i] + desc);\n }\n\n const bboxHeight = bboxBottom - bboxTop;\n\n // 计算 display 模式的基线\n let baselineDisplayY = 0;\n\n switch (layout.textVerticalAlign) {\n case spec.TextVerticalAlign.top:\n baselineDisplayY = -bboxTop;\n\n break;\n case spec.TextVerticalAlign.middle:\n baselineDisplayY = (frameH - bboxHeight) / 2 - bboxTop;\n\n break;\n case spec.TextVerticalAlign.bottom:\n baselineDisplayY = (frameH - bboxHeight) - bboxTop;\n\n break;\n }\n\n // 后续 lineYOffsets 保持按行高累计\n const lineYOffsets: number[] = [];\n let currentY = baselineDisplayY;\n\n for (let i = 0; i < lines.length; i++) {\n lineYOffsets.push(currentY);\n if (i < lines.length - 1) {\n currentY += lines[i + 1].lineHeight;\n }\n }\n\n return { baselineY: baselineDisplayY, lineYOffsets };\n }\n }\n\n // 下面行偏移保持不变\n const lineYOffsets: number[] = [];\n let currentY = baselineY;\n\n lines.forEach((line, index) => {\n lineYOffsets.push(currentY);\n if (index < lines.length - 1) {\n currentY += lines[index + 1].lineHeight;\n }\n });\n\n return { baselineY, lineYOffsets };\n }\n}\n","import { spec } from '@galacean/effects';\nimport type {\n RichWrapStrategy, RichOverflowStrategy, RichHorizontalAlignStrategy, RichVerticalAlignStrategy,\n} from './rich-text-interfaces';\nimport { RichWrapDisabledStrategy } from './wrap/rich-wrap-disabled';\nimport { RichWrapEnabledStrategy } from './wrap/rich-wrap-enabled';\nimport { RichDisplayOverflowStrategy } from './overflow/rich-display-overflow';\nimport { RichClippedOverflowStrategy } from './overflow/rich-clipped-overflow';\nimport { RichVisibleOverflowStrategy } from './overflow/rich-visible-overflow';\nimport { RichHorizontalAlignStrategyImpl } from './align/rich-horizontal-align';\nimport { RichVerticalAlignStrategyImpl } from './align/rich-vertical-align';\n\n/**\n * 富文本策略工厂\n * 负责创建各种策略实例\n */\nexport class RichTextStrategyFactory {\n\n /**\n * 创建换行策略\n * 根据wrapEnabled参数决定使用哪种策略\n */\n static createWrapStrategy (wrapEnabled?: boolean): RichWrapStrategy {\n if (wrapEnabled) {\n return new RichWrapEnabledStrategy();\n } else {\n return new RichWrapDisabledStrategy();\n }\n }\n\n /**\n * 创建溢出策略\n * 支持三种模式:clip(裁切)、display(行级缩放)、visible(不缩放不裁剪)\n */\n static createOverflowStrategy (mode: spec.TextOverflow): RichOverflowStrategy {\n switch (mode) {\n case spec.TextOverflow.clip:\n return new RichClippedOverflowStrategy();\n case spec.TextOverflow.display:\n return new RichDisplayOverflowStrategy();\n case spec.TextOverflow.visible:\n default:\n return new RichVisibleOverflowStrategy();\n }\n }\n\n /**\n * 创建水平对齐策略\n */\n static createHorizontalAlignStrategy (): RichHorizontalAlignStrategy {\n return new RichHorizontalAlignStrategyImpl();\n }\n\n /**\n * 创建垂直对齐策略\n */\n static createVerticalAlignStrategy (): RichVerticalAlignStrategy {\n return new RichVerticalAlignStrategyImpl();\n }\n}\n","/* eslint-disable @typescript-eslint/no-unsafe-declaration-merging */\nimport type { Engine, IRichTextComponent } from '@galacean/effects';\nimport {\n assertExist, math, effectsClass, spec, MaskableGraphic, applyMixins, TextStyle,\n TextComponentBase,\n} from '@galacean/effects';\nimport { RichTextLayout } from './rich-text-layout';\nimport { generateProgram } from './rich-text-parser';\nimport { toRGBA } from './color-utils';\nimport { RichTextStrategyFactory } from './strategies/rich-text-factory';\nimport type {\n RichWrapStrategy, RichOverflowStrategy, RichHorizontalAlignStrategy, RichLine,\n RichVerticalAlignStrategy, OverflowResult, HorizontalAlignResult, VerticalAlignResult,\n SizeResult, WrapResult,\n} from './strategies/rich-text-interfaces';\n\nexport interface RichTextOptions {\n text: string,\n fontSize: number,\n fontFamily?: string,\n fontWeight?: spec.TextWeight,\n fontStyle?: spec.FontStyle,\n fontColor?: spec.vec4,\n isNewLine: boolean,\n}\n\ninterface CharDetail {\n char: string,\n x: number,\n width: number,\n}\n\ninterface RichCharInfo {\n offsetX: number[],\n richOptions: RichTextOptions[],\n width: number,\n lineHeight: number,\n offsetY: number,\n chars: CharDetail[][],\n}\n\nexport interface RichTextComponent extends TextComponentBase { }\n\nlet seed = 0;\n\n/**\n * 富文本组件类\n */\n@effectsClass(spec.DataType.RichTextComponent)\nexport class RichTextComponent extends MaskableGraphic implements IRichTextComponent {\n isDirty = true;\n text: string = '';\n textStyle: TextStyle;\n canvas: HTMLCanvasElement;\n context: CanvasRenderingContext2D | null;\n textLayout: RichTextLayout;\n\n processedTextOptions: RichTextOptions[] = [];\n private singleLineHeight: number = 1.571;\n private size: math.Vector2 | null = null;\n private initialized: boolean = false;\n private canvasSize: math.Vector2 | null = null;\n\n private richWrapStrategy: RichWrapStrategy;\n private richOverflowStrategy: RichOverflowStrategy;\n private richHorizontalAlignStrategy: RichHorizontalAlignStrategy;\n private richVerticalAlignStrategy: RichVerticalAlignStrategy;\n\n protected readonly SCALE_FACTOR = 0.1;\n protected readonly ALPHA_FIX_VALUE = 1 / 255;\n\n constructor (engine: Engine) {\n super(engine);\n this.name = 'MRichText' + seed++;\n\n this.initTextBase(engine);\n\n // 延迟初始化策略,等到textLayout被赋值后再初始化\n this.richWrapStrategy = RichTextStrategyFactory.createWrapStrategy();\n this.richOverflowStrategy = RichTextStrategyFactory.createOverflowStrategy(spec.TextOverflow.display);\n this.richHorizontalAlignStrategy = RichTextStrategyFactory.createHorizontalAlignStrategy();\n this.richVerticalAlignStrategy = RichTextStrategyFactory.createVerticalAlignStrategy();\n }\n\n override onUpdate (dt: number): void {\n super.onUpdate(dt);\n this.updateTexture();\n }\n\n override onDestroy (): void {\n super.onDestroy();\n this.disposeTextTexture();\n }\n\n override fromData (data: spec.RichTextComponentData): void {\n super.fromData(data);\n const { interaction, options } = data;\n\n this.interaction = interaction;\n\n this.textStyle = new TextStyle(options);\n this.textLayout = new RichTextLayout(options);\n this.text = options.text ? options.text.toString() : ' ';\n\n if (this.textLayout.useLegacyRichText) {\n this.textLayout.textVerticalAlign = spec.TextVerticalAlign.middle;\n }\n\n this.updateStrategies();\n this.renderText(options);\n\n // 设置默认颜色(math.Color)\n this.material.setColor('_Color', new math.Color(1, 1, 1, 1));\n }\n\n /**\n * 使用策略结果绘制文本\n */\n private updateStrategies (): void {\n const layout = this.textLayout;\n\n if (layout) {\n this.richWrapStrategy = RichTextStrategyFactory.createWrapStrategy(layout.wrapEnabled);\n this.richOverflowStrategy = RichTextStrategyFactory.createOverflowStrategy(layout.overflow);\n }\n }\n\n private generateTextProgram (text: string) {\n this.processedTextOptions = [];\n const program = generateProgram((text, context) => {\n if (/^\\n+$/.test(text)) {\n text = text.replace(/\\n/g, '\\n ');\n }\n const textArr = text.split('\\n');\n\n textArr.forEach((text, index) => {\n const options: RichTextOptions = {\n text,\n fontSize: this.textStyle.fontSize,\n isNewLine: false,\n };\n\n if (index > 0) {\n options.isNewLine = true;\n }\n if ('b' in context) {\n options.fontWeight = spec.TextWeight.bold;\n }\n if ('i' in context) {\n options.fontStyle = spec.FontStyle.italic;\n }\n if ('size' in context && context.size) {\n options.fontSize = parseInt(context.size, 10);\n }\n if ('color' in context && context.color) {\n options.fontColor = toRGBA(context.color);\n }\n this.processedTextOptions.push(options);\n });\n });\n\n program(text);\n }\n\n updateWithOptions (options: spec.RichTextContentOptions) {\n this.textStyle = new TextStyle(options);\n this.textLayout = new RichTextLayout(options);\n this.text = options.text ? options.text.toString() : ' ';\n // TextLayout 构造函数已经正确处理了 textVerticalAlign,这里不需要再设置\n if (this.textLayout.useLegacyRichText) {\n this.textLayout.textVerticalAlign = spec.TextVerticalAlign.middle;\n }\n this.updateStrategies();\n this.isDirty = true;\n }\n\n protected renderText (options: spec.RichTextContentOptions) {\n const { size } = options;\n\n if (size) {\n this.canvasSize = new math.Vector2(size[0], size[1]);\n }\n this.updateTexture();\n }\n\n updateTexture (flipY = true) {\n if (!this.isDirty || !this.context || !this.canvas || !this.textStyle || !this.textLayout) {\n return;\n }\n\n const layout = this.textLayout;\n const useLegacy = layout.useLegacyRichText === true;\n\n this.singleLineHeight = useLegacy ? 1.571 : 1.0;\n\n // 根据useLegacyRichText字段来判断使用哪种渲染模式\n if (useLegacy) {\n this.updateTextureLegacy(flipY);\n } else {\n this.updateTextureWithStrategies(flipY);\n }\n }\n\n /**\n * 解析富文本\n */\n private updateTextureLegacy (flipY: boolean) {\n if (!this.isDirty || !this.context || !this.canvas || !this.textStyle) {\n return;\n }\n\n this.generateTextProgram(this.text);\n let width = 0, height = 0;\n const layout = this.textLayout;\n const { textStyle } = this;\n const { overflow, letterSpace = 0 } = layout;\n const context = this.context;\n\n const charsInfo: Omit<RichCharInfo, 'chars'>[] = [];\n const fontHeight = textStyle.fontSize * textStyle.fontScale;\n let charInfo: Omit<RichCharInfo, 'chars'> = {\n richOptions: [],\n offsetX: [],\n width: 0,\n lineHeight: fontHeight * this.singleLineHeight,\n offsetY: fontHeight * (this.singleLineHeight - 1) / 2,\n };\n\n // 遍历解析后的文本选项\n this.processedTextOptions.forEach(options => {\n const { text, isNewLine, fontSize } = options;\n\n if (isNewLine) {\n charsInfo.push(charInfo);\n width = Math.max(width, charInfo.width);\n charInfo = {\n richOptions: [],\n offsetX: [],\n width: 0,\n lineHeight: fontHeight * this.singleLineHeight,\n offsetY: fontHeight * (this.singleLineHeight - 1) / 2,\n };\n height += charInfo.lineHeight;\n }\n\n context.font = `${options.fontWeight || textStyle.textWeight} 10px ${options.fontFamily || textStyle.fontFamily}`;\n const textMetrics = context.measureText(text);\n let textWidth = textMetrics.width;\n\n if (textMetrics.actualBoundingBoxLeft !== undefined && textMetrics.actualBoundingBoxRight !== undefined) {\n const actualWidth = textMetrics.actualBoundingBoxLeft + textMetrics.actualBoundingBoxRight;\n\n if (actualWidth > 0) {\n textWidth = Math.max(textWidth, actualWidth);\n }\n }\n\n const textHeight = fontSize * this.singleLineHeight * textStyle.fontScale;\n\n if (textHeight > charInfo.lineHeight) {\n height += textHeight - charInfo.lineHeight;\n charInfo.lineHeight = textHeight;\n charInfo.offsetY = fontSize * textStyle.fontScale * (this.singleLineHeight - 1) / 2;\n }\n\n charInfo.offsetX.push(charInfo.width);\n charInfo.width += (textWidth <= 0 ? 0 : textWidth) * fontSize * this.SCALE_FACTOR * textStyle.fontScale + text.length * letterSpace;\n charInfo.richOptions.push(options);\n });\n\n charsInfo.push(charInfo);\n width = Math.max(width, charInfo.width);\n height += charInfo.lineHeight;\n\n // 存储最后一行的字符信息,并且更新最终的宽度和高度用于确定canvas尺寸\n if (width === 0 || height === 0) {\n this.isDirty = false;\n\n return;\n }\n\n if (this.size === undefined || this.size === null) {\n this.size = this.item.transform.size.clone();\n }\n const { x = 1, y = 1 } = this.size;\n\n if (!this.initialized) {\n this.canvasSize = !this.canvasSize ? new math.Vector2(width, height) : this.canvasSize;\n const { x: canvasWidth, y: canvasHeight } = this.canvasSize;\n\n this.item.transform.size.set(\n x * canvasWidth * this.SCALE_FACTOR * this.SCALE_FACTOR,\n y * canvasHeight * this.SCALE_FACTOR * this.SCALE_FACTOR\n );\n this.size = this.item.transform.size.clone();\n this.initialized = true;\n }\n\n assertExist(this.canvasSize);\n const { x: canvasWidth, y: canvasHeight } = this.canvasSize;\n\n layout.width = canvasWidth / textStyle.fontScale;\n layout.height = canvasHeight / textStyle.fontScale;\n\n this.renderToTexture(canvasWidth, canvasHeight, flipY, context => {\n if (charsInfo.length === 0) {\n return;\n }\n\n let charsLineHeight = layout.getOffsetY(textStyle, charsInfo.length, fontHeight * this.singleLineHeight, textStyle.fontSize);\n\n charsInfo.forEach((charInfo, index) => {\n const { richOptions, offsetX, width } = charInfo;\n let charWidth = width;\n let offset = offsetX;\n\n if (overflow === spec.TextOverflow.display) {\n if (width > canvasWidth) {\n const canvasScale = canvasWidth / width;\n\n charWidth *= canvasScale;\n offset = offsetX.map(x => x * canvasScale);\n }\n }\n\n const x = layout.getOffsetX(textStyle, charWidth);\n\n if (index > 0) {\n charsLineHeight += charInfo.lineHeight - charInfo.offsetY;\n }\n\n richOptions.forEach((options, index) => {\n const { fontScale, textColor, fontFamily: textFamily, textWeight, fontStyle: richStyle } = textStyle;\n const { text, fontSize, fontColor = textColor, fontFamily = textFamily, fontWeight = textWeight, fontStyle = richStyle } = options;\n let textSize = fontSize;\n\n if (overflow === spec.TextOverflow.display) {\n if (width > canvasWidth) {\n textSize /= width / canvasWidth;\n }\n }\n\n const strOffsetX = offset[index] + x;\n\n // fix bug 1/255\n context.font = `${fontStyle} ${fontWeight} ${textSize * fontScale}px ${fontFamily}`;\n const [r, g, b, a] = fontColor;\n\n context.fillStyle = `rgba(${r}, ${g}, ${b}, ${a})`;\n\n context.fillText(text, strOffsetX, charsLineHeight);\n });\n });\n }, { disposeOld: false });\n\n // 与 toDataURL() 两种方式都需要像素读取操作\n this.isDirty = false;\n }\n\n /**\n * 使用策略管线路径的渲染方法\n */\n private updateTextureWithStrategies (flipY: boolean): void {\n if (!this.isDirty || !this.context || !this.canvas) {\n return;\n }\n\n // 解析富文本\n this.generateTextProgram(this.text);\n const layout = this.textLayout;\n const { letterSpace = 0 } = layout;\n const context = this.context;\n\n if (!context) {\n return;\n }\n\n // 步骤1: 换行策略计算行信息\n const wrapResult = this.richWrapStrategy.computeLines(\n this.processedTextOptions,\n context,\n this.textStyle,\n layout,\n this.singleLineHeight,\n this.textStyle.fontScale,\n letterSpace,\n this.SCALE_FACTOR,\n );\n\n if (wrapResult.lines.length === 0 || wrapResult.maxLineWidth === 0 || wrapResult.totalHeight === 0) {\n this.isDirty = false;\n\n return;\n }\n\n // 步骤2: 尺寸处理\n const sizeResult = this.resolveCanvasSize(\n wrapResult,\n layout,\n this.textStyle,\n this.singleLineHeight,\n );\n\n // 首次渲染时初始化 canvas 尺寸和组件变换\n this.setCanvasSize(sizeResult);\n\n // 步骤3: 溢出策略处理\n const overflowResult = this.richOverflowStrategy.apply(\n wrapResult.lines,\n sizeResult,\n layout,\n this.textStyle,\n );\n\n // 步骤4: 水平对齐策略\n const horizontalAlignResult = this.richHorizontalAlignStrategy.getHorizontalOffsets(\n wrapResult.lines,\n sizeResult,\n overflowResult,\n layout,\n this.textStyle,\n );\n\n // 步骤5: 垂直对齐策略\n const TextVerticalAlignResult = this.richVerticalAlignStrategy.getVerticalOffsets(\n wrapResult.lines,\n sizeResult,\n overflowResult,\n layout,\n this.textStyle,\n this.singleLineHeight,\n );\n\n // 使用 this.canvasSize 统一设置画布尺寸\n assertExist(this.canvasSize);\n const { x: canvasWidth, y: canvasHeight } = this.canvasSize;\n\n layout.width = canvasWidth / this.textStyle.fontScale;\n layout.height = canvasHeight / this.textStyle.fontScale;\n\n this.renderToTexture(canvasWidth, canvasHeight, flipY, context => {\n // 步骤6: 绘制文本\n this.drawTextWithStrategies(\n context,\n wrapResult.lines,\n horizontalAlignResult,\n TextVerticalAlignResult,\n overflowResult,\n this.textStyle,\n );\n }, { disposeOld: false });\n\n this.isDirty = false;\n }\n\n private setCanvasSize (sizeResult: SizeResult): void {\n if (this.size === undefined || this.size === null) {\n this.size = this.item.transform.size.clone();\n }\n const { x = 1, y = 1 } = this.size;\n\n const layout = this.textLayout;\n\n switch (layout.overflow) {\n case spec.TextOverflow.visible: {\n const frameW = layout.maxTextWidth;\n const frameH = layout.maxTextHeight;\n\n const bboxTop = sizeResult.bboxTop ?? 0;\n const bboxBottom = sizeResult.bboxBottom ?? (bboxTop + (sizeResult.bboxHeight ?? 0));\n const bboxHeight = sizeResult.bboxHeight ?? (bboxBottom - bboxTop);\n\n // 计算 frame 基线\n let baselineYFrame = 0;\n\n switch (layout.textVerticalAlign) {\n case spec.TextVerticalAlign.top:\n baselineYFrame = -bboxTop;\n\n break;\n case spec.TextVerticalAlign.middle:\n baselineYFrame = (frameH - bboxHeight) / 2 - bboxTop;\n\n break;\n case spec.TextVerticalAlign.bottom:\n baselineYFrame = (frameH - bboxHeight) - bboxTop;\n\n break;\n }\n\n // 上下溢出检测\n const contentTopInFrame = baselineYFrame + bboxTop;\n const contentBottomInFrame = baselineYFrame + bboxBottom;\n\n const overflowTop = Math.max(0, -contentTopInFrame);\n const overflowBottom = Math.max(0, contentBottomInFrame - frameH);\n\n // 垂直扩张\n let expandTop = overflowTop;\n let expandBottom = overflowBottom;\n\n switch (layout.textVerticalAlign) {\n case spec.TextVerticalAlign.top: {\n const E = overflowBottom;\n\n expandTop = E;\n expandBottom = E;\n\n break;\n }\n case spec.TextVerticalAlign.bottom: {\n const E = overflowTop;\n\n expandTop = E;\n expandBottom = E;\n\n break;\n }\n case spec.TextVerticalAlign.middle: {\n // 保持非对称:上扩 overflowTop,下扩 overflowBottom\n expandTop = overflowTop;\n expandBottom = overflowBottom;\n\n break;\n }\n }\n\n // 位移补偿:始终使用 expandTop\n const compY = expandTop;\n\n // 水平扩张\n const lines = sizeResult.lines || [];\n const xOffsetsFrame = lines.map(line =>\n layout.getOffsetXRich(this.textStyle, frameW, line.width)\n );\n const leftMost = xOffsetsFrame.length > 0 ? Math.min(...xOffsetsFrame) : 0;\n const ex = Math.max(0, -leftMost);\n const expandLeft = ex;\n const expandRight = ex;\n\n const finalW = frameW + expandLeft + expandRight;\n const finalH = frameH + expandTop + expandBottom;\n\n // 记录补偿,供垂直对齐策略叠加\n (sizeResult as any).baselineCompensationX = expandLeft;\n (sizeResult as any).baselineCompensationY = compY;\n\n sizeResult.canvasWidth = finalW;\n sizeResult.canvasHeight = finalH;\n\n this.canvasSize = new math.Vector2(finalW, finalH);\n const { x = 1, y = 1 } = this.size ?? this.item.transform.size;\n\n this.item.transform.size.set(\n x * finalW * this.SCALE_FACTOR * this.SCALE_FACTOR,\n y * finalH * this.SCALE_FACTOR * this.SCALE_FACTOR\n );\n this.size = this.item.transform.size.clone();\n this.initialized = true;\n\n break;\n }\n case spec.TextOverflow.clip: {\n const frameW = layout.maxTextWidth;\n const frameH = layout.maxTextHeight;\n\n // 直接使用 frame 尺寸作为画布尺寸\n sizeResult.canvasWidth = frameW;\n sizeResult.canvasHeight = frameH;\n\n // clip 模式不需要任何补偿\n (sizeResult as any).baselineCompensationX = 0;\n (sizeResult as any).baselineCompensationY = 0;\n\n // 设置 canvas 和节点变换\n this.canvasSize = new math.Vector2(frameW, frameH);\n\n // 把 layout 的尺寸更新为 frame 尺寸\n layout.width = frameW / this.textStyle.fontScale;\n layout.height = frameH / this.textStyle.fontScale;\n\n const { x = 1, y = 1 } = this.size ?? this.item.transform.size;\n\n this.item.transform.size.set(\n x * frameW * this.SCALE_FACTOR * this.SCALE_FACTOR,\n y * frameH * this.SCALE_FACTOR * this.SCALE_FACTOR\n );\n this.size = this.item.transform.size.clone();\n this.initialized = true;\n\n break;\n }\n case spec.TextOverflow.display: {\n if (!this.initialized) {\n this.canvasSize = new math.Vector2(layout.maxTextWidth, layout.maxTextHeight);\n this.item.transform.size.set(\n x * this.canvasSize.x * this.SCALE_FACTOR * this.SCALE_FACTOR,\n y * this.canvasSize.y * this.SCALE_FACTOR * this.SCALE_FACTOR\n );\n this.size = this.item.transform.size.clone();\n this.initialized = true;\n }\n\n break;\n }\n }\n }\n\n /**\n * 尺寸处理\n */\n private resolveCanvasSize (\n wrapResult: WrapResult,\n layout: RichTextLayout,\n style: TextStyle,\n singleLineHeight: number,\n ): SizeResult {\n const canvasWidth = Math.max(1, wrapResult.maxLineWidth || 0);\n const canvasHeight = Math.max(1, wrapResult.totalHeight || 0); // stepTotalHeight\n\n layout.width = canvasWidth / style.fontScale;\n layout.height = canvasHeight / style.fontScale;\n\n return {\n canvasWidth,\n canvasHeight,\n contentWidth: wrapResult.maxLineWidth,\n bboxTop: wrapResult.bboxTop,\n bboxBottom: wrapResult.bboxBottom,\n bboxHeight: wrapResult.bboxHeight,\n // 为 visible 模式的画布尺寸计算保留行信息\n lines: wrapResult.lines,\n } as SizeResult;\n }\n\n /**\n * 使用策略结果绘制文本\n */\n private drawTextWithStrategies (\n context: CanvasRenderingContext2D,\n lines: RichLine[],\n horizontalAlignResult: HorizontalAlignResult,\n TextVerticalAlignResult: VerticalAlignResult,\n overflowResult: OverflowResult,\n textStyle: TextStyle\n ): void {\n let currentBaselineY = TextVerticalAlignResult.baselineY;\n const { lineOffsets } = horizontalAlignResult;\n\n lines.forEach((line, index) => {\n const { richOptions, chars } = line;\n const xOffset = lineOffsets[index];\n const yOffset = currentBaselineY;\n\n richOptions.forEach((options, segIndex) => {\n const { fontScale, textColor, fontFamily: textFamily, textWeight, fontStyle: richStyle } = textStyle;\n const { fontSize, fontColor = textColor, fontFamily = textFamily, fontWeight = textWeight, fontStyle = richStyle } = options;\n\n // 直接使用原始字体大小(已在行数据中预缩放)\n const textSize = fontSize;\n\n context.font = `${fontStyle} ${fontWeight} ${textSize * fontScale}px ${fontFamily}`;\n const [r, g, b, a] = fontColor;\n\n context.fillStyle = `rgba(${r}, ${g}, ${b}, ${a})`;\n\n // 逐字绘制\n const segStartX = (line.offsetX && line.offsetX[segIndex]) ? line.offsetX[segIndex] : 0;\n const charArr = chars[segIndex];\n\n charArr.forEach(charDetail => {\n // 直接使用缩放后的字符位置\n context.fillText(charDetail.char, xOffset + segStartX + charDetail.x, yOffset);\n });\n });\n\n // 推进到下一行\n if (index < lines.length - 1) {\n currentBaselineY += lines[index + 1].lineHeight;\n }\n });\n }\n\n private unsupported (name: string): never {\n throw new Error(`RichTextComponent does not support ${name} at runtime.`);\n }\n\n /**\n * 该方法富文本组件不支持\n * @param value - 水平偏移距离\n * @returns\n */\n setShadowOffsetY (value: number): void {\n this.unsupported('setShadowOffsetY');\n }\n\n /**\n * 该方法富文本组件不支持\n * @param value - 模糊程度\n */\n setShadowBlur (value: number): void {\n this.unsupported('setShadowBlur');\n }\n\n /**\n * 该方法富文本组件不支持\n * @param value - 水平偏移距离\n */\n setShadowOffsetX (value: number): void {\n this.unsupported('setShadowOffsetX');\n }\n\n /**\n * 该方法富文本组件不支持\n * @param value - 阴影颜色\n */\n setShadowColor (value: spec.RGBAColorValue): void {\n this.unsupported('setShadowColor');\n }\n\n /**\n * 该方法富文本组件不支持\n * @param value - 外描边宽度\n * @returns\n */\n setOutlineWidth (value: number): void {\n this.unsupported('setOutlineWidth');\n }\n\n /**\n * 该方法富文本组件不支持\n * @param value - 是否自动设置宽度\n */\n setAutoWidth (value: boolean): void {\n this.unsupported('setAutoWidth');\n }\n\n /**\n * 该方法富文本组件不支持\n */\n setFontSize (value: number): void {\n this.unsupported('setFontSize');\n }\n}\n\napplyMixins(RichTextComponent, [TextComponentBase]);\n","import * as EFFECTS from '@galacean/effects';\nimport { logger, registerPlugin, VFXItem } from '@galacean/effects';\nimport { RichTextLoader } from './rich-text-loader';\n\nexport * from './rich-text-parser';\nexport * from './rich-text-component';\nexport * from './rich-text-loader';\n\n/**\n * 插件版本号\n */\nexport const version = __VERSION__;\n\nregisterPlugin('rich-text', RichTextLoader, VFXItem);\n\nlogger.info(`Plugin rich text version: ${version}.`);\n\nif (version !== EFFECTS.version) {\n console.error(\n '注意:请统一 RichText 插件与 Player 版本,不统一的版本混用会有不可预知的后果!',\n '\\nAttention: Please ensure the RichText plugin is synchronized with the Player version. Mixing and matching incompatible versions may result in unpredictable consequences!'\n );\n}\n"],"names":["_set_prototype_of","o","p","Object","setPrototypeOf","__proto__","_inherits","subClass","superClass","TypeError","prototype","create","constructor","value","writable","configurable","RichTextLoader","AbstractPlugin","name","_array_like_to_array","arr","len","length","i","arr2","Array","_create_for_of_iterator_helper_loose","allowArrayLike","it","Symbol","iterator","call","next","bind","isArray","minLen","n","toString","slice","from","test","_unsupported_iterable_to_array","done","TokenType","contextStartRegexp","contextEndRegexp","rules","lexer","input","lexed","cursor","escapedMatch","exec","actualChar","concat","tokenType","_step","_iterator","regex","match","tokenMatch","Error","richTextParser","Text","combinedText","hasTextToken","textToken","shift","undefined","ContextStart","maybeContextStart","peek","matches","attributeName","attributeParam","ContextEnd","maybeContextEnd","shifted","ast","Grammar","attributes","expectedEndAttributeName","maybeText","push","text","endAttributeName","generateProgram","textHandler","richText","node","context","reduce","ctx","isRichText","contextTokens","filter","param","contextStartTokens","contextEndTokens","checkPaired","startContextAttributes","token","restToken","map","escape","replace","unescape","SuppressedError","RichTextLayout","options","width","height","size","textOverflow","spec","TextOverflow","clip","_options_textOverflow","_options_textVerticalAlign","textVerticalAlign","TextVerticalAlign","middle","textAlign","TextAlignment","left","letterSpace","_options_letterSpace","_options_lineHeight","lineHeight","_options_wrapEnabled","wrapEnabled","_options_maxTextWidth","maxTextWidth","_options_maxTextHeight","maxTextHeight","sizeMode","TextSizeMode","autoWidth","useLegacyRichText","_options_useLegacyRichText","this","overflow","getOffsetY","style","lineCount","fontSize","totalLineHeight","outlineWidth","fontScale","offsetY","baseOffset","commonCalculation","offsetResult","top","bottom","getOffsetX","maxWidth","offsetX","right","getOffsetYRich","lineHeights","total","a","b","getOffsetXRich","contentW","setSize","hexToRGBA","hex","alpha","split","char","join","parseInt","bigint","toRGBA","color","startsWith","colorName","document","canvas","createElement","getContext","fillStyle","remove","colorNameToRGBA","RichWrapDisabledStrategy","computeLines","processedOptions","layout","singleLineHeight","scaleFactor","lines","baselines","gapPx","currentLine","createNewLine","maxLineWidth","totalHeight","finishCurrentLine","chars","lineAscent","lineDescent","baseline","Math","max","_this","forEach","isNewLine","fontStyle","font","fontWeight","textWeight","fontFamily","segmentInnerX","charArr","ch","m","measureText","w","charWidth","scale","asc","actualBoundingBoxAscent","desc","actualBoundingBoxDescent","x","richOptions","bboxTop","Infinity","bboxBottom","bboxHeight","min","_proto","RichWrapEnabledStrategy","segStartX","chunkChars","chunkOptions","flushChunk","baseW","spacing","RichDisplayOverflowStrategy","apply","sizeResult","safeDiv","abs","availableW","canvasWidth","availableH","canvasHeight","contentWidth","contentH","s","globalScale","line","_step1","_iterator1","seg","_step2","_iterator2","_step3","_iterator3","opt","RichClippedOverflowStrategy","RichVisibleOverflowStrategy","RichHorizontalAlignStrategyImpl","getHorizontalOffsets","overflowResult","frameW","compX","baselineCompensationX","baseOffsets","lineOffsets","visible","RichVerticalAlignStrategyImpl","getVerticalOffsets","compY","baselineCompensationY","baselineY","lineYOffsets","frameH","baselineYFrame","firstLine","richSizes","fontSizeForOffset","display","baselineDisplayY","currentY","index","RichTextStrategyFactory","createWrapStrategy","createOverflowStrategy","mode","createHorizontalAlignStrategy","createVerticalAlignStrategy","seed","RichTextComponent","MaskableGraphic","engine","isDirty","processedTextOptions","initialized","canvasSize","SCALE_FACTOR","ALPHA_FIX_VALUE","initTextBase","richWrapStrategy","richOverflowStrategy","richHorizontalAlignStrategy","richVerticalAlignStrategy","onUpdate","dt","updateTexture","onDestroy","disposeTextTexture","fromData","data","interaction","textStyle","TextStyle","textLayout","updateStrategies","renderText","material","setColor","math","Color","generateTextProgram","program","TextWeight","bold","FontStyle","italic","fontColor","updateWithOptions","Vector2","flipY","useLegacy","updateTextureLegacy","updateTextureWithStrategies","_layout_letterSpace","charsInfo","fontHeight","charInfo","textMetrics","textWidth","actualBoundingBoxLeft","actualBoundingBoxRight","actualWidth","textHeight","item","transform","clone","_this_size","_this_size_x","_this_size_y","y","_this_canvasSize","set","assertExist","_this_canvasSize1","renderToTexture","charsLineHeight","offset","canvasScale","textColor","textFamily","richStyle","textSize","strOffsetX","r","g","fillText","disposeOld","wrapResult","resolveCanvasSize","setCanvasSize","horizontalAlignResult","TextVerticalAlignResult","drawTextWithStrategies","contentTopInFrame","contentBottomInFrame","overflowTop","overflowBottom","expandTop","expandBottom","_this_size1","xOffsetsFrame","leftMost","ex","expandLeft","finalW","finalH","_ref","_ref_x","_ref_y","_this_size2","_ref1","_ref_x1","_ref_y1","currentBaselineY","xOffset","yOffset","segIndex","charDetail","unsupported","setShadowOffsetY","setShadowBlur","setShadowOffsetX","setShadowColor","setOutlineWidth","setAutoWidth","setFontSize","applyMixins","decorators","target","key","d","c","arguments","getOwnPropertyDescriptor","Reflect","decorate","defineProperty","effectsClass","DataType","TextComponentBase","version","registerPlugin","VFXItem","logger","info","EFFECTS","console","error"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@galacean/effects-plugin-rich-text",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.8.0-alpha.0",
|
|
4
4
|
"description": "Galacean Effects player rich text plugin",
|
|
5
5
|
"module": "./dist/index.mjs",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
"registry": "https://registry.npmjs.org"
|
|
51
51
|
},
|
|
52
52
|
"devDependencies": {
|
|
53
|
-
"@galacean/effects": "2.
|
|
53
|
+
"@galacean/effects": "2.8.0-alpha.0"
|
|
54
54
|
},
|
|
55
55
|
"scripts": {
|
|
56
56
|
"dev": "vite",
|