@cnc_cbz/usefultools-plugin-official 1.0.1

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.
@@ -0,0 +1,239 @@
1
+ import { defineComponent, ref, watch, openBlock, createElementBlock, createElementVNode, withDirectives, vModelText, Fragment, renderList, toDisplayString, normalizeClass, createCommentVNode } from "vue";
2
+ const _hoisted_1 = { class: "flex flex-col h-full gap-5" };
3
+ const _hoisted_2 = { class: "bg-deep-charcoal border-4 border-black rounded-xl p-4 shadow-hard" };
4
+ const _hoisted_3 = {
5
+ key: 0,
6
+ class: "flex-1 flex flex-col gap-4 overflow-auto"
7
+ };
8
+ const _hoisted_4 = ["onClick"];
9
+ const _hoisted_5 = { class: "flex items-center justify-between mb-2" };
10
+ const _hoisted_6 = { class: "text-xs font-bold text-gray-500 uppercase tracking-wider" };
11
+ const _hoisted_7 = { class: "font-mono text-sm text-gray-100 break-all select-all" };
12
+ const _sfc_main = /* @__PURE__ */ defineComponent({
13
+ __name: "index",
14
+ setup(__props) {
15
+ const input = ref("");
16
+ const copyField = ref("");
17
+ const algorithms = ["MD5", "SHA-1", "SHA-256", "SHA-512"];
18
+ const results = ref({});
19
+ function md5(str) {
20
+ function safeAdd(x, y) {
21
+ const lsw = (x & 65535) + (y & 65535);
22
+ return (x >> 16) + (y >> 16) + (lsw >> 16) << 16 | lsw & 65535;
23
+ }
24
+ function bitRotateLeft(num, cnt) {
25
+ return num << cnt | num >>> 32 - cnt;
26
+ }
27
+ function md5cmn(q, a2, b2, x, s, t) {
28
+ return safeAdd(bitRotateLeft(safeAdd(safeAdd(a2, q), safeAdd(x, t)), s), b2);
29
+ }
30
+ function md5ff(a2, b2, c2, d2, x, s, t) {
31
+ return md5cmn(b2 & c2 | ~b2 & d2, a2, b2, x, s, t);
32
+ }
33
+ function md5gg(a2, b2, c2, d2, x, s, t) {
34
+ return md5cmn(b2 & d2 | c2 & ~d2, a2, b2, x, s, t);
35
+ }
36
+ function md5hh(a2, b2, c2, d2, x, s, t) {
37
+ return md5cmn(b2 ^ c2 ^ d2, a2, b2, x, s, t);
38
+ }
39
+ function md5ii(a2, b2, c2, d2, x, s, t) {
40
+ return md5cmn(c2 ^ (b2 | ~d2), a2, b2, x, s, t);
41
+ }
42
+ const bytes = [];
43
+ for (let i = 0; i < str.length; i++) {
44
+ const code = str.charCodeAt(i);
45
+ if (code < 128) bytes.push(code);
46
+ else if (code < 2048) {
47
+ bytes.push(192 | code >> 6);
48
+ bytes.push(128 | code & 63);
49
+ } else {
50
+ bytes.push(224 | code >> 12);
51
+ bytes.push(128 | code >> 6 & 63);
52
+ bytes.push(128 | code & 63);
53
+ }
54
+ }
55
+ const bitLen = bytes.length * 8;
56
+ bytes.push(128);
57
+ while (bytes.length % 64 !== 56) bytes.push(0);
58
+ bytes.push(bitLen & 255, bitLen >> 8 & 255, bitLen >> 16 & 255, bitLen >> 24 & 255, 0, 0, 0, 0);
59
+ let a = 1732584193, b = -271733879, c = -1732584194, d = 271733878;
60
+ for (let i = 0; i < bytes.length; i += 64) {
61
+ const m = [];
62
+ for (let j = 0; j < 16; j++) m[j] = bytes[i + j * 4] | bytes[i + j * 4 + 1] << 8 | bytes[i + j * 4 + 2] << 16 | bytes[i + j * 4 + 3] << 24;
63
+ let aa = a, bb = b, cc = c, dd = d;
64
+ a = md5ff(a, b, c, d, m[0], 7, -680876936);
65
+ d = md5ff(d, a, b, c, m[1], 12, -389564586);
66
+ c = md5ff(c, d, a, b, m[2], 17, 606105819);
67
+ b = md5ff(b, c, d, a, m[3], 22, -1044525330);
68
+ a = md5ff(a, b, c, d, m[4], 7, -176418897);
69
+ d = md5ff(d, a, b, c, m[5], 12, 1200080426);
70
+ c = md5ff(c, d, a, b, m[6], 17, -1473231341);
71
+ b = md5ff(b, c, d, a, m[7], 22, -45705983);
72
+ a = md5ff(a, b, c, d, m[8], 7, 1770035416);
73
+ d = md5ff(d, a, b, c, m[9], 12, -1958414417);
74
+ c = md5ff(c, d, a, b, m[10], 17, -42063);
75
+ b = md5ff(b, c, d, a, m[11], 22, -1990404162);
76
+ a = md5ff(a, b, c, d, m[12], 7, 1804603682);
77
+ d = md5ff(d, a, b, c, m[13], 12, -40341101);
78
+ c = md5ff(c, d, a, b, m[14], 17, -1502002290);
79
+ b = md5ff(b, c, d, a, m[15], 22, 1236535329);
80
+ a = md5gg(a, b, c, d, m[1], 5, -165796510);
81
+ d = md5gg(d, a, b, c, m[6], 9, -1069501632);
82
+ c = md5gg(c, d, a, b, m[11], 14, 643717713);
83
+ b = md5gg(b, c, d, a, m[0], 20, -373897302);
84
+ a = md5gg(a, b, c, d, m[5], 5, -701558691);
85
+ d = md5gg(d, a, b, c, m[10], 9, 38016083);
86
+ c = md5gg(c, d, a, b, m[15], 14, -660478335);
87
+ b = md5gg(b, c, d, a, m[4], 20, -405537848);
88
+ a = md5gg(a, b, c, d, m[9], 5, 568446438);
89
+ d = md5gg(d, a, b, c, m[14], 9, -1019803690);
90
+ c = md5gg(c, d, a, b, m[3], 14, -187363961);
91
+ b = md5gg(b, c, d, a, m[8], 20, 1163531501);
92
+ a = md5gg(a, b, c, d, m[13], 5, -1444681467);
93
+ d = md5gg(d, a, b, c, m[2], 9, -51403784);
94
+ c = md5gg(c, d, a, b, m[7], 14, 1735328473);
95
+ b = md5gg(b, c, d, a, m[12], 20, -1926607734);
96
+ a = md5hh(a, b, c, d, m[5], 4, -378558);
97
+ d = md5hh(d, a, b, c, m[8], 11, -2022574463);
98
+ c = md5hh(c, d, a, b, m[11], 16, 1839030562);
99
+ b = md5hh(b, c, d, a, m[14], 23, -35309556);
100
+ a = md5hh(a, b, c, d, m[1], 4, -1530992060);
101
+ d = md5hh(d, a, b, c, m[4], 11, 1272893353);
102
+ c = md5hh(c, d, a, b, m[7], 16, -155497632);
103
+ b = md5hh(b, c, d, a, m[10], 23, -1094730640);
104
+ a = md5hh(a, b, c, d, m[13], 4, 681279174);
105
+ d = md5hh(d, a, b, c, m[0], 11, -358537222);
106
+ c = md5hh(c, d, a, b, m[3], 16, -722521979);
107
+ b = md5hh(b, c, d, a, m[6], 23, 76029189);
108
+ a = md5hh(a, b, c, d, m[9], 4, -640364487);
109
+ d = md5hh(d, a, b, c, m[12], 11, -421815835);
110
+ c = md5hh(c, d, a, b, m[15], 16, 530742520);
111
+ b = md5hh(b, c, d, a, m[2], 23, -995338651);
112
+ a = md5ii(a, b, c, d, m[0], 6, -198630844);
113
+ d = md5ii(d, a, b, c, m[7], 10, 1126891415);
114
+ c = md5ii(c, d, a, b, m[14], 15, -1416354905);
115
+ b = md5ii(b, c, d, a, m[5], 21, -57434055);
116
+ a = md5ii(a, b, c, d, m[12], 6, 1700485571);
117
+ d = md5ii(d, a, b, c, m[3], 10, -1894986606);
118
+ c = md5ii(c, d, a, b, m[10], 15, -1051523);
119
+ b = md5ii(b, c, d, a, m[1], 21, -2054922799);
120
+ a = md5ii(a, b, c, d, m[8], 6, 1873313359);
121
+ d = md5ii(d, a, b, c, m[15], 10, -30611744);
122
+ c = md5ii(c, d, a, b, m[6], 15, -1560198380);
123
+ b = md5ii(b, c, d, a, m[13], 21, 1309151649);
124
+ a = md5ii(a, b, c, d, m[4], 6, -145523070);
125
+ d = md5ii(d, a, b, c, m[11], 10, -1120210379);
126
+ c = md5ii(c, d, a, b, m[2], 15, 718787259);
127
+ b = md5ii(b, c, d, a, m[9], 21, -343485551);
128
+ a = safeAdd(a, aa);
129
+ b = safeAdd(b, bb);
130
+ c = safeAdd(c, cc);
131
+ d = safeAdd(d, dd);
132
+ }
133
+ return [a, b, c, d].map((v) => {
134
+ let s = "";
135
+ for (let i = 0; i < 4; i++) s += (v >> i * 8 & 255).toString(16).padStart(2, "0");
136
+ return s;
137
+ }).join("");
138
+ }
139
+ async function computeHash(algo, text) {
140
+ if (algo === "MD5") return md5(text);
141
+ const encoder = new TextEncoder();
142
+ const data = encoder.encode(text);
143
+ const hashBuffer = await crypto.subtle.digest(algo, data);
144
+ return Array.from(new Uint8Array(hashBuffer)).map((b) => b.toString(16).padStart(2, "0")).join("");
145
+ }
146
+ watch(input, async (val) => {
147
+ if (!val) {
148
+ results.value = {};
149
+ return;
150
+ }
151
+ const r = {};
152
+ for (const algo of algorithms) {
153
+ r[algo] = await computeHash(algo, val);
154
+ }
155
+ results.value = r;
156
+ }, { immediate: true });
157
+ async function copy(text, field) {
158
+ await navigator.clipboard.writeText(text);
159
+ copyField.value = field;
160
+ setTimeout(() => {
161
+ copyField.value = "";
162
+ }, 1200);
163
+ }
164
+ return (_ctx, _cache) => {
165
+ return openBlock(), createElementBlock("div", _hoisted_1, [
166
+ createElementVNode("div", _hoisted_2, [
167
+ _cache[1] || (_cache[1] = createElementVNode(
168
+ "div",
169
+ { class: "flex items-center gap-2 mb-3" },
170
+ [
171
+ createElementVNode("span", { class: "material-icons text-primary text-lg" }, "tag"),
172
+ createElementVNode("span", { class: "text-sm font-bold text-gray-400 uppercase tracking-wider" }, "输入文本")
173
+ ],
174
+ -1
175
+ /* CACHED */
176
+ )),
177
+ withDirectives(createElementVNode(
178
+ "textarea",
179
+ {
180
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => input.value = $event),
181
+ rows: "4",
182
+ placeholder: "输入要计算哈希的文本...",
183
+ class: "w-full bg-bg-dark text-gray-100 border-4 border-black rounded-lg px-4 py-3 font-mono text-sm shadow-hard focus:border-primary focus:shadow-none focus:translate-x-[4px] focus:translate-y-[4px] transition-all outline-none placeholder-gray-600 resize-none"
184
+ },
185
+ null,
186
+ 512
187
+ /* NEED_PATCH */
188
+ ), [
189
+ [vModelText, input.value]
190
+ ])
191
+ ]),
192
+ Object.keys(results.value).length ? (openBlock(), createElementBlock("div", _hoisted_3, [
193
+ (openBlock(), createElementBlock(
194
+ Fragment,
195
+ null,
196
+ renderList(algorithms, (algo) => {
197
+ return createElementVNode("div", {
198
+ key: algo,
199
+ class: "bg-deep-charcoal border-4 border-black rounded-xl p-4 shadow-hard cursor-pointer hover:border-primary transition-all group",
200
+ onClick: ($event) => copy(results.value[algo], algo)
201
+ }, [
202
+ createElementVNode("div", _hoisted_5, [
203
+ createElementVNode(
204
+ "span",
205
+ _hoisted_6,
206
+ toDisplayString(algo),
207
+ 1
208
+ /* TEXT */
209
+ ),
210
+ createElementVNode(
211
+ "span",
212
+ {
213
+ class: normalizeClass(["material-icons text-sm opacity-0 group-hover:opacity-100 transition-opacity", copyField.value === algo ? "text-neon-green" : "text-gray-500"])
214
+ },
215
+ toDisplayString(copyField.value === algo ? "check" : "content_copy"),
216
+ 3
217
+ /* TEXT, CLASS */
218
+ )
219
+ ]),
220
+ createElementVNode(
221
+ "div",
222
+ _hoisted_7,
223
+ toDisplayString(results.value[algo]),
224
+ 1
225
+ /* TEXT */
226
+ )
227
+ ], 8, _hoisted_4);
228
+ }),
229
+ 64
230
+ /* STABLE_FRAGMENT */
231
+ ))
232
+ ])) : createCommentVNode("v-if", true)
233
+ ]);
234
+ };
235
+ }
236
+ });
237
+ export {
238
+ _sfc_main as default
239
+ };
@@ -0,0 +1,187 @@
1
+ import { defineComponent, ref, openBlock, createElementBlock, createElementVNode, Fragment, renderList, normalizeClass, toDisplayString, withDirectives, vModelText, createTextVNode, createCommentVNode } from "vue";
2
+ const _hoisted_1 = { class: "flex flex-col h-full gap-5" };
3
+ const _hoisted_2 = { class: "bg-deep-charcoal border-4 border-black rounded-xl p-4 shadow-hard" };
4
+ const _hoisted_3 = { class: "flex items-center justify-between mb-3" };
5
+ const _hoisted_4 = { class: "flex gap-2" };
6
+ const _hoisted_5 = ["onClick"];
7
+ const _hoisted_6 = ["placeholder"];
8
+ const _hoisted_7 = { class: "flex-1 bg-deep-charcoal border-4 border-black rounded-xl p-4 shadow-hard" };
9
+ const _hoisted_8 = { class: "flex items-center justify-between mb-3" };
10
+ const _hoisted_9 = { class: "flex items-center gap-2" };
11
+ const _hoisted_10 = { class: "text-sm font-bold text-gray-400 uppercase tracking-wider" };
12
+ const _hoisted_11 = { class: "material-icons text-sm" };
13
+ const _hoisted_12 = { class: "font-mono text-sm text-gray-100 break-all select-all min-h-[80px] bg-bg-dark rounded-lg p-3 border-2 border-black whitespace-pre-wrap" };
14
+ const _sfc_main = /* @__PURE__ */ defineComponent({
15
+ __name: "index",
16
+ setup(__props) {
17
+ const input = ref("");
18
+ const output = ref("");
19
+ const mode = ref("encode");
20
+ const copyField = ref("");
21
+ function htmlEncode(str) {
22
+ const map = {
23
+ "&": "&amp;",
24
+ "<": "&lt;",
25
+ ">": "&gt;",
26
+ '"': "&quot;",
27
+ "'": "&#39;",
28
+ "©": "&copy;",
29
+ "®": "&reg;",
30
+ "™": "&trade;",
31
+ "€": "&euro;",
32
+ "£": "&pound;",
33
+ "¥": "&yen;",
34
+ "°": "&deg;",
35
+ "±": "&plusmn;",
36
+ "×": "&times;",
37
+ "÷": "&divide;",
38
+ "←": "&larr;",
39
+ "→": "&rarr;",
40
+ "↑": "&uarr;",
41
+ "↓": "&darr;",
42
+ "♠": "&spades;",
43
+ "♣": "&clubs;",
44
+ "♥": "&hearts;",
45
+ "♦": "&diams;"
46
+ };
47
+ return str.replace(/[&<>"'©®™€£¥°±×÷←→↑↓♠♣♥♦]/g, (c) => map[c] || c).replace(/[^\x20-\x7E\n\r\t]/g, (c) => `&#${c.charCodeAt(0)};`);
48
+ }
49
+ function htmlDecode(str) {
50
+ const el = document.createElement("textarea");
51
+ el.innerHTML = str;
52
+ return el.value;
53
+ }
54
+ function convert() {
55
+ if (!input.value) {
56
+ output.value = "";
57
+ return;
58
+ }
59
+ output.value = mode.value === "encode" ? htmlEncode(input.value) : htmlDecode(input.value);
60
+ }
61
+ function swap() {
62
+ input.value = output.value || "";
63
+ output.value = "";
64
+ mode.value = mode.value === "encode" ? "decode" : "encode";
65
+ convert();
66
+ }
67
+ async function copy(text, field) {
68
+ await navigator.clipboard.writeText(text);
69
+ copyField.value = field;
70
+ setTimeout(() => {
71
+ copyField.value = "";
72
+ }, 1200);
73
+ }
74
+ return (_ctx, _cache) => {
75
+ return openBlock(), createElementBlock("div", _hoisted_1, [
76
+ createElementVNode("div", _hoisted_2, [
77
+ createElementVNode("div", _hoisted_3, [
78
+ _cache[2] || (_cache[2] = createElementVNode(
79
+ "div",
80
+ { class: "flex items-center gap-2" },
81
+ [
82
+ createElementVNode("span", { class: "material-icons text-primary text-lg" }, "code"),
83
+ createElementVNode("span", { class: "text-sm font-bold text-gray-400 uppercase tracking-wider" }, "HTML 实体编解码")
84
+ ],
85
+ -1
86
+ /* CACHED */
87
+ )),
88
+ createElementVNode("div", _hoisted_4, [
89
+ (openBlock(), createElementBlock(
90
+ Fragment,
91
+ null,
92
+ renderList(["encode", "decode"], (m) => {
93
+ return createElementVNode("button", {
94
+ key: m,
95
+ onClick: ($event) => {
96
+ mode.value = m;
97
+ convert();
98
+ },
99
+ class: normalizeClass(["h-8 px-3 font-bold border-2 border-black rounded text-xs transition-all", mode.value === m ? "bg-primary text-black shadow-none translate-x-0.5 translate-y-0.5" : "bg-bg-dark text-gray-400 shadow-hard-sm hover:shadow-none hover:translate-x-0.5 hover:translate-y-0.5"])
100
+ }, toDisplayString(m === "encode" ? "编码" : "解码"), 11, _hoisted_5);
101
+ }),
102
+ 64
103
+ /* STABLE_FRAGMENT */
104
+ ))
105
+ ])
106
+ ]),
107
+ withDirectives(createElementVNode("textarea", {
108
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => input.value = $event),
109
+ onInput: convert,
110
+ rows: "5",
111
+ placeholder: mode.value === "encode" ? "输入 HTML 文本..." : "输入 HTML 实体...",
112
+ class: "w-full bg-bg-dark text-gray-100 border-4 border-black rounded-lg px-4 py-3 font-mono text-sm shadow-hard focus:border-primary focus:shadow-none focus:translate-x-[4px] focus:translate-y-[4px] transition-all outline-none placeholder-gray-600 resize-none"
113
+ }, null, 40, _hoisted_6), [
114
+ [vModelText, input.value]
115
+ ])
116
+ ]),
117
+ createElementVNode("div", { class: "flex justify-center" }, [
118
+ createElementVNode("button", {
119
+ onClick: swap,
120
+ class: "h-10 px-4 bg-bg-dark text-gray-400 font-bold border-2 border-black rounded shadow-hard-sm hover:shadow-none hover:translate-x-0.5 hover:translate-y-0.5 transition-all text-sm flex items-center gap-2"
121
+ }, [..._cache[3] || (_cache[3] = [
122
+ createElementVNode(
123
+ "span",
124
+ { class: "material-icons text-lg" },
125
+ "swap_vert",
126
+ -1
127
+ /* CACHED */
128
+ ),
129
+ createTextVNode(
130
+ " 交换 ",
131
+ -1
132
+ /* CACHED */
133
+ )
134
+ ])])
135
+ ]),
136
+ createElementVNode("div", _hoisted_7, [
137
+ createElementVNode("div", _hoisted_8, [
138
+ createElementVNode("div", _hoisted_9, [
139
+ _cache[4] || (_cache[4] = createElementVNode(
140
+ "span",
141
+ { class: "material-icons text-neon-green text-lg" },
142
+ "output",
143
+ -1
144
+ /* CACHED */
145
+ )),
146
+ createElementVNode(
147
+ "span",
148
+ _hoisted_10,
149
+ toDisplayString(mode.value === "encode" ? "编码结果" : "解码结果"),
150
+ 1
151
+ /* TEXT */
152
+ )
153
+ ]),
154
+ output.value ? (openBlock(), createElementBlock("button", {
155
+ key: 0,
156
+ onClick: _cache[1] || (_cache[1] = ($event) => copy(output.value, "output")),
157
+ class: "flex items-center gap-1 text-xs text-gray-500 hover:text-primary transition-colors"
158
+ }, [
159
+ createElementVNode(
160
+ "span",
161
+ _hoisted_11,
162
+ toDisplayString(copyField.value === "output" ? "check" : "content_copy"),
163
+ 1
164
+ /* TEXT */
165
+ ),
166
+ createTextVNode(
167
+ " " + toDisplayString(copyField.value === "output" ? "已复制" : "复制"),
168
+ 1
169
+ /* TEXT */
170
+ )
171
+ ])) : createCommentVNode("v-if", true)
172
+ ]),
173
+ createElementVNode(
174
+ "div",
175
+ _hoisted_12,
176
+ toDisplayString(output.value),
177
+ 1
178
+ /* TEXT */
179
+ )
180
+ ])
181
+ ]);
182
+ };
183
+ }
184
+ });
185
+ export {
186
+ _sfc_main as default
187
+ };