@galacean/effects-plugin-rich-text 2.6.6 → 2.7.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"douyin.mjs","sources":["../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_set_prototype_of.js","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_inherits.js","../src/rich-text-loader.ts","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_array_like_to_array.js","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_create_for_of_iterator_helper_loose.js","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_unsupported_iterable_to_array.js","../src/rich-text-parser.ts","../src/color-utils.ts","../../../node_modules/.pnpm/tslib@2.8.1/node_modules/tslib/tslib.es6.mjs","../src/rich-text-component.ts","../src/index.ts"],"sourcesContent":["function _set_prototype_of(o, p) {\n _set_prototype_of = Object.setPrototypeOf || function setPrototypeOf(o, p) {\n o.__proto__ = p;\n\n return o;\n };\n\n return _set_prototype_of(o, p);\n}\nexport { _set_prototype_of as _ };\n","import { _ as _set_prototype_of } from \"./_set_prototype_of.js\";\n\nfunction _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } });\n\n if (superClass) _set_prototype_of(subClass, superClass);\n}\nexport { _inherits as _ };\n","import { AbstractPlugin } from '@galacean/effects';\n\nexport class RichTextLoader extends AbstractPlugin {\n override name = 'rich-text';\n}\n","function _array_like_to_array(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n return arr2;\n}\nexport { _array_like_to_array as _ };\n","import { _ as _unsupported_iterable_to_array } from \"./_unsupported_iterable_to_array.js\";\n\nfunction _create_for_of_iterator_helper_loose(o, allowArrayLike) {\n var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"];\n\n if (it) return (it = it.call(o)).next.bind(it);\n // Fallback for engines without symbol support\n if (Array.isArray(o) || (it = _unsupported_iterable_to_array(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n if (it) o = it;\n\n var i = 0;\n\n return function() {\n if (i >= o.length) return { done: true };\n\n return { done: false, value: o[i++] };\n };\n }\n\n throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nexport { _create_for_of_iterator_helper_loose as _ };\n","import { _ as _array_like_to_array } from \"./_array_like_to_array.js\";\n\nfunction _unsupported_iterable_to_array(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _array_like_to_array(o, minLen);\n\n var n = Object.prototype.toString.call(o).slice(8, -1);\n\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(n);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);\n}\nexport { _unsupported_iterable_to_array as _ };\n","enum TokenType {\n ContextStart = 'ContextStart',\n Text = 'Text',\n ContextEnd = 'ContextEnd',\n}\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.ContextStart, /^<[a-z]+(=[^>]+)?>/],\n [TokenType.Text, /^[^</>=]+/],\n [TokenType.ContextEnd, /^<\\/[a-z]+>/],\n];\n\nexport const lexer = (input: string, lexed: Token[] = [], cursor = 0): Token[] => {\n if (!input) {\n return lexed;\n }\n\n for (const [tokenType, regex] of rules) {\n const [tokenMatch] = regex.exec(input) ?? [];\n\n if (tokenMatch) {\n\n const len = tokenMatch.length;\n\n return lexer(input.slice(len), lexed.concat({ tokenType, value: tokenMatch }), cursor + len);\n }\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 }), 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 const maybeText = peek();\n\n if (maybeText?.tokenType === TokenType.Text) {\n shift();\n\n return maybeText.value;\n }\n\n return 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","import type { spec } from '@galacean/effects';\n\n/**\n * 将颜色名称转换为 RGBA\n * @param colorName - 颜色名称\n * @returns RGBA 颜色字符串\n */\nexport function colorNameToRGBA (colorName: string): string {\n if (typeof colorName !== 'string' || !colorName) {\n throw new Error('Invalid color name provided');\n }\n if (typeof document === 'undefined') {\n throw new Error('This method requires a browser environment');\n }\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n\n if (context) {\n try {\n context.fillStyle = colorName;\n const result = context.fillStyle;\n\n return result;\n } finally {\n // Clean up DOM element\n canvas.remove();\n }\n }\n\n throw new Error('Failed to get 2D context for color conversion!');\n}\n\n/**\n * 将 16 进制颜色转换为 RGBA\n * @param hex - 16 进制颜色\n * @param alpha - 透明度\n * @returns - RGBA 颜色\n */\nexport function hexToRGBA (hex: string, alpha: number = 1): spec.vec4 {\n hex = hex.replace(/^#/, '');\n\n if (hex.length === 3 || hex.length === 4) {\n hex = hex.split('').map(char => char + char).join('');\n }\n\n // Handle alpha channel in hex\n if (hex.length === 8) {\n const a = parseInt(hex.slice(6, 8), 16) / 255;\n\n hex = hex.slice(0, 6);\n alpha = a;\n }\n const bigint = parseInt(hex, 16);\n const r = (bigint >> 16) & 255;\n const g = (bigint >> 8) & 255;\n const b = bigint & 255;\n\n return [r, g, b, alpha];\n}\n\n/**\n * 将颜色字符串转换为 RGBA\n * @param color - 颜色字符串\n * @param alpha - 透明度\n * @returns - RGBA 颜色\n */\nexport function toRGBA (color: string, alpha: number = 1): spec.vec4 {\n if (typeof color !== 'string' || !color) {\n throw new Error('Invalid color string');\n }\n if (color.startsWith('#')) {\n return hexToRGBA(color, alpha);\n } else {\n return hexToRGBA(colorNameToRGBA(color));\n }\n}\n","/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\n\nvar extendStatics = function(d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n }\n return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n var _, done = false;\n for (var i = decorators.length - 1; i >= 0; i--) {\n var context = {};\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n if (kind === \"accessor\") {\n if (result === void 0) continue;\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n if (_ = accept(result.get)) descriptor.get = _;\n if (_ = accept(result.set)) descriptor.set = _;\n if (_ = accept(result.init)) initializers.unshift(_);\n }\n else if (_ = accept(result)) {\n if (kind === \"field\") initializers.unshift(_);\n else descriptor[key] = _;\n }\n }\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\n done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n var useValue = arguments.length > 2;\n for (var i = 0; i < initializers.length; i++) {\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n }\n return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\n\nexport function __generator(thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++)\n ar = ar.concat(__read(arguments[i]));\n return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n function fulfill(value) { resume(\"next\", value); }\n function reject(value) { resume(\"throw\", value); }\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n var i, p;\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var m = o[Symbol.asyncIterator], i;\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n};\n\nvar ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n};\n\nexport function __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n}\n\nexport function __importDefault(mod) {\n return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport function __addDisposableResource(env, value, async) {\n if (value !== null && value !== void 0) {\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\n var dispose, inner;\n if (async) {\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\n dispose = value[Symbol.asyncDispose];\n }\n if (dispose === void 0) {\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\n dispose = value[Symbol.dispose];\n if (async) inner = dispose;\n }\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\n env.stack.push({ value: value, dispose: dispose, async: async });\n }\n else if (async) {\n env.stack.push({ async: true });\n }\n return value;\n}\n\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n var e = new Error(message);\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\nexport function __disposeResources(env) {\n function fail(e) {\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\n env.hasError = true;\n }\n var r, s = 0;\n function next() {\n while (r = env.stack.pop()) {\n try {\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\n if (r.dispose) {\n var result = r.dispose.call(r.value);\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\n }\n else s |= 1;\n }\n catch (e) {\n fail(e);\n }\n }\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\n if (env.hasError) throw env.error;\n }\n return next();\n}\n\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\n });\n }\n return path;\n}\n\nexport default {\n __extends,\n __assign,\n __rest,\n __decorate,\n __param,\n __esDecorate,\n __runInitializers,\n __propKey,\n __setFunctionName,\n __metadata,\n __awaiter,\n __generator,\n __createBinding,\n __exportStar,\n __values,\n __read,\n __spread,\n __spreadArrays,\n __spreadArray,\n __await,\n __asyncGenerator,\n __asyncDelegator,\n __asyncValues,\n __makeTemplateObject,\n __importStar,\n __importDefault,\n __classPrivateFieldGet,\n __classPrivateFieldSet,\n __classPrivateFieldIn,\n __addDisposableResource,\n __disposeResources,\n __rewriteRelativeImportExtension,\n};\n","import type { Engine } from '@galacean/effects';\nimport { assertExist, math, effectsClass, glContext, spec, TextComponent, Texture, TextLayout, TextStyle } from '@galacean/effects';\nimport { generateProgram } from './rich-text-parser';\nimport { toRGBA } from './color-utils';\n\n/**\n *\n */\nexport interface RichTextOptions {\n text: string,\n fontSize: number,\n fontFamily?: string,\n fontWeight?: spec.TextWeight,\n fontStyle?: spec.FontStyle,\n fontColor?: spec.vec4,\n textStyle?: TextStyle,\n isNewLine: boolean,\n}\n\ninterface RichCharInfo {\n offsetX: number[],\n /**\n * 字符参数\n */\n richOptions: RichTextOptions[],\n /**\n * 段落宽度\n */\n width: number,\n /**\n * 段落高度\n */\n lineHeight: number,\n /**\n * 字体偏移高度\n */\n offsetY: number,\n}\n\nlet seed = 0;\n\n@effectsClass(spec.DataType.RichTextComponent)\nexport class RichTextComponent extends TextComponent {\n processedTextOptions: RichTextOptions[] = [];\n // 字体高度的倍数(字体高度上下多出来的部分就是行间距)\n private singleLineHeight: number = 1.571;\n private size: math.Vector2 | null = null;\n /**\n * 获取第一次渲染的 size\n */\n private initialized: boolean = false;\n /**\n * canvas 大小\n */\n private canvasSize: math.Vector2 | null = null;\n\n constructor (engine: Engine) {\n super(engine);\n\n this.name = 'MRichText' + seed++;\n }\n\n private generateTextProgram (text: string) {\n this.processedTextOptions = [];\n const program = generateProgram((text, context) => {\n // 如果富文本仅包含换行符,则在每个换行符后添加一个空格\n if (/^\\n+$/.test(text)) {\n text = text.replace(/\\n/g, '\\n ');\n }\n const textArr = text.split('\\n');\n\n textArr.forEach((text, index) => {\n const options: RichTextOptions = {\n text,\n fontSize: this.textStyle.fontSize,\n isNewLine: false,\n };\n\n if (index > 0) {\n options.isNewLine = true;\n }\n if ('b' in context) {\n options.fontWeight = spec.TextWeight.bold;\n }\n\n if ('i' in context) {\n options.fontStyle = spec.FontStyle.italic;\n }\n\n if ('size' in context && context.size) {\n options.fontSize = parseInt(context.size, 10);\n }\n\n if ('color' in context && context.color) {\n options.fontColor = toRGBA(context.color);\n }\n this.processedTextOptions.push(options);\n });\n\n });\n\n program(text);\n }\n\n override updateTexture (flipY = true) {\n if (!this.isDirty || !this.context || !this.canvas) {\n return;\n }\n // 解析富文本\n this.generateTextProgram(this.text);\n let width = 0, height = 0;\n const { textLayout, textStyle } = this;\n const { overflow, letterSpace = 0 } = textLayout;\n const context = this.context;\n\n context.save();\n\n const charsInfo: RichCharInfo[] = [];\n const fontHeight = textStyle.fontSize * this.textStyle.fontScale;\n let charInfo: RichCharInfo = {\n richOptions: [],\n offsetX: [],\n width: 0,\n // 包括字体和上下行间距的高度\n lineHeight: fontHeight * this.singleLineHeight,\n // 字体偏移高度(也就是行间距)\n offsetY: fontHeight * (this.singleLineHeight - 1) / 2,\n };\n\n // 遍历解析后的文本选项\n this.processedTextOptions.forEach(options => {\n const { text, isNewLine, fontSize } = options;\n\n // 如果是新行,则将之前行的信息存入charsInfo并且初始化新行的charInfo\n if (isNewLine) {\n charsInfo.push(charInfo);\n width = Math.max(width, charInfo.width);\n charInfo = {\n richOptions: [],\n offsetX: [],\n width: 0,\n lineHeight: fontHeight * this.singleLineHeight,\n offsetY: fontHeight * (this.singleLineHeight - 1) / 2,\n };\n // 管理行的总高度调整canvas尺寸\n height += charInfo.lineHeight;\n }\n // 恢复默认设置\n context.font = `${options.fontWeight || textStyle.textWeight} 10px ${options.fontFamily || textStyle.fontFamily}`;\n // 计算得到每个字段的宽度textWidth\n const textMetrics = context.measureText(text);\n let textWidth = textMetrics.width;\n\n if (textMetrics.actualBoundingBoxLeft !== undefined && textMetrics.actualBoundingBoxRight !== undefined) {\n const actualWidth = textMetrics.actualBoundingBoxLeft + textMetrics.actualBoundingBoxRight;\n\n if (actualWidth > 0) {\n textWidth = Math.max(textWidth, actualWidth);\n }\n }\n const textHeight = fontSize * this.singleLineHeight * this.textStyle.fontScale;\n\n if (textHeight > charInfo.lineHeight) {\n height += textHeight - charInfo.lineHeight;\n charInfo.lineHeight = textHeight;\n charInfo.offsetY = fontSize * this.textStyle.fontScale * (this.singleLineHeight - 1) / 2;\n }\n charInfo.offsetX.push(charInfo.width);\n // 计算字段宽度*富文本字体大小*缩放因子*整体文本大小+每个字符的间距(每个字符间距存疑,因为实际测量的宽度已经包含了间距)\n charInfo.width += (textWidth <= 0 ? 0 : textWidth) * fontSize * this.SCALE_FACTOR * this.textStyle.fontScale + text.length * letterSpace;\n\n // 将富文本数据存入charInfo\n charInfo.richOptions.push(options);\n });\n // 存储最后一行的字符信息,并且更新最终的宽度和高度用于确定canvas尺寸\n charsInfo.push(charInfo);\n width = Math.max(width, charInfo.width);\n height += charInfo.lineHeight;\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 // 首次渲染时初始化canvas尺寸和组件变换\n if (!this.initialized) {\n this.canvasSize = !this.canvasSize ? new math.Vector2(width, height) : this.canvasSize;\n const { x: canvasWidth, y: canvasHeight } = this.canvasSize;\n\n this.item.transform.size.set(x * canvasWidth * this.SCALE_FACTOR * this.SCALE_FACTOR, y * canvasHeight * this.SCALE_FACTOR * this.SCALE_FACTOR);\n this.size = this.item.transform.size.clone();\n this.initialized = true;\n }\n assertExist(this.canvasSize);\n const { x: canvasWidth, y: canvasHeight } = this.canvasSize;\n\n this.textLayout.width = canvasWidth / textStyle.fontScale;\n this.textLayout.height = canvasHeight / textStyle.fontScale;\n this.canvas.width = canvasWidth;\n this.canvas.height = canvasHeight;\n context.clearRect(0, 0, canvasWidth, canvasHeight);\n // fix bug 1/255\n context.fillStyle = `rgba(255, 255, 255, ${this.ALPHA_FIX_VALUE})`;\n if (!flipY) {\n context.translate(0, canvasHeight);\n context.scale(1, -1);\n }\n\n if (charsInfo.length === 0) {\n return;\n }\n let charsLineHeight = textLayout.getOffsetY(textStyle, charsInfo.length, fontHeight * this.singleLineHeight, textStyle.fontSize);\n\n charsInfo.forEach((charInfo, index) => {\n const { richOptions, offsetX, width } = charInfo;\n let charWidth = width;\n let offset = offsetX;\n\n if (overflow === spec.TextOverflow.display) {\n if (width > canvasWidth) {\n const canvasScale = canvasWidth / width;\n\n charWidth *= canvasScale;\n offset = offsetX.map(x => x * canvasScale);\n }\n\n }\n const x = this.textLayout.getOffsetX(textStyle, charWidth);\n\n if (index > 0) {\n charsLineHeight += charInfo.lineHeight - charInfo.offsetY;\n }\n\n richOptions.forEach((options, index) => {\n const { fontScale, textColor, fontFamily: textFamily, textWeight, fontStyle: richStyle } = textStyle;\n const { text, fontSize, fontColor = textColor, fontFamily = textFamily, fontWeight = textWeight, fontStyle = richStyle } = options;\n let textSize = fontSize;\n\n if (overflow === spec.TextOverflow.display) {\n if (width > canvasWidth) {\n textSize /= width / canvasWidth;\n }\n }\n\n const strOffsetX = offset[index] + x;\n\n context.font = `${fontStyle} ${fontWeight} ${textSize * fontScale}px ${fontFamily}`;\n context.fillStyle = `rgba(${fontColor[0]}, ${fontColor[1]}, ${fontColor[2]}, ${fontColor[3]})`;\n\n context.fillText(text, strOffsetX, charsLineHeight);\n\n });\n });\n // 与 toDataURL() 两种方式都需要像素读取操作\n const imageData = context.getImageData(0, 0, this.canvas.width, this.canvas.height);\n\n const texture = Texture.createWithData(\n this.engine,\n {\n data: new Uint8Array(imageData.data),\n width: imageData.width,\n height: imageData.height,\n },\n {\n flipY,\n magFilter: glContext.LINEAR,\n minFilter: glContext.LINEAR,\n wrapS: glContext.CLAMP_TO_EDGE,\n wrapT: glContext.CLAMP_TO_EDGE,\n },\n );\n\n this.renderer.texture = texture;\n this.material.setTexture('_MainTex', texture);\n\n this.isDirty = false;\n context.restore();\n }\n\n /**\n * 该方法富文本组件不支持\n * @param value - 水平偏移距离\n * @returns\n */\n override setShadowOffsetY (value: number): void {\n throw new Error('Method not implemented.');\n }\n\n /**\n * 该方法富文本组件不支持\n * @param value - 模糊程度\n */\n override setShadowBlur (value: number): void {\n throw new Error('Method not implemented.');\n }\n\n /**\n * 该方法富文本组件不支持\n * @param value - 水平偏移距离\n */\n override setShadowOffsetX (value: number): void {\n throw new Error('Method not implemented.');\n }\n\n /**\n * 该方法富文本组件不支持\n * @param value - 阴影颜色\n */\n override setShadowColor (value: spec.RGBAColorValue): void {\n throw new Error('Method not implemented.');\n }\n\n /**\n * 该方法富文本组件不支持\n * @param value - 外描边宽度\n * @returns\n */\n override setOutlineWidth (value: number): void {\n throw new Error('Method not implemented.');\n }\n\n /**\n * 该方法富文本组件不支持\n * @param value - 是否自动设置宽度\n */\n override setAutoWidth (value: boolean): void {\n throw new Error('Method not implemented.');\n }\n\n override updateWithOptions (options: spec.TextContentOptions) {\n this.textStyle = new TextStyle(options);\n this.textLayout = new TextLayout(options);\n this.textLayout.textBaseline = options.textBaseline || spec.TextBaseline.middle;\n this.text = options.text ? options.text.toString() : ' ';\n }\n\n protected override renderText (options: spec.RichTextContentOptions) {\n const { size } = options;\n\n if (size) {\n this.canvasSize = new math.Vector2(size[0], size[1]);\n }\n this.updateTexture();\n }\n\n}\n","import * as EFFECTS from '@galacean/effects';\nimport { logger, registerPlugin, VFXItem } from '@galacean/effects';\nimport { RichTextLoader } from './rich-text-loader';\n\nexport * from './rich-text-parser';\nexport * from './rich-text-component';\nexport * from './rich-text-loader';\n\n/**\n * 插件版本号\n */\nexport const version = __VERSION__;\n\nregisterPlugin('rich-text', RichTextLoader, VFXItem);\n\nlogger.info(`Plugin rich text version: ${version}.`);\n\nif (version !== EFFECTS.version) {\n console.error(\n '注意:请统一 RichText 插件与 Player 版本,不统一的版本混用会有不可预知的后果!',\n '\\nAttention: Please ensure the RichText plugin is synchronized with the Player version. Mixing and matching incompatible versions may result in unpredictable consequences!'\n );\n}\n"],"names":["_set_prototype_of","o","p","Object","setPrototypeOf","__proto__","_inherits","subClass","superClass","TypeError","prototype","create","constructor","value","writable","configurable","RichTextLoader","AbstractPlugin","name","_array_like_to_array","arr","len","length","i","arr2","Array","_create_for_of_iterator_helper_loose","allowArrayLike","it","Symbol","iterator","call","next","bind","isArray","minLen","n","toString","slice","from","test","_unsupported_iterable_to_array","done","TokenType","contextStartRegexp","contextEndRegexp","rules","lexer","input","lexed","cursor","_step","_iterator","regex","tokenType","tokenMatch","exec","concat","Error","richTextParser","Text","maybeText","peek","shift","ContextStart","maybeContextStart","matches","match","attributeName","attributeParam","ContextEnd","maybeContextEnd","shifted","ast","Grammar","attributes","expectedEndAttributeName","push","text","endAttributeName","generateProgram","textHandler","richText","node","context","reduce","ctx","isRichText","contextTokens","filter","param","contextStartTokens","contextEndTokens","checkPaired","startContextAttributes","token","restToken","map","hexToRGBA","hex","alpha","replace","split","char","join","a","parseInt","bigint","toRGBA","color","startsWith","colorName","document","canvas","createElement","getContext","fillStyle","remove","colorNameToRGBA","SuppressedError","seed","RichTextComponent","TextComponent","engine","processedTextOptions","singleLineHeight","size","_this","initialized","canvasSize","_proto","generateTextProgram","this","program","forEach","index","options","fontSize","textStyle","isNewLine","fontWeight","spec","TextWeight","bold","fontStyle","FontStyle","italic","fontColor","updateTexture","flipY","isDirty","width","height","textLayout","overflow","letterSpace","_textLayout_letterSpace","save","charsInfo","fontHeight","fontScale","charInfo","richOptions","offsetX","lineHeight","offsetY","Math","max","font","textWeight","fontFamily","textMetrics","measureText","textWidth","undefined","actualBoundingBoxLeft","actualBoundingBoxRight","actualWidth","textHeight","SCALE_FACTOR","item","transform","clone","_this_size","_this_size_x","x","_this_size_y","y","math","Vector2","_this_canvasSize","set","canvasWidth","canvasHeight","assertExist","_this_canvasSize1","clearRect","ALPHA_FIX_VALUE","translate","scale","charsLineHeight","getOffsetY","charWidth","offset","TextOverflow","display","canvasScale","getOffsetX","textColor","textFamily","richStyle","textSize","strOffsetX","fillText","imageData","getImageData","texture","Texture","createWithData","data","Uint8Array","magFilter","glContext","LINEAR","minFilter","wrapS","CLAMP_TO_EDGE","wrapT","renderer","material","setTexture","restore","setShadowOffsetY","setShadowBlur","setShadowOffsetX","setShadowColor","setOutlineWidth","setAutoWidth","updateWithOptions","TextStyle","TextLayout","textBaseline","TextBaseline","middle","renderText","decorators","target","key","desc","d","c","arguments","r","getOwnPropertyDescriptor","Reflect","decorate","defineProperty","effectsClass","DataType","version","registerPlugin","VFXItem","logger","info","EFFECTS","console","error"],"mappings":"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"}
1
+ {"version":3,"file":"douyin.mjs","sources":["../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_set_prototype_of.js","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_inherits.js","../src/rich-text-loader.ts","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_array_like_to_array.js","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_create_for_of_iterator_helper_loose.js","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_unsupported_iterable_to_array.js","../src/rich-text-parser.ts","../src/color-utils.ts","../../../node_modules/.pnpm/tslib@2.8.1/node_modules/tslib/tslib.es6.mjs","../src/rich-text-component.ts","../src/index.ts"],"sourcesContent":["function _set_prototype_of(o, p) {\n _set_prototype_of = Object.setPrototypeOf || function setPrototypeOf(o, p) {\n o.__proto__ = p;\n\n return o;\n };\n\n return _set_prototype_of(o, p);\n}\nexport { _set_prototype_of as _ };\n","import { _ as _set_prototype_of } from \"./_set_prototype_of.js\";\n\nfunction _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } });\n\n if (superClass) _set_prototype_of(subClass, superClass);\n}\nexport { _inherits as _ };\n","import { AbstractPlugin } from '@galacean/effects';\n\nexport class RichTextLoader extends AbstractPlugin {\n override name = 'rich-text';\n}\n","function _array_like_to_array(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n return arr2;\n}\nexport { _array_like_to_array as _ };\n","import { _ as _unsupported_iterable_to_array } from \"./_unsupported_iterable_to_array.js\";\n\nfunction _create_for_of_iterator_helper_loose(o, allowArrayLike) {\n var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"];\n\n if (it) return (it = it.call(o)).next.bind(it);\n // Fallback for engines without symbol support\n if (Array.isArray(o) || (it = _unsupported_iterable_to_array(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n if (it) o = it;\n\n var i = 0;\n\n return function() {\n if (i >= o.length) return { done: true };\n\n return { done: false, value: o[i++] };\n };\n }\n\n throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nexport { _create_for_of_iterator_helper_loose as _ };\n","import { _ as _array_like_to_array } from \"./_array_like_to_array.js\";\n\nfunction _unsupported_iterable_to_array(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _array_like_to_array(o, minLen);\n\n var n = Object.prototype.toString.call(o).slice(8, -1);\n\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(n);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);\n}\nexport { _unsupported_iterable_to_array as _ };\n","enum TokenType {\n ContextStart = 'ContextStart',\n Text = 'Text',\n ContextEnd = 'ContextEnd',\n EscapedChar = 'EscapedChar',\n}\n\nexport type Token = {\n tokenType: TokenType,\n value: string,\n};\n\nconst contextStartRegexp = /^<([a-z]+)(=([^>]+))?>$/;\nconst contextEndRegexp = /^<\\/([a-z]+)>$/;\n\nconst rules: [TokenType, RegExp][] = [\n [TokenType.EscapedChar, /^\\\\([=<>\\\\/])/],\n [TokenType.ContextStart, /^<[a-z]+(=[^>]+)?>/],\n [TokenType.ContextEnd, /^<\\/[a-z]+>/],\n [TokenType.Text, /^[^</>=\\\\]+/],\n];\n\nexport const lexer = (input: string, lexed: Token[] = [], cursor = 0): Token[] => {\n if (!input) {\n return lexed;\n }\n\n const escapedMatch = /^\\\\([=<>\\\\/])/.exec(input);\n\n if (escapedMatch) {\n const actualChar = escapedMatch[1];\n\n return lexer(input.slice(2), lexed.concat({ tokenType: TokenType.Text, value: actualChar }), cursor + 2);\n }\n\n for (const [tokenType, regex] of rules) {\n if (tokenType === TokenType.EscapedChar) { continue; }\n\n const match = regex.exec(input);\n\n if (!match) { continue; }\n\n const tokenMatch = match[0];\n const len = tokenMatch.length;\n\n return lexer(input.slice(len), lexed.concat({ tokenType, value: tokenMatch }), cursor + len);\n }\n\n if (input.length > 0) {\n return lexer(input.slice(1), lexed.concat({ tokenType: TokenType.Text, value: input[0] }), cursor + 1);\n }\n\n throw new Error(`Unexpected token: \"${input[0]}\" at position ${cursor} while reading \"${input}\"`);\n};\n\nexport type Attribute = {\n attributeName?: string,\n attributeParam?: string,\n};\n\nexport type RichTextAST = {\n attributes: Attribute[],\n text: string,\n};\n\nexport const richTextParser = (input: string): RichTextAST[] => {\n const lexed = lexer(input);\n let cursor = 0;\n\n const shift = () => {\n const shifted = lexed.shift();\n\n cursor += shifted?.value.length ?? 0;\n\n return shifted;\n };\n\n const peek = () => {\n return lexed[0];\n };\n\n const ast: RichTextAST[] = [];\n\n function Grammar (attributes: Attribute[] = [], expectedEndAttributeName = '') {\n const parsing = true;\n\n while (parsing) {\n const maybeText = Text();\n\n if (maybeText) {\n ast.push({\n attributes,\n text: maybeText,\n });\n\n continue;\n }\n\n const { attributeName, attributeParam } = ContextStart();\n\n if (attributeName) {\n Grammar(attributes.concat({ attributeName, attributeParam: attributeParam ?? '' }), attributeName);\n\n continue;\n }\n\n if (expectedEndAttributeName) {\n const { attributeName: endAttributeName } = ContextEnd();\n\n if (!endAttributeName) {\n throw new Error(`Expect an end tag marker \"${expectedEndAttributeName}\" at position ${cursor} but found no tag!`);\n }\n\n if (endAttributeName !== expectedEndAttributeName) {\n throw new Error(`Expect an end tag marker \"${expectedEndAttributeName}\" at position ${cursor} but found tag \"${endAttributeName}\"`);\n }\n\n return;\n }\n\n break;\n }\n }\n\n function Text (): string | undefined {\n let combinedText = '';\n let hasTextToken = false;\n\n while (lexed.length > 0 && lexed[0]?.tokenType === TokenType.Text) {\n const textToken = shift();\n\n if (textToken) {\n combinedText += textToken.value;\n hasTextToken = true;\n }\n }\n\n return hasTextToken ? combinedText : undefined;\n }\n\n function ContextStart (): { attributeName?: string, attributeParam?: string } {\n const maybeContextStart = peek();\n\n if (maybeContextStart?.tokenType === TokenType.ContextStart) {\n shift();\n\n const matches = maybeContextStart.value.match(contextStartRegexp);\n\n if (matches) {\n const attributeName = matches[1];\n const attributeParam = matches[3] ?? '';\n\n return { attributeName, attributeParam };\n }\n\n throw new Error(`Expected a start tag marker at position ${cursor}`);\n }\n\n return {};\n }\n\n function ContextEnd (): { attributeName?: string } {\n const maybeContextEnd = peek();\n\n if (maybeContextEnd?.tokenType === TokenType.ContextEnd) {\n shift();\n\n const matches = maybeContextEnd.value.match(contextEndRegexp);\n\n if (matches) {\n const attributeName = matches[1];\n\n return { attributeName };\n }\n\n throw new Error(`Expect an end tag marker at position ${cursor}`);\n }\n\n return {};\n }\n\n Grammar();\n\n return ast;\n};\n\nexport function generateProgram (textHandler: (text: string, context: Record<string, string | undefined>) => void) {\n return (richText: string) => {\n const ast = richTextParser(richText);\n\n for (const node of ast) {\n const text = node.text;\n const context = node.attributes.reduce<Record<string, string | undefined>>((ctx, { attributeName, attributeParam }) => {\n if (attributeName) {\n ctx[attributeName] = attributeParam;\n }\n\n return ctx;\n }, {});\n\n textHandler(text, context);\n }\n };\n}\n\nexport function isRichText (text: string): boolean {\n const lexed = lexer(text);\n\n const contextTokens = lexed.filter(({ tokenType }) => tokenType === TokenType.ContextStart || tokenType === TokenType.ContextEnd);\n\n const contextStartTokens = contextTokens.filter(({ tokenType }) => tokenType === TokenType.ContextStart);\n const contextEndTokens = contextTokens.filter(({ tokenType }) => tokenType === TokenType.ContextEnd);\n\n if (contextStartTokens.length !== contextEndTokens.length || !contextStartTokens.length) {\n return false;\n }\n\n const tokensOfAttribute = contextTokens.map(({ tokenType, value }) => ({ tokenType, value: tokenType === TokenType.ContextStart ? value.match(contextStartRegexp)![1] : value.match(contextEndRegexp)![1] }));\n\n function checkPaired ([token, ...restToken]: Token[], startContextAttributes: string[] = []): boolean {\n if (!token) {\n return startContextAttributes.length === 0;\n }\n\n if (token.tokenType === TokenType.ContextStart) {\n return checkPaired(restToken, startContextAttributes.concat(token.value));\n } else if (token.tokenType === TokenType.ContextEnd) {\n const attributeName = startContextAttributes[startContextAttributes.length - 1];\n\n if (attributeName !== token.value) {\n return false;\n }\n\n return checkPaired(restToken, startContextAttributes.slice(0, -1));\n }\n\n throw new Error(`Unexpected token: ${token.tokenType}`);\n }\n\n return checkPaired(tokensOfAttribute);\n}\n\n/**\n * 转义富文本中的特殊字符\n * @param input - 需要转义的输入字符串\n * @returns 转义后的字符串\n */\nexport function escape (input: string): string {\n if (typeof input !== 'string') {\n throw new Error('Input must be a string');\n }\n\n return input\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/=/g, '\\\\=')\n .replace(/</g, '\\\\<')\n .replace(/>/g, '\\\\>')\n .replace(/\\//g, '\\\\/');\n}\n\n/**\n * 反转义富文本中的特殊字符\n * @param input - 需要反转义的输入字符串\n * @returns 反转义后的字符串\n */\nexport function unescape (input: string): string {\n if (typeof input !== 'string') {\n throw new Error('Input must be a string');\n }\n\n return input\n .replace(/\\\\\\//g, '/')\n .replace(/\\\\>/g, '>')\n .replace(/\\\\</g, '<')\n .replace(/\\\\=/g, '=')\n .replace(/\\\\\\\\/g, '\\\\');\n}\n","import type { spec } from '@galacean/effects';\n\n/**\n * 将颜色名称转换为 RGBA\n * @param colorName - 颜色名称\n * @returns RGBA 颜色字符串\n */\nexport function colorNameToRGBA (colorName: string): string {\n if (typeof colorName !== 'string' || !colorName) {\n throw new Error('Invalid color name provided');\n }\n if (typeof document === 'undefined') {\n throw new Error('This method requires a browser environment');\n }\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n\n if (context) {\n try {\n context.fillStyle = colorName;\n const result = context.fillStyle;\n\n return result;\n } finally {\n // Clean up DOM element\n canvas.remove();\n }\n }\n\n throw new Error('Failed to get 2D context for color conversion!');\n}\n\n/**\n * 将 16 进制颜色转换为 RGBA\n * @param hex - 16 进制颜色\n * @param alpha - 透明度\n * @returns - RGBA 颜色\n */\nexport function hexToRGBA (hex: string, alpha: number = 1): spec.vec4 {\n hex = hex.replace(/^#/, '');\n\n if (hex.length === 3 || hex.length === 4) {\n hex = hex.split('').map(char => char + char).join('');\n }\n\n // Handle alpha channel in hex\n if (hex.length === 8) {\n const a = parseInt(hex.slice(6, 8), 16) / 255;\n\n hex = hex.slice(0, 6);\n alpha = a;\n }\n const bigint = parseInt(hex, 16);\n const r = (bigint >> 16) & 255;\n const g = (bigint >> 8) & 255;\n const b = bigint & 255;\n\n return [r, g, b, alpha];\n}\n\n/**\n * 将颜色字符串转换为 RGBA\n * @param color - 颜色字符串\n * @param alpha - 透明度\n * @returns - RGBA 颜色\n */\nexport function toRGBA (color: string, alpha: number = 1): spec.vec4 {\n if (typeof color !== 'string' || !color) {\n throw new Error('Invalid color string');\n }\n if (color.startsWith('#')) {\n return hexToRGBA(color, alpha);\n } else {\n return hexToRGBA(colorNameToRGBA(color));\n }\n}\n","/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\n\nvar extendStatics = function(d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n }\n return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n var _, done = false;\n for (var i = decorators.length - 1; i >= 0; i--) {\n var context = {};\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n if (kind === \"accessor\") {\n if (result === void 0) continue;\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n if (_ = accept(result.get)) descriptor.get = _;\n if (_ = accept(result.set)) descriptor.set = _;\n if (_ = accept(result.init)) initializers.unshift(_);\n }\n else if (_ = accept(result)) {\n if (kind === \"field\") initializers.unshift(_);\n else descriptor[key] = _;\n }\n }\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\n done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n var useValue = arguments.length > 2;\n for (var i = 0; i < initializers.length; i++) {\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n }\n return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\n\nexport function __generator(thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++)\n ar = ar.concat(__read(arguments[i]));\n return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n function fulfill(value) { resume(\"next\", value); }\n function reject(value) { resume(\"throw\", value); }\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n var i, p;\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var m = o[Symbol.asyncIterator], i;\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n};\n\nvar ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n};\n\nexport function __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n}\n\nexport function __importDefault(mod) {\n return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport function __addDisposableResource(env, value, async) {\n if (value !== null && value !== void 0) {\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\n var dispose, inner;\n if (async) {\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\n dispose = value[Symbol.asyncDispose];\n }\n if (dispose === void 0) {\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\n dispose = value[Symbol.dispose];\n if (async) inner = dispose;\n }\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\n env.stack.push({ value: value, dispose: dispose, async: async });\n }\n else if (async) {\n env.stack.push({ async: true });\n }\n return value;\n}\n\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n var e = new Error(message);\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\nexport function __disposeResources(env) {\n function fail(e) {\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\n env.hasError = true;\n }\n var r, s = 0;\n function next() {\n while (r = env.stack.pop()) {\n try {\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\n if (r.dispose) {\n var result = r.dispose.call(r.value);\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\n }\n else s |= 1;\n }\n catch (e) {\n fail(e);\n }\n }\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\n if (env.hasError) throw env.error;\n }\n return next();\n}\n\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\n });\n }\n return path;\n}\n\nexport default {\n __extends,\n __assign,\n __rest,\n __decorate,\n __param,\n __esDecorate,\n __runInitializers,\n __propKey,\n __setFunctionName,\n __metadata,\n __awaiter,\n __generator,\n __createBinding,\n __exportStar,\n __values,\n __read,\n __spread,\n __spreadArrays,\n __spreadArray,\n __await,\n __asyncGenerator,\n __asyncDelegator,\n __asyncValues,\n __makeTemplateObject,\n __importStar,\n __importDefault,\n __classPrivateFieldGet,\n __classPrivateFieldSet,\n __classPrivateFieldIn,\n __addDisposableResource,\n __disposeResources,\n __rewriteRelativeImportExtension,\n};\n","import type { Engine } from '@galacean/effects';\nimport { assertExist, math, effectsClass, glContext, spec, TextComponent, Texture, TextLayout, TextStyle } from '@galacean/effects';\nimport { generateProgram } from './rich-text-parser';\nimport { toRGBA } from './color-utils';\n\n/**\n *\n */\nexport interface RichTextOptions {\n text: string,\n fontSize: number,\n fontFamily?: string,\n fontWeight?: spec.TextWeight,\n fontStyle?: spec.FontStyle,\n fontColor?: spec.vec4,\n textStyle?: TextStyle,\n isNewLine: boolean,\n}\n\ninterface CharDetail {\n /**\n * 字符内容\n */\n char: string,\n /**\n * 当前字符在本行内的起始 x 坐标(相对行起点)\n */\n x: number,\n /**\n * 当前字符的宽度\n */\n width: number,\n}\n\ninterface RichCharInfo {\n /**\n * 每个富文本片段的起始 x 坐标\n */\n offsetX: number[],\n /**\n * 字符参数\n */\n richOptions: RichTextOptions[],\n /**\n * 段落宽度\n */\n width: number,\n /**\n * 段落高度\n */\n lineHeight: number,\n /**\n * 字体偏移高度\n */\n offsetY: number,\n /**\n * 当前富文本片段内所有字符的详细信息\n */\n chars: CharDetail[][],\n}\n\nlet seed = 0;\n\n/**\n * RichText component class\n */\n@effectsClass(spec.DataType.RichTextComponent)\nexport class RichTextComponent extends TextComponent {\n processedTextOptions: RichTextOptions[] = [];\n // 字体高度的倍数(字体高度上下多出来的部分就是行间距)\n private singleLineHeight: number = 1.0;\n private size: math.Vector2 | null = null;\n /**\n * 获取第一次渲染的 size\n */\n private initialized: boolean = false;\n /**\n * canvas 大小\n */\n private canvasSize: math.Vector2 | null = null;\n\n constructor (engine: Engine) {\n super(engine);\n\n this.name = 'MRichText' + seed++;\n }\n\n private generateTextProgram (text: string) {\n this.processedTextOptions = [];\n const program = generateProgram((text, context) => {\n // 如果富文本仅包含换行符,则在每个换行符后添加一个空格\n if (/^\\n+$/.test(text)) {\n text = text.replace(/\\n/g, '\\n ');\n }\n const textArr = text.split('\\n');\n\n textArr.forEach((text, index) => {\n const options: RichTextOptions = {\n text,\n fontSize: this.textStyle.fontSize,\n isNewLine: false,\n };\n\n if (index > 0) {\n options.isNewLine = true;\n }\n if ('b' in context) {\n options.fontWeight = spec.TextWeight.bold;\n }\n\n if ('i' in context) {\n options.fontStyle = spec.FontStyle.italic;\n }\n\n if ('size' in context && context.size) {\n options.fontSize = parseInt(context.size, 10);\n }\n\n if ('color' in context && context.color) {\n options.fontColor = toRGBA(context.color);\n }\n this.processedTextOptions.push(options);\n });\n\n });\n\n program(text);\n }\n\n override updateTexture (flipY = true) {\n if (!this.isDirty || !this.context || !this.canvas) {\n return;\n }\n // 解析富文本\n this.generateTextProgram(this.text);\n let width = 0, height = 0;\n const { textLayout, textStyle } = this;\n const { overflow, letterSpace = 0 } = textLayout;\n const context = this.context;\n\n context.save();\n\n const charsInfo: RichCharInfo[] = [];\n const fontHeight = textStyle.fontSize * this.textStyle.fontScale;\n let charInfo: RichCharInfo = {\n richOptions: [],\n offsetX: [],\n width: 0,\n // 包括字体和上下行间距的高度\n lineHeight: fontHeight * (this.singleLineHeight + (this.textLayout.lineGap || 0)),\n // 字体偏移高度(也就是行间距)\n offsetY: fontHeight * ((this.singleLineHeight + (this.textLayout.lineGap || 0) - 1)) / 2,\n chars: [],\n };\n\n // 遍历解析后的文本选项\n this.processedTextOptions.forEach(options => {\n const { text, isNewLine, fontSize } = options;\n\n // 如果是新行,则将之前行的信息存入charsInfo并且初始化新行的charInfo\n if (isNewLine) {\n charsInfo.push(charInfo);\n width = Math.max(width, charInfo.width);\n charInfo = {\n richOptions: [],\n offsetX: [],\n width: 0,\n lineHeight: fontHeight * (this.singleLineHeight + (this.textLayout.lineGap || 0)),\n offsetY: fontHeight * (this.singleLineHeight + (this.textLayout.lineGap || 0) - 1) / 2,\n chars: [],\n };\n // 管理行的总高度调整canvas尺寸\n height += charInfo.lineHeight;\n }\n // 恢复默认设置\n context.font = `${options.fontWeight || textStyle.textWeight} 10px ${options.fontFamily || textStyle.fontFamily}`;\n\n const textHeight = fontSize * (this.singleLineHeight + (this.textLayout.lineGap || 0)) * this.textStyle.fontScale;\n\n if (textHeight > charInfo.lineHeight) {\n height += textHeight - charInfo.lineHeight;\n charInfo.lineHeight = textHeight;\n charInfo.offsetY = fontSize * this.textStyle.fontScale * ((this.singleLineHeight + (this.textLayout.lineGap || 0)) - 1) / 2;\n }\n\n charInfo.offsetX.push(charInfo.width);\n //逐字计算宽度以实现字符间距\n let segmentInnerX = 0;\n const charArr: CharDetail[] = [];\n\n for (let i = 0; i < text.length; i++) {\n const char = text[i];\n const tempcharWidth = context.measureText(char).width;\n const charWidth = (tempcharWidth <= 0 ? 0 : tempcharWidth) * fontSize * this.SCALE_FACTOR * this.textStyle.fontScale;\n\n charArr.push({\n char,\n x: segmentInnerX,\n width: charWidth,\n });\n segmentInnerX += charWidth + letterSpace;\n }\n charInfo.chars.push(charArr); // 每个片段一个字符数组\n charInfo.width += segmentInnerX;\n charInfo.richOptions.push(options);\n });\n // 存储最后一行的字符信息,并且更新最终的宽度和高度用于确定canvas尺寸\n charsInfo.push(charInfo);\n width = Math.max(width, charInfo.width);\n height += charInfo.lineHeight;\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 // 首次渲染时初始化canvas尺寸和组件变换\n if (!this.initialized) {\n this.canvasSize = !this.canvasSize ? new math.Vector2(width, height) : this.canvasSize;\n const { x: canvasWidth, y: canvasHeight } = this.canvasSize;\n\n this.item.transform.size.set(x * canvasWidth * this.SCALE_FACTOR * this.SCALE_FACTOR, y * canvasHeight * this.SCALE_FACTOR * this.SCALE_FACTOR);\n this.size = this.item.transform.size.clone();\n this.initialized = true;\n }\n assertExist(this.canvasSize);\n const { x: canvasWidth, y: canvasHeight } = this.canvasSize;\n\n this.textLayout.width = canvasWidth / textStyle.fontScale;\n this.textLayout.height = canvasHeight / textStyle.fontScale;\n this.canvas.width = canvasWidth;\n this.canvas.height = canvasHeight;\n context.clearRect(0, 0, canvasWidth, canvasHeight);\n // fix bug 1/255\n context.fillStyle = `rgba(255, 255, 255, ${this.ALPHA_FIX_VALUE})`;\n if (!flipY) {\n context.translate(0, canvasHeight);\n context.scale(1, -1);\n }\n\n if (charsInfo.length === 0) {\n return;\n }\n let charsLineHeight = textLayout.getOffsetY(textStyle, charsInfo.length, fontHeight * (this.singleLineHeight + (this.textLayout.lineGap || 0)), textStyle.fontSize);\n\n charsInfo.forEach((charInfo, index) => {\n const { richOptions, offsetX, width, chars } = charInfo;\n let charWidth = width;\n let offset = offsetX;\n const charsArr = chars;\n\n if (overflow === spec.TextOverflow.display) {\n if (width > canvasWidth) {\n const canvasScale = canvasWidth / width;\n\n charWidth *= canvasScale;\n offset = offsetX.map(x => x * canvasScale);\n charsArr.forEach(\n charArr => {\n charArr.forEach(charDetail => {\n charDetail.x *= canvasScale;\n charDetail.width *= canvasScale;\n });\n },\n );\n }\n\n }\n const x = this.textLayout.getOffsetX(textStyle, charWidth);\n\n if (index > 0) {\n charsLineHeight += charsInfo[index - 1].lineHeight;\n }\n\n richOptions.forEach((options, index) => {\n const { fontScale, textColor, fontFamily: textFamily, textWeight, fontStyle: richStyle } = textStyle;\n const { fontSize, fontColor = textColor, fontFamily = textFamily, fontWeight = textWeight, fontStyle = richStyle } = options;\n let textSize = fontSize;\n\n if (overflow === spec.TextOverflow.display) {\n if (width > canvasWidth) {\n textSize /= width / canvasWidth;\n }\n }\n\n const strOffsetX = offset[index] + x;\n\n context.font = `${fontStyle} ${fontWeight} ${textSize * fontScale}px ${fontFamily}`;\n context.fillStyle = `rgba(${fontColor[0]}, ${fontColor[1]}, ${fontColor[2]}, ${fontColor[3]})`;\n\n // 遍历当前行的 chars 逐字绘制\n const charArr = charInfo.chars[index]; // 只取当前片段的字符数组\n\n charArr.forEach(charDetail => {\n context.fillText(charDetail.char, strOffsetX + charDetail.x, charsLineHeight);\n });\n\n });\n });\n // 与 toDataURL() 两种方式都需要像素读取操作\n const imageData = context.getImageData(0, 0, this.canvas.width, this.canvas.height);\n\n const texture = Texture.createWithData(\n this.engine,\n {\n data: new Uint8Array(imageData.data),\n width: imageData.width,\n height: imageData.height,\n },\n {\n flipY,\n magFilter: glContext.LINEAR,\n minFilter: glContext.LINEAR,\n wrapS: glContext.CLAMP_TO_EDGE,\n wrapT: glContext.CLAMP_TO_EDGE,\n },\n );\n\n this.renderer.texture = texture;\n this.material.setTexture('_MainTex', texture);\n\n this.isDirty = false;\n context.restore();\n }\n\n /**\n * 该方法富文本组件不支持\n * @param value - 水平偏移距离\n * @returns\n */\n override setShadowOffsetY (value: number): void {\n throw new Error('Method not implemented.');\n }\n\n /**\n * 该方法富文本组件不支持\n * @param value - 模糊程度\n */\n override setShadowBlur (value: number): void {\n throw new Error('Method not implemented.');\n }\n\n /**\n * 该方法富文本组件不支持\n * @param value - 水平偏移距离\n */\n override setShadowOffsetX (value: number): void {\n throw new Error('Method not implemented.');\n }\n\n /**\n * 该方法富文本组件不支持\n * @param value - 阴影颜色\n */\n override setShadowColor (value: spec.RGBAColorValue): void {\n throw new Error('Method not implemented.');\n }\n\n /**\n * 该方法富文本组件不支持\n * @param value - 外描边宽度\n * @returns\n */\n override setOutlineWidth (value: number): void {\n throw new Error('Method not implemented.');\n }\n\n /**\n * 该方法富文本组件不支持\n * @param value - 是否自动设置宽度\n */\n override setAutoWidth (value: boolean): void {\n throw new Error('Method not implemented.');\n }\n\n override updateWithOptions (options: spec.TextContentOptions) {\n this.textStyle = new TextStyle(options);\n this.textLayout = new TextLayout(options);\n this.textLayout.textBaseline = options.textBaseline || spec.TextBaseline.middle;\n this.text = options.text ? options.text.toString() : ' ';\n }\n\n protected override renderText (options: spec.RichTextContentOptions) {\n const { size } = options;\n\n if (size) {\n this.canvasSize = new math.Vector2(size[0], size[1]);\n }\n this.updateTexture();\n }\n\n}\n","import * as EFFECTS from '@galacean/effects';\nimport { logger, registerPlugin, VFXItem } from '@galacean/effects';\nimport { RichTextLoader } from './rich-text-loader';\n\nexport * from './rich-text-parser';\nexport * from './rich-text-component';\nexport * from './rich-text-loader';\n\n/**\n * 插件版本号\n */\nexport const version = __VERSION__;\n\nregisterPlugin('rich-text', RichTextLoader, VFXItem);\n\nlogger.info(`Plugin rich text version: ${version}.`);\n\nif (version !== EFFECTS.version) {\n console.error(\n '注意:请统一 RichText 插件与 Player 版本,不统一的版本混用会有不可预知的后果!',\n '\\nAttention: Please ensure the RichText plugin is synchronized with the Player version. Mixing and matching incompatible versions may result in unpredictable consequences!'\n );\n}\n"],"names":["_set_prototype_of","o","p","Object","setPrototypeOf","__proto__","_inherits","subClass","superClass","TypeError","prototype","create","constructor","value","writable","configurable","RichTextLoader","AbstractPlugin","name","_array_like_to_array","arr","len","length","i","arr2","Array","_create_for_of_iterator_helper_loose","allowArrayLike","it","Symbol","iterator","call","next","bind","isArray","minLen","n","toString","slice","from","test","_unsupported_iterable_to_array","done","TokenType","contextStartRegexp","contextEndRegexp","rules","lexer","input","lexed","cursor","escapedMatch","exec","actualChar","concat","tokenType","_step","_iterator","regex","match","tokenMatch","Error","richTextParser","Text","combinedText","hasTextToken","textToken","shift","undefined","ContextStart","maybeContextStart","peek","matches","attributeName","attributeParam","ContextEnd","maybeContextEnd","shifted","ast","Grammar","attributes","expectedEndAttributeName","maybeText","push","text","endAttributeName","generateProgram","textHandler","richText","node","context","reduce","ctx","isRichText","contextTokens","filter","param","contextStartTokens","contextEndTokens","checkPaired","startContextAttributes","token","restToken","map","escape","replace","unescape","hexToRGBA","hex","alpha","split","char","join","a","parseInt","bigint","toRGBA","color","startsWith","colorName","document","canvas","createElement","getContext","fillStyle","remove","colorNameToRGBA","SuppressedError","seed","RichTextComponent","TextComponent","engine","processedTextOptions","singleLineHeight","size","_this","initialized","canvasSize","_proto","generateTextProgram","this","program","forEach","index","options","fontSize","textStyle","isNewLine","fontWeight","spec","TextWeight","bold","fontStyle","FontStyle","italic","fontColor","updateTexture","flipY","isDirty","width","height","textLayout","overflow","letterSpace","_textLayout_letterSpace","save","charsInfo","fontHeight","fontScale","charInfo","richOptions","offsetX","lineHeight","lineGap","offsetY","chars","Math","max","font","textWeight","fontFamily","textHeight","segmentInnerX","charArr","tempcharWidth","measureText","charWidth","SCALE_FACTOR","x","item","transform","clone","_this_size","_this_size_x","_this_size_y","y","math","Vector2","_this_canvasSize","set","canvasWidth","canvasHeight","assertExist","_this_canvasSize1","clearRect","ALPHA_FIX_VALUE","translate","scale","charsLineHeight","getOffsetY","offset","charsArr","TextOverflow","display","canvasScale","charDetail","getOffsetX","textColor","textFamily","richStyle","textSize","strOffsetX","fillText","imageData","getImageData","texture","Texture","createWithData","data","Uint8Array","magFilter","glContext","LINEAR","minFilter","wrapS","CLAMP_TO_EDGE","wrapT","renderer","material","setTexture","restore","setShadowOffsetY","setShadowBlur","setShadowOffsetX","setShadowColor","setOutlineWidth","setAutoWidth","updateWithOptions","TextStyle","TextLayout","textBaseline","TextBaseline","middle","renderText","decorators","target","key","desc","d","c","arguments","r","getOwnPropertyDescriptor","Reflect","decorate","defineProperty","effectsClass","DataType","version","registerPlugin","VFXItem","logger","info","EFFECTS","console","error"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -3,7 +3,7 @@
3
3
  * Description: Galacean Effects player rich text plugin
4
4
  * Author: Ant Group CO., Ltd.
5
5
  * Contributors: 云垣
6
- * Version: v2.6.6
6
+ * Version: v2.7.0-alpha.0
7
7
  */
8
8
 
9
9
  'use strict';
@@ -105,21 +105,26 @@ var TokenType;
105
105
  TokenType["ContextStart"] = "ContextStart";
106
106
  TokenType["Text"] = "Text";
107
107
  TokenType["ContextEnd"] = "ContextEnd";
108
+ TokenType["EscapedChar"] = "EscapedChar";
108
109
  })(TokenType || (TokenType = {}));
109
110
  var contextStartRegexp = /^<([a-z]+)(=([^>]+))?>$/;
110
111
  var contextEndRegexp = /^<\/([a-z]+)>$/;
111
112
  var rules = [
112
113
  [
113
- "ContextStart",
114
- /^<[a-z]+(=[^>]+)?>/
114
+ "EscapedChar",
115
+ /^\\([=<>\\/])/
115
116
  ],
116
117
  [
117
- "Text",
118
- /^[^</>=]+/
118
+ "ContextStart",
119
+ /^<[a-z]+(=[^>]+)?>/
119
120
  ],
120
121
  [
121
122
  "ContextEnd",
122
123
  /^<\/[a-z]+>/
124
+ ],
125
+ [
126
+ "Text",
127
+ /^[^</>=\\]+/
123
128
  ]
124
129
  ];
125
130
  var lexer = function(input, lexed, cursor) {
@@ -128,28 +133,51 @@ var lexer = function(input, lexed, cursor) {
128
133
  if (!input) {
129
134
  return lexed;
130
135
  }
136
+ var escapedMatch = /^\\([=<>\\/])/.exec(input);
137
+ if (escapedMatch) {
138
+ var actualChar = escapedMatch[1];
139
+ return lexer(input.slice(2), lexed.concat({
140
+ tokenType: "Text",
141
+ value: actualChar
142
+ }), cursor + 2);
143
+ }
131
144
  for(var _iterator = _create_for_of_iterator_helper_loose(rules), _step; !(_step = _iterator()).done;){
132
145
  var _step_value = _step.value, tokenType = _step_value[0], regex = _step_value[1];
133
- var _regex_exec;
134
- var _ref = (_regex_exec = regex.exec(input)) != null ? _regex_exec : [], tokenMatch = _ref[0];
135
- if (tokenMatch) {
136
- var len = tokenMatch.length;
137
- return lexer(input.slice(len), lexed.concat({
138
- tokenType: tokenType,
139
- value: tokenMatch
140
- }), cursor + len);
146
+ if (tokenType === "EscapedChar") {
147
+ continue;
141
148
  }
149
+ var match = regex.exec(input);
150
+ if (!match) {
151
+ continue;
152
+ }
153
+ var tokenMatch = match[0];
154
+ var len = tokenMatch.length;
155
+ return lexer(input.slice(len), lexed.concat({
156
+ tokenType: tokenType,
157
+ value: tokenMatch
158
+ }), cursor + len);
159
+ }
160
+ if (input.length > 0) {
161
+ return lexer(input.slice(1), lexed.concat({
162
+ tokenType: "Text",
163
+ value: input[0]
164
+ }), cursor + 1);
142
165
  }
143
166
  throw new Error('Unexpected token: "' + input[0] + '" at position ' + cursor + ' while reading "' + input + '"');
144
167
  };
145
168
  var richTextParser = function(input) {
146
169
  var Text = function Text() {
147
- var maybeText = peek();
148
- if ((maybeText == null ? void 0 : maybeText.tokenType) === "Text") {
149
- shift();
150
- return maybeText.value;
170
+ var _lexed_;
171
+ var combinedText = "";
172
+ var hasTextToken = false;
173
+ while(lexed.length > 0 && ((_lexed_ = lexed[0]) == null ? void 0 : _lexed_.tokenType) === "Text"){
174
+ var textToken = shift();
175
+ if (textToken) {
176
+ combinedText += textToken.value;
177
+ hasTextToken = true;
178
+ }
151
179
  }
152
- return undefined;
180
+ return hasTextToken ? combinedText : undefined;
153
181
  };
154
182
  var ContextStart = function ContextStart() {
155
183
  var maybeContextStart = peek();
@@ -213,7 +241,7 @@ var richTextParser = function(input) {
213
241
  if (attributeName) {
214
242
  Grammar(attributes.concat({
215
243
  attributeName: attributeName,
216
- attributeParam: attributeParam
244
+ attributeParam: attributeParam != null ? attributeParam : ""
217
245
  }), attributeName);
218
246
  continue;
219
247
  }
@@ -293,6 +321,26 @@ function isRichText(text) {
293
321
  }
294
322
  return checkPaired(tokensOfAttribute);
295
323
  }
324
+ /**
325
+ * 转义富文本中的特殊字符
326
+ * @param input - 需要转义的输入字符串
327
+ * @returns 转义后的字符串
328
+ */ function escape(input) {
329
+ if (typeof input !== "string") {
330
+ throw new Error("Input must be a string");
331
+ }
332
+ return input.replace(/\\/g, "\\\\").replace(/=/g, "\\=").replace(/</g, "\\<").replace(/>/g, "\\>").replace(/\//g, "\\/");
333
+ }
334
+ /**
335
+ * 反转义富文本中的特殊字符
336
+ * @param input - 需要反转义的输入字符串
337
+ * @returns 反转义后的字符串
338
+ */ function unescape(input) {
339
+ if (typeof input !== "string") {
340
+ throw new Error("Input must be a string");
341
+ }
342
+ return input.replace(/\\\//g, "/").replace(/\\>/g, ">").replace(/\\</g, "<").replace(/\\=/g, "=").replace(/\\\\/g, "\\");
343
+ }
296
344
 
297
345
  function __decorate(decorators, target, key, desc) {
298
346
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
@@ -385,7 +433,7 @@ exports.RichTextComponent = /*#__PURE__*/ function(TextComponent) {
385
433
  _this = TextComponent.call(this, engine) || this;
386
434
  _this.processedTextOptions = [];
387
435
  // 字体高度的倍数(字体高度上下多出来的部分就是行间距)
388
- _this.singleLineHeight = 1.571;
436
+ _this.singleLineHeight = 1.0;
389
437
  _this.size = null;
390
438
  /**
391
439
  * 获取第一次渲染的 size
@@ -452,9 +500,10 @@ exports.RichTextComponent = /*#__PURE__*/ function(TextComponent) {
452
500
  offsetX: [],
453
501
  width: 0,
454
502
  // 包括字体和上下行间距的高度
455
- lineHeight: fontHeight * this.singleLineHeight,
503
+ lineHeight: fontHeight * (this.singleLineHeight + (this.textLayout.lineGap || 0)),
456
504
  // 字体偏移高度(也就是行间距)
457
- offsetY: fontHeight * (this.singleLineHeight - 1) / 2
505
+ offsetY: fontHeight * (this.singleLineHeight + (this.textLayout.lineGap || 0) - 1) / 2,
506
+ chars: []
458
507
  };
459
508
  // 遍历解析后的文本选项
460
509
  this.processedTextOptions.forEach(function(options) {
@@ -467,33 +516,38 @@ exports.RichTextComponent = /*#__PURE__*/ function(TextComponent) {
467
516
  richOptions: [],
468
517
  offsetX: [],
469
518
  width: 0,
470
- lineHeight: fontHeight * _this.singleLineHeight,
471
- offsetY: fontHeight * (_this.singleLineHeight - 1) / 2
519
+ lineHeight: fontHeight * (_this.singleLineHeight + (_this.textLayout.lineGap || 0)),
520
+ offsetY: fontHeight * (_this.singleLineHeight + (_this.textLayout.lineGap || 0) - 1) / 2,
521
+ chars: []
472
522
  };
473
523
  // 管理行的总高度调整canvas尺寸
474
524
  height += charInfo.lineHeight;
475
525
  }
476
526
  // 恢复默认设置
477
527
  context.font = (options.fontWeight || textStyle.textWeight) + " 10px " + (options.fontFamily || textStyle.fontFamily);
478
- // 计算得到每个字段的宽度textWidth
479
- var textMetrics = context.measureText(text);
480
- var textWidth = textMetrics.width;
481
- if (textMetrics.actualBoundingBoxLeft !== undefined && textMetrics.actualBoundingBoxRight !== undefined) {
482
- var actualWidth = textMetrics.actualBoundingBoxLeft + textMetrics.actualBoundingBoxRight;
483
- if (actualWidth > 0) {
484
- textWidth = Math.max(textWidth, actualWidth);
485
- }
486
- }
487
- var textHeight = fontSize * _this.singleLineHeight * _this.textStyle.fontScale;
528
+ var textHeight = fontSize * (_this.singleLineHeight + (_this.textLayout.lineGap || 0)) * _this.textStyle.fontScale;
488
529
  if (textHeight > charInfo.lineHeight) {
489
530
  height += textHeight - charInfo.lineHeight;
490
531
  charInfo.lineHeight = textHeight;
491
- charInfo.offsetY = fontSize * _this.textStyle.fontScale * (_this.singleLineHeight - 1) / 2;
532
+ charInfo.offsetY = fontSize * _this.textStyle.fontScale * (_this.singleLineHeight + (_this.textLayout.lineGap || 0) - 1) / 2;
492
533
  }
493
534
  charInfo.offsetX.push(charInfo.width);
494
- // 计算字段宽度*富文本字体大小*缩放因子*整体文本大小+每个字符的间距(每个字符间距存疑,因为实际测量的宽度已经包含了间距)
495
- charInfo.width += (textWidth <= 0 ? 0 : textWidth) * fontSize * _this.SCALE_FACTOR * _this.textStyle.fontScale + text.length * letterSpace;
496
- // 将富文本数据存入charInfo
535
+ //逐字计算宽度以实现字符间距
536
+ var segmentInnerX = 0;
537
+ var charArr = [];
538
+ for(var i = 0; i < text.length; i++){
539
+ var char = text[i];
540
+ var tempcharWidth = context.measureText(char).width;
541
+ var charWidth = (tempcharWidth <= 0 ? 0 : tempcharWidth) * fontSize * _this.SCALE_FACTOR * _this.textStyle.fontScale;
542
+ charArr.push({
543
+ char: char,
544
+ x: segmentInnerX,
545
+ width: charWidth
546
+ });
547
+ segmentInnerX += charWidth + letterSpace;
548
+ }
549
+ charInfo.chars.push(charArr); // 每个片段一个字符数组
550
+ charInfo.width += segmentInnerX;
497
551
  charInfo.richOptions.push(options);
498
552
  });
499
553
  // 存储最后一行的字符信息,并且更新最终的宽度和高度用于确定canvas尺寸
@@ -532,11 +586,12 @@ exports.RichTextComponent = /*#__PURE__*/ function(TextComponent) {
532
586
  if (charsInfo.length === 0) {
533
587
  return;
534
588
  }
535
- var charsLineHeight = textLayout.getOffsetY(textStyle, charsInfo.length, fontHeight * this.singleLineHeight, textStyle.fontSize);
589
+ var charsLineHeight = textLayout.getOffsetY(textStyle, charsInfo.length, fontHeight * (this.singleLineHeight + (this.textLayout.lineGap || 0)), textStyle.fontSize);
536
590
  charsInfo.forEach(function(charInfo, index) {
537
- var richOptions = charInfo.richOptions, offsetX = charInfo.offsetX, width = charInfo.width;
591
+ var richOptions = charInfo.richOptions, offsetX = charInfo.offsetX, width = charInfo.width, chars = charInfo.chars;
538
592
  var charWidth = width;
539
593
  var offset = offsetX;
594
+ var charsArr = chars;
540
595
  if (overflow === EFFECTS.spec.TextOverflow.display) {
541
596
  if (width > canvasWidth1) {
542
597
  var canvasScale = canvasWidth1 / width;
@@ -544,15 +599,21 @@ exports.RichTextComponent = /*#__PURE__*/ function(TextComponent) {
544
599
  offset = offsetX.map(function(x) {
545
600
  return x * canvasScale;
546
601
  });
602
+ charsArr.forEach(function(charArr) {
603
+ charArr.forEach(function(charDetail) {
604
+ charDetail.x *= canvasScale;
605
+ charDetail.width *= canvasScale;
606
+ });
607
+ });
547
608
  }
548
609
  }
549
610
  var x = _this.textLayout.getOffsetX(textStyle, charWidth);
550
611
  if (index > 0) {
551
- charsLineHeight += charInfo.lineHeight - charInfo.offsetY;
612
+ charsLineHeight += charsInfo[index - 1].lineHeight;
552
613
  }
553
614
  richOptions.forEach(function(options, index) {
554
615
  var fontScale = textStyle.fontScale, textColor = textStyle.textColor, textFamily = textStyle.fontFamily, textWeight = textStyle.textWeight, richStyle = textStyle.fontStyle;
555
- var text = options.text, fontSize = options.fontSize, _options_fontColor = options.fontColor, fontColor = _options_fontColor === void 0 ? textColor : _options_fontColor, _options_fontFamily = options.fontFamily, fontFamily = _options_fontFamily === void 0 ? textFamily : _options_fontFamily, _options_fontWeight = options.fontWeight, fontWeight = _options_fontWeight === void 0 ? textWeight : _options_fontWeight, _options_fontStyle = options.fontStyle, fontStyle = _options_fontStyle === void 0 ? richStyle : _options_fontStyle;
616
+ var fontSize = options.fontSize, _options_fontColor = options.fontColor, fontColor = _options_fontColor === void 0 ? textColor : _options_fontColor, _options_fontFamily = options.fontFamily, fontFamily = _options_fontFamily === void 0 ? textFamily : _options_fontFamily, _options_fontWeight = options.fontWeight, fontWeight = _options_fontWeight === void 0 ? textWeight : _options_fontWeight, _options_fontStyle = options.fontStyle, fontStyle = _options_fontStyle === void 0 ? richStyle : _options_fontStyle;
556
617
  var textSize = fontSize;
557
618
  if (overflow === EFFECTS.spec.TextOverflow.display) {
558
619
  if (width > canvasWidth1) {
@@ -562,7 +623,11 @@ exports.RichTextComponent = /*#__PURE__*/ function(TextComponent) {
562
623
  var strOffsetX = offset[index] + x;
563
624
  context.font = fontStyle + " " + fontWeight + " " + textSize * fontScale + "px " + fontFamily;
564
625
  context.fillStyle = "rgba(" + fontColor[0] + ", " + fontColor[1] + ", " + fontColor[2] + ", " + fontColor[3] + ")";
565
- context.fillText(text, strOffsetX, charsLineHeight);
626
+ // 遍历当前行的 chars 逐字绘制
627
+ var charArr = charInfo.chars[index]; // 只取当前片段的字符数组
628
+ charArr.forEach(function(charDetail) {
629
+ context.fillText(charDetail.char, strOffsetX + charDetail.x, charsLineHeight);
630
+ });
566
631
  });
567
632
  });
568
633
  // 与 toDataURL() 两种方式都需要像素读取操作
@@ -642,7 +707,7 @@ exports.RichTextComponent = __decorate([
642
707
 
643
708
  /**
644
709
  * 插件版本号
645
- */ var version = "2.6.6";
710
+ */ var version = "2.7.0-alpha.0";
646
711
  EFFECTS.registerPlugin("rich-text", RichTextLoader, EFFECTS.VFXItem);
647
712
  EFFECTS.logger.info("Plugin rich text version: " + version + ".");
648
713
  if (version !== EFFECTS__namespace.version) {
@@ -650,9 +715,11 @@ if (version !== EFFECTS__namespace.version) {
650
715
  }
651
716
 
652
717
  exports.RichTextLoader = RichTextLoader;
718
+ exports.escape = escape;
653
719
  exports.generateProgram = generateProgram;
654
720
  exports.isRichText = isRichText;
655
721
  exports.lexer = lexer;
656
722
  exports.richTextParser = richTextParser;
723
+ exports.unescape = unescape;
657
724
  exports.version = version;
658
725
  //# sourceMappingURL=index.js.map