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.
- package/demo/index.html +0 -1
- package/package.json +5 -4
- package/release/_hash.txt +24 -24
- package/release/_script-tags.txt +13 -13
- 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/editor.js +1 -1
- package/release/nako_gen_async.js +1 -1
- package/release/stats.json +1 -1
- package/release/version.js +1 -1
- package/release/wnako3.js +1 -1
- package/release/wnako3webworker.js +1 -1
- package/release/wnako3webworker.js.LICENSE.txt +164 -0
- package/src/nako3.js +1 -0
- package/src/nako_gen_async.js +97 -10
- package/src/nako_parser3.js +4 -2
- package/src/nako_version.js +2 -2
- package/src/plugin_browser.js +14 -0
- package/src/plugin_browser_ajax.js +4 -3
- package/src/plugin_browser_dom_parts.js +194 -73
- package/src/plugin_node.js +2 -2
- package/src/plugin_system.js +414 -19
- package/test/common/plugin_system_test.js +131 -0
package/src/plugin_system.js
CHANGED
|
@@ -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
|
-
|
|
788
|
-
|
|
789
|
-
|
|
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
|
-
|
|
897
|
-
|
|
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
|
-
|
|
1869
|
+
const sysenv = sys.setAsync(sys)
|
|
1803
1870
|
setTimeout(() => {
|
|
1804
|
-
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
|
|
1953
|
-
|
|
1954
|
-
|
|
1955
|
-
|
|
1956
|
-
|
|
1957
|
-
|
|
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
|
|