@utilix-tech/sdk 0.1.0
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/LICENSE +21 -0
- package/README.md +199 -0
- package/dist/api-8aZtWhSj.d.cts +308 -0
- package/dist/api-8aZtWhSj.d.ts +308 -0
- package/dist/chunk-2CJSLYWI.js +520 -0
- package/dist/chunk-3BAHSW4C.js +1385 -0
- package/dist/chunk-6YPV2AB5.js +1246 -0
- package/dist/chunk-BPVAB4P2.js +1126 -0
- package/dist/chunk-FL53T24A.js +257 -0
- package/dist/chunk-L6KCTHUW.js +1086 -0
- package/dist/chunk-MLKGABMK.js +7 -0
- package/dist/chunk-ROTPLW7T.js +265 -0
- package/dist/chunk-TSAGO3XP.js +1253 -0
- package/dist/chunk-UC656APA.js +1080 -0
- package/dist/chunk-W4UBLYFU.js +1219 -0
- package/dist/chunk-XST6X3HT.js +896 -0
- package/dist/chunk-XXYZLLHI.js +2227 -0
- package/dist/chunk-ZKL2VX2G.js +2215 -0
- package/dist/chunk-ZPQZEIXP.js +685 -0
- package/dist/code-QNrdLIR3.d.cts +327 -0
- package/dist/code-QNrdLIR3.d.ts +327 -0
- package/dist/color-tPwZCr9H.d.cts +229 -0
- package/dist/color-tPwZCr9H.d.ts +229 -0
- package/dist/css-Cf7AMGM-.d.cts +318 -0
- package/dist/css-Cf7AMGM-.d.ts +318 -0
- package/dist/data-rMjWNiOJ.d.cts +215 -0
- package/dist/data-rMjWNiOJ.d.ts +215 -0
- package/dist/encoding-7gmq-vkV.d.cts +108 -0
- package/dist/encoding-7gmq-vkV.d.ts +108 -0
- package/dist/generators-BGtRGpJZ.d.cts +118 -0
- package/dist/generators-BGtRGpJZ.d.ts +118 -0
- package/dist/hashing-CnetQFD_.d.cts +76 -0
- package/dist/hashing-CnetQFD_.d.ts +76 -0
- package/dist/index.cjs +15466 -0
- package/dist/index.d.cts +18 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.js +20 -0
- package/dist/json-BjSoIS1h.d.cts +198 -0
- package/dist/json-BjSoIS1h.d.ts +198 -0
- package/dist/misc-DcVBManm.d.cts +201 -0
- package/dist/misc-DcVBManm.d.ts +201 -0
- package/dist/network-CNtmrDeN.d.cts +170 -0
- package/dist/network-CNtmrDeN.d.ts +170 -0
- package/dist/text-DqAjPtQ0.d.cts +319 -0
- package/dist/text-DqAjPtQ0.d.ts +319 -0
- package/dist/time-DbT8fjaF.d.cts +145 -0
- package/dist/time-DbT8fjaF.d.ts +145 -0
- package/dist/tools/api.cjs +1216 -0
- package/dist/tools/api.d.cts +1 -0
- package/dist/tools/api.d.ts +1 -0
- package/dist/tools/api.js +2 -0
- package/dist/tools/code.cjs +2212 -0
- package/dist/tools/code.d.cts +1 -0
- package/dist/tools/code.d.ts +1 -0
- package/dist/tools/code.js +2 -0
- package/dist/tools/color.cjs +1122 -0
- package/dist/tools/color.d.cts +1 -0
- package/dist/tools/color.d.ts +1 -0
- package/dist/tools/color.js +2 -0
- package/dist/tools/css.cjs +1242 -0
- package/dist/tools/css.d.cts +1 -0
- package/dist/tools/css.d.ts +1 -0
- package/dist/tools/css.js +2 -0
- package/dist/tools/data.cjs +1097 -0
- package/dist/tools/data.d.cts +1 -0
- package/dist/tools/data.d.ts +1 -0
- package/dist/tools/data.js +2 -0
- package/dist/tools/encoding.cjs +261 -0
- package/dist/tools/encoding.d.cts +1 -0
- package/dist/tools/encoding.d.ts +1 -0
- package/dist/tools/encoding.js +2 -0
- package/dist/tools/generators.cjs +521 -0
- package/dist/tools/generators.d.cts +1 -0
- package/dist/tools/generators.d.ts +1 -0
- package/dist/tools/generators.js +2 -0
- package/dist/tools/hashing.cjs +259 -0
- package/dist/tools/hashing.d.cts +1 -0
- package/dist/tools/hashing.d.ts +1 -0
- package/dist/tools/hashing.js +2 -0
- package/dist/tools/json.cjs +1270 -0
- package/dist/tools/json.d.cts +1 -0
- package/dist/tools/json.d.ts +1 -0
- package/dist/tools/json.js +2 -0
- package/dist/tools/misc.cjs +1082 -0
- package/dist/tools/misc.d.cts +1 -0
- package/dist/tools/misc.d.ts +1 -0
- package/dist/tools/misc.js +2 -0
- package/dist/tools/network.cjs +1381 -0
- package/dist/tools/network.d.cts +1 -0
- package/dist/tools/network.d.ts +1 -0
- package/dist/tools/network.js +2 -0
- package/dist/tools/text.cjs +2224 -0
- package/dist/tools/text.d.cts +1 -0
- package/dist/tools/text.d.ts +1 -0
- package/dist/tools/text.js +2 -0
- package/dist/tools/time.cjs +681 -0
- package/dist/tools/time.d.cts +1 -0
- package/dist/tools/time.d.ts +1 -0
- package/dist/tools/time.js +2 -0
- package/dist/tools/units.cjs +892 -0
- package/dist/tools/units.d.cts +1 -0
- package/dist/tools/units.d.ts +1 -0
- package/dist/tools/units.js +2 -0
- package/dist/units-6lwDYBvX.d.cts +302 -0
- package/dist/units-6lwDYBvX.d.ts +302 -0
- package/package.json +148 -0
|
@@ -0,0 +1,1082 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/tools/misc.ts
|
|
4
|
+
var NAMED_HTML_ENTITIES = {
|
|
5
|
+
34: """,
|
|
6
|
+
38: "&",
|
|
7
|
+
39: "'",
|
|
8
|
+
60: "<",
|
|
9
|
+
62: ">",
|
|
10
|
+
160: " ",
|
|
11
|
+
161: "¡",
|
|
12
|
+
162: "¢",
|
|
13
|
+
163: "£",
|
|
14
|
+
164: "¤",
|
|
15
|
+
165: "¥",
|
|
16
|
+
166: "¦",
|
|
17
|
+
167: "§",
|
|
18
|
+
168: "¨",
|
|
19
|
+
169: "©",
|
|
20
|
+
170: "ª",
|
|
21
|
+
171: "«",
|
|
22
|
+
172: "¬",
|
|
23
|
+
173: "­",
|
|
24
|
+
174: "®",
|
|
25
|
+
175: "¯",
|
|
26
|
+
176: "°",
|
|
27
|
+
177: "±",
|
|
28
|
+
178: "²",
|
|
29
|
+
179: "³",
|
|
30
|
+
180: "´",
|
|
31
|
+
181: "µ",
|
|
32
|
+
182: "¶",
|
|
33
|
+
183: "·",
|
|
34
|
+
184: "¸",
|
|
35
|
+
185: "¹",
|
|
36
|
+
186: "º",
|
|
37
|
+
187: "»",
|
|
38
|
+
188: "¼",
|
|
39
|
+
189: "½",
|
|
40
|
+
190: "¾",
|
|
41
|
+
191: "¿",
|
|
42
|
+
215: "×",
|
|
43
|
+
247: "÷",
|
|
44
|
+
8364: "€",
|
|
45
|
+
8482: "™",
|
|
46
|
+
8220: "“",
|
|
47
|
+
8221: "”",
|
|
48
|
+
8216: "‘",
|
|
49
|
+
8217: "’",
|
|
50
|
+
8230: "…",
|
|
51
|
+
8211: "–",
|
|
52
|
+
8212: "—",
|
|
53
|
+
8592: "←",
|
|
54
|
+
8593: "↑",
|
|
55
|
+
8594: "→",
|
|
56
|
+
8595: "↓",
|
|
57
|
+
8596: "↔",
|
|
58
|
+
8660: "⇔",
|
|
59
|
+
9824: "♠",
|
|
60
|
+
9827: "♣",
|
|
61
|
+
9829: "♥",
|
|
62
|
+
9830: "♦"
|
|
63
|
+
};
|
|
64
|
+
var UNICODE_NAMES = {
|
|
65
|
+
0: "NULL",
|
|
66
|
+
7: "BELL",
|
|
67
|
+
8: "BACKSPACE",
|
|
68
|
+
9: "HORIZONTAL TABULATION",
|
|
69
|
+
10: "LINE FEED",
|
|
70
|
+
13: "CARRIAGE RETURN",
|
|
71
|
+
27: "ESCAPE",
|
|
72
|
+
32: "SPACE",
|
|
73
|
+
33: "EXCLAMATION MARK",
|
|
74
|
+
34: "QUOTATION MARK",
|
|
75
|
+
35: "NUMBER SIGN",
|
|
76
|
+
36: "DOLLAR SIGN",
|
|
77
|
+
37: "PERCENT SIGN",
|
|
78
|
+
38: "AMPERSAND",
|
|
79
|
+
39: "APOSTROPHE",
|
|
80
|
+
40: "LEFT PARENTHESIS",
|
|
81
|
+
41: "RIGHT PARENTHESIS",
|
|
82
|
+
42: "ASTERISK",
|
|
83
|
+
43: "PLUS SIGN",
|
|
84
|
+
44: "COMMA",
|
|
85
|
+
45: "HYPHEN-MINUS",
|
|
86
|
+
46: "FULL STOP",
|
|
87
|
+
47: "SOLIDUS",
|
|
88
|
+
48: "DIGIT ZERO",
|
|
89
|
+
49: "DIGIT ONE",
|
|
90
|
+
50: "DIGIT TWO",
|
|
91
|
+
51: "DIGIT THREE",
|
|
92
|
+
52: "DIGIT FOUR",
|
|
93
|
+
53: "DIGIT FIVE",
|
|
94
|
+
54: "DIGIT SIX",
|
|
95
|
+
55: "DIGIT SEVEN",
|
|
96
|
+
56: "DIGIT EIGHT",
|
|
97
|
+
57: "DIGIT NINE",
|
|
98
|
+
58: "COLON",
|
|
99
|
+
59: "SEMICOLON",
|
|
100
|
+
60: "LESS-THAN SIGN",
|
|
101
|
+
61: "EQUALS SIGN",
|
|
102
|
+
62: "GREATER-THAN SIGN",
|
|
103
|
+
63: "QUESTION MARK",
|
|
104
|
+
64: "COMMERCIAL AT",
|
|
105
|
+
65: "LATIN CAPITAL LETTER A",
|
|
106
|
+
66: "LATIN CAPITAL LETTER B",
|
|
107
|
+
67: "LATIN CAPITAL LETTER C",
|
|
108
|
+
68: "LATIN CAPITAL LETTER D",
|
|
109
|
+
69: "LATIN CAPITAL LETTER E",
|
|
110
|
+
70: "LATIN CAPITAL LETTER F",
|
|
111
|
+
71: "LATIN CAPITAL LETTER G",
|
|
112
|
+
72: "LATIN CAPITAL LETTER H",
|
|
113
|
+
73: "LATIN CAPITAL LETTER I",
|
|
114
|
+
74: "LATIN CAPITAL LETTER J",
|
|
115
|
+
75: "LATIN CAPITAL LETTER K",
|
|
116
|
+
76: "LATIN CAPITAL LETTER L",
|
|
117
|
+
77: "LATIN CAPITAL LETTER M",
|
|
118
|
+
78: "LATIN CAPITAL LETTER N",
|
|
119
|
+
79: "LATIN CAPITAL LETTER O",
|
|
120
|
+
80: "LATIN CAPITAL LETTER P",
|
|
121
|
+
81: "LATIN CAPITAL LETTER Q",
|
|
122
|
+
82: "LATIN CAPITAL LETTER R",
|
|
123
|
+
83: "LATIN CAPITAL LETTER S",
|
|
124
|
+
84: "LATIN CAPITAL LETTER T",
|
|
125
|
+
85: "LATIN CAPITAL LETTER U",
|
|
126
|
+
86: "LATIN CAPITAL LETTER V",
|
|
127
|
+
87: "LATIN CAPITAL LETTER W",
|
|
128
|
+
88: "LATIN CAPITAL LETTER X",
|
|
129
|
+
89: "LATIN CAPITAL LETTER Y",
|
|
130
|
+
90: "LATIN CAPITAL LETTER Z",
|
|
131
|
+
91: "LEFT SQUARE BRACKET",
|
|
132
|
+
92: "REVERSE SOLIDUS",
|
|
133
|
+
93: "RIGHT SQUARE BRACKET",
|
|
134
|
+
94: "CIRCUMFLEX ACCENT",
|
|
135
|
+
95: "LOW LINE",
|
|
136
|
+
96: "GRAVE ACCENT",
|
|
137
|
+
97: "LATIN SMALL LETTER A",
|
|
138
|
+
98: "LATIN SMALL LETTER B",
|
|
139
|
+
99: "LATIN SMALL LETTER C",
|
|
140
|
+
100: "LATIN SMALL LETTER D",
|
|
141
|
+
101: "LATIN SMALL LETTER E",
|
|
142
|
+
102: "LATIN SMALL LETTER F",
|
|
143
|
+
103: "LATIN SMALL LETTER G",
|
|
144
|
+
104: "LATIN SMALL LETTER H",
|
|
145
|
+
105: "LATIN SMALL LETTER I",
|
|
146
|
+
106: "LATIN SMALL LETTER J",
|
|
147
|
+
107: "LATIN SMALL LETTER K",
|
|
148
|
+
108: "LATIN SMALL LETTER L",
|
|
149
|
+
109: "LATIN SMALL LETTER M",
|
|
150
|
+
110: "LATIN SMALL LETTER N",
|
|
151
|
+
111: "LATIN SMALL LETTER O",
|
|
152
|
+
112: "LATIN SMALL LETTER P",
|
|
153
|
+
113: "LATIN SMALL LETTER Q",
|
|
154
|
+
114: "LATIN SMALL LETTER R",
|
|
155
|
+
115: "LATIN SMALL LETTER S",
|
|
156
|
+
116: "LATIN SMALL LETTER T",
|
|
157
|
+
117: "LATIN SMALL LETTER U",
|
|
158
|
+
118: "LATIN SMALL LETTER V",
|
|
159
|
+
119: "LATIN SMALL LETTER W",
|
|
160
|
+
120: "LATIN SMALL LETTER X",
|
|
161
|
+
121: "LATIN SMALL LETTER Y",
|
|
162
|
+
122: "LATIN SMALL LETTER Z",
|
|
163
|
+
123: "LEFT CURLY BRACKET",
|
|
164
|
+
124: "VERTICAL LINE",
|
|
165
|
+
125: "RIGHT CURLY BRACKET",
|
|
166
|
+
126: "TILDE",
|
|
167
|
+
160: "NO-BREAK SPACE",
|
|
168
|
+
169: "COPYRIGHT SIGN",
|
|
169
|
+
174: "REGISTERED SIGN",
|
|
170
|
+
176: "DEGREE SIGN",
|
|
171
|
+
181: "MICRO SIGN",
|
|
172
|
+
183: "MIDDLE DOT",
|
|
173
|
+
215: "MULTIPLICATION SIGN",
|
|
174
|
+
247: "DIVISION SIGN",
|
|
175
|
+
233: "LATIN SMALL LETTER E WITH ACUTE",
|
|
176
|
+
224: "LATIN SMALL LETTER A WITH GRAVE",
|
|
177
|
+
226: "LATIN SMALL LETTER A WITH CIRCUMFLEX",
|
|
178
|
+
231: "LATIN SMALL LETTER C WITH CEDILLA",
|
|
179
|
+
232: "LATIN SMALL LETTER E WITH GRAVE",
|
|
180
|
+
234: "LATIN SMALL LETTER E WITH CIRCUMFLEX",
|
|
181
|
+
235: "LATIN SMALL LETTER E WITH DIAERESIS",
|
|
182
|
+
238: "LATIN SMALL LETTER I WITH CIRCUMFLEX",
|
|
183
|
+
239: "LATIN SMALL LETTER I WITH DIAERESIS",
|
|
184
|
+
244: "LATIN SMALL LETTER O WITH CIRCUMFLEX",
|
|
185
|
+
249: "LATIN SMALL LETTER U WITH GRAVE",
|
|
186
|
+
251: "LATIN SMALL LETTER U WITH CIRCUMFLEX",
|
|
187
|
+
252: "LATIN SMALL LETTER U WITH DIAERESIS",
|
|
188
|
+
257: "LATIN SMALL LETTER A WITH MACRON",
|
|
189
|
+
948: "GREEK SMALL LETTER DELTA",
|
|
190
|
+
960: "GREEK SMALL LETTER PI",
|
|
191
|
+
928: "GREEK CAPITAL LETTER PI",
|
|
192
|
+
916: "GREEK CAPITAL LETTER DELTA",
|
|
193
|
+
8364: "EURO SIGN",
|
|
194
|
+
8482: "TRADE MARK SIGN",
|
|
195
|
+
8592: "LEFTWARDS ARROW",
|
|
196
|
+
8593: "UPWARDS ARROW",
|
|
197
|
+
8594: "RIGHTWARDS ARROW",
|
|
198
|
+
8595: "DOWNWARDS ARROW",
|
|
199
|
+
8203: "ZERO WIDTH SPACE",
|
|
200
|
+
8204: "ZERO WIDTH NON-JOINER",
|
|
201
|
+
8205: "ZERO WIDTH JOINER",
|
|
202
|
+
8206: "LEFT-TO-RIGHT MARK",
|
|
203
|
+
8207: "RIGHT-TO-LEFT MARK",
|
|
204
|
+
65279: "ZERO WIDTH NO-BREAK SPACE",
|
|
205
|
+
128512: "GRINNING FACE",
|
|
206
|
+
128513: "GRINNING FACE WITH SMILING EYES",
|
|
207
|
+
128514: "FACE WITH TEARS OF JOY",
|
|
208
|
+
128515: "SMILING FACE WITH OPEN MOUTH",
|
|
209
|
+
128516: "SMILING FACE WITH OPEN MOUTH AND SMILING EYES",
|
|
210
|
+
128517: "SMILING FACE WITH OPEN MOUTH AND COLD SWEAT",
|
|
211
|
+
128518: "SMILING FACE WITH OPEN MOUTH AND TIGHTLY CLOSED EYES",
|
|
212
|
+
128519: "WINKING FACE",
|
|
213
|
+
128520: "SMILING FACE WITH SMILING EYES",
|
|
214
|
+
128521: "FACE SAVOURING DELICIOUS FOOD",
|
|
215
|
+
128522: "RELIEVED FACE",
|
|
216
|
+
128523: "SMILING FACE WITH HEART-SHAPED EYES",
|
|
217
|
+
128525: "SMILING FACE WITH HEART-EYES",
|
|
218
|
+
128526: "SMILING FACE WITH SUNGLASSES",
|
|
219
|
+
128527: "SMIRKING FACE",
|
|
220
|
+
128528: "NEUTRAL FACE",
|
|
221
|
+
9829: "BLACK HEART SUIT",
|
|
222
|
+
9824: "BLACK SPADE SUIT",
|
|
223
|
+
9827: "BLACK CLUB SUIT",
|
|
224
|
+
9830: "BLACK DIAMOND SUIT",
|
|
225
|
+
9733: "BLACK STAR",
|
|
226
|
+
9734: "WHITE STAR",
|
|
227
|
+
9654: "BLACK RIGHT-POINTING TRIANGLE",
|
|
228
|
+
9664: "BLACK LEFT-POINTING TRIANGLE",
|
|
229
|
+
9650: "BLACK UP-POINTING TRIANGLE",
|
|
230
|
+
9660: "BLACK DOWN-POINTING TRIANGLE",
|
|
231
|
+
128: "PADDING CHARACTER"
|
|
232
|
+
};
|
|
233
|
+
function _getCategory(cp) {
|
|
234
|
+
if (cp < 32 || cp === 127) return "Control";
|
|
235
|
+
if (cp === 32 || cp === 160 || cp === 8203 || cp === 9) return "Space";
|
|
236
|
+
if (cp >= 48 && cp <= 57) return "Digit";
|
|
237
|
+
if (cp >= 65 && cp <= 90 || cp >= 97 && cp <= 122) return "Letter";
|
|
238
|
+
if (cp >= 128 && cp <= 591) return "Letter";
|
|
239
|
+
if (cp >= 880 && cp <= 1023) return "Letter";
|
|
240
|
+
if (cp >= 1024 && cp <= 1279) return "Letter";
|
|
241
|
+
if (cp >= 19968 && cp <= 40959) return "Letter";
|
|
242
|
+
if (cp >= 44032 && cp <= 55215) return "Letter";
|
|
243
|
+
if (cp >= 128512 && cp <= 128591) return "Emoji";
|
|
244
|
+
if (cp >= 127744 && cp <= 128511) return "Emoji";
|
|
245
|
+
if (cp >= 128640 && cp <= 128767) return "Emoji";
|
|
246
|
+
if (cp >= 128768 && cp <= 129791) return "Emoji";
|
|
247
|
+
if (cp >= 9728 && cp <= 10175) return "Emoji";
|
|
248
|
+
if (cp >= 9986 && cp <= 10160) return "Emoji";
|
|
249
|
+
if (cp === 33 || cp === 34 || cp === 39 || cp === 40 || cp === 41 || cp === 44 || cp === 45 || cp === 46 || cp === 58 || cp === 59 || cp === 63 || cp === 91 || cp === 93 || cp === 123 || cp === 125 || cp >= 8192 && cp <= 8303) return "Punctuation";
|
|
250
|
+
if (cp === 36 || cp === 37 || cp === 38 || cp === 42 || cp === 43 || cp === 60 || cp === 61 || cp === 62 || cp === 64 || cp === 94 || cp === 96 || cp === 124 || cp === 126 || cp >= 8352 && cp <= 8399 || cp >= 8448 && cp <= 8527 || cp >= 8704 && cp <= 8959) return "Symbol";
|
|
251
|
+
return "Other";
|
|
252
|
+
}
|
|
253
|
+
function _getUtf8Bytes(cp) {
|
|
254
|
+
const bytes = [];
|
|
255
|
+
if (cp < 128) {
|
|
256
|
+
bytes.push(cp);
|
|
257
|
+
} else if (cp < 2048) {
|
|
258
|
+
bytes.push(192 | cp >> 6);
|
|
259
|
+
bytes.push(128 | cp & 63);
|
|
260
|
+
} else if (cp < 65536) {
|
|
261
|
+
bytes.push(224 | cp >> 12);
|
|
262
|
+
bytes.push(128 | cp >> 6 & 63);
|
|
263
|
+
bytes.push(128 | cp & 63);
|
|
264
|
+
} else {
|
|
265
|
+
bytes.push(240 | cp >> 18);
|
|
266
|
+
bytes.push(128 | cp >> 12 & 63);
|
|
267
|
+
bytes.push(128 | cp >> 6 & 63);
|
|
268
|
+
bytes.push(128 | cp & 63);
|
|
269
|
+
}
|
|
270
|
+
return bytes.map((b) => b.toString(16).toUpperCase().padStart(2, "0")).join(" ");
|
|
271
|
+
}
|
|
272
|
+
function _getUtf16(cp) {
|
|
273
|
+
if (cp < 65536) {
|
|
274
|
+
return cp.toString(16).toUpperCase().padStart(4, "0");
|
|
275
|
+
}
|
|
276
|
+
const adjusted = cp - 65536;
|
|
277
|
+
const high = 55296 + (adjusted >> 10);
|
|
278
|
+
const low = 56320 + (adjusted & 1023);
|
|
279
|
+
return `${high.toString(16).toUpperCase().padStart(4, "0")} ${low.toString(16).toUpperCase().padStart(4, "0")}`;
|
|
280
|
+
}
|
|
281
|
+
function _getHex(cp) {
|
|
282
|
+
const hex = cp.toString(16).toUpperCase().padStart(4, "0");
|
|
283
|
+
return `U+${hex}`;
|
|
284
|
+
}
|
|
285
|
+
function analyzeString(input) {
|
|
286
|
+
const results = [];
|
|
287
|
+
const codePoints = [...input];
|
|
288
|
+
for (const char of codePoints) {
|
|
289
|
+
const cp = char.codePointAt(0);
|
|
290
|
+
const hexStr = cp.toString(16).toUpperCase().padStart(4, "0");
|
|
291
|
+
const htmlEntity = NAMED_HTML_ENTITIES[cp] ?? `&#${cp};`;
|
|
292
|
+
results.push({
|
|
293
|
+
char,
|
|
294
|
+
codePoint: cp,
|
|
295
|
+
hex: _getHex(cp),
|
|
296
|
+
htmlEntity,
|
|
297
|
+
htmlHex: `&#x${hexStr};`,
|
|
298
|
+
utf8Bytes: _getUtf8Bytes(cp),
|
|
299
|
+
utf16: _getUtf16(cp),
|
|
300
|
+
name: UNICODE_NAMES[cp],
|
|
301
|
+
category: _getCategory(cp)
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
return results;
|
|
305
|
+
}
|
|
306
|
+
function toUnicodeEscape(input) {
|
|
307
|
+
const parts = [];
|
|
308
|
+
for (const char of [...input]) {
|
|
309
|
+
const cp = char.codePointAt(0);
|
|
310
|
+
if (cp > 65535) {
|
|
311
|
+
parts.push(`\\u{${cp.toString(16).toUpperCase()}}`);
|
|
312
|
+
} else {
|
|
313
|
+
parts.push(`\\u${cp.toString(16).toUpperCase().padStart(4, "0")}`);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
return parts.join("");
|
|
317
|
+
}
|
|
318
|
+
function fromUnicodeEscape(input) {
|
|
319
|
+
try {
|
|
320
|
+
let result = input;
|
|
321
|
+
result = result.replace(/\\u\{([0-9A-Fa-f]+)\}/g, (_match, hex) => {
|
|
322
|
+
const cp = parseInt(hex, 16);
|
|
323
|
+
if (cp > 1114111) throw new Error(`Invalid code point: U+${hex.toUpperCase()}`);
|
|
324
|
+
return String.fromCodePoint(cp);
|
|
325
|
+
});
|
|
326
|
+
result = result.replace(/\\u([0-9A-Fa-f]{4})/g, (_match, hex) => {
|
|
327
|
+
return String.fromCharCode(parseInt(hex, 16));
|
|
328
|
+
});
|
|
329
|
+
return result;
|
|
330
|
+
} catch (e) {
|
|
331
|
+
return { error: e instanceof Error ? e.message : "Invalid Unicode escape sequence" };
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
function codePointToChar(codePoint) {
|
|
335
|
+
return String.fromCodePoint(codePoint);
|
|
336
|
+
}
|
|
337
|
+
function charToCodePoint(char) {
|
|
338
|
+
return char.codePointAt(0);
|
|
339
|
+
}
|
|
340
|
+
function generateSvgFavicon(config) {
|
|
341
|
+
const { bgColor, textColor, shape, fontSize, fontWeight, size } = config;
|
|
342
|
+
const raw = config.text.trim();
|
|
343
|
+
const label = raw.length === 0 ? "?" : raw.slice(0, 2);
|
|
344
|
+
let bgElement;
|
|
345
|
+
if (shape === "circle") {
|
|
346
|
+
const r = size / 2;
|
|
347
|
+
bgElement = `<circle cx="${r}" cy="${r}" r="${r}" fill="${bgColor}"/>`;
|
|
348
|
+
} else if (shape === "square") {
|
|
349
|
+
bgElement = `<rect width="${size}" height="${size}" rx="0" fill="${bgColor}"/>`;
|
|
350
|
+
} else {
|
|
351
|
+
const rx = size * 0.2;
|
|
352
|
+
bgElement = `<rect width="${size}" height="${size}" rx="${rx}" fill="${bgColor}"/>`;
|
|
353
|
+
}
|
|
354
|
+
return `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${size} ${size}" width="${size}" height="${size}">${bgElement}<text x="50%" y="50%" dominant-baseline="central" text-anchor="middle" fill="${textColor}" font-size="${fontSize}" font-weight="${fontWeight}" font-family="sans-serif">${label}</text></svg>`;
|
|
355
|
+
}
|
|
356
|
+
function svgToDataUrl(svg) {
|
|
357
|
+
return `data:image/svg+xml;base64,${Buffer.from(svg).toString("base64")}`;
|
|
358
|
+
}
|
|
359
|
+
var DEFAULT_CONFIG = {
|
|
360
|
+
text: "A",
|
|
361
|
+
bgColor: "#6366f1",
|
|
362
|
+
textColor: "#ffffff",
|
|
363
|
+
shape: "rounded",
|
|
364
|
+
fontSize: 56,
|
|
365
|
+
fontWeight: "bold",
|
|
366
|
+
size: 64
|
|
367
|
+
};
|
|
368
|
+
var COLOR_PRESETS = [
|
|
369
|
+
{ name: "GitHub Dark", bg: "#24292e", text: "#ffffff" },
|
|
370
|
+
{ name: "VS Code Blue", bg: "#0066b8", text: "#ffffff" },
|
|
371
|
+
{ name: "Vercel Black", bg: "#000000", text: "#ffffff" },
|
|
372
|
+
{ name: "Stripe Purple", bg: "#635bff", text: "#ffffff" },
|
|
373
|
+
{ name: "Tailwind Teal", bg: "#0ea5e9", text: "#ffffff" },
|
|
374
|
+
{ name: "Firebase Orange", bg: "#ff6d00", text: "#ffffff" }
|
|
375
|
+
];
|
|
376
|
+
function analyzeSvg(svg) {
|
|
377
|
+
const trimmed = svg.trim();
|
|
378
|
+
if (!trimmed) {
|
|
379
|
+
return { error: "Empty input" };
|
|
380
|
+
}
|
|
381
|
+
if (!trimmed.includes("<svg")) {
|
|
382
|
+
return { error: "No <svg> element found" };
|
|
383
|
+
}
|
|
384
|
+
const widthMatch = trimmed.match(/<svg[^>]*\swidth=["']([^"']*)["']/i);
|
|
385
|
+
const heightMatch = trimmed.match(/<svg[^>]*\sheight=["']([^"']*)["']/i);
|
|
386
|
+
const viewBoxMatch = trimmed.match(/<svg[^>]*\sviewBox=["']([^"']*)["']/i);
|
|
387
|
+
const tagMatches = trimmed.matchAll(/<([a-zA-Z][a-zA-Z0-9:-]*)/g);
|
|
388
|
+
const allTags = [];
|
|
389
|
+
for (const m of tagMatches) {
|
|
390
|
+
allTags.push(m[1].toLowerCase());
|
|
391
|
+
}
|
|
392
|
+
const usedElements = [...new Set(allTags)];
|
|
393
|
+
const animationTags = ["animate", "animatetransform", "animatemotion", "set"];
|
|
394
|
+
const hasAnimation = animationTags.some((t) => usedElements.includes(t)) || /style[^>]*>[^<]*animation/i.test(trimmed);
|
|
395
|
+
const hasScript = usedElements.includes("script") || /\son\w+\s*=/i.test(trimmed);
|
|
396
|
+
const hasExternalRef = /xlink:href\s*=\s*["'](https?:|\/\/)/i.test(trimmed) || /href\s*=\s*["'](https?:|\/\/)/i.test(trimmed);
|
|
397
|
+
return {
|
|
398
|
+
width: widthMatch ? widthMatch[1] : null,
|
|
399
|
+
height: heightMatch ? heightMatch[1] : null,
|
|
400
|
+
viewBox: viewBoxMatch ? viewBoxMatch[1] : null,
|
|
401
|
+
elementCount: allTags.length,
|
|
402
|
+
hasAnimation,
|
|
403
|
+
hasScript,
|
|
404
|
+
hasExternalRef,
|
|
405
|
+
usedElements
|
|
406
|
+
};
|
|
407
|
+
}
|
|
408
|
+
function sanitizeSvg(svg) {
|
|
409
|
+
let result = svg;
|
|
410
|
+
result = result.replace(/<script[\s\S]*?<\/script>/gi, "");
|
|
411
|
+
result = result.replace(/\s+on\w+\s*=\s*["'][^"']*["']/gi, "");
|
|
412
|
+
result = result.replace(/\s+on\w+\s*=\s*[^\s>]*/gi, "");
|
|
413
|
+
result = result.replace(/javascript:[^"'\s]*/gi, "");
|
|
414
|
+
return result;
|
|
415
|
+
}
|
|
416
|
+
function optimizeSvg(svg) {
|
|
417
|
+
let result = svg;
|
|
418
|
+
result = result.replace(/<!--[\s\S]*?-->/g, "");
|
|
419
|
+
result = result.replace(/<g\s*>\s*<\/g>/gi, "");
|
|
420
|
+
result = result.replace(/<g\/>/gi, "");
|
|
421
|
+
result = result.replace(/<defs\s*>\s*<\/defs>/gi, "");
|
|
422
|
+
result = result.replace(/\n\s*\n/g, "\n");
|
|
423
|
+
return result.trim();
|
|
424
|
+
}
|
|
425
|
+
function formatSvg(svg) {
|
|
426
|
+
const lines = svg.replace(/></g, ">\n<").replace(/^\s+|\s+$/gm, "").split("\n").filter((l) => l.trim().length > 0);
|
|
427
|
+
let indent = 0;
|
|
428
|
+
const result = [];
|
|
429
|
+
for (const line of lines) {
|
|
430
|
+
const trimmed = line.trim();
|
|
431
|
+
const isClosing = /^<\//.test(trimmed);
|
|
432
|
+
const isSelfClosing = /\/>$/.test(trimmed) || /^<!/.test(trimmed);
|
|
433
|
+
const isOpening = /^<[^/!]/.test(trimmed) && !isSelfClosing;
|
|
434
|
+
if (isClosing) {
|
|
435
|
+
indent = Math.max(0, indent - 1);
|
|
436
|
+
}
|
|
437
|
+
result.push(" ".repeat(indent) + trimmed);
|
|
438
|
+
if (isOpening) {
|
|
439
|
+
indent++;
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
return result.join("\n");
|
|
443
|
+
}
|
|
444
|
+
function minifySvg(svg) {
|
|
445
|
+
return svg.replace(/>\s+</g, "><").replace(/\s{2,}/g, " ").trim();
|
|
446
|
+
}
|
|
447
|
+
function formatBytes(bytes) {
|
|
448
|
+
if (bytes === 0) return "0 B";
|
|
449
|
+
const units = ["B", "KB", "MB", "GB", "TB"];
|
|
450
|
+
const i = Math.floor(Math.log(bytes) / Math.log(1024));
|
|
451
|
+
const value = bytes / Math.pow(1024, i);
|
|
452
|
+
if (i === 0) return `${bytes} B`;
|
|
453
|
+
return `${value.toFixed(1)} ${units[i]}`;
|
|
454
|
+
}
|
|
455
|
+
function calcSavings(originalBytes, compressedBytes) {
|
|
456
|
+
const savedBytes = originalBytes - compressedBytes;
|
|
457
|
+
const savedPercent = originalBytes === 0 ? 0 : Math.round(savedBytes / originalBytes * 1e4) / 100;
|
|
458
|
+
return { savedBytes, savedPercent };
|
|
459
|
+
}
|
|
460
|
+
function detectFormatFromDataUrl(dataUrl) {
|
|
461
|
+
const match = dataUrl.match(/^data:(image\/(?:jpeg|png|webp|gif));base64,/);
|
|
462
|
+
if (!match) return null;
|
|
463
|
+
return match[1];
|
|
464
|
+
}
|
|
465
|
+
function detectFormatFromFilename(filename) {
|
|
466
|
+
const lower = filename.toLowerCase();
|
|
467
|
+
if (lower.endsWith(".jpg") || lower.endsWith(".jpeg")) return "image/jpeg";
|
|
468
|
+
if (lower.endsWith(".png")) return "image/png";
|
|
469
|
+
if (lower.endsWith(".webp")) return "image/webp";
|
|
470
|
+
if (lower.endsWith(".gif")) return "image/gif";
|
|
471
|
+
return null;
|
|
472
|
+
}
|
|
473
|
+
function getDefaultQuality(format) {
|
|
474
|
+
if (format === "image/jpeg" || format === "image/webp") return 0.8;
|
|
475
|
+
return 1;
|
|
476
|
+
}
|
|
477
|
+
function getSupportedOutputFormats() {
|
|
478
|
+
return ["image/jpeg", "image/png", "image/webp"];
|
|
479
|
+
}
|
|
480
|
+
function formatLabel(format) {
|
|
481
|
+
const labels = {
|
|
482
|
+
"image/jpeg": "JPEG",
|
|
483
|
+
"image/png": "PNG",
|
|
484
|
+
"image/webp": "WebP",
|
|
485
|
+
"image/gif": "GIF"
|
|
486
|
+
};
|
|
487
|
+
return labels[format];
|
|
488
|
+
}
|
|
489
|
+
function calcResizeDimensions(width, height, maxWidth, maxHeight) {
|
|
490
|
+
if (!maxWidth && !maxHeight) {
|
|
491
|
+
return { width, height, changed: false };
|
|
492
|
+
}
|
|
493
|
+
let newWidth = width;
|
|
494
|
+
let newHeight = height;
|
|
495
|
+
if (maxWidth && newWidth > maxWidth) {
|
|
496
|
+
newHeight = Math.round(newHeight * maxWidth / newWidth);
|
|
497
|
+
newWidth = maxWidth;
|
|
498
|
+
}
|
|
499
|
+
if (maxHeight && newHeight > maxHeight) {
|
|
500
|
+
newWidth = Math.round(newWidth * maxHeight / newHeight);
|
|
501
|
+
newHeight = maxHeight;
|
|
502
|
+
}
|
|
503
|
+
const changed = newWidth !== width || newHeight !== height;
|
|
504
|
+
return { width: newWidth, height: newHeight, changed };
|
|
505
|
+
}
|
|
506
|
+
var FORMAT_EXTENSIONS = {
|
|
507
|
+
"image/jpeg": ".jpg",
|
|
508
|
+
"image/png": ".png",
|
|
509
|
+
"image/webp": ".webp"
|
|
510
|
+
};
|
|
511
|
+
var FORMAT_LABELS = {
|
|
512
|
+
"image/jpeg": "JPEG",
|
|
513
|
+
"image/png": "PNG",
|
|
514
|
+
"image/webp": "WebP"
|
|
515
|
+
};
|
|
516
|
+
function getConversionWarnings(from, to) {
|
|
517
|
+
const warnings = [];
|
|
518
|
+
if (from === "image/png" && to === "image/jpeg") {
|
|
519
|
+
warnings.push("Transparency will be lost (replaced with white background)");
|
|
520
|
+
}
|
|
521
|
+
if (from === "image/jpeg" && to === "image/png") {
|
|
522
|
+
warnings.push("File size may increase (PNG is lossless)");
|
|
523
|
+
}
|
|
524
|
+
if (from === "image/webp" && to === "image/jpeg") {
|
|
525
|
+
warnings.push("Transparency will be lost if the WebP image has an alpha channel");
|
|
526
|
+
}
|
|
527
|
+
if (to === "image/jpeg") {
|
|
528
|
+
warnings.push("JPEG uses lossy compression \u2014 some quality may be reduced");
|
|
529
|
+
}
|
|
530
|
+
return warnings;
|
|
531
|
+
}
|
|
532
|
+
function getSupportedFormats() {
|
|
533
|
+
return ["image/jpeg", "image/png", "image/webp"];
|
|
534
|
+
}
|
|
535
|
+
function getDownloadFilename(originalName, outputFormat) {
|
|
536
|
+
const newExt = FORMAT_EXTENSIONS[outputFormat];
|
|
537
|
+
const withoutExt = originalName.replace(/\.(jpe?g|png|webp|gif|bmp|tiff?|avif|ico)$/i, "");
|
|
538
|
+
if (withoutExt === originalName) {
|
|
539
|
+
return originalName + newExt;
|
|
540
|
+
}
|
|
541
|
+
return withoutExt + newExt;
|
|
542
|
+
}
|
|
543
|
+
var _ONES = [
|
|
544
|
+
"",
|
|
545
|
+
"one",
|
|
546
|
+
"two",
|
|
547
|
+
"three",
|
|
548
|
+
"four",
|
|
549
|
+
"five",
|
|
550
|
+
"six",
|
|
551
|
+
"seven",
|
|
552
|
+
"eight",
|
|
553
|
+
"nine",
|
|
554
|
+
"ten",
|
|
555
|
+
"eleven",
|
|
556
|
+
"twelve",
|
|
557
|
+
"thirteen",
|
|
558
|
+
"fourteen",
|
|
559
|
+
"fifteen",
|
|
560
|
+
"sixteen",
|
|
561
|
+
"seventeen",
|
|
562
|
+
"eighteen",
|
|
563
|
+
"nineteen"
|
|
564
|
+
];
|
|
565
|
+
var _TENS = [
|
|
566
|
+
"",
|
|
567
|
+
"",
|
|
568
|
+
"twenty",
|
|
569
|
+
"thirty",
|
|
570
|
+
"forty",
|
|
571
|
+
"fifty",
|
|
572
|
+
"sixty",
|
|
573
|
+
"seventy",
|
|
574
|
+
"eighty",
|
|
575
|
+
"ninety"
|
|
576
|
+
];
|
|
577
|
+
var _SCALES = [
|
|
578
|
+
"",
|
|
579
|
+
"thousand",
|
|
580
|
+
"million",
|
|
581
|
+
"billion",
|
|
582
|
+
"trillion",
|
|
583
|
+
"quadrillion"
|
|
584
|
+
];
|
|
585
|
+
function _convertHundreds(n) {
|
|
586
|
+
if (n === 0) return "";
|
|
587
|
+
if (n < 20) return _ONES[n];
|
|
588
|
+
if (n < 100) {
|
|
589
|
+
const ten = _TENS[Math.floor(n / 10)];
|
|
590
|
+
const one = _ONES[n % 10];
|
|
591
|
+
return one ? `${ten}-${one}` : ten;
|
|
592
|
+
}
|
|
593
|
+
const hundred = _ONES[Math.floor(n / 100)];
|
|
594
|
+
const rest = _convertHundreds(n % 100);
|
|
595
|
+
return rest ? `${hundred} hundred ${rest}` : `${hundred} hundred`;
|
|
596
|
+
}
|
|
597
|
+
function numberToWords(n) {
|
|
598
|
+
if (!isFinite(n) || isNaN(n)) {
|
|
599
|
+
return { error: "Input must be a finite number" };
|
|
600
|
+
}
|
|
601
|
+
const MAX = 999999999999999;
|
|
602
|
+
if (Math.abs(Math.trunc(n)) > MAX) {
|
|
603
|
+
return { error: `Number out of range (max \xB1${MAX})` };
|
|
604
|
+
}
|
|
605
|
+
if (n === 0) return "zero";
|
|
606
|
+
const isNegative = n < 0;
|
|
607
|
+
const absVal = Math.abs(n);
|
|
608
|
+
const decimalIndex = absVal.toString().indexOf(".");
|
|
609
|
+
let intPart = Math.trunc(absVal);
|
|
610
|
+
let decimalWords = "";
|
|
611
|
+
if (decimalIndex !== -1) {
|
|
612
|
+
const decStr = absVal.toString().slice(decimalIndex + 1);
|
|
613
|
+
const decDigits = decStr.split("").map(Number);
|
|
614
|
+
decimalWords = " point " + decDigits.map((d) => _ONES[d] || "zero").join(" ");
|
|
615
|
+
}
|
|
616
|
+
if (intPart === 0 && decimalWords) {
|
|
617
|
+
const prefix2 = isNegative ? "negative " : "";
|
|
618
|
+
return `${prefix2}zero${decimalWords}`;
|
|
619
|
+
}
|
|
620
|
+
let result = "";
|
|
621
|
+
let scaleIndex = 0;
|
|
622
|
+
while (intPart > 0) {
|
|
623
|
+
const chunk = intPart % 1e3;
|
|
624
|
+
if (chunk !== 0) {
|
|
625
|
+
const chunkWords = _convertHundreds(chunk);
|
|
626
|
+
const scale = _SCALES[scaleIndex];
|
|
627
|
+
result = scale ? `${chunkWords} ${scale}${result ? " " + result : ""}` : chunkWords;
|
|
628
|
+
}
|
|
629
|
+
intPart = Math.floor(intPart / 1e3);
|
|
630
|
+
scaleIndex++;
|
|
631
|
+
}
|
|
632
|
+
const prefix = isNegative ? "negative " : "";
|
|
633
|
+
return `${prefix}${result}${decimalWords}`;
|
|
634
|
+
}
|
|
635
|
+
function numberToOrdinal(n) {
|
|
636
|
+
if (!Number.isInteger(n) || !isFinite(n)) {
|
|
637
|
+
return { error: "Input must be a finite integer" };
|
|
638
|
+
}
|
|
639
|
+
const abs = Math.abs(n);
|
|
640
|
+
const lastTwo = abs % 100;
|
|
641
|
+
const lastOne = abs % 10;
|
|
642
|
+
let suffix;
|
|
643
|
+
if (lastTwo >= 11 && lastTwo <= 13) {
|
|
644
|
+
suffix = "th";
|
|
645
|
+
} else if (lastOne === 1) {
|
|
646
|
+
suffix = "st";
|
|
647
|
+
} else if (lastOne === 2) {
|
|
648
|
+
suffix = "nd";
|
|
649
|
+
} else if (lastOne === 3) {
|
|
650
|
+
suffix = "rd";
|
|
651
|
+
} else {
|
|
652
|
+
suffix = "th";
|
|
653
|
+
}
|
|
654
|
+
return `${n}${suffix}`;
|
|
655
|
+
}
|
|
656
|
+
var _ORDINAL_ONES = [
|
|
657
|
+
"",
|
|
658
|
+
"first",
|
|
659
|
+
"second",
|
|
660
|
+
"third",
|
|
661
|
+
"fourth",
|
|
662
|
+
"fifth",
|
|
663
|
+
"sixth",
|
|
664
|
+
"seventh",
|
|
665
|
+
"eighth",
|
|
666
|
+
"ninth",
|
|
667
|
+
"tenth",
|
|
668
|
+
"eleventh",
|
|
669
|
+
"twelfth",
|
|
670
|
+
"thirteenth",
|
|
671
|
+
"fourteenth",
|
|
672
|
+
"fifteenth",
|
|
673
|
+
"sixteenth",
|
|
674
|
+
"seventeenth",
|
|
675
|
+
"eighteenth",
|
|
676
|
+
"nineteenth"
|
|
677
|
+
];
|
|
678
|
+
var _ORDINAL_TENS = [
|
|
679
|
+
"",
|
|
680
|
+
"",
|
|
681
|
+
"twentieth",
|
|
682
|
+
"thirtieth",
|
|
683
|
+
"fortieth",
|
|
684
|
+
"fiftieth",
|
|
685
|
+
"sixtieth",
|
|
686
|
+
"seventieth",
|
|
687
|
+
"eightieth",
|
|
688
|
+
"ninetieth"
|
|
689
|
+
];
|
|
690
|
+
function _convertOrdinalHundreds(n) {
|
|
691
|
+
if (n < 20) return _ORDINAL_ONES[n];
|
|
692
|
+
if (n < 100) {
|
|
693
|
+
const tenIndex = Math.floor(n / 10);
|
|
694
|
+
const one = n % 10;
|
|
695
|
+
if (one === 0) return _ORDINAL_TENS[tenIndex];
|
|
696
|
+
return `${_TENS[tenIndex]}-${_ORDINAL_ONES[one]}`;
|
|
697
|
+
}
|
|
698
|
+
const hundred = _ONES[Math.floor(n / 100)];
|
|
699
|
+
const rest = n % 100;
|
|
700
|
+
if (rest === 0) return `${hundred} hundredth`;
|
|
701
|
+
return `${hundred} hundred ${_convertOrdinalHundreds(rest)}`;
|
|
702
|
+
}
|
|
703
|
+
function ordinalWords(n) {
|
|
704
|
+
if (!Number.isInteger(n) || !isFinite(n) || n < 0) {
|
|
705
|
+
return { error: "Input must be a non-negative finite integer" };
|
|
706
|
+
}
|
|
707
|
+
if (n === 0) return "zeroth";
|
|
708
|
+
const MAX = 999999999999999;
|
|
709
|
+
if (n > MAX) return { error: `Number out of range (max ${MAX})` };
|
|
710
|
+
const wordsResult = numberToWords(n);
|
|
711
|
+
if (typeof wordsResult !== "string") return wordsResult;
|
|
712
|
+
if (n <= 999) {
|
|
713
|
+
return _convertOrdinalHundreds(n);
|
|
714
|
+
}
|
|
715
|
+
const lastChunk = n % 1e3;
|
|
716
|
+
if (lastChunk === 0) {
|
|
717
|
+
const words = wordsResult;
|
|
718
|
+
const parts = words.split(" ");
|
|
719
|
+
const lastWord = parts[parts.length - 1];
|
|
720
|
+
const ordinalScale = {
|
|
721
|
+
thousand: "thousandth",
|
|
722
|
+
million: "millionth",
|
|
723
|
+
billion: "billionth",
|
|
724
|
+
trillion: "trillionth",
|
|
725
|
+
quadrillion: "quadrillionth"
|
|
726
|
+
};
|
|
727
|
+
if (ordinalScale[lastWord]) {
|
|
728
|
+
parts[parts.length - 1] = ordinalScale[lastWord];
|
|
729
|
+
return parts.join(" ");
|
|
730
|
+
}
|
|
731
|
+
return words + "th";
|
|
732
|
+
}
|
|
733
|
+
const lastChunkCardinal = _convertHundreds(lastChunk);
|
|
734
|
+
const lastChunkOrdinal = _convertOrdinalHundreds(lastChunk);
|
|
735
|
+
const idx = wordsResult.lastIndexOf(lastChunkCardinal);
|
|
736
|
+
if (idx !== -1) {
|
|
737
|
+
return wordsResult.slice(0, idx) + lastChunkOrdinal;
|
|
738
|
+
}
|
|
739
|
+
return wordsResult + "th";
|
|
740
|
+
}
|
|
741
|
+
var _ROMAN_VALUES = [
|
|
742
|
+
[1e3, "M"],
|
|
743
|
+
[900, "CM"],
|
|
744
|
+
[500, "D"],
|
|
745
|
+
[400, "CD"],
|
|
746
|
+
[100, "C"],
|
|
747
|
+
[90, "XC"],
|
|
748
|
+
[50, "L"],
|
|
749
|
+
[40, "XL"],
|
|
750
|
+
[10, "X"],
|
|
751
|
+
[9, "IX"],
|
|
752
|
+
[5, "V"],
|
|
753
|
+
[4, "IV"],
|
|
754
|
+
[1, "I"]
|
|
755
|
+
];
|
|
756
|
+
function numberToRoman(n) {
|
|
757
|
+
if (!Number.isInteger(n) || n < 1 || n > 3999) {
|
|
758
|
+
return { error: "Input must be an integer between 1 and 3999" };
|
|
759
|
+
}
|
|
760
|
+
let result = "";
|
|
761
|
+
let remaining = n;
|
|
762
|
+
for (const [value, numeral] of _ROMAN_VALUES) {
|
|
763
|
+
while (remaining >= value) {
|
|
764
|
+
result += numeral;
|
|
765
|
+
remaining -= value;
|
|
766
|
+
}
|
|
767
|
+
}
|
|
768
|
+
return result;
|
|
769
|
+
}
|
|
770
|
+
var _ROMAN_MAP = {
|
|
771
|
+
I: 1,
|
|
772
|
+
V: 5,
|
|
773
|
+
X: 10,
|
|
774
|
+
L: 50,
|
|
775
|
+
C: 100,
|
|
776
|
+
D: 500,
|
|
777
|
+
M: 1e3
|
|
778
|
+
};
|
|
779
|
+
function romanToNumber(roman) {
|
|
780
|
+
if (!roman || !/^[IVXLCDM]+$/i.test(roman)) {
|
|
781
|
+
return { error: `Invalid Roman numeral: ${roman}` };
|
|
782
|
+
}
|
|
783
|
+
const upper = roman.toUpperCase();
|
|
784
|
+
let result = 0;
|
|
785
|
+
for (let i = 0; i < upper.length; i++) {
|
|
786
|
+
const curr = _ROMAN_MAP[upper[i]];
|
|
787
|
+
const next = _ROMAN_MAP[upper[i + 1]];
|
|
788
|
+
if (curr === void 0) return { error: `Invalid Roman numeral character: ${upper[i]}` };
|
|
789
|
+
if (next && curr < next) {
|
|
790
|
+
result -= curr;
|
|
791
|
+
} else {
|
|
792
|
+
result += curr;
|
|
793
|
+
}
|
|
794
|
+
}
|
|
795
|
+
const roundTrip = numberToRoman(result);
|
|
796
|
+
if (typeof roundTrip !== "string" || roundTrip !== upper) {
|
|
797
|
+
return { error: `Invalid Roman numeral: ${roman}` };
|
|
798
|
+
}
|
|
799
|
+
return result;
|
|
800
|
+
}
|
|
801
|
+
var DATA_TYPES = [
|
|
802
|
+
{ value: "name", label: "Full Name", example: "John Smith" },
|
|
803
|
+
{ value: "email", label: "Email Address", example: "john.smith@gmail.com" },
|
|
804
|
+
{ value: "uuid", label: "UUID", example: "550e8400-e29b-41d4-a716-446655440000" },
|
|
805
|
+
{ value: "phone", label: "Phone Number", example: "(555) 123-4567" },
|
|
806
|
+
{ value: "date", label: "Date", example: "2024-03-15" },
|
|
807
|
+
{ value: "number", label: "Number", example: "742" },
|
|
808
|
+
{ value: "boolean", label: "Boolean", example: "true" },
|
|
809
|
+
{ value: "color", label: "Hex Color", example: "#a3f2c1" },
|
|
810
|
+
{ value: "url", label: "URL", example: "https://www.example.com/page" },
|
|
811
|
+
{ value: "ipv4", label: "IPv4 Address", example: "192.168.1.1" },
|
|
812
|
+
{ value: "sentence", label: "Sentence", example: "The quick brown fox jumps over the lazy dog" },
|
|
813
|
+
{ value: "paragraph", label: "Paragraph", example: "Multiple sentences forming a paragraph." }
|
|
814
|
+
];
|
|
815
|
+
var _FIRST_NAMES = [
|
|
816
|
+
"James",
|
|
817
|
+
"Mary",
|
|
818
|
+
"John",
|
|
819
|
+
"Patricia",
|
|
820
|
+
"Robert",
|
|
821
|
+
"Jennifer",
|
|
822
|
+
"Michael",
|
|
823
|
+
"Linda",
|
|
824
|
+
"William",
|
|
825
|
+
"Barbara",
|
|
826
|
+
"David",
|
|
827
|
+
"Elizabeth",
|
|
828
|
+
"Richard",
|
|
829
|
+
"Susan",
|
|
830
|
+
"Joseph",
|
|
831
|
+
"Jessica",
|
|
832
|
+
"Thomas",
|
|
833
|
+
"Sarah",
|
|
834
|
+
"Charles",
|
|
835
|
+
"Karen",
|
|
836
|
+
"Christopher",
|
|
837
|
+
"Lisa",
|
|
838
|
+
"Daniel",
|
|
839
|
+
"Nancy",
|
|
840
|
+
"Matthew",
|
|
841
|
+
"Betty",
|
|
842
|
+
"Anthony",
|
|
843
|
+
"Margaret",
|
|
844
|
+
"Mark",
|
|
845
|
+
"Sandra"
|
|
846
|
+
];
|
|
847
|
+
var _LAST_NAMES = [
|
|
848
|
+
"Smith",
|
|
849
|
+
"Johnson",
|
|
850
|
+
"Williams",
|
|
851
|
+
"Brown",
|
|
852
|
+
"Jones",
|
|
853
|
+
"Garcia",
|
|
854
|
+
"Miller",
|
|
855
|
+
"Davis",
|
|
856
|
+
"Rodriguez",
|
|
857
|
+
"Martinez",
|
|
858
|
+
"Hernandez",
|
|
859
|
+
"Lopez",
|
|
860
|
+
"Gonzalez",
|
|
861
|
+
"Wilson",
|
|
862
|
+
"Anderson",
|
|
863
|
+
"Thomas",
|
|
864
|
+
"Taylor",
|
|
865
|
+
"Moore",
|
|
866
|
+
"Jackson",
|
|
867
|
+
"Martin",
|
|
868
|
+
"Lee",
|
|
869
|
+
"Perez",
|
|
870
|
+
"Thompson",
|
|
871
|
+
"White",
|
|
872
|
+
"Harris",
|
|
873
|
+
"Sanchez",
|
|
874
|
+
"Clark",
|
|
875
|
+
"Ramirez",
|
|
876
|
+
"Lewis",
|
|
877
|
+
"Robinson"
|
|
878
|
+
];
|
|
879
|
+
var _EMAIL_DOMAINS = ["gmail.com", "yahoo.com", "outlook.com", "hotmail.com", "icloud.com"];
|
|
880
|
+
var _URL_DOMAINS = ["example", "mysite", "testdomain", "webservice", "apphost", "platform"];
|
|
881
|
+
var _URL_TLDS = ["com", "net", "org", "io", "dev"];
|
|
882
|
+
var _URL_PATHS = ["home", "about", "contact", "products", "services", "blog", "news", "help", "docs", "api"];
|
|
883
|
+
var _WORDS = [
|
|
884
|
+
"the",
|
|
885
|
+
"quick",
|
|
886
|
+
"brown",
|
|
887
|
+
"fox",
|
|
888
|
+
"jumps",
|
|
889
|
+
"over",
|
|
890
|
+
"lazy",
|
|
891
|
+
"dog",
|
|
892
|
+
"bright",
|
|
893
|
+
"sun",
|
|
894
|
+
"shines",
|
|
895
|
+
"every",
|
|
896
|
+
"day",
|
|
897
|
+
"blue",
|
|
898
|
+
"sky",
|
|
899
|
+
"above",
|
|
900
|
+
"green",
|
|
901
|
+
"trees",
|
|
902
|
+
"grow",
|
|
903
|
+
"tall",
|
|
904
|
+
"small",
|
|
905
|
+
"birds",
|
|
906
|
+
"sing",
|
|
907
|
+
"sweet",
|
|
908
|
+
"songs",
|
|
909
|
+
"fresh",
|
|
910
|
+
"wind",
|
|
911
|
+
"blows",
|
|
912
|
+
"cold",
|
|
913
|
+
"rain",
|
|
914
|
+
"falls",
|
|
915
|
+
"soft",
|
|
916
|
+
"light",
|
|
917
|
+
"glows",
|
|
918
|
+
"deep",
|
|
919
|
+
"ocean",
|
|
920
|
+
"waves",
|
|
921
|
+
"crash",
|
|
922
|
+
"rocky",
|
|
923
|
+
"shore",
|
|
924
|
+
"people",
|
|
925
|
+
"walk",
|
|
926
|
+
"through",
|
|
927
|
+
"quiet",
|
|
928
|
+
"streets",
|
|
929
|
+
"busy",
|
|
930
|
+
"city",
|
|
931
|
+
"moves",
|
|
932
|
+
"fast",
|
|
933
|
+
"time"
|
|
934
|
+
];
|
|
935
|
+
function _rand(min, max) {
|
|
936
|
+
return Math.floor(Math.random() * (max - min + 1)) + min;
|
|
937
|
+
}
|
|
938
|
+
function _pick(arr) {
|
|
939
|
+
return arr[Math.floor(Math.random() * arr.length)];
|
|
940
|
+
}
|
|
941
|
+
function _hexByte() {
|
|
942
|
+
return Math.floor(Math.random() * 256).toString(16).padStart(2, "0");
|
|
943
|
+
}
|
|
944
|
+
function _generateName() {
|
|
945
|
+
return `${_pick(_FIRST_NAMES)} ${_pick(_LAST_NAMES)}`;
|
|
946
|
+
}
|
|
947
|
+
function _generateEmail() {
|
|
948
|
+
const first = _pick(_FIRST_NAMES).toLowerCase();
|
|
949
|
+
const last = _pick(_LAST_NAMES).toLowerCase();
|
|
950
|
+
const domain = _pick(_EMAIL_DOMAINS);
|
|
951
|
+
const sep = _pick([".", "_", ""]);
|
|
952
|
+
return `${first}${sep}${last}@${domain}`;
|
|
953
|
+
}
|
|
954
|
+
function _generateUUID() {
|
|
955
|
+
const s4 = () => Math.floor(Math.random() * 65536).toString(16).padStart(4, "0");
|
|
956
|
+
const s8 = () => Math.floor(Math.random() * 4294967296).toString(16).padStart(8, "0");
|
|
957
|
+
const y = (Math.floor(Math.random() * 4) + 8).toString(16);
|
|
958
|
+
return `${s8()}-${s4()}-4${s4().slice(1)}-${y}${s4().slice(1)}-${s4()}${s8().slice(0, 8)}`;
|
|
959
|
+
}
|
|
960
|
+
function _generatePhone() {
|
|
961
|
+
const area = _rand(200, 999);
|
|
962
|
+
const prefix = _rand(200, 999);
|
|
963
|
+
const line = _rand(1e3, 9999);
|
|
964
|
+
return `(${area}) ${prefix}-${line}`;
|
|
965
|
+
}
|
|
966
|
+
function _generateDate(format = "iso") {
|
|
967
|
+
const year = _rand(1970, 2030);
|
|
968
|
+
const month = _rand(1, 12);
|
|
969
|
+
const day = _rand(1, 28);
|
|
970
|
+
const mm = String(month).padStart(2, "0");
|
|
971
|
+
const dd = String(day).padStart(2, "0");
|
|
972
|
+
if (format === "us") return `${mm}/${dd}/${year}`;
|
|
973
|
+
if (format === "eu") return `${dd}/${mm}/${year}`;
|
|
974
|
+
return `${year}-${mm}-${dd}`;
|
|
975
|
+
}
|
|
976
|
+
function _generateNumber(min = 0, max = 1e3) {
|
|
977
|
+
return String(_rand(min, max));
|
|
978
|
+
}
|
|
979
|
+
function _generateBoolean() {
|
|
980
|
+
return Math.random() < 0.5 ? "true" : "false";
|
|
981
|
+
}
|
|
982
|
+
function _generateColor() {
|
|
983
|
+
return `#${_hexByte()}${_hexByte()}${_hexByte()}`;
|
|
984
|
+
}
|
|
985
|
+
function _generateURL() {
|
|
986
|
+
const domain = _pick(_URL_DOMAINS);
|
|
987
|
+
const tld = _pick(_URL_TLDS);
|
|
988
|
+
const path = _pick(_URL_PATHS);
|
|
989
|
+
return `https://www.${domain}.${tld}/${path}`;
|
|
990
|
+
}
|
|
991
|
+
function _generateIPv4() {
|
|
992
|
+
return `${_rand(0, 255)}.${_rand(0, 255)}.${_rand(0, 255)}.${_rand(0, 255)}`;
|
|
993
|
+
}
|
|
994
|
+
function _generateSentenceText() {
|
|
995
|
+
const length = _rand(6, 12);
|
|
996
|
+
const words = [];
|
|
997
|
+
for (let i = 0; i < length; i++) {
|
|
998
|
+
words.push(_pick(_WORDS));
|
|
999
|
+
}
|
|
1000
|
+
const sentence = words.join(" ");
|
|
1001
|
+
return sentence.charAt(0).toUpperCase() + sentence.slice(1) + ".";
|
|
1002
|
+
}
|
|
1003
|
+
function _generateParagraph() {
|
|
1004
|
+
const count = _rand(3, 5);
|
|
1005
|
+
const sentences = [];
|
|
1006
|
+
for (let i = 0; i < count; i++) {
|
|
1007
|
+
sentences.push(_generateSentenceText());
|
|
1008
|
+
}
|
|
1009
|
+
return sentences.join(" ");
|
|
1010
|
+
}
|
|
1011
|
+
function generateSingle(type, options) {
|
|
1012
|
+
switch (type) {
|
|
1013
|
+
case "name":
|
|
1014
|
+
return _generateName();
|
|
1015
|
+
case "email":
|
|
1016
|
+
return _generateEmail();
|
|
1017
|
+
case "uuid":
|
|
1018
|
+
return _generateUUID();
|
|
1019
|
+
case "phone":
|
|
1020
|
+
return _generatePhone();
|
|
1021
|
+
case "date":
|
|
1022
|
+
return _generateDate(options?.dateFormat ?? "iso");
|
|
1023
|
+
case "number":
|
|
1024
|
+
return _generateNumber(options?.min ?? 0, options?.max ?? 1e3);
|
|
1025
|
+
case "boolean":
|
|
1026
|
+
return _generateBoolean();
|
|
1027
|
+
case "color":
|
|
1028
|
+
return _generateColor();
|
|
1029
|
+
case "url":
|
|
1030
|
+
return _generateURL();
|
|
1031
|
+
case "ipv4":
|
|
1032
|
+
return _generateIPv4();
|
|
1033
|
+
case "sentence":
|
|
1034
|
+
return _generateSentenceText();
|
|
1035
|
+
case "paragraph":
|
|
1036
|
+
return _generateParagraph();
|
|
1037
|
+
}
|
|
1038
|
+
}
|
|
1039
|
+
function generateData(config) {
|
|
1040
|
+
const count = Math.min(Math.max(config.count, 1), 100);
|
|
1041
|
+
const results = [];
|
|
1042
|
+
for (let i = 0; i < count; i++) {
|
|
1043
|
+
results.push(generateSingle(config.type, config.options));
|
|
1044
|
+
}
|
|
1045
|
+
return results;
|
|
1046
|
+
}
|
|
1047
|
+
|
|
1048
|
+
exports.COLOR_PRESETS = COLOR_PRESETS;
|
|
1049
|
+
exports.DATA_TYPES = DATA_TYPES;
|
|
1050
|
+
exports.DEFAULT_CONFIG = DEFAULT_CONFIG;
|
|
1051
|
+
exports.FORMAT_EXTENSIONS = FORMAT_EXTENSIONS;
|
|
1052
|
+
exports.FORMAT_LABELS = FORMAT_LABELS;
|
|
1053
|
+
exports.analyzeString = analyzeString;
|
|
1054
|
+
exports.analyzeSvg = analyzeSvg;
|
|
1055
|
+
exports.calcResizeDimensions = calcResizeDimensions;
|
|
1056
|
+
exports.calcSavings = calcSavings;
|
|
1057
|
+
exports.charToCodePoint = charToCodePoint;
|
|
1058
|
+
exports.codePointToChar = codePointToChar;
|
|
1059
|
+
exports.detectFormatFromDataUrl = detectFormatFromDataUrl;
|
|
1060
|
+
exports.detectFormatFromFilename = detectFormatFromFilename;
|
|
1061
|
+
exports.formatBytes = formatBytes;
|
|
1062
|
+
exports.formatLabel = formatLabel;
|
|
1063
|
+
exports.formatSvg = formatSvg;
|
|
1064
|
+
exports.fromUnicodeEscape = fromUnicodeEscape;
|
|
1065
|
+
exports.generateData = generateData;
|
|
1066
|
+
exports.generateSingle = generateSingle;
|
|
1067
|
+
exports.generateSvgFavicon = generateSvgFavicon;
|
|
1068
|
+
exports.getConversionWarnings = getConversionWarnings;
|
|
1069
|
+
exports.getDefaultQuality = getDefaultQuality;
|
|
1070
|
+
exports.getDownloadFilename = getDownloadFilename;
|
|
1071
|
+
exports.getSupportedFormats = getSupportedFormats;
|
|
1072
|
+
exports.getSupportedOutputFormats = getSupportedOutputFormats;
|
|
1073
|
+
exports.minifySvg = minifySvg;
|
|
1074
|
+
exports.numberToOrdinal = numberToOrdinal;
|
|
1075
|
+
exports.numberToRoman = numberToRoman;
|
|
1076
|
+
exports.numberToWords = numberToWords;
|
|
1077
|
+
exports.optimizeSvg = optimizeSvg;
|
|
1078
|
+
exports.ordinalWords = ordinalWords;
|
|
1079
|
+
exports.romanToNumber = romanToNumber;
|
|
1080
|
+
exports.sanitizeSvg = sanitizeSvg;
|
|
1081
|
+
exports.svgToDataUrl = svgToDataUrl;
|
|
1082
|
+
exports.toUnicodeEscape = toUnicodeEscape;
|