nadesiko3 3.7.21 → 3.7.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/batch/command.txt +370 -334
- package/batch/jsplugin2text.nako3 +1 -1
- package/batch/pickup_command.nako3 +12 -0
- package/core/command/snako.mts +5 -1
- package/core/deno/snako.ts +5 -1
- package/core/package-lock.json +382 -21
- package/core/package.json +4 -4
- package/core/src/nako3.mts +178 -614
- package/core/src/nako_basic_plugins.mts +39 -0
- package/core/src/nako_core_version.mts +2 -2
- package/core/src/nako_csv.mts +0 -1
- package/core/src/nako_event.mts +49 -0
- package/core/src/nako_gen.mts +291 -202
- package/core/src/nako_indent_inline.mts +2 -2
- package/core/src/nako_lex_rules.mts +1 -1
- package/core/src/nako_parser3.mts +106 -165
- package/core/src/nako_parser_async.mts +97 -0
- package/core/src/nako_parser_base.mts +4 -55
- package/core/src/nako_parser_message.mts +105 -0
- package/core/src/nako_parser_operator.mts +93 -0
- package/core/src/nako_plugin_manager.mts +260 -0
- package/core/src/nako_require.mts +292 -0
- package/core/src/nako_runner.mts +191 -0
- package/core/src/nako_tokenizer.mts +221 -0
- package/core/src/plugin_csv.mts +1 -1
- package/core/src/plugin_system.mts +34 -3259
- package/core/src/plugin_system_array.mts +699 -0
- package/core/src/plugin_system_datetime.mts +368 -0
- package/core/src/plugin_system_debug.mts +403 -0
- package/core/src/plugin_system_dict.mts +85 -0
- package/core/src/plugin_system_json.mts +73 -0
- package/core/src/plugin_system_math.mts +383 -0
- package/core/src/plugin_system_regexp.mts +120 -0
- package/core/src/plugin_system_stdio.mts +86 -0
- package/core/src/plugin_system_string.mts +666 -0
- package/core/src/plugin_system_timer.mts +152 -0
- package/core/src/plugin_system_types.mts +151 -0
- package/core/src/plugin_system_url.mts +193 -0
- package/core/src/plugin_toml.mts +3 -3
- package/core/test/fixtures/README.md +39 -0
- package/core/test/fixtures/make_parser_ast_golden.mjs +31 -0
- package/core/test/fixtures/parser_ast_golden.json +8027 -0
- package/core/test/fixtures/parser_corpus.mjs +120 -0
- package/core/test/indent_test.mjs +6 -0
- package/core/test/nako_basic_plugins_test.mjs +44 -0
- package/core/test/nako_event_test.mjs +85 -0
- package/core/test/nako_gen_perf_test.mjs +178 -0
- package/core/test/nako_parser_async_test.mjs +112 -0
- package/core/test/nako_parser_test.mjs +160 -0
- package/core/test/nako_plugin_manager_test.mjs +185 -0
- package/core/test/nako_require_test.mjs +153 -0
- package/core/test/nako_runner_test.mjs +114 -0
- package/core/test/nako_tokenizer_test.mjs +115 -0
- package/core/test/plugin_system_debug_test.mjs +141 -0
- package/core/test/plugin_system_split_test.mjs +179 -0
- package/core/test/plugin_system_test.mjs +6 -0
- package/core/tsconfig.json +0 -1
- package/package.json +17 -21
- package/release/_hash.txt +36 -36
- package/release/_script-tags.txt +16 -16
- package/release/command.json +1 -1
- package/release/command.json.js +1 -1
- package/release/command_cnako3.json +1 -1
- package/release/command_list.json +1 -1
- package/release/edit_main.js +6 -6
- package/release/edit_main.js.map +3 -3
- package/release/editor.js +6 -6
- package/release/plugin_keigo.js.map +3 -3
- package/release/plugin_markup.js +46 -46
- package/release/plugin_markup.js.map +3 -3
- package/release/plugin_weykturtle3d.js +1 -1
- package/release/plugin_weykturtle3d.js.map +3 -3
- package/release/version.js +2 -2
- package/release/version_main.js +2 -2
- package/release/version_main.js.map +1 -1
- package/release/wnako3.js +186 -213
- package/release/wnako3.js.map +4 -4
- package/release/wnako3webworker.js +172 -199
- package/release/wnako3webworker.js.map +4 -4
- package/src/cnako3mod.mjs +7 -2
- package/src/cnako3mod.mts +7 -2
- package/src/nako_version.mjs +2 -2
- package/src/nako_version.mts +2 -2
- package/src/plugin_browser_ajax.mjs +4 -4
- package/src/plugin_browser_ajax.mts +4 -4
- package/src/plugin_browser_audio.mjs +10 -10
- package/src/plugin_browser_audio.mts +10 -10
- package/src/plugin_browser_camera.mjs +4 -4
- package/src/plugin_browser_camera.mts +4 -4
- package/src/plugin_browser_canvas.mjs +2 -2
- package/src/plugin_browser_canvas.mts +2 -2
- package/src/plugin_browser_crypto.mjs +3 -3
- package/src/plugin_browser_crypto.mts +3 -3
- package/src/plugin_browser_dom_event.mjs +1 -1
- package/src/plugin_browser_dom_event.mts +1 -1
- package/src/plugin_browser_geolocation.mjs +1 -1
- package/src/plugin_browser_geolocation.mts +1 -1
- package/src/plugin_browser_hotkey.mjs +1 -1
- package/src/plugin_browser_hotkey.mts +1 -1
- package/src/plugin_browser_html.mjs +1 -1
- package/src/plugin_browser_html.mts +1 -1
- package/src/plugin_browser_location.mjs +1 -1
- package/src/plugin_browser_location.mts +1 -1
- package/src/plugin_browser_speech.mjs +1 -1
- package/src/plugin_browser_speech.mts +1 -1
- package/src/plugin_browser_storage.mjs +2 -2
- package/src/plugin_browser_storage.mts +2 -2
- package/src/plugin_httpserver.mjs +3 -3
- package/src/plugin_httpserver.mts +3 -3
- package/src/plugin_keigo.mjs +2 -2
- package/src/plugin_keigo.mts +2 -2
- package/src/plugin_node.mjs +48 -48
- package/src/plugin_node.mts +53 -53
- package/src/plugin_weykturtle3d.mjs +56 -56
- package/src/plugin_weykturtle3d.mts +56 -56
- package/src/wnako3.mjs +1 -1
- package/src/wnako3.mts +1 -1
- package/src/wnako3_editor.mjs +5 -5
- package/src/wnako3_editor.mts +5 -5
- package/src/wnako3mod.mjs +2 -2
- package/src/wnako3mod.mts +2 -2
- package/core/src/nako3.mjs +0 -1021
- package/core/src/nako_ast.mjs +0 -4
- package/core/src/nako_colors.mjs +0 -77
- package/core/src/nako_core_version.mjs +0 -8
- package/core/src/nako_csv.mjs +0 -193
- package/core/src/nako_errors.mjs +0 -166
- package/core/src/nako_from_dncl.mjs +0 -285
- package/core/src/nako_from_dncl2.mjs +0 -347
- package/core/src/nako_gen.mjs +0 -2500
- package/core/src/nako_global.mjs +0 -138
- package/core/src/nako_indent.mjs +0 -442
- package/core/src/nako_indent_chars.mjs +0 -29
- package/core/src/nako_indent_inline.mjs +0 -361
- package/core/src/nako_josi_list.mjs +0 -47
- package/core/src/nako_lex_rules.mjs +0 -319
- package/core/src/nako_lexer.mjs +0 -794
- package/core/src/nako_logger.mjs +0 -221
- package/core/src/nako_parser3.mjs +0 -3250
- package/core/src/nako_parser_base.mjs +0 -403
- package/core/src/nako_parser_const.mjs +0 -37
- package/core/src/nako_prepare.mjs +0 -329
- package/core/src/nako_reserved_words.mjs +0 -42
- package/core/src/nako_source_mapping.mjs +0 -207
- package/core/src/nako_test.mjs +0 -37
- package/core/src/nako_token.mjs +0 -1
- package/core/src/nako_tools.mjs +0 -53
- package/core/src/nako_types.mjs +0 -14
- package/core/src/plugin_api.mjs +0 -4
- package/core/src/plugin_csv.mjs +0 -97
- package/core/src/plugin_math.mjs +0 -352
- package/core/src/plugin_promise.mjs +0 -102
- package/core/src/plugin_system.mjs +0 -3810
- package/core/src/plugin_test.mjs +0 -52
- package/core/src/plugin_toml.mjs +0 -39
|
@@ -1,3810 +0,0 @@
|
|
|
1
|
-
import { NakoRuntimeError } from './nako_errors.mjs';
|
|
2
|
-
export default {
|
|
3
|
-
'meta': {
|
|
4
|
-
type: 'const',
|
|
5
|
-
value: {
|
|
6
|
-
pluginName: 'plugin_system', // プラグインの名前
|
|
7
|
-
description: 'システム関連の命令を提供するプラグイン', // プラグインの説明
|
|
8
|
-
pluginVersion: '3.6.0', // プラグインのバージョン
|
|
9
|
-
nakoRuntime: ['wnako', 'cnako', 'phpnako'], // 対象ランタイム
|
|
10
|
-
nakoVersion: '3.6.0' // 要求なでしこバージョン
|
|
11
|
-
}
|
|
12
|
-
},
|
|
13
|
-
'初期化': {
|
|
14
|
-
type: 'func',
|
|
15
|
-
josi: [],
|
|
16
|
-
pure: false,
|
|
17
|
-
fn: function (sys) {
|
|
18
|
-
// システム変数の初期化
|
|
19
|
-
const system = sys;
|
|
20
|
-
sys.pathSeparator = '/'; // パス記号 #2185
|
|
21
|
-
sys.engine = '?'; // エンジン名
|
|
22
|
-
sys.isDebug = false;
|
|
23
|
-
// システム変数にアクセスするための関数を定義
|
|
24
|
-
sys.__setSysVar = (name, value) => system.__v0.set(name, value);
|
|
25
|
-
sys.__getSysVar = (name, defaultValue = undefined) => {
|
|
26
|
-
const v = system.__v0.get(name);
|
|
27
|
-
if (v === undefined) {
|
|
28
|
-
return defaultValue;
|
|
29
|
-
}
|
|
30
|
-
return v;
|
|
31
|
-
};
|
|
32
|
-
sys.__setSore = (v) => { sys.__vars.set('それ', v); return v; };
|
|
33
|
-
sys.__getSore = () => sys.__vars.get('それ');
|
|
34
|
-
sys.tags = {}; // タグ - プラグイン側で自由に使えるオブジェクト
|
|
35
|
-
// 言語バージョンを設定
|
|
36
|
-
sys.__setSysVar('ナデシコバージョン', sys.version);
|
|
37
|
-
sys.__setSysVar('ナデシコ言語バージョン', sys.coreVersion);
|
|
38
|
-
if (!system.__namespaceList) {
|
|
39
|
-
system.__namespaceList = [];
|
|
40
|
-
}
|
|
41
|
-
// なでしこの関数や変数を探して返す
|
|
42
|
-
sys.__findVar = function (nameStr, def) {
|
|
43
|
-
if (typeof nameStr === 'function') {
|
|
44
|
-
return nameStr;
|
|
45
|
-
}
|
|
46
|
-
// ローカル変数を探す
|
|
47
|
-
const localVar = system.__locals.get(nameStr);
|
|
48
|
-
if (localVar) {
|
|
49
|
-
return localVar;
|
|
50
|
-
}
|
|
51
|
-
// 名前空間が指定されている場合
|
|
52
|
-
if (nameStr.indexOf('__') >= 0) {
|
|
53
|
-
for (let i = 2; i >= 0; i--) {
|
|
54
|
-
const varScope = system.__varslist[i];
|
|
55
|
-
const scopeValue = varScope.get(nameStr);
|
|
56
|
-
if (scopeValue) {
|
|
57
|
-
return scopeValue;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
return def;
|
|
61
|
-
}
|
|
62
|
-
// 名前空間を参照して関数・変数名を解決する
|
|
63
|
-
const modList = system.__modList ? system.__modList : [system.__modName];
|
|
64
|
-
for (const modName of modList) {
|
|
65
|
-
const gname = `${modName}__${nameStr}`;
|
|
66
|
-
for (let i = 2; i >= 0; i--) {
|
|
67
|
-
const scope = system.__varslist[i];
|
|
68
|
-
const scopeValue = scope.get(gname);
|
|
69
|
-
if (scopeValue) {
|
|
70
|
-
return scopeValue;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
return def;
|
|
75
|
-
};
|
|
76
|
-
// 文字列から関数を探す
|
|
77
|
-
sys.__findFunc = function (nameStr, parentFunc) {
|
|
78
|
-
const f = sys.__findVar(nameStr);
|
|
79
|
-
if (typeof f === 'function') {
|
|
80
|
-
return f;
|
|
81
|
-
}
|
|
82
|
-
throw new Error(`『${parentFunc}』に実行できない関数が指定されました。`);
|
|
83
|
-
};
|
|
84
|
-
// システム関数を実行
|
|
85
|
-
sys.__exec = function (func, params) {
|
|
86
|
-
// システム命令を優先
|
|
87
|
-
const f0 = sys.__getSysVar(func);
|
|
88
|
-
if (f0) {
|
|
89
|
-
return f0.apply(this, params);
|
|
90
|
-
}
|
|
91
|
-
// グローバル・ローカルを探す
|
|
92
|
-
const f = sys.__findVar(func);
|
|
93
|
-
if (!f) {
|
|
94
|
-
throw new Error('システム関数でエイリアスの指定ミス:' + func);
|
|
95
|
-
}
|
|
96
|
-
return f.apply(this, params);
|
|
97
|
-
};
|
|
98
|
-
// タイマーに関する処理(タイマーは「!クリア」で全部停止する)
|
|
99
|
-
sys.__timeout = [];
|
|
100
|
-
sys.__interval = [];
|
|
101
|
-
// 日付処理などに使う
|
|
102
|
-
const z2 = sys.__zero2 = (s) => {
|
|
103
|
-
s = '00' + String(s);
|
|
104
|
-
return s.substring(s.length - 2);
|
|
105
|
-
};
|
|
106
|
-
sys.__zero = (s, keta) => {
|
|
107
|
-
let zeroS = '';
|
|
108
|
-
for (let i = 0; i < keta; i++) {
|
|
109
|
-
zeroS += '0';
|
|
110
|
-
}
|
|
111
|
-
s = zeroS + s;
|
|
112
|
-
return s.substring(s.length - keta);
|
|
113
|
-
};
|
|
114
|
-
sys.__formatDate = (t) => {
|
|
115
|
-
return String(t.getFullYear()) + '/' + z2(t.getMonth() + 1) + '/' + z2(t.getDate());
|
|
116
|
-
};
|
|
117
|
-
sys.__formatTime = (t) => {
|
|
118
|
-
return z2(t.getHours()) + ':' + z2(t.getSeconds()) + ':' + z2(t.getMinutes());
|
|
119
|
-
};
|
|
120
|
-
sys.__formatDateTime = (t, fmt) => {
|
|
121
|
-
const dateStr = String(t.getFullYear()) + '/' + z2(t.getMonth() + 1) + '/' + z2(t.getDate());
|
|
122
|
-
const timeStr = z2(t.getHours()) + ':' + z2(t.getMinutes()) + ':' + z2(t.getSeconds());
|
|
123
|
-
if (fmt.match(/^\d+\/\d+\/\d+\s+\d+:\d+:\d+$/)) {
|
|
124
|
-
return dateStr + ' ' + timeStr;
|
|
125
|
-
}
|
|
126
|
-
if (fmt.match(/^\d+\/\d+\/\d+$/)) {
|
|
127
|
-
return dateStr;
|
|
128
|
-
}
|
|
129
|
-
if (fmt.match(/^\d+:\d+:\d+$/)) {
|
|
130
|
-
return timeStr;
|
|
131
|
-
}
|
|
132
|
-
return dateStr + ' ' + timeStr;
|
|
133
|
-
};
|
|
134
|
-
sys.__str2date = (s) => {
|
|
135
|
-
// trim
|
|
136
|
-
s = ('' + s).replace(/(^\s+|\s+$)/, '');
|
|
137
|
-
// is unix time
|
|
138
|
-
if (s.match(/^(\d+|\d+\.\d+)$/)) {
|
|
139
|
-
return new Date(parseFloat(s) * 1000);
|
|
140
|
-
}
|
|
141
|
-
// is time ?
|
|
142
|
-
if (s.match(/^\d+:\d+(:\d+)?$/)) {
|
|
143
|
-
const t = new Date();
|
|
144
|
-
const a = (s + ':0').split(':');
|
|
145
|
-
return new Date(t.getFullYear(), t.getMonth(), t.getDate(), parseInt(a[0]), parseInt(a[1]), parseInt(a[2]));
|
|
146
|
-
}
|
|
147
|
-
// replace splitter to '/'
|
|
148
|
-
s = s.replace(/[\s:\-T]/g, '/');
|
|
149
|
-
s += '/0/0/0'; // 日付だけのときのために時間分を足す
|
|
150
|
-
const a = s.split('/');
|
|
151
|
-
return new Date(parseInt(a[0]), parseInt(a[1]) - 1, parseInt(a[2]), parseInt(a[3]), parseInt(a[4]), parseInt(a[5]));
|
|
152
|
-
};
|
|
153
|
-
// 『継続表示』のための一時変数(『表示』実行で初期化)
|
|
154
|
-
sys.__printPool = '';
|
|
155
|
-
// 暗黙の型変換で足し算を行うときに使用。bigint はそのまま、その他は number に自動変換
|
|
156
|
-
sys.__parseFloatOrBigint = (v) => {
|
|
157
|
-
return (typeof v) === 'bigint' ? v : parseFloat(v);
|
|
158
|
-
};
|
|
159
|
-
// undefinedチェック
|
|
160
|
-
system.chk = (value, constId) => {
|
|
161
|
-
if (typeof value === 'undefined') {
|
|
162
|
-
const cp = system.constPools[constId];
|
|
163
|
-
const [msgNo, msgArgs, fileNo, lineNo] = cp;
|
|
164
|
-
let msg = system.constPoolsTemplate[msgNo];
|
|
165
|
-
for (const i in msgArgs) {
|
|
166
|
-
const arg = system.constPoolsTemplate[msgArgs[i]];
|
|
167
|
-
msg = msg.split(`$${i}`).join(arg);
|
|
168
|
-
}
|
|
169
|
-
const fileStr = system.constPoolsTemplate[fileNo];
|
|
170
|
-
sys.logger.warn(msg, { file: fileStr, line: lineNo });
|
|
171
|
-
}
|
|
172
|
-
return value;
|
|
173
|
-
};
|
|
174
|
-
// eval function #1733
|
|
175
|
-
sys.__evalSafe = (src) => {
|
|
176
|
-
// evalのスコープを変えるためのテクニック
|
|
177
|
-
// https://esbuild.github.io/content-types/#direct-eval
|
|
178
|
-
const _eval = eval;
|
|
179
|
-
try {
|
|
180
|
-
return _eval(src);
|
|
181
|
-
}
|
|
182
|
-
catch (e) {
|
|
183
|
-
console.warn('[eval]', e);
|
|
184
|
-
return null;
|
|
185
|
-
}
|
|
186
|
-
};
|
|
187
|
-
// eval function #1733 - 互換性を優先するため、direct evalを使うことに
|
|
188
|
-
sys.__evalJS = (src, sys) => {
|
|
189
|
-
try {
|
|
190
|
-
// まず従来通りevalで評価(式の値を返す互換性を維持)
|
|
191
|
-
return eval(src);
|
|
192
|
-
}
|
|
193
|
-
catch (e) {
|
|
194
|
-
// return文によるSyntaxErrorの場合のみIIFEで再試行 (#NE-006)
|
|
195
|
-
if (e instanceof SyntaxError && e.message.includes('return')) {
|
|
196
|
-
try {
|
|
197
|
-
return (new Function('sys', `return (function(sys){\n${src}\n})(sys)`))(sys);
|
|
198
|
-
}
|
|
199
|
-
catch (e2) {
|
|
200
|
-
console.warn('[eval]', e2);
|
|
201
|
-
return null;
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
console.warn('[eval]', e);
|
|
205
|
-
return null;
|
|
206
|
-
}
|
|
207
|
-
};
|
|
208
|
-
// Propアクセス支援
|
|
209
|
-
sys.__registPropAccessor = (f, getProp, setProp) => {
|
|
210
|
-
system.__propAccessor.push({
|
|
211
|
-
target: f,
|
|
212
|
-
getProp,
|
|
213
|
-
setProp
|
|
214
|
-
});
|
|
215
|
-
};
|
|
216
|
-
sys.__checkPropAccessor = (mode, obj) => {
|
|
217
|
-
if ((mode === 'get' && obj.__getProp === undefined) || (mode === 'set' && obj.__setProp === undefined)) {
|
|
218
|
-
for (let i = 0; i < system.__propAccessor.length; i++) {
|
|
219
|
-
const accs = system.__propAccessor[i];
|
|
220
|
-
if (accs.target[Symbol.hasInstance](obj)) {
|
|
221
|
-
if (accs.getProp) {
|
|
222
|
-
obj.__getProp = accs.getProp;
|
|
223
|
-
}
|
|
224
|
-
else {
|
|
225
|
-
obj.__getProp = null;
|
|
226
|
-
}
|
|
227
|
-
if (accs.setProp) {
|
|
228
|
-
obj.__setProp = accs.setProp;
|
|
229
|
-
}
|
|
230
|
-
else {
|
|
231
|
-
obj.__setProp = null;
|
|
232
|
-
}
|
|
233
|
-
return;
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
obj.__getProp = obj.__setProp = null;
|
|
237
|
-
}
|
|
238
|
-
};
|
|
239
|
-
// 「??」ハテナ関数の設定
|
|
240
|
-
sys.__hatena = sys.__getSysVar('デバッグ表示');
|
|
241
|
-
}
|
|
242
|
-
},
|
|
243
|
-
'!クリア': {
|
|
244
|
-
type: 'func',
|
|
245
|
-
josi: [],
|
|
246
|
-
fn: function (sys) {
|
|
247
|
-
if (sys.__exec) {
|
|
248
|
-
sys.__exec('全タイマー停止', [sys]);
|
|
249
|
-
}
|
|
250
|
-
sys.__setSysVar('表示ログ', '');
|
|
251
|
-
}
|
|
252
|
-
},
|
|
253
|
-
// @システム定数
|
|
254
|
-
'ナデシコバージョン': { type: 'const', value: '?' }, // @なでしこばーじょん
|
|
255
|
-
'ナデシコ言語バージョン': { type: 'const', value: '?' }, // @なでしこげんごばーじょん
|
|
256
|
-
'ナデシコエンジン': { type: 'const', value: 'nadesi.com/v3' }, // @なでしこえんじん
|
|
257
|
-
'ナデシコ種類': { type: 'const', value: '?' }, // @なでしこしゅるい
|
|
258
|
-
'はい': { type: 'const', value: true }, // @はい
|
|
259
|
-
'いいえ': { type: 'const', value: false }, // @いいえ
|
|
260
|
-
'真': { type: 'const', value: true }, // @しん
|
|
261
|
-
'偽': { type: 'const', value: false }, // @ぎ
|
|
262
|
-
'永遠': { type: 'const', value: true }, // @えいえん
|
|
263
|
-
'オン': { type: 'const', value: true }, // @おん
|
|
264
|
-
'オフ': { type: 'const', value: false }, // @おふ
|
|
265
|
-
'改行': { type: 'const', value: '\n' }, // @かいぎょう
|
|
266
|
-
'タブ': { type: 'const', value: '\t' }, // @たぶ
|
|
267
|
-
'カッコ': { type: 'const', value: '「' }, // @かっこ
|
|
268
|
-
'カッコ閉': { type: 'const', value: '」' }, // @かっことじ
|
|
269
|
-
'波カッコ': { type: 'const', value: '{' }, // @なみかっこ
|
|
270
|
-
'波カッコ閉': { type: 'const', value: '}' }, // @なみかっことじ
|
|
271
|
-
'OK': { type: 'const', value: true }, // @OK
|
|
272
|
-
'NG': { type: 'const', value: false }, // @NG
|
|
273
|
-
'キャンセル': { type: 'const', value: 0 }, // @きゃんせる
|
|
274
|
-
'TRUE': { type: 'const', value: true }, // @TRUE
|
|
275
|
-
'FALSE': { type: 'const', value: false }, // @FALSE
|
|
276
|
-
'true': { type: 'const', value: true }, // @true
|
|
277
|
-
'false': { type: 'const', value: false }, // @false
|
|
278
|
-
'PI': { type: 'const', value: Math.PI }, // @PI
|
|
279
|
-
'空': { type: 'const', value: '' }, // @から
|
|
280
|
-
'NULL': { type: 'const', value: null }, // @NULL
|
|
281
|
-
'undefined': { type: 'const', value: undefined }, // @undefined
|
|
282
|
-
'未定義': { type: 'const', value: undefined }, // @みていぎ
|
|
283
|
-
'エラーメッセージ': { type: 'const', value: '' }, // @えらーめっせーじ
|
|
284
|
-
'対象': { type: 'const', value: '' }, // @たいしょう
|
|
285
|
-
'対象キー': { type: 'const', value: '' }, // @たいしょうきー
|
|
286
|
-
'回数': { type: 'const', value: '' }, // @かいすう
|
|
287
|
-
'CR': { type: 'const', value: '\r' }, // @CR
|
|
288
|
-
'LF': { type: 'const', value: '\n' }, // @LF
|
|
289
|
-
'非数': { type: 'const', value: NaN }, // @ひすう
|
|
290
|
-
'無限大': { type: 'const', value: Infinity }, // @むげんだい
|
|
291
|
-
'戻値無': { type: 'const', value: 0 }, // @もどりちなし
|
|
292
|
-
'戻値有': { type: 'const', value: 1 }, // @もどりちあり
|
|
293
|
-
'空配列': {
|
|
294
|
-
type: 'func',
|
|
295
|
-
josi: [],
|
|
296
|
-
pure: true,
|
|
297
|
-
fn: function () {
|
|
298
|
-
return [];
|
|
299
|
-
}
|
|
300
|
-
},
|
|
301
|
-
'空辞書': {
|
|
302
|
-
type: 'func',
|
|
303
|
-
josi: [],
|
|
304
|
-
pure: true,
|
|
305
|
-
fn: function () {
|
|
306
|
-
return {};
|
|
307
|
-
}
|
|
308
|
-
},
|
|
309
|
-
'空ハッシュ': {
|
|
310
|
-
type: 'func',
|
|
311
|
-
josi: [],
|
|
312
|
-
pure: true,
|
|
313
|
-
fn: function () {
|
|
314
|
-
return {};
|
|
315
|
-
}
|
|
316
|
-
},
|
|
317
|
-
'空オブジェクト': {
|
|
318
|
-
type: 'func',
|
|
319
|
-
josi: [],
|
|
320
|
-
pure: false,
|
|
321
|
-
fn: function (sys) {
|
|
322
|
-
return sys.__exec('空ハッシュ', [sys]);
|
|
323
|
-
}
|
|
324
|
-
},
|
|
325
|
-
'真偽判定': {
|
|
326
|
-
type: 'func',
|
|
327
|
-
josi: [['の', 'を']],
|
|
328
|
-
pure: true,
|
|
329
|
-
fn: function (b) {
|
|
330
|
-
return b ? '真' : '偽';
|
|
331
|
-
}
|
|
332
|
-
},
|
|
333
|
-
// @標準出力
|
|
334
|
-
'表示': {
|
|
335
|
-
type: 'func',
|
|
336
|
-
josi: [['を', 'と']],
|
|
337
|
-
pure: true,
|
|
338
|
-
fn: function (s, sys) {
|
|
339
|
-
// 継続表示の一時プールを出力
|
|
340
|
-
s = String(sys.__printPool) + s;
|
|
341
|
-
sys.__printPool = '';
|
|
342
|
-
//
|
|
343
|
-
sys.__setSysVar('表示ログ', String(sys.__getSysVar('表示ログ')) + s + '\n');
|
|
344
|
-
sys.logger.send('stdout', s + '');
|
|
345
|
-
},
|
|
346
|
-
return_none: true
|
|
347
|
-
},
|
|
348
|
-
'継続表示': {
|
|
349
|
-
type: 'func',
|
|
350
|
-
josi: [['を', 'と']],
|
|
351
|
-
pure: true,
|
|
352
|
-
fn: function (s, sys) {
|
|
353
|
-
sys.__printPool += s;
|
|
354
|
-
},
|
|
355
|
-
return_none: true
|
|
356
|
-
},
|
|
357
|
-
'連続表示': {
|
|
358
|
-
type: 'func',
|
|
359
|
-
josi: [['と', 'を']],
|
|
360
|
-
isVariableJosi: true,
|
|
361
|
-
pure: true,
|
|
362
|
-
fn: function (...a) {
|
|
363
|
-
const sys = a.pop();
|
|
364
|
-
const v = a.join('');
|
|
365
|
-
sys.__exec('表示', [v, sys]);
|
|
366
|
-
},
|
|
367
|
-
return_none: true
|
|
368
|
-
},
|
|
369
|
-
'連続無改行表示': {
|
|
370
|
-
type: 'func',
|
|
371
|
-
josi: [['と', 'を']],
|
|
372
|
-
isVariableJosi: true,
|
|
373
|
-
pure: true,
|
|
374
|
-
fn: function (...a) {
|
|
375
|
-
const sys = a.pop();
|
|
376
|
-
const v = a.join('');
|
|
377
|
-
sys.__exec('継続表示', [v, sys]);
|
|
378
|
-
},
|
|
379
|
-
return_none: true
|
|
380
|
-
},
|
|
381
|
-
'表示ログ': { type: 'const', value: '' }, // @ひょうじろぐ
|
|
382
|
-
'表示ログクリア': {
|
|
383
|
-
type: 'func',
|
|
384
|
-
josi: [],
|
|
385
|
-
pure: true,
|
|
386
|
-
fn: function (sys) {
|
|
387
|
-
sys.__setSysVar('表示ログ', '');
|
|
388
|
-
},
|
|
389
|
-
return_none: true
|
|
390
|
-
},
|
|
391
|
-
'言': {
|
|
392
|
-
type: 'func',
|
|
393
|
-
josi: [['を', 'と']],
|
|
394
|
-
pure: true,
|
|
395
|
-
fn: function (s, sys) {
|
|
396
|
-
sys.logger.send('stdout', s + '');
|
|
397
|
-
},
|
|
398
|
-
return_none: true
|
|
399
|
-
},
|
|
400
|
-
'コンソール表示': {
|
|
401
|
-
type: 'func',
|
|
402
|
-
josi: [['を', 'と']],
|
|
403
|
-
pure: true,
|
|
404
|
-
fn: function (s) {
|
|
405
|
-
console.log(s);
|
|
406
|
-
},
|
|
407
|
-
return_none: true
|
|
408
|
-
},
|
|
409
|
-
// @四則演算
|
|
410
|
-
'足': {
|
|
411
|
-
type: 'func',
|
|
412
|
-
josi: [['に', 'と'], ['を']],
|
|
413
|
-
isVariableJosi: false,
|
|
414
|
-
pure: true,
|
|
415
|
-
fn: function (a, b) {
|
|
416
|
-
if (typeof (a) === 'bigint' || typeof (b) === 'bigint') {
|
|
417
|
-
return BigInt(a) + BigInt(b);
|
|
418
|
-
}
|
|
419
|
-
return parseFloat(a) + parseFloat(b);
|
|
420
|
-
}
|
|
421
|
-
},
|
|
422
|
-
'合計': {
|
|
423
|
-
type: 'func',
|
|
424
|
-
josi: [['と', 'を', 'の']],
|
|
425
|
-
isVariableJosi: true,
|
|
426
|
-
pure: true,
|
|
427
|
-
fn: function (...a) {
|
|
428
|
-
const sys = a.pop(); // remove NakoSystem
|
|
429
|
-
if (a.length >= 1 && a[0] instanceof Array) {
|
|
430
|
-
return sys.__exec('配列合計', [a[0], sys]);
|
|
431
|
-
}
|
|
432
|
-
let isBigInt = false;
|
|
433
|
-
let sum = 0;
|
|
434
|
-
for (const v of a) {
|
|
435
|
-
if (typeof (v) === 'bigint') {
|
|
436
|
-
isBigInt = true;
|
|
437
|
-
break;
|
|
438
|
-
}
|
|
439
|
-
sum += parseFloat(v);
|
|
440
|
-
}
|
|
441
|
-
if (isBigInt) {
|
|
442
|
-
let bigsum = 0n;
|
|
443
|
-
for (const v of a) {
|
|
444
|
-
bigsum += BigInt(v);
|
|
445
|
-
}
|
|
446
|
-
return bigsum;
|
|
447
|
-
}
|
|
448
|
-
return sum;
|
|
449
|
-
}
|
|
450
|
-
},
|
|
451
|
-
'引': {
|
|
452
|
-
type: 'func',
|
|
453
|
-
josi: [['から'], ['を']],
|
|
454
|
-
pure: true,
|
|
455
|
-
fn: function (a, b) {
|
|
456
|
-
return a - b;
|
|
457
|
-
}
|
|
458
|
-
},
|
|
459
|
-
'掛': {
|
|
460
|
-
type: 'func',
|
|
461
|
-
josi: [['に', 'と'], ['を']],
|
|
462
|
-
pure: true,
|
|
463
|
-
fn: function (a, b) {
|
|
464
|
-
// 数値の掛け算
|
|
465
|
-
if (typeof a === 'number') {
|
|
466
|
-
return a * b;
|
|
467
|
-
}
|
|
468
|
-
// 文字列の掛け算(文字列の繰り返し)
|
|
469
|
-
if (typeof a === 'string') {
|
|
470
|
-
let s = '';
|
|
471
|
-
for (let i = 0; i < parseInt(b); i++) {
|
|
472
|
-
s += a;
|
|
473
|
-
}
|
|
474
|
-
return s;
|
|
475
|
-
}
|
|
476
|
-
// 配列の繰り返し
|
|
477
|
-
if (a instanceof Array) {
|
|
478
|
-
const aa = [];
|
|
479
|
-
for (let i = 0; i < parseInt(b); i++) {
|
|
480
|
-
aa.push(...a);
|
|
481
|
-
}
|
|
482
|
-
return aa;
|
|
483
|
-
}
|
|
484
|
-
return a * b;
|
|
485
|
-
}
|
|
486
|
-
},
|
|
487
|
-
'倍': {
|
|
488
|
-
type: 'func',
|
|
489
|
-
josi: [['の', 'を'], ['']],
|
|
490
|
-
pure: true,
|
|
491
|
-
fn: function (a, b) {
|
|
492
|
-
return a * b;
|
|
493
|
-
}
|
|
494
|
-
},
|
|
495
|
-
'割': {
|
|
496
|
-
type: 'func',
|
|
497
|
-
josi: [['を'], ['で']],
|
|
498
|
-
pure: true,
|
|
499
|
-
fn: function (a, b) {
|
|
500
|
-
return a / b;
|
|
501
|
-
}
|
|
502
|
-
},
|
|
503
|
-
'割余': {
|
|
504
|
-
type: 'func',
|
|
505
|
-
josi: [['を'], ['で']],
|
|
506
|
-
pure: true,
|
|
507
|
-
fn: function (a, b) {
|
|
508
|
-
return a % b;
|
|
509
|
-
}
|
|
510
|
-
},
|
|
511
|
-
'偶数': {
|
|
512
|
-
type: 'func',
|
|
513
|
-
josi: [['が']],
|
|
514
|
-
pure: true,
|
|
515
|
-
fn: function (a) {
|
|
516
|
-
return (parseInt(a) % 2 === 0);
|
|
517
|
-
}
|
|
518
|
-
},
|
|
519
|
-
'奇数': {
|
|
520
|
-
type: 'func',
|
|
521
|
-
josi: [['が']],
|
|
522
|
-
pure: true,
|
|
523
|
-
fn: function (a) {
|
|
524
|
-
return (parseInt(a) % 2 === 1);
|
|
525
|
-
}
|
|
526
|
-
},
|
|
527
|
-
'二乗': {
|
|
528
|
-
type: 'func',
|
|
529
|
-
josi: [['の', 'を']],
|
|
530
|
-
pure: true,
|
|
531
|
-
fn: function (a) {
|
|
532
|
-
return a * a;
|
|
533
|
-
}
|
|
534
|
-
},
|
|
535
|
-
'べき乗': {
|
|
536
|
-
type: 'func',
|
|
537
|
-
josi: [['の'], ['の']],
|
|
538
|
-
pure: true,
|
|
539
|
-
fn: function (a, b) {
|
|
540
|
-
return Math.pow(a, b);
|
|
541
|
-
}
|
|
542
|
-
},
|
|
543
|
-
'以上': {
|
|
544
|
-
type: 'func',
|
|
545
|
-
josi: [['が'], ['']],
|
|
546
|
-
pure: true,
|
|
547
|
-
fn: function (a, b) {
|
|
548
|
-
return a >= b;
|
|
549
|
-
}
|
|
550
|
-
},
|
|
551
|
-
'以下': {
|
|
552
|
-
type: 'func',
|
|
553
|
-
josi: [['が'], ['']],
|
|
554
|
-
pure: true,
|
|
555
|
-
fn: function (a, b) {
|
|
556
|
-
return a <= b;
|
|
557
|
-
}
|
|
558
|
-
},
|
|
559
|
-
'未満': {
|
|
560
|
-
type: 'func',
|
|
561
|
-
josi: [['が'], ['']],
|
|
562
|
-
pure: true,
|
|
563
|
-
fn: function (a, b) {
|
|
564
|
-
return a < b;
|
|
565
|
-
}
|
|
566
|
-
},
|
|
567
|
-
'超': {
|
|
568
|
-
type: 'func',
|
|
569
|
-
josi: [['が'], ['']],
|
|
570
|
-
pure: true,
|
|
571
|
-
fn: function (a, b) {
|
|
572
|
-
return a > b;
|
|
573
|
-
}
|
|
574
|
-
},
|
|
575
|
-
'等': {
|
|
576
|
-
type: 'func',
|
|
577
|
-
josi: [['が'], ['と']],
|
|
578
|
-
pure: true,
|
|
579
|
-
fn: function (a, b) {
|
|
580
|
-
return a === b;
|
|
581
|
-
}
|
|
582
|
-
},
|
|
583
|
-
'等無': {
|
|
584
|
-
type: 'func',
|
|
585
|
-
josi: [['が'], ['と']],
|
|
586
|
-
pure: true,
|
|
587
|
-
fn: function (a, b) {
|
|
588
|
-
return a !== b;
|
|
589
|
-
}
|
|
590
|
-
},
|
|
591
|
-
'一致': {
|
|
592
|
-
type: 'func',
|
|
593
|
-
josi: [['が'], ['と']],
|
|
594
|
-
pure: true,
|
|
595
|
-
fn: function (a, b) {
|
|
596
|
-
// オブジェクトの場合、JSONに変換して比較
|
|
597
|
-
if (typeof (a) === 'object') {
|
|
598
|
-
const jsonA = JSON.stringify(a);
|
|
599
|
-
const jsonB = JSON.stringify(b);
|
|
600
|
-
return jsonA === jsonB;
|
|
601
|
-
}
|
|
602
|
-
return a === b;
|
|
603
|
-
}
|
|
604
|
-
},
|
|
605
|
-
'不一致': {
|
|
606
|
-
type: 'func',
|
|
607
|
-
josi: [['が'], ['と']],
|
|
608
|
-
pure: true,
|
|
609
|
-
fn: function (a, b) {
|
|
610
|
-
// オブジェクトの場合、JSONに変換して比較
|
|
611
|
-
if (typeof (a) === 'object') {
|
|
612
|
-
const jsonA = JSON.stringify(a);
|
|
613
|
-
const jsonB = JSON.stringify(b);
|
|
614
|
-
return jsonA !== jsonB;
|
|
615
|
-
}
|
|
616
|
-
return a !== b;
|
|
617
|
-
}
|
|
618
|
-
},
|
|
619
|
-
'範囲内': {
|
|
620
|
-
type: 'func',
|
|
621
|
-
josi: [['が'], ['から'], ['の', 'までの']],
|
|
622
|
-
pure: true,
|
|
623
|
-
fn: function (v, a, b) {
|
|
624
|
-
return (a <= v) && (v <= b);
|
|
625
|
-
}
|
|
626
|
-
},
|
|
627
|
-
'範囲': {
|
|
628
|
-
type: 'func',
|
|
629
|
-
josi: [['から'], ['の', 'までの']],
|
|
630
|
-
pure: true,
|
|
631
|
-
fn: function (a, b) {
|
|
632
|
-
return {
|
|
633
|
-
'先頭': a,
|
|
634
|
-
'末尾': b
|
|
635
|
-
};
|
|
636
|
-
}
|
|
637
|
-
},
|
|
638
|
-
'連続加算': {
|
|
639
|
-
type: 'func',
|
|
640
|
-
josi: [['を'], ['に', 'と']],
|
|
641
|
-
isVariableJosi: true,
|
|
642
|
-
pure: true,
|
|
643
|
-
fn: function (b, ...a) {
|
|
644
|
-
a.pop(); // 必ず末尾に sys があるので、末尾のシステム変数を除外
|
|
645
|
-
a.push(b);
|
|
646
|
-
return a.reduce((p, c) => p + c);
|
|
647
|
-
}
|
|
648
|
-
},
|
|
649
|
-
'MAX': {
|
|
650
|
-
type: 'func',
|
|
651
|
-
josi: [['の'], ['と']],
|
|
652
|
-
isVariableJosi: true,
|
|
653
|
-
pure: true,
|
|
654
|
-
fn: function (b, ...a) {
|
|
655
|
-
const sys = a.pop();
|
|
656
|
-
return sys.__exec('最大値', [b, ...a, sys]);
|
|
657
|
-
}
|
|
658
|
-
},
|
|
659
|
-
'最大値': {
|
|
660
|
-
type: 'func',
|
|
661
|
-
josi: [['の'], ['と']],
|
|
662
|
-
isVariableJosi: true,
|
|
663
|
-
pure: true,
|
|
664
|
-
fn: function (b, ...a) {
|
|
665
|
-
a.pop(); // 必ず末尾に sys があるので、末尾のシステム変数を除外
|
|
666
|
-
a.push(b);
|
|
667
|
-
return a.reduce((p, c) => Math.max(p, c));
|
|
668
|
-
}
|
|
669
|
-
},
|
|
670
|
-
'MIN': {
|
|
671
|
-
type: 'func',
|
|
672
|
-
josi: [['の'], ['と']],
|
|
673
|
-
isVariableJosi: true,
|
|
674
|
-
pure: true,
|
|
675
|
-
fn: function (b, ...a) {
|
|
676
|
-
const sys = a.pop();
|
|
677
|
-
return sys.__exec('最小値', [b, ...a, sys]);
|
|
678
|
-
}
|
|
679
|
-
},
|
|
680
|
-
'最小値': {
|
|
681
|
-
type: 'func',
|
|
682
|
-
josi: [['の'], ['と']],
|
|
683
|
-
isVariableJosi: true,
|
|
684
|
-
pure: true,
|
|
685
|
-
fn: function (b, ...a) {
|
|
686
|
-
a.pop(); // 必ず末尾に sys があるので、末尾のシステム変数を除外
|
|
687
|
-
a.push(b);
|
|
688
|
-
return a.reduce((p, c) => Math.min(p, c));
|
|
689
|
-
}
|
|
690
|
-
},
|
|
691
|
-
'CLAMP': {
|
|
692
|
-
type: 'func',
|
|
693
|
-
josi: [['の', 'を'], ['から'], ['までの', 'で']],
|
|
694
|
-
pure: true,
|
|
695
|
-
fn: function (x, a, b) {
|
|
696
|
-
return Math.min(Math.max(x, a), b);
|
|
697
|
-
}
|
|
698
|
-
},
|
|
699
|
-
// @敬語
|
|
700
|
-
'ください': {
|
|
701
|
-
type: 'func',
|
|
702
|
-
josi: [],
|
|
703
|
-
pure: true,
|
|
704
|
-
fn: function (sys) {
|
|
705
|
-
if (!sys.__reisetu) {
|
|
706
|
-
sys.__reisetu = 0;
|
|
707
|
-
}
|
|
708
|
-
sys.__reisetu++;
|
|
709
|
-
},
|
|
710
|
-
return_none: true
|
|
711
|
-
},
|
|
712
|
-
'お願': {
|
|
713
|
-
type: 'func',
|
|
714
|
-
josi: [],
|
|
715
|
-
pure: true,
|
|
716
|
-
fn: function (sys) {
|
|
717
|
-
if (!sys.__reisetu) {
|
|
718
|
-
sys.__reisetu = 0;
|
|
719
|
-
}
|
|
720
|
-
sys.__reisetu++;
|
|
721
|
-
},
|
|
722
|
-
return_none: true
|
|
723
|
-
},
|
|
724
|
-
'です': {
|
|
725
|
-
type: 'func',
|
|
726
|
-
josi: [],
|
|
727
|
-
pure: true,
|
|
728
|
-
fn: function (sys) {
|
|
729
|
-
if (!sys.__reisetu) {
|
|
730
|
-
sys.__reisetu = 0;
|
|
731
|
-
}
|
|
732
|
-
sys.__reisetu++;
|
|
733
|
-
},
|
|
734
|
-
return_none: true
|
|
735
|
-
},
|
|
736
|
-
'拝啓': {
|
|
737
|
-
type: 'func',
|
|
738
|
-
josi: [],
|
|
739
|
-
pure: true,
|
|
740
|
-
fn: function (sys) {
|
|
741
|
-
sys.__reisetu = 0;
|
|
742
|
-
},
|
|
743
|
-
return_none: true
|
|
744
|
-
},
|
|
745
|
-
'敬具': {
|
|
746
|
-
type: 'func',
|
|
747
|
-
josi: [],
|
|
748
|
-
pure: true,
|
|
749
|
-
fn: function (sys) {
|
|
750
|
-
sys.__reisetu += 100; // bonus point
|
|
751
|
-
},
|
|
752
|
-
return_none: true
|
|
753
|
-
},
|
|
754
|
-
'礼節レベル取得': {
|
|
755
|
-
type: 'func',
|
|
756
|
-
josi: [],
|
|
757
|
-
pure: true,
|
|
758
|
-
fn: function (sys) {
|
|
759
|
-
if (!sys.__reisetu) {
|
|
760
|
-
sys.__reisetu = 0;
|
|
761
|
-
}
|
|
762
|
-
return sys.__reisetu;
|
|
763
|
-
}
|
|
764
|
-
},
|
|
765
|
-
// @特殊命令
|
|
766
|
-
'JS実行': {
|
|
767
|
-
type: 'func',
|
|
768
|
-
josi: [['を', 'で']],
|
|
769
|
-
pure: true,
|
|
770
|
-
fn: function (src, sys) {
|
|
771
|
-
return sys.__evalJS(src, sys); // #1733
|
|
772
|
-
}
|
|
773
|
-
},
|
|
774
|
-
'JSオブジェクト取得': {
|
|
775
|
-
type: 'func',
|
|
776
|
-
josi: [['の']],
|
|
777
|
-
pure: false,
|
|
778
|
-
fn: function (name, sys) {
|
|
779
|
-
return sys.__findVar(name, null);
|
|
780
|
-
}
|
|
781
|
-
},
|
|
782
|
-
'JS関数実行': {
|
|
783
|
-
type: 'func',
|
|
784
|
-
josi: [['を'], ['で']],
|
|
785
|
-
fn: function (name, args, sys) {
|
|
786
|
-
// nameが文字列ならevalして関数を得る
|
|
787
|
-
if (typeof name === 'string') {
|
|
788
|
-
name = sys.__evalJS(name, sys);
|
|
789
|
-
}
|
|
790
|
-
if (typeof name !== 'function') {
|
|
791
|
-
throw new Error('JS関数取得で実行できません。');
|
|
792
|
-
}
|
|
793
|
-
// argsがArrayでなければArrayに変換する
|
|
794
|
-
if (!(args instanceof Array)) {
|
|
795
|
-
args = [args];
|
|
796
|
-
}
|
|
797
|
-
// 実行
|
|
798
|
-
// eslint-disable-next-line prefer-spread
|
|
799
|
-
return name.apply(null, args);
|
|
800
|
-
}
|
|
801
|
-
},
|
|
802
|
-
'ASYNC': {
|
|
803
|
-
type: 'func',
|
|
804
|
-
josi: [],
|
|
805
|
-
asyncFn: true,
|
|
806
|
-
pure: true,
|
|
807
|
-
fn: async function () {
|
|
808
|
-
// empty
|
|
809
|
-
},
|
|
810
|
-
return_none: true
|
|
811
|
-
},
|
|
812
|
-
'AWAIT実行': {
|
|
813
|
-
type: 'func',
|
|
814
|
-
josi: [['を'], ['で']],
|
|
815
|
-
pure: true,
|
|
816
|
-
asyncFn: true,
|
|
817
|
-
fn: async function (f, args, sys) {
|
|
818
|
-
// nameが文字列ならevalして関数を得る
|
|
819
|
-
if (typeof f === 'string') {
|
|
820
|
-
f = sys.__findFunc(f, 'AWAIT実行');
|
|
821
|
-
}
|
|
822
|
-
if (!(f instanceof Function)) {
|
|
823
|
-
throw new Error('『AWAIT実行』の第一引数はなでしこ関数名かFunction型で指定してください。');
|
|
824
|
-
}
|
|
825
|
-
// 実行
|
|
826
|
-
return await f(...args);
|
|
827
|
-
}
|
|
828
|
-
},
|
|
829
|
-
'JSメソッド実行': {
|
|
830
|
-
type: 'func',
|
|
831
|
-
josi: [['の'], ['を'], ['で']],
|
|
832
|
-
fn: function (obj, m, args, sys) {
|
|
833
|
-
// objが文字列ならevalして関数を得る
|
|
834
|
-
if (typeof obj === 'string') {
|
|
835
|
-
obj = sys.__evalJS(obj, sys);
|
|
836
|
-
}
|
|
837
|
-
if (typeof obj !== 'object') {
|
|
838
|
-
throw new Error('JSオブジェクトを取得できませんでした。');
|
|
839
|
-
}
|
|
840
|
-
// method を求める
|
|
841
|
-
if (typeof m !== 'function') {
|
|
842
|
-
m = obj[m];
|
|
843
|
-
}
|
|
844
|
-
// argsがArrayでなければArrayに変換する
|
|
845
|
-
if (!(args instanceof Array)) {
|
|
846
|
-
args = [args];
|
|
847
|
-
}
|
|
848
|
-
// 実行
|
|
849
|
-
return m.apply(obj, args);
|
|
850
|
-
}
|
|
851
|
-
},
|
|
852
|
-
'ナデシコ': {
|
|
853
|
-
type: 'func',
|
|
854
|
-
josi: [['を', 'で']],
|
|
855
|
-
pure: false,
|
|
856
|
-
asyncFn: true,
|
|
857
|
-
fn: async function (code, sys) {
|
|
858
|
-
const options = {
|
|
859
|
-
resetEnv: false,
|
|
860
|
-
resetAll: true,
|
|
861
|
-
nakoGlobal: sys
|
|
862
|
-
};
|
|
863
|
-
const tmpLog = String(sys.__getSysVar('表示ログ', ''));
|
|
864
|
-
sys.__setSysVar('表示ログ', '');
|
|
865
|
-
await sys.__self.runAsync(code, sys.__modName, options);
|
|
866
|
-
const outLog = String(sys.__getSysVar('表示ログ'));
|
|
867
|
-
sys.__setSysVar('表示ログ', tmpLog + outLog);
|
|
868
|
-
return outLog;
|
|
869
|
-
}
|
|
870
|
-
},
|
|
871
|
-
'ナデシコ続': {
|
|
872
|
-
type: 'func',
|
|
873
|
-
josi: [['を', 'で']],
|
|
874
|
-
pure: false,
|
|
875
|
-
asyncFn: true,
|
|
876
|
-
fn: async function (code, sys) {
|
|
877
|
-
const options = {
|
|
878
|
-
resetEnv: false,
|
|
879
|
-
resetAll: false,
|
|
880
|
-
nakoGlobal: sys.__self
|
|
881
|
-
};
|
|
882
|
-
const tmpLog = sys.__getSysVar('表示ログ', '');
|
|
883
|
-
sys.__setSysVar('表示ログ', '');
|
|
884
|
-
await sys.__self.runAsync(code, sys.__modName, options);
|
|
885
|
-
const outLog = String(sys.__getSysVar('表示ログ'));
|
|
886
|
-
if (outLog) {
|
|
887
|
-
sys.logger.trace(outLog);
|
|
888
|
-
}
|
|
889
|
-
sys.__setSysVar('表示ログ', tmpLog + outLog);
|
|
890
|
-
return outLog;
|
|
891
|
-
}
|
|
892
|
-
},
|
|
893
|
-
'実行': {
|
|
894
|
-
type: 'func',
|
|
895
|
-
josi: [['を', 'に', 'で']],
|
|
896
|
-
pure: false,
|
|
897
|
-
fn: function (f, sys) {
|
|
898
|
-
// #938 の規則に従って処理
|
|
899
|
-
// 引数が関数なら実行
|
|
900
|
-
if (typeof f === 'function') {
|
|
901
|
-
return f(sys);
|
|
902
|
-
}
|
|
903
|
-
// 文字列なら関数に変換できるか判定して実行
|
|
904
|
-
if (typeof f === 'string') {
|
|
905
|
-
const tf = sys.__findFunc(f, '実行');
|
|
906
|
-
if (typeof tf === 'function') {
|
|
907
|
-
return tf(sys);
|
|
908
|
-
}
|
|
909
|
-
}
|
|
910
|
-
// それ以外ならそのまま値を返す
|
|
911
|
-
return f;
|
|
912
|
-
}
|
|
913
|
-
},
|
|
914
|
-
'実行時間計測': {
|
|
915
|
-
type: 'func',
|
|
916
|
-
josi: [['の']],
|
|
917
|
-
pure: false,
|
|
918
|
-
fn: function (f, sys) {
|
|
919
|
-
if (typeof f === 'string') {
|
|
920
|
-
f = sys.__findFunc(f, '実行時間計測');
|
|
921
|
-
}
|
|
922
|
-
//
|
|
923
|
-
if (performance && performance.now) {
|
|
924
|
-
const t1 = performance.now();
|
|
925
|
-
f(sys);
|
|
926
|
-
const t2 = performance.now();
|
|
927
|
-
return (t2 - t1);
|
|
928
|
-
}
|
|
929
|
-
else {
|
|
930
|
-
const t1 = Date.now();
|
|
931
|
-
f(sys);
|
|
932
|
-
const t2 = Date.now();
|
|
933
|
-
return (t2 - t1);
|
|
934
|
-
}
|
|
935
|
-
}
|
|
936
|
-
},
|
|
937
|
-
'終': {
|
|
938
|
-
type: 'func',
|
|
939
|
-
josi: [],
|
|
940
|
-
pure: true,
|
|
941
|
-
fn: function (sys) {
|
|
942
|
-
// デバッグモードでなければ例外を投げることでプログラムを終了させる
|
|
943
|
-
sys.__setSysVar('__forceClose', true);
|
|
944
|
-
if (!sys.__getSysVar('__useDebug')) {
|
|
945
|
-
throw new Error('__終わる__');
|
|
946
|
-
}
|
|
947
|
-
}
|
|
948
|
-
},
|
|
949
|
-
// @型変換
|
|
950
|
-
'変数型確認': {
|
|
951
|
-
type: 'func',
|
|
952
|
-
josi: [['の']],
|
|
953
|
-
pure: true,
|
|
954
|
-
fn: function (v) {
|
|
955
|
-
return (typeof v);
|
|
956
|
-
}
|
|
957
|
-
},
|
|
958
|
-
'TYPEOF': {
|
|
959
|
-
type: 'func',
|
|
960
|
-
josi: [['の']],
|
|
961
|
-
pure: true,
|
|
962
|
-
fn: function (v) {
|
|
963
|
-
return (typeof v);
|
|
964
|
-
}
|
|
965
|
-
},
|
|
966
|
-
'文字列変換': {
|
|
967
|
-
type: 'func',
|
|
968
|
-
josi: [['を']],
|
|
969
|
-
pure: true,
|
|
970
|
-
fn: function (v) {
|
|
971
|
-
return String(v);
|
|
972
|
-
}
|
|
973
|
-
},
|
|
974
|
-
'TOSTR': {
|
|
975
|
-
type: 'func',
|
|
976
|
-
josi: [['を']],
|
|
977
|
-
pure: true,
|
|
978
|
-
fn: function (v) {
|
|
979
|
-
return String(v);
|
|
980
|
-
}
|
|
981
|
-
},
|
|
982
|
-
'整数変換': {
|
|
983
|
-
type: 'func',
|
|
984
|
-
josi: [['を']],
|
|
985
|
-
pure: true,
|
|
986
|
-
fn: function (v) {
|
|
987
|
-
return parseInt(v);
|
|
988
|
-
}
|
|
989
|
-
},
|
|
990
|
-
'TOINT': {
|
|
991
|
-
type: 'func',
|
|
992
|
-
josi: [['を']],
|
|
993
|
-
pure: true,
|
|
994
|
-
fn: function (v) {
|
|
995
|
-
return parseInt(v);
|
|
996
|
-
}
|
|
997
|
-
},
|
|
998
|
-
'実数変換': {
|
|
999
|
-
type: 'func',
|
|
1000
|
-
josi: [['を']],
|
|
1001
|
-
pure: true,
|
|
1002
|
-
fn: function (v) {
|
|
1003
|
-
return parseFloat(v);
|
|
1004
|
-
}
|
|
1005
|
-
},
|
|
1006
|
-
'TOFLOAT': {
|
|
1007
|
-
type: 'func',
|
|
1008
|
-
josi: [['を']],
|
|
1009
|
-
pure: true,
|
|
1010
|
-
fn: function (v) {
|
|
1011
|
-
return parseFloat(v);
|
|
1012
|
-
}
|
|
1013
|
-
},
|
|
1014
|
-
'INT': {
|
|
1015
|
-
type: 'func',
|
|
1016
|
-
josi: [['の']],
|
|
1017
|
-
pure: true,
|
|
1018
|
-
fn: function (v) {
|
|
1019
|
-
return parseInt(v);
|
|
1020
|
-
}
|
|
1021
|
-
},
|
|
1022
|
-
'FLOAT': {
|
|
1023
|
-
type: 'func',
|
|
1024
|
-
josi: [['の']],
|
|
1025
|
-
pure: true,
|
|
1026
|
-
fn: function (v) {
|
|
1027
|
-
return parseFloat(v);
|
|
1028
|
-
}
|
|
1029
|
-
},
|
|
1030
|
-
'NAN判定': {
|
|
1031
|
-
type: 'func',
|
|
1032
|
-
josi: [['を']],
|
|
1033
|
-
pure: true,
|
|
1034
|
-
fn: function (v) {
|
|
1035
|
-
return isNaN(v);
|
|
1036
|
-
}
|
|
1037
|
-
},
|
|
1038
|
-
'非数判定': {
|
|
1039
|
-
type: 'func',
|
|
1040
|
-
josi: [['を']],
|
|
1041
|
-
pure: true,
|
|
1042
|
-
fn: function (v) {
|
|
1043
|
-
// https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Number/isNaN
|
|
1044
|
-
return Number.isNaN(v);
|
|
1045
|
-
}
|
|
1046
|
-
},
|
|
1047
|
-
'HEX': {
|
|
1048
|
-
type: 'func',
|
|
1049
|
-
josi: [['の']],
|
|
1050
|
-
pure: true,
|
|
1051
|
-
fn: function (a) {
|
|
1052
|
-
return parseInt(a).toString(16);
|
|
1053
|
-
}
|
|
1054
|
-
},
|
|
1055
|
-
'進数変換': {
|
|
1056
|
-
type: 'func',
|
|
1057
|
-
josi: [['を', 'の'], ['']],
|
|
1058
|
-
pure: true,
|
|
1059
|
-
fn: function (v, n) {
|
|
1060
|
-
return parseInt(v).toString(n);
|
|
1061
|
-
}
|
|
1062
|
-
},
|
|
1063
|
-
'二進': {
|
|
1064
|
-
type: 'func',
|
|
1065
|
-
josi: [['を', 'の', 'から']],
|
|
1066
|
-
pure: true,
|
|
1067
|
-
fn: function (v) {
|
|
1068
|
-
return parseInt(v).toString(2);
|
|
1069
|
-
}
|
|
1070
|
-
},
|
|
1071
|
-
'二進表示': {
|
|
1072
|
-
type: 'func',
|
|
1073
|
-
josi: [['を', 'の', 'から']],
|
|
1074
|
-
pure: true,
|
|
1075
|
-
fn: function (v, sys) {
|
|
1076
|
-
const s = parseInt(v).toString(2);
|
|
1077
|
-
sys.__exec('表示', [s, sys]);
|
|
1078
|
-
}
|
|
1079
|
-
},
|
|
1080
|
-
'RGB': {
|
|
1081
|
-
type: 'func',
|
|
1082
|
-
josi: [['と'], ['の'], ['で']],
|
|
1083
|
-
pure: true,
|
|
1084
|
-
fn: function (r, g, b) {
|
|
1085
|
-
const z2 = (v) => {
|
|
1086
|
-
const v2 = '00' + (parseInt(String(v)).toString(16));
|
|
1087
|
-
return v2.substring(v2.length - 2, v2.length);
|
|
1088
|
-
};
|
|
1089
|
-
return '#' + z2(r) + z2(g) + z2(b);
|
|
1090
|
-
}
|
|
1091
|
-
},
|
|
1092
|
-
// @論理演算
|
|
1093
|
-
'論理OR': {
|
|
1094
|
-
type: 'func',
|
|
1095
|
-
josi: [['と'], ['の']],
|
|
1096
|
-
pure: true,
|
|
1097
|
-
fn: function (a, b) {
|
|
1098
|
-
return (a || b);
|
|
1099
|
-
}
|
|
1100
|
-
},
|
|
1101
|
-
'論理AND': {
|
|
1102
|
-
type: 'func',
|
|
1103
|
-
josi: [['と'], ['の']],
|
|
1104
|
-
pure: true,
|
|
1105
|
-
fn: function (a, b) {
|
|
1106
|
-
return (a && b);
|
|
1107
|
-
}
|
|
1108
|
-
},
|
|
1109
|
-
'論理NOT': {
|
|
1110
|
-
type: 'func',
|
|
1111
|
-
josi: [['の']],
|
|
1112
|
-
pure: true,
|
|
1113
|
-
fn: function (v) {
|
|
1114
|
-
return (!v);
|
|
1115
|
-
}
|
|
1116
|
-
},
|
|
1117
|
-
// @ビット演算
|
|
1118
|
-
'OR': {
|
|
1119
|
-
type: 'func',
|
|
1120
|
-
josi: [['と'], ['の']],
|
|
1121
|
-
pure: true,
|
|
1122
|
-
fn: function (a, b) {
|
|
1123
|
-
return (a | b);
|
|
1124
|
-
}
|
|
1125
|
-
},
|
|
1126
|
-
'AND': {
|
|
1127
|
-
type: 'func',
|
|
1128
|
-
josi: [['と'], ['の']],
|
|
1129
|
-
pure: true,
|
|
1130
|
-
fn: function (a, b) {
|
|
1131
|
-
return (a & b);
|
|
1132
|
-
}
|
|
1133
|
-
},
|
|
1134
|
-
'XOR': {
|
|
1135
|
-
type: 'func',
|
|
1136
|
-
josi: [['と'], ['の']],
|
|
1137
|
-
pure: true,
|
|
1138
|
-
fn: function (a, b) {
|
|
1139
|
-
return (a ^ b);
|
|
1140
|
-
}
|
|
1141
|
-
},
|
|
1142
|
-
'NOT': {
|
|
1143
|
-
type: 'func',
|
|
1144
|
-
josi: [['の']],
|
|
1145
|
-
pure: true,
|
|
1146
|
-
fn: function (v) {
|
|
1147
|
-
return (~v);
|
|
1148
|
-
}
|
|
1149
|
-
},
|
|
1150
|
-
'SHIFT_L': {
|
|
1151
|
-
type: 'func',
|
|
1152
|
-
josi: [['を'], ['で']],
|
|
1153
|
-
pure: true,
|
|
1154
|
-
fn: function (v, a) {
|
|
1155
|
-
return (v << a);
|
|
1156
|
-
}
|
|
1157
|
-
},
|
|
1158
|
-
'SHIFT_R': {
|
|
1159
|
-
type: 'func',
|
|
1160
|
-
josi: [['を'], ['で']],
|
|
1161
|
-
pure: true,
|
|
1162
|
-
fn: function (v, a) {
|
|
1163
|
-
return (v >> a);
|
|
1164
|
-
}
|
|
1165
|
-
},
|
|
1166
|
-
'SHIFT_UR': {
|
|
1167
|
-
type: 'func',
|
|
1168
|
-
josi: [['を'], ['で']],
|
|
1169
|
-
pure: true,
|
|
1170
|
-
fn: function (v, a) {
|
|
1171
|
-
return (v >>> a);
|
|
1172
|
-
}
|
|
1173
|
-
},
|
|
1174
|
-
// @文字列処理
|
|
1175
|
-
'文字数': {
|
|
1176
|
-
type: 'func',
|
|
1177
|
-
josi: [['の']],
|
|
1178
|
-
pure: true,
|
|
1179
|
-
fn: function (v) {
|
|
1180
|
-
if (!Array.from) {
|
|
1181
|
-
return String(v).length;
|
|
1182
|
-
}
|
|
1183
|
-
// Unicodeのサロゲートペアを考慮して文字数をカウント #1954 を参照
|
|
1184
|
-
return Array.from(v).length;
|
|
1185
|
-
}
|
|
1186
|
-
},
|
|
1187
|
-
'何文字目': {
|
|
1188
|
-
type: 'func',
|
|
1189
|
-
josi: [['で', 'の'], ['が']],
|
|
1190
|
-
pure: true,
|
|
1191
|
-
fn: function (s, a) {
|
|
1192
|
-
// Unicodeのサロゲートペアを考慮して、文字列を検索 #1954 を参照
|
|
1193
|
-
// return String(s).indexOf(a) + 1 // サロゲートペアを無視した場合
|
|
1194
|
-
const strArray = Array.from(s);
|
|
1195
|
-
const searchArray = Array.from(a);
|
|
1196
|
-
for (let i = 0; i < strArray.length; i++) {
|
|
1197
|
-
if (strArray.slice(i, i + searchArray.length).join('') === searchArray.join('')) {
|
|
1198
|
-
return i + 1;
|
|
1199
|
-
}
|
|
1200
|
-
}
|
|
1201
|
-
return 0;
|
|
1202
|
-
}
|
|
1203
|
-
},
|
|
1204
|
-
'CHR': {
|
|
1205
|
-
type: 'func',
|
|
1206
|
-
josi: [['の']],
|
|
1207
|
-
pure: true,
|
|
1208
|
-
fn: function (v) {
|
|
1209
|
-
// 数値のとき
|
|
1210
|
-
if (typeof v === 'number') {
|
|
1211
|
-
if (!String.fromCodePoint) {
|
|
1212
|
-
return String.fromCharCode(v);
|
|
1213
|
-
}
|
|
1214
|
-
return String.fromCodePoint(v);
|
|
1215
|
-
}
|
|
1216
|
-
// 配列のとき
|
|
1217
|
-
const res = [];
|
|
1218
|
-
for (const s of v) {
|
|
1219
|
-
if (!String.fromCodePoint) {
|
|
1220
|
-
res.push(String.fromCharCode(s));
|
|
1221
|
-
}
|
|
1222
|
-
res.push(String.fromCodePoint(s));
|
|
1223
|
-
}
|
|
1224
|
-
return res;
|
|
1225
|
-
}
|
|
1226
|
-
},
|
|
1227
|
-
'ASC': {
|
|
1228
|
-
type: 'func',
|
|
1229
|
-
josi: [['の']],
|
|
1230
|
-
pure: true,
|
|
1231
|
-
fn: function (v) {
|
|
1232
|
-
if (typeof v === 'string') {
|
|
1233
|
-
if (!String.prototype.codePointAt) {
|
|
1234
|
-
return String(v).charCodeAt(0);
|
|
1235
|
-
}
|
|
1236
|
-
return String(v).codePointAt(0) || 0;
|
|
1237
|
-
}
|
|
1238
|
-
const res = [];
|
|
1239
|
-
for (const s of v) {
|
|
1240
|
-
if (!String.prototype.codePointAt) {
|
|
1241
|
-
res.push(String(s).charCodeAt(0));
|
|
1242
|
-
}
|
|
1243
|
-
res.push(String(s).codePointAt(0) || 0);
|
|
1244
|
-
}
|
|
1245
|
-
return res;
|
|
1246
|
-
}
|
|
1247
|
-
},
|
|
1248
|
-
'文字挿入': {
|
|
1249
|
-
type: 'func',
|
|
1250
|
-
josi: [['で', 'の'], ['に', 'へ'], ['を']],
|
|
1251
|
-
pure: true,
|
|
1252
|
-
fn: function (s, i, a) {
|
|
1253
|
-
if (i <= 0) {
|
|
1254
|
-
i = 1;
|
|
1255
|
-
}
|
|
1256
|
-
const strArray = Array.from(s);
|
|
1257
|
-
strArray.splice(i - 1, 0, a);
|
|
1258
|
-
return strArray.join('');
|
|
1259
|
-
}
|
|
1260
|
-
},
|
|
1261
|
-
'文字検索': {
|
|
1262
|
-
type: 'func',
|
|
1263
|
-
josi: [['で', 'の'], ['から'], ['を']],
|
|
1264
|
-
pure: true,
|
|
1265
|
-
fn: function (s, a, b) {
|
|
1266
|
-
// サロゲートペアを考慮して文字列を検索する
|
|
1267
|
-
// return String(s).indexOf(b, a - 1) + 1
|
|
1268
|
-
if (a <= 0) {
|
|
1269
|
-
a = 1;
|
|
1270
|
-
}
|
|
1271
|
-
const strArray = Array.from(s);
|
|
1272
|
-
const searchArray = Array.from(b);
|
|
1273
|
-
// Unicode単位で検索
|
|
1274
|
-
for (let i = a - 1; i < strArray.length; i++) {
|
|
1275
|
-
if (strArray.slice(i, i + searchArray.length).join('') === searchArray.join('')) {
|
|
1276
|
-
// 合致した
|
|
1277
|
-
return i + 1;
|
|
1278
|
-
}
|
|
1279
|
-
}
|
|
1280
|
-
return 0;
|
|
1281
|
-
}
|
|
1282
|
-
},
|
|
1283
|
-
'追加': {
|
|
1284
|
-
type: 'func',
|
|
1285
|
-
josi: [['で', 'に', 'へ'], ['を']],
|
|
1286
|
-
pure: true,
|
|
1287
|
-
fn: function (s, a) {
|
|
1288
|
-
if (s instanceof Array) {
|
|
1289
|
-
s.push(a);
|
|
1290
|
-
return s;
|
|
1291
|
-
}
|
|
1292
|
-
return String(s) + String(a);
|
|
1293
|
-
}
|
|
1294
|
-
},
|
|
1295
|
-
'一行追加': {
|
|
1296
|
-
type: 'func',
|
|
1297
|
-
josi: [['で', 'に', 'へ'], ['を']],
|
|
1298
|
-
pure: true,
|
|
1299
|
-
fn: function (s, a) {
|
|
1300
|
-
if (s instanceof Array) {
|
|
1301
|
-
s.push(a);
|
|
1302
|
-
return s;
|
|
1303
|
-
}
|
|
1304
|
-
return String(s) + String(a) + '\n';
|
|
1305
|
-
}
|
|
1306
|
-
},
|
|
1307
|
-
'連結': {
|
|
1308
|
-
type: 'func',
|
|
1309
|
-
josi: [['と', 'を']],
|
|
1310
|
-
pure: true,
|
|
1311
|
-
isVariableJosi: true,
|
|
1312
|
-
fn: function (...a) {
|
|
1313
|
-
a.pop(); // NakoSystemを取り除く
|
|
1314
|
-
return a.join('');
|
|
1315
|
-
}
|
|
1316
|
-
},
|
|
1317
|
-
'文字列連結': {
|
|
1318
|
-
type: 'func',
|
|
1319
|
-
josi: [['と', 'を']],
|
|
1320
|
-
pure: true,
|
|
1321
|
-
isVariableJosi: true,
|
|
1322
|
-
fn: function (...a) {
|
|
1323
|
-
a.pop(); // NakoSystemを取り除く
|
|
1324
|
-
return a.join('');
|
|
1325
|
-
}
|
|
1326
|
-
},
|
|
1327
|
-
'文字列分解': {
|
|
1328
|
-
type: 'func',
|
|
1329
|
-
josi: [['を', 'の', 'で']],
|
|
1330
|
-
pure: true,
|
|
1331
|
-
fn: function (v) {
|
|
1332
|
-
if (!Array.from) {
|
|
1333
|
-
return String(v).split('');
|
|
1334
|
-
}
|
|
1335
|
-
return Array.from(v);
|
|
1336
|
-
}
|
|
1337
|
-
},
|
|
1338
|
-
'リフレイン': {
|
|
1339
|
-
type: 'func',
|
|
1340
|
-
josi: [['を', 'の'], ['で']],
|
|
1341
|
-
pure: true,
|
|
1342
|
-
fn: function (v, cnt) {
|
|
1343
|
-
let s = '';
|
|
1344
|
-
for (let i = 0; i < cnt; i++) {
|
|
1345
|
-
s += String(v);
|
|
1346
|
-
}
|
|
1347
|
-
return s;
|
|
1348
|
-
}
|
|
1349
|
-
},
|
|
1350
|
-
'出現回数': {
|
|
1351
|
-
type: 'func',
|
|
1352
|
-
josi: [['で'], ['の']],
|
|
1353
|
-
pure: true,
|
|
1354
|
-
fn: function (s, a) {
|
|
1355
|
-
s = '' + s;
|
|
1356
|
-
a = '' + a;
|
|
1357
|
-
return s.split(a).length - 1;
|
|
1358
|
-
}
|
|
1359
|
-
},
|
|
1360
|
-
'MID': {
|
|
1361
|
-
type: 'func',
|
|
1362
|
-
josi: [['で', 'の'], ['から'], ['を']],
|
|
1363
|
-
pure: true,
|
|
1364
|
-
fn: function (s, a, cnt, sys) {
|
|
1365
|
-
return sys.__exec('文字抜出', [s, a, cnt]);
|
|
1366
|
-
}
|
|
1367
|
-
},
|
|
1368
|
-
'文字抜出': {
|
|
1369
|
-
type: 'func',
|
|
1370
|
-
josi: [['で', 'の'], ['から'], ['を', '']],
|
|
1371
|
-
pure: true,
|
|
1372
|
-
fn: function (s, a, cnt) {
|
|
1373
|
-
// 引数の型チェック #1995
|
|
1374
|
-
if (typeof a === 'string') {
|
|
1375
|
-
a = parseInt(a);
|
|
1376
|
-
}
|
|
1377
|
-
if (typeof cnt === 'string') {
|
|
1378
|
-
cnt = parseInt(cnt);
|
|
1379
|
-
}
|
|
1380
|
-
// もし、cntが0以下なら空文字を返す
|
|
1381
|
-
if (cnt <= 0) {
|
|
1382
|
-
return '';
|
|
1383
|
-
}
|
|
1384
|
-
// サロゲートペアを考慮した処理を行う
|
|
1385
|
-
const strArray = Array.from(s);
|
|
1386
|
-
// もし、aの値が0未満の時は後ろからa文字目からcnt文字を抽出
|
|
1387
|
-
if (a < 0) {
|
|
1388
|
-
a = strArray.length + a + 1;
|
|
1389
|
-
if (a < 0) {
|
|
1390
|
-
a = 1;
|
|
1391
|
-
}
|
|
1392
|
-
}
|
|
1393
|
-
return strArray.slice(a - 1, a + cnt - 1).join('');
|
|
1394
|
-
}
|
|
1395
|
-
},
|
|
1396
|
-
'LEFT': {
|
|
1397
|
-
type: 'func',
|
|
1398
|
-
josi: [['の', 'で'], ['だけ']],
|
|
1399
|
-
pure: true,
|
|
1400
|
-
fn: function (s, cnt, sys) {
|
|
1401
|
-
return sys.__exec('文字左部分', [s, cnt]);
|
|
1402
|
-
}
|
|
1403
|
-
},
|
|
1404
|
-
'文字左部分': {
|
|
1405
|
-
type: 'func',
|
|
1406
|
-
josi: [['の', 'で'], ['だけ', '']],
|
|
1407
|
-
pure: true,
|
|
1408
|
-
fn: function (s, cnt) {
|
|
1409
|
-
// return (String(s).substring(0, cnt))
|
|
1410
|
-
// サロゲートペアを考慮
|
|
1411
|
-
const strArray = Array.from(s);
|
|
1412
|
-
return strArray.slice(0, cnt).join('');
|
|
1413
|
-
}
|
|
1414
|
-
},
|
|
1415
|
-
'RIGHT': {
|
|
1416
|
-
type: 'func',
|
|
1417
|
-
josi: [['の', 'で'], ['だけ']],
|
|
1418
|
-
pure: true,
|
|
1419
|
-
fn: function (s, cnt, sys) {
|
|
1420
|
-
return sys.__exec('文字右部分', [s, cnt]);
|
|
1421
|
-
}
|
|
1422
|
-
},
|
|
1423
|
-
'文字右部分': {
|
|
1424
|
-
type: 'func',
|
|
1425
|
-
josi: [['の', 'で'], ['だけ', '']],
|
|
1426
|
-
pure: true,
|
|
1427
|
-
fn: function (s, cnt) {
|
|
1428
|
-
// return (s.substring(s.length - cnt, s.length))
|
|
1429
|
-
// サロゲートペアを考慮
|
|
1430
|
-
const strArray = Array.from(s);
|
|
1431
|
-
let index = strArray.length - cnt;
|
|
1432
|
-
if (index < 0) {
|
|
1433
|
-
index = 0;
|
|
1434
|
-
}
|
|
1435
|
-
return strArray.slice(index, strArray.length).join('');
|
|
1436
|
-
}
|
|
1437
|
-
},
|
|
1438
|
-
'区切': {
|
|
1439
|
-
type: 'func',
|
|
1440
|
-
josi: [['の', 'を'], ['で']],
|
|
1441
|
-
pure: true,
|
|
1442
|
-
fn: function (s, a) {
|
|
1443
|
-
return ('' + s).split('' + a);
|
|
1444
|
-
}
|
|
1445
|
-
},
|
|
1446
|
-
'文字列分割': {
|
|
1447
|
-
type: 'func',
|
|
1448
|
-
josi: [['を'], ['で']],
|
|
1449
|
-
pure: true,
|
|
1450
|
-
fn: function (s, a) {
|
|
1451
|
-
s = '' + s;
|
|
1452
|
-
a = '' + a;
|
|
1453
|
-
const i = s.indexOf(a);
|
|
1454
|
-
if (i < 0) {
|
|
1455
|
-
return [s];
|
|
1456
|
-
}
|
|
1457
|
-
return [s.substring(0, i), s.substring(i + a.length)];
|
|
1458
|
-
}
|
|
1459
|
-
},
|
|
1460
|
-
'切取': {
|
|
1461
|
-
type: 'func',
|
|
1462
|
-
josi: [['から', 'の'], ['まで', 'を']],
|
|
1463
|
-
pure: true,
|
|
1464
|
-
fn: function (s, a, sys) {
|
|
1465
|
-
s = String(s);
|
|
1466
|
-
const i = s.indexOf(a);
|
|
1467
|
-
if (i < 0) {
|
|
1468
|
-
sys.__setSysVar('対象', '');
|
|
1469
|
-
return s;
|
|
1470
|
-
}
|
|
1471
|
-
sys.__setSysVar('対象', s.substring(i + a.length));
|
|
1472
|
-
return s.substring(0, i);
|
|
1473
|
-
}
|
|
1474
|
-
},
|
|
1475
|
-
'範囲切取': {
|
|
1476
|
-
type: 'func',
|
|
1477
|
-
josi: [['で', 'の'], ['から'], ['まで', 'を']],
|
|
1478
|
-
pure: true,
|
|
1479
|
-
fn: function (s, a, b, sys) {
|
|
1480
|
-
s = String(s);
|
|
1481
|
-
let mae = '';
|
|
1482
|
-
let usiro = '';
|
|
1483
|
-
const i = s.indexOf(a);
|
|
1484
|
-
if (i < 0) {
|
|
1485
|
-
sys.__setSysVar('対象', s);
|
|
1486
|
-
return '';
|
|
1487
|
-
}
|
|
1488
|
-
mae = s.substring(0, i);
|
|
1489
|
-
const subS = s.substring(i + a.length);
|
|
1490
|
-
const j = subS.indexOf(b);
|
|
1491
|
-
if (j < 0) {
|
|
1492
|
-
sys.__setSysVar('対象', mae);
|
|
1493
|
-
return subS;
|
|
1494
|
-
}
|
|
1495
|
-
const result = subS.substring(0, j);
|
|
1496
|
-
usiro = subS.substring(j + b.length);
|
|
1497
|
-
sys.__setSysVar('対象', mae + usiro);
|
|
1498
|
-
return result;
|
|
1499
|
-
}
|
|
1500
|
-
},
|
|
1501
|
-
'文字削除': {
|
|
1502
|
-
type: 'func',
|
|
1503
|
-
josi: [['の'], ['から'], ['だけ', 'を', '']],
|
|
1504
|
-
pure: true,
|
|
1505
|
-
fn: function (s, a, b) {
|
|
1506
|
-
// サロゲートペアを考慮
|
|
1507
|
-
const strArray = Array.from(s);
|
|
1508
|
-
strArray.splice(a - 1, b);
|
|
1509
|
-
return strArray.join('');
|
|
1510
|
-
}
|
|
1511
|
-
},
|
|
1512
|
-
'文字始': {
|
|
1513
|
-
type: 'func',
|
|
1514
|
-
josi: [['が'], ['で', 'から']],
|
|
1515
|
-
pure: true,
|
|
1516
|
-
fn: function (s, a) {
|
|
1517
|
-
return s.startsWith(a);
|
|
1518
|
-
}
|
|
1519
|
-
},
|
|
1520
|
-
'文字終': {
|
|
1521
|
-
type: 'func',
|
|
1522
|
-
josi: [['が'], ['で']],
|
|
1523
|
-
pure: true,
|
|
1524
|
-
fn: function (s, a) {
|
|
1525
|
-
return s.endsWith(a);
|
|
1526
|
-
}
|
|
1527
|
-
},
|
|
1528
|
-
'出現': {
|
|
1529
|
-
type: 'func',
|
|
1530
|
-
josi: [['に', 'で'], ['が']],
|
|
1531
|
-
pure: true,
|
|
1532
|
-
fn: function (s, a) {
|
|
1533
|
-
if (typeof (s) === 'string') {
|
|
1534
|
-
return s.includes(a);
|
|
1535
|
-
}
|
|
1536
|
-
if (s instanceof Array) {
|
|
1537
|
-
return s.includes(a);
|
|
1538
|
-
}
|
|
1539
|
-
const ss = String(s);
|
|
1540
|
-
return ss.includes(a);
|
|
1541
|
-
}
|
|
1542
|
-
},
|
|
1543
|
-
// @置換・トリム
|
|
1544
|
-
'置換': {
|
|
1545
|
-
type: 'func',
|
|
1546
|
-
josi: [['の', 'で'], ['を', 'から'], ['に', 'へ']],
|
|
1547
|
-
pure: true,
|
|
1548
|
-
fn: function (s, a, b) {
|
|
1549
|
-
return String(s).split(a).join(b);
|
|
1550
|
-
}
|
|
1551
|
-
},
|
|
1552
|
-
'単置換': {
|
|
1553
|
-
type: 'func',
|
|
1554
|
-
josi: [['の', 'で'], ['を'], ['に', 'へ']],
|
|
1555
|
-
pure: true,
|
|
1556
|
-
fn: function (s, a, b) {
|
|
1557
|
-
// replaceは最初の一度だけ置換する
|
|
1558
|
-
return String(s).replace(a, b);
|
|
1559
|
-
}
|
|
1560
|
-
},
|
|
1561
|
-
'トリム': {
|
|
1562
|
-
type: 'func',
|
|
1563
|
-
josi: [['の', 'を']],
|
|
1564
|
-
pure: true,
|
|
1565
|
-
fn: function (s) {
|
|
1566
|
-
return String(s).replace(/^\s+/, '').replace(/\s+$/, '');
|
|
1567
|
-
}
|
|
1568
|
-
},
|
|
1569
|
-
'空白除去': {
|
|
1570
|
-
type: 'func',
|
|
1571
|
-
josi: [['の', 'を']],
|
|
1572
|
-
pure: true,
|
|
1573
|
-
fn: function (s) {
|
|
1574
|
-
return String(s).replace(/^\s+/, '').replace(/\s+$/, '');
|
|
1575
|
-
}
|
|
1576
|
-
},
|
|
1577
|
-
'右トリム': {
|
|
1578
|
-
type: 'func',
|
|
1579
|
-
josi: [['の', 'を']],
|
|
1580
|
-
pure: true,
|
|
1581
|
-
fn: function (s) {
|
|
1582
|
-
return String(s).replace(/\s+$/, '');
|
|
1583
|
-
}
|
|
1584
|
-
},
|
|
1585
|
-
'左トリム': {
|
|
1586
|
-
type: 'func',
|
|
1587
|
-
josi: [['の', 'を']],
|
|
1588
|
-
pure: true,
|
|
1589
|
-
fn: function (s) {
|
|
1590
|
-
return String(s).replace(/^\s+/, '');
|
|
1591
|
-
}
|
|
1592
|
-
},
|
|
1593
|
-
'末尾空白除去': {
|
|
1594
|
-
type: 'func',
|
|
1595
|
-
josi: [['の', 'を']],
|
|
1596
|
-
pure: true,
|
|
1597
|
-
fn: function (s) {
|
|
1598
|
-
return String(s).replace(/\s+$/, '');
|
|
1599
|
-
}
|
|
1600
|
-
},
|
|
1601
|
-
// @文字変換
|
|
1602
|
-
'大文字変換': {
|
|
1603
|
-
type: 'func',
|
|
1604
|
-
josi: [['の', 'を']],
|
|
1605
|
-
pure: true,
|
|
1606
|
-
fn: function (s) {
|
|
1607
|
-
return String(s).toUpperCase();
|
|
1608
|
-
}
|
|
1609
|
-
},
|
|
1610
|
-
'小文字変換': {
|
|
1611
|
-
type: 'func',
|
|
1612
|
-
josi: [['の', 'を']],
|
|
1613
|
-
pure: true,
|
|
1614
|
-
fn: function (s) {
|
|
1615
|
-
return String(s).toLowerCase();
|
|
1616
|
-
}
|
|
1617
|
-
},
|
|
1618
|
-
'平仮名変換': {
|
|
1619
|
-
type: 'func',
|
|
1620
|
-
josi: [['の', 'を']],
|
|
1621
|
-
pure: true,
|
|
1622
|
-
fn: function (s) {
|
|
1623
|
-
const kanaToHira = (str) => {
|
|
1624
|
-
return String(str).replace(/[\u30a1-\u30f6]/g, function (m) {
|
|
1625
|
-
const chr = m.charCodeAt(0) - 0x60;
|
|
1626
|
-
return String.fromCharCode(chr);
|
|
1627
|
-
});
|
|
1628
|
-
};
|
|
1629
|
-
return kanaToHira('' + s);
|
|
1630
|
-
}
|
|
1631
|
-
},
|
|
1632
|
-
'カタカナ変換': {
|
|
1633
|
-
type: 'func',
|
|
1634
|
-
josi: [['の', 'を']],
|
|
1635
|
-
pure: true,
|
|
1636
|
-
fn: function (s) {
|
|
1637
|
-
const hiraToKana = (str) => {
|
|
1638
|
-
return String(str).replace(/[\u3041-\u3096]/g, function (m) {
|
|
1639
|
-
const chr = m.charCodeAt(0) + 0x60;
|
|
1640
|
-
return String.fromCharCode(chr);
|
|
1641
|
-
});
|
|
1642
|
-
};
|
|
1643
|
-
return hiraToKana('' + s);
|
|
1644
|
-
}
|
|
1645
|
-
},
|
|
1646
|
-
'英数全角変換': {
|
|
1647
|
-
type: 'func',
|
|
1648
|
-
josi: [['の', 'を']],
|
|
1649
|
-
pure: true,
|
|
1650
|
-
fn: function (s) {
|
|
1651
|
-
return String(s).replace(/[A-Za-z0-9]/g, function (v) {
|
|
1652
|
-
return String.fromCharCode(v.charCodeAt(0) + 0xFEE0);
|
|
1653
|
-
});
|
|
1654
|
-
}
|
|
1655
|
-
},
|
|
1656
|
-
'英数半角変換': {
|
|
1657
|
-
type: 'func',
|
|
1658
|
-
josi: [['の', 'を']],
|
|
1659
|
-
pure: true,
|
|
1660
|
-
fn: function (s) {
|
|
1661
|
-
return String(s).replace(/[A-Za-z0-9]/g, function (v) {
|
|
1662
|
-
return String.fromCharCode(v.charCodeAt(0) - 0xFEE0);
|
|
1663
|
-
});
|
|
1664
|
-
}
|
|
1665
|
-
},
|
|
1666
|
-
'英数記号全角変換': {
|
|
1667
|
-
type: 'func',
|
|
1668
|
-
josi: [['の', 'を']],
|
|
1669
|
-
pure: true,
|
|
1670
|
-
fn: function (s) {
|
|
1671
|
-
return String(s).replace(/[\x20-\x7E]/g, function (v) {
|
|
1672
|
-
if (v === ' ') {
|
|
1673
|
-
return ' ';
|
|
1674
|
-
} // 半角スペース(0x20)を全角スペース(U+3000)に
|
|
1675
|
-
return String.fromCharCode(v.charCodeAt(0) + 0xFEE0);
|
|
1676
|
-
});
|
|
1677
|
-
}
|
|
1678
|
-
},
|
|
1679
|
-
'英数記号半角変換': {
|
|
1680
|
-
type: 'func',
|
|
1681
|
-
josi: [['の', 'を']],
|
|
1682
|
-
pure: true,
|
|
1683
|
-
fn: function (s) {
|
|
1684
|
-
return String(s).replace(/[\u3000\uFF00-\uFF5F]/g, function (v) {
|
|
1685
|
-
if (v === ' ') {
|
|
1686
|
-
return ' ';
|
|
1687
|
-
} // 全角スペース(U+3000)を半角スペース(U+0020)
|
|
1688
|
-
return String.fromCharCode(v.charCodeAt(0) - 0xFEE0);
|
|
1689
|
-
});
|
|
1690
|
-
}
|
|
1691
|
-
},
|
|
1692
|
-
'カタカナ全角変換': {
|
|
1693
|
-
type: 'func',
|
|
1694
|
-
josi: [['の', 'を']],
|
|
1695
|
-
pure: true,
|
|
1696
|
-
fn: function (s, sys) {
|
|
1697
|
-
// 半角カタカナ
|
|
1698
|
-
const zen1 = sys.__getSysVar('全角カナ一覧');
|
|
1699
|
-
const han1 = sys.__getSysVar('半角カナ一覧');
|
|
1700
|
-
const zen2 = sys.__getSysVar('全角カナ濁音一覧');
|
|
1701
|
-
const han2 = sys.__getSysVar('半角カナ濁音一覧');
|
|
1702
|
-
let str = '';
|
|
1703
|
-
let i = 0;
|
|
1704
|
-
while (i < s.length) {
|
|
1705
|
-
// 濁点の変換
|
|
1706
|
-
const c2 = s.substring(i, i + 2);
|
|
1707
|
-
const n2 = han2.indexOf(c2);
|
|
1708
|
-
if (n2 >= 0) {
|
|
1709
|
-
str += zen2.charAt(n2 / 2);
|
|
1710
|
-
i += 2;
|
|
1711
|
-
continue;
|
|
1712
|
-
}
|
|
1713
|
-
// 濁点以外の変換
|
|
1714
|
-
const c = s.charAt(i);
|
|
1715
|
-
const n = han1.indexOf(c);
|
|
1716
|
-
if (n >= 0) {
|
|
1717
|
-
str += zen1.charAt(n);
|
|
1718
|
-
i++;
|
|
1719
|
-
continue;
|
|
1720
|
-
}
|
|
1721
|
-
str += c;
|
|
1722
|
-
i++;
|
|
1723
|
-
}
|
|
1724
|
-
return str;
|
|
1725
|
-
}
|
|
1726
|
-
},
|
|
1727
|
-
'カタカナ半角変換': {
|
|
1728
|
-
type: 'func',
|
|
1729
|
-
josi: [['の', 'を']],
|
|
1730
|
-
pure: true,
|
|
1731
|
-
fn: function (s, sys) {
|
|
1732
|
-
// 半角カタカナ
|
|
1733
|
-
const zen1 = sys.__getSysVar('全角カナ一覧');
|
|
1734
|
-
const han1 = sys.__getSysVar('半角カナ一覧');
|
|
1735
|
-
const zen2 = sys.__getSysVar('全角カナ濁音一覧');
|
|
1736
|
-
const han2 = sys.__getSysVar('半角カナ濁音一覧');
|
|
1737
|
-
return s.split('').map((c) => {
|
|
1738
|
-
const i = zen1.indexOf(c);
|
|
1739
|
-
if (i >= 0) {
|
|
1740
|
-
return han1.charAt(i);
|
|
1741
|
-
}
|
|
1742
|
-
const j = zen2.indexOf(c);
|
|
1743
|
-
if (j >= 0) {
|
|
1744
|
-
return han2.substring(j * 2, j * 2 + 2);
|
|
1745
|
-
}
|
|
1746
|
-
return c;
|
|
1747
|
-
}).join('');
|
|
1748
|
-
}
|
|
1749
|
-
},
|
|
1750
|
-
'全角変換': {
|
|
1751
|
-
type: 'func',
|
|
1752
|
-
josi: [['の', 'を']],
|
|
1753
|
-
pure: false,
|
|
1754
|
-
fn: function (s, sys) {
|
|
1755
|
-
let result = s;
|
|
1756
|
-
result = sys.__exec('カタカナ全角変換', [result, sys]);
|
|
1757
|
-
result = sys.__exec('英数記号全角変換', [result, sys]);
|
|
1758
|
-
return result;
|
|
1759
|
-
}
|
|
1760
|
-
},
|
|
1761
|
-
'半角変換': {
|
|
1762
|
-
type: 'func',
|
|
1763
|
-
josi: [['の', 'を']],
|
|
1764
|
-
pure: false,
|
|
1765
|
-
fn: function (s, sys) {
|
|
1766
|
-
let result = s;
|
|
1767
|
-
result = sys.__exec('カタカナ半角変換', [result, sys]);
|
|
1768
|
-
result = sys.__exec('英数記号半角変換', [result, sys]);
|
|
1769
|
-
return result;
|
|
1770
|
-
}
|
|
1771
|
-
},
|
|
1772
|
-
'全角カナ一覧': { type: 'const', value: 'アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンァィゥェォャュョッ、。ー「」' }, // @ぜんかくかないちらん
|
|
1773
|
-
'全角カナ濁音一覧': { type: 'const', value: 'ガギグゲゴザジズゼゾダヂヅデドバビブベボパピプペポ' }, // @ぜんかくかなだくおんいちらん
|
|
1774
|
-
'半角カナ一覧': { type: 'const', value: 'アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンァィゥェォャュョッ、。ー「」゙゚' }, // @はんかくかないちらん
|
|
1775
|
-
'半角カナ濁音一覧': { type: 'const', value: 'ガギグゲゴザジズゼゾダヂヅデドバビブベボパピプペポ' }, // @はんかくかなだくおんいちらん
|
|
1776
|
-
// @JSON
|
|
1777
|
-
'JSON変換': {
|
|
1778
|
-
type: 'func',
|
|
1779
|
-
josi: [['を', 'の', 'から']],
|
|
1780
|
-
pure: true,
|
|
1781
|
-
fn: function (v) {
|
|
1782
|
-
return JSON.stringify(v);
|
|
1783
|
-
}
|
|
1784
|
-
},
|
|
1785
|
-
'JSON取得': {
|
|
1786
|
-
type: 'func',
|
|
1787
|
-
josi: [['を', 'の', 'から']],
|
|
1788
|
-
pure: true,
|
|
1789
|
-
fn: function (v) {
|
|
1790
|
-
return JSON.parse(v);
|
|
1791
|
-
}
|
|
1792
|
-
},
|
|
1793
|
-
'JSONエンコード': {
|
|
1794
|
-
type: 'func',
|
|
1795
|
-
josi: [['を', 'の']],
|
|
1796
|
-
pure: true,
|
|
1797
|
-
fn: function (v) {
|
|
1798
|
-
return JSON.stringify(v);
|
|
1799
|
-
}
|
|
1800
|
-
},
|
|
1801
|
-
'JSONエンコード整形': {
|
|
1802
|
-
type: 'func',
|
|
1803
|
-
josi: [['を', 'の']],
|
|
1804
|
-
pure: true,
|
|
1805
|
-
fn: function (v) {
|
|
1806
|
-
return JSON.stringify(v, null, 2);
|
|
1807
|
-
}
|
|
1808
|
-
},
|
|
1809
|
-
'JSONデコード': {
|
|
1810
|
-
type: 'func',
|
|
1811
|
-
josi: [['を', 'の', 'から']],
|
|
1812
|
-
pure: true,
|
|
1813
|
-
fn: function (s) {
|
|
1814
|
-
return JSON.parse(s);
|
|
1815
|
-
}
|
|
1816
|
-
},
|
|
1817
|
-
'JSON_E': {
|
|
1818
|
-
type: 'func',
|
|
1819
|
-
josi: [['を', 'の']],
|
|
1820
|
-
pure: true,
|
|
1821
|
-
fn: function (v) {
|
|
1822
|
-
return JSON.stringify(v);
|
|
1823
|
-
}
|
|
1824
|
-
},
|
|
1825
|
-
'JSON_ES': {
|
|
1826
|
-
type: 'func',
|
|
1827
|
-
josi: [['を', 'の']],
|
|
1828
|
-
pure: true,
|
|
1829
|
-
fn: function (v) {
|
|
1830
|
-
return JSON.stringify(v, null, 2);
|
|
1831
|
-
}
|
|
1832
|
-
},
|
|
1833
|
-
'JSON_D': {
|
|
1834
|
-
type: 'func',
|
|
1835
|
-
josi: [['を', 'の', 'から']],
|
|
1836
|
-
pure: true,
|
|
1837
|
-
fn: function (s) {
|
|
1838
|
-
return JSON.parse(s);
|
|
1839
|
-
}
|
|
1840
|
-
},
|
|
1841
|
-
// @正規表現
|
|
1842
|
-
'正規表現マッチ': {
|
|
1843
|
-
type: 'func',
|
|
1844
|
-
josi: [['を', 'が'], ['で', 'に']],
|
|
1845
|
-
pure: true,
|
|
1846
|
-
fn: function (a, b, sys) {
|
|
1847
|
-
let re;
|
|
1848
|
-
const f = ('' + b).match(/^\/(.+)\/([a-zA-Z]*)$/);
|
|
1849
|
-
// パターンがない場合
|
|
1850
|
-
if (f === null) {
|
|
1851
|
-
re = new RegExp(b, 'g');
|
|
1852
|
-
}
|
|
1853
|
-
else {
|
|
1854
|
-
re = new RegExp(f[1], f[2]);
|
|
1855
|
-
}
|
|
1856
|
-
const sa = sys.__getSysVar('抽出文字列');
|
|
1857
|
-
sa.splice(0, sa.length); // clear
|
|
1858
|
-
const m = String(a).match(re);
|
|
1859
|
-
let result = m;
|
|
1860
|
-
if (re.global) {
|
|
1861
|
-
// no groups
|
|
1862
|
-
}
|
|
1863
|
-
else if (m) {
|
|
1864
|
-
// has group?
|
|
1865
|
-
if (m.length > 0) {
|
|
1866
|
-
result = m[0];
|
|
1867
|
-
for (let i = 1; i < m.length; i++) {
|
|
1868
|
-
sa[i - 1] = m[i];
|
|
1869
|
-
}
|
|
1870
|
-
}
|
|
1871
|
-
}
|
|
1872
|
-
return result;
|
|
1873
|
-
}
|
|
1874
|
-
},
|
|
1875
|
-
'正規表現抽出': {
|
|
1876
|
-
type: 'func',
|
|
1877
|
-
josi: [['から', 'を'], ['で']],
|
|
1878
|
-
pure: true,
|
|
1879
|
-
fn: function (a, b, sys) {
|
|
1880
|
-
let pattern = '' + b;
|
|
1881
|
-
let flags = 'g';
|
|
1882
|
-
const f = pattern.match(/^\/(.+)\/([a-zA-Z]*)$/);
|
|
1883
|
-
if (f) {
|
|
1884
|
-
pattern = f[1];
|
|
1885
|
-
flags = f[2] || '';
|
|
1886
|
-
}
|
|
1887
|
-
if (!flags.includes('g'))
|
|
1888
|
-
flags += 'g';
|
|
1889
|
-
const re = new RegExp(pattern, flags);
|
|
1890
|
-
const sa = sys.__getSysVar('抽出文字列');
|
|
1891
|
-
sa.splice(0, sa.length); // clear
|
|
1892
|
-
const result = []; // 一次元配列
|
|
1893
|
-
const caps2d = []; // 二次元配列(sa に入れる)
|
|
1894
|
-
for (const m of String(a).matchAll(re)) {
|
|
1895
|
-
// ★ 名前付きキャプチャがある場合
|
|
1896
|
-
if (m.groups && Object.keys(m.groups).length > 0) {
|
|
1897
|
-
const row = {};
|
|
1898
|
-
for (const [key, val] of Object.entries(m.groups)) {
|
|
1899
|
-
row[key] = val;
|
|
1900
|
-
result.push(val); // result は平坦化
|
|
1901
|
-
}
|
|
1902
|
-
caps2d.push(row);
|
|
1903
|
-
continue;
|
|
1904
|
-
}
|
|
1905
|
-
// ★ 通常キャプチャ(従来どおり)
|
|
1906
|
-
let caps = [...m].slice(1);
|
|
1907
|
-
if (caps.length === 0) {
|
|
1908
|
-
caps = [m[0]]; //キャプチャがない場合
|
|
1909
|
-
}
|
|
1910
|
-
caps2d.push(caps);
|
|
1911
|
-
result.push(...caps);
|
|
1912
|
-
}
|
|
1913
|
-
// マッチなし → 両方空のまま
|
|
1914
|
-
if (caps2d.length === 0) {
|
|
1915
|
-
return result;
|
|
1916
|
-
}
|
|
1917
|
-
// sa に二次元配列をコピー
|
|
1918
|
-
for (const row of caps2d) {
|
|
1919
|
-
sa.push(row);
|
|
1920
|
-
}
|
|
1921
|
-
return result;
|
|
1922
|
-
}
|
|
1923
|
-
},
|
|
1924
|
-
'抽出文字列': { type: 'const', value: [] }, // @ちゅうしゅつもじれつ
|
|
1925
|
-
'正規表現置換': {
|
|
1926
|
-
type: 'func',
|
|
1927
|
-
josi: [['の'], ['を', 'から'], ['で', 'に', 'へ']],
|
|
1928
|
-
pure: true,
|
|
1929
|
-
fn: function (s, a, b) {
|
|
1930
|
-
let re;
|
|
1931
|
-
const f = a.match(/^\/(.+)\/([a-zA-Z]*)/);
|
|
1932
|
-
if (f === null) {
|
|
1933
|
-
re = new RegExp(a, 'g');
|
|
1934
|
-
}
|
|
1935
|
-
else {
|
|
1936
|
-
re = new RegExp(f[1], f[2]);
|
|
1937
|
-
}
|
|
1938
|
-
return String(s).replace(re, b);
|
|
1939
|
-
}
|
|
1940
|
-
},
|
|
1941
|
-
'正規表現区切': {
|
|
1942
|
-
type: 'func',
|
|
1943
|
-
josi: [['を'], ['で']],
|
|
1944
|
-
pure: true,
|
|
1945
|
-
fn: function (s, a) {
|
|
1946
|
-
let re;
|
|
1947
|
-
const f = a.match(/^\/(.+)\/([a-zA-Z]*)/);
|
|
1948
|
-
if (f === null) {
|
|
1949
|
-
re = new RegExp(a, 'g');
|
|
1950
|
-
}
|
|
1951
|
-
else {
|
|
1952
|
-
re = new RegExp(f[1], f[2]);
|
|
1953
|
-
}
|
|
1954
|
-
return String(s).split(re);
|
|
1955
|
-
}
|
|
1956
|
-
},
|
|
1957
|
-
// @指定形式
|
|
1958
|
-
'通貨形式': {
|
|
1959
|
-
type: 'func',
|
|
1960
|
-
josi: [['を', 'の']],
|
|
1961
|
-
pure: true,
|
|
1962
|
-
fn: function (v) {
|
|
1963
|
-
return String(v).replace(/(?<!\.\d*?)(\d)(?=(\d\d\d)+(?!\d))/g, '$1,');
|
|
1964
|
-
}
|
|
1965
|
-
},
|
|
1966
|
-
'ゼロ埋': {
|
|
1967
|
-
type: 'func',
|
|
1968
|
-
josi: [['を'], ['で']],
|
|
1969
|
-
pure: true,
|
|
1970
|
-
fn: function (v, a) {
|
|
1971
|
-
v = String(v);
|
|
1972
|
-
let z = '0';
|
|
1973
|
-
for (let i = 0; i < a; i++) {
|
|
1974
|
-
z += '0';
|
|
1975
|
-
}
|
|
1976
|
-
a = parseInt(a);
|
|
1977
|
-
if (a < v.length) {
|
|
1978
|
-
a = v.length;
|
|
1979
|
-
}
|
|
1980
|
-
const s = z + String(v);
|
|
1981
|
-
return s.substring(s.length - a, s.length);
|
|
1982
|
-
}
|
|
1983
|
-
},
|
|
1984
|
-
'空白埋': {
|
|
1985
|
-
type: 'func',
|
|
1986
|
-
josi: [['を'], ['で']],
|
|
1987
|
-
pure: true,
|
|
1988
|
-
fn: function (v, a) {
|
|
1989
|
-
v = String(v);
|
|
1990
|
-
let z = ' ';
|
|
1991
|
-
for (let i = 0; i < a; i++) {
|
|
1992
|
-
z += ' ';
|
|
1993
|
-
}
|
|
1994
|
-
a = parseInt(a);
|
|
1995
|
-
if (a < v.length) {
|
|
1996
|
-
a = v.length;
|
|
1997
|
-
}
|
|
1998
|
-
const s = z + String(v);
|
|
1999
|
-
return s.substring(s.length - a, s.length);
|
|
2000
|
-
}
|
|
2001
|
-
},
|
|
2002
|
-
// @文字種類
|
|
2003
|
-
'かなか判定': {
|
|
2004
|
-
type: 'func',
|
|
2005
|
-
josi: [['を', 'の', 'が']],
|
|
2006
|
-
pure: true,
|
|
2007
|
-
fn: function (s) {
|
|
2008
|
-
const c = String(s).charCodeAt(0);
|
|
2009
|
-
return (c >= 0x3041 && c <= 0x309F);
|
|
2010
|
-
}
|
|
2011
|
-
},
|
|
2012
|
-
'カタカナ判定': {
|
|
2013
|
-
type: 'func',
|
|
2014
|
-
josi: [['を', 'の', 'が']],
|
|
2015
|
-
pure: true,
|
|
2016
|
-
fn: function (s) {
|
|
2017
|
-
const c = String(s).charCodeAt(0);
|
|
2018
|
-
return (c >= 0x30A1 && c <= 0x30FA);
|
|
2019
|
-
}
|
|
2020
|
-
},
|
|
2021
|
-
'数字判定': {
|
|
2022
|
-
type: 'func',
|
|
2023
|
-
josi: [['を', 'が']],
|
|
2024
|
-
pure: true,
|
|
2025
|
-
fn: function (s) {
|
|
2026
|
-
const c = String(s).charAt(0);
|
|
2027
|
-
return ((c >= '0' && c <= '9') || (c >= '0' && c <= '9'));
|
|
2028
|
-
}
|
|
2029
|
-
},
|
|
2030
|
-
'数列判定': {
|
|
2031
|
-
type: 'func',
|
|
2032
|
-
josi: [['を', 'が']],
|
|
2033
|
-
pure: true,
|
|
2034
|
-
fn: function (s) {
|
|
2035
|
-
const checkerRE = /^[+\-+-]?([0-90-9]*)(([..][0-90-9]+)?|([..][0-90-9]+[eEeE][+\-+-]?[0-90-9]+)?)$/;
|
|
2036
|
-
if (s === '') {
|
|
2037
|
-
return false;
|
|
2038
|
-
} // 空文字列はfalse
|
|
2039
|
-
return String(s).match(checkerRE) !== null;
|
|
2040
|
-
}
|
|
2041
|
-
},
|
|
2042
|
-
// @配列操作
|
|
2043
|
-
'配列結合': {
|
|
2044
|
-
type: 'func',
|
|
2045
|
-
josi: [['を'], ['で']],
|
|
2046
|
-
pure: true,
|
|
2047
|
-
fn: function (a, s) {
|
|
2048
|
-
// 配列ならOK
|
|
2049
|
-
if (a instanceof Array) {
|
|
2050
|
-
return a.join('' + s);
|
|
2051
|
-
}
|
|
2052
|
-
const a2 = String(a).split('\n'); // 配列でなければ無理矢理改行で区切ってみる
|
|
2053
|
-
return a2.join('' + s);
|
|
2054
|
-
}
|
|
2055
|
-
},
|
|
2056
|
-
'配列只結合': {
|
|
2057
|
-
type: 'func',
|
|
2058
|
-
josi: [['を']],
|
|
2059
|
-
pure: true,
|
|
2060
|
-
fn: function (a) {
|
|
2061
|
-
if (a instanceof Array) {
|
|
2062
|
-
return a.join('');
|
|
2063
|
-
}
|
|
2064
|
-
const a2 = String(a).split('\n'); // 配列でなければ無理矢理改行で区切ってみる
|
|
2065
|
-
return a2.join('');
|
|
2066
|
-
}
|
|
2067
|
-
},
|
|
2068
|
-
'配列検索': {
|
|
2069
|
-
type: 'func',
|
|
2070
|
-
josi: [['の', 'から'], ['を']],
|
|
2071
|
-
pure: true,
|
|
2072
|
-
fn: function (a, s) {
|
|
2073
|
-
if (a instanceof Array) {
|
|
2074
|
-
return a.indexOf(s);
|
|
2075
|
-
} // 配列ならOK
|
|
2076
|
-
return -1;
|
|
2077
|
-
}
|
|
2078
|
-
},
|
|
2079
|
-
'配列要素数': {
|
|
2080
|
-
type: 'func',
|
|
2081
|
-
josi: [['の']],
|
|
2082
|
-
pure: true,
|
|
2083
|
-
fn: function (a) {
|
|
2084
|
-
if (a instanceof Array) {
|
|
2085
|
-
return a.length;
|
|
2086
|
-
} // 配列ならOK
|
|
2087
|
-
if (a instanceof Object) {
|
|
2088
|
-
return Object.keys(a).length;
|
|
2089
|
-
} // オブジェクト
|
|
2090
|
-
if (typeof a === 'string') {
|
|
2091
|
-
return String(a).length;
|
|
2092
|
-
} // 文字列
|
|
2093
|
-
return 1;
|
|
2094
|
-
}
|
|
2095
|
-
},
|
|
2096
|
-
'要素数': {
|
|
2097
|
-
type: 'func',
|
|
2098
|
-
josi: [['の']],
|
|
2099
|
-
pure: true,
|
|
2100
|
-
fn: function (a, sys) {
|
|
2101
|
-
return sys.__exec('配列要素数', [a]);
|
|
2102
|
-
}
|
|
2103
|
-
},
|
|
2104
|
-
'LEN': {
|
|
2105
|
-
type: 'func',
|
|
2106
|
-
josi: [['の']],
|
|
2107
|
-
pure: true,
|
|
2108
|
-
fn: function (a, sys) {
|
|
2109
|
-
return sys.__exec('配列要素数', [a]);
|
|
2110
|
-
}
|
|
2111
|
-
},
|
|
2112
|
-
'配列挿入': {
|
|
2113
|
-
type: 'func',
|
|
2114
|
-
josi: [['の'], ['に', 'へ'], ['を']],
|
|
2115
|
-
pure: true,
|
|
2116
|
-
fn: function (a, i, s) {
|
|
2117
|
-
if (a instanceof Array) {
|
|
2118
|
-
return a.splice(i, 0, s);
|
|
2119
|
-
} // 配列ならOK
|
|
2120
|
-
throw new Error('『配列挿入』で配列以外の要素への挿入。');
|
|
2121
|
-
}
|
|
2122
|
-
},
|
|
2123
|
-
'配列一括挿入': {
|
|
2124
|
-
type: 'func',
|
|
2125
|
-
josi: [['の'], ['に', 'へ'], ['を']],
|
|
2126
|
-
pure: true,
|
|
2127
|
-
fn: function (a, i, b) {
|
|
2128
|
-
if (a instanceof Array && b instanceof Array) { // 配列ならOK
|
|
2129
|
-
for (let j = 0; j < b.length; j++) {
|
|
2130
|
-
a.splice(i + j, 0, b[j]);
|
|
2131
|
-
}
|
|
2132
|
-
return a;
|
|
2133
|
-
}
|
|
2134
|
-
throw new Error('『配列一括挿入』で配列以外の要素への挿入。');
|
|
2135
|
-
}
|
|
2136
|
-
},
|
|
2137
|
-
'配列ソート': {
|
|
2138
|
-
type: 'func',
|
|
2139
|
-
josi: [['の', 'を']],
|
|
2140
|
-
pure: true,
|
|
2141
|
-
fn: function (a) {
|
|
2142
|
-
if (a instanceof Array) {
|
|
2143
|
-
return a.sort();
|
|
2144
|
-
} // 配列ならOK
|
|
2145
|
-
throw new Error('『配列ソート』で配列以外が指定されました。');
|
|
2146
|
-
}
|
|
2147
|
-
},
|
|
2148
|
-
'配列数値変換': {
|
|
2149
|
-
type: 'func',
|
|
2150
|
-
josi: [['の', 'を']],
|
|
2151
|
-
pure: true,
|
|
2152
|
-
fn: function (a) {
|
|
2153
|
-
// 配列ならOK
|
|
2154
|
-
if (a instanceof Array) {
|
|
2155
|
-
for (let i = 0; i < a.length; i++) {
|
|
2156
|
-
a[i] = parseFloat(a[i]);
|
|
2157
|
-
}
|
|
2158
|
-
return a;
|
|
2159
|
-
}
|
|
2160
|
-
throw new Error('『配列数値変換』で配列以外が指定されました。');
|
|
2161
|
-
}
|
|
2162
|
-
},
|
|
2163
|
-
'配列数値ソート': {
|
|
2164
|
-
type: 'func',
|
|
2165
|
-
josi: [['の', 'を']],
|
|
2166
|
-
pure: true,
|
|
2167
|
-
fn: function (a) {
|
|
2168
|
-
// 配列ならOK
|
|
2169
|
-
if (a instanceof Array) {
|
|
2170
|
-
return a.sort((a, b) => {
|
|
2171
|
-
return parseFloat(a) - parseFloat(b);
|
|
2172
|
-
});
|
|
2173
|
-
}
|
|
2174
|
-
throw new Error('『配列数値ソート』で配列以外が指定されました。');
|
|
2175
|
-
}
|
|
2176
|
-
},
|
|
2177
|
-
'配列カスタムソート': {
|
|
2178
|
-
type: 'func',
|
|
2179
|
-
josi: [['で'], ['の', 'を']],
|
|
2180
|
-
pure: false,
|
|
2181
|
-
fn: function (f, a, sys) {
|
|
2182
|
-
let ufunc = f;
|
|
2183
|
-
if (typeof f === 'string') {
|
|
2184
|
-
ufunc = sys.__findFunc(f, '配列カスタムソート');
|
|
2185
|
-
}
|
|
2186
|
-
if (a instanceof Array) {
|
|
2187
|
-
return a.sort(ufunc);
|
|
2188
|
-
}
|
|
2189
|
-
throw new Error('『配列カスタムソート』で配列以外が指定されました。');
|
|
2190
|
-
}
|
|
2191
|
-
},
|
|
2192
|
-
'配列逆順': {
|
|
2193
|
-
type: 'func',
|
|
2194
|
-
josi: [['の', 'を']],
|
|
2195
|
-
pure: true,
|
|
2196
|
-
fn: function (a) {
|
|
2197
|
-
if (a instanceof Array) {
|
|
2198
|
-
return a.reverse();
|
|
2199
|
-
} // 配列ならOK
|
|
2200
|
-
throw new Error('『配列ソート』で配列以外が指定されました。');
|
|
2201
|
-
}
|
|
2202
|
-
},
|
|
2203
|
-
'配列シャッフル': {
|
|
2204
|
-
type: 'func',
|
|
2205
|
-
josi: [['の', 'を']],
|
|
2206
|
-
pure: true,
|
|
2207
|
-
fn: function (a) {
|
|
2208
|
-
if (a instanceof Array) { // 配列ならOK
|
|
2209
|
-
for (let i = a.length - 1; i > 0; i--) {
|
|
2210
|
-
const r = Math.floor(Math.random() * (i + 1));
|
|
2211
|
-
const tmp = a[i];
|
|
2212
|
-
a[i] = a[r];
|
|
2213
|
-
a[r] = tmp;
|
|
2214
|
-
}
|
|
2215
|
-
return a;
|
|
2216
|
-
}
|
|
2217
|
-
throw new Error('『配列シャッフル』で配列以外が指定されました。');
|
|
2218
|
-
}
|
|
2219
|
-
},
|
|
2220
|
-
'配列削除': {
|
|
2221
|
-
type: 'func',
|
|
2222
|
-
josi: [['の', 'から'], ['を']],
|
|
2223
|
-
pure: true,
|
|
2224
|
-
fn: function (a, i, sys) {
|
|
2225
|
-
return sys.__exec('配列切取', [a, i, sys]);
|
|
2226
|
-
}
|
|
2227
|
-
},
|
|
2228
|
-
'配列切取': {
|
|
2229
|
-
type: 'func',
|
|
2230
|
-
josi: [['の', 'から'], ['を']],
|
|
2231
|
-
pure: true,
|
|
2232
|
-
fn: function (a, i) {
|
|
2233
|
-
// 配列変数のとき
|
|
2234
|
-
if (a instanceof Array) {
|
|
2235
|
-
if (typeof i === 'number') {
|
|
2236
|
-
const b = a.splice(i, 1);
|
|
2237
|
-
if (b instanceof Array) {
|
|
2238
|
-
return b[0];
|
|
2239
|
-
} // 切り取った戻り値は必ずArrayになるので。
|
|
2240
|
-
}
|
|
2241
|
-
if (typeof i === 'object' && typeof i['先頭'] === 'number') {
|
|
2242
|
-
const idx = i['先頭'];
|
|
2243
|
-
const cnt = i['末尾'] - i['先頭'] + 1;
|
|
2244
|
-
return a.splice(idx, cnt);
|
|
2245
|
-
}
|
|
2246
|
-
return null;
|
|
2247
|
-
}
|
|
2248
|
-
// 辞書型変数のとき
|
|
2249
|
-
if (a instanceof Object && typeof (i) === 'string') { // 辞書型変数も許容
|
|
2250
|
-
if (a[i]) {
|
|
2251
|
-
const old = a[i];
|
|
2252
|
-
delete a[i];
|
|
2253
|
-
return old;
|
|
2254
|
-
}
|
|
2255
|
-
return undefined;
|
|
2256
|
-
}
|
|
2257
|
-
throw new Error('『配列切取』で配列以外を指定。');
|
|
2258
|
-
}
|
|
2259
|
-
},
|
|
2260
|
-
'配列取出': {
|
|
2261
|
-
type: 'func',
|
|
2262
|
-
josi: [['の'], ['から'], ['を']],
|
|
2263
|
-
pure: true,
|
|
2264
|
-
fn: function (a, i, cnt) {
|
|
2265
|
-
if (a instanceof Array) {
|
|
2266
|
-
return a.splice(i, cnt);
|
|
2267
|
-
}
|
|
2268
|
-
throw new Error('『配列取出』で配列以外を指定。');
|
|
2269
|
-
}
|
|
2270
|
-
},
|
|
2271
|
-
'配列ポップ': {
|
|
2272
|
-
type: 'func',
|
|
2273
|
-
josi: [['の', 'から']],
|
|
2274
|
-
pure: true,
|
|
2275
|
-
fn: function (a) {
|
|
2276
|
-
if (a instanceof Array) {
|
|
2277
|
-
return a.pop();
|
|
2278
|
-
}
|
|
2279
|
-
throw new Error('『配列ポップ』で配列以外の処理。');
|
|
2280
|
-
}
|
|
2281
|
-
},
|
|
2282
|
-
'配列プッシュ': {
|
|
2283
|
-
type: 'func',
|
|
2284
|
-
josi: [['に', 'へ'], ['を']],
|
|
2285
|
-
pure: true,
|
|
2286
|
-
fn: function (a, b, sys) {
|
|
2287
|
-
return sys.__exec('配列追加', [a, b, sys]);
|
|
2288
|
-
}
|
|
2289
|
-
},
|
|
2290
|
-
'配列追加': {
|
|
2291
|
-
type: 'func',
|
|
2292
|
-
josi: [['に', 'へ'], ['を']],
|
|
2293
|
-
pure: true,
|
|
2294
|
-
fn: function (a, b) {
|
|
2295
|
-
if (a instanceof Array) { // 配列ならOK
|
|
2296
|
-
a.push(b);
|
|
2297
|
-
return a;
|
|
2298
|
-
}
|
|
2299
|
-
throw new Error('『配列追加』で配列以外の処理。');
|
|
2300
|
-
}
|
|
2301
|
-
},
|
|
2302
|
-
'配列複製': {
|
|
2303
|
-
type: 'func',
|
|
2304
|
-
josi: [['を']],
|
|
2305
|
-
pure: true,
|
|
2306
|
-
fn: function (a) {
|
|
2307
|
-
return JSON.parse(JSON.stringify(a));
|
|
2308
|
-
}
|
|
2309
|
-
},
|
|
2310
|
-
'配列範囲コピー': {
|
|
2311
|
-
type: 'func',
|
|
2312
|
-
josi: [['の', 'から'], ['を']],
|
|
2313
|
-
pure: true,
|
|
2314
|
-
fn: function (a, i) {
|
|
2315
|
-
if (!Array.isArray(a)) {
|
|
2316
|
-
throw new Error('『配列範囲コピー』で配列以外の値が指定されました。');
|
|
2317
|
-
}
|
|
2318
|
-
if (typeof i === 'number') {
|
|
2319
|
-
if (typeof a[i] === 'object') {
|
|
2320
|
-
return JSON.parse(JSON.stringify(a[i]));
|
|
2321
|
-
}
|
|
2322
|
-
return a[i];
|
|
2323
|
-
}
|
|
2324
|
-
// 範囲オブジェクトのとき
|
|
2325
|
-
if (typeof i === 'object' && typeof i['先頭'] === 'number') {
|
|
2326
|
-
const start = i['先頭'];
|
|
2327
|
-
const last = Number(i['末尾']) + 1;
|
|
2328
|
-
return JSON.parse(JSON.stringify(a.slice(start, last)));
|
|
2329
|
-
}
|
|
2330
|
-
return undefined;
|
|
2331
|
-
}
|
|
2332
|
-
},
|
|
2333
|
-
'参照': {
|
|
2334
|
-
type: 'func',
|
|
2335
|
-
josi: [['から', 'の'], ['を']],
|
|
2336
|
-
pure: true,
|
|
2337
|
-
fn: function (a, i, sys) {
|
|
2338
|
-
// 文字列のとき
|
|
2339
|
-
if (typeof a === 'string') {
|
|
2340
|
-
if (typeof i === 'number') {
|
|
2341
|
-
return a.charAt(i);
|
|
2342
|
-
}
|
|
2343
|
-
// 範囲オブジェクトのとき
|
|
2344
|
-
if (typeof i === 'object' && typeof i['先頭'] === 'number') {
|
|
2345
|
-
const start = i['先頭'];
|
|
2346
|
-
const last = Number(i['末尾']) + 1;
|
|
2347
|
-
return a.substring(start, last);
|
|
2348
|
-
}
|
|
2349
|
-
throw new Error(`『参照』で文字列型の範囲指定(${JSON.stringify(i)})が不正です。`);
|
|
2350
|
-
}
|
|
2351
|
-
// 配列型のとき
|
|
2352
|
-
if (Array.isArray(a)) {
|
|
2353
|
-
if (typeof i === 'number') {
|
|
2354
|
-
return a[i];
|
|
2355
|
-
}
|
|
2356
|
-
// 範囲オブジェクトのとき
|
|
2357
|
-
if (typeof i === 'object' && typeof i['先頭'] === 'number') {
|
|
2358
|
-
const start = i['先頭'];
|
|
2359
|
-
const last = Number(i['末尾']) + 1;
|
|
2360
|
-
return a.slice(start, last);
|
|
2361
|
-
}
|
|
2362
|
-
}
|
|
2363
|
-
// 辞書型のとき
|
|
2364
|
-
if (typeof a === 'object') {
|
|
2365
|
-
return a[i];
|
|
2366
|
-
}
|
|
2367
|
-
throw new Error('『参照』で文字列/配列/辞書型以外の値が指定されました。');
|
|
2368
|
-
}
|
|
2369
|
-
},
|
|
2370
|
-
'配列参照': {
|
|
2371
|
-
type: 'func',
|
|
2372
|
-
josi: [['の', 'から'], ['を']],
|
|
2373
|
-
pure: true,
|
|
2374
|
-
fn: function (a, i, sys) {
|
|
2375
|
-
return sys.__exec('参照', [a, i, sys]);
|
|
2376
|
-
}
|
|
2377
|
-
},
|
|
2378
|
-
'配列足': {
|
|
2379
|
-
type: 'func',
|
|
2380
|
-
josi: [['に', 'へ', 'と'], ['を']],
|
|
2381
|
-
pure: true,
|
|
2382
|
-
fn: function (a, b) {
|
|
2383
|
-
if (a instanceof Array) {
|
|
2384
|
-
return a.concat(b);
|
|
2385
|
-
}
|
|
2386
|
-
return JSON.parse(JSON.stringify(a));
|
|
2387
|
-
}
|
|
2388
|
-
},
|
|
2389
|
-
'配列最大値': {
|
|
2390
|
-
type: 'func',
|
|
2391
|
-
josi: [['の']],
|
|
2392
|
-
pure: true,
|
|
2393
|
-
fn: function (a) {
|
|
2394
|
-
return a.reduce((x, y) => Math.max(x, y));
|
|
2395
|
-
}
|
|
2396
|
-
},
|
|
2397
|
-
'配列最小値': {
|
|
2398
|
-
type: 'func',
|
|
2399
|
-
josi: [['の']],
|
|
2400
|
-
pure: true,
|
|
2401
|
-
fn: function (a) {
|
|
2402
|
-
return a.reduce((x, y) => Math.min(x, y));
|
|
2403
|
-
}
|
|
2404
|
-
},
|
|
2405
|
-
'配列合計': {
|
|
2406
|
-
type: 'func',
|
|
2407
|
-
josi: [['の']],
|
|
2408
|
-
pure: true,
|
|
2409
|
-
fn: function (a) {
|
|
2410
|
-
if (a instanceof Array) {
|
|
2411
|
-
let v = 0;
|
|
2412
|
-
a.forEach((n) => {
|
|
2413
|
-
const nn = parseFloat(n);
|
|
2414
|
-
if (isNaN(nn)) {
|
|
2415
|
-
return;
|
|
2416
|
-
}
|
|
2417
|
-
v += nn;
|
|
2418
|
-
});
|
|
2419
|
-
return v;
|
|
2420
|
-
}
|
|
2421
|
-
throw new Error('『配列合計』で配列変数以外の値が指定されました。');
|
|
2422
|
-
}
|
|
2423
|
-
},
|
|
2424
|
-
'配列入替': {
|
|
2425
|
-
type: 'func',
|
|
2426
|
-
josi: [['の'], ['と'], ['を']],
|
|
2427
|
-
pure: true,
|
|
2428
|
-
fn: function (a, i, j) {
|
|
2429
|
-
if (!(a instanceof Array)) {
|
|
2430
|
-
throw new Error('『配列入替』の第1引数には配列を指定してください。');
|
|
2431
|
-
}
|
|
2432
|
-
const tmp = a[i];
|
|
2433
|
-
a[i] = a[j];
|
|
2434
|
-
a[j] = tmp;
|
|
2435
|
-
return a;
|
|
2436
|
-
}
|
|
2437
|
-
},
|
|
2438
|
-
'配列連番作成': {
|
|
2439
|
-
type: 'func',
|
|
2440
|
-
josi: [['から'], ['までの', 'まで', 'の']],
|
|
2441
|
-
pure: true,
|
|
2442
|
-
fn: function (a, b) {
|
|
2443
|
-
const result = [];
|
|
2444
|
-
for (let i = a; i <= b; i++) {
|
|
2445
|
-
result.push(i);
|
|
2446
|
-
}
|
|
2447
|
-
return result;
|
|
2448
|
-
}
|
|
2449
|
-
},
|
|
2450
|
-
'配列要素作成': {
|
|
2451
|
-
type: 'func',
|
|
2452
|
-
josi: [['を'], ['だけ', 'で']],
|
|
2453
|
-
pure: true,
|
|
2454
|
-
fn: function (a, b) {
|
|
2455
|
-
// value が配列やオブジェクトでも深くコピーするヘルパー
|
|
2456
|
-
const cloneValue = (v) => {
|
|
2457
|
-
if (Array.isArray(v)) {
|
|
2458
|
-
return (v).map(item => cloneValue(item));
|
|
2459
|
-
}
|
|
2460
|
-
if (v instanceof Date) {
|
|
2461
|
-
return new Date(v.getTime());
|
|
2462
|
-
}
|
|
2463
|
-
if (typeof v === 'object' && v !== null) {
|
|
2464
|
-
return JSON.parse(JSON.stringify(v));
|
|
2465
|
-
}
|
|
2466
|
-
return v;
|
|
2467
|
-
};
|
|
2468
|
-
// 再帰的に配列を生成する関数
|
|
2469
|
-
const full = function (value, shape) {
|
|
2470
|
-
// 1次元:shape が数値
|
|
2471
|
-
if (!Array.isArray(shape)) {
|
|
2472
|
-
return Array.from({ length: shape }, () => cloneValue(value));
|
|
2473
|
-
}
|
|
2474
|
-
// 1次元:shape が数値
|
|
2475
|
-
if (Array.isArray(shape) && shape.length === 1) {
|
|
2476
|
-
return Array.from({ length: shape[0] }, () => cloneValue(value));
|
|
2477
|
-
}
|
|
2478
|
-
// 多次元:shape が配列
|
|
2479
|
-
const [first, ...rest] = shape;
|
|
2480
|
-
return Array.from({ length: first }, () => full(cloneValue(value), rest));
|
|
2481
|
-
};
|
|
2482
|
-
return full(a, b);
|
|
2483
|
-
}
|
|
2484
|
-
},
|
|
2485
|
-
'配列関数適用': {
|
|
2486
|
-
type: 'func',
|
|
2487
|
-
josi: [['を'], ['へ', 'に']],
|
|
2488
|
-
pure: true,
|
|
2489
|
-
fn: function (f, a, sys) {
|
|
2490
|
-
let ufunc = f;
|
|
2491
|
-
if (typeof f === 'string') {
|
|
2492
|
-
ufunc = sys.__findFunc(f, '配列関数適用');
|
|
2493
|
-
}
|
|
2494
|
-
const result = [];
|
|
2495
|
-
for (const e of a) {
|
|
2496
|
-
result.push(ufunc(e));
|
|
2497
|
-
}
|
|
2498
|
-
return result;
|
|
2499
|
-
}
|
|
2500
|
-
},
|
|
2501
|
-
'配列マップ': {
|
|
2502
|
-
type: 'func',
|
|
2503
|
-
josi: [['を'], ['へ', 'に']],
|
|
2504
|
-
pure: true,
|
|
2505
|
-
fn: function (f, a, sys) {
|
|
2506
|
-
return sys.__exec('配列関数適用', [f, a, sys]);
|
|
2507
|
-
}
|
|
2508
|
-
},
|
|
2509
|
-
'配列フィルタ': {
|
|
2510
|
-
type: 'func',
|
|
2511
|
-
josi: [['で', 'の'], ['を', 'について']],
|
|
2512
|
-
pure: true,
|
|
2513
|
-
fn: function (f, a, sys) {
|
|
2514
|
-
let ufunc = f;
|
|
2515
|
-
if (typeof f === 'string') {
|
|
2516
|
-
ufunc = sys.__findFunc(f, '配列フィルタ');
|
|
2517
|
-
}
|
|
2518
|
-
const result = [];
|
|
2519
|
-
for (const e of a) {
|
|
2520
|
-
if (ufunc(e)) {
|
|
2521
|
-
result.push(e);
|
|
2522
|
-
}
|
|
2523
|
-
}
|
|
2524
|
-
return result;
|
|
2525
|
-
}
|
|
2526
|
-
},
|
|
2527
|
-
// @二次元配列処理
|
|
2528
|
-
'表ソート': {
|
|
2529
|
-
type: 'func',
|
|
2530
|
-
josi: [['の'], ['を']],
|
|
2531
|
-
pure: true,
|
|
2532
|
-
fn: function (a, no) {
|
|
2533
|
-
if (!(a instanceof Array)) {
|
|
2534
|
-
throw new Error('『表ソート』には配列を指定する必要があります。');
|
|
2535
|
-
}
|
|
2536
|
-
a.sort((n, m) => {
|
|
2537
|
-
const ns = n[no];
|
|
2538
|
-
const ms = m[no];
|
|
2539
|
-
if (ns === ms) {
|
|
2540
|
-
return 0;
|
|
2541
|
-
}
|
|
2542
|
-
else if (ns < ms) {
|
|
2543
|
-
return -1;
|
|
2544
|
-
}
|
|
2545
|
-
else {
|
|
2546
|
-
return 1;
|
|
2547
|
-
}
|
|
2548
|
-
});
|
|
2549
|
-
return a;
|
|
2550
|
-
}
|
|
2551
|
-
},
|
|
2552
|
-
'表数値ソート': {
|
|
2553
|
-
type: 'func',
|
|
2554
|
-
josi: [['の'], ['を']],
|
|
2555
|
-
pure: true,
|
|
2556
|
-
fn: function (a, no) {
|
|
2557
|
-
if (!(a instanceof Array)) {
|
|
2558
|
-
throw new Error('『表数値ソート』には配列を指定する必要があります。');
|
|
2559
|
-
}
|
|
2560
|
-
a.sort((n, m) => {
|
|
2561
|
-
const ns = n[no];
|
|
2562
|
-
const ms = m[no];
|
|
2563
|
-
return ns - ms;
|
|
2564
|
-
});
|
|
2565
|
-
return a;
|
|
2566
|
-
}
|
|
2567
|
-
},
|
|
2568
|
-
'表ピックアップ': {
|
|
2569
|
-
type: 'func',
|
|
2570
|
-
josi: [['の'], ['から'], ['を', 'で']],
|
|
2571
|
-
pure: true,
|
|
2572
|
-
fn: function (a, no, s) {
|
|
2573
|
-
if (!(a instanceof Array)) {
|
|
2574
|
-
throw new Error('『表ピックアップ』には配列を指定する必要があります。');
|
|
2575
|
-
}
|
|
2576
|
-
return a.filter((row) => String(row[no]).indexOf(s) >= 0);
|
|
2577
|
-
}
|
|
2578
|
-
},
|
|
2579
|
-
'表完全一致ピックアップ': {
|
|
2580
|
-
type: 'func',
|
|
2581
|
-
josi: [['の'], ['から'], ['を', 'で']],
|
|
2582
|
-
pure: true,
|
|
2583
|
-
fn: function (a, no, s) {
|
|
2584
|
-
if (!(a instanceof Array)) {
|
|
2585
|
-
throw new Error('『表完全ピックアップ』には配列を指定する必要があります。');
|
|
2586
|
-
}
|
|
2587
|
-
return a.filter((row) => row[no] === s);
|
|
2588
|
-
}
|
|
2589
|
-
},
|
|
2590
|
-
'表検索': {
|
|
2591
|
-
type: 'func',
|
|
2592
|
-
josi: [['の'], ['で', 'に'], ['から'], ['を']],
|
|
2593
|
-
pure: true,
|
|
2594
|
-
fn: function (a, col, row, s) {
|
|
2595
|
-
if (!(a instanceof Array)) {
|
|
2596
|
-
throw new Error('『表検索』には配列を指定する必要があります。');
|
|
2597
|
-
}
|
|
2598
|
-
for (let i = row; i < a.length; i++) {
|
|
2599
|
-
if (a[i][col] === s) {
|
|
2600
|
-
return i;
|
|
2601
|
-
}
|
|
2602
|
-
}
|
|
2603
|
-
return -1;
|
|
2604
|
-
}
|
|
2605
|
-
},
|
|
2606
|
-
'表列数': {
|
|
2607
|
-
type: 'func',
|
|
2608
|
-
josi: [['の']],
|
|
2609
|
-
pure: true,
|
|
2610
|
-
fn: function (a) {
|
|
2611
|
-
if (!(a instanceof Array)) {
|
|
2612
|
-
throw new Error('『表列数』には配列を指定する必要があります。');
|
|
2613
|
-
}
|
|
2614
|
-
let cols = 1;
|
|
2615
|
-
for (let i = 0; i < a.length; i++) {
|
|
2616
|
-
if (a[i].length > cols) {
|
|
2617
|
-
cols = a[i].length;
|
|
2618
|
-
}
|
|
2619
|
-
}
|
|
2620
|
-
return cols;
|
|
2621
|
-
}
|
|
2622
|
-
},
|
|
2623
|
-
'表行数': {
|
|
2624
|
-
type: 'func',
|
|
2625
|
-
josi: [['の']],
|
|
2626
|
-
pure: true,
|
|
2627
|
-
fn: function (a) {
|
|
2628
|
-
if (!(a instanceof Array)) {
|
|
2629
|
-
throw new Error('『表行数』には配列を指定する必要があります。');
|
|
2630
|
-
}
|
|
2631
|
-
return a.length;
|
|
2632
|
-
}
|
|
2633
|
-
},
|
|
2634
|
-
'表行列交換': {
|
|
2635
|
-
type: 'func',
|
|
2636
|
-
josi: [['の', 'を']],
|
|
2637
|
-
pure: true,
|
|
2638
|
-
fn: function (a, sys) {
|
|
2639
|
-
if (!(a instanceof Array)) {
|
|
2640
|
-
throw new Error('『表行列交換』には配列を指定する必要があります。');
|
|
2641
|
-
}
|
|
2642
|
-
const cols = sys.__exec('表列数', [a]);
|
|
2643
|
-
const rows = a.length;
|
|
2644
|
-
const res = [];
|
|
2645
|
-
for (let r = 0; r < cols; r++) {
|
|
2646
|
-
const row = [];
|
|
2647
|
-
res.push(row);
|
|
2648
|
-
for (let c = 0; c < rows; c++) {
|
|
2649
|
-
row[c] = (a[c][r] !== undefined) ? a[c][r] : '';
|
|
2650
|
-
}
|
|
2651
|
-
}
|
|
2652
|
-
return res;
|
|
2653
|
-
}
|
|
2654
|
-
},
|
|
2655
|
-
'表右回転': {
|
|
2656
|
-
type: 'func',
|
|
2657
|
-
josi: [['の', 'を']],
|
|
2658
|
-
pure: true,
|
|
2659
|
-
fn: function (a, sys) {
|
|
2660
|
-
if (!(a instanceof Array)) {
|
|
2661
|
-
throw new Error('『表右回転』には配列を指定する必要があります。');
|
|
2662
|
-
}
|
|
2663
|
-
const cols = sys.__exec('表列数', [a]);
|
|
2664
|
-
const rows = a.length;
|
|
2665
|
-
const res = [];
|
|
2666
|
-
for (let r = 0; r < cols; r++) {
|
|
2667
|
-
const row = [];
|
|
2668
|
-
res.push(row);
|
|
2669
|
-
for (let c = 0; c < rows; c++) {
|
|
2670
|
-
row[c] = a[rows - c - 1][r];
|
|
2671
|
-
}
|
|
2672
|
-
}
|
|
2673
|
-
return res;
|
|
2674
|
-
}
|
|
2675
|
-
},
|
|
2676
|
-
'表重複削除': {
|
|
2677
|
-
type: 'func',
|
|
2678
|
-
josi: [['の'], ['を', 'で']],
|
|
2679
|
-
pure: true,
|
|
2680
|
-
fn: function (a, i) {
|
|
2681
|
-
if (!(a instanceof Array)) {
|
|
2682
|
-
throw new Error('『表重複削除』には配列を指定する必要があります。');
|
|
2683
|
-
}
|
|
2684
|
-
const res = [];
|
|
2685
|
-
const keys = {};
|
|
2686
|
-
for (let n = 0; n < a.length; n++) {
|
|
2687
|
-
const k = a[n][i];
|
|
2688
|
-
if (undefined === keys[k]) {
|
|
2689
|
-
keys[k] = true;
|
|
2690
|
-
res.push(a[n]);
|
|
2691
|
-
}
|
|
2692
|
-
}
|
|
2693
|
-
return res;
|
|
2694
|
-
}
|
|
2695
|
-
},
|
|
2696
|
-
'表列取得': {
|
|
2697
|
-
type: 'func',
|
|
2698
|
-
josi: [['の'], ['を']],
|
|
2699
|
-
pure: true,
|
|
2700
|
-
fn: function (a, i) {
|
|
2701
|
-
if (!(a instanceof Array)) {
|
|
2702
|
-
throw new Error('『表列取得』には配列を指定する必要があります。');
|
|
2703
|
-
}
|
|
2704
|
-
const res = a.map(row => row[i]);
|
|
2705
|
-
return res;
|
|
2706
|
-
}
|
|
2707
|
-
},
|
|
2708
|
-
'表列挿入': {
|
|
2709
|
-
type: 'func',
|
|
2710
|
-
josi: [['の'], ['に', 'へ'], ['を']],
|
|
2711
|
-
pure: true,
|
|
2712
|
-
fn: function (a, i, s) {
|
|
2713
|
-
if (!(a instanceof Array)) {
|
|
2714
|
-
throw new Error('『表列挿入』には配列を指定する必要があります。');
|
|
2715
|
-
}
|
|
2716
|
-
const res = [];
|
|
2717
|
-
a.forEach((row, idx) => {
|
|
2718
|
-
let nr = [];
|
|
2719
|
-
if (i > 0) {
|
|
2720
|
-
nr = nr.concat(row.slice(0, i));
|
|
2721
|
-
}
|
|
2722
|
-
nr.push(s[idx]);
|
|
2723
|
-
nr = nr.concat(row.slice(i));
|
|
2724
|
-
res.push(nr);
|
|
2725
|
-
});
|
|
2726
|
-
return res;
|
|
2727
|
-
}
|
|
2728
|
-
},
|
|
2729
|
-
'表列削除': {
|
|
2730
|
-
type: 'func',
|
|
2731
|
-
josi: [['の'], ['を']],
|
|
2732
|
-
pure: true,
|
|
2733
|
-
fn: function (a, i) {
|
|
2734
|
-
if (!(a instanceof Array)) {
|
|
2735
|
-
throw new Error('『表列削除』には配列を指定する必要があります。');
|
|
2736
|
-
}
|
|
2737
|
-
const res = [];
|
|
2738
|
-
a.forEach((row) => {
|
|
2739
|
-
const nr = row.slice(0);
|
|
2740
|
-
nr.splice(i, 1);
|
|
2741
|
-
res.push(nr);
|
|
2742
|
-
});
|
|
2743
|
-
return res;
|
|
2744
|
-
}
|
|
2745
|
-
},
|
|
2746
|
-
'表列合計': {
|
|
2747
|
-
type: 'func',
|
|
2748
|
-
josi: [['の'], ['を', 'で']],
|
|
2749
|
-
pure: true,
|
|
2750
|
-
fn: function (a, i) {
|
|
2751
|
-
if (!(a instanceof Array)) {
|
|
2752
|
-
throw new Error('『表列合計』には配列を指定する必要があります。');
|
|
2753
|
-
}
|
|
2754
|
-
let sum = 0;
|
|
2755
|
-
a.forEach((row) => { sum += row[i]; });
|
|
2756
|
-
return sum;
|
|
2757
|
-
}
|
|
2758
|
-
},
|
|
2759
|
-
'表曖昧検索': {
|
|
2760
|
-
type: 'func',
|
|
2761
|
-
josi: [['の'], ['から'], ['で'], ['を']],
|
|
2762
|
-
pure: true,
|
|
2763
|
-
fn: function (a, row, col, s) {
|
|
2764
|
-
if (!(a instanceof Array)) {
|
|
2765
|
-
throw new Error('『表曖昧検索』には配列を指定する必要があります。');
|
|
2766
|
-
}
|
|
2767
|
-
const re = new RegExp(s);
|
|
2768
|
-
for (let i = row; i < a.length; i++) {
|
|
2769
|
-
const line = a[i];
|
|
2770
|
-
if (re.test(line[col])) {
|
|
2771
|
-
return i;
|
|
2772
|
-
}
|
|
2773
|
-
}
|
|
2774
|
-
return -1;
|
|
2775
|
-
}
|
|
2776
|
-
},
|
|
2777
|
-
'表正規表現ピックアップ': {
|
|
2778
|
-
type: 'func',
|
|
2779
|
-
josi: [['の', 'で'], ['から'], ['を']],
|
|
2780
|
-
pure: true,
|
|
2781
|
-
fn: function (a, col, s) {
|
|
2782
|
-
if (!(a instanceof Array)) {
|
|
2783
|
-
throw new Error('『表正規表現ピックアップ』には配列を指定する必要があります。');
|
|
2784
|
-
}
|
|
2785
|
-
const re = new RegExp(s);
|
|
2786
|
-
const res = [];
|
|
2787
|
-
for (let i = 0; i < a.length; i++) {
|
|
2788
|
-
const row = a[i];
|
|
2789
|
-
if (re.test(row[col])) {
|
|
2790
|
-
res.push(row.slice(0));
|
|
2791
|
-
}
|
|
2792
|
-
}
|
|
2793
|
-
return res;
|
|
2794
|
-
}
|
|
2795
|
-
},
|
|
2796
|
-
// @辞書型変数の操作
|
|
2797
|
-
'辞書キー列挙': {
|
|
2798
|
-
type: 'func',
|
|
2799
|
-
josi: [['の']],
|
|
2800
|
-
pure: true,
|
|
2801
|
-
fn: function (a) {
|
|
2802
|
-
const keys = [];
|
|
2803
|
-
if (a instanceof Object) { // オブジェクトのキーを返す
|
|
2804
|
-
for (const key in a) {
|
|
2805
|
-
keys.push(key);
|
|
2806
|
-
}
|
|
2807
|
-
return keys;
|
|
2808
|
-
}
|
|
2809
|
-
if (a instanceof Array) { // 配列なら数字を返す
|
|
2810
|
-
for (let i = 0; i < a.length; i++) {
|
|
2811
|
-
keys.push(i);
|
|
2812
|
-
}
|
|
2813
|
-
return keys;
|
|
2814
|
-
}
|
|
2815
|
-
throw new Error('『辞書キー列挙』でハッシュ以外が与えられました。');
|
|
2816
|
-
}
|
|
2817
|
-
},
|
|
2818
|
-
'辞書キー削除': {
|
|
2819
|
-
type: 'func',
|
|
2820
|
-
josi: [['から', 'の'], ['を']],
|
|
2821
|
-
pure: true,
|
|
2822
|
-
fn: function (a, key) {
|
|
2823
|
-
if (a instanceof Object) { // オブジェクトのキーを返す
|
|
2824
|
-
if (key in a) {
|
|
2825
|
-
delete a[key];
|
|
2826
|
-
}
|
|
2827
|
-
return a;
|
|
2828
|
-
}
|
|
2829
|
-
throw new Error('『辞書キー削除』でハッシュ以外が与えられました。');
|
|
2830
|
-
}
|
|
2831
|
-
},
|
|
2832
|
-
'辞書キー存在': {
|
|
2833
|
-
type: 'func',
|
|
2834
|
-
josi: [['の', 'に'], ['が']],
|
|
2835
|
-
pure: true,
|
|
2836
|
-
fn: function (a, key) {
|
|
2837
|
-
return key in a;
|
|
2838
|
-
}
|
|
2839
|
-
},
|
|
2840
|
-
// @ハッシュ
|
|
2841
|
-
'ハッシュキー列挙': {
|
|
2842
|
-
type: 'func',
|
|
2843
|
-
josi: [['の']],
|
|
2844
|
-
pure: true,
|
|
2845
|
-
fn: function (a, sys) {
|
|
2846
|
-
return sys.__exec('辞書キー列挙', [a, sys]);
|
|
2847
|
-
}
|
|
2848
|
-
},
|
|
2849
|
-
'ハッシュ内容列挙': {
|
|
2850
|
-
type: 'func',
|
|
2851
|
-
josi: [['の']],
|
|
2852
|
-
pure: true,
|
|
2853
|
-
fn: function (a) {
|
|
2854
|
-
const body = [];
|
|
2855
|
-
if (a instanceof Object) { // オブジェクトのキーを返す
|
|
2856
|
-
for (const key in a) {
|
|
2857
|
-
body.push(a[key]);
|
|
2858
|
-
}
|
|
2859
|
-
return body;
|
|
2860
|
-
}
|
|
2861
|
-
throw new Error('『ハッシュ内容列挙』でハッシュ以外が与えられました。');
|
|
2862
|
-
}
|
|
2863
|
-
},
|
|
2864
|
-
'ハッシュキー削除': {
|
|
2865
|
-
type: 'func',
|
|
2866
|
-
josi: [['から', 'の'], ['を']],
|
|
2867
|
-
pure: true,
|
|
2868
|
-
fn: function (a, key, sys) {
|
|
2869
|
-
return sys.__exec('辞書キー削除', [a, key, sys]);
|
|
2870
|
-
}
|
|
2871
|
-
},
|
|
2872
|
-
'ハッシュキー存在': {
|
|
2873
|
-
type: 'func',
|
|
2874
|
-
josi: [['の', 'に'], ['が']],
|
|
2875
|
-
pure: true,
|
|
2876
|
-
fn: function (a, key) {
|
|
2877
|
-
return key in a;
|
|
2878
|
-
}
|
|
2879
|
-
},
|
|
2880
|
-
// @タイマー
|
|
2881
|
-
'秒待': {
|
|
2882
|
-
type: 'func',
|
|
2883
|
-
josi: [['']],
|
|
2884
|
-
pure: true,
|
|
2885
|
-
asyncFn: true,
|
|
2886
|
-
fn: function (n, sys) {
|
|
2887
|
-
return new Promise((resolve, reject) => {
|
|
2888
|
-
try {
|
|
2889
|
-
// タイマーを仕掛ける
|
|
2890
|
-
const timerId = setTimeout(() => {
|
|
2891
|
-
// タイマー使用中リストに追加したIDを削除
|
|
2892
|
-
const i = sys.__timeout.indexOf(timerId);
|
|
2893
|
-
if (i >= 0) {
|
|
2894
|
-
sys.__timeout.splice(i, 1);
|
|
2895
|
-
}
|
|
2896
|
-
// Promiseを終了
|
|
2897
|
-
resolve();
|
|
2898
|
-
}, parseFloat(n) * 1000);
|
|
2899
|
-
// タイマー使用中リストに追加
|
|
2900
|
-
sys.__timeout.push(timerId);
|
|
2901
|
-
}
|
|
2902
|
-
catch (err) {
|
|
2903
|
-
reject(err);
|
|
2904
|
-
}
|
|
2905
|
-
});
|
|
2906
|
-
},
|
|
2907
|
-
return_none: true
|
|
2908
|
-
},
|
|
2909
|
-
'秒待機': {
|
|
2910
|
-
type: 'func',
|
|
2911
|
-
josi: [['']],
|
|
2912
|
-
pure: true,
|
|
2913
|
-
asyncFn: true,
|
|
2914
|
-
fn: async function (n, sys) {
|
|
2915
|
-
const p = sys.__exec('秒待', [n, sys]);
|
|
2916
|
-
return await p;
|
|
2917
|
-
},
|
|
2918
|
-
return_none: true
|
|
2919
|
-
},
|
|
2920
|
-
'秒逐次待機': {
|
|
2921
|
-
type: 'func',
|
|
2922
|
-
josi: [['']],
|
|
2923
|
-
pure: true,
|
|
2924
|
-
asyncFn: true,
|
|
2925
|
-
fn: async function (n, sys) {
|
|
2926
|
-
const p = sys.__exec('秒待', [n, sys]);
|
|
2927
|
-
return await p;
|
|
2928
|
-
},
|
|
2929
|
-
return_none: true
|
|
2930
|
-
},
|
|
2931
|
-
'秒後': {
|
|
2932
|
-
type: 'func',
|
|
2933
|
-
josi: [['を'], ['']],
|
|
2934
|
-
pure: true,
|
|
2935
|
-
fn: function (f, n, sys) {
|
|
2936
|
-
// 文字列で指定された関数をオブジェクトに変換
|
|
2937
|
-
if (typeof f === 'string') {
|
|
2938
|
-
f = sys.__findFunc(f, '秒後');
|
|
2939
|
-
}
|
|
2940
|
-
// 1回限りのタイマーをセット
|
|
2941
|
-
const timerId = setTimeout(() => {
|
|
2942
|
-
// 使用中リストに追加したIDを削除
|
|
2943
|
-
const i = sys.__timeout.indexOf(timerId);
|
|
2944
|
-
if (i >= 0) {
|
|
2945
|
-
sys.__timeout.splice(i, 1);
|
|
2946
|
-
}
|
|
2947
|
-
try {
|
|
2948
|
-
f(timerId, sys);
|
|
2949
|
-
}
|
|
2950
|
-
catch (e) {
|
|
2951
|
-
let err = e;
|
|
2952
|
-
if (!(e instanceof NakoRuntimeError)) {
|
|
2953
|
-
err = new NakoRuntimeError(e, sys.__getSysVar('__line'));
|
|
2954
|
-
}
|
|
2955
|
-
sys.logger.error(err);
|
|
2956
|
-
}
|
|
2957
|
-
}, parseFloat(n) * 1000);
|
|
2958
|
-
sys.__timeout.unshift(timerId);
|
|
2959
|
-
sys.__setSysVar('対象', timerId);
|
|
2960
|
-
return timerId;
|
|
2961
|
-
}
|
|
2962
|
-
},
|
|
2963
|
-
'秒毎': {
|
|
2964
|
-
type: 'func',
|
|
2965
|
-
josi: [['を'], ['']],
|
|
2966
|
-
pure: false,
|
|
2967
|
-
fn: function (f, n, sys) {
|
|
2968
|
-
// 文字列で指定された関数をオブジェクトに変換
|
|
2969
|
-
if (typeof f === 'string') {
|
|
2970
|
-
f = sys.__findFunc(f, '秒毎');
|
|
2971
|
-
}
|
|
2972
|
-
// タイマーをセット
|
|
2973
|
-
const timerId = setInterval(() => {
|
|
2974
|
-
f(timerId, sys);
|
|
2975
|
-
}, parseFloat(n) * 1000);
|
|
2976
|
-
// タイマーIDを追加
|
|
2977
|
-
sys.__interval.unshift(timerId);
|
|
2978
|
-
sys.__setSysVar('対象', timerId);
|
|
2979
|
-
return timerId;
|
|
2980
|
-
}
|
|
2981
|
-
},
|
|
2982
|
-
'秒タイマー開始時': {
|
|
2983
|
-
type: 'func',
|
|
2984
|
-
josi: [['を'], ['']],
|
|
2985
|
-
pure: false,
|
|
2986
|
-
fn: function (f, n, sys) {
|
|
2987
|
-
return sys.__exec('秒毎', [f, n, sys]);
|
|
2988
|
-
}
|
|
2989
|
-
},
|
|
2990
|
-
'タイマー停止': {
|
|
2991
|
-
type: 'func',
|
|
2992
|
-
josi: [['の', 'で']],
|
|
2993
|
-
pure: true,
|
|
2994
|
-
fn: function (timerId, sys) {
|
|
2995
|
-
const i = sys.__interval.indexOf(timerId);
|
|
2996
|
-
if (i >= 0) {
|
|
2997
|
-
sys.__interval.splice(i, 1);
|
|
2998
|
-
clearInterval(timerId);
|
|
2999
|
-
return true;
|
|
3000
|
-
}
|
|
3001
|
-
const j = sys.__timeout.indexOf(timerId);
|
|
3002
|
-
if (j >= 0) {
|
|
3003
|
-
sys.__timeout.splice(j, 1);
|
|
3004
|
-
clearTimeout(timerId);
|
|
3005
|
-
return true;
|
|
3006
|
-
}
|
|
3007
|
-
return false;
|
|
3008
|
-
},
|
|
3009
|
-
return_none: false
|
|
3010
|
-
},
|
|
3011
|
-
'全タイマー停止': {
|
|
3012
|
-
type: 'func',
|
|
3013
|
-
josi: [],
|
|
3014
|
-
pure: true,
|
|
3015
|
-
fn: function (sys) {
|
|
3016
|
-
// clearInterval
|
|
3017
|
-
for (let i = 0; i < sys.__interval.length; i++) {
|
|
3018
|
-
const timerId = sys.__interval[i];
|
|
3019
|
-
clearInterval(timerId);
|
|
3020
|
-
}
|
|
3021
|
-
sys.__interval = [];
|
|
3022
|
-
// clearTimeout
|
|
3023
|
-
for (let i = 0; i < sys.__timeout.length; i++) {
|
|
3024
|
-
const timerId = sys.__timeout[i];
|
|
3025
|
-
clearTimeout(timerId);
|
|
3026
|
-
}
|
|
3027
|
-
sys.__timeout = [];
|
|
3028
|
-
},
|
|
3029
|
-
return_none: true
|
|
3030
|
-
},
|
|
3031
|
-
// @日時処理(簡易)
|
|
3032
|
-
'元号データ': { type: 'const', value: [{ '元号': '令和', '改元日': '2019/05/01' }, { '元号': '平成', '改元日': '1989/01/08' }, { '元号': '昭和', '改元日': '1926/12/25' }, { '元号': '大正', '改元日': '1912/07/30' }, { '元号': '明治', '改元日': '1868/10/23' }] }, // @げんごうでーた
|
|
3033
|
-
'今': {
|
|
3034
|
-
type: 'func',
|
|
3035
|
-
josi: [],
|
|
3036
|
-
pure: true,
|
|
3037
|
-
fn: function () {
|
|
3038
|
-
const z2 = (n) => {
|
|
3039
|
-
const ns = '00' + String(n);
|
|
3040
|
-
return ns.substring(ns.length - 2, ns.length);
|
|
3041
|
-
};
|
|
3042
|
-
const t = new Date();
|
|
3043
|
-
return z2(t.getHours()) + ':' + z2(t.getMinutes()) + ':' + z2(t.getSeconds());
|
|
3044
|
-
}
|
|
3045
|
-
},
|
|
3046
|
-
'システム時間': {
|
|
3047
|
-
type: 'func',
|
|
3048
|
-
josi: [],
|
|
3049
|
-
pure: true,
|
|
3050
|
-
fn: function () {
|
|
3051
|
-
const now = new Date();
|
|
3052
|
-
return Math.floor(now.getTime() / 1000);
|
|
3053
|
-
}
|
|
3054
|
-
},
|
|
3055
|
-
'システム時間ミリ秒': {
|
|
3056
|
-
type: 'func',
|
|
3057
|
-
josi: [],
|
|
3058
|
-
pure: true,
|
|
3059
|
-
fn: function () {
|
|
3060
|
-
const now = new Date();
|
|
3061
|
-
return now.getTime();
|
|
3062
|
-
}
|
|
3063
|
-
},
|
|
3064
|
-
'今日': {
|
|
3065
|
-
type: 'func',
|
|
3066
|
-
josi: [],
|
|
3067
|
-
pure: true,
|
|
3068
|
-
fn: function (sys) {
|
|
3069
|
-
return sys.__formatDate(new Date());
|
|
3070
|
-
}
|
|
3071
|
-
},
|
|
3072
|
-
'明日': {
|
|
3073
|
-
type: 'func',
|
|
3074
|
-
josi: [],
|
|
3075
|
-
pure: true,
|
|
3076
|
-
fn: function (sys) {
|
|
3077
|
-
const t = Date.now() + (24 * 60 * 60 * 1000);
|
|
3078
|
-
return sys.__formatDate(new Date(t));
|
|
3079
|
-
}
|
|
3080
|
-
},
|
|
3081
|
-
'昨日': {
|
|
3082
|
-
type: 'func',
|
|
3083
|
-
josi: [],
|
|
3084
|
-
pure: true,
|
|
3085
|
-
fn: function (sys) {
|
|
3086
|
-
const t = Date.now() - (24 * 60 * 60 * 1000);
|
|
3087
|
-
return sys.__formatDate(new Date(t));
|
|
3088
|
-
}
|
|
3089
|
-
},
|
|
3090
|
-
'今年': {
|
|
3091
|
-
type: 'func',
|
|
3092
|
-
josi: [],
|
|
3093
|
-
pure: true,
|
|
3094
|
-
fn: function () {
|
|
3095
|
-
return (new Date()).getFullYear();
|
|
3096
|
-
}
|
|
3097
|
-
},
|
|
3098
|
-
'来年': {
|
|
3099
|
-
type: 'func',
|
|
3100
|
-
josi: [],
|
|
3101
|
-
pure: true,
|
|
3102
|
-
fn: function () {
|
|
3103
|
-
return (new Date()).getFullYear() + 1;
|
|
3104
|
-
}
|
|
3105
|
-
},
|
|
3106
|
-
'去年': {
|
|
3107
|
-
type: 'func',
|
|
3108
|
-
josi: [],
|
|
3109
|
-
pure: true,
|
|
3110
|
-
fn: function () {
|
|
3111
|
-
return (new Date()).getFullYear() - 1;
|
|
3112
|
-
}
|
|
3113
|
-
},
|
|
3114
|
-
'今月': {
|
|
3115
|
-
type: 'func',
|
|
3116
|
-
josi: [],
|
|
3117
|
-
pure: true,
|
|
3118
|
-
fn: function () {
|
|
3119
|
-
return (new Date()).getMonth() + 1;
|
|
3120
|
-
}
|
|
3121
|
-
},
|
|
3122
|
-
'来月': {
|
|
3123
|
-
type: 'func',
|
|
3124
|
-
josi: [],
|
|
3125
|
-
pure: true,
|
|
3126
|
-
fn: function () {
|
|
3127
|
-
return (new Date()).getMonth() + 2;
|
|
3128
|
-
}
|
|
3129
|
-
},
|
|
3130
|
-
'先月': {
|
|
3131
|
-
type: 'func',
|
|
3132
|
-
josi: [],
|
|
3133
|
-
pure: true,
|
|
3134
|
-
fn: function () {
|
|
3135
|
-
return (new Date()).getMonth();
|
|
3136
|
-
}
|
|
3137
|
-
},
|
|
3138
|
-
'曜日': {
|
|
3139
|
-
type: 'func',
|
|
3140
|
-
josi: [['の']],
|
|
3141
|
-
pure: true,
|
|
3142
|
-
fn: function (s, sys) {
|
|
3143
|
-
const d = sys.__str2date(s);
|
|
3144
|
-
return '日月火水木金土'.charAt(d.getDay() % 7);
|
|
3145
|
-
}
|
|
3146
|
-
},
|
|
3147
|
-
'曜日番号取得': {
|
|
3148
|
-
type: 'func',
|
|
3149
|
-
josi: [['の']],
|
|
3150
|
-
pure: true,
|
|
3151
|
-
fn: function (s) {
|
|
3152
|
-
const a = s.split('/');
|
|
3153
|
-
const t = new Date(a[0], a[1] - 1, a[2]);
|
|
3154
|
-
return t.getDay();
|
|
3155
|
-
}
|
|
3156
|
-
},
|
|
3157
|
-
'UNIXTIME変換': {
|
|
3158
|
-
type: 'func',
|
|
3159
|
-
josi: [['の', 'を', 'から']],
|
|
3160
|
-
pure: true,
|
|
3161
|
-
fn: function (s, sys) {
|
|
3162
|
-
const d = sys.__str2date(s);
|
|
3163
|
-
return d.getTime() / 1000;
|
|
3164
|
-
}
|
|
3165
|
-
},
|
|
3166
|
-
'UNIX時間変換': {
|
|
3167
|
-
type: 'func',
|
|
3168
|
-
josi: [['の', 'を', 'から']],
|
|
3169
|
-
pure: true,
|
|
3170
|
-
fn: function (s, sys) {
|
|
3171
|
-
const d = sys.__str2date(s);
|
|
3172
|
-
return d.getTime() / 1000;
|
|
3173
|
-
}
|
|
3174
|
-
},
|
|
3175
|
-
'日時変換': {
|
|
3176
|
-
type: 'func',
|
|
3177
|
-
josi: [['を', 'から']],
|
|
3178
|
-
pure: true,
|
|
3179
|
-
fn: function (tm, sys) {
|
|
3180
|
-
const t = tm * 1000;
|
|
3181
|
-
return sys.__formatDateTime(new Date(t), '2022/01/01 00:00:00');
|
|
3182
|
-
}
|
|
3183
|
-
},
|
|
3184
|
-
'日時書式変換': {
|
|
3185
|
-
type: 'func',
|
|
3186
|
-
josi: [['を'], ['で']],
|
|
3187
|
-
pure: true,
|
|
3188
|
-
fn: function (tm, fmt, sys) {
|
|
3189
|
-
const t = sys.__str2date(tm);
|
|
3190
|
-
fmt = fmt.replace(/(YYYY|ccc|WWW|MMM|YY|MM|DD|HH|mm|ss|[MDHmsW])/g, (m) => {
|
|
3191
|
-
switch (m) {
|
|
3192
|
-
case 'YYYY': return t.getFullYear();
|
|
3193
|
-
case 'YY': return (String(t.getFullYear())).substring(2);
|
|
3194
|
-
case 'MM': return sys.__zero2(String(t.getMonth() + 1));
|
|
3195
|
-
case 'DD': return sys.__zero2(t.getDate());
|
|
3196
|
-
case 'M': return (t.getMonth() + 1);
|
|
3197
|
-
case 'D': return (t.getDate());
|
|
3198
|
-
case 'HH': return sys.__zero2(t.getHours());
|
|
3199
|
-
case 'mm': return sys.__zero2(t.getMinutes());
|
|
3200
|
-
case 'ss': return sys.__zero2(t.getSeconds());
|
|
3201
|
-
case 'ccc': return sys.__zero(t.getMilliseconds(), 3);
|
|
3202
|
-
case 'H': return (t.getHours());
|
|
3203
|
-
case 'm': return (t.getMinutes());
|
|
3204
|
-
case 's': return (t.getSeconds());
|
|
3205
|
-
case 'W': return '日月火水木金土'.charAt(t.getDay() % 7);
|
|
3206
|
-
case 'WWW': return ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'][t.getDay() % 7];
|
|
3207
|
-
case 'MMM': return ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'][t.getMonth()];
|
|
3208
|
-
}
|
|
3209
|
-
return m;
|
|
3210
|
-
});
|
|
3211
|
-
return fmt;
|
|
3212
|
-
}
|
|
3213
|
-
},
|
|
3214
|
-
'和暦変換': {
|
|
3215
|
-
type: 'func',
|
|
3216
|
-
josi: [['を']],
|
|
3217
|
-
pure: true,
|
|
3218
|
-
fn: function (s, sys) {
|
|
3219
|
-
const d = sys.__str2date(s);
|
|
3220
|
-
const t = d.getTime();
|
|
3221
|
-
for (const era of sys.__getSysVar('元号データ')) {
|
|
3222
|
-
const gengo = String(era['元号']);
|
|
3223
|
-
const d2 = sys.__str2date(era['改元日']);
|
|
3224
|
-
const t2 = d2.getTime();
|
|
3225
|
-
if (t2 <= t) {
|
|
3226
|
-
let y = (d.getFullYear() - d2.getFullYear()) + 1;
|
|
3227
|
-
if (y === 1) {
|
|
3228
|
-
y = '元';
|
|
3229
|
-
}
|
|
3230
|
-
return gengo + String(y) + '年' + sys.__zero2(d.getMonth() + 1) + '月' + sys.__zero2(d.getDate()) + '日';
|
|
3231
|
-
}
|
|
3232
|
-
}
|
|
3233
|
-
throw new Error('『和暦変換』は明示以前の日付には対応していません。');
|
|
3234
|
-
}
|
|
3235
|
-
},
|
|
3236
|
-
'年数差': {
|
|
3237
|
-
type: 'func',
|
|
3238
|
-
josi: [['と', 'から'], ['の', 'までの']],
|
|
3239
|
-
pure: true,
|
|
3240
|
-
fn: function (a, b, sys) {
|
|
3241
|
-
const t1 = sys.__str2date(a);
|
|
3242
|
-
const t2 = sys.__str2date(b);
|
|
3243
|
-
return (t2.getFullYear() - t1.getFullYear());
|
|
3244
|
-
}
|
|
3245
|
-
},
|
|
3246
|
-
'月数差': {
|
|
3247
|
-
type: 'func',
|
|
3248
|
-
josi: [['と', 'から'], ['の', 'までの']],
|
|
3249
|
-
pure: true,
|
|
3250
|
-
fn: function (a, b, sys) {
|
|
3251
|
-
const t1 = sys.__str2date(a);
|
|
3252
|
-
const t2 = sys.__str2date(b);
|
|
3253
|
-
return (t2.getFullYear() * 12 + Number(t2.getMonth())) -
|
|
3254
|
-
(t1.getFullYear() * 12 + Number(t1.getMonth()));
|
|
3255
|
-
}
|
|
3256
|
-
},
|
|
3257
|
-
'日数差': {
|
|
3258
|
-
type: 'func',
|
|
3259
|
-
josi: [['と', 'から'], ['の', 'までの']],
|
|
3260
|
-
pure: true,
|
|
3261
|
-
fn: function (a, b, sys) {
|
|
3262
|
-
const t1 = Math.ceil(sys.__str2date(a).getTime() / 1000);
|
|
3263
|
-
const t2 = Math.ceil(sys.__str2date(b).getTime() / 1000);
|
|
3264
|
-
const days = Math.ceil((t2 - t1) / (60 * 60 * 24));
|
|
3265
|
-
return days;
|
|
3266
|
-
}
|
|
3267
|
-
},
|
|
3268
|
-
'時間差': {
|
|
3269
|
-
type: 'func',
|
|
3270
|
-
josi: [['と', 'から'], ['の', 'までの']],
|
|
3271
|
-
pure: true,
|
|
3272
|
-
fn: function (a, b, sys) {
|
|
3273
|
-
const t1 = Math.ceil(sys.__str2date(a).getTime() / 1000);
|
|
3274
|
-
const t2 = Math.ceil(sys.__str2date(b).getTime() / 1000);
|
|
3275
|
-
const hours = Math.ceil((t2 - t1) / (60 * 60));
|
|
3276
|
-
return hours;
|
|
3277
|
-
}
|
|
3278
|
-
},
|
|
3279
|
-
'分差': {
|
|
3280
|
-
type: 'func',
|
|
3281
|
-
josi: [['と', 'から'], ['の', 'までの']],
|
|
3282
|
-
pure: true,
|
|
3283
|
-
fn: function (a, b, sys) {
|
|
3284
|
-
const t1 = Math.ceil(sys.__str2date(a).getTime() / 1000);
|
|
3285
|
-
const t2 = Math.ceil(sys.__str2date(b).getTime() / 1000);
|
|
3286
|
-
const min = Math.ceil((t2 - t1) / (60));
|
|
3287
|
-
return min;
|
|
3288
|
-
}
|
|
3289
|
-
},
|
|
3290
|
-
'秒差': {
|
|
3291
|
-
type: 'func',
|
|
3292
|
-
josi: [['と', 'から'], ['の', 'までの']],
|
|
3293
|
-
pure: true,
|
|
3294
|
-
fn: function (a, b, sys) {
|
|
3295
|
-
const t1 = Math.ceil(sys.__str2date(a).getTime() / 1000);
|
|
3296
|
-
const t2 = Math.ceil(sys.__str2date(b).getTime() / 1000);
|
|
3297
|
-
const sec = Math.ceil((t2 - t1));
|
|
3298
|
-
return sec;
|
|
3299
|
-
}
|
|
3300
|
-
},
|
|
3301
|
-
'日時差': {
|
|
3302
|
-
type: 'func',
|
|
3303
|
-
josi: [['と', 'から'], ['の', 'までの'], ['による']],
|
|
3304
|
-
pure: true,
|
|
3305
|
-
fn: function (a, b, unit, sys) {
|
|
3306
|
-
switch (unit) {
|
|
3307
|
-
case '年': return sys.__exec('年数差', [a, b, sys]);
|
|
3308
|
-
case '月': return sys.__exec('月数差', [a, b, sys]);
|
|
3309
|
-
case '日': return sys.__exec('日数差', [a, b, sys]);
|
|
3310
|
-
case '時間': return sys.__exec('時間差', [a, b, sys]);
|
|
3311
|
-
case '分': return sys.__exec('分差', [a, b, sys]);
|
|
3312
|
-
case '秒': return sys.__exec('秒差', [a, b, sys]);
|
|
3313
|
-
}
|
|
3314
|
-
throw new Error('『日時差』で不明な単位です。');
|
|
3315
|
-
}
|
|
3316
|
-
},
|
|
3317
|
-
'時間加算': {
|
|
3318
|
-
type: 'func',
|
|
3319
|
-
josi: [['に'], ['を']],
|
|
3320
|
-
pure: true,
|
|
3321
|
-
fn: function (s, a, sys) {
|
|
3322
|
-
const op = a.charAt(0);
|
|
3323
|
-
if (op === '-' || op === '+') {
|
|
3324
|
-
a = a.substring(1);
|
|
3325
|
-
}
|
|
3326
|
-
const d = sys.__str2date(s);
|
|
3327
|
-
const aa = (a + ':0:0').split(':');
|
|
3328
|
-
let sec = parseInt(aa[0]) * 60 * 60 +
|
|
3329
|
-
parseInt(aa[1]) * 60 +
|
|
3330
|
-
parseInt(aa[2]);
|
|
3331
|
-
if (op === '-') {
|
|
3332
|
-
sec *= -1;
|
|
3333
|
-
}
|
|
3334
|
-
const rd = new Date(Number(d.getTime()) + (sec * 1000));
|
|
3335
|
-
return sys.__formatDateTime(rd, s);
|
|
3336
|
-
}
|
|
3337
|
-
},
|
|
3338
|
-
'日付加算': {
|
|
3339
|
-
type: 'func',
|
|
3340
|
-
josi: [['に'], ['を']],
|
|
3341
|
-
pure: true,
|
|
3342
|
-
fn: function (s, a, sys) {
|
|
3343
|
-
let op = 1;
|
|
3344
|
-
const opc = a.charAt(0);
|
|
3345
|
-
if (opc === '-' || opc === '+') {
|
|
3346
|
-
a = a.substring(1);
|
|
3347
|
-
if (opc === '-') {
|
|
3348
|
-
op *= -1;
|
|
3349
|
-
}
|
|
3350
|
-
}
|
|
3351
|
-
const d = sys.__str2date(s);
|
|
3352
|
-
const aa = (a + '/0/0').split('/');
|
|
3353
|
-
const addY = parseInt(aa[0]) * op;
|
|
3354
|
-
const addM = parseInt(aa[1]) * op;
|
|
3355
|
-
const addD = parseInt(aa[2]) * op;
|
|
3356
|
-
d.setFullYear(Number(d.getFullYear()) + addY);
|
|
3357
|
-
d.setMonth(Number(d.getMonth()) + addM);
|
|
3358
|
-
d.setDate(Number(d.getDate()) + addD);
|
|
3359
|
-
return sys.__formatDateTime(d, s);
|
|
3360
|
-
}
|
|
3361
|
-
},
|
|
3362
|
-
'日時加算': {
|
|
3363
|
-
type: 'func',
|
|
3364
|
-
josi: [['に'], ['を']],
|
|
3365
|
-
pure: true,
|
|
3366
|
-
fn: function (s, a, sys) {
|
|
3367
|
-
const r = ('' + a).match(/([+|-]?)(\d+)(年|ヶ月|日|週間|時間|分|秒)$/);
|
|
3368
|
-
if (!r) {
|
|
3369
|
-
throw new Error('『日付加算』は『(+|-)1(年|ヶ月|日|時間|分|秒)』の書式で指定します。');
|
|
3370
|
-
}
|
|
3371
|
-
switch (r[3]) {
|
|
3372
|
-
case '年': return sys.__exec('日付加算', [s, `${r[1]}${r[2]}/0/0`, sys]);
|
|
3373
|
-
case 'ヶ月': return sys.__exec('日付加算', [s, `${r[1]}0/${r[2]}/0`, sys]);
|
|
3374
|
-
case '週間': return sys.__exec('日付加算', [s, `${r[1]}0/0/${parseInt(r[2]) * 7}`, sys]);
|
|
3375
|
-
case '日': return sys.__exec('日付加算', [s, `${r[1]}0/0/${r[2]}`, sys]);
|
|
3376
|
-
case '時間': return sys.__exec('時間加算', [s, `${r[1]}${r[2]}:0:0`, sys]);
|
|
3377
|
-
case '分': return sys.__exec('時間加算', [s, `${r[1]}0:${r[2]}:0`, sys]);
|
|
3378
|
-
case '秒': return sys.__exec('時間加算', [s, `${r[1]}0:0:${r[2]}`, sys]);
|
|
3379
|
-
}
|
|
3380
|
-
}
|
|
3381
|
-
},
|
|
3382
|
-
'時間ミリ秒取得': {
|
|
3383
|
-
type: 'func',
|
|
3384
|
-
josi: [],
|
|
3385
|
-
pure: true,
|
|
3386
|
-
fn: function () {
|
|
3387
|
-
if (performance && performance.now) {
|
|
3388
|
-
return performance.now();
|
|
3389
|
-
}
|
|
3390
|
-
else if (Date.now) {
|
|
3391
|
-
return Date.now();
|
|
3392
|
-
}
|
|
3393
|
-
else {
|
|
3394
|
-
const now = new Date();
|
|
3395
|
-
return now.getTime();
|
|
3396
|
-
}
|
|
3397
|
-
}
|
|
3398
|
-
},
|
|
3399
|
-
// @デバッグ支援
|
|
3400
|
-
'デバッグ表示': {
|
|
3401
|
-
type: 'func',
|
|
3402
|
-
josi: [['と', 'を', 'の']],
|
|
3403
|
-
pure: true,
|
|
3404
|
-
fn: function (s, sys) {
|
|
3405
|
-
// 行番号の情報を得る
|
|
3406
|
-
const lineInfo = String(sys.__getSysVar('__line', 0)) + '::';
|
|
3407
|
-
const a = lineInfo.split(':', 2);
|
|
3408
|
-
const no = parseInt(String(a[0]).replace('l', '')) + 1;
|
|
3409
|
-
const fname = a[1];
|
|
3410
|
-
// オブジェクトならJSON文字列に変換
|
|
3411
|
-
if (typeof s === 'object') {
|
|
3412
|
-
s = JSON.stringify(s);
|
|
3413
|
-
}
|
|
3414
|
-
s = `${fname}(${no}): ${s}`;
|
|
3415
|
-
sys.__exec('表示', [s, sys]);
|
|
3416
|
-
},
|
|
3417
|
-
return_none: true
|
|
3418
|
-
},
|
|
3419
|
-
'ハテナ関数設定': {
|
|
3420
|
-
type: 'func',
|
|
3421
|
-
josi: [['を', 'の']],
|
|
3422
|
-
pure: true,
|
|
3423
|
-
fn: function (s, sys) {
|
|
3424
|
-
if (typeof s === 'function') {
|
|
3425
|
-
sys.__hatena = s;
|
|
3426
|
-
return;
|
|
3427
|
-
}
|
|
3428
|
-
if (typeof s === 'string') {
|
|
3429
|
-
sys.__hatena = sys.__getSysVar(s, 'デバッグ表示');
|
|
3430
|
-
return;
|
|
3431
|
-
}
|
|
3432
|
-
if (s instanceof Array) {
|
|
3433
|
-
const fa = s.map((fstr) => {
|
|
3434
|
-
if (fstr.substring(0, 3) === 'JS:') {
|
|
3435
|
-
const code = fstr.substring(3);
|
|
3436
|
-
return sys.__evalJS(code, sys);
|
|
3437
|
-
}
|
|
3438
|
-
else {
|
|
3439
|
-
return sys.__getSysVar(fstr, 'デバッグ表示');
|
|
3440
|
-
}
|
|
3441
|
-
});
|
|
3442
|
-
sys.__hatena = (p, sys) => {
|
|
3443
|
-
let param = p;
|
|
3444
|
-
for (const f of fa) {
|
|
3445
|
-
param = f(param, sys);
|
|
3446
|
-
}
|
|
3447
|
-
};
|
|
3448
|
-
return;
|
|
3449
|
-
}
|
|
3450
|
-
sys.__hatena = sys.__getSysVar('デバッグ表示');
|
|
3451
|
-
},
|
|
3452
|
-
return_none: true
|
|
3453
|
-
},
|
|
3454
|
-
'ハテナ関数実行': {
|
|
3455
|
-
type: 'func',
|
|
3456
|
-
josi: [['の', 'を', 'と']],
|
|
3457
|
-
pure: true,
|
|
3458
|
-
fn: function (s, sys) {
|
|
3459
|
-
sys.__hatena(s, sys);
|
|
3460
|
-
},
|
|
3461
|
-
return_none: true
|
|
3462
|
-
},
|
|
3463
|
-
'エラー発生': {
|
|
3464
|
-
type: 'func',
|
|
3465
|
-
josi: [['の', 'で']],
|
|
3466
|
-
pure: true,
|
|
3467
|
-
fn: function (s) {
|
|
3468
|
-
throw new Error(s);
|
|
3469
|
-
},
|
|
3470
|
-
return_none: true
|
|
3471
|
-
},
|
|
3472
|
-
'__DEBUG': {
|
|
3473
|
-
type: 'func',
|
|
3474
|
-
josi: [],
|
|
3475
|
-
pure: true,
|
|
3476
|
-
fn: function (sys) {
|
|
3477
|
-
sys.isDebug = true;
|
|
3478
|
-
console.log(sys);
|
|
3479
|
-
}
|
|
3480
|
-
},
|
|
3481
|
-
'__DEBUG強制待機': { type: 'const', value: 0 }, // @__DEBUGきょうせいたいき
|
|
3482
|
-
'__DEBUGブレイクポイント一覧': { type: 'const', value: [] }, // @__DEBUGぶれいくぽいんといちらん
|
|
3483
|
-
'__DEBUG待機フラグ': { type: 'const', value: 0 }, // @__DEBUGたいきふらぐ
|
|
3484
|
-
'__DEBUG_BP_WAIT': {
|
|
3485
|
-
type: 'func',
|
|
3486
|
-
josi: [['で']],
|
|
3487
|
-
pure: true,
|
|
3488
|
-
asyncFn: true,
|
|
3489
|
-
fn: function (curLine, sys) {
|
|
3490
|
-
return new Promise((resolve) => {
|
|
3491
|
-
const breakpoints = sys.__getSysVar('__DEBUGブレイクポイント一覧');
|
|
3492
|
-
const forceLine = sys.__getSysVar('__DEBUG強制待機');
|
|
3493
|
-
sys.__setSysVar('__DEBUG強制待機', 0);
|
|
3494
|
-
// ブレイクポイント or __DEBUG強制待機 が指定されたか?
|
|
3495
|
-
if (breakpoints.indexOf(curLine) >= 0 || forceLine) {
|
|
3496
|
-
if (sys.__getSysVar('プラグイン名') !== 'メイン') {
|
|
3497
|
-
return;
|
|
3498
|
-
} // 現状メインのみデバッグする
|
|
3499
|
-
console.log(`@__DEBUG_BP_WAIT(${curLine})`);
|
|
3500
|
-
const timerId = setInterval(() => {
|
|
3501
|
-
if (sys.__getSysVar('__DEBUG待機フラグ') === 1) {
|
|
3502
|
-
sys.__setSysVar('__DEBUG待機フラグ', 0);
|
|
3503
|
-
clearInterval(timerId);
|
|
3504
|
-
resolve(curLine);
|
|
3505
|
-
}
|
|
3506
|
-
}, 500);
|
|
3507
|
-
}
|
|
3508
|
-
else {
|
|
3509
|
-
resolve(curLine);
|
|
3510
|
-
}
|
|
3511
|
-
});
|
|
3512
|
-
}
|
|
3513
|
-
},
|
|
3514
|
-
'グローバル関数一覧取得': {
|
|
3515
|
-
type: 'func',
|
|
3516
|
-
josi: [],
|
|
3517
|
-
pure: true,
|
|
3518
|
-
fn: function (sys) {
|
|
3519
|
-
const vars = sys.__varslist[1];
|
|
3520
|
-
const res = [];
|
|
3521
|
-
for (const key of vars.keys()) {
|
|
3522
|
-
res.push(key);
|
|
3523
|
-
}
|
|
3524
|
-
return res;
|
|
3525
|
-
}
|
|
3526
|
-
},
|
|
3527
|
-
'システム関数一覧取得': {
|
|
3528
|
-
type: 'func',
|
|
3529
|
-
josi: [],
|
|
3530
|
-
pure: true,
|
|
3531
|
-
fn: function (sys) {
|
|
3532
|
-
const vars = sys.__v0;
|
|
3533
|
-
const res = [];
|
|
3534
|
-
for (const key of vars.keys()) {
|
|
3535
|
-
if (key.startsWith('__') || key.startsWith('!') || key === 'meta') {
|
|
3536
|
-
continue;
|
|
3537
|
-
}
|
|
3538
|
-
res.push(key);
|
|
3539
|
-
}
|
|
3540
|
-
return res;
|
|
3541
|
-
}
|
|
3542
|
-
},
|
|
3543
|
-
'システム関数存在': {
|
|
3544
|
-
type: 'func',
|
|
3545
|
-
josi: [['が', 'の']],
|
|
3546
|
-
pure: true,
|
|
3547
|
-
fn: function (fname, sys) {
|
|
3548
|
-
return (typeof sys.__getSysVar(fname) !== 'undefined');
|
|
3549
|
-
}
|
|
3550
|
-
},
|
|
3551
|
-
'プラグイン一覧取得': {
|
|
3552
|
-
type: 'func',
|
|
3553
|
-
josi: [],
|
|
3554
|
-
pure: true,
|
|
3555
|
-
fn: function (sys) {
|
|
3556
|
-
const a = [];
|
|
3557
|
-
for (const f in sys.pluginfiles) {
|
|
3558
|
-
a.push(f);
|
|
3559
|
-
}
|
|
3560
|
-
return a;
|
|
3561
|
-
}
|
|
3562
|
-
},
|
|
3563
|
-
'モジュール一覧取得': {
|
|
3564
|
-
type: 'func',
|
|
3565
|
-
josi: [],
|
|
3566
|
-
pure: true,
|
|
3567
|
-
fn: function (sys) {
|
|
3568
|
-
const a = [];
|
|
3569
|
-
for (const f in sys.__module) {
|
|
3570
|
-
a.push(f);
|
|
3571
|
-
}
|
|
3572
|
-
return a;
|
|
3573
|
-
}
|
|
3574
|
-
},
|
|
3575
|
-
'助詞一覧取得': {
|
|
3576
|
-
type: 'func',
|
|
3577
|
-
josi: [],
|
|
3578
|
-
pure: true,
|
|
3579
|
-
asyncFn: false,
|
|
3580
|
-
fn: function (sys) {
|
|
3581
|
-
return sys.josiList;
|
|
3582
|
-
}
|
|
3583
|
-
},
|
|
3584
|
-
'予約語一覧取得': {
|
|
3585
|
-
type: 'func',
|
|
3586
|
-
josi: [],
|
|
3587
|
-
pure: true,
|
|
3588
|
-
asyncFn: false,
|
|
3589
|
-
fn: function (sys) {
|
|
3590
|
-
return sys.reservedWords;
|
|
3591
|
-
}
|
|
3592
|
-
},
|
|
3593
|
-
// @プラグイン管理
|
|
3594
|
-
'プラグイン名': { type: 'const', value: 'メイン' }, // @ぷらぐいんめい
|
|
3595
|
-
'プラグイン名設定': {
|
|
3596
|
-
type: 'func',
|
|
3597
|
-
josi: [['に', 'へ']],
|
|
3598
|
-
pure: true,
|
|
3599
|
-
fn: function (s, sys) {
|
|
3600
|
-
sys.__setSysVar('プラグイン名', s);
|
|
3601
|
-
},
|
|
3602
|
-
return_none: true
|
|
3603
|
-
},
|
|
3604
|
-
'名前空間': { type: 'const', value: '' }, // @なまえくうかん
|
|
3605
|
-
'名前空間設定': {
|
|
3606
|
-
type: 'func',
|
|
3607
|
-
josi: [['に', 'へ']],
|
|
3608
|
-
pure: true,
|
|
3609
|
-
fn: function (s, sys) {
|
|
3610
|
-
// push namespace
|
|
3611
|
-
sys.__namespaceList.push([sys.__getSysVar('名前空間'), sys.__getSysVar('プラグイン名')]);
|
|
3612
|
-
sys.__setSysVar('名前空間', s);
|
|
3613
|
-
},
|
|
3614
|
-
return_none: true
|
|
3615
|
-
},
|
|
3616
|
-
'名前空間ポップ': {
|
|
3617
|
-
type: 'func',
|
|
3618
|
-
josi: [],
|
|
3619
|
-
pure: true,
|
|
3620
|
-
fn: function (sys) {
|
|
3621
|
-
// pop namespace
|
|
3622
|
-
const a = sys.__namespaceList.pop();
|
|
3623
|
-
if (a) {
|
|
3624
|
-
sys.__setSysVar('名前空間', a[0]);
|
|
3625
|
-
sys.__setSysVar('プラグイン名', a[1]);
|
|
3626
|
-
}
|
|
3627
|
-
},
|
|
3628
|
-
return_none: true
|
|
3629
|
-
},
|
|
3630
|
-
// @URLエンコードとパラメータ
|
|
3631
|
-
'URLエンコード': {
|
|
3632
|
-
type: 'func',
|
|
3633
|
-
josi: [['を', 'から']],
|
|
3634
|
-
pure: true,
|
|
3635
|
-
fn: function (text) {
|
|
3636
|
-
return encodeURIComponent(text);
|
|
3637
|
-
}
|
|
3638
|
-
},
|
|
3639
|
-
'URLデコード': {
|
|
3640
|
-
type: 'func',
|
|
3641
|
-
josi: [['を', 'へ', 'に']],
|
|
3642
|
-
pure: true,
|
|
3643
|
-
fn: function (text) {
|
|
3644
|
-
return decodeURIComponent(text);
|
|
3645
|
-
}
|
|
3646
|
-
},
|
|
3647
|
-
'URLパラメータ解析': {
|
|
3648
|
-
type: 'func',
|
|
3649
|
-
josi: [['を', 'の', 'から']],
|
|
3650
|
-
pure: true,
|
|
3651
|
-
fn: function (url, sys) {
|
|
3652
|
-
const res = {};
|
|
3653
|
-
if (typeof url !== 'string') {
|
|
3654
|
-
return res;
|
|
3655
|
-
}
|
|
3656
|
-
const p = url.split('?');
|
|
3657
|
-
if (p.length <= 1) {
|
|
3658
|
-
return res;
|
|
3659
|
-
}
|
|
3660
|
-
const params = p[1].split('&');
|
|
3661
|
-
for (const line of params) {
|
|
3662
|
-
const line2 = line + '=';
|
|
3663
|
-
const kv = line2.split('=');
|
|
3664
|
-
const k = sys.__exec('URLデコード', [kv[0]]);
|
|
3665
|
-
res[k] = sys.__exec('URLデコード', [kv[1]]);
|
|
3666
|
-
}
|
|
3667
|
-
return res;
|
|
3668
|
-
}
|
|
3669
|
-
},
|
|
3670
|
-
// @BASE64
|
|
3671
|
-
'BASE64エンコード': {
|
|
3672
|
-
type: 'func',
|
|
3673
|
-
josi: [['を', 'から']],
|
|
3674
|
-
pure: true,
|
|
3675
|
-
fn: function (text) {
|
|
3676
|
-
// browser?
|
|
3677
|
-
if (typeof (window) !== 'undefined' && window.btoa) {
|
|
3678
|
-
const u8a = new TextEncoder().encode(text);
|
|
3679
|
-
const utf8str = String.fromCharCode.apply(null, u8a);
|
|
3680
|
-
return btoa(utf8str);
|
|
3681
|
-
}
|
|
3682
|
-
// Node?
|
|
3683
|
-
if (typeof (Buffer) !== 'undefined') {
|
|
3684
|
-
return Buffer.from(text).toString('base64');
|
|
3685
|
-
}
|
|
3686
|
-
throw new Error('『BASE64エンコード』は利用できません。');
|
|
3687
|
-
}
|
|
3688
|
-
},
|
|
3689
|
-
'BASE64デコード': {
|
|
3690
|
-
type: 'func',
|
|
3691
|
-
josi: [['を', 'へ', 'に']],
|
|
3692
|
-
pure: true,
|
|
3693
|
-
fn: function (text) {
|
|
3694
|
-
if (typeof (window) !== 'undefined' && window.atob) {
|
|
3695
|
-
const decodedUtf8str = atob(text);
|
|
3696
|
-
const dec = Array.prototype.map.call(decodedUtf8str, c => c.charCodeAt());
|
|
3697
|
-
const decodedArray = new Uint8Array(dec);
|
|
3698
|
-
return new TextDecoder('UTF-8').decode(decodedArray);
|
|
3699
|
-
}
|
|
3700
|
-
// Node?
|
|
3701
|
-
if (typeof (Buffer) !== 'undefined') {
|
|
3702
|
-
return Buffer.from(text, 'base64').toString();
|
|
3703
|
-
}
|
|
3704
|
-
throw new Error('『BASE64デコード』は利用できません。');
|
|
3705
|
-
}
|
|
3706
|
-
},
|
|
3707
|
-
// @パス操作
|
|
3708
|
-
'拡張子抽出': {
|
|
3709
|
-
type: 'func',
|
|
3710
|
-
josi: [['から', 'の']],
|
|
3711
|
-
pure: true,
|
|
3712
|
-
fn: function (fname, sys) {
|
|
3713
|
-
if (fname === null || fname === undefined) {
|
|
3714
|
-
return '';
|
|
3715
|
-
}
|
|
3716
|
-
const sep = sys.pathSeparator || '/';
|
|
3717
|
-
if (fname.indexOf(sep) >= 0) { // パス記号があればファイル名を抽出
|
|
3718
|
-
const parts = fname.split(sep);
|
|
3719
|
-
fname = parts[parts.length - 1];
|
|
3720
|
-
}
|
|
3721
|
-
const m = fname.match(/(\.[a-zA-Z0-9_\-+]+)$/);
|
|
3722
|
-
if (m) {
|
|
3723
|
-
return m[1];
|
|
3724
|
-
}
|
|
3725
|
-
return '';
|
|
3726
|
-
}
|
|
3727
|
-
},
|
|
3728
|
-
'拡張子変更': {
|
|
3729
|
-
type: 'func',
|
|
3730
|
-
josi: [['の', 'を', 'から'], ['に', 'へ']],
|
|
3731
|
-
pure: true,
|
|
3732
|
-
fn: function (fname, ext, sys) {
|
|
3733
|
-
if (fname === null || fname === undefined) {
|
|
3734
|
-
return ext;
|
|
3735
|
-
}
|
|
3736
|
-
const sep = sys.pathSeparator || '/';
|
|
3737
|
-
const pathList = fname.split(sep);
|
|
3738
|
-
const filename = pathList[pathList.length - 1];
|
|
3739
|
-
const pathStr = pathList.slice(0, -1).join(sep);
|
|
3740
|
-
const rawExt = (ext ?? '').trim();
|
|
3741
|
-
let extWithDot = rawExt;
|
|
3742
|
-
if (rawExt !== '') {
|
|
3743
|
-
extWithDot = rawExt.startsWith('.') ? rawExt : '.' + rawExt;
|
|
3744
|
-
}
|
|
3745
|
-
const newFilename = filename.replace(/(\.[a-zA-Z0-9_\-+]+)?$/, extWithDot);
|
|
3746
|
-
return sys.__exec('終端パス追加', [pathStr, sys]) + newFilename;
|
|
3747
|
-
}
|
|
3748
|
-
},
|
|
3749
|
-
'終端パス追加': {
|
|
3750
|
-
type: 'func',
|
|
3751
|
-
josi: [['に', 'へ']],
|
|
3752
|
-
pure: true,
|
|
3753
|
-
fn: function (path, sys) {
|
|
3754
|
-
const sep = sys.pathSeparator || '/';
|
|
3755
|
-
if (path === undefined || path === null || path === '') {
|
|
3756
|
-
return '';
|
|
3757
|
-
}
|
|
3758
|
-
if (path.endsWith(sep)) {
|
|
3759
|
-
return path;
|
|
3760
|
-
}
|
|
3761
|
-
return path + sep;
|
|
3762
|
-
}
|
|
3763
|
-
},
|
|
3764
|
-
'終端パス除去': {
|
|
3765
|
-
type: 'func',
|
|
3766
|
-
josi: [['の', 'から']],
|
|
3767
|
-
pure: true,
|
|
3768
|
-
fn: function (dir, sys) {
|
|
3769
|
-
const sep = sys.pathSeparator || '/';
|
|
3770
|
-
if (!dir) {
|
|
3771
|
-
return '';
|
|
3772
|
-
}
|
|
3773
|
-
if (dir.endsWith(sep)) {
|
|
3774
|
-
return dir.substring(0, dir.length - 1);
|
|
3775
|
-
}
|
|
3776
|
-
else {
|
|
3777
|
-
return dir;
|
|
3778
|
-
}
|
|
3779
|
-
}
|
|
3780
|
-
},
|
|
3781
|
-
'終端パス削除': {
|
|
3782
|
-
type: 'func',
|
|
3783
|
-
josi: [['の', 'から']],
|
|
3784
|
-
pure: true,
|
|
3785
|
-
fn: function (dir, sys) {
|
|
3786
|
-
return sys.__exec('終端パス除去', [dir, sys]);
|
|
3787
|
-
}
|
|
3788
|
-
},
|
|
3789
|
-
'ファイル名抽出': {
|
|
3790
|
-
type: 'func',
|
|
3791
|
-
josi: [['の', 'から']],
|
|
3792
|
-
pure: true,
|
|
3793
|
-
fn: function (dir, sys) {
|
|
3794
|
-
const sep = sys.pathSeparator || '/';
|
|
3795
|
-
const parts = dir.split(sep);
|
|
3796
|
-
return parts[parts.length - 1];
|
|
3797
|
-
}
|
|
3798
|
-
},
|
|
3799
|
-
'パス抽出': {
|
|
3800
|
-
type: 'func',
|
|
3801
|
-
josi: [['の', 'から']],
|
|
3802
|
-
pure: true,
|
|
3803
|
-
fn: function (dir, sys) {
|
|
3804
|
-
const sep = sys.pathSeparator || '/';
|
|
3805
|
-
const parts = dir.split(sep);
|
|
3806
|
-
parts.pop();
|
|
3807
|
-
return parts.join(sep);
|
|
3808
|
-
}
|
|
3809
|
-
}
|
|
3810
|
-
};
|