From 3c3f5dae583cf7d600256dab6303f72bdb7a67b6 Mon Sep 17 00:00:00 2001 From: kujirahand Date: Mon, 2 Dec 2024 16:05:20 +0900 Subject: [PATCH] =?UTF-8?q?ASC/CHR=E9=96=A2=E6=95=B0=E3=82=92=E9=85=8D?= =?UTF-8?q?=E5=88=97=E5=AF=BE=E5=BF=9C=E3=81=95=E3=81=9B=E3=82=8B=20#1853?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/src/plugin_system.mts | 42 ++++++++++++++++++++++++++------ core/test/plugin_system_test.mjs | 6 +++++ 2 files changed, 40 insertions(+), 8 deletions(-) diff --git a/core/src/plugin_system.mts b/core/src/plugin_system.mts index 9a24b398..5d747312 100644 --- a/core/src/plugin_system.mts +++ b/core/src/plugin_system.mts @@ -1007,22 +1007,38 @@ export default { return String(s).indexOf(a) + 1 } }, - 'CHR': { // @文字コードから文字を返す // @CHR + 'CHR': { // @文字コードV(あるいは文字列配列)から文字を返す // @CHR type: 'func', josi: [['の']], pure: true, - fn: function (v: any) { - if (!String.fromCodePoint) { return String.fromCharCode(v) } - return String.fromCodePoint(v) + fn: function (v: number|number[]): string|string[] { + if (typeof v === 'number') { + if (!String.fromCodePoint) { return String.fromCharCode(v) } + return String.fromCodePoint(v) + } + const res: string[] = [] + for (const s of v) { + if (!String.fromCodePoint) { res.push(String.fromCharCode(s)) } + res.push(String.fromCodePoint(s)) + } + return res } }, - 'ASC': { // @文字列Vの最初の文字の文字コードを返す // @ASC + 'ASC': { // @文字列V(あるいは文字列配列)の最初の文字の文字コードを返す // @ASC type: 'func', josi: [['の']], pure: true, - fn: function (v: any) { - if (!String.prototype.codePointAt) { return String(v).charCodeAt(0) } - return String(v).codePointAt(0) + fn: function (v: string|string[]): number|number[] { + if (typeof v === 'string') { + if (!String.prototype.codePointAt) { return String(v).charCodeAt(0) } + return String(v).codePointAt(0) || 0 + } + const res: number[] = [] + for (const s of v) { + if (!String.prototype.codePointAt) { res.push(String(s).charCodeAt(0)) } + res.push(String(s).codePointAt(0) || 0) + } + return res } }, '文字挿入': { // @文字列SのI文字目に文字列Aを挿入する // @もじそうにゅう @@ -1627,6 +1643,16 @@ export default { return a2.join('' + s) } }, + '配列只結合': { // @配列Aの要素をただ結合して文字列で返す。(「」で配列結合と同じ) // @はいれつただけつごう + type: 'func', + josi: [['を']], + pure: true, + fn: function (a: any): string { + if (a instanceof Array) { return a.join('') } + const a2 = String(a).split('\n') // 配列でなければ無理矢理改行で区切ってみる + return a2.join('') + } + }, '配列検索': { // @配列Aから文字列Sを探してインデックス番号(0起点)を返す。見つからなければ-1を返す。 // @はいれつけんさく type: 'func', josi: [['の', 'から'], ['を']], diff --git a/core/test/plugin_system_test.mjs b/core/test/plugin_system_test.mjs index 7f3dc250..d2ecc272 100644 --- a/core/test/plugin_system_test.mjs +++ b/core/test/plugin_system_test.mjs @@ -698,4 +698,10 @@ describe('plugin_system_test', async () => { await cmp('??1+2*3', '7') await cmp('??(1+2)*3', '9') }) + it('ASC/CHRの配列 #1853', async () => { + await cmp('["a","b","c"]のASCをJSON_Eして表示', '[97,98,99]') // 配列なら全ての文字のASC + await cmp('「abc」のASCをJSON_Eして表示', '97') // 文字列なら最初の文字のみ + await cmp('[97,98,99]のCHRを「」で配列結合して表示', 'abc') // 配列なら全てのCHR + await cmp('97のCHRを表示', 'a') // 数値 + }) })