@galacean/effects-plugin-rich-text 2.9.3 → 2.10.0-alpha.1
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 +2 -6
- 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 +2 -6
- package/dist/index.mjs.map +1 -1
- 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/alipay.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alipay.js","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","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_is_native_reflect_construct.js","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_construct.js","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_get_prototype_of.js","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_wrap_native_super.js","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_is_native_function.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-clipped-overflow.ts","../src/strategies/overflow/rich-expanding-overflow.ts","../src/strategies/align/rich-horizontal-align.ts","../src/strategies/align/rich-vertical-align.ts","../src/strategies/rich-text-factory.ts","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_extends.js","../src/rich-text-component.ts","../src/strategies/rich-text-interfaces.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","function _is_native_reflect_construct() {\n // Since Reflect.construct can't be properly polyfilled, some\n // implementations (e.g. core-js@2) don't set the correct internal slots.\n // Those polyfills don't allow us to subclass built-ins, so we need to\n // use our fallback implementation.\n try {\n // If the internal slots aren't set, this throws an error similar to\n // TypeError: this is not a Boolean object.\n var result = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function() {}));\n } catch (_) {}\n return (_is_native_reflect_construct = function() {\n return !!result;\n })();\n}\n\nexport { _is_native_reflect_construct as _ };\n","import { _ as _is_native_reflect_construct } from \"./_is_native_reflect_construct.js\";\nimport { _ as _set_prototype_of } from \"./_set_prototype_of.js\";\nfunction _construct(Parent, args, Class) {\n if (_is_native_reflect_construct()) _construct = Reflect.construct;\n else {\n _construct = function construct(Parent, args, Class) {\n var a = [null];\n a.push.apply(a, args);\n var Constructor = Function.bind.apply(Parent, a);\n var instance = new Constructor();\n\n if (Class) _set_prototype_of(instance, Class.prototype);\n\n return instance;\n };\n }\n\n return _construct.apply(null, arguments);\n}\nexport { _construct as _ };\n","function _get_prototype_of(o) {\n _get_prototype_of = Object.setPrototypeOf ? Object.getPrototypeOf : function getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n\n return _get_prototype_of(o);\n}\nexport { _get_prototype_of as _ };\n","import { _ as _construct } from \"./_construct.js\";\nimport { _ as _get_prototype_of } from \"./_get_prototype_of.js\";\nimport { _ as _is_native_function } from \"./_is_native_function.js\";\nimport { _ as _set_prototype_of } from \"./_set_prototype_of.js\";\n\nfunction _wrap_native_super(Class) {\n var _cache = typeof Map === \"function\" ? new Map() : undefined;\n _wrap_native_super = function(Class) {\n if (Class === null || !_is_native_function(Class)) return Class;\n if (typeof Class !== \"function\") throw new TypeError(\"Super expression must either be null or a function\");\n if (typeof _cache !== \"undefined\") {\n if (_cache.has(Class)) return _cache.get(Class);\n _cache.set(Class, Wrapper);\n }\n\n function Wrapper() {\n return _construct(Class, arguments, _get_prototype_of(this).constructor);\n }\n Wrapper.prototype = Object.create(Class.prototype, { constructor: { value: Wrapper, enumerable: false, writable: true, configurable: true } });\n\n return _set_prototype_of(Wrapper, Class);\n };\n\n return _wrap_native_super(Class);\n}\nexport { _wrap_native_super as _ };\n","function _is_native_function(fn) {\n return Function.toString.call(fn).indexOf(\"[native code]\") !== -1;\n}\nexport { _is_native_function as _ };\n","import { Plugin } from '@galacean/effects';\n\nexport class RichTextLoader extends Plugin {\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 // TODO: width 和 height 新版富文本计算没有地方用到\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 * - autoWidth: 根据内容自动扩展宽度\n * - autoHeight: 根据内容自动扩展高度\n * - fixed: 使用固定 width / height\n */\n autoResize: spec.TextSizeMode;\n\n /**\n * 文本行高\n */\n lineHeight: number;\n\n constructor (options: spec.RichTextContentOptions) {\n const {\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 autoResize = spec.TextSizeMode.autoWidth,\n // @ts-expect-error 兼容旧版\n useLegacyRichText = false,\n } = options;\n\n this.letterSpace = letterSpace;\n this.lineHeight = lineHeight;\n this.useLegacyRichText = useLegacyRichText;\n this.overflow = textOverflow;\n this.textVerticalAlign = textVerticalAlign;\n this.textAlign = textAlign;\n this.width = 100;\n this.height = 100;\n\n this.wrapEnabled = wrapEnabled;\n\n this.maxTextWidth = maxTextWidth;\n this.maxTextHeight = maxTextHeight;\n this.autoResize = autoResize;\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 // 除去首行之外的总高度,用于 bottom 对齐时将第一行向上偏移\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 /**\n * 设置文本框尺寸\n * - 不包含 fontScale 缩放\n * @deprecated use maxTextWidth / maxTextHeight instead\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 // 支付宝小程序不支持 remove 方法\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 letterSpace: number,\n ): WrapResult {\n const lines: RichLine[] = [];\n const baselines: number[] = [];\n const gapPx = layout.lineHeight || 0;\n const scaleFactor = 1 / 10; // 1/10px, 后面 context.font 设置的字号为10px\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 // 所有行都使用配置的行高(gapPx)\n currentLine.lineHeight = 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 // 预计算缩放因子:measureText 基于 10px,乘 fontSize/10 得到逻辑像素\n const glyphScale = fontSize * scaleFactor;\n\n // 使用字体级别度量(不随具体字符变化),保证基线位置稳定\n const refMetrics = context.measureText('x');\n const fontAsc = refMetrics.fontBoundingBoxAscent * glyphScale;\n const fontDesc = refMetrics.fontBoundingBoxDescent * glyphScale;\n\n // 逐字宽度测量\n let segmentInnerX = 0;\n const charArr: RichCharDetail[] = [];\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) * glyphScale;\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, fontAsc);\n currentLine.lineDescent = Math.max(currentLine.lineDescent || 0, fontDesc);\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 const asc = lines[i].lineAscent || 0;\n const desc = lines[i].lineDescent || 0;\n const textHeight = asc + desc;\n const margin = (gapPx - textHeight) / 2;\n\n bboxTop = Math.min(bboxTop, baselines[i] - asc - margin);\n bboxBottom = Math.max(bboxBottom, baselines[i] + desc + margin);\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 letterSpace: number,\n ): WrapResult {\n const lines: RichLine[] = [];\n const baselines: number[] = [];\n const gapPx = layout.lineHeight || 0;\n const scaleFactor = 1 / 10; // 1/10px, 后面 context.font 设置的字号为10px\n // 换行阈值,预计算避免每字符重复读取\n const wrapWidth = layout.maxTextWidth || Infinity;\n\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 // 所有行都使用配置的行高(gapPx)\n currentLine.lineHeight = 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 // 预计算缩放因子:measureText 基于 10px,乘 fontSize/10 得到逻辑像素\n const glyphScale = fontSize * scaleFactor;\n\n // 使用字体级别度量(不随具体字符变化),保证基线位置稳定\n const refMetrics = context.measureText('x');\n const fontAsc = refMetrics.fontBoundingBoxAscent * glyphScale;\n const fontDesc = refMetrics.fontBoundingBoxDescent * glyphScale;\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) * glyphScale;\n\n // 计算预期宽度(包含字符间距)\n const spacing = chunkChars.length > 0 ? letterSpace : 0;\n const willWidth = currentLine.width + spacing + charWidth;\n\n // 自动换行判断\n if (willWidth > wrapWidth) {\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, fontAsc);\n currentLine.lineDescent = Math.max(currentLine.lineDescent || 0, fontDesc);\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 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 const asc = lines[i].lineAscent || 0;\n const desc = lines[i].lineDescent || 0;\n const textHeight = asc + desc;\n const margin = (gapPx - textHeight) / 2;\n\n bboxTop = Math.min(bboxTop, baselines[i] - asc - margin);\n bboxBottom = Math.max(bboxBottom, baselines[i] + desc + margin);\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","import type {\n RichLine, RichOverflowStrategy, OverflowResult, HorizontalAlignResult, VerticalAlignResult,\n} from '../rich-text-interfaces';\n\n/**\n * Clip 溢出策略\n * 画布尺寸固定为帧尺寸,超出部分自然裁切\n * 不依赖对齐模式\n */\nexport class RichClippedOverflowStrategy implements RichOverflowStrategy {\n resolveCanvas (\n lines: RichLine[],\n frameWidth: number,\n frameHeight: number,\n horizontalResult: HorizontalAlignResult,\n verticalResult: VerticalAlignResult,\n ): OverflowResult {\n return {\n canvasWidth: Math.max(1, Math.ceil(frameWidth)),\n canvasHeight: Math.max(1, Math.ceil(frameHeight)),\n renderOffsetX: 0,\n renderOffsetY: 0,\n };\n }\n}\n","import type {\n RichLine, RichOverflowStrategy, OverflowResult, HorizontalAlignResult, VerticalAlignResult,\n} from '../rich-text-interfaces';\n\n/**\n * 扩展画布溢出策略(visible / display 模式共用)\n *\n * 根据对齐后的内容位置检测溢出,对称扩展画布以容纳所有内容。\n * 不依赖对齐模式(textAlign / textVerticalAlign)的枚举值,\n * 仅使用对齐策略输出的位置和行的度量数据。\n *\n * 对称扩展的原因:元素定位以中心点为锚点,\n * 单侧扩展会导致视觉偏移。使用 max(溢出左, 溢出右) 作为双侧扩展量\n * 可以保持中心点稳定并兼容所有对齐模式。\n */\nexport class RichExpandingOverflowStrategy implements RichOverflowStrategy {\n resolveCanvas (\n lines: RichLine[],\n frameWidth: number,\n frameHeight: number,\n horizontalResult: HorizontalAlignResult,\n verticalResult: VerticalAlignResult,\n ): OverflowResult {\n if (lines.length === 0) {\n return {\n canvasWidth: Math.max(1, frameWidth),\n canvasHeight: Math.max(1, frameHeight),\n renderOffsetX: 0,\n renderOffsetY: 0,\n };\n }\n\n // ── 垂直溢出检测 ──\n // 遍历每行基线,结合 ascent/descent 找出实际渲染范围\n let contentTop = Infinity;\n let contentBottom = -Infinity;\n let currentY = verticalResult.baselineY;\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 // 当 lineHeight >= textHeight 时,margin 为正,需要把行高边距纳入内容范围;\n // 当 lineHeight < textHeight 时,margin 为负,此时字形超出行高框,\n // 必须用原始字形边界(margin=0),否则负 margin 会把边界向内收缩,\n // 导致检测不到溢出,最终首行顶部/末行底部被裁切。\n const textHeight = asc + desc;\n const margin = Math.max(0, (lines[i].lineHeight - textHeight) / 2);\n\n contentTop = Math.min(contentTop, currentY - asc - margin);\n contentBottom = Math.max(contentBottom, currentY + desc + margin);\n\n if (i < lines.length - 1) {\n currentY += lines[i + 1].lineHeight;\n }\n }\n\n const overflowTop = Math.max(0, -contentTop);\n const overflowBottom = Math.max(0, contentBottom - frameHeight);\n\n // 对称扩展(保持中心点稳定)\n const expandV = Math.max(overflowTop, overflowBottom);\n\n // ── 水平溢出检测 ──\n let contentLeft = Infinity;\n let contentRight = -Infinity;\n\n for (let i = 0; i < lines.length; i++) {\n const xOff = horizontalResult.lineOffsets[i] ?? 0;\n const w = lines[i].width ?? 0;\n\n contentLeft = Math.min(contentLeft, xOff);\n contentRight = Math.max(contentRight, xOff + w);\n }\n\n if (!isFinite(contentLeft)) { contentLeft = 0; }\n if (!isFinite(contentRight)) { contentRight = 0; }\n\n const overflowLeft = Math.max(0, -contentLeft);\n const overflowRight = Math.max(0, contentRight - frameWidth);\n\n // 对称扩展\n const expandH = Math.max(overflowLeft, overflowRight);\n\n // ── 最终画布尺寸 ──\n const canvasWidth = Math.ceil(frameWidth + expandH * 2);\n const canvasHeight = Math.ceil(frameHeight + expandV * 2);\n\n return {\n canvasWidth: Math.max(1, canvasWidth),\n canvasHeight: Math.max(1, canvasHeight),\n renderOffsetX: expandH,\n renderOffsetY: expandV,\n };\n }\n}\n","import type { TextStyle } from '@galacean/effects';\nimport type { RichTextLayout } from '../../rich-text-layout';\nimport type { RichLine, HorizontalAlignResult, RichHorizontalAlignStrategy } from '../rich-text-interfaces';\n\n/**\n * 富文本水平对齐策略\n * 在帧坐标系中计算每行的水平偏移,不依赖溢出模式\n */\nexport class RichHorizontalAlignStrategyImpl implements RichHorizontalAlignStrategy {\n getHorizontalOffsets (\n lines: RichLine[],\n frameWidth: number,\n layout: RichTextLayout,\n style: TextStyle,\n ): HorizontalAlignResult {\n // 在帧坐标系 [0, frameWidth] 中计算对齐偏移\n const lineOffsets = lines.map(line =>\n layout.getOffsetXRich(style, frameWidth, line.width)\n );\n\n return { lineOffsets };\n }\n}\n","import { spec } from '@galacean/effects';\nimport type { RichTextLayout } from '../../rich-text-layout';\nimport type { RichLine, VerticalAlignResult, RichVerticalAlignStrategy } from '../rich-text-interfaces';\n\n/**\n * 富文本垂直对齐策略\n * 在帧坐标系中计算基线位置,不依赖溢出模式\n *\n * 算法:\n * 1. 从行数据重建各行基线(baseline[0]=0, baseline[i]=baseline[i-1]+lineHeight[i])\n * 2. 计算 bbox(包含行高边距)\n * 3. 根据 textVerticalAlign 将内容定位到帧中\n */\nexport class RichVerticalAlignStrategyImpl implements RichVerticalAlignStrategy {\n getVerticalOffsets (\n lines: RichLine[],\n frameHeight: number,\n layout: RichTextLayout,\n ): VerticalAlignResult {\n if (lines.length === 0) {\n return { baselineY: 0, lineYOffsets: [] };\n }\n\n // 1. 重建各行基线(相对于第一行基线=0)\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 // 2. 计算内容 bbox(含行高边距)\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 const textHeight = asc + desc;\n const margin = (lines[i].lineHeight - textHeight) / 2;\n\n bboxTop = Math.min(bboxTop, baselines[i] - asc - margin);\n bboxBottom = Math.max(bboxBottom, baselines[i] + desc + margin);\n }\n\n const bboxHeight = bboxBottom - bboxTop;\n\n // 3. 在帧坐标系 [0, frameHeight] 中定位第一行基线\n let baselineY = 0;\n\n switch (layout.textVerticalAlign) {\n case spec.TextVerticalAlign.top:\n baselineY = -bboxTop;\n\n break;\n case spec.TextVerticalAlign.middle:\n baselineY = (frameHeight - bboxHeight) / 2 - bboxTop;\n\n break;\n case spec.TextVerticalAlign.bottom:\n baselineY = (frameHeight - bboxHeight) - bboxTop;\n\n break;\n }\n\n // 4. 各行 Y 坐标\n const lineYOffsets = baselines.map(b => baselineY + b);\n\n return { baselineY, lineYOffsets };\n }\n}\n","import { spec } from '@galacean/effects';\nimport type {\n RichWrapStrategy, RichOverflowStrategy, RichHorizontalAlignStrategy,\n RichVerticalAlignStrategy,\n} from './rich-text-interfaces';\nimport { RichWrapDisabledStrategy } from './wrap/rich-wrap-disabled';\nimport { RichWrapEnabledStrategy } from './wrap/rich-wrap-enabled';\nimport { RichClippedOverflowStrategy } from './overflow/rich-clipped-overflow';\nimport { RichExpandingOverflowStrategy } from './overflow/rich-expanding-overflow';\nimport { RichHorizontalAlignStrategyImpl } from './align/rich-horizontal-align';\nimport { RichVerticalAlignStrategyImpl } from './align/rich-vertical-align';\n\n/**\n * 富文本策略工厂\n * 负责创建各种策略实例\n *\n * 管线顺序:Wrap → scaleLinesToFit(display)→ Align → Overflow.resolveCanvas\n */\nexport class RichTextStrategyFactory {\n\n /**\n * 创建换行策略\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:画布=帧,超出裁切\n * 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 case spec.TextOverflow.visible:\n default:\n return new RichExpandingOverflowStrategy();\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","function _extends() {\n _extends = Object.assign || function assign(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) if (Object.prototype.hasOwnProperty.call(source, key)) target[key] = source[key];\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}\nexport { _extends as _ };\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} from './strategies/rich-text-interfaces';\nimport { scaleLinesToFit } 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 /** @deprecated Use for legacy mode*/\n private singleLineHeight: number = 1.571;\n /** @deprecated Use for legacy mode*/\n private size: math.Vector2 | null = null;\n /** @deprecated Use for legacy mode*/\n private initialized: boolean = false;\n /** @deprecated Use for legacy mode*/\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.11092565;\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.updateTexture();\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 * 根据配置更新文本样式和布局\n */\n protected updateWithOptions (options: spec.RichTextContentOptions): void {\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 /**\n * 更新文本\n * @returns\n */\n protected updateTexture (flipY = true): void {\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 const legacyScaleFactor = 0.1;\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 * legacyScaleFactor * 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 * legacyScaleFactor * legacyScaleFactor,\n y * canvasHeight * legacyScaleFactor * legacyScaleFactor\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 * 管线顺序:\n * 1. Wrap → 换行与度量\n * 2. SizeMode → 根据 autoResize 回写帧尺寸\n * 3. ContentScale → 内容缩放(仅 display 模式)\n * 4. Alignment → 在帧坐标系中对齐(不依赖 overflow)\n * 5. Overflow → 画布解析:确定最终画布尺寸与渲染偏移(不依赖对齐模式)\n * 6. Render → 绘制\n */\n private updateTextureWithStrategies (flipY: boolean): void {\n if (!this.isDirty || !this.context || !this.canvas) {\n return;\n }\n\n this.updateStrategies();\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 const fontScale = this.textStyle.fontScale;\n\n // autoWidth 模式下先去掉宽度约束,避免内容被提前换行\n if (layout.autoResize === spec.TextSizeMode.autoWidth) {\n layout.maxTextWidth = Number.MAX_SAFE_INTEGER;\n }\n\n // ── 步骤 1: 换行策略(逻辑坐标系,fontScale 不参与排版)──\n const wrapResult = this.richWrapStrategy.computeLines(\n this.processedTextOptions,\n context,\n this.textStyle,\n layout,\n letterSpace,\n );\n\n // ── 步骤 2: SizeMode → 帧尺寸(逻辑单位)──\n // fontScale 不参与排版,全部在逻辑坐标系中完成。\n let frameW: number;\n let frameH: number;\n\n switch (layout.autoResize) {\n case spec.TextSizeMode.autoWidth:\n frameW = Math.max(1, wrapResult.maxLineWidth || 0);\n frameH = Math.max(1, wrapResult.totalHeight || 0);\n\n break;\n case spec.TextSizeMode.autoHeight:\n frameW = layout.maxTextWidth;\n frameH = Math.max(1, wrapResult.totalHeight || 0);\n\n break;\n case spec.TextSizeMode.fixed:\n default:\n frameW = layout.maxTextWidth;\n frameH = layout.maxTextHeight;\n\n break;\n }\n\n // ── 步骤 3: 内容缩放(display 模式缩小以适配帧,其他模式跳过)──\n if (layout.overflow === spec.TextOverflow.display) {\n const contentW = Math.max(1, wrapResult.maxLineWidth || 0);\n const contentH = Math.max(1, wrapResult.totalHeight || 0);\n\n scaleLinesToFit(wrapResult.lines, contentW, contentH, frameW, frameH);\n }\n\n // ── 步骤 4: 对齐(在帧坐标系中,不依赖 overflow 模式)──\n const horizontalAlignResult = this.richHorizontalAlignStrategy.getHorizontalOffsets(\n wrapResult.lines,\n frameW,\n layout,\n this.textStyle,\n );\n\n const verticalAlignResult = this.richVerticalAlignStrategy.getVerticalOffsets(\n wrapResult.lines,\n frameH,\n layout,\n );\n\n // ── 步骤 5: 溢出 / 画布解析(不依赖对齐模式枚举)──\n const overflowResult = this.richOverflowStrategy.resolveCanvas(\n wrapResult.lines,\n frameW,\n frameH,\n horizontalAlignResult,\n verticalAlignResult,\n );\n\n // 排版结果(逻辑单位)→ 物理像素画布\n const physicalW = Math.max(1, Math.ceil(overflowResult.canvasWidth * fontScale));\n const physicalH = Math.max(1, Math.ceil(overflowResult.canvasHeight * fontScale));\n\n // 渲染尺寸不随 fontScale 改变\n this.item.transform.size.set(\n overflowResult.canvasWidth * this.SCALE_FACTOR * this.SCALE_FACTOR,\n overflowResult.canvasHeight * this.SCALE_FACTOR * this.SCALE_FACTOR\n );\n\n // 统一回写布局属性(逻辑单位)\n layout.maxTextWidth = frameW;\n layout.maxTextHeight = frameH;\n layout.width = overflowResult.canvasWidth;\n layout.height = overflowResult.canvasHeight;\n\n this.renderToTexture(physicalW, physicalH, flipY, context => {\n // fontScale 仅作为渲染分辨率倍率,排版坐标全部为逻辑单位\n context.scale(fontScale, fontScale);\n // ── 步骤 6: 绘制 ──\n this.drawTextWithStrategies(\n context,\n wrapResult.lines,\n horizontalAlignResult,\n verticalAlignResult,\n overflowResult,\n this.textStyle,\n );\n }, { disposeOld: false });\n\n this.isDirty = false;\n }\n\n /**\n * 使用策略结果绘制文本\n * 坐标 = 帧坐标(对齐结果) + 渲染偏移(溢出结果)\n */\n private drawTextWithStrategies (\n context: CanvasRenderingContext2D,\n lines: RichLine[],\n horizontalAlignResult: HorizontalAlignResult,\n verticalAlignResult: VerticalAlignResult,\n overflowResult: OverflowResult,\n textStyle: TextStyle\n ): void {\n const { renderOffsetX, renderOffsetY } = overflowResult;\n let currentBaselineY = verticalAlignResult.baselineY + renderOffsetY;\n const { lineOffsets } = horizontalAlignResult;\n\n lines.forEach((line, index) => {\n const { richOptions, chars } = line;\n const xOffset = lineOffsets[index] + renderOffsetX;\n const yOffset = currentBaselineY;\n\n richOptions.forEach((options, segIndex) => {\n const { textColor, fontFamily: textFamily, textWeight, fontStyle: richStyle } = textStyle;\n const { fontSize, fontColor = textColor, fontFamily = textFamily, fontWeight = textWeight, fontStyle = richStyle } = options;\n\n const textSize = fontSize;\n\n context.font = `${fontStyle} ${fontWeight} ${textSize}px ${fontFamily}`;\n const [r, g, b, a] = fontColor;\n\n context.fillStyle = `rgba(${r}, ${g}, ${b}, ${a})`;\n\n const segStartX = (line.offsetX && line.offsetX[segIndex]) ? line.offsetX[segIndex] : 0;\n const charArr = chars[segIndex];\n\n charArr.forEach(charDetail => {\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 /**\n * @deprecated 2.8.0 本方法已废弃,请使用 setTextVerticalAlign 替代。\n */\n setTextBaseline (value: spec.TextBaseline): void {\n console.warn(\n 'setTextBaseline 已废弃,请改用 setTextVerticalAlign。' +\n '本次调用将转调用 setTextVerticalAlign。'\n );\n\n this.setTextVerticalAlign(value as unknown as spec.TextVerticalAlign);\n }\n}\n\napplyMixins(RichTextComponent, [TextComponentBase]);\n","import type { TextStyle } from '@galacean/effects';\nimport type { RichTextLayout } from '../rich-text-layout';\nimport type { RichTextOptions } from '../rich-text-component';\n\n/**\n * 富文本字符详情\n */\nexport interface RichCharDetail {\n char: string,\n x: number,\n}\n\n/**\n * 富文本行信息\n */\nexport interface RichLine {\n richOptions: RichTextOptions[],\n offsetX: number[],\n width: number,\n lineHeight: number,\n offsetY: number,\n chars: RichCharDetail[][],\n lineAscent?: number, // 行上升高度\n lineDescent?: number, // 行下降高度\n}\n\n/**\n * 换行策略结果\n */\nexport interface WrapResult {\n lines: RichLine[],\n maxLineWidth: number,\n totalHeight: number,\n bboxTop?: number, // 边界框顶部\n bboxBottom?: number, // 边界框底部\n bboxHeight?: number, // 边界框高度\n}\n\n/**\n * 溢出策略结果\n * 包含最终画布尺寸和渲染坐标偏移\n */\nexport interface OverflowResult {\n canvasWidth: number,\n canvasHeight: number,\n /** 渲染时叠加到所有 X 坐标的偏移(帧→画布坐标系补偿) */\n renderOffsetX: number,\n /** 渲染时叠加到所有 Y 坐标的偏移(帧→画布坐标系补偿) */\n renderOffsetY: number,\n}\n\n/**\n * 水平对齐策略结果\n */\nexport interface HorizontalAlignResult {\n lineOffsets: number[], // 每行在帧坐标系中的水平偏移量\n}\n\n/**\n * 垂直对齐策略结果\n */\nexport interface VerticalAlignResult {\n baselineY: number, // 第一行基线在帧坐标系中的 Y 坐标\n lineYOffsets: number[], // 每行在帧坐标系中的垂直偏移量\n}\n\n/**\n * 富文本换行策略接口\n */\nexport interface RichWrapStrategy {\n computeLines (\n processedOptions: RichTextOptions[],\n context: CanvasRenderingContext2D,\n style: TextStyle,\n layout: RichTextLayout,\n letterSpace: number,\n ): WrapResult,\n}\n\n/**\n * 富文本溢出策略接口(画布解析)\n * 根据对齐后的内容位置确定最终画布尺寸和渲染偏移\n * 不依赖对齐模式(textAlign/textVerticalAlign)的枚举值,\n * 仅使用对齐策略输出的位置数据\n */\nexport interface RichOverflowStrategy {\n resolveCanvas (\n lines: RichLine[],\n frameWidth: number,\n frameHeight: number,\n horizontalResult: HorizontalAlignResult,\n verticalResult: VerticalAlignResult,\n ): OverflowResult,\n}\n\n/**\n * 将行数据等比缩小以适配帧尺寸(display 模式使用)\n * 只缩小不放大,就地修改行数据\n */\nexport function scaleLinesToFit (\n lines: RichLine[],\n contentWidth: number,\n contentHeight: number,\n frameWidth: number,\n frameHeight: number,\n): void {\n const safeDiv = (a: number, b: number) =>\n Math.abs(b) > 1e-5 ? a / b : 1;\n\n const safeContentW = Math.max(1, contentWidth);\n const safeContentH = Math.max(1, contentHeight);\n\n // 只缩小不放大\n const s = Math.min(1,\n safeDiv(frameWidth, safeContentW),\n safeDiv(frameHeight, safeContentH)\n );\n\n // 浮点精度处理\n if (s > 0.9999) {\n return;\n }\n\n for (const line of lines) {\n line.width *= s;\n line.lineHeight *= s;\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 // 创建新的 richOptions 数组,避免修改原始对象\n const originalOptions = line.richOptions || [];\n const newOptions = [];\n\n for (let i = 0; i < originalOptions.length; i++) {\n newOptions.push({\n ...originalOptions[i],\n fontSize: originalOptions[i].fontSize * s,\n });\n }\n\n line.richOptions = newOptions;\n if (line.lineAscent != null) { line.lineAscent *= s; }\n if (line.lineDescent != null) { line.lineDescent *= s; }\n }\n}\n\n/**\n * 富文本水平对齐策略接口\n * 在帧坐标系中定位内容,不依赖溢出模式\n */\nexport interface RichHorizontalAlignStrategy {\n getHorizontalOffsets (\n lines: RichLine[],\n frameWidth: number,\n layout: RichTextLayout,\n style: TextStyle,\n ): HorizontalAlignResult,\n}\n\n/**\n * 富文本垂直对齐策略接口\n * 在帧坐标系中定位内容,不依赖溢出模式\n */\nexport interface RichVerticalAlignStrategy {\n getVerticalOffsets (\n lines: RichLine[],\n frameHeight: number,\n layout: RichTextLayout,\n ): VerticalAlignResult,\n}\n","import * as EFFECTS from '@galacean/effects';\nimport { logger, registerPlugin } 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);\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","_is_native_reflect_construct","result","Boolean","valueOf","call","Reflect","construct","_","_construct","Parent","args","Class","a","push","apply","instance","Function","bind","arguments","_get_prototype_of","getPrototypeOf","_wrap_native_super","_cache","Map","undefined","fn","toString","indexOf","has","get","set","Wrapper","this","enumerable","RichTextLoader","Plugin","name","_array_like_to_array","arr","len","length","i","arr2","Array","_create_for_of_iterator_helper_loose","allowArrayLike","it","Symbol","iterator","next","isArray","minLen","n","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","ContextStart","maybeContextStart","peek","matches","attributeName","attributeParam","ContextEnd","maybeContextEnd","shifted","ast","Grammar","attributes","expectedEndAttributeName","maybeText","text","endAttributeName","generateProgram","textHandler","richText","node","context","reduce","ctx","SuppressedError","RichTextLayout","options","width","height","textOverflow","spec","TextOverflow","clip","_options_textOverflow","_options_textVerticalAlign","textVerticalAlign","TextVerticalAlign","middle","textAlign","TextAlignment","left","_options_textAlign","_options_letterSpace","letterSpace","lineHeight","wrapEnabled","_options_wrapEnabled","_options_maxTextWidth","maxTextWidth","_options_maxTextHeight","maxTextHeight","autoResize","TextSizeMode","autoWidth","useLegacyRichText","_options_useLegacyRichText","overflow","getOffsetY","style","lineCount","fontSize","totalLineHeight","outlineWidth","fontScale","offsetY","baseOffset","commonCalculation","offsetResult","top","bottom","getOffsetX","maxWidth","offsetX","right","getOffsetYRich","lineHeights","total","b","getOffsetXRich","contentW","setSize","hexToRGBA","hex","alpha","replace","split","map","char","join","parseInt","bigint","toRGBA","color","startsWith","colorName","document","canvas","createElement","getContext","fillStyle","remove","colorNameToRGBA","RichWrapDisabledStrategy","computeLines","processedOptions","layout","lines","baselines","gapPx","currentLine","createNewLine","maxLineWidth","totalHeight","finishCurrentLine","chars","baseline","Math","max","_this","forEach","isNewLine","fontStyle","font","fontWeight","textWeight","fontFamily","glyphScale","refMetrics","measureText","fontAsc","fontBoundingBoxAscent","fontDesc","fontBoundingBoxDescent","segmentInnerX","charArr","ch","w","charWidth","x","richOptions","lineAscent","lineDescent","bboxTop","Infinity","bboxBottom","bboxHeight","asc","desc","margin","min","_proto","RichWrapEnabledStrategy","wrapWidth","segStartX","chunkChars","chunkOptions","flushChunk","baseW","spacing","RichClippedOverflowStrategy","resolveCanvas","frameWidth","frameHeight","horizontalResult","verticalResult","canvasWidth","ceil","canvasHeight","renderOffsetX","renderOffsetY","RichExpandingOverflowStrategy","contentTop","contentBottom","currentY","baselineY","textHeight","overflowTop","overflowBottom","expandV","contentLeft","contentRight","xOff","lineOffsets","isFinite","overflowLeft","overflowRight","expandH","RichHorizontalAlignStrategyImpl","getHorizontalOffsets","line","RichVerticalAlignStrategyImpl","getVerticalOffsets","lineYOffsets","RichTextStrategyFactory","createWrapStrategy","createOverflowStrategy","mode","display","visible","createHorizontalAlignStrategy","createVerticalAlignStrategy","_extends","assign","target","source","key","hasOwnProperty","seed","RichTextComponent","MaskableGraphic","engine","isDirty","processedTextOptions","singleLineHeight","size","initialized","canvasSize","SCALE_FACTOR","ALPHA_FIX_VALUE","initTextBase","richWrapStrategy","richOverflowStrategy","richHorizontalAlignStrategy","richVerticalAlignStrategy","onUpdate","dt","updateTexture","onDestroy","disposeTextTexture","fromData","data","interaction","textStyle","TextStyle","textLayout","updateStrategies","material","setColor","math","Color","generateTextProgram","program","index","TextWeight","bold","FontStyle","italic","fontColor","updateWithOptions","flipY","useLegacy","updateTextureLegacy","updateTextureWithStrategies","legacyScaleFactor","_layout_letterSpace","charsInfo","fontHeight","charInfo","textMetrics","textWidth","actualBoundingBoxLeft","actualBoundingBoxRight","actualWidth","item","transform","clone","_this_size","_this_size_x","_this_size_y","y","Vector2","_this_canvasSize","assertExist","_this_canvasSize1","renderToTexture","charsLineHeight","offset","canvasScale","textColor","textFamily","richStyle","textSize","strOffsetX","r","g","fillText","disposeOld","Number","MAX_SAFE_INTEGER","frameW","frameH","wrapResult","autoHeight","fixed","contentH","contentWidth","contentHeight","safeDiv","abs","safeContentW","safeContentH","s","_step1","_iterator1","seg","_step2","_iterator2","originalOptions","newOptions","scaleLinesToFit","horizontalAlignResult","verticalAlignResult","overflowResult","physicalW","physicalH","scale","drawTextWithStrategies","currentBaselineY","xOffset","yOffset","segIndex","charDetail","unsupported","setShadowOffsetY","setShadowBlur","setShadowOffsetX","setShadowColor","setOutlineWidth","setAutoWidth","setFontSize","setTextBaseline","console","warn","setTextVerticalAlign","decorators","d","c","getOwnPropertyDescriptor","decorate","defineProperty","effectsClass","DataType","applyMixins","TextComponentBase","version","registerPlugin","logger","info","EFFECTS","error","contextTokens","filter","param","contextStartTokens","contextEndTokens","checkPaired","startContextAttributes","token","restToken"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"alipay.js","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","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_is_native_reflect_construct.js","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_construct.js","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_get_prototype_of.js","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_wrap_native_super.js","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_is_native_function.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-clipped-overflow.ts","../src/strategies/overflow/rich-expanding-overflow.ts","../src/strategies/align/rich-horizontal-align.ts","../src/strategies/align/rich-vertical-align.ts","../src/strategies/rich-text-factory.ts","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_extends.js","../src/rich-text-component.ts","../src/strategies/rich-text-interfaces.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","function _is_native_reflect_construct() {\n // Since Reflect.construct can't be properly polyfilled, some\n // implementations (e.g. core-js@2) don't set the correct internal slots.\n // Those polyfills don't allow us to subclass built-ins, so we need to\n // use our fallback implementation.\n try {\n // If the internal slots aren't set, this throws an error similar to\n // TypeError: this is not a Boolean object.\n var result = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function() {}));\n } catch (_) {}\n return (_is_native_reflect_construct = function() {\n return !!result;\n })();\n}\n\nexport { _is_native_reflect_construct as _ };\n","import { _ as _is_native_reflect_construct } from \"./_is_native_reflect_construct.js\";\nimport { _ as _set_prototype_of } from \"./_set_prototype_of.js\";\nfunction _construct(Parent, args, Class) {\n if (_is_native_reflect_construct()) _construct = Reflect.construct;\n else {\n _construct = function construct(Parent, args, Class) {\n var a = [null];\n a.push.apply(a, args);\n var Constructor = Function.bind.apply(Parent, a);\n var instance = new Constructor();\n\n if (Class) _set_prototype_of(instance, Class.prototype);\n\n return instance;\n };\n }\n\n return _construct.apply(null, arguments);\n}\nexport { _construct as _ };\n","function _get_prototype_of(o) {\n _get_prototype_of = Object.setPrototypeOf ? Object.getPrototypeOf : function getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n\n return _get_prototype_of(o);\n}\nexport { _get_prototype_of as _ };\n","import { _ as _construct } from \"./_construct.js\";\nimport { _ as _get_prototype_of } from \"./_get_prototype_of.js\";\nimport { _ as _is_native_function } from \"./_is_native_function.js\";\nimport { _ as _set_prototype_of } from \"./_set_prototype_of.js\";\n\nfunction _wrap_native_super(Class) {\n var _cache = typeof Map === \"function\" ? new Map() : undefined;\n _wrap_native_super = function(Class) {\n if (Class === null || !_is_native_function(Class)) return Class;\n if (typeof Class !== \"function\") throw new TypeError(\"Super expression must either be null or a function\");\n if (typeof _cache !== \"undefined\") {\n if (_cache.has(Class)) return _cache.get(Class);\n _cache.set(Class, Wrapper);\n }\n\n function Wrapper() {\n return _construct(Class, arguments, _get_prototype_of(this).constructor);\n }\n Wrapper.prototype = Object.create(Class.prototype, { constructor: { value: Wrapper, enumerable: false, writable: true, configurable: true } });\n\n return _set_prototype_of(Wrapper, Class);\n };\n\n return _wrap_native_super(Class);\n}\nexport { _wrap_native_super as _ };\n","function _is_native_function(fn) {\n return Function.toString.call(fn).indexOf(\"[native code]\") !== -1;\n}\nexport { _is_native_function as _ };\n","import { Plugin } from '@galacean/effects';\n\nexport class RichTextLoader extends Plugin {\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 // TODO: width 和 height 新版富文本计算没有地方用到\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 * - autoWidth: 根据内容自动扩展宽度\n * - autoHeight: 根据内容自动扩展高度\n * - fixed: 使用固定 width / height\n */\n autoResize: spec.TextSizeMode;\n\n /**\n * 文本行高\n */\n lineHeight: number;\n\n constructor (options: spec.RichTextContentOptions) {\n const {\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 autoResize = spec.TextSizeMode.autoWidth,\n // @ts-expect-error 兼容旧版\n useLegacyRichText = false,\n } = options;\n\n this.letterSpace = letterSpace;\n this.lineHeight = lineHeight;\n this.useLegacyRichText = useLegacyRichText;\n this.overflow = textOverflow;\n this.textVerticalAlign = textVerticalAlign;\n this.textAlign = textAlign;\n this.width = 100;\n this.height = 100;\n\n this.wrapEnabled = wrapEnabled;\n\n this.maxTextWidth = maxTextWidth;\n this.maxTextHeight = maxTextHeight;\n this.autoResize = autoResize;\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 // 除去首行之外的总高度,用于 bottom 对齐时将第一行向上偏移\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 /**\n * 设置文本框尺寸\n * - 不包含 fontScale 缩放\n * @deprecated use maxTextWidth / maxTextHeight instead\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 // 支付宝小程序不支持 remove 方法\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 letterSpace: number,\n ): WrapResult {\n const lines: RichLine[] = [];\n const baselines: number[] = [];\n const gapPx = layout.lineHeight || 0;\n const scaleFactor = 1 / 10; // 1/10px, 后面 context.font 设置的字号为10px\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 // 所有行都使用配置的行高(gapPx)\n currentLine.lineHeight = 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 // 预计算缩放因子:measureText 基于 10px,乘 fontSize/10 得到逻辑像素\n const glyphScale = fontSize * scaleFactor;\n\n // 使用字体级别度量(不随具体字符变化),保证基线位置稳定\n const refMetrics = context.measureText('x');\n const fontAsc = refMetrics.fontBoundingBoxAscent * glyphScale;\n const fontDesc = refMetrics.fontBoundingBoxDescent * glyphScale;\n\n // 逐字宽度测量\n let segmentInnerX = 0;\n const charArr: RichCharDetail[] = [];\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) * glyphScale;\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, fontAsc);\n currentLine.lineDescent = Math.max(currentLine.lineDescent || 0, fontDesc);\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 const asc = lines[i].lineAscent || 0;\n const desc = lines[i].lineDescent || 0;\n const textHeight = asc + desc;\n const margin = (gapPx - textHeight) / 2;\n\n bboxTop = Math.min(bboxTop, baselines[i] - asc - margin);\n bboxBottom = Math.max(bboxBottom, baselines[i] + desc + margin);\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 letterSpace: number,\n ): WrapResult {\n const lines: RichLine[] = [];\n const baselines: number[] = [];\n const gapPx = layout.lineHeight || 0;\n const scaleFactor = 1 / 10; // 1/10px, 后面 context.font 设置的字号为10px\n // 换行阈值,预计算避免每字符重复读取\n const wrapWidth = layout.maxTextWidth || Infinity;\n\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 // 所有行都使用配置的行高(gapPx)\n currentLine.lineHeight = 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 // 预计算缩放因子:measureText 基于 10px,乘 fontSize/10 得到逻辑像素\n const glyphScale = fontSize * scaleFactor;\n\n // 使用字体级别度量(不随具体字符变化),保证基线位置稳定\n const refMetrics = context.measureText('x');\n const fontAsc = refMetrics.fontBoundingBoxAscent * glyphScale;\n const fontDesc = refMetrics.fontBoundingBoxDescent * glyphScale;\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) * glyphScale;\n\n // 计算预期宽度(包含字符间距)\n const spacing = chunkChars.length > 0 ? letterSpace : 0;\n const willWidth = currentLine.width + spacing + charWidth;\n\n // 自动换行判断\n if (willWidth > wrapWidth) {\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, fontAsc);\n currentLine.lineDescent = Math.max(currentLine.lineDescent || 0, fontDesc);\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 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 const asc = lines[i].lineAscent || 0;\n const desc = lines[i].lineDescent || 0;\n const textHeight = asc + desc;\n const margin = (gapPx - textHeight) / 2;\n\n bboxTop = Math.min(bboxTop, baselines[i] - asc - margin);\n bboxBottom = Math.max(bboxBottom, baselines[i] + desc + margin);\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","import type {\n RichLine, RichOverflowStrategy, OverflowResult, HorizontalAlignResult, VerticalAlignResult,\n} from '../rich-text-interfaces';\n\n/**\n * Clip 溢出策略\n * 画布尺寸固定为帧尺寸,超出部分自然裁切\n * 不依赖对齐模式\n */\nexport class RichClippedOverflowStrategy implements RichOverflowStrategy {\n resolveCanvas (\n lines: RichLine[],\n frameWidth: number,\n frameHeight: number,\n horizontalResult: HorizontalAlignResult,\n verticalResult: VerticalAlignResult,\n ): OverflowResult {\n return {\n canvasWidth: Math.max(1, Math.ceil(frameWidth)),\n canvasHeight: Math.max(1, Math.ceil(frameHeight)),\n renderOffsetX: 0,\n renderOffsetY: 0,\n };\n }\n}\n","import type {\n RichLine, RichOverflowStrategy, OverflowResult, HorizontalAlignResult, VerticalAlignResult,\n} from '../rich-text-interfaces';\n\n/**\n * 扩展画布溢出策略(visible / display 模式共用)\n *\n * 根据对齐后的内容位置检测溢出,对称扩展画布以容纳所有内容。\n * 不依赖对齐模式(textAlign / textVerticalAlign)的枚举值,\n * 仅使用对齐策略输出的位置和行的度量数据。\n *\n * 对称扩展的原因:元素定位以中心点为锚点,\n * 单侧扩展会导致视觉偏移。使用 max(溢出左, 溢出右) 作为双侧扩展量\n * 可以保持中心点稳定并兼容所有对齐模式。\n */\nexport class RichExpandingOverflowStrategy implements RichOverflowStrategy {\n resolveCanvas (\n lines: RichLine[],\n frameWidth: number,\n frameHeight: number,\n horizontalResult: HorizontalAlignResult,\n verticalResult: VerticalAlignResult,\n ): OverflowResult {\n if (lines.length === 0) {\n return {\n canvasWidth: Math.max(1, frameWidth),\n canvasHeight: Math.max(1, frameHeight),\n renderOffsetX: 0,\n renderOffsetY: 0,\n };\n }\n\n // ── 垂直溢出检测 ──\n // 遍历每行基线,结合 ascent/descent 找出实际渲染范围\n let contentTop = Infinity;\n let contentBottom = -Infinity;\n let currentY = verticalResult.baselineY;\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 // 当 lineHeight >= textHeight 时,margin 为正,需要把行高边距纳入内容范围;\n // 当 lineHeight < textHeight 时,margin 为负,此时字形超出行高框,\n // 必须用原始字形边界(margin=0),否则负 margin 会把边界向内收缩,\n // 导致检测不到溢出,最终首行顶部/末行底部被裁切。\n const textHeight = asc + desc;\n const margin = Math.max(0, (lines[i].lineHeight - textHeight) / 2);\n\n contentTop = Math.min(contentTop, currentY - asc - margin);\n contentBottom = Math.max(contentBottom, currentY + desc + margin);\n\n if (i < lines.length - 1) {\n currentY += lines[i + 1].lineHeight;\n }\n }\n\n const overflowTop = Math.max(0, -contentTop);\n const overflowBottom = Math.max(0, contentBottom - frameHeight);\n\n // 对称扩展(保持中心点稳定)\n const expandV = Math.max(overflowTop, overflowBottom);\n\n // ── 水平溢出检测 ──\n let contentLeft = Infinity;\n let contentRight = -Infinity;\n\n for (let i = 0; i < lines.length; i++) {\n const xOff = horizontalResult.lineOffsets[i] ?? 0;\n const w = lines[i].width ?? 0;\n\n contentLeft = Math.min(contentLeft, xOff);\n contentRight = Math.max(contentRight, xOff + w);\n }\n\n if (!isFinite(contentLeft)) { contentLeft = 0; }\n if (!isFinite(contentRight)) { contentRight = 0; }\n\n const overflowLeft = Math.max(0, -contentLeft);\n const overflowRight = Math.max(0, contentRight - frameWidth);\n\n // 对称扩展\n const expandH = Math.max(overflowLeft, overflowRight);\n\n // ── 最终画布尺寸 ──\n const canvasWidth = Math.ceil(frameWidth + expandH * 2);\n const canvasHeight = Math.ceil(frameHeight + expandV * 2);\n\n return {\n canvasWidth: Math.max(1, canvasWidth),\n canvasHeight: Math.max(1, canvasHeight),\n renderOffsetX: expandH,\n renderOffsetY: expandV,\n };\n }\n}\n","import type { TextStyle } from '@galacean/effects';\nimport type { RichTextLayout } from '../../rich-text-layout';\nimport type { RichLine, HorizontalAlignResult, RichHorizontalAlignStrategy } from '../rich-text-interfaces';\n\n/**\n * 富文本水平对齐策略\n * 在帧坐标系中计算每行的水平偏移,不依赖溢出模式\n */\nexport class RichHorizontalAlignStrategyImpl implements RichHorizontalAlignStrategy {\n getHorizontalOffsets (\n lines: RichLine[],\n frameWidth: number,\n layout: RichTextLayout,\n style: TextStyle,\n ): HorizontalAlignResult {\n // 在帧坐标系 [0, frameWidth] 中计算对齐偏移\n const lineOffsets = lines.map(line =>\n layout.getOffsetXRich(style, frameWidth, line.width)\n );\n\n return { lineOffsets };\n }\n}\n","import { spec } from '@galacean/effects';\nimport type { RichTextLayout } from '../../rich-text-layout';\nimport type { RichLine, VerticalAlignResult, RichVerticalAlignStrategy } from '../rich-text-interfaces';\n\n/**\n * 富文本垂直对齐策略\n * 在帧坐标系中计算基线位置,不依赖溢出模式\n *\n * 算法:\n * 1. 从行数据重建各行基线(baseline[0]=0, baseline[i]=baseline[i-1]+lineHeight[i])\n * 2. 计算 bbox(包含行高边距)\n * 3. 根据 textVerticalAlign 将内容定位到帧中\n */\nexport class RichVerticalAlignStrategyImpl implements RichVerticalAlignStrategy {\n getVerticalOffsets (\n lines: RichLine[],\n frameHeight: number,\n layout: RichTextLayout,\n ): VerticalAlignResult {\n if (lines.length === 0) {\n return { baselineY: 0, lineYOffsets: [] };\n }\n\n // 1. 重建各行基线(相对于第一行基线=0)\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 // 2. 计算内容 bbox(含行高边距)\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 const textHeight = asc + desc;\n const margin = (lines[i].lineHeight - textHeight) / 2;\n\n bboxTop = Math.min(bboxTop, baselines[i] - asc - margin);\n bboxBottom = Math.max(bboxBottom, baselines[i] + desc + margin);\n }\n\n const bboxHeight = bboxBottom - bboxTop;\n\n // 3. 在帧坐标系 [0, frameHeight] 中定位第一行基线\n let baselineY = 0;\n\n switch (layout.textVerticalAlign) {\n case spec.TextVerticalAlign.top:\n baselineY = -bboxTop;\n\n break;\n case spec.TextVerticalAlign.middle:\n baselineY = (frameHeight - bboxHeight) / 2 - bboxTop;\n\n break;\n case spec.TextVerticalAlign.bottom:\n baselineY = (frameHeight - bboxHeight) - bboxTop;\n\n break;\n }\n\n // 4. 各行 Y 坐标\n const lineYOffsets = baselines.map(b => baselineY + b);\n\n return { baselineY, lineYOffsets };\n }\n}\n","import { spec } from '@galacean/effects';\nimport type {\n RichWrapStrategy, RichOverflowStrategy, RichHorizontalAlignStrategy,\n RichVerticalAlignStrategy,\n} from './rich-text-interfaces';\nimport { RichWrapDisabledStrategy } from './wrap/rich-wrap-disabled';\nimport { RichWrapEnabledStrategy } from './wrap/rich-wrap-enabled';\nimport { RichClippedOverflowStrategy } from './overflow/rich-clipped-overflow';\nimport { RichExpandingOverflowStrategy } from './overflow/rich-expanding-overflow';\nimport { RichHorizontalAlignStrategyImpl } from './align/rich-horizontal-align';\nimport { RichVerticalAlignStrategyImpl } from './align/rich-vertical-align';\n\n/**\n * 富文本策略工厂\n * 负责创建各种策略实例\n *\n * 管线顺序:Wrap → scaleLinesToFit(display)→ Align → Overflow.resolveCanvas\n */\nexport class RichTextStrategyFactory {\n\n /**\n * 创建换行策略\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:画布=帧,超出裁切\n * 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 case spec.TextOverflow.visible:\n default:\n return new RichExpandingOverflowStrategy();\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","function _extends() {\n _extends = Object.assign || function assign(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) if (Object.prototype.hasOwnProperty.call(source, key)) target[key] = source[key];\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}\nexport { _extends as _ };\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} from './strategies/rich-text-interfaces';\nimport { scaleLinesToFit } 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 /** @deprecated Use for legacy mode*/\n private singleLineHeight: number = 1.571;\n /** @deprecated Use for legacy mode*/\n private size: math.Vector2 | null = null;\n /** @deprecated Use for legacy mode*/\n private initialized: boolean = false;\n /** @deprecated Use for legacy mode*/\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.11092565;\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.updateTexture();\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 * 根据配置更新文本样式和布局\n */\n protected updateWithOptions (options: spec.RichTextContentOptions): void {\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 /**\n * 更新文本\n * @returns\n */\n protected updateTexture (flipY = true): void {\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 const legacyScaleFactor = 0.1;\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 * legacyScaleFactor * 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 * legacyScaleFactor * legacyScaleFactor,\n y * canvasHeight * legacyScaleFactor * legacyScaleFactor\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 });\n\n // 与 toDataURL() 两种方式都需要像素读取操作\n this.isDirty = false;\n }\n\n /**\n * 使用策略管线路径的渲染方法\n *\n * 管线顺序:\n * 1. Wrap → 换行与度量\n * 2. SizeMode → 根据 autoResize 回写帧尺寸\n * 3. ContentScale → 内容缩放(仅 display 模式)\n * 4. Alignment → 在帧坐标系中对齐(不依赖 overflow)\n * 5. Overflow → 画布解析:确定最终画布尺寸与渲染偏移(不依赖对齐模式)\n * 6. Render → 绘制\n */\n private updateTextureWithStrategies (flipY: boolean): void {\n if (!this.isDirty || !this.context || !this.canvas) {\n return;\n }\n\n this.updateStrategies();\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 const fontScale = this.textStyle.fontScale;\n\n // autoWidth 模式下先去掉宽度约束,避免内容被提前换行\n if (layout.autoResize === spec.TextSizeMode.autoWidth) {\n layout.maxTextWidth = Number.MAX_SAFE_INTEGER;\n }\n\n // ── 步骤 1: 换行策略(逻辑坐标系,fontScale 不参与排版)──\n const wrapResult = this.richWrapStrategy.computeLines(\n this.processedTextOptions,\n context,\n this.textStyle,\n layout,\n letterSpace,\n );\n\n // ── 步骤 2: SizeMode → 帧尺寸(逻辑单位)──\n // fontScale 不参与排版,全部在逻辑坐标系中完成。\n let frameW: number;\n let frameH: number;\n\n switch (layout.autoResize) {\n case spec.TextSizeMode.autoWidth:\n frameW = Math.max(1, wrapResult.maxLineWidth || 0);\n frameH = Math.max(1, wrapResult.totalHeight || 0);\n\n break;\n case spec.TextSizeMode.autoHeight:\n frameW = layout.maxTextWidth;\n frameH = Math.max(1, wrapResult.totalHeight || 0);\n\n break;\n case spec.TextSizeMode.fixed:\n default:\n frameW = layout.maxTextWidth;\n frameH = layout.maxTextHeight;\n\n break;\n }\n\n // ── 步骤 3: 内容缩放(display 模式缩小以适配帧,其他模式跳过)──\n if (layout.overflow === spec.TextOverflow.display) {\n const contentW = Math.max(1, wrapResult.maxLineWidth || 0);\n const contentH = Math.max(1, wrapResult.totalHeight || 0);\n\n scaleLinesToFit(wrapResult.lines, contentW, contentH, frameW, frameH);\n }\n\n // ── 步骤 4: 对齐(在帧坐标系中,不依赖 overflow 模式)──\n const horizontalAlignResult = this.richHorizontalAlignStrategy.getHorizontalOffsets(\n wrapResult.lines,\n frameW,\n layout,\n this.textStyle,\n );\n\n const verticalAlignResult = this.richVerticalAlignStrategy.getVerticalOffsets(\n wrapResult.lines,\n frameH,\n layout,\n );\n\n // ── 步骤 5: 溢出 / 画布解析(不依赖对齐模式枚举)──\n const overflowResult = this.richOverflowStrategy.resolveCanvas(\n wrapResult.lines,\n frameW,\n frameH,\n horizontalAlignResult,\n verticalAlignResult,\n );\n\n // 排版结果(逻辑单位)→ 物理像素画布\n const physicalW = Math.max(1, Math.ceil(overflowResult.canvasWidth * fontScale));\n const physicalH = Math.max(1, Math.ceil(overflowResult.canvasHeight * fontScale));\n\n // 渲染尺寸不随 fontScale 改变\n this.item.transform.size.set(\n overflowResult.canvasWidth * this.SCALE_FACTOR * this.SCALE_FACTOR,\n overflowResult.canvasHeight * this.SCALE_FACTOR * this.SCALE_FACTOR\n );\n\n // 统一回写布局属性(逻辑单位)\n layout.maxTextWidth = frameW;\n layout.maxTextHeight = frameH;\n layout.width = overflowResult.canvasWidth;\n layout.height = overflowResult.canvasHeight;\n\n this.renderToTexture(physicalW, physicalH, flipY, context => {\n // fontScale 仅作为渲染分辨率倍率,排版坐标全部为逻辑单位\n context.scale(fontScale, fontScale);\n // ── 步骤 6: 绘制 ──\n this.drawTextWithStrategies(\n context,\n wrapResult.lines,\n horizontalAlignResult,\n verticalAlignResult,\n overflowResult,\n this.textStyle,\n );\n });\n\n this.isDirty = false;\n }\n\n /**\n * 使用策略结果绘制文本\n * 坐标 = 帧坐标(对齐结果) + 渲染偏移(溢出结果)\n */\n private drawTextWithStrategies (\n context: CanvasRenderingContext2D,\n lines: RichLine[],\n horizontalAlignResult: HorizontalAlignResult,\n verticalAlignResult: VerticalAlignResult,\n overflowResult: OverflowResult,\n textStyle: TextStyle\n ): void {\n const { renderOffsetX, renderOffsetY } = overflowResult;\n let currentBaselineY = verticalAlignResult.baselineY + renderOffsetY;\n const { lineOffsets } = horizontalAlignResult;\n\n lines.forEach((line, index) => {\n const { richOptions, chars } = line;\n const xOffset = lineOffsets[index] + renderOffsetX;\n const yOffset = currentBaselineY;\n\n richOptions.forEach((options, segIndex) => {\n const { textColor, fontFamily: textFamily, textWeight, fontStyle: richStyle } = textStyle;\n const { fontSize, fontColor = textColor, fontFamily = textFamily, fontWeight = textWeight, fontStyle = richStyle } = options;\n\n const textSize = fontSize;\n\n context.font = `${fontStyle} ${fontWeight} ${textSize}px ${fontFamily}`;\n const [r, g, b, a] = fontColor;\n\n context.fillStyle = `rgba(${r}, ${g}, ${b}, ${a})`;\n\n const segStartX = (line.offsetX && line.offsetX[segIndex]) ? line.offsetX[segIndex] : 0;\n const charArr = chars[segIndex];\n\n charArr.forEach(charDetail => {\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 /**\n * @deprecated 2.8.0 本方法已废弃,请使用 setTextVerticalAlign 替代。\n */\n setTextBaseline (value: spec.TextBaseline): void {\n console.warn(\n 'setTextBaseline 已废弃,请改用 setTextVerticalAlign。' +\n '本次调用将转调用 setTextVerticalAlign。'\n );\n\n this.setTextVerticalAlign(value as unknown as spec.TextVerticalAlign);\n }\n}\n\napplyMixins(RichTextComponent, [TextComponentBase]);\n","import type { TextStyle } from '@galacean/effects';\nimport type { RichTextLayout } from '../rich-text-layout';\nimport type { RichTextOptions } from '../rich-text-component';\n\n/**\n * 富文本字符详情\n */\nexport interface RichCharDetail {\n char: string,\n x: number,\n}\n\n/**\n * 富文本行信息\n */\nexport interface RichLine {\n richOptions: RichTextOptions[],\n offsetX: number[],\n width: number,\n lineHeight: number,\n offsetY: number,\n chars: RichCharDetail[][],\n lineAscent?: number, // 行上升高度\n lineDescent?: number, // 行下降高度\n}\n\n/**\n * 换行策略结果\n */\nexport interface WrapResult {\n lines: RichLine[],\n maxLineWidth: number,\n totalHeight: number,\n bboxTop?: number, // 边界框顶部\n bboxBottom?: number, // 边界框底部\n bboxHeight?: number, // 边界框高度\n}\n\n/**\n * 溢出策略结果\n * 包含最终画布尺寸和渲染坐标偏移\n */\nexport interface OverflowResult {\n canvasWidth: number,\n canvasHeight: number,\n /** 渲染时叠加到所有 X 坐标的偏移(帧→画布坐标系补偿) */\n renderOffsetX: number,\n /** 渲染时叠加到所有 Y 坐标的偏移(帧→画布坐标系补偿) */\n renderOffsetY: number,\n}\n\n/**\n * 水平对齐策略结果\n */\nexport interface HorizontalAlignResult {\n lineOffsets: number[], // 每行在帧坐标系中的水平偏移量\n}\n\n/**\n * 垂直对齐策略结果\n */\nexport interface VerticalAlignResult {\n baselineY: number, // 第一行基线在帧坐标系中的 Y 坐标\n lineYOffsets: number[], // 每行在帧坐标系中的垂直偏移量\n}\n\n/**\n * 富文本换行策略接口\n */\nexport interface RichWrapStrategy {\n computeLines (\n processedOptions: RichTextOptions[],\n context: CanvasRenderingContext2D,\n style: TextStyle,\n layout: RichTextLayout,\n letterSpace: number,\n ): WrapResult,\n}\n\n/**\n * 富文本溢出策略接口(画布解析)\n * 根据对齐后的内容位置确定最终画布尺寸和渲染偏移\n * 不依赖对齐模式(textAlign/textVerticalAlign)的枚举值,\n * 仅使用对齐策略输出的位置数据\n */\nexport interface RichOverflowStrategy {\n resolveCanvas (\n lines: RichLine[],\n frameWidth: number,\n frameHeight: number,\n horizontalResult: HorizontalAlignResult,\n verticalResult: VerticalAlignResult,\n ): OverflowResult,\n}\n\n/**\n * 将行数据等比缩小以适配帧尺寸(display 模式使用)\n * 只缩小不放大,就地修改行数据\n */\nexport function scaleLinesToFit (\n lines: RichLine[],\n contentWidth: number,\n contentHeight: number,\n frameWidth: number,\n frameHeight: number,\n): void {\n const safeDiv = (a: number, b: number) =>\n Math.abs(b) > 1e-5 ? a / b : 1;\n\n const safeContentW = Math.max(1, contentWidth);\n const safeContentH = Math.max(1, contentHeight);\n\n // 只缩小不放大\n const s = Math.min(1,\n safeDiv(frameWidth, safeContentW),\n safeDiv(frameHeight, safeContentH)\n );\n\n // 浮点精度处理\n if (s > 0.9999) {\n return;\n }\n\n for (const line of lines) {\n line.width *= s;\n line.lineHeight *= s;\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 // 创建新的 richOptions 数组,避免修改原始对象\n const originalOptions = line.richOptions || [];\n const newOptions = [];\n\n for (let i = 0; i < originalOptions.length; i++) {\n newOptions.push({\n ...originalOptions[i],\n fontSize: originalOptions[i].fontSize * s,\n });\n }\n\n line.richOptions = newOptions;\n if (line.lineAscent != null) { line.lineAscent *= s; }\n if (line.lineDescent != null) { line.lineDescent *= s; }\n }\n}\n\n/**\n * 富文本水平对齐策略接口\n * 在帧坐标系中定位内容,不依赖溢出模式\n */\nexport interface RichHorizontalAlignStrategy {\n getHorizontalOffsets (\n lines: RichLine[],\n frameWidth: number,\n layout: RichTextLayout,\n style: TextStyle,\n ): HorizontalAlignResult,\n}\n\n/**\n * 富文本垂直对齐策略接口\n * 在帧坐标系中定位内容,不依赖溢出模式\n */\nexport interface RichVerticalAlignStrategy {\n getVerticalOffsets (\n lines: RichLine[],\n frameHeight: number,\n layout: RichTextLayout,\n ): VerticalAlignResult,\n}\n","import * as EFFECTS from '@galacean/effects';\nimport { logger, registerPlugin } 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);\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","_is_native_reflect_construct","result","Boolean","valueOf","call","Reflect","construct","_","_construct","Parent","args","Class","a","push","apply","instance","Function","bind","arguments","_get_prototype_of","getPrototypeOf","_wrap_native_super","_cache","Map","undefined","fn","toString","indexOf","has","get","set","Wrapper","this","enumerable","RichTextLoader","Plugin","name","_array_like_to_array","arr","len","length","i","arr2","Array","_create_for_of_iterator_helper_loose","allowArrayLike","it","Symbol","iterator","next","isArray","minLen","n","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","ContextStart","maybeContextStart","peek","matches","attributeName","attributeParam","ContextEnd","maybeContextEnd","shifted","ast","Grammar","attributes","expectedEndAttributeName","maybeText","text","endAttributeName","generateProgram","textHandler","richText","node","context","reduce","ctx","SuppressedError","RichTextLayout","options","width","height","textOverflow","spec","TextOverflow","clip","_options_textOverflow","_options_textVerticalAlign","textVerticalAlign","TextVerticalAlign","middle","textAlign","TextAlignment","left","_options_textAlign","_options_letterSpace","letterSpace","lineHeight","wrapEnabled","_options_wrapEnabled","_options_maxTextWidth","maxTextWidth","_options_maxTextHeight","maxTextHeight","autoResize","TextSizeMode","autoWidth","useLegacyRichText","_options_useLegacyRichText","overflow","getOffsetY","style","lineCount","fontSize","totalLineHeight","outlineWidth","fontScale","offsetY","baseOffset","commonCalculation","offsetResult","top","bottom","getOffsetX","maxWidth","offsetX","right","getOffsetYRich","lineHeights","total","b","getOffsetXRich","contentW","setSize","hexToRGBA","hex","alpha","replace","split","map","char","join","parseInt","bigint","toRGBA","color","startsWith","colorName","document","canvas","createElement","getContext","fillStyle","remove","colorNameToRGBA","RichWrapDisabledStrategy","computeLines","processedOptions","layout","lines","baselines","gapPx","currentLine","createNewLine","maxLineWidth","totalHeight","finishCurrentLine","chars","baseline","Math","max","_this","forEach","isNewLine","fontStyle","font","fontWeight","textWeight","fontFamily","glyphScale","refMetrics","measureText","fontAsc","fontBoundingBoxAscent","fontDesc","fontBoundingBoxDescent","segmentInnerX","charArr","ch","w","charWidth","x","richOptions","lineAscent","lineDescent","bboxTop","Infinity","bboxBottom","bboxHeight","asc","desc","margin","min","_proto","RichWrapEnabledStrategy","wrapWidth","segStartX","chunkChars","chunkOptions","flushChunk","baseW","spacing","RichClippedOverflowStrategy","resolveCanvas","frameWidth","frameHeight","horizontalResult","verticalResult","canvasWidth","ceil","canvasHeight","renderOffsetX","renderOffsetY","RichExpandingOverflowStrategy","contentTop","contentBottom","currentY","baselineY","textHeight","overflowTop","overflowBottom","expandV","contentLeft","contentRight","xOff","lineOffsets","isFinite","overflowLeft","overflowRight","expandH","RichHorizontalAlignStrategyImpl","getHorizontalOffsets","line","RichVerticalAlignStrategyImpl","getVerticalOffsets","lineYOffsets","RichTextStrategyFactory","createWrapStrategy","createOverflowStrategy","mode","display","visible","createHorizontalAlignStrategy","createVerticalAlignStrategy","_extends","assign","target","source","key","hasOwnProperty","seed","RichTextComponent","MaskableGraphic","engine","isDirty","processedTextOptions","singleLineHeight","size","initialized","canvasSize","SCALE_FACTOR","ALPHA_FIX_VALUE","initTextBase","richWrapStrategy","richOverflowStrategy","richHorizontalAlignStrategy","richVerticalAlignStrategy","onUpdate","dt","updateTexture","onDestroy","disposeTextTexture","fromData","data","interaction","textStyle","TextStyle","textLayout","updateStrategies","material","setColor","math","Color","generateTextProgram","program","index","TextWeight","bold","FontStyle","italic","fontColor","updateWithOptions","flipY","useLegacy","updateTextureLegacy","updateTextureWithStrategies","legacyScaleFactor","_layout_letterSpace","charsInfo","fontHeight","charInfo","textMetrics","textWidth","actualBoundingBoxLeft","actualBoundingBoxRight","actualWidth","item","transform","clone","_this_size","_this_size_x","_this_size_y","y","Vector2","_this_canvasSize","assertExist","_this_canvasSize1","renderToTexture","charsLineHeight","offset","canvasScale","textColor","textFamily","richStyle","textSize","strOffsetX","r","g","fillText","Number","MAX_SAFE_INTEGER","frameW","frameH","wrapResult","autoHeight","fixed","contentH","contentWidth","contentHeight","safeDiv","abs","safeContentW","safeContentH","s","_step1","_iterator1","seg","_step2","_iterator2","originalOptions","newOptions","scaleLinesToFit","horizontalAlignResult","verticalAlignResult","overflowResult","physicalW","physicalH","scale","drawTextWithStrategies","currentBaselineY","xOffset","yOffset","segIndex","charDetail","unsupported","setShadowOffsetY","setShadowBlur","setShadowOffsetX","setShadowColor","setOutlineWidth","setAutoWidth","setFontSize","setTextBaseline","console","warn","setTextVerticalAlign","decorators","d","c","getOwnPropertyDescriptor","decorate","defineProperty","effectsClass","DataType","applyMixins","TextComponentBase","version","registerPlugin","logger","info","EFFECTS","error","contextTokens","filter","param","contextStartTokens","contextEndTokens","checkPaired","startContextAttributes","token","restToken"],"mappings":"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"}
|