diff --git a/package.json b/package.json index fd38678..5943b96 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "license": "ISC", "dependencies": { "art-template": "^4.13.2", + "dayjs": "^1.10.8", "deepmerge": "^4.2.2", "glob": "^7.2.0", "gulp": "^4.0.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5fdc6cf..e39328a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,6 +4,7 @@ specifiers: '@babel/cli': ^7.17.6 '@babel/core': ^7.17.5 art-template: ^4.13.2 + dayjs: ^1.10.8 deepmerge: ^4.2.2 glob: ^7.2.0 gulp: ^4.0.2 @@ -15,6 +16,7 @@ specifiers: dependencies: art-template: 4.13.2 + dayjs: registry.npmmirror.com/dayjs/1.10.8 deepmerge: 4.2.2 glob: 7.2.0 gulp: 4.0.2 @@ -54,8 +56,8 @@ packages: slash: 2.0.0 source-map: 0.5.7 optionalDependencies: - '@nicolo-ribaudo/chokidar-2': 2.1.8-no-fsevents.3 - chokidar: 3.5.3 + '@nicolo-ribaudo/chokidar-2': registry.npmmirror.com/@nicolo-ribaudo/chokidar-2/2.1.8-no-fsevents.3 + chokidar: registry.npmmirror.com/chokidar/3.5.3 dev: true /@babel/code-frame/7.16.7: @@ -529,7 +531,7 @@ packages: dependencies: callsites: 3.1.0 graceful-fs: 4.2.9 - source-map: 0.6.1 + source-map: registry.npmmirror.com/source-map/0.6.1 dev: true /@jest/test-result/27.5.1: @@ -604,12 +606,6 @@ packages: '@jridgewell/sourcemap-codec': 1.4.11 dev: true - /@nicolo-ribaudo/chokidar-2/2.1.8-no-fsevents.3: - resolution: {integrity: sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==} - requiresBuild: true - dev: true - optional: true - /@sinonjs/commons/1.8.3: resolution: {integrity: sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==} dependencies: @@ -1063,14 +1059,6 @@ packages: dev: true optional: true - /bindings/1.5.0: - resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} - requiresBuild: true - dependencies: - file-uri-to-path: 1.0.0 - dev: false - optional: true - /brace-expansion/1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: @@ -1205,42 +1193,6 @@ packages: engines: {node: '>=10'} dev: true - /chokidar/2.1.8: - resolution: {integrity: sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==} - deprecated: Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies - dependencies: - anymatch: 2.0.0 - async-each: 1.0.3 - braces: 2.3.2 - glob-parent: 3.1.0 - inherits: 2.0.4 - is-binary-path: 1.0.1 - is-glob: 4.0.3 - normalize-path: 3.0.0 - path-is-absolute: 1.0.1 - readdirp: 2.2.1 - upath: 1.2.0 - optionalDependencies: - fsevents: 1.2.13 - dev: false - - /chokidar/3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - requiresBuild: true - dependencies: - anymatch: 3.1.2 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.2 - dev: true - optional: true - /ci-info/3.3.0: resolution: {integrity: sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==} dev: true @@ -1263,7 +1215,7 @@ packages: resolution: {integrity: sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==} engines: {node: '>= 4.0'} dependencies: - source-map: 0.6.1 + source-map: registry.npmmirror.com/source-map/0.6.1 dev: false /cliui/3.2.0: @@ -1662,7 +1614,7 @@ packages: esutils: 2.0.3 optionator: 0.8.3 optionalDependencies: - source-map: 0.6.1 + source-map: registry.npmmirror.com/source-map/0.6.1 dev: false /escodegen/2.0.0: @@ -1675,7 +1627,7 @@ packages: esutils: 2.0.3 optionator: 0.8.3 optionalDependencies: - source-map: 0.6.1 + source-map: registry.npmmirror.com/source-map/0.6.1 dev: true /esprima/4.0.1: @@ -1813,12 +1765,6 @@ packages: bser: 2.1.1 dev: true - /file-uri-to-path/1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - requiresBuild: true - dev: false - optional: true - /fill-range/4.0.0: resolution: {integrity: sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=} engines: {node: '>=0.10.0'} @@ -1938,26 +1884,6 @@ packages: /fs.realpath/1.0.0: resolution: {integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8=} - /fsevents/1.2.13: - resolution: {integrity: sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==} - engines: {node: '>= 4.0'} - os: [darwin] - deprecated: fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2. - requiresBuild: true - dependencies: - bindings: 1.5.0 - nan: 2.15.0 - dev: false - optional: true - - /fsevents/2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: true - optional: true - /function-bind/1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} @@ -2035,7 +1961,7 @@ packages: dependencies: anymatch: 2.0.0 async-done: 1.3.2 - chokidar: 2.1.8 + chokidar: registry.npmmirror.com/chokidar/2.1.8 is-negated-glob: 1.0.0 just-debounce: 1.1.0 normalize-path: 3.0.0 @@ -2551,7 +2477,7 @@ packages: dependencies: debug: 4.3.3 istanbul-lib-coverage: 3.2.0 - source-map: 0.6.1 + source-map: registry.npmmirror.com/source-map/0.6.1 transitivePeerDependencies: - supports-color dev: true @@ -2750,7 +2676,7 @@ packages: micromatch: 4.0.4 walker: 1.0.8 optionalDependencies: - fsevents: 2.3.2 + fsevents: registry.npmmirror.com/fsevents/2.3.2 dev: true /jest-jasmine2/27.5.1: @@ -3378,12 +3304,6 @@ packages: engines: {node: '>= 0.10'} dev: false - /nan/2.15.0: - resolution: {integrity: sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==} - requiresBuild: true - dev: false - optional: true - /nanomatch/1.2.13: resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} engines: {node: '>=0.10.0'} @@ -4089,7 +4009,7 @@ packages: define-property: 0.2.5 extend-shallow: 2.0.1 map-cache: 0.2.2 - source-map: 0.5.7 + source-map: registry.npmmirror.com/source-map/0.5.7 source-map-resolve: 0.5.3 use: 3.1.1 dev: false @@ -4109,7 +4029,7 @@ packages: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} dependencies: buffer-from: 1.1.2 - source-map: 0.6.1 + source-map: registry.npmmirror.com/source-map/0.6.1 dev: true /source-map-url/0.4.1: @@ -4125,11 +4045,6 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} - /source-map/0.7.3: - resolution: {integrity: sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==} - engines: {node: '>= 8'} - dev: true - /sparkles/1.0.1: resolution: {integrity: sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==} engines: {node: '>= 0.10'} @@ -4464,7 +4379,7 @@ packages: hasBin: true dependencies: commander: 2.19.0 - source-map: 0.6.1 + source-map: registry.npmmirror.com/source-map/0.6.1 dev: false /unc-path-regex/0.1.2: @@ -4551,7 +4466,7 @@ packages: dependencies: '@types/istanbul-lib-coverage': 2.0.4 convert-source-map: 1.8.0 - source-map: 0.7.3 + source-map: registry.npmmirror.com/source-map/0.7.3 dev: true /v8flags/3.2.0: @@ -4812,12 +4727,70 @@ packages: regenerator-runtime: registry.npmmirror.com/regenerator-runtime/0.13.9 dev: false + registry.npmmirror.com/@nicolo-ribaudo/chokidar-2/2.1.8-no-fsevents.3: + resolution: {integrity: sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz} + name: '@nicolo-ribaudo/chokidar-2' + version: 2.1.8-no-fsevents.3 + requiresBuild: true + dev: true + optional: true + registry.npmmirror.com/ansicolor/1.1.100: resolution: {integrity: sha512-Jl0pxRfa9WaQVUX57AB8/V2my6FJxrOR1Pp2qqFbig20QB4HzUoQ48THTKAgHlUCJeQm/s2WoOPcoIDhyCL/kw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ansicolor/-/ansicolor-1.1.100.tgz} name: ansicolor version: 1.1.100 dev: false + registry.npmmirror.com/bindings/1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/bindings/-/bindings-1.5.0.tgz} + name: bindings + version: 1.5.0 + requiresBuild: true + dependencies: + file-uri-to-path: registry.npmmirror.com/file-uri-to-path/1.0.0 + dev: false + optional: true + + registry.npmmirror.com/chokidar/2.1.8: + resolution: {integrity: sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/chokidar/-/chokidar-2.1.8.tgz} + name: chokidar + version: 2.1.8 + deprecated: Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies + dependencies: + anymatch: 2.0.0 + async-each: 1.0.3 + braces: 2.3.2 + glob-parent: 3.1.0 + inherits: 2.0.4 + is-binary-path: 1.0.1 + is-glob: 4.0.3 + normalize-path: 3.0.0 + path-is-absolute: 1.0.1 + readdirp: 2.2.1 + upath: 1.2.0 + optionalDependencies: + fsevents: registry.npmmirror.com/fsevents/1.2.13 + dev: false + + registry.npmmirror.com/chokidar/3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz} + name: chokidar + version: 3.5.3 + engines: {node: '>= 8.10.0'} + requiresBuild: true + dependencies: + anymatch: 3.1.2 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: registry.npmmirror.com/fsevents/2.3.2 + dev: true + optional: true + registry.npmmirror.com/core-js-pure/3.21.1: resolution: {integrity: sha512-12VZfFIu+wyVbBebyHmRTuEE/tZrB4tJToWcwAMcsp3h4+sHR+fMJWbKpYiCRWlhFBq+KNyO8rIV9rTkeVmznQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/core-js-pure/-/core-js-pure-3.21.1.tgz} name: core-js-pure @@ -4832,6 +4805,12 @@ packages: requiresBuild: true dev: false + registry.npmmirror.com/dayjs/1.10.8: + resolution: {integrity: sha512-wbNwDfBHHur9UOzNUjeKUOJ0fCb0a52Wx0xInmQ7Y8FstyajiV1NmK1e00cxsr9YrE9r7yAChE0VvpuY5Rnlow==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/dayjs/-/dayjs-1.10.8.tgz} + name: dayjs + version: 1.10.8 + dev: false + registry.npmmirror.com/deepmerge/4.2.2: resolution: {integrity: sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/deepmerge/-/deepmerge-4.2.2.tgz} name: deepmerge @@ -4839,12 +4818,52 @@ packages: engines: {node: '>=0.10.0'} dev: false + registry.npmmirror.com/file-uri-to-path/1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz} + name: file-uri-to-path + version: 1.0.0 + requiresBuild: true + dev: false + optional: true + + registry.npmmirror.com/fsevents/1.2.13: + resolution: {integrity: sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fsevents/-/fsevents-1.2.13.tgz} + name: fsevents + version: 1.2.13 + engines: {node: '>= 4.0'} + os: [darwin] + deprecated: fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2. + requiresBuild: true + dependencies: + bindings: registry.npmmirror.com/bindings/1.5.0 + nan: registry.npmmirror.com/nan/2.15.0 + dev: false + optional: true + + registry.npmmirror.com/fsevents/2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz} + name: fsevents + version: 2.3.2 + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + registry.npmmirror.com/jju/1.4.0: resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/jju/-/jju-1.4.0.tgz} name: jju version: 1.4.0 dev: false + registry.npmmirror.com/nan/2.15.0: + resolution: {integrity: sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/nan/-/nan-2.15.0.tgz} + name: nan + version: 2.15.0 + requiresBuild: true + dev: false + optional: true + registry.npmmirror.com/readjson/2.2.2: resolution: {integrity: sha512-PdeC9tsmLWBiL8vMhJvocq+OezQ3HhsH2HrN7YkhfYcTjQSa/iraB15A7Qvt7Xpr0Yd2rDNt6GbFwVQDg3HcAw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/readjson/-/readjson-2.2.2.tgz} name: readjson @@ -4861,6 +4880,26 @@ packages: version: 0.13.9 dev: false + registry.npmmirror.com/source-map/0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/source-map/-/source-map-0.5.7.tgz} + name: source-map + version: 0.5.7 + engines: {node: '>=0.10.0'} + dev: false + + registry.npmmirror.com/source-map/0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz} + name: source-map + version: 0.6.1 + engines: {node: '>=0.10.0'} + + registry.npmmirror.com/source-map/0.7.3: + resolution: {integrity: sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/source-map/-/source-map-0.7.3.tgz} + name: source-map + version: 0.7.3 + engines: {node: '>= 8'} + dev: true + registry.npmmirror.com/try-catch/3.0.0: resolution: {integrity: sha512-3uAqUnoemzca1ENvZ72EVimR+E8lqBbzwZ9v4CEbLjkaV3Q+FtdmPUt7jRtoSoTiYjyIMxEkf6YgUpe/voJ1ng==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/try-catch/-/try-catch-3.0.0.tgz} name: try-catch diff --git a/src/formatters.js b/src/formatters.js index 92777b3..7c66104 100644 --- a/src/formatters.js +++ b/src/formatters.js @@ -13,12 +13,14 @@ * * */ -export default { +const dayjs = require("dayjs"); + +module.exports = { cn:{ Date:{ - default:(value)=>dayjs(value).format("YYYY年MM年DD日"), // 默认的变量格式化器 + default:(value)=>dayjs(value).format("YYYY年MM年DD日"), // 默认的格式化器 time:(value)=>dayjs(value).format("HH:mm:ss"), - short:(value)=>dayjs(value).format("YYYY/MM/DD"), + date:(value)=>dayjs(value).format("YYYY/MM/DD") }, Number:{ diff --git a/src/index.js b/src/index.js index 999eb80..95271d2 100644 --- a/src/index.js +++ b/src/index.js @@ -1,4 +1,5 @@ -import deepMerge from "deepmerge" +const deepMerge = require("deepmerge") +const formatters = require("./formatters") // 用来提取字符里面的插值变量参数 , 支持管道符 { var | formatter | formatter } @@ -46,18 +47,21 @@ function getDataTypeName(v){ * @param {*} str * @returns {Array} [[变量名称,[]],[变量名称,[formatter,formatter,...]],...] */ -function getInterpolatedVars(str){ - let result = [] +module.exports.getInterpolatedVars = function(str){ + let results = [] let match while ((match = varWidthPipeRegexp.exec(str)) !== null) { if (match.index === varWidthPipeRegexp.lastIndex) { varWidthPipeRegexp.lastIndex++; } - if(match.groups.varname) { - result.push(match.groups.formatters ? [match.groups.varname,match.groups.formatters.trim().split("|")] : [match.groups.varname,[]]) + const varname = match.groups.varname + const formatters = match.groups.formatters ? match.groups.formatters.trim().substr(1).trim().split("|").map(r=>r.trim()) : [] + if(varname) { + const varDefine = formatters ? [varname,formatters] : [varname,[]] + if(results.findIndex(item=>item[0]===varDefine[0] && item[1].join()===varDefine[1].join()) === -1) results.push(varDefine) } } - return result + return results } /** * 将要翻译内容提供了一个非文本内容时进行默认的转换 @@ -97,31 +101,39 @@ function transformVarValue(value){ * @param {*} template * @returns */ -function replaceInterpolateVars(template,...args) { +module.exports.replaceInterpolateVars = function(template,...args) { const scope = this + const activeLanguage = scope.activeLanguage let result=template if(!hasInterpolation(template)) return template - - if(args.length===1 && typeof(args[0]) === "object" && !Array.isArray(args[0])){ // 变量插值 - // 取得里面的插值变量 - let varNames = getInterpolatedVars(template) + // 变量插值 + if(args.length===1 && typeof(args[0]) === "object" && !Array.isArray(args[0])){ + // 格式化器只能用在字典变量中 + // {var1:[formatter,formatter,...],var2:[formatter,formatter,...],...} + let varNames = getInterpolatedVars(template) let varValues = args[0] if(varNames.length===0) return template for(let [name,formatters] of varNames){ // 计算出变量值 let value = (name in varValues) ? varValues[name] : '' - if(formatters.length >0 ){ + // 针对每种数据类型的默认格式化器 + let dataType= getDataTypeName(value) + if(dataType in scope.formatters[activeLanguage]){ + const formatter = scope.formatters[activeLanguage][dataType] + formatters.splice(0,0,formatter) + } + if(formatters.length > 0 ){ formatters.reduce((v,formatter)=>{ if(formatter in scope.formatters){ return scope.formatters[formatter](v) }else{ return v } - },"") - } + },value) + } // 如果变量中包括|管道符,则需要进行转换以适配更宽松的写法,比如data|time能匹配"data |time","data | time"等 - let nameRegexp = name.includes("|") ? name.split("|").join("\\s*\\|\\s*") : name - result=result.replaceAll(new RegExp(varReplaceRegexp.replaceAll("{varname}",nameRegexp),"g"),transformVarValue(args[0][name])) + let nameRegexp =new RegExp(`${name}\\s*\\|\\s*${formatters.join("\\s*\\|\\s*")}`,"g") + result=result.replaceAll(nameRegexp,"gm"),transformVarValue(value)) } }else{ // 位置插值 const params=(args.length===1 && Array.isArray(args[0])) ? [...args[0]] : args @@ -138,13 +150,14 @@ function replaceInterpolateVars(template,...args) { } // 默认语言配置 -export const defaultLanguageSettings = { +module.exports.defaultLanguageSettings = { defaultLanguage: "cn", activeLanguage: "cn", languages:{ cn:{name:"cn",title:"中文",default:true}, en:{name:"en",title:"英文"}, - } + }, + formatters } function isMessageId(content){ @@ -165,7 +178,7 @@ function isMessageId(content){ * this===scope 当前绑定的scope * */ -export function translate(message) { +module.exports.translate = function(message) { const scope = this const activeLanguage = scope.settings.activeLanguage let vars={} // 插值变量 @@ -175,7 +188,11 @@ export function translate(message) { Object.assign(vars,arguments[1]) Object.entries(vars).forEach(([key,value])=>{ if(typeof(value)==="function"){ - vars[key] =try{value()}catch(e){value} + try{ + vars[key] = value() + }catch(e){ + vars[key] = value + } } if(key.startsWith("$")) pluralVars.push(key) // 复数变量 }) @@ -226,7 +243,7 @@ export function translate(message) { * VoerkaI18n.off("change",(language)=>{}) * * */ -export class I18n{ + module.exports.i18n = class I18n{ static instance = null; // 单例引用 callbacks = [] // 当切换语言时的回调事件 constructor(settings={}){ diff --git a/test/compile.test.js b/test/compile.test.js index e69de29..f185170 100644 --- a/test/compile.test.js +++ b/test/compile.test.js @@ -0,0 +1,31 @@ +const { getInterpolatedVars, replaceInterpolateVars} = require('../src/index.js') + + +test("获取表达式中的插值变量",done=>{ + const results = getInterpolatedVars("中华人民共和国成立于{date | year | time }年,首都是{city}市"); + expect(results.map(r=>r[0]).join(",")).toBe("date,city"); + expect(results[0][0]).toEqual("date"); + expect(results[0][1]).toEqual(["year","time"]); + expect(results[1][0]).toEqual("city"); + expect(results[1][1]).toEqual([]); + done() +}) +test("表达式中定义了重复的插值变量",done=>{ + const results = getInterpolatedVars("{a}{a}{a|x}{a|x}{a|x|y}{a|x|y}"); + expect(results.length).toEqual(3); + expect(results[0][0]).toEqual("a"); + expect(results[0][1]).toEqual([]); + expect(results[1][0]).toEqual("a"); + expect(results[1][1]).toEqual(["x"]); + expect(results[2][0]).toEqual("a"); + expect(results[2][1]).toEqual(["x","y"]); + done() +}) +// test("替代表达式中的插值变量",done=>{ +// const results = replaceInterpolateVars("中华人民共和国成立于{date}年,首都是{city}市",{ +// date:1949, +// city:"北京" +// }); +// expect(results).toBe("中华人民共和国成立于1949年,首都是北京市"); +// done() +// } \ No newline at end of file diff --git a/test/extract.test.js b/test/extract.test.js index c34f402..63e3155 100644 --- a/test/extract.test.js +++ b/test/extract.test.js @@ -33,7 +33,6 @@ test("启用名称空间后扫描提取翻译文本",(done)=>{ "core":"a/b", // 名称空间 } })) - expect("core" in texts).toBeFalsy() expect("core" in texts).toBeTruthy() expect(Object.keys(texts.core).join()).toBe("a,b,c,d") Object.entries(texts.core).forEach(([text,langs])=>{ diff --git a/test/translate.test.js b/test/translate.test.js index 9728cf8..7e4f175 100644 --- a/test/translate.test.js +++ b/test/translate.test.js @@ -3,16 +3,16 @@ import { translate } from "../src/index.js" test("默认语言翻译",done=>{ - + done() }) test("启用位置插值变量翻译",done=>{ - + done() }) test("启用字典插值变量翻译",done=>{ - + done() }) \ No newline at end of file