@eternalheart/vue-file-preview 1.3.5 → 1.3.7
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/lib/FilePreviewContent.vue.d.ts +3 -1
- package/lib/FilePreviewContent.vue.d.ts.map +1 -1
- package/lib/FilePreviewEmbed.vue.d.ts +3 -1
- package/lib/FilePreviewEmbed.vue.d.ts.map +1 -1
- package/lib/FilePreviewModal.vue.d.ts +3 -1
- package/lib/FilePreviewModal.vue.d.ts.map +1 -1
- package/lib/chunks/index-BI0dSTSM.mjs +77 -0
- package/lib/chunks/index-BI0dSTSM.mjs.map +1 -0
- package/lib/chunks/index-BW61ZRev.mjs +111 -0
- package/lib/chunks/index-BW61ZRev.mjs.map +1 -0
- package/lib/chunks/index-C8ZF84WX.mjs +113 -0
- package/lib/chunks/index-C8ZF84WX.mjs.map +1 -0
- package/lib/chunks/index-CB0zCxJb.mjs +353 -0
- package/lib/chunks/index-CB0zCxJb.mjs.map +1 -0
- package/lib/chunks/index-CBCQs1ZC.mjs +116 -0
- package/lib/chunks/index-CBCQs1ZC.mjs.map +1 -0
- package/lib/chunks/index-CbKSdAt_.mjs +391 -0
- package/lib/chunks/index-CbKSdAt_.mjs.map +1 -0
- package/lib/chunks/index-CcJ5NmY1.mjs +152 -0
- package/lib/chunks/index-CcJ5NmY1.mjs.map +1 -0
- package/lib/chunks/index-ClxBxmPR.mjs +249 -0
- package/lib/chunks/index-ClxBxmPR.mjs.map +1 -0
- package/lib/chunks/index-D9lByoJw.mjs +111 -0
- package/lib/chunks/index-D9lByoJw.mjs.map +1 -0
- package/lib/chunks/index-DTLDLOGO.mjs +129 -0
- package/lib/chunks/index-DTLDLOGO.mjs.map +1 -0
- package/lib/chunks/index-DUUsS_T4.mjs +134 -0
- package/lib/chunks/index-DUUsS_T4.mjs.map +1 -0
- package/lib/chunks/index-Doy0FvQW.mjs +136 -0
- package/lib/chunks/index-Doy0FvQW.mjs.map +1 -0
- package/lib/chunks/index-DpAxU2JM.mjs +2017 -0
- package/lib/chunks/index-DpAxU2JM.mjs.map +1 -0
- package/lib/chunks/index-DsznjwsH.mjs +103 -0
- package/lib/chunks/index-DsznjwsH.mjs.map +1 -0
- package/lib/chunks/index-SAfVQyNJ.mjs +281 -0
- package/lib/chunks/index-SAfVQyNJ.mjs.map +1 -0
- package/lib/chunks/index-S_kGRh6H.mjs +203 -0
- package/lib/chunks/index-S_kGRh6H.mjs.map +1 -0
- package/lib/chunks/index-kBPb_OKm.mjs +139 -0
- package/lib/chunks/index-kBPb_OKm.mjs.map +1 -0
- package/lib/chunks/index-yMb1JUC4.mjs +84 -0
- package/lib/chunks/index-yMb1JUC4.mjs.map +1 -0
- package/lib/composables/useResolvedTheme.d.ts +15 -0
- package/lib/composables/useResolvedTheme.d.ts.map +1 -0
- package/lib/index.cjs +24 -499
- package/lib/index.cjs.map +1 -1
- package/lib/index.css +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.mjs +12 -44583
- package/lib/index.mjs.map +1 -1
- package/lib/renderers/Audio/index.vue.d.ts.map +1 -1
- package/lib/renderers/Csv/index.vue.d.ts.map +1 -1
- package/lib/renderers/Json/index.vue.d.ts.map +1 -1
- package/lib/renderers/Markdown/index.vue.d.ts.map +1 -1
- package/lib/renderers/Pptx/index.vue.d.ts.map +1 -1
- package/lib/renderers/RendererLoading.vue.d.ts +3 -0
- package/lib/renderers/RendererLoading.vue.d.ts.map +1 -0
- package/lib/renderers/Text/index.vue.d.ts.map +1 -1
- package/lib/renderers/Video/index.vue.d.ts.map +1 -1
- package/lib/renderers/Xlsx/index.vue.d.ts.map +1 -1
- package/lib/renderers/Xml/index.vue.d.ts.map +1 -1
- package/lib/renderers/Zip/index.vue.d.ts.map +1 -1
- package/lib/renderers/lazy.d.ts +19 -0
- package/lib/renderers/lazy.d.ts.map +1 -0
- package/lib/renderers/toolbar.types.d.ts.map +1 -1
- package/lib/types.d.ts +27 -4
- package/lib/types.d.ts.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
import { defineComponent as K, ref as T, watch as W, computed as l, openBlock as n, createElementBlock as o, createElementVNode as e, toDisplayString as i, unref as c, createVNode as u, createCommentVNode as r, normalizeStyle as J, Fragment as O, renderList as Q, createTextVNode as X, normalizeClass as Y } from "vue";
|
|
2
|
+
import Z from "@kenjiuno/msgreader";
|
|
3
|
+
import { User as ss, Users as x, Calendar as j, Clock as A, Tag as R, Mail as es, Paperclip as ts, Hash as as } from "lucide-vue-next";
|
|
4
|
+
import { u as ns, _ as os } from "./index-DpAxU2JM.mjs";
|
|
5
|
+
const ls = {
|
|
6
|
+
key: 0,
|
|
7
|
+
class: "vfp-flex vfp-items-center vfp-justify-center vfp-w-full vfp-h-full"
|
|
8
|
+
}, is = {
|
|
9
|
+
key: 1,
|
|
10
|
+
class: "vfp-flex vfp-items-center vfp-justify-center vfp-w-full vfp-h-full"
|
|
11
|
+
}, cs = { class: "vfp-text-fg-secondary vfp-text-center" }, rs = { class: "vfp-text-lg" }, ds = {
|
|
12
|
+
key: 2,
|
|
13
|
+
class: "vfp-w-full vfp-h-full vfp-overflow-auto",
|
|
14
|
+
style: { background: "white" }
|
|
15
|
+
}, us = { class: "msg-container" }, ms = { class: "msg-header" }, vs = { class: "msg-subject" }, ps = { class: "msg-meta" }, gs = {
|
|
16
|
+
key: 0,
|
|
17
|
+
class: "msg-row"
|
|
18
|
+
}, _s = { class: "msg-icon-wrap" }, fs = { class: "msg-row-content" }, hs = { class: "msg-value" }, ws = {
|
|
19
|
+
key: 1,
|
|
20
|
+
class: "msg-row"
|
|
21
|
+
}, ys = { class: "msg-icon-wrap" }, bs = { class: "msg-row-content" }, Ms = { class: "msg-value" }, ks = {
|
|
22
|
+
key: 2,
|
|
23
|
+
class: "msg-row"
|
|
24
|
+
}, Ss = { class: "msg-icon-wrap" }, Is = { class: "msg-row-content" }, Ts = { class: "msg-value" }, xs = {
|
|
25
|
+
key: 3,
|
|
26
|
+
class: "msg-row"
|
|
27
|
+
}, Ns = { class: "msg-icon-wrap" }, zs = { class: "msg-row-content" }, Cs = { class: "msg-value" }, Es = {
|
|
28
|
+
key: 4,
|
|
29
|
+
class: "msg-row"
|
|
30
|
+
}, Ps = { class: "msg-icon-wrap" }, Ds = { class: "msg-row-content" }, Bs = { class: "msg-value" }, Hs = {
|
|
31
|
+
key: 5,
|
|
32
|
+
class: "msg-row"
|
|
33
|
+
}, Ls = { class: "msg-icon-wrap" }, $s = { class: "msg-row-content" }, js = { class: "msg-value" }, As = {
|
|
34
|
+
key: 6,
|
|
35
|
+
class: "msg-row"
|
|
36
|
+
}, Rs = { class: "msg-icon-wrap" }, Fs = { class: "msg-row-content" }, Vs = { class: "msg-value" }, qs = {
|
|
37
|
+
key: 7,
|
|
38
|
+
class: "msg-row"
|
|
39
|
+
}, Us = { class: "msg-icon-wrap" }, Gs = { class: "msg-row-content" }, Ks = {
|
|
40
|
+
key: 8,
|
|
41
|
+
class: "msg-row"
|
|
42
|
+
}, Ws = { class: "msg-icon-wrap" }, Js = { class: "msg-row-content" }, Os = { class: "msg-value" }, Qs = {
|
|
43
|
+
key: 9,
|
|
44
|
+
class: "msg-row"
|
|
45
|
+
}, Xs = { class: "msg-icon-wrap" }, Ys = { class: "msg-row-content" }, Zs = { class: "msg-value" }, se = {
|
|
46
|
+
key: 10,
|
|
47
|
+
class: "msg-row msg-row-bordered"
|
|
48
|
+
}, ee = { class: "msg-icon-wrap" }, te = { class: "msg-row-content" }, ae = { class: "msg-value msg-attachments" }, ne = {
|
|
49
|
+
key: 0,
|
|
50
|
+
class: "msg-attachment-size"
|
|
51
|
+
}, oe = { class: "msg-icon-wrap" }, le = { class: "msg-row-content" }, ie = { class: "msg-value msg-id" }, ce = {
|
|
52
|
+
key: 12,
|
|
53
|
+
class: "msg-row"
|
|
54
|
+
}, re = { class: "msg-icon-wrap" }, de = { class: "msg-row-content" }, ue = { class: "msg-value msg-id" }, me = ["innerHTML"], ve = /* @__PURE__ */ K({
|
|
55
|
+
__name: "index",
|
|
56
|
+
props: {
|
|
57
|
+
url: {}
|
|
58
|
+
},
|
|
59
|
+
setup(F) {
|
|
60
|
+
const N = F, { t: w } = ns(), y = T(!0), g = T(null), a = T(null);
|
|
61
|
+
function b(s, t) {
|
|
62
|
+
return s ? s.filter((d) => d.recipType === t).map((d) => {
|
|
63
|
+
const m = d.name || "", h = d.smtpAddress || d.email || "";
|
|
64
|
+
return m && h && m !== h ? `${m} <${h}>` : m || h;
|
|
65
|
+
}).filter(Boolean).join("; ") : "";
|
|
66
|
+
}
|
|
67
|
+
function _(s) {
|
|
68
|
+
if (!s) return "";
|
|
69
|
+
try {
|
|
70
|
+
const t = new Date(s);
|
|
71
|
+
return isNaN(t.getTime()) ? s : t.toLocaleString();
|
|
72
|
+
} catch {
|
|
73
|
+
return s;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
function V(s, t) {
|
|
77
|
+
if (s.bodyHtml) return s.bodyHtml;
|
|
78
|
+
if (s.html)
|
|
79
|
+
try {
|
|
80
|
+
return new TextDecoder("utf-8").decode(s.html);
|
|
81
|
+
} catch {
|
|
82
|
+
}
|
|
83
|
+
return s.body ? `<pre style="white-space: pre-wrap; word-wrap: break-word; font-family: system-ui, sans-serif;">${s.body.replace(/&/g, "&").replace(/\x3c/g, "<").replace(/>/g, ">")}</pre>` : `<p style="color: #999;">${t}</p>`;
|
|
84
|
+
}
|
|
85
|
+
function q(s) {
|
|
86
|
+
return s ? {
|
|
87
|
+
"IPM.Note": "Email",
|
|
88
|
+
"IPM.Note.SMIME": "Encrypted Email",
|
|
89
|
+
"IPM.Note.SMIME.MultipartSigned": "Signed Email",
|
|
90
|
+
"IPM.Appointment": "Appointment",
|
|
91
|
+
"IPM.Schedule.Meeting.Request": "Meeting Request",
|
|
92
|
+
"IPM.Schedule.Meeting.Canceled": "Meeting Cancellation",
|
|
93
|
+
"IPM.Contact": "Contact",
|
|
94
|
+
"IPM.Task": "Task",
|
|
95
|
+
"IPM.StickyNote": "Sticky Note"
|
|
96
|
+
}[s] || s : "";
|
|
97
|
+
}
|
|
98
|
+
W(() => N.url, async () => {
|
|
99
|
+
y.value = !0, g.value = null, a.value = null;
|
|
100
|
+
try {
|
|
101
|
+
const s = await fetch(N.url);
|
|
102
|
+
if (!s.ok) throw new Error("文件加载失败");
|
|
103
|
+
const t = await s.arrayBuffer(), d = new Z(t);
|
|
104
|
+
a.value = d.getFileData();
|
|
105
|
+
} catch (s) {
|
|
106
|
+
console.error("MSG 解析错误:", s), g.value = w.value("msg.parse_failed");
|
|
107
|
+
} finally {
|
|
108
|
+
y.value = !1;
|
|
109
|
+
}
|
|
110
|
+
}, { immediate: !0 });
|
|
111
|
+
const U = l(() => {
|
|
112
|
+
var s;
|
|
113
|
+
return ((s = a.value) == null ? void 0 : s.subject) || "(无主题)";
|
|
114
|
+
}), z = l(() => {
|
|
115
|
+
if (!a.value) return "";
|
|
116
|
+
const s = a.value.senderName || "", t = a.value.senderSmtpAddress || a.value.senderEmail || "";
|
|
117
|
+
return s && t && s !== t ? `${s} <${t}>` : s || t;
|
|
118
|
+
}), C = l(() => {
|
|
119
|
+
var s;
|
|
120
|
+
return b((s = a.value) == null ? void 0 : s.recipients, "to");
|
|
121
|
+
}), E = l(() => {
|
|
122
|
+
var s;
|
|
123
|
+
return b((s = a.value) == null ? void 0 : s.recipients, "cc");
|
|
124
|
+
}), P = l(() => {
|
|
125
|
+
var s;
|
|
126
|
+
return b((s = a.value) == null ? void 0 : s.recipients, "bcc");
|
|
127
|
+
}), v = l(() => {
|
|
128
|
+
var s;
|
|
129
|
+
return _((s = a.value) == null ? void 0 : s.clientSubmitTime);
|
|
130
|
+
}), p = l(() => {
|
|
131
|
+
var s;
|
|
132
|
+
return _((s = a.value) == null ? void 0 : s.messageDeliveryTime);
|
|
133
|
+
}), D = l(() => {
|
|
134
|
+
var s;
|
|
135
|
+
return _((s = a.value) == null ? void 0 : s.creationTime);
|
|
136
|
+
}), f = l(() => {
|
|
137
|
+
var s;
|
|
138
|
+
return _((s = a.value) == null ? void 0 : s.lastModificationTime);
|
|
139
|
+
}), M = l(() => {
|
|
140
|
+
var s;
|
|
141
|
+
return (((s = a.value) == null ? void 0 : s.attachments) || []).filter((t) => !t.attachmentHidden);
|
|
142
|
+
}), G = l(() => a.value ? V(a.value, w.value("msg.empty_body")) : ""), k = l(() => {
|
|
143
|
+
var s;
|
|
144
|
+
return q((s = a.value) == null ? void 0 : s.messageClass);
|
|
145
|
+
}), B = l(() => {
|
|
146
|
+
var s;
|
|
147
|
+
return ((s = a.value) == null ? void 0 : s.messageId) || "";
|
|
148
|
+
}), S = l(() => {
|
|
149
|
+
const s = a.value;
|
|
150
|
+
return s && typeof s.importance == "number" ? s.importance : void 0;
|
|
151
|
+
}), H = l(() => S.value === 2 ? "High" : S.value === 0 ? "Low" : ""), I = l(() => {
|
|
152
|
+
const s = a.value;
|
|
153
|
+
return s && typeof s.sensitivity == "number" ? s.sensitivity : void 0;
|
|
154
|
+
}), L = l(() => I.value === void 0 || I.value === 0 ? "" : {
|
|
155
|
+
1: "Personal",
|
|
156
|
+
2: "Private",
|
|
157
|
+
3: "Confidential"
|
|
158
|
+
}[I.value] || ""), $ = (s) => s ? s > 1048576 ? `${(s / 1048576).toFixed(1)} MB` : s > 1024 ? `${(s / 1024).toFixed(0)} KB` : `${s} B` : "";
|
|
159
|
+
return (s, t) => y.value ? (n(), o("div", ls, [...t[0] || (t[0] = [
|
|
160
|
+
e("div", { class: "vfp-w-12 vfp-h-12 vfp-border-4 vfp-border-line-strong vfp-border-t-spinner-head vfp-rounded-full vfp-animate-spin" }, null, -1)
|
|
161
|
+
])])) : g.value || !a.value ? (n(), o("div", is, [
|
|
162
|
+
e("div", cs, [
|
|
163
|
+
e("p", rs, i(g.value || c(w)("msg.parse_failed_short")), 1)
|
|
164
|
+
])
|
|
165
|
+
])) : (n(), o("div", ds, [
|
|
166
|
+
e("div", us, [
|
|
167
|
+
e("div", ms, [
|
|
168
|
+
e("h2", vs, i(U.value), 1),
|
|
169
|
+
e("div", ps, [
|
|
170
|
+
z.value ? (n(), o("div", gs, [
|
|
171
|
+
e("span", _s, [
|
|
172
|
+
u(c(ss), {
|
|
173
|
+
size: 16,
|
|
174
|
+
class: "msg-icon"
|
|
175
|
+
})
|
|
176
|
+
]),
|
|
177
|
+
e("div", fs, [
|
|
178
|
+
t[1] || (t[1] = e("span", { class: "msg-label" }, "From", -1)),
|
|
179
|
+
e("span", hs, i(z.value), 1)
|
|
180
|
+
])
|
|
181
|
+
])) : r("", !0),
|
|
182
|
+
C.value ? (n(), o("div", ws, [
|
|
183
|
+
e("span", ys, [
|
|
184
|
+
u(c(x), {
|
|
185
|
+
size: 16,
|
|
186
|
+
class: "msg-icon"
|
|
187
|
+
})
|
|
188
|
+
]),
|
|
189
|
+
e("div", bs, [
|
|
190
|
+
t[2] || (t[2] = e("span", { class: "msg-label" }, "To", -1)),
|
|
191
|
+
e("span", Ms, i(C.value), 1)
|
|
192
|
+
])
|
|
193
|
+
])) : r("", !0),
|
|
194
|
+
E.value ? (n(), o("div", ks, [
|
|
195
|
+
e("span", Ss, [
|
|
196
|
+
u(c(x), {
|
|
197
|
+
size: 16,
|
|
198
|
+
class: "msg-icon"
|
|
199
|
+
})
|
|
200
|
+
]),
|
|
201
|
+
e("div", Is, [
|
|
202
|
+
t[3] || (t[3] = e("span", { class: "msg-label" }, "Cc", -1)),
|
|
203
|
+
e("span", Ts, i(E.value), 1)
|
|
204
|
+
])
|
|
205
|
+
])) : r("", !0),
|
|
206
|
+
P.value ? (n(), o("div", xs, [
|
|
207
|
+
e("span", Ns, [
|
|
208
|
+
u(c(x), {
|
|
209
|
+
size: 16,
|
|
210
|
+
class: "msg-icon"
|
|
211
|
+
})
|
|
212
|
+
]),
|
|
213
|
+
e("div", zs, [
|
|
214
|
+
t[4] || (t[4] = e("span", { class: "msg-label" }, "Bcc", -1)),
|
|
215
|
+
e("span", Cs, i(P.value), 1)
|
|
216
|
+
])
|
|
217
|
+
])) : r("", !0),
|
|
218
|
+
v.value ? (n(), o("div", Es, [
|
|
219
|
+
e("span", Ps, [
|
|
220
|
+
u(c(j), {
|
|
221
|
+
size: 16,
|
|
222
|
+
class: "msg-icon"
|
|
223
|
+
})
|
|
224
|
+
]),
|
|
225
|
+
e("div", Ds, [
|
|
226
|
+
t[5] || (t[5] = e("span", { class: "msg-label" }, "Sent", -1)),
|
|
227
|
+
e("span", Bs, i(v.value), 1)
|
|
228
|
+
])
|
|
229
|
+
])) : r("", !0),
|
|
230
|
+
p.value && p.value !== v.value ? (n(), o("div", Hs, [
|
|
231
|
+
e("span", Ls, [
|
|
232
|
+
u(c(A), {
|
|
233
|
+
size: 16,
|
|
234
|
+
class: "msg-icon"
|
|
235
|
+
})
|
|
236
|
+
]),
|
|
237
|
+
e("div", $s, [
|
|
238
|
+
t[6] || (t[6] = e("span", { class: "msg-label" }, "Received", -1)),
|
|
239
|
+
e("span", js, i(p.value), 1)
|
|
240
|
+
])
|
|
241
|
+
])) : r("", !0),
|
|
242
|
+
!v.value && !p.value && D.value ? (n(), o("div", As, [
|
|
243
|
+
e("span", Rs, [
|
|
244
|
+
u(c(j), {
|
|
245
|
+
size: 16,
|
|
246
|
+
class: "msg-icon"
|
|
247
|
+
})
|
|
248
|
+
]),
|
|
249
|
+
e("div", Fs, [
|
|
250
|
+
t[7] || (t[7] = e("span", { class: "msg-label" }, "Date", -1)),
|
|
251
|
+
e("span", Vs, i(D.value), 1)
|
|
252
|
+
])
|
|
253
|
+
])) : r("", !0),
|
|
254
|
+
H.value ? (n(), o("div", qs, [
|
|
255
|
+
e("span", Us, [
|
|
256
|
+
u(c(R), {
|
|
257
|
+
size: 16,
|
|
258
|
+
class: "msg-icon"
|
|
259
|
+
})
|
|
260
|
+
]),
|
|
261
|
+
e("div", Gs, [
|
|
262
|
+
t[8] || (t[8] = e("span", { class: "msg-label" }, "Importance", -1)),
|
|
263
|
+
e("span", {
|
|
264
|
+
class: "msg-value",
|
|
265
|
+
style: J({ color: S.value === 2 ? "#dc2626" : "#2563eb", fontWeight: 500 })
|
|
266
|
+
}, i(H.value), 5)
|
|
267
|
+
])
|
|
268
|
+
])) : r("", !0),
|
|
269
|
+
L.value ? (n(), o("div", Ks, [
|
|
270
|
+
e("span", Ws, [
|
|
271
|
+
u(c(R), {
|
|
272
|
+
size: 16,
|
|
273
|
+
class: "msg-icon"
|
|
274
|
+
})
|
|
275
|
+
]),
|
|
276
|
+
e("div", Js, [
|
|
277
|
+
t[9] || (t[9] = e("span", { class: "msg-label" }, "Sensitivity", -1)),
|
|
278
|
+
e("span", Os, i(L.value), 1)
|
|
279
|
+
])
|
|
280
|
+
])) : r("", !0),
|
|
281
|
+
k.value && k.value !== "Email" ? (n(), o("div", Qs, [
|
|
282
|
+
e("span", Xs, [
|
|
283
|
+
u(c(es), {
|
|
284
|
+
size: 16,
|
|
285
|
+
class: "msg-icon"
|
|
286
|
+
})
|
|
287
|
+
]),
|
|
288
|
+
e("div", Ys, [
|
|
289
|
+
t[10] || (t[10] = e("span", { class: "msg-label" }, "Type", -1)),
|
|
290
|
+
e("span", Zs, i(k.value), 1)
|
|
291
|
+
])
|
|
292
|
+
])) : r("", !0),
|
|
293
|
+
M.value.length > 0 ? (n(), o("div", se, [
|
|
294
|
+
e("span", ee, [
|
|
295
|
+
u(c(ts), {
|
|
296
|
+
size: 16,
|
|
297
|
+
class: "msg-icon"
|
|
298
|
+
})
|
|
299
|
+
]),
|
|
300
|
+
e("div", te, [
|
|
301
|
+
t[11] || (t[11] = e("span", { class: "msg-label" }, "Attachments", -1)),
|
|
302
|
+
e("div", ae, [
|
|
303
|
+
(n(!0), o(O, null, Q(M.value, (d, m) => (n(), o("span", {
|
|
304
|
+
key: m,
|
|
305
|
+
class: "msg-attachment"
|
|
306
|
+
}, [
|
|
307
|
+
X(i(d.fileName || d.name || "未知文件") + " ", 1),
|
|
308
|
+
$(d.contentLength) ? (n(), o("span", ne, " (" + i($(d.contentLength)) + ") ", 1)) : r("", !0)
|
|
309
|
+
]))), 128))
|
|
310
|
+
])
|
|
311
|
+
])
|
|
312
|
+
])) : r("", !0),
|
|
313
|
+
B.value ? (n(), o("div", {
|
|
314
|
+
key: 11,
|
|
315
|
+
class: Y(["msg-row", { "msg-row-bordered": M.value.length === 0 }])
|
|
316
|
+
}, [
|
|
317
|
+
e("span", oe, [
|
|
318
|
+
u(c(as), {
|
|
319
|
+
size: 16,
|
|
320
|
+
class: "msg-icon"
|
|
321
|
+
})
|
|
322
|
+
]),
|
|
323
|
+
e("div", le, [
|
|
324
|
+
t[12] || (t[12] = e("span", { class: "msg-label" }, "Message-ID", -1)),
|
|
325
|
+
e("span", ie, i(B.value), 1)
|
|
326
|
+
])
|
|
327
|
+
], 2)) : r("", !0),
|
|
328
|
+
f.value && f.value !== v.value && f.value !== p.value ? (n(), o("div", ce, [
|
|
329
|
+
e("span", re, [
|
|
330
|
+
u(c(A), {
|
|
331
|
+
size: 16,
|
|
332
|
+
class: "msg-icon"
|
|
333
|
+
})
|
|
334
|
+
]),
|
|
335
|
+
e("div", de, [
|
|
336
|
+
t[13] || (t[13] = e("span", { class: "msg-label" }, "Modified", -1)),
|
|
337
|
+
e("span", ue, i(f.value), 1)
|
|
338
|
+
])
|
|
339
|
+
])) : r("", !0)
|
|
340
|
+
])
|
|
341
|
+
]),
|
|
342
|
+
e("div", {
|
|
343
|
+
class: "msg-body",
|
|
344
|
+
innerHTML: G.value
|
|
345
|
+
}, null, 8, me)
|
|
346
|
+
])
|
|
347
|
+
]));
|
|
348
|
+
}
|
|
349
|
+
}), we = /* @__PURE__ */ os(ve, [["__scopeId", "data-v-3c910583"]]);
|
|
350
|
+
export {
|
|
351
|
+
we as default
|
|
352
|
+
};
|
|
353
|
+
//# sourceMappingURL=index-CB0zCxJb.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-CB0zCxJb.mjs","sources":["../../src/renderers/Msg/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, computed, watch } from 'vue';\nimport MsgReader from '@kenjiuno/msgreader';\nimport type { FieldsData } from '@kenjiuno/msgreader';\nimport { User, Users, Paperclip, Calendar, Mail, Tag, Clock, Hash } from 'lucide-vue-next';\nimport { useTranslator } from '../../composables/useTranslator';\n\nconst props = defineProps<{\n url: string;\n}>();\n\nconst { t } = useTranslator();\n\nconst loading = ref(true);\nconst error = ref<string | null>(null);\nconst fields = ref<FieldsData | null>(null);\n\nfunction formatRecipients(recipients: FieldsData[] | undefined, type: 'to' | 'cc' | 'bcc'): string {\n if (!recipients) return '';\n return recipients\n .filter((r) => r.recipType === type)\n .map((r) => {\n const name = r.name || '';\n const email = r.smtpAddress || r.email || '';\n if (name && email && name !== email) return `${name} <${email}>`;\n return name || email;\n })\n .filter(Boolean)\n .join('; ');\n}\n\nfunction formatDate(dateStr: string | undefined): string {\n if (!dateStr) return '';\n try {\n const date = new Date(dateStr);\n if (isNaN(date.getTime())) return dateStr;\n return date.toLocaleString();\n } catch {\n return dateStr;\n }\n}\n\nfunction decodeHtmlBody(f: FieldsData, emptyBodyText: string): string {\n if (f.bodyHtml) return f.bodyHtml;\n if (f.html) {\n try {\n const decoder = new TextDecoder('utf-8');\n return decoder.decode(f.html);\n } catch {\n // fallback\n }\n }\n if (f.body) {\n return `<pre style=\"white-space: pre-wrap; word-wrap: break-word; font-family: system-ui, sans-serif;\">${f.body\n .replace(/&/g, '&')\n .replace(/\\x3c/g, '<')\n .replace(/>/g, '>')}</pre>`;\n }\n return `<p style=\"color: #999;\">${emptyBodyText}</p>`;\n}\n\nfunction formatMessageClass(messageClass: string | undefined): string {\n if (!messageClass) return '';\n const classMap: Record<string, string> = {\n 'IPM.Note': 'Email',\n 'IPM.Note.SMIME': 'Encrypted Email',\n 'IPM.Note.SMIME.MultipartSigned': 'Signed Email',\n 'IPM.Appointment': 'Appointment',\n 'IPM.Schedule.Meeting.Request': 'Meeting Request',\n 'IPM.Schedule.Meeting.Canceled': 'Meeting Cancellation',\n 'IPM.Contact': 'Contact',\n 'IPM.Task': 'Task',\n 'IPM.StickyNote': 'Sticky Note',\n };\n return classMap[messageClass] || messageClass;\n}\n\nconst loadMsg = async () => {\n loading.value = true;\n error.value = null;\n fields.value = null;\n\n try {\n const response = await fetch(props.url);\n if (!response.ok) throw new Error('文件加载失败');\n const arrayBuffer = await response.arrayBuffer();\n const msgReader = new MsgReader(arrayBuffer);\n fields.value = msgReader.getFileData();\n } catch (err) {\n console.error('MSG 解析错误:', err);\n error.value = t.value('msg.parse_failed');\n } finally {\n loading.value = false;\n }\n};\n\nwatch(() => props.url, loadMsg, { immediate: true });\n\nconst subject = computed(() => fields.value?.subject || '(无主题)');\nconst sender = computed(() => {\n if (!fields.value) return '';\n const senderName = fields.value.senderName || '';\n const senderEmail = fields.value.senderSmtpAddress || fields.value.senderEmail || '';\n if (senderName && senderEmail && senderName !== senderEmail) {\n return `${senderName} <${senderEmail}>`;\n }\n return senderName || senderEmail;\n});\nconst toStr = computed(() => formatRecipients(fields.value?.recipients, 'to'));\nconst ccStr = computed(() => formatRecipients(fields.value?.recipients, 'cc'));\nconst bccStr = computed(() => formatRecipients(fields.value?.recipients, 'bcc'));\nconst sentDate = computed(() => formatDate(fields.value?.clientSubmitTime));\nconst receivedDate = computed(() => formatDate(fields.value?.messageDeliveryTime));\nconst createdDate = computed(() => formatDate(fields.value?.creationTime));\nconst lastModified = computed(() => formatDate(fields.value?.lastModificationTime));\nconst attachments = computed(() => (fields.value?.attachments || []).filter((a) => !a.attachmentHidden));\nconst bodyHtml = computed(() => (fields.value ? decodeHtmlBody(fields.value, t.value('msg.empty_body')) : ''));\nconst messageClass = computed(() => formatMessageClass(fields.value?.messageClass));\nconst messageId = computed(() => fields.value?.messageId || '');\n\nconst importance = computed(() => {\n const f = fields.value as (FieldsData & Record<string, unknown>) | null;\n return f && typeof f.importance === 'number' ? f.importance : undefined;\n});\nconst importanceLabel = computed(() => {\n if (importance.value === 2) return 'High';\n if (importance.value === 0) return 'Low';\n return '';\n});\n\nconst sensitivity = computed(() => {\n const f = fields.value as (FieldsData & Record<string, unknown>) | null;\n return f && typeof f.sensitivity === 'number' ? f.sensitivity : undefined;\n});\nconst sensitivityLabel = computed(() => {\n if (sensitivity.value === undefined || sensitivity.value === 0) return '';\n const labels: Record<number, string> = {\n 1: 'Personal',\n 2: 'Private',\n 3: 'Confidential',\n };\n return labels[sensitivity.value] || '';\n});\n\nconst formatAttachmentSize = (size: number | undefined) => {\n if (!size) return '';\n if (size > 1048576) return `${(size / 1048576).toFixed(1)} MB`;\n if (size > 1024) return `${(size / 1024).toFixed(0)} KB`;\n return `${size} B`;\n};\n</script>\n\n<template>\n <div v-if=\"loading\" class=\"vfp-flex vfp-items-center vfp-justify-center vfp-w-full vfp-h-full\">\n <div\n class=\"vfp-w-12 vfp-h-12 vfp-border-4 vfp-border-line-strong vfp-border-t-spinner-head vfp-rounded-full vfp-animate-spin\"\n />\n </div>\n\n <div v-else-if=\"error || !fields\" class=\"vfp-flex vfp-items-center vfp-justify-center vfp-w-full vfp-h-full\">\n <div class=\"vfp-text-fg-secondary vfp-text-center\">\n <p class=\"vfp-text-lg\">{{ error || t('msg.parse_failed_short') }}</p>\n </div>\n </div>\n\n <div v-else class=\"vfp-w-full vfp-h-full vfp-overflow-auto\" style=\"background: white\">\n <div class=\"msg-container\">\n <!-- 邮件头部 -->\n <div class=\"msg-header\">\n <h2 class=\"msg-subject\">{{ subject }}</h2>\n\n <div class=\"msg-meta\">\n <div v-if=\"sender\" class=\"msg-row\">\n <span class=\"msg-icon-wrap\"><User :size=\"16\" class=\"msg-icon\" /></span>\n <div class=\"msg-row-content\"><span class=\"msg-label\">From</span><span class=\"msg-value\">{{ sender }}</span></div>\n </div>\n\n <div v-if=\"toStr\" class=\"msg-row\">\n <span class=\"msg-icon-wrap\"><Users :size=\"16\" class=\"msg-icon\" /></span>\n <div class=\"msg-row-content\"><span class=\"msg-label\">To</span><span class=\"msg-value\">{{ toStr }}</span></div>\n </div>\n\n <div v-if=\"ccStr\" class=\"msg-row\">\n <span class=\"msg-icon-wrap\"><Users :size=\"16\" class=\"msg-icon\" /></span>\n <div class=\"msg-row-content\"><span class=\"msg-label\">Cc</span><span class=\"msg-value\">{{ ccStr }}</span></div>\n </div>\n\n <div v-if=\"bccStr\" class=\"msg-row\">\n <span class=\"msg-icon-wrap\"><Users :size=\"16\" class=\"msg-icon\" /></span>\n <div class=\"msg-row-content\"><span class=\"msg-label\">Bcc</span><span class=\"msg-value\">{{ bccStr }}</span></div>\n </div>\n\n <div v-if=\"sentDate\" class=\"msg-row\">\n <span class=\"msg-icon-wrap\"><Calendar :size=\"16\" class=\"msg-icon\" /></span>\n <div class=\"msg-row-content\"><span class=\"msg-label\">Sent</span><span class=\"msg-value\">{{ sentDate }}</span></div>\n </div>\n\n <div v-if=\"receivedDate && receivedDate !== sentDate\" class=\"msg-row\">\n <span class=\"msg-icon-wrap\"><Clock :size=\"16\" class=\"msg-icon\" /></span>\n <div class=\"msg-row-content\"><span class=\"msg-label\">Received</span><span class=\"msg-value\">{{ receivedDate }}</span></div>\n </div>\n\n <div v-if=\"!sentDate && !receivedDate && createdDate\" class=\"msg-row\">\n <span class=\"msg-icon-wrap\"><Calendar :size=\"16\" class=\"msg-icon\" /></span>\n <div class=\"msg-row-content\"><span class=\"msg-label\">Date</span><span class=\"msg-value\">{{ createdDate }}</span></div>\n </div>\n\n <div v-if=\"importanceLabel\" class=\"msg-row\">\n <span class=\"msg-icon-wrap\"><Tag :size=\"16\" class=\"msg-icon\" /></span>\n <div class=\"msg-row-content\">\n <span class=\"msg-label\">Importance</span>\n <span class=\"msg-value\" :style=\"{ color: importance === 2 ? '#dc2626' : '#2563eb', fontWeight: 500 }\">\n {{ importanceLabel }}\n </span>\n </div>\n </div>\n\n <div v-if=\"sensitivityLabel\" class=\"msg-row\">\n <span class=\"msg-icon-wrap\"><Tag :size=\"16\" class=\"msg-icon\" /></span>\n <div class=\"msg-row-content\"><span class=\"msg-label\">Sensitivity</span><span class=\"msg-value\">{{ sensitivityLabel }}</span></div>\n </div>\n\n <div v-if=\"messageClass && messageClass !== 'Email'\" class=\"msg-row\">\n <span class=\"msg-icon-wrap\"><Mail :size=\"16\" class=\"msg-icon\" /></span>\n <div class=\"msg-row-content\"><span class=\"msg-label\">Type</span><span class=\"msg-value\">{{ messageClass }}</span></div>\n </div>\n\n <div v-if=\"attachments.length > 0\" class=\"msg-row msg-row-bordered\">\n <span class=\"msg-icon-wrap\"><Paperclip :size=\"16\" class=\"msg-icon\" /></span>\n <div class=\"msg-row-content\">\n <span class=\"msg-label\">Attachments</span>\n <div class=\"msg-value msg-attachments\">\n <span v-for=\"(a, i) in attachments\" :key=\"i\" class=\"msg-attachment\">\n {{ a.fileName || a.name || '未知文件' }}\n <span v-if=\"formatAttachmentSize(a.contentLength)\" class=\"msg-attachment-size\">\n ({{ formatAttachmentSize(a.contentLength) }})\n </span>\n </span>\n </div>\n </div>\n </div>\n\n <div v-if=\"messageId\" class=\"msg-row\" :class=\"{ 'msg-row-bordered': attachments.length === 0 }\">\n <span class=\"msg-icon-wrap\"><Hash :size=\"16\" class=\"msg-icon\" /></span>\n <div class=\"msg-row-content\">\n <span class=\"msg-label\">Message-ID</span>\n <span class=\"msg-value msg-id\">{{ messageId }}</span>\n </div>\n </div>\n\n <div v-if=\"lastModified && lastModified !== sentDate && lastModified !== receivedDate\" class=\"msg-row\">\n <span class=\"msg-icon-wrap\"><Clock :size=\"16\" class=\"msg-icon\" /></span>\n <div class=\"msg-row-content\">\n <span class=\"msg-label\">Modified</span>\n <span class=\"msg-value msg-id\">{{ lastModified }}</span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- 邮件正文 -->\n <div class=\"msg-body\" v-html=\"bodyHtml\" />\n </div>\n </div>\n</template>\n\n<style scoped>\n.msg-container {\n width: 100%;\n background: white;\n min-height: 100%;\n}\n.msg-header {\n border-bottom: 1px solid #e5e7eb;\n padding: clamp(12px, 3vw, 24px) clamp(16px, 3vw, 28px);\n background: #f9fafb;\n}\n.msg-subject {\n margin: 0 0 16px 0;\n font-size: clamp(16px, 2.5vw, 20px);\n font-weight: 600;\n color: #111827;\n line-height: 1.4;\n}\n.msg-meta {\n display: flex;\n flex-direction: column;\n font-size: clamp(12px, 1.8vw, 14px);\n color: #4b5563;\n}\n.msg-row {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n padding: 6px 0;\n}\n.msg-row-bordered {\n border-top: 1px solid #e5e7eb;\n margin-top: 4px;\n padding-top: 10px;\n}\n.msg-icon-wrap {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n height: 1.4em;\n}\n.msg-icon {\n flex-shrink: 0;\n color: #9ca3af;\n}\n.msg-row-content {\n display: flex;\n flex: 1;\n}\n.msg-label {\n flex-shrink: 0;\n color: #6b7280;\n font-weight: 500;\n margin-right: 8px;\n white-space: nowrap;\n}\n.msg-value {\n color: #111827;\n word-break: break-word;\n flex: 1;\n}\n.msg-id {\n font-size: 12px;\n color: #9ca3af;\n font-family: monospace;\n}\n.msg-attachments {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n.msg-attachment {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 8px;\n background: #f3f4f6;\n border-radius: 4px;\n font-size: 13px;\n color: #374151;\n border: 1px solid #e5e7eb;\n}\n.msg-attachment-size {\n color: #9ca3af;\n font-size: 12px;\n}\n.msg-body {\n padding: clamp(12px, 3vw, 24px) clamp(16px, 3vw, 28px);\n font-family: system-ui, -apple-system, sans-serif;\n line-height: 1.6;\n color: #333;\n overflow-x: auto;\n}\n</style>\n"],"names":["props","__props","t","useTranslator","loading","ref","error","fields","formatRecipients","recipients","type","r","name","email","formatDate","dateStr","date","decodeHtmlBody","f","emptyBodyText","formatMessageClass","messageClass","watch","response","arrayBuffer","msgReader","MsgReader","err","subject","computed","_a","sender","senderName","senderEmail","toStr","ccStr","bccStr","sentDate","receivedDate","createdDate","lastModified","attachments","a","bodyHtml","messageId","importance","importanceLabel","sensitivity","sensitivityLabel","formatAttachmentSize","size","_openBlock","_createElementBlock","_hoisted_1","_cache","_createElementVNode","_hoisted_2","_hoisted_3","_hoisted_4","_toDisplayString","_unref","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_createVNode","User","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","Users","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","Calendar","_hoisted_28","_hoisted_29","_hoisted_30","_hoisted_31","Clock","_hoisted_32","_hoisted_33","_hoisted_34","_hoisted_35","_hoisted_36","_hoisted_37","_hoisted_38","_hoisted_39","Tag","_hoisted_40","_hoisted_41","_hoisted_42","_hoisted_43","_hoisted_44","_hoisted_45","_hoisted_46","Mail","_hoisted_47","_hoisted_48","_hoisted_49","_hoisted_50","Paperclip","_hoisted_51","_hoisted_52","_Fragment","_renderList","i","_createTextVNode","_hoisted_53","_normalizeClass","_hoisted_54","Hash","_hoisted_55","_hoisted_56","_hoisted_57","_hoisted_58","_hoisted_59","_hoisted_60"],"mappings":"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"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { defineComponent as L, ref as h, watch as j, computed as y, openBlock as a, createElementBlock as r, createElementVNode as t, toDisplayString as o, unref as c, normalizeClass as b, Fragment as x, renderList as k, createCommentVNode as C } from "vue";
|
|
2
|
+
import { u as S, c as V, x as d, h as z, _ as A } from "./index-DpAxU2JM.mjs";
|
|
3
|
+
const D = {
|
|
4
|
+
key: 0,
|
|
5
|
+
class: "vfp-flex vfp-items-center vfp-justify-center vfp-w-full vfp-h-full vfp-bg-[#0f0f12]"
|
|
6
|
+
}, I = {
|
|
7
|
+
key: 1,
|
|
8
|
+
class: "vfp-flex vfp-items-center vfp-justify-center vfp-w-full vfp-h-full vfp-bg-[#0f0f12]"
|
|
9
|
+
}, M = { class: "vfp-text-fg-secondary vfp-text-center" }, O = { class: "vfp-text-lg" }, R = { class: "content-scroll" }, X = { class: "timeline" }, Y = { class: "cues" }, q = { class: "cue-meta" }, G = { class: "cue-time" }, H = { class: "cue-time" }, J = { class: "cue-id" }, K = {
|
|
10
|
+
key: 0,
|
|
11
|
+
class: "cue-style"
|
|
12
|
+
}, P = {
|
|
13
|
+
key: 0,
|
|
14
|
+
class: "cue-words"
|
|
15
|
+
}, Q = ["title"], U = { class: "cue-word-time" }, W = { class: "cue-word-text" }, Z = { class: "status-pill" }, $ = /* @__PURE__ */ L({
|
|
16
|
+
__name: "index",
|
|
17
|
+
props: {
|
|
18
|
+
url: {},
|
|
19
|
+
fileName: {}
|
|
20
|
+
},
|
|
21
|
+
setup(N) {
|
|
22
|
+
const v = N, { t: i } = S(), f = h(""), p = h(!0), u = h(null), T = {
|
|
23
|
+
srt: "srt",
|
|
24
|
+
vtt: "vtt",
|
|
25
|
+
lrc: "lrc",
|
|
26
|
+
elrc: "elrc",
|
|
27
|
+
ass: "ass",
|
|
28
|
+
ssa: "ssa",
|
|
29
|
+
ttml: "ttml",
|
|
30
|
+
dfxp: "ttml"
|
|
31
|
+
}, B = (s) => {
|
|
32
|
+
var l;
|
|
33
|
+
const e = ((l = s.split(".").pop()) == null ? void 0 : l.toLowerCase()) || "";
|
|
34
|
+
return T[e];
|
|
35
|
+
};
|
|
36
|
+
j(() => v.url, async () => {
|
|
37
|
+
p.value = !0, u.value = null;
|
|
38
|
+
try {
|
|
39
|
+
f.value = await z(v.url);
|
|
40
|
+
} catch (s) {
|
|
41
|
+
console.error(s), u.value = i.value("subtitle.load_failed");
|
|
42
|
+
} finally {
|
|
43
|
+
p.value = !1;
|
|
44
|
+
}
|
|
45
|
+
}, { immediate: !0 });
|
|
46
|
+
const n = y(() => {
|
|
47
|
+
if (!f.value) return null;
|
|
48
|
+
try {
|
|
49
|
+
return V(f.value, B(v.fileName));
|
|
50
|
+
} catch (s) {
|
|
51
|
+
return console.error(s), null;
|
|
52
|
+
}
|
|
53
|
+
}), _ = y(() => {
|
|
54
|
+
var s, e;
|
|
55
|
+
return ((s = n.value) == null ? void 0 : s.format) === "lrc" || ((e = n.value) == null ? void 0 : e.format) === "elrc";
|
|
56
|
+
}), w = y(() => {
|
|
57
|
+
var s;
|
|
58
|
+
return ((s = n.value) == null ? void 0 : s.metadata) ?? {};
|
|
59
|
+
}), E = (s) => d(s).slice(3, 8);
|
|
60
|
+
return (s, e) => p.value ? (a(), r("div", D, [...e[0] || (e[0] = [
|
|
61
|
+
t("div", { class: "vfp-w-12 vfp-h-12 vfp-border-4 vfp-border-line-strong vfp-border-t-spinner-head vfp-rounded-full vfp-animate-spin" }, null, -1)
|
|
62
|
+
])])) : u.value || !n.value ? (a(), r("div", I, [
|
|
63
|
+
t("div", M, [
|
|
64
|
+
t("p", O, o(u.value || c(i)("subtitle.parse_failed")), 1)
|
|
65
|
+
])
|
|
66
|
+
])) : (a(), r("div", {
|
|
67
|
+
key: 2,
|
|
68
|
+
class: b(["vfp-relative vfp-w-full vfp-h-full vfp-bg-[#0f0f12]", _.value ? "flavor-lyric" : "flavor-subtitle"])
|
|
69
|
+
}, [
|
|
70
|
+
t("div", R, [
|
|
71
|
+
t("div", X, [
|
|
72
|
+
e[3] || (e[3] = t("div", { class: "timeline-line" }, null, -1)),
|
|
73
|
+
t("ol", Y, [
|
|
74
|
+
(a(!0), r(x, null, k(n.value.cues, (l, g) => (a(), r("li", {
|
|
75
|
+
key: "cue-" + g,
|
|
76
|
+
class: "cue-row"
|
|
77
|
+
}, [
|
|
78
|
+
e[2] || (e[2] = t("div", { class: "cue-dot" }, null, -1)),
|
|
79
|
+
t("div", q, [
|
|
80
|
+
t("span", G, o(c(d)(l.start)), 1),
|
|
81
|
+
e[1] || (e[1] = t("span", { class: "cue-arrow" }, "→", -1)),
|
|
82
|
+
t("span", H, o(c(d)(l.end)), 1),
|
|
83
|
+
t("span", J, "#" + o(l.id ?? g + 1), 1),
|
|
84
|
+
l.style ? (a(), r("span", K, o(l.style), 1)) : C("", !0)
|
|
85
|
+
]),
|
|
86
|
+
l.words && l.words.length > 0 ? (a(), r("div", P, [
|
|
87
|
+
(a(!0), r(x, null, k(l.words, (m, F) => (a(), r("span", {
|
|
88
|
+
key: "w-" + F,
|
|
89
|
+
class: "cue-word",
|
|
90
|
+
title: c(d)(m.start)
|
|
91
|
+
}, [
|
|
92
|
+
t("span", U, o(E(m.start)), 1),
|
|
93
|
+
t("span", W, o(m.text), 1)
|
|
94
|
+
], 8, Q))), 128))
|
|
95
|
+
])) : (a(), r("p", {
|
|
96
|
+
key: 1,
|
|
97
|
+
class: b(["cue-text", { lyric: _.value }])
|
|
98
|
+
}, o(l.text), 3))
|
|
99
|
+
]))), 128))
|
|
100
|
+
])
|
|
101
|
+
])
|
|
102
|
+
]),
|
|
103
|
+
t("div", Z, [
|
|
104
|
+
t("span", null, o(n.value.cues.length) + " " + o(_.value ? c(i)("subtitle.lines") : c(i)("subtitle.cues")), 1),
|
|
105
|
+
w.value.length ? (a(), r(x, { key: 0 }, [
|
|
106
|
+
e[4] || (e[4] = t("span", { class: "dot" }, "·", -1)),
|
|
107
|
+
t("span", null, o(w.value.length), 1)
|
|
108
|
+
], 64)) : C("", !0)
|
|
109
|
+
])
|
|
110
|
+
], 2));
|
|
111
|
+
}
|
|
112
|
+
}), lt = /* @__PURE__ */ A($, [["__scopeId", "data-v-f4c7d945"]]);
|
|
113
|
+
export {
|
|
114
|
+
lt as default
|
|
115
|
+
};
|
|
116
|
+
//# sourceMappingURL=index-CBCQs1ZC.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-CBCQs1ZC.mjs","sources":["../../src/renderers/Subtitle/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, computed, watch } from 'vue';\nimport {\n parseSubtitle,\n formatSubtitleTime,\n fetchTextUtf8,\n type SubtitleParseResult,\n type SubtitleFormat,\n} from '@eternalheart/file-preview-core';\nimport { useTranslator } from '../../composables/useTranslator';\n\nconst props = defineProps<{\n url: string;\n fileName: string;\n}>();\n\nconst { t } = useTranslator();\n\nconst text = ref<string>('');\nconst loading = ref(true);\nconst error = ref<string | null>(null);\n\nconst FORMAT_BY_EXT: Record<string, SubtitleFormat> = {\n srt: 'srt',\n vtt: 'vtt',\n lrc: 'lrc',\n elrc: 'elrc',\n ass: 'ass',\n ssa: 'ssa',\n ttml: 'ttml',\n dfxp: 'ttml',\n};\n\nconst getFormat = (fileName: string): SubtitleFormat | undefined => {\n const ext = fileName.split('.').pop()?.toLowerCase() || '';\n return FORMAT_BY_EXT[ext];\n};\n\nconst load = async () => {\n loading.value = true;\n error.value = null;\n try {\n text.value = await fetchTextUtf8(props.url);\n } catch (err) {\n console.error(err);\n error.value = t.value('subtitle.load_failed');\n } finally {\n loading.value = false;\n }\n};\n\nwatch(() => props.url, load, { immediate: true });\n\nconst parsed = computed<SubtitleParseResult | null>(() => {\n if (!text.value) return null;\n try {\n return parseSubtitle(text.value, getFormat(props.fileName));\n } catch (err) {\n console.error(err);\n return null;\n }\n});\n\nconst isLyric = computed(() => parsed.value?.format === 'lrc' || parsed.value?.format === 'elrc');\n\nconst meta = computed<Record<string, string>>(() => parsed.value?.metadata ?? {});\n\nconst wordTimeShort = (t: number) => formatSubtitleTime(t).slice(3, 8);\n</script>\n\n<template>\n <div\n v-if=\"loading\"\n class=\"vfp-flex vfp-items-center vfp-justify-center vfp-w-full vfp-h-full vfp-bg-[#0f0f12]\"\n >\n <div\n class=\"vfp-w-12 vfp-h-12 vfp-border-4 vfp-border-line-strong vfp-border-t-spinner-head vfp-rounded-full vfp-animate-spin\"\n />\n </div>\n\n <div\n v-else-if=\"error || !parsed\"\n class=\"vfp-flex vfp-items-center vfp-justify-center vfp-w-full vfp-h-full vfp-bg-[#0f0f12]\"\n >\n <div class=\"vfp-text-fg-secondary vfp-text-center\">\n <p class=\"vfp-text-lg\">{{ error || t('subtitle.parse_failed') }}</p>\n </div>\n </div>\n\n <div\n v-else\n class=\"vfp-relative vfp-w-full vfp-h-full vfp-bg-[#0f0f12]\"\n :class=\"isLyric ? 'flavor-lyric' : 'flavor-subtitle'\"\n >\n <!-- 内容滚动区 -->\n <div class=\"content-scroll\">\n <div class=\"timeline\">\n <div class=\"timeline-line\" />\n <ol class=\"cues\">\n <li v-for=\"(cue, i) in parsed.cues\" :key=\"'cue-' + i\" class=\"cue-row\">\n <div class=\"cue-dot\" />\n <div class=\"cue-meta\">\n <span class=\"cue-time\">{{ formatSubtitleTime(cue.start) }}</span>\n <span class=\"cue-arrow\">→</span>\n <span class=\"cue-time\">{{ formatSubtitleTime(cue.end) }}</span>\n <span class=\"cue-id\">#{{ cue.id ?? i + 1 }}</span>\n <span v-if=\"cue.style\" class=\"cue-style\">{{ cue.style }}</span>\n </div>\n <div v-if=\"cue.words && cue.words.length > 0\" class=\"cue-words\">\n <span\n v-for=\"(word, wi) in cue.words\"\n :key=\"'w-' + wi\"\n class=\"cue-word\"\n :title=\"formatSubtitleTime(word.start)\"\n >\n <span class=\"cue-word-time\">{{ wordTimeShort(word.start) }}</span>\n <span class=\"cue-word-text\">{{ word.text }}</span>\n </span>\n </div>\n <p v-else class=\"cue-text\" :class=\"{ lyric: isLyric }\">{{ cue.text }}</p>\n </li>\n </ol>\n </div>\n </div>\n\n <!-- 右下角浮签 -->\n <div class=\"status-pill\">\n <span>{{ parsed.cues.length }} {{ isLyric ? t('subtitle.lines') : t('subtitle.cues') }}</span>\n <template v-if=\"meta.length\">\n <span class=\"dot\">·</span>\n <span>{{ meta.length }}</span>\n </template>\n </div>\n </div>\n</template>\n\n<style scoped>\n.content-scroll {\n width: 100%;\n height: 100%;\n overflow: auto;\n padding: 1.5rem 1.5rem 4rem;\n}\n@media (min-width: 768px) {\n .content-scroll {\n padding: 1.5rem 2.5rem 5rem;\n }\n}\n.status-pill {\n pointer-events: none;\n position: absolute;\n bottom: 0.75rem;\n right: 0.75rem;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.25rem 0.625rem;\n border-radius: 9999px;\n background: rgba(0, 0, 0, 0.4);\n backdrop-filter: blur(8px);\n border: 1px solid var(--fp-line);\n font-size: 0.625rem;\n color: var(--fp-fg-tertiary);\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n font-variant-numeric: tabular-nums;\n}\n@media (min-width: 768px) {\n .status-pill {\n bottom: 1rem;\n right: 1rem;\n }\n}\n.dot {\n color: var(--fp-fg-disabled);\n}\n\n.timeline {\n position: relative;\n max-width: 64rem;\n margin: 0 auto;\n}\n.timeline-line {\n position: absolute;\n left: 5px;\n top: 0.5rem;\n bottom: 0.5rem;\n width: 1px;\n background: var(--fp-line-weak);\n}\n@media (min-width: 768px) {\n .timeline-line {\n left: 7px;\n }\n}\n.cues {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 1.25rem;\n}\n@media (min-width: 768px) {\n .cues {\n gap: 1.5rem;\n }\n}\n.cue-row {\n position: relative;\n padding-left: 1.5rem;\n}\n@media (min-width: 768px) {\n .cue-row {\n padding-left: 2rem;\n }\n}\n.cue-dot {\n position: absolute;\n left: 0;\n top: 0.5rem;\n width: 0.75rem;\n height: 0.75rem;\n border-radius: 9999px;\n background: var(--fp-surface-3);\n border: 2px solid #0f0f12;\n transition: background-color 0.2s;\n}\n.flavor-lyric .cue-row:hover .cue-dot {\n background: rgb(167, 139, 250);\n}\n.flavor-subtitle .cue-row:hover .cue-dot {\n background: rgb(56, 189, 248);\n}\n.cue-meta {\n display: flex;\n flex-wrap: wrap;\n align-items: baseline;\n gap: 0.25rem 0.75rem;\n margin-bottom: 0.375rem;\n}\n.cue-time {\n font-size: 0.6875rem;\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n color: var(--fp-fg-muted);\n font-variant-numeric: tabular-nums;\n}\n.cue-arrow {\n font-size: 0.6875rem;\n color: var(--fp-fg-disabled);\n}\n.cue-id {\n font-size: 0.625rem;\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n color: var(--fp-fg-disabled);\n font-variant-numeric: tabular-nums;\n}\n.cue-style {\n font-size: 0.5625rem;\n text-transform: uppercase;\n letter-spacing: 0.1em;\n color: var(--fp-fg-tertiary);\n padding: 0.125rem 0.375rem;\n border-radius: 0.25rem;\n background: var(--fp-line-weak);\n border: 1px solid var(--fp-line);\n}\n.cue-text {\n margin: 0;\n white-space: pre-wrap;\n word-break: break-word;\n line-height: 1.625;\n color: var(--fp-fg-primary);\n font-size: 0.875rem;\n transition: color 0.2s;\n}\n@media (min-width: 768px) {\n .cue-text {\n font-size: 1rem;\n }\n}\n.cue-text.lyric {\n font-size: 1rem;\n font-weight: 500;\n}\n@media (min-width: 768px) {\n .cue-text.lyric {\n font-size: 1.25rem;\n }\n}\n.cue-row:hover .cue-text {\n color: #fff;\n}\n.cue-words {\n display: flex;\n flex-wrap: wrap;\n gap: 0.25rem 0.375rem;\n font-size: 1rem;\n color: var(--fp-fg-primary);\n line-height: 1.625;\n transition: color 0.2s;\n}\n@media (min-width: 768px) {\n .cue-words {\n font-size: 1.125rem;\n }\n}\n.cue-row:hover .cue-words {\n color: #fff;\n}\n.cue-word {\n display: inline-flex;\n flex-direction: column;\n align-items: flex-start;\n}\n.cue-word-time {\n font-size: 0.5625rem;\n color: var(--fp-fg-disabled);\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n line-height: 1;\n font-variant-numeric: tabular-nums;\n}\n.cue-word-text {\n line-height: 1.4;\n}\n</style>\n"],"names":["props","__props","t","useTranslator","text","ref","loading","error","FORMAT_BY_EXT","getFormat","fileName","ext","_a","watch","fetchTextUtf8","err","parsed","computed","parseSubtitle","isLyric","_b","meta","wordTimeShort","formatSubtitleTime","_openBlock","_createElementBlock","_hoisted_1","_cache","_createElementVNode","_hoisted_2","_hoisted_3","_hoisted_4","_toDisplayString","_unref","_normalizeClass","_hoisted_5","_hoisted_6","_hoisted_7","_Fragment","cue","i","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","word","wi","_hoisted_15","_hoisted_16","_hoisted_17"],"mappings":"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"}
|