nadesiko3 3.2.28 → 3.2.32

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.
@@ -47,6 +47,57 @@ const PluginSystem = {
47
47
  // タイマーに関する処理(タイマーは「!クリア」で全部停止する)
48
48
  sys.__timeout = []
49
49
  sys.__interval = []
50
+ // 日付処理などに使う
51
+ const z2 = sys.__zero2 = (s) => {
52
+ s = '00' + s
53
+ return s.substring(s.length - 2)
54
+ }
55
+ sys.__zero = (s, keta) => {
56
+ let zeroS = ''
57
+ for (let i = 0; i < keta; i++) {zeroS += '0'}
58
+ s = zeroS + s
59
+ return s.substring(s.length - keta)
60
+ }
61
+ sys.__formatDate = (t) => {
62
+ return t.getFullYear() + '/' + z2(t.getMonth() + 1) + '/' + z2(t.getDate())
63
+ }
64
+ sys.__formatTime = (t) => {
65
+ return z2(t.getHours()) + ':' + z2(t.getSeconds()) + ':' + z2(t.getMinutes())
66
+ }
67
+ sys.__formatDateTime = (t, fmt) => {
68
+ const dateStr = t.getFullYear() + '/' + z2(t.getMonth() + 1) + '/' + z2(t.getDate())
69
+ const timeStr = z2(t.getHours()) + ':' + z2(t.getMinutes()) + ':' + z2(t.getSeconds())
70
+ if (fmt.match(/^\d+\/\d+\/\d+\s+\d+:\d+:\d+$/)) {
71
+ return dateStr + ' ' + timeStr
72
+ }
73
+ if (fmt.match(/^\d+\/\d+\/\d+$/)) {
74
+ return dateStr
75
+ }
76
+ if (fmt.match(/^\d+:\d+:\d+$/)) {
77
+ return timeStr
78
+ }
79
+ return dateStr + ' ' + timeStr
80
+ }
81
+ sys.__str2date = (s) => {
82
+ // trim
83
+ s = ('' + s).replace(/(^\s+|\s+$)/, '')
84
+ // is unix time
85
+ if (s.match(/^(\d+|\d+\.\d+)$/)) {
86
+ return new Date(parseFloat(s) * 1000);
87
+ }
88
+ // is time ?
89
+ if (s.match(/^\d+\:\d+(\:\d+)?$/)) {
90
+ const t = new Date()
91
+ const a = (s + ':0').split(':')
92
+ return new Date(`${t.getFullYear()}-${t.getMonth()+1}-${t.getDate()} ${a[0]}:${a[1]}:${a[2]}`)
93
+ }
94
+ // replace splitter to '/'
95
+ s = s.replace(/[\-\s\:]/g, '/')
96
+ s += '/0/0/0' // 日付だけのときのために時間分を足す
97
+ const a = s.split('/')
98
+ const dateStr = `${a[0]}-${a[1]}-${a[2]} ${z2(a[3])}:${z2(a[4])}:${z2(a[5])}`
99
+ return new Date(dateStr)
100
+ }
50
101
  }
51
102
  },
52
103
  '!クリア': {
@@ -421,6 +472,9 @@ const PluginSystem = {
421
472
  type: 'func',
422
473
  josi: [['を', 'で']],
423
474
  fn: function (code, sys) {
475
+ if (sys.__genMode === '非同期モード') {
476
+ throw new Error('非同期モードでは「ナデシコ」は利用できません。')
477
+ }
424
478
  sys.__varslist[0]['表示ログ'] = ''
425
479
  sys.__self.runEx(code, 'immediate-code.nako3', { resetEnv: false, resetLog: true })
426
480
  const out = sys.__varslist[0]['表示ログ'] + ''
@@ -434,6 +488,9 @@ const PluginSystem = {
434
488
  type: 'func',
435
489
  josi: [['を', 'で']],
436
490
  fn: function (code, sys) {
491
+ if (sys.__genMode === '非同期モード') {
492
+ throw new Error('非同期モードでは「ナデシコ続」は利用できません。')
493
+ }
437
494
  sys.__self.runEx(code, 'immediate-code.nako3', { resetEnv: false, resetLog: false })
438
495
  const out = sys.__varslist[0]['表示ログ'] + ''
439
496
  if (out) {
@@ -784,12 +841,9 @@ const PluginSystem = {
784
841
  josi: [['で'], ['の']],
785
842
  pure: true,
786
843
  fn: function (s, a) {
787
- let cnt = 0
788
- const re = new RegExp(a.replace(/(.)/g, '\\$1'), 'g')
789
- String(s).replace(re, m => {
790
- cnt++
791
- })
792
- return cnt
844
+ s = '' + s
845
+ a = '' + a
846
+ return s.split(a).length - 1
793
847
  }
794
848
  },
795
849
  'MID': { // @文字列SのA文字目からCNT文字を抽出する // @MID
@@ -852,6 +906,20 @@ const PluginSystem = {
852
906
  return ('' + s).split('' + a)
853
907
  }
854
908
  },
909
+ '文字列分割': { // @文字列Sを区切り文字Aで分割して配列で返す // @もじれつぶんかつ
910
+ type: 'func',
911
+ josi: [['を'], ['で']],
912
+ pure: true,
913
+ fn: function (s, a) {
914
+ s = '' + s
915
+ a = '' + a
916
+ const i = s.indexOf(a)
917
+ if (i < 0) {
918
+ return [s]
919
+ }
920
+ return [s.substr(0, i), s.substr(i + a.length)]
921
+ }
922
+ },
855
923
  '切取': { // @文字列Sから文字列Aまでの部分を抽出する。切り取った残りは特殊変数『対象』に代入される。(v1非互換) // @きりとる
856
924
  type: 'func',
857
925
  josi: [['から', 'の'], ['まで', 'を']],
@@ -893,9 +961,8 @@ const PluginSystem = {
893
961
  josi: [['の', 'で'], ['を'], ['に', 'へ']],
894
962
  pure: true,
895
963
  fn: function (s, a, b) {
896
- s = String(s)
897
- const re = new RegExp(a.replace(/(.)/g, '\\$1'), '')
898
- return s.replace(re, b)
964
+ // replaceは最初の一度だけ置換する
965
+ return String(s).replace(a, b)
899
966
  }
900
967
  },
901
968
  'トリム': { // @文字列Sの前後にある空白を削除する // @とりむ
@@ -1591,7 +1658,7 @@ const PluginSystem = {
1591
1658
  const row = []
1592
1659
  res.push(row)
1593
1660
  for (let c = 0; c < rows; c++) {
1594
- row[c] = a[c][r] ? a[c][r] : ''
1661
+ row[c] = (a[c][r] !== undefined) ? a[c][r] : ''
1595
1662
  }
1596
1663
  }
1597
1664
  return res
@@ -1799,9 +1866,9 @@ const PluginSystem = {
1799
1866
  pure: false,
1800
1867
  fn: function (n, sys) {
1801
1868
  if (sys.__genMode === '非同期モード') {
1802
- sys.async = true
1869
+ const sysenv = sys.setAsync(sys)
1803
1870
  setTimeout(() => {
1804
- sys.nextAsync(sys)
1871
+ sys.compAsync(sys, sysenv)
1805
1872
  }, n * 1000)
1806
1873
  } else {
1807
1874
  if (sys.resolve === undefined) { throw new Error('『秒待機』命令は『!非同期モード』で使ってください。') }
@@ -1840,6 +1907,7 @@ const PluginSystem = {
1840
1907
  // 使用中リストに追加したIDを削除
1841
1908
  const i = sys.__timeout.indexOf(timerId)
1842
1909
  if (i >= 0) { sys.__timeout.splice(i, 1) }
1910
+ if (sys.__genMode === '非同期モード') { sys.newenv = true }
1843
1911
  try {
1844
1912
  f(timerId, sys)
1845
1913
  } catch (e) {
@@ -1864,6 +1932,7 @@ const PluginSystem = {
1864
1932
  if (typeof f === 'string') { f = sys.__findFunc(f, '秒毎') }
1865
1933
  // タイマーをセット
1866
1934
  const timerId = setInterval(() => {
1935
+ if (sys.__genMode === '非同期モード') { sys.newenv = true }
1867
1936
  f(timerId, sys)
1868
1937
  }, parseFloat(n) * 1000)
1869
1938
  // タイマーIDを追加
@@ -1922,6 +1991,7 @@ const PluginSystem = {
1922
1991
  return_none: true
1923
1992
  },
1924
1993
  // @日時処理(簡易)
1994
+ '元号データ': { type: 'const', value: [{ '元号': '令和', '改元日': '2019/05/01' }, { '元号': '平成', '改元日': '1989/01/08' }, { '元号': '昭和', '改元日': '1926/12/25' }, { '元号': '大正', '改元日': '1912/07/30' }, { '元号': '明治', '改元日': '1868/10/23' }] }, // @げんごうでーた
1925
1995
  '今': { // @現在時刻を「HH:mm:ss」の形式で返す // @いま
1926
1996
  type: 'func',
1927
1997
  josi: [],
@@ -1941,20 +2011,99 @@ const PluginSystem = {
1941
2011
  pure: true,
1942
2012
  fn: function () {
1943
2013
  const now = new Date()
1944
- return now.getTime() / 1000
2014
+ return Math.floor(now.getTime() / 1000)
2015
+ }
2016
+ },
2017
+ 'システム時間ミリ秒': { // @現在のUNIX時間 (UTC(1970/1/1)からの経過秒数) をミリ秒で返す // @しすてむじかんみりびょう
2018
+ type: 'func',
2019
+ josi: [],
2020
+ pure: true,
2021
+ fn: function () {
2022
+ const now = new Date()
2023
+ return now.getTime()
1945
2024
  }
1946
2025
  },
1947
2026
  '今日': { // @今日の日付を「YYYY/MM/DD」の形式で返す // @きょう
2027
+ type: 'func',
2028
+ josi: [],
2029
+ pure: false,
2030
+ fn: function (sys) {
2031
+ return sys.__formatDate(new Date())
2032
+ }
2033
+ },
2034
+ '明日': { // @明日の日付を「YYYY/MM/DD」の形式で返す // @あした
2035
+ type: 'func',
2036
+ josi: [],
2037
+ pure: false,
2038
+ fn: function (sys) {
2039
+ const t = Date.now() + (24 * 60 * 60 * 1000)
2040
+ return sys.__formatDate(new Date(t))
2041
+ }
2042
+ },
2043
+ '昨日': { // @昨日の日付を「YYYY/MM/DD」の形式で返す // @きのう
1948
2044
  type: 'func',
1949
2045
  josi: [],
1950
2046
  pure: true,
1951
2047
  fn: function () {
1952
- const z2 = (n) => {
1953
- n = '00' + n
1954
- return n.substr(n.length - 2, 2)
1955
- }
1956
- const t = new Date()
1957
- return t.getFullYear() + '/' + z2(t.getMonth() + 1) + '/' + z2(t.getDate())
2048
+ const t = Date.now() - (24 * 60 * 60 * 1000)
2049
+ return sys.__formatDate(new Date(t))
2050
+ }
2051
+ },
2052
+ '今年': { // @今年が何年かを西暦で返す // @ことし
2053
+ type: 'func',
2054
+ josi: [],
2055
+ pure: true,
2056
+ fn: function () {
2057
+ return (new Date()).getFullYear()
2058
+ }
2059
+ },
2060
+ '来年': { // @来年が何年かを西暦で返す // @らいねん
2061
+ type: 'func',
2062
+ josi: [],
2063
+ pure: true,
2064
+ fn: function () {
2065
+ return (new Date()).getFullYear() + 1
2066
+ }
2067
+ },
2068
+ '去年': { // @去年が何年かを西暦で返す // @きょねん
2069
+ type: 'func',
2070
+ josi: [],
2071
+ pure: true,
2072
+ fn: function () {
2073
+ return (new Date()).getFullYear() - 1
2074
+ }
2075
+ },
2076
+ '今月': { // @今月が何月かを返す // @こんげつ
2077
+ type: 'func',
2078
+ josi: [],
2079
+ pure: true,
2080
+ fn: function () {
2081
+ return (new Date()).getMonth() + 1
2082
+ }
2083
+ },
2084
+ '来月': { // @来月が何月かを返す // @らいげつ
2085
+ type: 'func',
2086
+ josi: [],
2087
+ pure: true,
2088
+ fn: function () {
2089
+ return (new Date()).getMonth() + 2
2090
+ }
2091
+ },
2092
+ '先月': { // @先月が何月かをかえす // @せんげつ
2093
+ type: 'func',
2094
+ josi: [],
2095
+ pure: true,
2096
+ fn: function () {
2097
+ return (new Date()).getMonth()
2098
+ }
2099
+ },
2100
+ '曜日': { // @Sに指定した日付の曜日をで返す。不正な日付の場合は今日の曜日番号を返す。 // @ようび
2101
+ type: 'func',
2102
+ josi: [['の']],
2103
+ pure: false,
2104
+ fn: function (s, sys) {
2105
+ const d = sys.__str2date(s)
2106
+ return '日月火水木金土'.charAt(d.getDay() % 7)
1958
2107
  }
1959
2108
  },
1960
2109
  '曜日番号取得': { // @Sに指定した日付の曜日番号をで返す。不正な日付の場合は今日の曜日番号を返す。(0=日/1=月/2=火/3=水/4=木/5=金/6=土) // @ようびばんごうしゅとく
@@ -1967,6 +2116,223 @@ const PluginSystem = {
1967
2116
  return t.getDay()
1968
2117
  }
1969
2118
  },
2119
+ 'UNIXTIME変換': { // @日時SをUNIX時間 (UTC(1970/1/1)からの経過秒数) に変換して返す(v1非互換) // @UNIXTIMEへんかん
2120
+ type: 'func',
2121
+ josi: [['の','を','から']],
2122
+ pure: false,
2123
+ fn: function (s, sys) {
2124
+ const d = sys.__str2date(s)
2125
+ return d.getTime() / 1000;
2126
+ }
2127
+ },
2128
+ 'UNIX時間変換': { // @日時SをUNIX時間 (UTC(1970/1/1)からの経過秒数) に変換して返す(v1非互換) // @UNIXじかんへんかん
2129
+ type: 'func',
2130
+ josi: [['の','を','から']],
2131
+ pure: false,
2132
+ fn: function (s, sys) {
2133
+ const d = sys.__str2date(s)
2134
+ return d.getTime() / 1000;
2135
+ }
2136
+ },
2137
+ '日時変換': { // @UNIX時間 (UTC(1970/1/1)からの経過秒数) を「YYYY/MM/DD HH:mm:ss」の形式に変換 // @にちじへんかん
2138
+ type: 'func',
2139
+ josi: [['を', 'から']],
2140
+ pure: false,
2141
+ fn: function (tm, sys) {
2142
+ const t = tm * 1000
2143
+ return sys.__formatDateTime(new Date(t), '2022/01/01 00:00:00')
2144
+ }
2145
+ },
2146
+ '日時書式変換': { // @UNIX時間TM(または日付文字列)を「YYYY/MM/DD HH:mm:ss」または「YY-M-D H:m:s」その他、W:曜日、WWW:曜日英、MMM:月英、ccc:ミリ秒の書式に変換 // @にちじしょしきへんかん
2147
+ type: 'func',
2148
+ josi: [['を'], ['で']],
2149
+ pure: false,
2150
+ fn: function (tm, fmt, sys) {
2151
+ const t = sys.__str2date(tm)
2152
+ fmt = fmt.replace(/(YYYY|ccc|WWW|MMM|YY|MM|DD|HH|mm|ss|[MDHmsW])/g, (m) => {
2153
+ switch (m) {
2154
+ case 'YYYY': return t.getFullYear()
2155
+ case 'YY': return ('' + t.getFullYear()).substring(2)
2156
+ case 'MM': return sys.__zero2(t.getMonth() + 1)
2157
+ case 'DD': return sys.__zero2(t.getDate())
2158
+ case 'M': return (t.getMonth() + 1)
2159
+ case 'D': return (t.getDate())
2160
+ case 'HH': return sys.__zero2(t.getHours())
2161
+ case 'mm': return sys.__zero2(t.getMinutes())
2162
+ case 'ss': return sys.__zero2(t.getSeconds())
2163
+ case 'ccc': return sys.__zero(t.getMilliseconds(), 3)
2164
+ case 'H': return (t.getHours())
2165
+ case 'm': return (t.getMinutes())
2166
+ case 's': return (t.getSeconds())
2167
+ case 'W': return '日月火水木金土'.charAt(t.getDay() % 7)
2168
+ case 'WWW': return ['Sun','Mon','Tue','Wed','Thu','Fri','Sat'][t.getDay() % 7]
2169
+ case 'MMM': return ['Jan','Feb','Mar','Apr','May','Jun','Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'][t.getMonth()]
2170
+ }
2171
+ return m
2172
+ })
2173
+ return fmt
2174
+ }
2175
+ },
2176
+ '和暦変換': { // @Sを和暦に変換する。Sは明治以降の日付が有効。 // @われきへんかん
2177
+ type: 'func',
2178
+ josi: [['を']],
2179
+ pure: false,
2180
+ fn: function (s, sys) {
2181
+ const d = sys.__str2date(s)
2182
+ const t = d.getTime()
2183
+ for (const era of sys.__v0['元号データ']) {
2184
+ const gengo = era['元号']
2185
+ const d2 = sys.__str2date(era['改元日'])
2186
+ const t2 = d2.getTime()
2187
+ if (t2 <= t) {
2188
+ let y = (d.getFullYear() - d2.getFullYear()) + 1
2189
+ if (y == 1) {y = '元'}
2190
+ return gengo + y + '年' + sys.__zero2(d.getMonth() + 1) + '月' + sys.__zero2(d.getDate()) + '日'
2191
+ }
2192
+ }
2193
+ throw new Error('『和暦変換』は明示以前の日付には対応していません。')
2194
+ }
2195
+ },
2196
+ '年数差': { // @日付AとBの差を年数で求めて返す。A<Bなら正の数、そうでないなら負の数を返す (v1非互換)。 // @ねんすうさ
2197
+ type: 'func',
2198
+ josi: [['と', 'から'], ['の', 'までの']],
2199
+ pure: false,
2200
+ fn: function (a, b, sys) {
2201
+ const t1 = sys.__str2date(a)
2202
+ const t2 = sys.__str2date(b)
2203
+ return (t2.getFullYear() - t1.getFullYear())
2204
+ }
2205
+ },
2206
+ '月数差': { // @日付AとBの差を月数で求めて返す。A<Bなら正の数、そうでないなら負の数を返す (v1非互換)。 // @げっすうさ
2207
+ type: 'func',
2208
+ josi: [['と', 'から'], ['の', 'までの']],
2209
+ pure: false,
2210
+ fn: function (a, b, sys) {
2211
+ const t1 = sys.__str2date(a)
2212
+ const t2 = sys.__str2date(b)
2213
+ return ((t2.getFullYear() * 12 + t2.getMonth()) -
2214
+ (t1.getFullYear() * 12 + t1.getMonth()))
2215
+ }
2216
+ },
2217
+ '日数差': { // @日付AとBの差を日数で求めて返す。A<Bなら正の数、そうでないなら負の数を返す。 // @にっすうさ
2218
+ type: 'func',
2219
+ josi: [['と', 'から'], ['の', 'までの']],
2220
+ pure: false,
2221
+ fn: function (a, b, sys) {
2222
+ const t1 = Math.ceil(sys.__str2date(a).getTime() / 1000)
2223
+ const t2 = Math.ceil(sys.__str2date(b).getTime() / 1000)
2224
+ const days = Math.ceil((t2 - t1) / (60 * 60 * 24))
2225
+ return days
2226
+ }
2227
+ },
2228
+ '時間差': { // @時間AとBの時間の差を求めて返す。A<Bなら正の数、そうでないなら負の数を返す。 // @じかんさ
2229
+ type: 'func',
2230
+ josi: [['と', 'から'], ['の', 'までの']],
2231
+ pure: false,
2232
+ fn: function (a, b, sys) {
2233
+ const t1 = Math.ceil(sys.__str2date(a).getTime() / 1000)
2234
+ const t2 = Math.ceil(sys.__str2date(b).getTime() / 1000)
2235
+ const hours = Math.ceil((t2 - t1) / (60 * 60))
2236
+ return hours
2237
+ }
2238
+ },
2239
+ '分差': { // @時間AとBの分数の差を求めて返す。A<Bなら正の数、そうでないなら負の数を返す。 // @ふんさ
2240
+ type: 'func',
2241
+ josi: [['と', 'から'], ['の', 'までの']],
2242
+ pure: false,
2243
+ fn: function (a, b, sys) {
2244
+ const t1 = Math.ceil(sys.__str2date(a).getTime() / 1000)
2245
+ const t2 = Math.ceil(sys.__str2date(b).getTime() / 1000)
2246
+ const min = Math.ceil((t2 - t1) / (60))
2247
+ return min
2248
+ }
2249
+ },
2250
+ '秒差': { // @時間AとBの差を秒差で求めて返す。A<Bなら正の数、そうでないなら負の数を返す。 // @びょうさ
2251
+ type: 'func',
2252
+ josi: [['と', 'から'], ['の', 'までの']],
2253
+ pure: false,
2254
+ fn: function (a, b, sys) {
2255
+ const t1 = Math.ceil(sys.__str2date(a).getTime() / 1000)
2256
+ const t2 = Math.ceil(sys.__str2date(b).getTime() / 1000)
2257
+ const sec = Math.ceil((t2 - t1))
2258
+ return sec
2259
+ }
2260
+ },
2261
+ '日時差': { // @日時AとBの差を種類unitで返す。A<Bなら正の数、そうでないなら負の数を返す (v1非互換)。 // @にちじさ
2262
+ type: 'func',
2263
+ josi: [['と', 'から'], ['の', 'までの'], ['による']],
2264
+ pure: false,
2265
+ fn: function (a, b, unit, sys) {
2266
+ switch (unit) {
2267
+ case '年': return sys.__exec('年数差', [a, b, sys])
2268
+ case '月': return sys.__exec('月数差', [a, b, sys])
2269
+ case '日': return sys.__exec('日数差', [a, b, sys])
2270
+ case '時間': return sys.__exec('時間差', [a, b, sys])
2271
+ case '分': return sys.__exec('分差', [a, b, sys])
2272
+ case '秒': return sys.__exec('秒差', [a, b, sys])
2273
+ }
2274
+ throw new Error('『日時差』で不明な単位です。')
2275
+ }
2276
+ },
2277
+ '時間加算': { // @時間SにAを加えて返す。Aには「(+|-)hh:nn:dd」で指定する。 // @じかんかさん
2278
+ type: 'func',
2279
+ josi: [['に'], ['を']],
2280
+ pure: false,
2281
+ fn: function (s, a, sys) {
2282
+ let op = a.charAt(0)
2283
+ if (op === '-' || op === '+') {
2284
+ a = a.substring(1)
2285
+ }
2286
+ const d = sys.__str2date(s)
2287
+ const aa = (a + ':0:0').split(':')
2288
+ let sec = parseInt(aa[0]) * 60 * 60 +
2289
+ parseInt(aa[1]) * 60 +
2290
+ parseInt(aa[2])
2291
+ if (op === '-') {sec *= -1}
2292
+ const rd = new Date(d.getTime() + (sec * 1000))
2293
+ return sys.__formatDateTime(rd, s)
2294
+ }
2295
+ },
2296
+ '日付加算': { // @日付SにAを加えて返す。Aには「(+|-)yyyy/mm/dd」で指定する。 // @ひづけかさん
2297
+ type: 'func',
2298
+ josi: [['に'], ['を']],
2299
+ pure: false,
2300
+ fn: function (s, a, sys) {
2301
+ let op = 1
2302
+ let opc = a.charAt(0)
2303
+ if (opc === '-' || opc === '+') {
2304
+ a = a.substring(1)
2305
+ if (opc === '-') {op *= -1}
2306
+ }
2307
+ const d = sys.__str2date(s)
2308
+ const aa = (a + '/0/0').split('/')
2309
+ const addY = parseInt(aa[0]) * op
2310
+ const addM = parseInt(aa[1]) * op
2311
+ const addD = parseInt(aa[2]) * op
2312
+ d.setFullYear(d.getFullYear() + addY)
2313
+ d.setMonth(d.getMonth() + addM)
2314
+ d.setDate(d.getDate() + addD)
2315
+ return sys.__formatDateTime(d, s)
2316
+ }
2317
+ },
2318
+ '日時加算': { // @日時SにAを加えて返す。Aは「(+|-)1(年|ヶ月|日|週|時間|分|秒)」のように指定する (v1非互換)。 // @にちじかさん
2319
+ type: 'func',
2320
+ josi: [['に'], ['を']],
2321
+ pure: false,
2322
+ fn: function (s, a, sys) {
2323
+ const r = ('' + a).match(/([+|-]?)(\d+)(年|ヶ月|日|週間|時間|分|秒)$/)
2324
+ if (!r) {throw new Error('『日付加算』は『(+|-)1(年|ヶ月|日|時間|分|秒)』の書式で指定します。')}
2325
+ switch (r[3]) {
2326
+ case '年': return sys.__exec('日付加算', [s, `${r[1]}${r[2]}/0/0`, sys])
2327
+ case 'ヶ月': return sys.__exec('日付加算', [s, `${r[1]}0/${r[2]}/0`, sys])
2328
+ case '週間': return sys.__exec('日付加算', [s, `${r[1]}0/0/${r[2]*7}`, sys])
2329
+ case '日': return sys.__exec('日付加算', [s, `${r[1]}0/0/${r[2]}`, sys])
2330
+ case '時間': return sys.__exec('時間加算', [s, `${r[1]}${r[2]}:0:0`, sys])
2331
+ case '分': return sys.__exec('時間加算', [s, `${r[1]}0:${r[2]}:0`, sys])
2332
+ case '秒': return sys.__exec('時間加算', [s, `${r[1]}0:0:${r[2]}`, sys])
2333
+ }
2334
+ }
2335
+ },
1970
2336
  '時間ミリ秒取得': { // @ミリ秒単位の時間を数値で返す。結果は実装に依存する。 // @じかんみりびょうしゅとく
1971
2337
  type: 'func',
1972
2338
  josi: [],
@@ -2107,6 +2473,35 @@ const PluginSystem = {
2107
2473
  }
2108
2474
  return res
2109
2475
  }
2476
+ },
2477
+ // @BASE64
2478
+ 'BASE64エンコード': { // @BASE64エンコードして返す // @BASE64えんこーど
2479
+ type: 'func',
2480
+ josi: [['を', 'から']],
2481
+ pure: true,
2482
+ fn: function (text) {
2483
+ // browser?
2484
+ if (window.btoa) {
2485
+ const utf8str = String.fromCharCode.apply(null, new TextEncoder('UTF-8').encode(text))
2486
+ return btoa(utf8str)
2487
+ } else {
2488
+ return Buffer.from(text).toString('base64')
2489
+ }
2490
+ }
2491
+ },
2492
+ 'BASE64デコード': { // @BASE64デコードして返す // @BASE64でこーど
2493
+ type: 'func',
2494
+ josi: [['を', 'へ', 'に']],
2495
+ pure: true,
2496
+ fn: function (text) {
2497
+ if (window.atob) {
2498
+ const decodedUtf8str = atob(text)
2499
+ const decodedArray = new Uint8Array(Array.prototype.map.call(decodedUtf8str, c => c.charCodeAt()))
2500
+ return new TextDecoder('UTF-8').decode(decodedArray)
2501
+ } else {
2502
+ return Buffer.from(text, 'base64').toString()
2503
+ }
2504
+ }
2110
2505
  }
2111
2506
  }
2112
2507