xshell 0.0.69 → 0.0.70
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/package.json +1 -1
- package/prototype.d.ts +1 -0
- package/prototype.js +415 -413
- package/prototype.js.map +1 -1
package/package.json
CHANGED
package/prototype.d.ts
CHANGED
package/prototype.js
CHANGED
|
@@ -40,437 +40,439 @@ export const brackets = {
|
|
|
40
40
|
tortoise_shell: ['〔', '〕'],
|
|
41
41
|
};
|
|
42
42
|
const color_map = Object.fromEntries(['red_', 'green_', 'yellow_', 'blue_', 'magenta_', 'cyan_'].map(color => [color, `${color.slice(0, -1)}Bright`]));
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
code >=
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
return width;
|
|
61
|
-
}
|
|
62
|
-
}),
|
|
63
|
-
// ------------ 文本处理工具方法
|
|
64
|
-
...to_method_property_descriptors({
|
|
65
|
-
/** 截取字符串不超过 width 显示宽度的部分,并保留颜色
|
|
66
|
-
找到并记录能容纳 字符串 + … 的最后一个字符的位置 i_fitted
|
|
67
|
-
- 若完整的字符串长度超过 width,返回 slice(0, i_fitted + 1) + …
|
|
68
|
-
- 否则 返回 this
|
|
69
|
-
*/
|
|
70
|
-
truncate(width) {
|
|
71
|
-
const color_bak = this.startsWith('\u001b') ? this.slice(0, 5) : '';
|
|
72
|
-
const s = strip_ansi(this);
|
|
73
|
-
if (width <= 2)
|
|
74
|
-
return this.slice(0, width);
|
|
75
|
-
let i_fitted = 0;
|
|
76
|
-
let fitted_width = 0;
|
|
77
|
-
let cur_width = 0;
|
|
78
|
-
for (let i = 0; i < s.length; i++) {
|
|
79
|
-
const code = s.codePointAt(i);
|
|
80
|
-
if ((code <= 0x1F || (code >= 0x7F && code <= 0x9F)) || // Ignore control characters
|
|
81
|
-
code >= 0x300 && code <= 0x36F // Ignore combining characters
|
|
82
|
-
)
|
|
83
|
-
continue;
|
|
84
|
-
// surrogates (codepoint 需要用两个 utf-16 编码单位表示,因此这里跳过第二个编码单位,防止重复计算显示宽度)
|
|
85
|
-
if (code > 0xFFFF)
|
|
86
|
-
i++;
|
|
87
|
-
const w = is_codepoint_fullwidth(code) ? 2 : 1;
|
|
88
|
-
if (cur_width + w + 2 <= width) {
|
|
89
|
-
i_fitted = i;
|
|
90
|
-
fitted_width += w;
|
|
91
|
-
}
|
|
92
|
-
cur_width += w;
|
|
93
|
-
if (cur_width > width) {
|
|
94
|
-
const i_fitted_next = i_fitted + 1;
|
|
95
|
-
const t = s.slice(0, i_fitted_next) + ' '.repeat(width - 2 - fitted_width) + '…';
|
|
96
|
-
return color_bak ? color_bak + t + '\u001b[39m' : t;
|
|
43
|
+
if (!global.my_prototype_defined) {
|
|
44
|
+
// ------------------------------------ String.prototype
|
|
45
|
+
Object.defineProperties(String.prototype, {
|
|
46
|
+
...to_getter_property_descriptors({
|
|
47
|
+
width() {
|
|
48
|
+
const s = strip_ansi(this.replace(emoji_regex, ' '));
|
|
49
|
+
let width = 0;
|
|
50
|
+
for (let i = 0; i < s.length; i++) {
|
|
51
|
+
const code = s.codePointAt(i);
|
|
52
|
+
if ((code <= 0x1f || (code >= 0x7f && code <= 0x9f)) || // ignore control characters
|
|
53
|
+
code >= 0x300 && code <= 0x36f // ignore combining characters
|
|
54
|
+
)
|
|
55
|
+
continue;
|
|
56
|
+
// surrogates
|
|
57
|
+
if (code > 0xffff)
|
|
58
|
+
i++;
|
|
59
|
+
width += is_codepoint_fullwidth(code) ? 2 : 1;
|
|
97
60
|
}
|
|
61
|
+
return width;
|
|
98
62
|
}
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
const placeholder = $0.slice(1, -1);
|
|
136
|
-
let [placeholder_name, placeholder_pattern] = placeholder.split(':').map(s => s.trim());
|
|
137
|
-
let optional = false;
|
|
138
|
-
if (placeholder_name.endsWith('?')) {
|
|
139
|
-
placeholder_name = placeholder_name.slice(0, -1);
|
|
140
|
-
optional = true;
|
|
63
|
+
}),
|
|
64
|
+
// ------------ 文本处理工具方法
|
|
65
|
+
...to_method_property_descriptors({
|
|
66
|
+
/** 截取字符串不超过 width 显示宽度的部分,并保留颜色
|
|
67
|
+
找到并记录能容纳 字符串 + … 的最后一个字符的位置 i_fitted
|
|
68
|
+
- 若完整的字符串长度超过 width,返回 slice(0, i_fitted + 1) + …
|
|
69
|
+
- 否则 返回 this
|
|
70
|
+
*/
|
|
71
|
+
truncate(width) {
|
|
72
|
+
const color_bak = this.startsWith('\u001b') ? this.slice(0, 5) : '';
|
|
73
|
+
const s = strip_ansi(this);
|
|
74
|
+
if (width <= 2)
|
|
75
|
+
return this.slice(0, width);
|
|
76
|
+
let i_fitted = 0;
|
|
77
|
+
let fitted_width = 0;
|
|
78
|
+
let cur_width = 0;
|
|
79
|
+
for (let i = 0; i < s.length; i++) {
|
|
80
|
+
const code = s.codePointAt(i);
|
|
81
|
+
if ((code <= 0x1F || (code >= 0x7F && code <= 0x9F)) || // Ignore control characters
|
|
82
|
+
code >= 0x300 && code <= 0x36F // Ignore combining characters
|
|
83
|
+
)
|
|
84
|
+
continue;
|
|
85
|
+
// surrogates (codepoint 需要用两个 utf-16 编码单位表示,因此这里跳过第二个编码单位,防止重复计算显示宽度)
|
|
86
|
+
if (code > 0xFFFF)
|
|
87
|
+
i++;
|
|
88
|
+
const w = is_codepoint_fullwidth(code) ? 2 : 1;
|
|
89
|
+
if (cur_width + w + 2 <= width) {
|
|
90
|
+
i_fitted = i;
|
|
91
|
+
fitted_width += w;
|
|
92
|
+
}
|
|
93
|
+
cur_width += w;
|
|
94
|
+
if (cur_width > width) {
|
|
95
|
+
const i_fitted_next = i_fitted + 1;
|
|
96
|
+
const t = s.slice(0, i_fitted_next) + ' '.repeat(width - 2 - fitted_width) + '…';
|
|
97
|
+
return color_bak ? color_bak + t + '\u001b[39m' : t;
|
|
98
|
+
}
|
|
141
99
|
}
|
|
142
|
-
$placeholders[placeholder_name] = regx_parts.push(placeholder_pattern ?
|
|
143
|
-
`${placeholder_pattern.bracket()}${optional ? '?' : ''}`
|
|
144
|
-
:
|
|
145
|
-
'(.*?)');
|
|
146
|
-
return '';
|
|
147
|
-
});
|
|
148
|
-
add_part(last_end);
|
|
149
|
-
// 最后一个 (.*?) 改为贪心匹配,满足 .{suffix} 的需要
|
|
150
|
-
regx_parts = regx_parts.filter(part => part);
|
|
151
|
-
if (regx_parts.last === '(.*?)')
|
|
152
|
-
regx_parts[regx_parts.length - 1] = '(.*)';
|
|
153
|
-
const pattern_regx = new RegExp(regx_parts.join(''), flags);
|
|
154
|
-
// --- 根据 pattern_regx 去匹配原有字符串,获取匹配结果,生成 placeholders 词典
|
|
155
|
-
const matches = pattern_regx.exec(this);
|
|
156
|
-
if (!matches)
|
|
157
100
|
return this;
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
const
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
101
|
+
},
|
|
102
|
+
pad(width, { character = ' ', position = 'right' } = {}) {
|
|
103
|
+
const _width = this.width;
|
|
104
|
+
if (_width >= width)
|
|
105
|
+
return this;
|
|
106
|
+
if (position === 'right')
|
|
107
|
+
return this + character.repeat((width - _width) / character.width);
|
|
108
|
+
return character.repeat(width - _width) + this;
|
|
109
|
+
},
|
|
110
|
+
limit(width, { character = ' ', position = 'right' } = {}) {
|
|
111
|
+
return this.pad(width, { character, position }).truncate(width);
|
|
112
|
+
},
|
|
113
|
+
to_regexp(preservations, flags = '') {
|
|
114
|
+
const preserved_chars = new Set(preservations);
|
|
115
|
+
const replace_chars = Array.prototype.filter.call('|\\{}()[]^$+*?.-', (c) => !preserved_chars.has(c))
|
|
116
|
+
.map((c) => c === ']' ? '\\]' : c).join('');
|
|
117
|
+
return new RegExp(this.replace(new RegExp(`[${replace_chars}]`, 'g'), '\\$&'), flags);
|
|
118
|
+
},
|
|
119
|
+
to_bool() {
|
|
120
|
+
return this.length && this !== '0' && this.toLowerCase() !== 'false';
|
|
121
|
+
},
|
|
122
|
+
refmt(pattern, pattern_, preservations = '', flags = '', transformer = (name, value) => value || '', pattern_placeholder = /\{.*?\}/g) {
|
|
123
|
+
// --- 转换 pattern 为 pattern_regx
|
|
124
|
+
let last_end = 0;
|
|
125
|
+
// placeholder matched group indexes
|
|
126
|
+
let $placeholders = {};
|
|
127
|
+
let regx_parts = [];
|
|
128
|
+
function add_part(left, right) {
|
|
129
|
+
const part = pattern.slice(left, right);
|
|
130
|
+
if (part)
|
|
131
|
+
regx_parts.push(part.to_regexp(preservations).source.bracket());
|
|
132
|
+
}
|
|
133
|
+
pattern.replace(pattern_placeholder, ($0, offset) => {
|
|
134
|
+
add_part(last_end, offset);
|
|
135
|
+
last_end = offset + $0.length;
|
|
136
|
+
const placeholder = $0.slice(1, -1);
|
|
137
|
+
let [placeholder_name, placeholder_pattern] = placeholder.split(':').map(s => s.trim());
|
|
138
|
+
let optional = false;
|
|
139
|
+
if (placeholder_name.endsWith('?')) {
|
|
140
|
+
placeholder_name = placeholder_name.slice(0, -1);
|
|
141
|
+
optional = true;
|
|
142
|
+
}
|
|
143
|
+
$placeholders[placeholder_name] = regx_parts.push(placeholder_pattern ?
|
|
144
|
+
`${placeholder_pattern.bracket()}${optional ? '?' : ''}`
|
|
145
|
+
:
|
|
146
|
+
'(.*?)');
|
|
147
|
+
return '';
|
|
148
|
+
});
|
|
149
|
+
add_part(last_end);
|
|
150
|
+
// 最后一个 (.*?) 改为贪心匹配,满足 .{suffix} 的需要
|
|
151
|
+
regx_parts = regx_parts.filter(part => part);
|
|
152
|
+
if (regx_parts.last === '(.*?)')
|
|
153
|
+
regx_parts[regx_parts.length - 1] = '(.*)';
|
|
154
|
+
const pattern_regx = new RegExp(regx_parts.join(''), flags);
|
|
155
|
+
// --- 根据 pattern_regx 去匹配原有字符串,获取匹配结果,生成 placeholders 词典
|
|
156
|
+
const matches = pattern_regx.exec(this);
|
|
157
|
+
if (!matches)
|
|
158
|
+
return this;
|
|
159
|
+
const placeholders = Object.fromEntries(Object.entries($placeholders)
|
|
160
|
+
.map(([name, $i]) => [
|
|
161
|
+
[name, matches[$i]],
|
|
162
|
+
[`${name}.before`, matches[$i - 1] || ''],
|
|
163
|
+
[`${name}.after`, matches[$i + 1] || ''],
|
|
164
|
+
])
|
|
165
|
+
.flat());
|
|
166
|
+
// --- 转换 pattern_ 为 replacement_str,如果有 transformer 则在遇到 placeholder 时应用
|
|
167
|
+
last_end = 0;
|
|
168
|
+
let replacement_parts = [];
|
|
169
|
+
pattern_.replace(pattern_placeholder, ($0, offset) => {
|
|
170
|
+
replacement_parts.push(pattern_.slice(last_end, offset));
|
|
171
|
+
last_end = offset + $0.length;
|
|
172
|
+
const placeholder_name = $0.slice(1, -1);
|
|
173
|
+
replacement_parts.push(transformer(placeholder_name, placeholders[placeholder_name], placeholders));
|
|
174
|
+
return '';
|
|
175
|
+
});
|
|
176
|
+
replacement_parts.push(pattern_.slice(last_end));
|
|
177
|
+
return this.replace(pattern_regx, replacement_parts.join(''));
|
|
178
|
+
},
|
|
179
|
+
find(pattern, preservations = '', flags = '', pattern_placeholder = /\{.*?\}/g) {
|
|
180
|
+
// --- 转换 pattern 为 pattern_regx
|
|
181
|
+
let last_end = 0;
|
|
182
|
+
// placeholder matched group index
|
|
183
|
+
let $placeholders = {};
|
|
184
|
+
let regx_parts = [];
|
|
185
|
+
function add_part(left, right) {
|
|
186
|
+
const part = pattern.slice(left, right);
|
|
187
|
+
if (part)
|
|
188
|
+
regx_parts.push(part.to_regexp(preservations).source.bracket());
|
|
189
|
+
}
|
|
190
|
+
pattern.replace(pattern_placeholder, ($0, offset) => {
|
|
191
|
+
add_part(last_end, offset);
|
|
192
|
+
last_end = offset + $0.length;
|
|
193
|
+
const placeholder = $0.slice(1, -1);
|
|
194
|
+
let [placeholder_name, placeholder_pattern] = placeholder.split(':').map(s => s.trim());
|
|
195
|
+
let optional = false;
|
|
196
|
+
if (placeholder_name.endsWith('?')) {
|
|
197
|
+
placeholder_name = placeholder_name.slice(0, -1);
|
|
198
|
+
optional = true;
|
|
199
|
+
}
|
|
200
|
+
$placeholders[placeholder_name] = regx_parts.push(placeholder_pattern ?
|
|
201
|
+
`${placeholder_pattern.bracket()}${optional ? '?' : ''}`
|
|
202
|
+
:
|
|
203
|
+
'(.*?)');
|
|
204
|
+
return '';
|
|
205
|
+
});
|
|
206
|
+
add_part(last_end);
|
|
207
|
+
// 最后一个 (.*?) 改为贪心匹配,满足 .{suffix} 的需要
|
|
208
|
+
regx_parts = regx_parts.filter(part => part);
|
|
209
|
+
if (regx_parts[regx_parts.length - 1] === '(.*?)')
|
|
210
|
+
regx_parts[regx_parts.length - 1] = '(.*)';
|
|
211
|
+
const pattern_regx = new RegExp(regx_parts.join(''), flags);
|
|
212
|
+
// --- 根据 pattern_regx 去匹配原有字符串,获取匹配结果,生成 placeholders 词典
|
|
213
|
+
const matches = pattern_regx.exec(this);
|
|
214
|
+
if (!matches)
|
|
215
|
+
return {};
|
|
216
|
+
return Object.fromEntries(Object.entries($placeholders)
|
|
217
|
+
.map(([name, $i]) => [name, matches[$i] || '']));
|
|
218
|
+
},
|
|
219
|
+
quote(type = 'single') {
|
|
220
|
+
if (type === 'psh')
|
|
221
|
+
return `& ${this.quote()}`;
|
|
222
|
+
return this.surround(quotes[type]);
|
|
223
|
+
},
|
|
224
|
+
bracket(shape = 'round') {
|
|
225
|
+
return this.surround(...brackets[shape]);
|
|
226
|
+
},
|
|
227
|
+
surround(left, right) {
|
|
228
|
+
return left + this + (right || left);
|
|
229
|
+
},
|
|
230
|
+
surround_tag(tag_name) {
|
|
231
|
+
return '<' + tag_name + '>' + this + '</' + tag_name + '>';
|
|
232
|
+
},
|
|
233
|
+
to_lf() {
|
|
234
|
+
return this.replace(/\r\n/g, '\n');
|
|
235
|
+
},
|
|
236
|
+
to_crlf() {
|
|
237
|
+
return this.replace(/\n/g, '\r\n');
|
|
238
|
+
},
|
|
239
|
+
rm(pattern, flags = 'g') {
|
|
240
|
+
if (typeof pattern === 'string')
|
|
241
|
+
pattern = new RegExp(pattern, flags);
|
|
242
|
+
return this.replace(pattern, '');
|
|
243
|
+
},
|
|
244
|
+
split_lines(delimiter = /\r?\n/) {
|
|
245
|
+
let lines = this.split(delimiter);
|
|
246
|
+
if (lines.last === '')
|
|
247
|
+
lines.pop();
|
|
248
|
+
return lines;
|
|
249
|
+
},
|
|
250
|
+
split_indent() {
|
|
251
|
+
let i = 0;
|
|
252
|
+
let indent = 0;
|
|
253
|
+
for (; i < this.length; i++)
|
|
254
|
+
if (this[i] === ' ')
|
|
255
|
+
indent += 1;
|
|
256
|
+
else if (this[i] === '\t')
|
|
257
|
+
indent += 4;
|
|
258
|
+
else
|
|
259
|
+
break;
|
|
260
|
+
return {
|
|
261
|
+
indent,
|
|
262
|
+
text: this.slice(i)
|
|
263
|
+
};
|
|
264
|
+
},
|
|
265
|
+
trim_doc_comment() {
|
|
266
|
+
return `/** ${this.slice(3, -2).replace(/\s*\*\s*/g, ' ').replace(/@(param|params|return) \{.*?\}\s*/g, '').trim()} */`;
|
|
267
|
+
},
|
|
268
|
+
to_base64() {
|
|
269
|
+
return Buffer.from(this).toString('base64');
|
|
270
|
+
},
|
|
271
|
+
decode_base64(buffer = false) {
|
|
272
|
+
const buf = Buffer.from(this, 'base64');
|
|
273
|
+
if (buffer)
|
|
274
|
+
return buf;
|
|
275
|
+
return buf.toString();
|
|
276
|
+
},
|
|
277
|
+
strip_ansi() {
|
|
278
|
+
return strip_ansi(this);
|
|
279
|
+
},
|
|
280
|
+
space() {
|
|
281
|
+
if (!this)
|
|
282
|
+
return this;
|
|
283
|
+
let text_;
|
|
284
|
+
text_ = this
|
|
285
|
+
.replace(new RegExp(cjk + `(['"])`, 'g'), '$1 $2')
|
|
286
|
+
.replace(new RegExp(`(['"])` + cjk, 'g'), '$1 $2')
|
|
287
|
+
.replace(/(["']+)\s*(.+?)\s*(["']+)/g, '$1$2$3')
|
|
288
|
+
.replace(new RegExp(cjk + '([\\+\\-\\*\\/=&\\\\\\|<>])([A-Za-z0-9])', 'g'), '$1 $2 $3')
|
|
289
|
+
.replace(new RegExp('([A-Za-z0-9])([\\+\\-\\*\\/=&\\\\\\|<>])' + cjk, 'g'), '$1 $2 $3');
|
|
290
|
+
const text_bak = text_;
|
|
291
|
+
text_ = text_.replace(new RegExp(cjk + '([\\(\\[\\{<\u201c]+(.*?)[\\)\\]\\}>\u201d]+)' + cjk, 'g'), '$1 $2 $4');
|
|
292
|
+
if (text_ === text_bak)
|
|
293
|
+
text_ = text_
|
|
294
|
+
.replace(new RegExp(cjk + '([\\(\\[\\{<\u201c>])', 'g'), '$1 $2')
|
|
295
|
+
.replace(new RegExp('([\\)\\]\\}>\u201d<])' + cjk, 'g'), '$1 $2');
|
|
296
|
+
return text_
|
|
297
|
+
.replace(/([\(\[\{<\u201c]+)(\s*)(.+?)(\s*)([\)\]\}>\u201d]+)/g, '$1$3$5')
|
|
298
|
+
.replace(new RegExp(cjk + '([~!;:,\\.\\?\u2026])([A-Za-z0-9])', 'g'), '$1$2 $3')
|
|
299
|
+
.replace(new RegExp(cjk + '([A-Za-z0-9`\\$%\\^&\\*\\-=\\+\\\\\\|\\/@\u00a1-\u00ff\u2022\u2027\u2150-\u218f])', 'g'), '$1 $2')
|
|
300
|
+
.replace(new RegExp('([A-Za-z0-9`\\$%\\^&\\*\\-=\\+\\\\\\|\\/@\u00a1-\u00ff\u2022\u2027\u2150-\u218f])' + cjk, 'g'), '$1 $2');
|
|
188
301
|
}
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
302
|
+
}),
|
|
303
|
+
// ------------ chalk colors
|
|
304
|
+
...Object.fromEntries([
|
|
305
|
+
'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'grey',
|
|
306
|
+
'red_', 'green_', 'yellow_', 'blue_', 'magenta_', 'cyan_',
|
|
307
|
+
'underline',
|
|
308
|
+
].map(color => ([color, {
|
|
309
|
+
configurable: true,
|
|
310
|
+
get() {
|
|
311
|
+
return chalk[color_map[color] || color](this);
|
|
198
312
|
}
|
|
199
|
-
|
|
200
|
-
|
|
313
|
+
}]))),
|
|
314
|
+
// ------------ 文件路径操作
|
|
315
|
+
...to_getter_property_descriptors({
|
|
316
|
+
fdir() {
|
|
317
|
+
const dir = path.dirname(this);
|
|
318
|
+
return dir.endsWith('/') ? dir : `${dir}/`;
|
|
319
|
+
},
|
|
320
|
+
fname() {
|
|
321
|
+
return path.basename(this);
|
|
322
|
+
},
|
|
323
|
+
fext() {
|
|
324
|
+
return path.extname(this);
|
|
325
|
+
},
|
|
326
|
+
}),
|
|
327
|
+
...to_method_property_descriptors({
|
|
328
|
+
to_slash() {
|
|
329
|
+
if (!this)
|
|
330
|
+
return this;
|
|
331
|
+
return path.normalizeSafe(this);
|
|
332
|
+
},
|
|
333
|
+
to_backslash() {
|
|
334
|
+
return this.replaceAll('/', '\\');
|
|
335
|
+
},
|
|
336
|
+
})
|
|
337
|
+
});
|
|
338
|
+
// ------------------------------------ Date.prototype
|
|
339
|
+
Object.defineProperties(Date.prototype, to_method_property_descriptors({
|
|
340
|
+
to_str(ms) {
|
|
341
|
+
const [ampm, hour] = (() => {
|
|
342
|
+
let hour = this.getHours();
|
|
343
|
+
if (hour <= 6)
|
|
344
|
+
return [t('凌晨'), hour];
|
|
345
|
+
if (hour <= 8)
|
|
346
|
+
return [t('清晨'), hour];
|
|
347
|
+
if (hour <= 9)
|
|
348
|
+
return [t('早上'), hour];
|
|
349
|
+
if (hour <= 10)
|
|
350
|
+
return [t('上午'), hour];
|
|
351
|
+
if (hour <= 12)
|
|
352
|
+
return [t('中午'), hour];
|
|
353
|
+
hour -= 12;
|
|
354
|
+
if (hour <= 5)
|
|
355
|
+
return [t('下午'), hour];
|
|
356
|
+
if (hour <= 10)
|
|
357
|
+
return [t('晚上'), hour];
|
|
358
|
+
return [t('深夜'), hour];
|
|
359
|
+
})();
|
|
360
|
+
const zero_padding = { character: '0', position: 'left' };
|
|
361
|
+
return '' +
|
|
362
|
+
// year.month.date
|
|
363
|
+
this.getFullYear() + '.' +
|
|
364
|
+
String(this.getMonth() + 1).pad(2, zero_padding) + '.' +
|
|
365
|
+
String(this.getDate()).pad(2, zero_padding) + ' ' +
|
|
366
|
+
// 上午
|
|
367
|
+
ampm + ' ' +
|
|
368
|
+
// 10:03:02
|
|
369
|
+
String(hour).pad(2, zero_padding) + ':' +
|
|
370
|
+
String(this.getMinutes()).pad(2, zero_padding) + ':' +
|
|
371
|
+
String(this.getSeconds()).pad(2, zero_padding) +
|
|
372
|
+
(ms ?
|
|
373
|
+
'.' + String(this.getMilliseconds()).pad(3, zero_padding)
|
|
201
374
|
:
|
|
202
|
-
'
|
|
203
|
-
return '';
|
|
204
|
-
});
|
|
205
|
-
add_part(last_end);
|
|
206
|
-
// 最后一个 (.*?) 改为贪心匹配,满足 .{suffix} 的需要
|
|
207
|
-
regx_parts = regx_parts.filter(part => part);
|
|
208
|
-
if (regx_parts[regx_parts.length - 1] === '(.*?)')
|
|
209
|
-
regx_parts[regx_parts.length - 1] = '(.*)';
|
|
210
|
-
const pattern_regx = new RegExp(regx_parts.join(''), flags);
|
|
211
|
-
// --- 根据 pattern_regx 去匹配原有字符串,获取匹配结果,生成 placeholders 词典
|
|
212
|
-
const matches = pattern_regx.exec(this);
|
|
213
|
-
if (!matches)
|
|
214
|
-
return {};
|
|
215
|
-
return Object.fromEntries(Object.entries($placeholders)
|
|
216
|
-
.map(([name, $i]) => [name, matches[$i] || '']));
|
|
217
|
-
},
|
|
218
|
-
quote(type = 'single') {
|
|
219
|
-
if (type === 'psh')
|
|
220
|
-
return `& ${this.quote()}`;
|
|
221
|
-
return this.surround(quotes[type]);
|
|
222
|
-
},
|
|
223
|
-
bracket(shape = 'round') {
|
|
224
|
-
return this.surround(...brackets[shape]);
|
|
225
|
-
},
|
|
226
|
-
surround(left, right) {
|
|
227
|
-
return left + this + (right || left);
|
|
375
|
+
'');
|
|
228
376
|
},
|
|
229
|
-
|
|
230
|
-
return
|
|
377
|
+
to_date_str() {
|
|
378
|
+
return this.to_str().split(' ')[0];
|
|
231
379
|
},
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
to_crlf() {
|
|
236
|
-
return this.replace(/\n/g, '\r\n');
|
|
237
|
-
},
|
|
238
|
-
rm(pattern, flags = 'g') {
|
|
239
|
-
if (typeof pattern === 'string')
|
|
240
|
-
pattern = new RegExp(pattern, flags);
|
|
241
|
-
return this.replace(pattern, '');
|
|
242
|
-
},
|
|
243
|
-
split_lines(delimiter = /\r?\n/) {
|
|
244
|
-
let lines = this.split(delimiter);
|
|
245
|
-
if (lines.last === '')
|
|
246
|
-
lines.pop();
|
|
247
|
-
return lines;
|
|
248
|
-
},
|
|
249
|
-
split_indent() {
|
|
250
|
-
let i = 0;
|
|
251
|
-
let indent = 0;
|
|
252
|
-
for (; i < this.length; i++)
|
|
253
|
-
if (this[i] === ' ')
|
|
254
|
-
indent += 1;
|
|
255
|
-
else if (this[i] === '\t')
|
|
256
|
-
indent += 4;
|
|
257
|
-
else
|
|
258
|
-
break;
|
|
259
|
-
return {
|
|
260
|
-
indent,
|
|
261
|
-
text: this.slice(i)
|
|
262
|
-
};
|
|
380
|
+
to_time_str(ms) {
|
|
381
|
+
const [, ampm, time] = this.to_str(ms).split(' ');
|
|
382
|
+
return `${ampm} ${time}`;
|
|
263
383
|
},
|
|
264
|
-
|
|
265
|
-
|
|
384
|
+
}));
|
|
385
|
+
// ------------------------------------ Number.prototype
|
|
386
|
+
Object.defineProperties(Number.prototype, to_method_property_descriptors({
|
|
387
|
+
to_fsize_str(units = 'iec') {
|
|
388
|
+
const { value, unit } = byte_size(this, { units });
|
|
389
|
+
return `${value} ${unit.replace('i', '')}`;
|
|
266
390
|
},
|
|
267
|
-
|
|
268
|
-
return
|
|
391
|
+
to_bin_str() {
|
|
392
|
+
return `0b${this.toString(2)}`;
|
|
269
393
|
},
|
|
270
|
-
|
|
271
|
-
const
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
394
|
+
to_hex_str(length) {
|
|
395
|
+
const s = this.toString(16);
|
|
396
|
+
// 长度自动对齐到 4 的倍数
|
|
397
|
+
if (!length)
|
|
398
|
+
length = Math.ceil(s.length / 4) * 4;
|
|
399
|
+
return `0x${'0'.repeat(length - s.length)}${s}`;
|
|
275
400
|
},
|
|
276
|
-
|
|
277
|
-
return
|
|
401
|
+
to_oct_str() {
|
|
402
|
+
return `0o${this.toString(8)}`;
|
|
278
403
|
},
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
.replace(new RegExp(`(['"])` + cjk, 'g'), '$1 $2')
|
|
286
|
-
.replace(/(["']+)\s*(.+?)\s*(["']+)/g, '$1$2$3')
|
|
287
|
-
.replace(new RegExp(cjk + '([\\+\\-\\*\\/=&\\\\\\|<>])([A-Za-z0-9])', 'g'), '$1 $2 $3')
|
|
288
|
-
.replace(new RegExp('([A-Za-z0-9])([\\+\\-\\*\\/=&\\\\\\|<>])' + cjk, 'g'), '$1 $2 $3');
|
|
289
|
-
const text_bak = text_;
|
|
290
|
-
text_ = text_.replace(new RegExp(cjk + '([\\(\\[\\{<\u201c]+(.*?)[\\)\\]\\}>\u201d]+)' + cjk, 'g'), '$1 $2 $4');
|
|
291
|
-
if (text_ === text_bak)
|
|
292
|
-
text_ = text_
|
|
293
|
-
.replace(new RegExp(cjk + '([\\(\\[\\{<\u201c>])', 'g'), '$1 $2')
|
|
294
|
-
.replace(new RegExp('([\\)\\]\\}>\u201d<])' + cjk, 'g'), '$1 $2');
|
|
295
|
-
return text_
|
|
296
|
-
.replace(/([\(\[\{<\u201c]+)(\s*)(.+?)(\s*)([\)\]\}>\u201d]+)/g, '$1$3$5')
|
|
297
|
-
.replace(new RegExp(cjk + '([~!;:,\\.\\?\u2026])([A-Za-z0-9])', 'g'), '$1$2 $3')
|
|
298
|
-
.replace(new RegExp(cjk + '([A-Za-z0-9`\\$%\\^&\\*\\-=\\+\\\\\\|\\/@\u00a1-\u00ff\u2022\u2027\u2150-\u218f])', 'g'), '$1 $2')
|
|
299
|
-
.replace(new RegExp('([A-Za-z0-9`\\$%\\^&\\*\\-=\\+\\\\\\|\\/@\u00a1-\u00ff\u2022\u2027\u2150-\u218f])' + cjk, 'g'), '$1 $2');
|
|
300
|
-
}
|
|
301
|
-
}),
|
|
302
|
-
// ------------ chalk colors
|
|
303
|
-
...Object.fromEntries([
|
|
304
|
-
'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'grey',
|
|
305
|
-
'red_', 'green_', 'yellow_', 'blue_', 'magenta_', 'cyan_',
|
|
306
|
-
'underline',
|
|
307
|
-
].map(color => ([color, {
|
|
308
|
-
configurable: true,
|
|
309
|
-
get() {
|
|
310
|
-
return chalk[color_map[color] || color](this);
|
|
404
|
+
}));
|
|
405
|
+
// ------------------------------------ Array.prototype
|
|
406
|
+
Object.defineProperties(Array.prototype, {
|
|
407
|
+
...to_getter_property_descriptors({
|
|
408
|
+
last() {
|
|
409
|
+
return this[this.length - 1];
|
|
311
410
|
}
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
const [ampm, hour] = (() => {
|
|
341
|
-
let hour = this.getHours();
|
|
342
|
-
if (hour <= 6)
|
|
343
|
-
return [t('凌晨'), hour];
|
|
344
|
-
if (hour <= 8)
|
|
345
|
-
return [t('清晨'), hour];
|
|
346
|
-
if (hour <= 9)
|
|
347
|
-
return [t('早上'), hour];
|
|
348
|
-
if (hour <= 10)
|
|
349
|
-
return [t('上午'), hour];
|
|
350
|
-
if (hour <= 12)
|
|
351
|
-
return [t('中午'), hour];
|
|
352
|
-
hour -= 12;
|
|
353
|
-
if (hour <= 5)
|
|
354
|
-
return [t('下午'), hour];
|
|
355
|
-
if (hour <= 10)
|
|
356
|
-
return [t('晚上'), hour];
|
|
357
|
-
return [t('深夜'), hour];
|
|
358
|
-
})();
|
|
359
|
-
const zero_padding = { character: '0', position: 'left' };
|
|
360
|
-
return '' +
|
|
361
|
-
// year.month.date
|
|
362
|
-
this.getFullYear() + '.' +
|
|
363
|
-
String(this.getMonth() + 1).pad(2, zero_padding) + '.' +
|
|
364
|
-
String(this.getDate()).pad(2, zero_padding) + ' ' +
|
|
365
|
-
// 上午
|
|
366
|
-
ampm + ' ' +
|
|
367
|
-
// 10:03:02
|
|
368
|
-
String(hour).pad(2, zero_padding) + ':' +
|
|
369
|
-
String(this.getMinutes()).pad(2, zero_padding) + ':' +
|
|
370
|
-
String(this.getSeconds()).pad(2, zero_padding) +
|
|
371
|
-
(ms ?
|
|
372
|
-
'.' + String(this.getMilliseconds()).pad(3, zero_padding)
|
|
373
|
-
:
|
|
374
|
-
'');
|
|
375
|
-
},
|
|
376
|
-
to_date_str() {
|
|
377
|
-
return this.to_str().split(' ')[0];
|
|
378
|
-
},
|
|
379
|
-
to_time_str(ms) {
|
|
380
|
-
const [, ampm, time] = this.to_str(ms).split(' ');
|
|
381
|
-
return `${ampm} ${time}`;
|
|
382
|
-
},
|
|
383
|
-
}));
|
|
384
|
-
// ------------------------------------ Number.prototype
|
|
385
|
-
Object.defineProperties(Number.prototype, to_method_property_descriptors({
|
|
386
|
-
to_fsize_str(units = 'iec') {
|
|
387
|
-
const { value, unit } = byte_size(this, { units });
|
|
388
|
-
return `${value} ${unit.replace('i', '')}`;
|
|
389
|
-
},
|
|
390
|
-
to_bin_str() {
|
|
391
|
-
return `0b${this.toString(2)}`;
|
|
392
|
-
},
|
|
393
|
-
to_hex_str(length) {
|
|
394
|
-
const s = this.toString(16);
|
|
395
|
-
// 长度自动对齐到 4 的倍数
|
|
396
|
-
if (!length)
|
|
397
|
-
length = Math.ceil(s.length / 4) * 4;
|
|
398
|
-
return `0x${'0'.repeat(length - s.length)}${s}`;
|
|
399
|
-
},
|
|
400
|
-
to_oct_str() {
|
|
401
|
-
return `0o${this.toString(8)}`;
|
|
402
|
-
},
|
|
403
|
-
}));
|
|
404
|
-
// ------------------------------------ Array.prototype
|
|
405
|
-
Object.defineProperties(Array.prototype, {
|
|
406
|
-
...to_getter_property_descriptors({
|
|
407
|
-
last() {
|
|
408
|
-
return this[this.length - 1];
|
|
409
|
-
}
|
|
410
|
-
}),
|
|
411
|
-
// --- 文本处理工具方法
|
|
412
|
-
...to_method_property_descriptors({
|
|
413
|
-
log(limit = 10000) {
|
|
414
|
-
const text = this.join('\n') + '\n';
|
|
415
|
-
if (limit === -1 || this.length <= limit)
|
|
416
|
-
console.log(text);
|
|
417
|
-
else if (limit > 0)
|
|
418
|
-
console.log(text.slice(0, limit) + '\n...'.blue);
|
|
419
|
-
else
|
|
420
|
-
console.log('...\n'.blue + text.slice(limit));
|
|
421
|
-
},
|
|
422
|
-
trim_lines({ trim_line = true, rm_empty_lines = true, rm_last_empty_lines = false } = {}) {
|
|
423
|
-
if (!this.length)
|
|
424
|
-
return this;
|
|
425
|
-
let lines = this;
|
|
426
|
-
if (trim_line)
|
|
427
|
-
lines = lines.map(line => line.trim());
|
|
428
|
-
if (rm_empty_lines)
|
|
429
|
-
return lines.filter(line => line);
|
|
430
|
-
if (rm_last_empty_lines) {
|
|
431
|
-
lines.reverse();
|
|
432
|
-
const i_not_empty = lines.findIndex(line => line);
|
|
433
|
-
if (i_not_empty !== -1)
|
|
434
|
-
lines = lines.slice(i_not_empty);
|
|
435
|
-
lines.reverse();
|
|
411
|
+
}),
|
|
412
|
+
// --- 文本处理工具方法
|
|
413
|
+
...to_method_property_descriptors({
|
|
414
|
+
log(limit = 10000) {
|
|
415
|
+
const text = this.join('\n') + '\n';
|
|
416
|
+
if (limit === -1 || this.length <= limit)
|
|
417
|
+
console.log(text);
|
|
418
|
+
else if (limit > 0)
|
|
419
|
+
console.log(text.slice(0, limit) + '\n...'.blue);
|
|
420
|
+
else
|
|
421
|
+
console.log('...\n'.blue + text.slice(limit));
|
|
422
|
+
},
|
|
423
|
+
trim_lines({ trim_line = true, rm_empty_lines = true, rm_last_empty_lines = false } = {}) {
|
|
424
|
+
if (!this.length)
|
|
425
|
+
return this;
|
|
426
|
+
let lines = this;
|
|
427
|
+
if (trim_line)
|
|
428
|
+
lines = lines.map(line => line.trim());
|
|
429
|
+
if (rm_empty_lines)
|
|
430
|
+
return lines.filter(line => line);
|
|
431
|
+
if (rm_last_empty_lines) {
|
|
432
|
+
lines.reverse();
|
|
433
|
+
const i_not_empty = lines.findIndex(line => line);
|
|
434
|
+
if (i_not_empty !== -1)
|
|
435
|
+
lines = lines.slice(i_not_empty);
|
|
436
|
+
lines.reverse();
|
|
437
|
+
return lines;
|
|
438
|
+
}
|
|
436
439
|
return lines;
|
|
440
|
+
},
|
|
441
|
+
trim_license() {
|
|
442
|
+
const i = this.indexOf('/*');
|
|
443
|
+
const j = this.indexOf('*/');
|
|
444
|
+
if (i === 0 && this[i + 1].includes('License'))
|
|
445
|
+
return this.slice(j + 1);
|
|
446
|
+
else
|
|
447
|
+
return this;
|
|
448
|
+
},
|
|
449
|
+
split_indents() {
|
|
450
|
+
return this.map(line => line.split_indent());
|
|
451
|
+
},
|
|
452
|
+
indent(width, character = ' ') {
|
|
453
|
+
return this.map(line => character.repeat(width) + line);
|
|
454
|
+
},
|
|
455
|
+
indent2to4() {
|
|
456
|
+
return this.split_indents()
|
|
457
|
+
.map(line => ' '.repeat(Math.floor(line.indent / 2) * 4) + line.text);
|
|
458
|
+
},
|
|
459
|
+
join_lines(append = true) {
|
|
460
|
+
return `${this.join('\n')}${append ? '\n' : ''}`;
|
|
437
461
|
}
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
if (i === 0 && this[i + 1].includes('License'))
|
|
444
|
-
return this.slice(j + 1);
|
|
445
|
-
else
|
|
446
|
-
return this;
|
|
447
|
-
},
|
|
448
|
-
split_indents() {
|
|
449
|
-
return this.map(line => line.split_indent());
|
|
450
|
-
},
|
|
451
|
-
indent(width, character = ' ') {
|
|
452
|
-
return this.map(line => character.repeat(width) + line);
|
|
453
|
-
},
|
|
454
|
-
indent2to4() {
|
|
455
|
-
return this.split_indents()
|
|
456
|
-
.map(line => ' '.repeat(Math.floor(line.indent / 2) * 4) + line.text);
|
|
457
|
-
},
|
|
458
|
-
join_lines(append = true) {
|
|
459
|
-
return `${this.join('\n')}${append ? '\n' : ''}`;
|
|
462
|
+
})
|
|
463
|
+
});
|
|
464
|
+
Object.defineProperties(BigInt.prototype, to_method_property_descriptors({
|
|
465
|
+
toJSON() {
|
|
466
|
+
return this.toString();
|
|
460
467
|
}
|
|
461
|
-
})
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
}));
|
|
468
|
-
|
|
469
|
-
toJSON() {
|
|
470
|
-
return Object.fromEntries(Object.getOwnPropertyNames(this)
|
|
471
|
-
.map(name => [name, this[name]]));
|
|
472
|
-
}
|
|
473
|
-
}));
|
|
468
|
+
}));
|
|
469
|
+
Object.defineProperties(Error.prototype, to_method_property_descriptors({
|
|
470
|
+
toJSON() {
|
|
471
|
+
return Object.fromEntries(Object.getOwnPropertyNames(this)
|
|
472
|
+
.map(name => [name, this[name]]));
|
|
473
|
+
}
|
|
474
|
+
}));
|
|
475
|
+
}
|
|
474
476
|
export function to_json(obj, replacer) {
|
|
475
477
|
return JSON.stringify(obj, replacer, 4) + '\n';
|
|
476
478
|
}
|
package/prototype.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prototype.js","sourceRoot":"","sources":["prototype.ts"],"names":[],"mappings":"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","sourcesContent":["declare global {\n interface String {\n readonly width: number\n \n // --- 工具方法\n /** 截取字符串不超过 width 显示宽度的部分,并保留颜色 \n 找到并记录能容纳 字符串 + … 的最后一个字符的位置 i_fitted \n 若完整的字符串长度超过 width,返回 slice(0, i_fitted + 1) + … \n 否则 返回 this \n */\n truncate (this: string, width: number): string\n \n /** pad string to `<width>` \n - character?: `' '`\n - position?: `'right'`\n */\n pad (this: string, width: number, { character, position }?: { character?: string, position?: 'left' | 'right'}): string\n \n limit (this: string, width: number, { character, position }?: { character?: string, position?: 'left' | 'right'}): string\n \n to_regexp (this: string, preservations?: string, flags?: string): RegExp\n \n to_bool (this: string): boolean\n \n /** 字符串模式替换 \n - pattern: 匹配部分的格式\n - pattern_: 替换后的格式\n - preservations?: `''` 保留的正则表达式字符\n - flags?: `''` 正则匹配选项\n - transformer?: `(name, matched) => matched || ''` placeholder transformer\n - pattern_placeholder?: `/\\{.*?\\}/g`\n \n ```ts\n 'g:/acgn/海贼王/[Skytree][海贼王][One_Piece][893][GB_BIG5_JP][X264_AAC][1080P][CRRIP][天空树双语字幕组].mkv'.refmt( \n '{dirp}/[Skytree][海贼王][{ en_name: \\\\w+ }][{ episode: \\\\d+ }][GB_BIG5_JP][{encoding}_AAC][1080P][CRRIP][天空树双语字幕组].{format}', \n 'g:/acgn/海贼王/{episode} {encoding}.{format}', \n '\\\\+', \n 'i', \n (name, value) => name === 'episode' ? String(+value + 1) : value.toLowerCase() \n )\n ```\n */\n refmt ( this: string,\n pattern: string,\n \n pattern_: string,\n \n preservations?: string,\n \n flags?: string,\n \n transformer?: (name: string, value: string, placeholders: { [name: string]: string }) => string,\n \n pattern_placeholder?: RegExp\n \n ): string\n \n \n /** 字符串模式搜索\n ```ts\n 'git+https://github.com/tamino-martinius/node-ts-dedent-123.git'.find(\n '^{protocol:[\\\\w+]+}://{hostname:[\\\\w\\\\.]+}/{username}/{project}-{index:\\\\d+}.{suffix}', '^', 'i'\n )\n {\n protocol: 'git+https',\n hostname: 'github.com',\n ...\n }\n ```\n \n - preservations?: `''` 保留的正则表达式字符\n - flags?: `''` 正则匹配选项\n - pattern_placeholder?: `/\\{.*?\\}/g`\n */\n find (this: string,\n \n pattern: string, \n \n preservations?: string, \n \n flags?: string, \n \n pattern_placeholder?: RegExp\n \n ): Record<string, string>\n \n \n /** - type?: `'single'` */\n quote (this: string, type?: keyof typeof quotes | 'psh'): string\n \n /** - shape?: `'parenthesis'` */\n bracket (this: string, shape?: keyof typeof brackets): string\n \n surround (this: string, left: string, right?: string): string\n \n surround_tag (this: string, tag_name: string): string\n \n to_lf (this: string): string\n \n to_crlf (this: string): string\n \n /** 'xxx'.replace(/pattern/g, '') \n 如果 pattern 是 string 则在创建 RegExp 时自动加上 flags (默认 'g'), 否则忽略 flags\n */\n rm (this: string, pattern: string | RegExp, flags?: string): string\n \n \n // --- chalk colors\n readonly red: string\n readonly red_: string\n \n readonly green: string\n readonly green_: string\n \n readonly yellow: string\n readonly yellow_: string\n \n readonly blue: string\n readonly blue_: string\n \n readonly magenta: string\n readonly magenta_: string\n \n readonly cyan: string\n readonly cyan_: string\n \n readonly grey: string\n \n readonly underline: string\n \n strip_ansi (this: string): string\n \n \n // --- 文本处理\n /** 将 string 划分为行,并去掉最后一个 \\n 之后的 '' */\n split_lines (this: string): string[]\n \n trim_doc_comment (this: string): string\n \n split_indent (this: string): { indent: number, text: string }\n \n \n to_base64 (this: string): string\n \n \n /** - buffer: `false` 直接返回 Buffer */\n decode_base64 (this: string): string\n decode_base64 (this: string, buffer: true): Buffer\n decode_base64 (this: string, buffer?: boolean): string | Buffer\n \n \n space (this: string): string\n \n \n // --- 文件路径操作\n fdir: string\n \n /** path.basename, 如: \n - D:/0/aaa.txt -> aaa.txt\n - D:/aaa/ -> aaa\n */\n fname: string\n \n /** .txt */\n fext: string\n \n to_slash (this: string): string\n \n to_backslash (this: string): string\n }\n \n \n interface Date {\n /** - ms?: `false` 显示到 ms */\n to_str (this: Date, ms?: boolean): string\n \n to_date_str (this: Date): string\n \n /** - ms?: `false` 显示到 ms */\n to_time_str (this: Date, ms?: boolean): string\n }\n \n \n interface Number {\n /** 12.4 KB (1 KB = 1024 B) */\n to_fsize_str (this: number, units?: 'iec' | 'metric'): string\n \n \n to_bin_str (this: number): string\n \n to_hex_str (this: number, length?: number): string\n \n to_oct_str (this: number): string\n }\n \n \n interface Array<T> {\n last: T\n \n log (this: string[], limit?: number): void\n \n indent (this: string[], width: number, c?: string): string[]\n \n indent2to4 (this: string[]): string[]\n \n \n // --- 文本处理\n /**\n - trim_line?: `true`\n - rm_empty_lines?: `true`\n - rm_last_empty_lines?: `false`\n */\n trim_lines (this: string[], { trim_line, rm_empty_lines, rm_last_empty_lines }?: { trim_line?: boolean, rm_empty_lines?: boolean, rm_last_empty_lines?: boolean }): string[]\n \n trim_license (this: string[]): string[]\n \n split_indents (this: string[]): { indent: number, text: string }[]\n \n join_lines (): string\n }\n \n \n interface BigInt {\n toJSON (this: bigint): string\n }\n \n \n interface Error {\n toJSON (this: Error): string\n }\n}\n\n\nimport path from 'upath'\nimport byte_size from 'byte-size'\n\nimport EmojiRegex from 'emoji-regex'\n\nimport strip_ansi from 'strip-ansi'\nimport chalk from 'chalk'\nchalk.level = 2\n\nimport { t } from './i18n/instance.js'\n\n\nexport const emoji_regex = EmojiRegex()\n\nexport { chalk }\n\nexport function to_method_property_descriptors (methods: { [name: string]: Function }): PropertyDescriptorMap {\n return Object.fromEntries(\n Object.entries(methods)\n .map(([name, value]) => ([name, {\n configurable: true,\n writable: true,\n enumerable: false,\n value,\n } as PropertyDescriptor])\n ))\n}\n\n\nexport function to_getter_property_descriptors (getters: { [name: string]: Function }): PropertyDescriptorMap {\n return Object.fromEntries(\n Object.entries(getters)\n .map(([name, get]) => ([name, {\n configurable: true,\n enumerable: false,\n get,\n } as PropertyDescriptor])\n ))\n}\n\n\nexport const cjk = '([\\u2e80-\\u9fff\\uf900-\\ufaff])'\n\nexport const quotes = {\n single: \"'\",\n double: '\"',\n backtick: '`',\n}\n\nexport const brackets = {\n round: ['(', ')'],\n square: ['[', ']'],\n curly: ['{', '}'],\n pointy: ['<', '>'],\n corner: ['「', '」'],\n fat: ['【', '】'],\n tortoise_shell: ['〔', '〕'],\n} as const\n\nconst color_map = Object.fromEntries(\n ['red_', 'green_', 'yellow_', 'blue_', 'magenta_', 'cyan_'].map(color =>\n [color, `${color.slice(0, -1)}Bright`])\n)\n\n// ------------------------------------ String.prototype\nObject.defineProperties(String.prototype, {\n ... to_getter_property_descriptors({\n width (this: string) {\n const s = strip_ansi(\n this.replace(emoji_regex, ' ')\n )\n let width = 0\n for (let i = 0; i < s.length; i++) {\n const code = s.codePointAt(i)\n \n if (\n (code <= 0x1f || (code >= 0x7f && code <= 0x9f)) || // ignore control characters\n code >= 0x300 && code <= 0x36f // ignore combining characters\n ) continue\n \n // surrogates\n if (code > 0xffff)\n i++\n \n width += is_codepoint_fullwidth(code) ? 2 : 1\n }\n return width\n }\n }),\n \n \n // ------------ 文本处理工具方法\n ... to_method_property_descriptors({\n /** 截取字符串不超过 width 显示宽度的部分,并保留颜色 \n 找到并记录能容纳 字符串 + … 的最后一个字符的位置 i_fitted \n - 若完整的字符串长度超过 width,返回 slice(0, i_fitted + 1) + … \n - 否则 返回 this \n */\n truncate (this: string, width: number) {\n const color_bak = this.startsWith('\\u001b') ? this.slice(0, 5) : ''\n const s = strip_ansi(this)\n if (width <= 2) return this.slice(0, width)\n let i_fitted = 0\n let fitted_width = 0\n let cur_width = 0\n for (let i = 0; i < s.length; i++) {\n const code = s.codePointAt(i)\n \n if (\n (code <= 0x1F || (code >= 0x7F && code <= 0x9F)) || // Ignore control characters\n code >= 0x300 && code <= 0x36F // Ignore combining characters\n ) continue\n \n // surrogates (codepoint 需要用两个 utf-16 编码单位表示,因此这里跳过第二个编码单位,防止重复计算显示宽度)\n if (code > 0xFFFF)\n i++\n \n const w = is_codepoint_fullwidth(code) ? 2 : 1\n \n if (cur_width + w + 2 <= width) {\n i_fitted = i\n fitted_width += w\n }\n \n cur_width += w\n \n if (cur_width > width) {\n const i_fitted_next = i_fitted + 1\n const t = s.slice(0, i_fitted_next) + ' '.repeat(width - 2 - fitted_width) + '…' \n return color_bak ? color_bak + t + '\\u001b[39m' : t\n }\n }\n return this\n },\n \n \n pad (this: string, width: number, { character = ' ', position = 'right' }: { character?: string, position?: 'left' | 'right'} = { }) {\n const _width = this.width\n if (_width >= width) return this\n if (position === 'right') return this + character.repeat( (width - _width) / character.width )\n return character.repeat(width - _width) + this\n },\n \n \n limit (this: string, width: number, { character = ' ', position = 'right' }: { character?: string, position?: 'left' | 'right'} = { }) {\n return this.pad(width, { character, position }).truncate(width)\n },\n \n \n to_regexp (this: string, preservations: string, flags = ''): RegExp {\n const preserved_chars = new Set(preservations)\n const replace_chars: string = Array.prototype.filter.call('|\\\\{}()[]^$+*?.-', (c: string) => !preserved_chars.has(c))\n .map((c: string) =>\n c === ']' ? '\\\\]' : c\n ).join('')\n \n return new RegExp(\n this.replace(\n new RegExp(`[${replace_chars}]`, 'g'),\n '\\\\$&'\n ), \n flags\n )\n },\n \n \n to_bool (this: string) {\n return this.length && this !== '0' && this.toLowerCase() !== 'false'\n },\n \n refmt (this: string, \n pattern : string,\n pattern_: string,\n preservations: string = '',\n flags = '',\n transformer: (name: string, value: string, placeholders: { [name: string]: string }) => string = (name, value) => value || '',\n pattern_placeholder = /\\{.*?\\}/g,\n ): string {\n // --- 转换 pattern 为 pattern_regx\n let last_end = 0\n \n // placeholder matched group indexes\n let $placeholders: Record<string, number> = { }\n \n let regx_parts = [ ]\n \n function add_part (left: number, right?: number) {\n const part = pattern.slice(left, right)\n if (part)\n regx_parts.push(\n part.to_regexp(preservations).source.bracket()\n )\n }\n \n pattern.replace(pattern_placeholder, ($0, offset) => {\n add_part(last_end, offset)\n last_end = offset + $0.length\n \n const placeholder = $0.slice(1, -1)\n let [placeholder_name, placeholder_pattern] = placeholder.split(':').map(s => s.trim())\n let optional = false\n if (placeholder_name.endsWith('?')) {\n placeholder_name = placeholder_name.slice(0, -1)\n optional = true\n }\n $placeholders[placeholder_name] = regx_parts.push(\n placeholder_pattern ? \n `${placeholder_pattern.bracket()}${optional ? '?' : ''}`\n :\n '(.*?)'\n )\n return ''\n })\n \n add_part(last_end)\n \n // 最后一个 (.*?) 改为贪心匹配,满足 .{suffix} 的需要\n regx_parts = regx_parts.filter(part => part)\n if (regx_parts.last === '(.*?)')\n regx_parts[regx_parts.length - 1] = '(.*)'\n \n const pattern_regx = new RegExp(regx_parts.join(''), flags)\n \n \n // --- 根据 pattern_regx 去匹配原有字符串,获取匹配结果,生成 placeholders 词典\n const matches = pattern_regx.exec(this)\n \n if (!matches) return this\n \n const placeholders = Object.fromEntries(\n Object.entries($placeholders)\n .map(([name, $i]) => [\n [name, matches[$i]],\n [`${name}.before`, matches[$i - 1] || ''],\n [`${name}.after`, matches[$i + 1] || ''],\n ])\n .flat()\n )\n \n \n // --- 转换 pattern_ 为 replacement_str,如果有 transformer 则在遇到 placeholder 时应用\n last_end = 0\n let replacement_parts = [ ]\n \n pattern_.replace(pattern_placeholder, ($0, offset) => {\n replacement_parts.push(\n pattern_.slice(last_end, offset)\n )\n last_end = offset + $0.length\n \n const placeholder_name = $0.slice(1, -1)\n \n replacement_parts.push(\n transformer(placeholder_name, placeholders[placeholder_name], placeholders)\n )\n \n return ''\n })\n replacement_parts.push(\n pattern_.slice(last_end)\n )\n \n return this.replace(pattern_regx, replacement_parts.join(''))\n },\n \n \n find (this: string,\n pattern: string, \n preservations: string = '', \n flags = '', \n pattern_placeholder = /\\{.*?\\}/g\n ): Record<string, string> {\n // --- 转换 pattern 为 pattern_regx\n let last_end = 0\n \n // placeholder matched group index\n let $placeholders: Record<string, number> = { }\n \n let regx_parts = [ ]\n \n function add_part (left: number, right?: number) {\n const part = pattern.slice(left, right)\n if (part)\n regx_parts.push(\n part.to_regexp(preservations).source.bracket()\n )\n }\n \n pattern.replace(pattern_placeholder, ($0, offset) => {\n add_part(last_end, offset)\n last_end = offset + $0.length\n \n const placeholder = $0.slice(1, -1)\n let [placeholder_name, placeholder_pattern] = placeholder.split(':').map(s => s.trim())\n let optional = false\n if (placeholder_name.endsWith('?')) {\n placeholder_name = placeholder_name.slice(0, -1)\n optional = true\n }\n \n $placeholders[placeholder_name] = regx_parts.push(\n placeholder_pattern ? \n `${placeholder_pattern.bracket()}${optional ? '?' : ''}`\n :\n '(.*?)'\n )\n return ''\n })\n \n add_part(last_end)\n \n // 最后一个 (.*?) 改为贪心匹配,满足 .{suffix} 的需要\n regx_parts = regx_parts.filter(part => part)\n if (regx_parts[regx_parts.length - 1] === '(.*?)')\n regx_parts[regx_parts.length - 1] = '(.*)'\n \n const pattern_regx = new RegExp(regx_parts.join(''), flags)\n \n \n // --- 根据 pattern_regx 去匹配原有字符串,获取匹配结果,生成 placeholders 词典\n const matches = pattern_regx.exec(this)\n \n if (!matches) return { }\n \n return Object.fromEntries(\n Object.entries($placeholders)\n .map(([name, $i]) => \n [name, matches[$i] || '']\n )\n )\n },\n \n quote (this: string, type: keyof typeof quotes | 'psh' = 'single') {\n if (type === 'psh')\n return `& ${this.quote()}`\n return this.surround(quotes[type])\n },\n \n \n bracket (this: string, shape: keyof typeof brackets = 'round') {\n return this.surround(...brackets[shape] as [string, string])\n },\n \n \n surround (this: string, left: string, right?: string) {\n return left + this + (right || left)\n },\n \n surround_tag (this: string, tag_name: string): string {\n return '<' + tag_name + '>' + this + '</' + tag_name + '>'\n },\n \n \n to_lf (this: string) {\n return this.replace(/\\r\\n/g, '\\n')\n },\n \n \n to_crlf (this: string) {\n return this.replace(/\\n/g, '\\r\\n')\n },\n \n \n rm (this: string, pattern: string | RegExp, flags: string = 'g') {\n if (typeof pattern === 'string')\n pattern = new RegExp(pattern, flags)\n \n return this.replace(pattern, '')\n },\n \n \n split_lines (this: string, delimiter: string | RegExp = /\\r?\\n/) {\n let lines = this.split(delimiter)\n if (lines.last === '')\n lines.pop()\n return lines\n },\n \n \n split_indent (this: string): { indent: number, text: string } {\n let i = 0\n let indent = 0\n for (; i < this.length; i++)\n if (this[i] === ' ')\n indent += 1\n else if (this[i] === '\\t')\n indent += 4\n else\n break\n \n return {\n indent,\n text: this.slice(i)\n }\n },\n \n \n trim_doc_comment (this: string) {\n return `/** ${this.slice(3, -2).replace(/\\s*\\*\\s*/g, ' ').replace(/@(param|params|return) \\{.*?\\}\\s*/g, '').trim()} */`\n },\n \n \n to_base64 (this: string) {\n return Buffer.from(this).toString('base64')\n },\n \n \n decode_base64 (this: string, buffer = false) {\n const buf = Buffer.from(this, 'base64')\n if (buffer)\n return buf\n return buf.toString()\n },\n \n \n strip_ansi (this: string) {\n return strip_ansi(this)\n },\n \n \n space (this: string) {\n if (!this) return this\n let text_: string\n text_ = this\n .replace(new RegExp(cjk + `(['\"])`, 'g'), '$1 $2')\n .replace(new RegExp(`(['\"])` + cjk, 'g'), '$1 $2')\n \n .replace(/([\"']+)\\s*(.+?)\\s*([\"']+)/g, '$1$2$3')\n \n .replace(new RegExp(cjk + '([\\\\+\\\\-\\\\*\\\\/=&\\\\\\\\\\\\|<>])([A-Za-z0-9])', 'g'), '$1 $2 $3')\n .replace(new RegExp('([A-Za-z0-9])([\\\\+\\\\-\\\\*\\\\/=&\\\\\\\\\\\\|<>])' + cjk, 'g'), '$1 $2 $3')\n \n const text_bak = text_\n \n text_ = text_.replace(new RegExp(cjk + '([\\\\(\\\\[\\\\{<\\u201c]+(.*?)[\\\\)\\\\]\\\\}>\\u201d]+)' + cjk, 'g'), '$1 $2 $4')\n \n if (text_ === text_bak)\n text_ = text_\n .replace(new RegExp(cjk + '([\\\\(\\\\[\\\\{<\\u201c>])', 'g'), '$1 $2')\n .replace(new RegExp('([\\\\)\\\\]\\\\}>\\u201d<])' + cjk, 'g'), '$1 $2')\n \n return text_\n .replace(/([\\(\\[\\{<\\u201c]+)(\\s*)(.+?)(\\s*)([\\)\\]\\}>\\u201d]+)/g, '$1$3$5')\n .replace(new RegExp(cjk + '([~!;:,\\\\.\\\\?\\u2026])([A-Za-z0-9])', 'g'), '$1$2 $3')\n .replace(new RegExp(cjk + '([A-Za-z0-9`\\\\$%\\\\^&\\\\*\\\\-=\\\\+\\\\\\\\\\\\|\\\\/@\\u00a1-\\u00ff\\u2022\\u2027\\u2150-\\u218f])', 'g'), '$1 $2')\n .replace(new RegExp('([A-Za-z0-9`\\\\$%\\\\^&\\\\*\\\\-=\\\\+\\\\\\\\\\\\|\\\\/@\\u00a1-\\u00ff\\u2022\\u2027\\u2150-\\u218f])' + cjk, 'g'), '$1 $2')\n }\n }),\n \n \n // ------------ chalk colors\n ... Object.fromEntries(\n [\n 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'grey', \n 'red_', 'green_', 'yellow_', 'blue_', 'magenta_', 'cyan_',\n 'underline',\n ].map(color =>\n ([color, {\n configurable: true,\n get (this: string) {\n return chalk[color_map[color] || color](this)\n }\n }]))\n ),\n \n \n // ------------ 文件路径操作\n ... to_getter_property_descriptors({\n fdir (this: string) {\n const dir = path.dirname(this)\n return dir.endsWith('/') ? dir : `${dir}/`\n },\n \n fname (this: string) {\n return path.basename(this)\n },\n \n fext (this: string) {\n return path.extname(this)\n },\n }),\n \n ... to_method_property_descriptors({\n to_slash (this: string) {\n if (!this)\n return this\n return path.normalizeSafe(this)\n },\n \n to_backslash (this: string) {\n return this.replaceAll('/', '\\\\')\n },\n })\n})\n\n\n// ------------------------------------ Date.prototype\nObject.defineProperties(Date.prototype, to_method_property_descriptors({\n to_str (this: Date, ms?: boolean) {\n const [ampm, hour] = (() => {\n let hour = this.getHours()\n if (hour <= 6)\n return [t('凌晨'), hour]\n \n if (hour <= 8)\n return [t('清晨'), hour]\n \n if (hour <= 9)\n return [t('早上'), hour]\n \n if (hour <= 10)\n return [t('上午'), hour]\n \n if (hour <= 12)\n return [t('中午'), hour]\n \n hour -= 12\n \n if (hour <= 5)\n return [t('下午'), hour]\n \n if (hour <= 10)\n return [t('晚上'), hour]\n \n return [t('深夜'), hour]\n })()\n \n const zero_padding = { character: '0', position: 'left' } as const\n \n return '' +\n // year.month.date\n this.getFullYear() + '.' + \n String(this.getMonth() + 1).pad(2, zero_padding) + '.' + \n String(this.getDate()).pad(2, zero_padding) + ' ' +\n \n // 上午\n ampm + ' ' +\n \n // 10:03:02\n String(hour).pad(2, zero_padding) + ':' +\n String(this.getMinutes()).pad(2, zero_padding) + ':' +\n String(this.getSeconds()).pad(2, zero_padding) + \n \n (ms ?\n '.' + String(this.getMilliseconds()).pad(3, zero_padding)\n :\n ''\n )\n },\n \n to_date_str (this: Date) {\n return this.to_str().split(' ')[0]\n },\n \n to_time_str (this: Date, ms?: boolean) {\n const [, ampm, time] = this.to_str(ms).split(' ')\n return `${ampm} ${time}`\n },\n}))\n\n\n\n// ------------------------------------ Number.prototype\nObject.defineProperties(Number.prototype, to_method_property_descriptors({\n to_fsize_str (this: number, units: 'iec' | 'metric' = 'iec') {\n const { value, unit } = byte_size(this, { units })\n return `${value} ${unit.replace('i', '')}`\n },\n \n to_bin_str (this: number) {\n return `0b${this.toString(2)}`\n },\n \n to_hex_str (this: number, length?: number) {\n const s = this.toString(16)\n // 长度自动对齐到 4 的倍数\n if (!length)\n length = Math.ceil(s.length / 4) * 4\n return `0x${'0'.repeat(length - s.length)}${s}`\n },\n \n to_oct_str (this: number) {\n return `0o${this.toString(8)}`\n },\n}))\n\n\n\n// ------------------------------------ Array.prototype\nObject.defineProperties(Array.prototype, {\n ... to_getter_property_descriptors({\n last (this: any[]) {\n return this[this.length - 1]\n }\n }),\n \n \n // --- 文本处理工具方法\n ... to_method_property_descriptors({\n log (this: string[], limit: number = 10000) {\n const text = this.join('\\n') + '\\n'\n if (limit === -1 || this.length <= limit)\n console.log(text)\n else if (limit > 0)\n console.log(text.slice(0, limit) + '\\n...'.blue)\n else \n console.log('...\\n'.blue + text.slice(limit))\n },\n \n trim_lines (this: string[], { trim_line = true, rm_empty_lines = true, rm_last_empty_lines = false }: { trim_line?: boolean, rm_empty_lines?: boolean, rm_last_empty_lines?: boolean } = { }) {\n if (!this.length)\n return this\n let lines = this\n \n if (trim_line)\n lines = lines.map(line => line.trim())\n \n if (rm_empty_lines)\n return lines.filter( line => line )\n \n if (rm_last_empty_lines) {\n lines.reverse()\n const i_not_empty = lines.findIndex( line => line )\n if (i_not_empty !== -1)\n lines = lines.slice(i_not_empty)\n lines.reverse()\n return lines\n }\n \n return lines\n },\n \n \n trim_license (this: string[]) {\n const i = this.indexOf('/*')\n const j = this.indexOf('*/')\n if (i === 0 && this[i+1].includes('License'))\n return this.slice(j+1)\n else\n return this\n },\n \n split_indents (this: string[]): { indent: number, text: string }[] {\n return this.map(line => \n line.split_indent()\n )\n },\n \n indent (this: string[], width?: number, character: string = ' ') {\n return this.map(line => \n character.repeat(width) + line\n )\n },\n \n indent2to4 (this: string[]) {\n return this.split_indents()\n .map(line => \n ' '.repeat(\n Math.floor(line.indent / 2) * 4\n ) + line.text\n )\n },\n \n join_lines (this: string[], append = true) {\n return `${this.join('\\n')}${append ? '\\n' : ''}`\n }\n })\n})\n\n\nObject.defineProperties(BigInt.prototype, to_method_property_descriptors({\n toJSON (this: bigint) {\n return this.toString()\n }\n}))\n\nObject.defineProperties(Error.prototype, to_method_property_descriptors({\n toJSON (this: Error) {\n return Object.fromEntries(\n Object.getOwnPropertyNames(this)\n .map(name => \n [name, this[name]])\n )\n }\n}))\n\n\n\nexport function to_json (obj: any, replacer?: any) {\n return JSON.stringify(obj, replacer, 4) + '\\n'\n}\n\nexport function to_json_safely (obj: any, replacer?: any) {\n return to_json(obj, replacer)\n .replace(/\\u2028/g, '\\\\u2028')\n .replace(/\\u2029/g, '\\\\u2029')\n .replace(/<\\/script>/g, '<\\\\/script>')\n}\n\n\nexport function is_codepoint_fullwidth (codepoint: number) {\n // code points are derived from:\n // http://www.unix.org/Public/UNIDATA/EastAsianWidth.txt\n return (\n !Number.isNaN(codepoint) &&\n codepoint >= 0x1100 &&\n (\n codepoint <= 0x115f || // hangul jamo\n \n codepoint === 0x201c || codepoint === 0x201d || // \n codepoint === 0x2026 || // …\n codepoint === 0x203b || // ※\n \n // arrows\n (0x2190 <= codepoint && codepoint <= 0x21FF) ||\n \n codepoint === 0x2329 || // left-pointing angle bracket\n codepoint === 0x232a || // right-pointing angle bracket\n \n // ①\n (0x2460 <= codepoint && codepoint <= 0x24ff) ||\n \n // box drawing\n (0x2500 <= codepoint && codepoint <= 0x257f) ||\n \n // shapes, symbols, …\n (0x2580 <= codepoint && codepoint <= 0x2bef) ||\n \n // cjk radicals supplement .. enclosed cjk letters and months\n (0x2e80 <= codepoint && codepoint <= 0x3247 && codepoint !== 0x303f) ||\n \n // enclosed cjk letters and months .. cjk unified ideographs extension a\n (0x3250 <= codepoint && codepoint <= 0x4dbf) ||\n \n // cjk unified ideographs .. yi radicals\n (0x4E00 <= codepoint && codepoint <= 0xA4C6) ||\n \n // hangul jamo extended-a\n (0xa960 <= codepoint && codepoint <= 0xa97c) ||\n \n // hangul syllables\n (0xac00 <= codepoint && codepoint <= 0xd7a3) ||\n \n // cjk compatibility ideographs\n (0xf900 <= codepoint && codepoint <= 0xfaff) ||\n \n // vertical forms\n (0xfe10 <= codepoint && codepoint <= 0xfe19) ||\n \n // cjk compatibility forms .. small form variants\n (0xfe30 <= codepoint && codepoint <= 0xfe6b) ||\n \n // halfwidth and fullwidth forms\n (0xff01 <= codepoint && codepoint <= 0xff60) ||\n (0xffe0 <= codepoint && codepoint <= 0xffe6) ||\n \n // kana supplement\n (0x1b000 <= codepoint && codepoint <= 0x1b001) ||\n \n // enclosed ideographic supplement\n (0x1f200 <= codepoint && codepoint <= 0x1f251) ||\n \n // cjk unified ideographs extension b .. tertiary ideographic plane\n (0x20000 <= codepoint && codepoint <= 0x3fffd)\n )\n )\n}\n"]}
|
|
1
|
+
{"version":3,"file":"prototype.js","sourceRoot":"","sources":["prototype.ts"],"names":[],"mappings":"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","sourcesContent":["declare global {\n var my_prototype_defined: boolean\n \n interface String {\n readonly width: number\n \n // --- 工具方法\n /** 截取字符串不超过 width 显示宽度的部分,并保留颜色 \n 找到并记录能容纳 字符串 + … 的最后一个字符的位置 i_fitted \n 若完整的字符串长度超过 width,返回 slice(0, i_fitted + 1) + … \n 否则 返回 this \n */\n truncate (this: string, width: number): string\n \n /** pad string to `<width>` \n - character?: `' '`\n - position?: `'right'`\n */\n pad (this: string, width: number, { character, position }?: { character?: string, position?: 'left' | 'right'}): string\n \n limit (this: string, width: number, { character, position }?: { character?: string, position?: 'left' | 'right'}): string\n \n to_regexp (this: string, preservations?: string, flags?: string): RegExp\n \n to_bool (this: string): boolean\n \n /** 字符串模式替换 \n - pattern: 匹配部分的格式\n - pattern_: 替换后的格式\n - preservations?: `''` 保留的正则表达式字符\n - flags?: `''` 正则匹配选项\n - transformer?: `(name, matched) => matched || ''` placeholder transformer\n - pattern_placeholder?: `/\\{.*?\\}/g`\n \n ```ts\n 'g:/acgn/海贼王/[Skytree][海贼王][One_Piece][893][GB_BIG5_JP][X264_AAC][1080P][CRRIP][天空树双语字幕组].mkv'.refmt( \n '{dirp}/[Skytree][海贼王][{ en_name: \\\\w+ }][{ episode: \\\\d+ }][GB_BIG5_JP][{encoding}_AAC][1080P][CRRIP][天空树双语字幕组].{format}', \n 'g:/acgn/海贼王/{episode} {encoding}.{format}', \n '\\\\+', \n 'i', \n (name, value) => name === 'episode' ? String(+value + 1) : value.toLowerCase() \n )\n ```\n */\n refmt ( this: string,\n pattern: string,\n \n pattern_: string,\n \n preservations?: string,\n \n flags?: string,\n \n transformer?: (name: string, value: string, placeholders: { [name: string]: string }) => string,\n \n pattern_placeholder?: RegExp\n \n ): string\n \n \n /** 字符串模式搜索\n ```ts\n 'git+https://github.com/tamino-martinius/node-ts-dedent-123.git'.find(\n '^{protocol:[\\\\w+]+}://{hostname:[\\\\w\\\\.]+}/{username}/{project}-{index:\\\\d+}.{suffix}', '^', 'i'\n )\n {\n protocol: 'git+https',\n hostname: 'github.com',\n ...\n }\n ```\n \n - preservations?: `''` 保留的正则表达式字符\n - flags?: `''` 正则匹配选项\n - pattern_placeholder?: `/\\{.*?\\}/g`\n */\n find (this: string,\n \n pattern: string, \n \n preservations?: string, \n \n flags?: string, \n \n pattern_placeholder?: RegExp\n \n ): Record<string, string>\n \n \n /** - type?: `'single'` */\n quote (this: string, type?: keyof typeof quotes | 'psh'): string\n \n /** - shape?: `'parenthesis'` */\n bracket (this: string, shape?: keyof typeof brackets): string\n \n surround (this: string, left: string, right?: string): string\n \n surround_tag (this: string, tag_name: string): string\n \n to_lf (this: string): string\n \n to_crlf (this: string): string\n \n /** 'xxx'.replace(/pattern/g, '') \n 如果 pattern 是 string 则在创建 RegExp 时自动加上 flags (默认 'g'), 否则忽略 flags\n */\n rm (this: string, pattern: string | RegExp, flags?: string): string\n \n \n // --- chalk colors\n readonly red: string\n readonly red_: string\n \n readonly green: string\n readonly green_: string\n \n readonly yellow: string\n readonly yellow_: string\n \n readonly blue: string\n readonly blue_: string\n \n readonly magenta: string\n readonly magenta_: string\n \n readonly cyan: string\n readonly cyan_: string\n \n readonly grey: string\n \n readonly underline: string\n \n strip_ansi (this: string): string\n \n \n // --- 文本处理\n /** 将 string 划分为行,并去掉最后一个 \\n 之后的 '' */\n split_lines (this: string): string[]\n \n trim_doc_comment (this: string): string\n \n split_indent (this: string): { indent: number, text: string }\n \n \n to_base64 (this: string): string\n \n \n /** - buffer: `false` 直接返回 Buffer */\n decode_base64 (this: string): string\n decode_base64 (this: string, buffer: true): Buffer\n decode_base64 (this: string, buffer?: boolean): string | Buffer\n \n \n space (this: string): string\n \n \n // --- 文件路径操作\n fdir: string\n \n /** path.basename, 如: \n - D:/0/aaa.txt -> aaa.txt\n - D:/aaa/ -> aaa\n */\n fname: string\n \n /** .txt */\n fext: string\n \n to_slash (this: string): string\n \n to_backslash (this: string): string\n }\n \n \n interface Date {\n /** - ms?: `false` 显示到 ms */\n to_str (this: Date, ms?: boolean): string\n \n to_date_str (this: Date): string\n \n /** - ms?: `false` 显示到 ms */\n to_time_str (this: Date, ms?: boolean): string\n }\n \n \n interface Number {\n /** 12.4 KB (1 KB = 1024 B) */\n to_fsize_str (this: number, units?: 'iec' | 'metric'): string\n \n \n to_bin_str (this: number): string\n \n to_hex_str (this: number, length?: number): string\n \n to_oct_str (this: number): string\n }\n \n \n interface Array<T> {\n last: T\n \n log (this: string[], limit?: number): void\n \n indent (this: string[], width: number, c?: string): string[]\n \n indent2to4 (this: string[]): string[]\n \n \n // --- 文本处理\n /**\n - trim_line?: `true`\n - rm_empty_lines?: `true`\n - rm_last_empty_lines?: `false`\n */\n trim_lines (this: string[], { trim_line, rm_empty_lines, rm_last_empty_lines }?: { trim_line?: boolean, rm_empty_lines?: boolean, rm_last_empty_lines?: boolean }): string[]\n \n trim_license (this: string[]): string[]\n \n split_indents (this: string[]): { indent: number, text: string }[]\n \n join_lines (): string\n }\n \n \n interface BigInt {\n toJSON (this: bigint): string\n }\n \n \n interface Error {\n toJSON (this: Error): string\n }\n}\n\n\nimport path from 'upath'\nimport byte_size from 'byte-size'\n\nimport EmojiRegex from 'emoji-regex'\n\nimport strip_ansi from 'strip-ansi'\nimport chalk from 'chalk'\nchalk.level = 2\n\nimport { t } from './i18n/instance.js'\n\n\nexport const emoji_regex = EmojiRegex()\n\nexport { chalk }\n\nexport function to_method_property_descriptors (methods: { [name: string]: Function }): PropertyDescriptorMap {\n return Object.fromEntries(\n Object.entries(methods)\n .map(([name, value]) => ([name, {\n configurable: true,\n writable: true,\n enumerable: false,\n value,\n } as PropertyDescriptor])\n ))\n}\n\n\nexport function to_getter_property_descriptors (getters: { [name: string]: Function }): PropertyDescriptorMap {\n return Object.fromEntries(\n Object.entries(getters)\n .map(([name, get]) => ([name, {\n configurable: true,\n enumerable: false,\n get,\n } as PropertyDescriptor])\n ))\n}\n\n\nexport const cjk = '([\\u2e80-\\u9fff\\uf900-\\ufaff])'\n\nexport const quotes = {\n single: \"'\",\n double: '\"',\n backtick: '`',\n}\n\nexport const brackets = {\n round: ['(', ')'],\n square: ['[', ']'],\n curly: ['{', '}'],\n pointy: ['<', '>'],\n corner: ['「', '」'],\n fat: ['【', '】'],\n tortoise_shell: ['〔', '〕'],\n} as const\n\nconst color_map = Object.fromEntries(\n ['red_', 'green_', 'yellow_', 'blue_', 'magenta_', 'cyan_'].map(color =>\n [color, `${color.slice(0, -1)}Bright`])\n)\n\n\nif (!global.my_prototype_defined) {\n // ------------------------------------ String.prototype\n Object.defineProperties(String.prototype, {\n ... to_getter_property_descriptors({\n width (this: string) {\n const s = strip_ansi(\n this.replace(emoji_regex, ' ')\n )\n let width = 0\n for (let i = 0; i < s.length; i++) {\n const code = s.codePointAt(i)\n \n if (\n (code <= 0x1f || (code >= 0x7f && code <= 0x9f)) || // ignore control characters\n code >= 0x300 && code <= 0x36f // ignore combining characters\n ) continue\n \n // surrogates\n if (code > 0xffff)\n i++\n \n width += is_codepoint_fullwidth(code) ? 2 : 1\n }\n return width\n }\n }),\n \n \n // ------------ 文本处理工具方法\n ... to_method_property_descriptors({\n /** 截取字符串不超过 width 显示宽度的部分,并保留颜色 \n 找到并记录能容纳 字符串 + … 的最后一个字符的位置 i_fitted \n - 若完整的字符串长度超过 width,返回 slice(0, i_fitted + 1) + … \n - 否则 返回 this \n */\n truncate (this: string, width: number) {\n const color_bak = this.startsWith('\\u001b') ? this.slice(0, 5) : ''\n const s = strip_ansi(this)\n if (width <= 2) return this.slice(0, width)\n let i_fitted = 0\n let fitted_width = 0\n let cur_width = 0\n for (let i = 0; i < s.length; i++) {\n const code = s.codePointAt(i)\n \n if (\n (code <= 0x1F || (code >= 0x7F && code <= 0x9F)) || // Ignore control characters\n code >= 0x300 && code <= 0x36F // Ignore combining characters\n ) continue\n \n // surrogates (codepoint 需要用两个 utf-16 编码单位表示,因此这里跳过第二个编码单位,防止重复计算显示宽度)\n if (code > 0xFFFF)\n i++\n \n const w = is_codepoint_fullwidth(code) ? 2 : 1\n \n if (cur_width + w + 2 <= width) {\n i_fitted = i\n fitted_width += w\n }\n \n cur_width += w\n \n if (cur_width > width) {\n const i_fitted_next = i_fitted + 1\n const t = s.slice(0, i_fitted_next) + ' '.repeat(width - 2 - fitted_width) + '…' \n return color_bak ? color_bak + t + '\\u001b[39m' : t\n }\n }\n return this\n },\n \n \n pad (this: string, width: number, { character = ' ', position = 'right' }: { character?: string, position?: 'left' | 'right'} = { }) {\n const _width = this.width\n if (_width >= width) return this\n if (position === 'right') return this + character.repeat( (width - _width) / character.width )\n return character.repeat(width - _width) + this\n },\n \n \n limit (this: string, width: number, { character = ' ', position = 'right' }: { character?: string, position?: 'left' | 'right'} = { }) {\n return this.pad(width, { character, position }).truncate(width)\n },\n \n \n to_regexp (this: string, preservations: string, flags = ''): RegExp {\n const preserved_chars = new Set(preservations)\n const replace_chars: string = Array.prototype.filter.call('|\\\\{}()[]^$+*?.-', (c: string) => !preserved_chars.has(c))\n .map((c: string) =>\n c === ']' ? '\\\\]' : c\n ).join('')\n \n return new RegExp(\n this.replace(\n new RegExp(`[${replace_chars}]`, 'g'),\n '\\\\$&'\n ), \n flags\n )\n },\n \n \n to_bool (this: string) {\n return this.length && this !== '0' && this.toLowerCase() !== 'false'\n },\n \n refmt (this: string, \n pattern : string,\n pattern_: string,\n preservations: string = '',\n flags = '',\n transformer: (name: string, value: string, placeholders: { [name: string]: string }) => string = (name, value) => value || '',\n pattern_placeholder = /\\{.*?\\}/g,\n ): string {\n // --- 转换 pattern 为 pattern_regx\n let last_end = 0\n \n // placeholder matched group indexes\n let $placeholders: Record<string, number> = { }\n \n let regx_parts = [ ]\n \n function add_part (left: number, right?: number) {\n const part = pattern.slice(left, right)\n if (part)\n regx_parts.push(\n part.to_regexp(preservations).source.bracket()\n )\n }\n \n pattern.replace(pattern_placeholder, ($0, offset) => {\n add_part(last_end, offset)\n last_end = offset + $0.length\n \n const placeholder = $0.slice(1, -1)\n let [placeholder_name, placeholder_pattern] = placeholder.split(':').map(s => s.trim())\n let optional = false\n if (placeholder_name.endsWith('?')) {\n placeholder_name = placeholder_name.slice(0, -1)\n optional = true\n }\n $placeholders[placeholder_name] = regx_parts.push(\n placeholder_pattern ? \n `${placeholder_pattern.bracket()}${optional ? '?' : ''}`\n :\n '(.*?)'\n )\n return ''\n })\n \n add_part(last_end)\n \n // 最后一个 (.*?) 改为贪心匹配,满足 .{suffix} 的需要\n regx_parts = regx_parts.filter(part => part)\n if (regx_parts.last === '(.*?)')\n regx_parts[regx_parts.length - 1] = '(.*)'\n \n const pattern_regx = new RegExp(regx_parts.join(''), flags)\n \n \n // --- 根据 pattern_regx 去匹配原有字符串,获取匹配结果,生成 placeholders 词典\n const matches = pattern_regx.exec(this)\n \n if (!matches) return this\n \n const placeholders = Object.fromEntries(\n Object.entries($placeholders)\n .map(([name, $i]) => [\n [name, matches[$i]],\n [`${name}.before`, matches[$i - 1] || ''],\n [`${name}.after`, matches[$i + 1] || ''],\n ])\n .flat()\n )\n \n \n // --- 转换 pattern_ 为 replacement_str,如果有 transformer 则在遇到 placeholder 时应用\n last_end = 0\n let replacement_parts = [ ]\n \n pattern_.replace(pattern_placeholder, ($0, offset) => {\n replacement_parts.push(\n pattern_.slice(last_end, offset)\n )\n last_end = offset + $0.length\n \n const placeholder_name = $0.slice(1, -1)\n \n replacement_parts.push(\n transformer(placeholder_name, placeholders[placeholder_name], placeholders)\n )\n \n return ''\n })\n replacement_parts.push(\n pattern_.slice(last_end)\n )\n \n return this.replace(pattern_regx, replacement_parts.join(''))\n },\n \n \n find (this: string,\n pattern: string, \n preservations: string = '', \n flags = '', \n pattern_placeholder = /\\{.*?\\}/g\n ): Record<string, string> {\n // --- 转换 pattern 为 pattern_regx\n let last_end = 0\n \n // placeholder matched group index\n let $placeholders: Record<string, number> = { }\n \n let regx_parts = [ ]\n \n function add_part (left: number, right?: number) {\n const part = pattern.slice(left, right)\n if (part)\n regx_parts.push(\n part.to_regexp(preservations).source.bracket()\n )\n }\n \n pattern.replace(pattern_placeholder, ($0, offset) => {\n add_part(last_end, offset)\n last_end = offset + $0.length\n \n const placeholder = $0.slice(1, -1)\n let [placeholder_name, placeholder_pattern] = placeholder.split(':').map(s => s.trim())\n let optional = false\n if (placeholder_name.endsWith('?')) {\n placeholder_name = placeholder_name.slice(0, -1)\n optional = true\n }\n \n $placeholders[placeholder_name] = regx_parts.push(\n placeholder_pattern ? \n `${placeholder_pattern.bracket()}${optional ? '?' : ''}`\n :\n '(.*?)'\n )\n return ''\n })\n \n add_part(last_end)\n \n // 最后一个 (.*?) 改为贪心匹配,满足 .{suffix} 的需要\n regx_parts = regx_parts.filter(part => part)\n if (regx_parts[regx_parts.length - 1] === '(.*?)')\n regx_parts[regx_parts.length - 1] = '(.*)'\n \n const pattern_regx = new RegExp(regx_parts.join(''), flags)\n \n \n // --- 根据 pattern_regx 去匹配原有字符串,获取匹配结果,生成 placeholders 词典\n const matches = pattern_regx.exec(this)\n \n if (!matches) return { }\n \n return Object.fromEntries(\n Object.entries($placeholders)\n .map(([name, $i]) => \n [name, matches[$i] || '']\n )\n )\n },\n \n quote (this: string, type: keyof typeof quotes | 'psh' = 'single') {\n if (type === 'psh')\n return `& ${this.quote()}`\n return this.surround(quotes[type])\n },\n \n \n bracket (this: string, shape: keyof typeof brackets = 'round') {\n return this.surround(...brackets[shape] as [string, string])\n },\n \n \n surround (this: string, left: string, right?: string) {\n return left + this + (right || left)\n },\n \n surround_tag (this: string, tag_name: string): string {\n return '<' + tag_name + '>' + this + '</' + tag_name + '>'\n },\n \n \n to_lf (this: string) {\n return this.replace(/\\r\\n/g, '\\n')\n },\n \n \n to_crlf (this: string) {\n return this.replace(/\\n/g, '\\r\\n')\n },\n \n \n rm (this: string, pattern: string | RegExp, flags: string = 'g') {\n if (typeof pattern === 'string')\n pattern = new RegExp(pattern, flags)\n \n return this.replace(pattern, '')\n },\n \n \n split_lines (this: string, delimiter: string | RegExp = /\\r?\\n/) {\n let lines = this.split(delimiter)\n if (lines.last === '')\n lines.pop()\n return lines\n },\n \n \n split_indent (this: string): { indent: number, text: string } {\n let i = 0\n let indent = 0\n for (; i < this.length; i++)\n if (this[i] === ' ')\n indent += 1\n else if (this[i] === '\\t')\n indent += 4\n else\n break\n \n return {\n indent,\n text: this.slice(i)\n }\n },\n \n \n trim_doc_comment (this: string) {\n return `/** ${this.slice(3, -2).replace(/\\s*\\*\\s*/g, ' ').replace(/@(param|params|return) \\{.*?\\}\\s*/g, '').trim()} */`\n },\n \n \n to_base64 (this: string) {\n return Buffer.from(this).toString('base64')\n },\n \n \n decode_base64 (this: string, buffer = false) {\n const buf = Buffer.from(this, 'base64')\n if (buffer)\n return buf\n return buf.toString()\n },\n \n \n strip_ansi (this: string) {\n return strip_ansi(this)\n },\n \n \n space (this: string) {\n if (!this) return this\n let text_: string\n text_ = this\n .replace(new RegExp(cjk + `(['\"])`, 'g'), '$1 $2')\n .replace(new RegExp(`(['\"])` + cjk, 'g'), '$1 $2')\n \n .replace(/([\"']+)\\s*(.+?)\\s*([\"']+)/g, '$1$2$3')\n \n .replace(new RegExp(cjk + '([\\\\+\\\\-\\\\*\\\\/=&\\\\\\\\\\\\|<>])([A-Za-z0-9])', 'g'), '$1 $2 $3')\n .replace(new RegExp('([A-Za-z0-9])([\\\\+\\\\-\\\\*\\\\/=&\\\\\\\\\\\\|<>])' + cjk, 'g'), '$1 $2 $3')\n \n const text_bak = text_\n \n text_ = text_.replace(new RegExp(cjk + '([\\\\(\\\\[\\\\{<\\u201c]+(.*?)[\\\\)\\\\]\\\\}>\\u201d]+)' + cjk, 'g'), '$1 $2 $4')\n \n if (text_ === text_bak)\n text_ = text_\n .replace(new RegExp(cjk + '([\\\\(\\\\[\\\\{<\\u201c>])', 'g'), '$1 $2')\n .replace(new RegExp('([\\\\)\\\\]\\\\}>\\u201d<])' + cjk, 'g'), '$1 $2')\n \n return text_\n .replace(/([\\(\\[\\{<\\u201c]+)(\\s*)(.+?)(\\s*)([\\)\\]\\}>\\u201d]+)/g, '$1$3$5')\n .replace(new RegExp(cjk + '([~!;:,\\\\.\\\\?\\u2026])([A-Za-z0-9])', 'g'), '$1$2 $3')\n .replace(new RegExp(cjk + '([A-Za-z0-9`\\\\$%\\\\^&\\\\*\\\\-=\\\\+\\\\\\\\\\\\|\\\\/@\\u00a1-\\u00ff\\u2022\\u2027\\u2150-\\u218f])', 'g'), '$1 $2')\n .replace(new RegExp('([A-Za-z0-9`\\\\$%\\\\^&\\\\*\\\\-=\\\\+\\\\\\\\\\\\|\\\\/@\\u00a1-\\u00ff\\u2022\\u2027\\u2150-\\u218f])' + cjk, 'g'), '$1 $2')\n }\n }),\n \n \n // ------------ chalk colors\n ... Object.fromEntries(\n [\n 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'grey', \n 'red_', 'green_', 'yellow_', 'blue_', 'magenta_', 'cyan_',\n 'underline',\n ].map(color =>\n ([color, {\n configurable: true,\n get (this: string) {\n return chalk[color_map[color] || color](this)\n }\n }]))\n ),\n \n \n // ------------ 文件路径操作\n ... to_getter_property_descriptors({\n fdir (this: string) {\n const dir = path.dirname(this)\n return dir.endsWith('/') ? dir : `${dir}/`\n },\n \n fname (this: string) {\n return path.basename(this)\n },\n \n fext (this: string) {\n return path.extname(this)\n },\n }),\n \n ... to_method_property_descriptors({\n to_slash (this: string) {\n if (!this)\n return this\n return path.normalizeSafe(this)\n },\n \n to_backslash (this: string) {\n return this.replaceAll('/', '\\\\')\n },\n })\n })\n \n \n // ------------------------------------ Date.prototype\n Object.defineProperties(Date.prototype, to_method_property_descriptors({\n to_str (this: Date, ms?: boolean) {\n const [ampm, hour] = (() => {\n let hour = this.getHours()\n if (hour <= 6)\n return [t('凌晨'), hour]\n \n if (hour <= 8)\n return [t('清晨'), hour]\n \n if (hour <= 9)\n return [t('早上'), hour]\n \n if (hour <= 10)\n return [t('上午'), hour]\n \n if (hour <= 12)\n return [t('中午'), hour]\n \n hour -= 12\n \n if (hour <= 5)\n return [t('下午'), hour]\n \n if (hour <= 10)\n return [t('晚上'), hour]\n \n return [t('深夜'), hour]\n })()\n \n const zero_padding = { character: '0', position: 'left' } as const\n \n return '' +\n // year.month.date\n this.getFullYear() + '.' + \n String(this.getMonth() + 1).pad(2, zero_padding) + '.' + \n String(this.getDate()).pad(2, zero_padding) + ' ' +\n \n // 上午\n ampm + ' ' +\n \n // 10:03:02\n String(hour).pad(2, zero_padding) + ':' +\n String(this.getMinutes()).pad(2, zero_padding) + ':' +\n String(this.getSeconds()).pad(2, zero_padding) + \n \n (ms ?\n '.' + String(this.getMilliseconds()).pad(3, zero_padding)\n :\n ''\n )\n },\n \n to_date_str (this: Date) {\n return this.to_str().split(' ')[0]\n },\n \n to_time_str (this: Date, ms?: boolean) {\n const [, ampm, time] = this.to_str(ms).split(' ')\n return `${ampm} ${time}`\n },\n }))\n \n \n \n // ------------------------------------ Number.prototype\n Object.defineProperties(Number.prototype, to_method_property_descriptors({\n to_fsize_str (this: number, units: 'iec' | 'metric' = 'iec') {\n const { value, unit } = byte_size(this, { units })\n return `${value} ${unit.replace('i', '')}`\n },\n \n to_bin_str (this: number) {\n return `0b${this.toString(2)}`\n },\n \n to_hex_str (this: number, length?: number) {\n const s = this.toString(16)\n // 长度自动对齐到 4 的倍数\n if (!length)\n length = Math.ceil(s.length / 4) * 4\n return `0x${'0'.repeat(length - s.length)}${s}`\n },\n \n to_oct_str (this: number) {\n return `0o${this.toString(8)}`\n },\n }))\n \n \n \n // ------------------------------------ Array.prototype\n Object.defineProperties(Array.prototype, {\n ... to_getter_property_descriptors({\n last (this: any[]) {\n return this[this.length - 1]\n }\n }),\n \n \n // --- 文本处理工具方法\n ... to_method_property_descriptors({\n log (this: string[], limit: number = 10000) {\n const text = this.join('\\n') + '\\n'\n if (limit === -1 || this.length <= limit)\n console.log(text)\n else if (limit > 0)\n console.log(text.slice(0, limit) + '\\n...'.blue)\n else \n console.log('...\\n'.blue + text.slice(limit))\n },\n \n trim_lines (this: string[], { trim_line = true, rm_empty_lines = true, rm_last_empty_lines = false }: { trim_line?: boolean, rm_empty_lines?: boolean, rm_last_empty_lines?: boolean } = { }) {\n if (!this.length)\n return this\n let lines = this\n \n if (trim_line)\n lines = lines.map(line => line.trim())\n \n if (rm_empty_lines)\n return lines.filter( line => line )\n \n if (rm_last_empty_lines) {\n lines.reverse()\n const i_not_empty = lines.findIndex( line => line )\n if (i_not_empty !== -1)\n lines = lines.slice(i_not_empty)\n lines.reverse()\n return lines\n }\n \n return lines\n },\n \n \n trim_license (this: string[]) {\n const i = this.indexOf('/*')\n const j = this.indexOf('*/')\n if (i === 0 && this[i+1].includes('License'))\n return this.slice(j+1)\n else\n return this\n },\n \n split_indents (this: string[]): { indent: number, text: string }[] {\n return this.map(line => \n line.split_indent()\n )\n },\n \n indent (this: string[], width?: number, character: string = ' ') {\n return this.map(line => \n character.repeat(width) + line\n )\n },\n \n indent2to4 (this: string[]) {\n return this.split_indents()\n .map(line => \n ' '.repeat(\n Math.floor(line.indent / 2) * 4\n ) + line.text\n )\n },\n \n join_lines (this: string[], append = true) {\n return `${this.join('\\n')}${append ? '\\n' : ''}`\n }\n })\n })\n \n \n Object.defineProperties(BigInt.prototype, to_method_property_descriptors({\n toJSON (this: bigint) {\n return this.toString()\n }\n }))\n \n Object.defineProperties(Error.prototype, to_method_property_descriptors({\n toJSON (this: Error) {\n return Object.fromEntries(\n Object.getOwnPropertyNames(this)\n .map(name => \n [name, this[name]])\n )\n }\n }))\n}\n\n\nexport function to_json (obj: any, replacer?: any) {\n return JSON.stringify(obj, replacer, 4) + '\\n'\n}\n\nexport function to_json_safely (obj: any, replacer?: any) {\n return to_json(obj, replacer)\n .replace(/\\u2028/g, '\\\\u2028')\n .replace(/\\u2029/g, '\\\\u2029')\n .replace(/<\\/script>/g, '<\\\\/script>')\n}\n\n\nexport function is_codepoint_fullwidth (codepoint: number) {\n // code points are derived from:\n // http://www.unix.org/Public/UNIDATA/EastAsianWidth.txt\n return (\n !Number.isNaN(codepoint) &&\n codepoint >= 0x1100 &&\n (\n codepoint <= 0x115f || // hangul jamo\n \n codepoint === 0x201c || codepoint === 0x201d || // \n codepoint === 0x2026 || // …\n codepoint === 0x203b || // ※\n \n // arrows\n (0x2190 <= codepoint && codepoint <= 0x21FF) ||\n \n codepoint === 0x2329 || // left-pointing angle bracket\n codepoint === 0x232a || // right-pointing angle bracket\n \n // ①\n (0x2460 <= codepoint && codepoint <= 0x24ff) ||\n \n // box drawing\n (0x2500 <= codepoint && codepoint <= 0x257f) ||\n \n // shapes, symbols, …\n (0x2580 <= codepoint && codepoint <= 0x2bef) ||\n \n // cjk radicals supplement .. enclosed cjk letters and months\n (0x2e80 <= codepoint && codepoint <= 0x3247 && codepoint !== 0x303f) ||\n \n // enclosed cjk letters and months .. cjk unified ideographs extension a\n (0x3250 <= codepoint && codepoint <= 0x4dbf) ||\n \n // cjk unified ideographs .. yi radicals\n (0x4E00 <= codepoint && codepoint <= 0xA4C6) ||\n \n // hangul jamo extended-a\n (0xa960 <= codepoint && codepoint <= 0xa97c) ||\n \n // hangul syllables\n (0xac00 <= codepoint && codepoint <= 0xd7a3) ||\n \n // cjk compatibility ideographs\n (0xf900 <= codepoint && codepoint <= 0xfaff) ||\n \n // vertical forms\n (0xfe10 <= codepoint && codepoint <= 0xfe19) ||\n \n // cjk compatibility forms .. small form variants\n (0xfe30 <= codepoint && codepoint <= 0xfe6b) ||\n \n // halfwidth and fullwidth forms\n (0xff01 <= codepoint && codepoint <= 0xff60) ||\n (0xffe0 <= codepoint && codepoint <= 0xffe6) ||\n \n // kana supplement\n (0x1b000 <= codepoint && codepoint <= 0x1b001) ||\n \n // enclosed ideographic supplement\n (0x1f200 <= codepoint && codepoint <= 0x1f251) ||\n \n // cjk unified ideographs extension b .. tertiary ideographic plane\n (0x20000 <= codepoint && codepoint <= 0x3fffd)\n )\n )\n}\n"]}
|