diff --git a/packages/runtime/formatter.js b/packages/runtime/formatter.js index ed2132e..de6b6b4 100644 --- a/packages/runtime/formatter.js +++ b/packages/runtime/formatter.js @@ -165,6 +165,7 @@ function getNestingParamsRegex(...tags){ // const formatterParamsRegex = /((([\'\"])(.*?)\3)|(\{.*?\})|(\[.*?\])|([\d]+\.?[\d]?)|((true|false|null)(?=[,\b\s]))|([\w\.]+)|((?<=,)\s*(?=,)))(?<=\s*[,\)]?\s*)/g; // 支持解析嵌套的{}和[]参数, 前提是:字符串需要经addTagHelperFlags操作后,会在{}[]等位置添加辅助字符 +// 解析嵌套的{}和[]参数基本原理:在{}[]等位置添加辅助字符,然后使用正则表达式匹配,匹配到的字符串中包含辅助字符,然后再去除辅助字符 const formatterNestingParamsRegex = String.raw`((([\'\"])(.*?)\3))|__TAG_REGEXP__([\d]+\.?[\d]?)|((true|false|null)(?=[,\b\s]))|([\w\.]+)|((?<=,)\s*(?=,))(?<=\s*[,\)]?\s*)` /** diff --git a/packages/runtime/interpolate.js b/packages/runtime/interpolate.js index 3107eda..50ce48f 100644 --- a/packages/runtime/interpolate.js +++ b/packages/runtime/interpolate.js @@ -33,7 +33,10 @@ const { parseFormatters } = require("./formatter") // 用来提取字符里面的插值变量参数 , 支持管道符 { var | formatter | formatter } // 支持参数: { var | formatter(x,x,..) | formatter } -let varWithPipeRegexp = /\{\s*(?\w+)?(?(\s*\|\s*\w*(\(.*\)){0,1}\s*)*)\s*\}/g; +// v1 采用命名捕获组 +//let varWithPipeRegexp = /\{\s*(?\w+)?(?(\s*\|\s*\w*(\(.*\)){0,1}\s*)*)\s*\}/g; +// v2: 由于一些js引擎(如react-native Hermes )不支持命名捕获组而导致运行时不能使用,所以此处移除命名捕获组 +let varWithPipeRegexp = /\{\s*(\w+)?((\s*\|\s*\w*(\(.*\)){0,1}\s*)*)\s*\}/g; /** * 考虑到通过正则表达式进行插值的替换可能较慢 @@ -102,9 +105,9 @@ function forEachInterpolatedVars(str, replacer, options = {}) { let opts = Object.assign({replaceAll: true },options); varWithPipeRegexp.lastIndex = 0; while ((matched = varWithPipeRegexp.exec(result)) !== null) { - const varname = matched.groups.varname || ""; + const varname = matched[1] || ""; // 解析格式化器和参数 = [,[,[,,...]]] - const formatters = parseFormatters(matched.groups.formatters); + const formatters = parseFormatters(matched[2] || ""); if (isFunction(replacer)) { try { const finalValue = replacer(varname, formatters, matched[0]); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f6859c8..bae94ea 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -301,10 +301,12 @@ importers: fs-extra: ^10.0.1 semver: ^7.3.7 shelljs: ^0.8.5 + string.prototype.replaceall: ^1.0.7 dependencies: fs-extra: 10.1.0 semver: 7.3.8 shelljs: 0.8.5 + string.prototype.replaceall: 1.0.7 packages/vite: specifiers: @@ -8882,13 +8884,6 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - /get-intrinsic/1.1.2: - resolution: {integrity: sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==} - dependencies: - function-bind: 1.1.1 - has: 1.0.3 - has-symbols: 1.0.3 - /get-intrinsic/1.2.0: resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==} dependencies: @@ -12224,15 +12219,6 @@ packages: dependencies: isobject: 3.0.1 - /object.assign/4.1.2: - resolution: {integrity: sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - has-symbols: 1.0.3 - object-keys: 1.1.1 - /object.assign/4.1.4: resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} engines: {node: '>= 0.4'} @@ -15472,7 +15458,7 @@ packages: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: call-bind: 1.0.2 - get-intrinsic: 1.1.2 + get-intrinsic: 1.2.0 object-inspect: 1.12.2 /signal-exit/3.0.7: @@ -16936,7 +16922,7 @@ packages: is-valid-glob: 1.0.0 lazystream: 1.0.1 lead: 1.0.0 - object.assign: 4.1.2 + object.assign: 4.1.4 pumpify: 1.5.1 readable-stream: 2.3.7 remove-bom-buffer: 3.0.0