@eternalheart/vue-file-preview 1.3.10 → 1.3.11
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.map +1 -1
- package/lib/chunks/RendererError.vue_vue_type_script_setup_true_lang-CbgZBSDr.mjs +31 -0
- package/lib/chunks/RendererError.vue_vue_type_script_setup_true_lang-CbgZBSDr.mjs.map +1 -0
- package/lib/chunks/avifLoader-BP3fgcMm-BnpxLhxp.mjs +56 -0
- package/lib/chunks/avifLoader-BP3fgcMm-BnpxLhxp.mjs.map +1 -0
- package/lib/chunks/heicLoader-CH_raQNn-1fBLaICM.mjs +37 -0
- package/lib/chunks/heicLoader-CH_raQNn-1fBLaICM.mjs.map +1 -0
- package/lib/chunks/index-B3-ezDVJ.mjs +104 -0
- package/lib/chunks/index-B3-ezDVJ.mjs.map +1 -0
- package/lib/chunks/index-B9RAbllH.mjs +74 -0
- package/lib/chunks/index-B9RAbllH.mjs.map +1 -0
- package/lib/chunks/{index-xBRMnurm.mjs → index-BA-SUKkf.mjs} +54 -58
- package/lib/chunks/index-BA-SUKkf.mjs.map +1 -0
- package/lib/chunks/index-BHPmd4HF.mjs +12350 -0
- package/lib/chunks/index-BHPmd4HF.mjs.map +1 -0
- package/lib/chunks/index-BKu5DkdG.mjs +117 -0
- package/lib/chunks/index-BKu5DkdG.mjs.map +1 -0
- package/lib/chunks/index-BT-U9HYI.mjs +117 -0
- package/lib/chunks/index-BT-U9HYI.mjs.map +1 -0
- package/lib/chunks/{index-BY_XuO1z.mjs → index-C0vSFXmh.mjs} +93 -96
- package/lib/chunks/index-C0vSFXmh.mjs.map +1 -0
- package/lib/chunks/index-C65zV1vs.mjs +114 -0
- package/lib/chunks/index-C65zV1vs.mjs.map +1 -0
- package/lib/chunks/index-CMgtGmRN.mjs +81 -0
- package/lib/chunks/index-CMgtGmRN.mjs.map +1 -0
- package/lib/chunks/{index-BuYJGBLT.mjs → index-CQFN4h-t.mjs} +965 -739
- package/lib/chunks/index-CQFN4h-t.mjs.map +1 -0
- package/lib/chunks/index-CY2vJrBJ.mjs +166 -0
- package/lib/chunks/index-CY2vJrBJ.mjs.map +1 -0
- package/lib/chunks/index-Cu1up6RM.mjs +617 -0
- package/lib/chunks/index-Cu1up6RM.mjs.map +1 -0
- package/lib/chunks/index-DLPnWmJm.mjs +13190 -0
- package/lib/chunks/index-DLPnWmJm.mjs.map +1 -0
- package/lib/chunks/index-DNFQFaF3.mjs +102 -0
- package/lib/chunks/index-DNFQFaF3.mjs.map +1 -0
- package/lib/chunks/{index-CuChO3jv.mjs → index-Dln8hyPZ.mjs} +39 -40
- package/lib/chunks/index-Dln8hyPZ.mjs.map +1 -0
- package/lib/chunks/{index-DsZdtQJg.mjs → index-hRgOoqVw.mjs} +78 -79
- package/lib/chunks/index-hRgOoqVw.mjs.map +1 -0
- package/lib/chunks/index-ijv9F2cZ.mjs +280 -0
- package/lib/chunks/index-ijv9F2cZ.mjs.map +1 -0
- package/lib/chunks/index-t1Plo3ud.mjs +140 -0
- package/lib/chunks/index-t1Plo3ud.mjs.map +1 -0
- package/lib/chunks/index-y7gaKu36.mjs +234 -0
- package/lib/chunks/index-y7gaKu36.mjs.map +1 -0
- package/lib/chunks/jp2Loader-Bn-qPMbD-Bn-qPMbD.mjs +122 -0
- package/lib/chunks/jp2Loader-Bn-qPMbD-Bn-qPMbD.mjs.map +1 -0
- package/lib/chunks/psdLoader-Doxw3mWm-DVOGFSlh.mjs +73 -0
- package/lib/chunks/psdLoader-Doxw3mWm-DVOGFSlh.mjs.map +1 -0
- package/lib/chunks/rawLoader-0mLvxCNp-CJmERiK7.mjs +82 -0
- package/lib/chunks/rawLoader-0mLvxCNp-CJmERiK7.mjs.map +1 -0
- package/lib/chunks/tiffLoader-CTFKVLqJ-B84NfwhR.mjs +60 -0
- package/lib/chunks/tiffLoader-CTFKVLqJ-B84NfwhR.mjs.map +1 -0
- package/lib/composables/useRequest.d.ts +2 -2
- package/lib/composables/useRequest.d.ts.map +1 -1
- package/lib/index.cjs +34 -26
- package/lib/index.cjs.map +1 -1
- package/lib/index.css +1 -1
- package/lib/index.mjs +8 -8
- 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/Docx/index.vue.d.ts.map +1 -1
- package/lib/renderers/Epub/index.vue.d.ts.map +1 -1
- package/lib/renderers/Font/FontPreviewLine.vue.d.ts +1 -1
- package/lib/renderers/Font/FontPreviewLine.vue.d.ts.map +1 -1
- package/lib/renderers/Font/index.vue.d.ts.map +1 -1
- package/lib/renderers/Image/index.vue.d.ts +2 -0
- package/lib/renderers/Image/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/Mobi/index.vue.d.ts.map +1 -1
- package/lib/renderers/Msg/index.vue.d.ts.map +1 -1
- package/lib/renderers/Pdf/index.vue.d.ts.map +1 -1
- package/lib/renderers/Pptx/index.vue.d.ts.map +1 -1
- package/lib/renderers/RendererError.vue.d.ts +10 -0
- package/lib/renderers/RendererError.vue.d.ts.map +1 -0
- package/lib/renderers/Subtitle/index.vue.d.ts.map +1 -1
- package/lib/renderers/Text/index.vue.d.ts.map +1 -1
- package/lib/renderers/Video/index.vue.d.ts +1 -0
- 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/shims/stream-stub.d.ts +8 -0
- package/lib/shims/stream-stub.d.ts.map +1 -0
- package/package.json +13 -4
- package/lib/chunks/index-7TEaCdxH.mjs +0 -152
- package/lib/chunks/index-7TEaCdxH.mjs.map +0 -1
- package/lib/chunks/index-B4_-Yo-b.mjs +0 -134
- package/lib/chunks/index-B4_-Yo-b.mjs.map +0 -1
- package/lib/chunks/index-BD0HLPzh.mjs +0 -116
- package/lib/chunks/index-BD0HLPzh.mjs.map +0 -1
- package/lib/chunks/index-BOL895ZO.mjs +0 -103
- package/lib/chunks/index-BOL895ZO.mjs.map +0 -1
- package/lib/chunks/index-BUn7C84b.mjs +0 -281
- package/lib/chunks/index-BUn7C84b.mjs.map +0 -1
- package/lib/chunks/index-BY_XuO1z.mjs.map +0 -1
- package/lib/chunks/index-BcXyjt8Z.mjs +0 -113
- package/lib/chunks/index-BcXyjt8Z.mjs.map +0 -1
- package/lib/chunks/index-BlNjLD3A.mjs +0 -129
- package/lib/chunks/index-BlNjLD3A.mjs.map +0 -1
- package/lib/chunks/index-BuYJGBLT.mjs.map +0 -1
- package/lib/chunks/index-CuChO3jv.mjs.map +0 -1
- package/lib/chunks/index-CxiRIgnd.mjs +0 -111
- package/lib/chunks/index-CxiRIgnd.mjs.map +0 -1
- package/lib/chunks/index-D-j14MHC.mjs +0 -164
- package/lib/chunks/index-D-j14MHC.mjs.map +0 -1
- package/lib/chunks/index-DhQPH7M7.mjs +0 -139
- package/lib/chunks/index-DhQPH7M7.mjs.map +0 -1
- package/lib/chunks/index-DheF8bvY.mjs +0 -353
- package/lib/chunks/index-DheF8bvY.mjs.map +0 -1
- package/lib/chunks/index-DsZdtQJg.mjs.map +0 -1
- package/lib/chunks/index-fD12G5fh.mjs +0 -84
- package/lib/chunks/index-fD12G5fh.mjs.map +0 -1
- package/lib/chunks/index-h8VDgpZB.mjs +0 -244
- package/lib/chunks/index-h8VDgpZB.mjs.map +0 -1
- package/lib/chunks/index-xBRMnurm.mjs.map +0 -1
- package/lib/chunks/index-y5WgRh6y.mjs +0 -77
- package/lib/chunks/index-y5WgRh6y.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilePreviewContent.vue.d.ts","sourceRoot":"","sources":["../src/FilePreviewContent.vue"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"FilePreviewContent.vue.d.ts","sourceRoot":"","sources":["../src/FilePreviewContent.vue"],"names":[],"mappings":"AAwyBA,OAAO,EAIL,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,MAAM,EACX,KAAK,QAAQ,EACb,KAAK,KAAK,EACV,KAAK,0BAA0B,EAC/B,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACvB,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,cAAc,EAAyB,MAAM,SAAS,CAAC;AAsCrE,UAAU,KAAK;IACb,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,cAAc,EAAE,CAAC;IACnC,kCAAkC;IAClC,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IACzB,qCAAqC;IACrC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS;IACT,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IACtD,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,qBAAqB;IACrB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,mDAAmD;IACnD,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,4BAA4B;IAC5B,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,4EAA4E;IAC5E,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,4CAA4C;IAC5C,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1D;;;;;;;;;;iBAPe,kBAAkB;oBAEf,cAAc;UAdxB,OAAO,GAAG,OAAO;WAUhB,KAAK;qBAZK,cAAc,EAAE;qBAIhB,MAAM;YAEf,MAAM;cAEJ,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;cAE1C,OAAO;uBAQE,iBAAiB;gBAExB,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;;AAyuC1D,wBAQG"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { defineComponent as p, openBlock as t, createElementBlock as f, createElementVNode as s, createVNode as c, unref as n, createCommentVNode as r, toDisplayString as o } from "vue";
|
|
2
|
+
import { AlertCircle as l } from "lucide-vue-next";
|
|
3
|
+
const v = { class: "vfp-flex vfp-items-center vfp-justify-center vfp-w-full vfp-h-full" }, a = { class: "vfp-text-center" }, i = {
|
|
4
|
+
key: 0,
|
|
5
|
+
class: "vfp-w-16 vfp-h-16 vfp-mx-auto vfp-mb-4 vfp-rounded-full vfp-bg-red-500/10 vfp-flex vfp-items-center vfp-justify-center"
|
|
6
|
+
}, d = { class: "vfp-text-lg md:vfp-text-xl vfp-font-medium vfp-text-fg-primary vfp-mb-2" }, m = {
|
|
7
|
+
key: 1,
|
|
8
|
+
class: "vfp-text-sm vfp-text-fg-tertiary"
|
|
9
|
+
}, y = /* @__PURE__ */ p({
|
|
10
|
+
__name: "RendererError",
|
|
11
|
+
props: {
|
|
12
|
+
message: {},
|
|
13
|
+
detail: {},
|
|
14
|
+
showIcon: { type: Boolean, default: !0 }
|
|
15
|
+
},
|
|
16
|
+
setup(e) {
|
|
17
|
+
return (u, x) => (t(), f("div", v, [
|
|
18
|
+
s("div", a, [
|
|
19
|
+
e.showIcon ? (t(), f("div", i, [
|
|
20
|
+
c(n(l), { class: "vfp-w-8 vfp-h-8 vfp-text-red-400" })
|
|
21
|
+
])) : r("", !0),
|
|
22
|
+
s("p", d, o(e.message), 1),
|
|
23
|
+
e.detail ? (t(), f("p", m, o(e.detail), 1)) : r("", !0)
|
|
24
|
+
])
|
|
25
|
+
]));
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
export {
|
|
29
|
+
y as _
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=RendererError.vue_vue_type_script_setup_true_lang-CbgZBSDr.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RendererError.vue_vue_type_script_setup_true_lang-CbgZBSDr.mjs","sources":["../../src/renderers/RendererError.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { AlertCircle } from 'lucide-vue-next';\n\ninterface Props {\n message: string;\n detail?: string;\n showIcon?: boolean;\n}\n\nwithDefaults(defineProps<Props>(), {\n showIcon: true,\n});\n</script>\n\n<template>\n <div class=\"vfp-flex vfp-items-center vfp-justify-center vfp-w-full vfp-h-full\">\n <div class=\"vfp-text-center\">\n <div\n v-if=\"showIcon\"\n class=\"vfp-w-16 vfp-h-16 vfp-mx-auto vfp-mb-4 vfp-rounded-full vfp-bg-red-500/10 vfp-flex vfp-items-center vfp-justify-center\"\n >\n <AlertCircle class=\"vfp-w-8 vfp-h-8 vfp-text-red-400\" />\n </div>\n <p class=\"vfp-text-lg md:vfp-text-xl vfp-font-medium vfp-text-fg-primary vfp-mb-2\">\n {{ message }}\n </p>\n <p v-if=\"detail\" class=\"vfp-text-sm vfp-text-fg-tertiary\">\n {{ detail }}\n </p>\n </div>\n </div>\n</template>\n"],"names":["_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_hoisted_2","__props","_hoisted_3","_createVNode","_unref","AlertCircle","_hoisted_4","_toDisplayString","_hoisted_5"],"mappings":";;;;;;;;;;;;;;;;sBAeEA,EAAA,GAAAC,EAeM,OAfNC,GAeM;AAAA,MAdJC,EAaM,OAbNC,GAaM;AAAA,QAXIC,EAAA,YADRL,EAAA,GAAAC,EAKM,OALNK,GAKM;AAAA,UADJC,EAAwDC,EAAAC,CAAA,GAAA,EAA3C,OAAM,oCAAkC;AAAA,QAAA;QAEvDN,EAEI,KAFJO,GAEIC,EADCN,EAAA,OAAO,GAAA,CAAA;AAAA,QAEHA,EAAA,eAATJ,EAEI,KAFJW,GAEID,EADCN,EAAA,MAAM,GAAA,CAAA;;;;;"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
let a = null;
|
|
2
|
+
async function B() {
|
|
3
|
+
return a !== null ? a : new Promise((n) => {
|
|
4
|
+
const A = new Image();
|
|
5
|
+
A.onload = () => {
|
|
6
|
+
a = A.width === 1 && A.height === 1, n(a);
|
|
7
|
+
}, A.onerror = () => {
|
|
8
|
+
a = !1, n(!1);
|
|
9
|
+
}, A.src = "data:image/avif;base64,AAAAIGZ0eXBhdmlmAAAAAGF2aWZtaWYxbWlhZk1BMUIAAADybWV0YQAAAAAAAAAoaGRscgAAAAAAAAAAcGljdAAAAAAAAAAAAAAAAGxpYmF2aWYAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEAAAABAAABGgAAAB0AAAAoaWluZgAAAAAAAQAAABppbmZlAgAAAAABAABhdjAxQ29sb3IAAAAAamlwcnAAAABLaXBjbwAAABRpc3BlAAAAAAAAAAEAAAABAAAAEHBpeGkAAAAAAwgICAAAAAxhdjFDgQAMAAAAABNjb2xybmNseAACAAIABoAAAAAXaXBtYQAAAAAAAAABAAEEAQKDBAAAACVtZGF0EgAKCBgABogQEDQgMgkQAAAAB8dSLfI=";
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
class d {
|
|
13
|
+
/**
|
|
14
|
+
* 检测是否需要解码:仅在浏览器不原生支持 AVIF 时需要
|
|
15
|
+
*/
|
|
16
|
+
async needsDecode(A) {
|
|
17
|
+
return A !== "image/avif" ? !1 : !await B();
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* 解码 AVIF 文件为 PNG Blob
|
|
21
|
+
*/
|
|
22
|
+
async decode(A, r) {
|
|
23
|
+
if (await B())
|
|
24
|
+
return A instanceof Blob ? A : new Blob([A], { type: "image/avif" });
|
|
25
|
+
try {
|
|
26
|
+
const e = await import("@jsquash/avif"), l = A instanceof Blob ? await A.arrayBuffer() : A, o = await e.decode(l), t = document.createElement("canvas");
|
|
27
|
+
t.width = o.width, t.height = o.height;
|
|
28
|
+
const i = t.getContext("2d");
|
|
29
|
+
if (!i)
|
|
30
|
+
throw new Error("无法创建 Canvas 2D 上下文");
|
|
31
|
+
return i.putImageData(o, 0, 0), new Promise((c, g) => {
|
|
32
|
+
t.toBlob(
|
|
33
|
+
(s) => {
|
|
34
|
+
s ? c(s) : g(new Error("AVIF Canvas 转换为 PNG 失败"));
|
|
35
|
+
},
|
|
36
|
+
(r == null ? void 0 : r.outputFormat) || "image/png"
|
|
37
|
+
);
|
|
38
|
+
});
|
|
39
|
+
} catch (e) {
|
|
40
|
+
throw new Error(`AVIF 解码失败: ${(e == null ? void 0 : e.message) || "未知错误"}`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* 获取 AVIF 元数据
|
|
45
|
+
*/
|
|
46
|
+
async getMetadata(A) {
|
|
47
|
+
return {
|
|
48
|
+
format: "avif"
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
const w = new d();
|
|
53
|
+
export {
|
|
54
|
+
w as default
|
|
55
|
+
};
|
|
56
|
+
//# sourceMappingURL=avifLoader-BP3fgcMm-BnpxLhxp.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avifLoader-BP3fgcMm-BnpxLhxp.mjs","sources":["../../../file-preview-core/lib/avifLoader-BP3fgcMm.js"],"sourcesContent":["let e = null;\nasync function c() {\n return e !== null ? e : new Promise((n) => {\n const A = new Image();\n A.onload = () => {\n e = A.width === 1 && A.height === 1, n(e);\n }, A.onerror = () => {\n e = !1, n(!1);\n }, A.src = \"data:image/avif;base64,AAAAIGZ0eXBhdmlmAAAAAGF2aWZtaWYxbWlhZk1BMUIAAADybWV0YQAAAAAAAAAoaGRscgAAAAAAAAAAcGljdAAAAAAAAAAAAAAAAGxpYmF2aWYAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEAAAABAAABGgAAAB0AAAAoaWluZgAAAAAAAQAAABppbmZlAgAAAAABAABhdjAxQ29sb3IAAAAAamlwcnAAAABLaXBjbwAAABRpc3BlAAAAAAAAAAEAAAABAAAAEHBpeGkAAAAAAwgICAAAAAxhdjFDgQAMAAAAABNjb2xybmNseAACAAIABoAAAAAXaXBtYQAAAAAAAAABAAEEAQKDBAAAACVtZGF0EgAKCBgABogQEDQgMgkQAAAAB8dSLfI=\";\n });\n}\nclass f {\n /**\n * 检测是否需要解码:仅在浏览器不原生支持 AVIF 时需要\n */\n async needsDecode(A) {\n return A !== \"image/avif\" ? !1 : !await c();\n }\n /**\n * 解码 AVIF 文件为 PNG Blob\n */\n async decode(A, r) {\n if (await c())\n return A instanceof Blob ? A : new Blob([A], { type: \"image/avif\" });\n try {\n const a = await import(\"@jsquash/avif\"), i = A instanceof Blob ? await A.arrayBuffer() : A, o = await a.decode(i), t = document.createElement(\"canvas\");\n t.width = o.width, t.height = o.height;\n const s = t.getContext(\"2d\");\n if (!s)\n throw new Error(\"无法创建 Canvas 2D 上下文\");\n return s.putImageData(o, 0, 0), new Promise((g, d) => {\n t.toBlob(\n (B) => {\n B ? g(B) : d(new Error(\"AVIF Canvas 转换为 PNG 失败\"));\n },\n (r == null ? void 0 : r.outputFormat) || \"image/png\"\n );\n });\n } catch (a) {\n throw new Error(`AVIF 解码失败: ${(a == null ? void 0 : a.message) || \"未知错误\"}`);\n }\n }\n /**\n * 获取 AVIF 元数据\n */\n async getMetadata(A) {\n return {\n format: \"avif\"\n };\n }\n}\nconst m = new f();\nexport {\n m as default\n};\n//# sourceMappingURL=avifLoader-BP3fgcMm.js.map\n"],"names":["e","c","f","a","i","s","g","d","B","m"],"mappings":"AAAA,IAAIA,IAAI;AACR,eAAeC,IAAI;AACjB,SAAOD,MAAM,OAAOA,IAAI,IAAI,QAAQ,CAAC,MAAM;AACzC,UAAM,IAAI,IAAI,MAAK;AACnB,MAAE,SAAS,MAAM;AACf,MAAAA,IAAI,EAAE,UAAU,KAAK,EAAE,WAAW,GAAG,EAAEA,CAAC;AAAA,IAC1C,GAAG,EAAE,UAAU,MAAM;AACnB,MAAAA,IAAI,IAAI,EAAE,EAAE;AAAA,IACd,GAAG,EAAE,MAAM;AAAA,EACb,CAAC;AACH;AACA,MAAME,EAAE;AAAA;AAAA;AAAA;AAAA,EAIN,MAAM,YAAY,GAAG;AACnB,WAAO,MAAM,eAAe,KAAK,CAAC,MAAMD,EAAC;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAIA,MAAM,OAAO,GAAG,GAAG;AACjB,QAAI,MAAMA,EAAC;AACT,aAAO,aAAa,OAAO,IAAI,IAAI,KAAK,CAAC,CAAC,GAAG,EAAE,MAAM,cAAc;AACrE,QAAI;AACF,YAAME,IAAI,MAAM,OAAO,eAAe,GAAGC,IAAI,aAAa,OAAO,MAAM,EAAE,YAAW,IAAK,GAAG,IAAI,MAAMD,EAAE,OAAOC,CAAC,GAAG,IAAI,SAAS,cAAc,QAAQ;AACtJ,QAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE;AAChC,YAAMC,IAAI,EAAE,WAAW,IAAI;AAC3B,UAAI,CAACA;AACH,cAAM,IAAI,MAAM,oBAAoB;AACtC,aAAOA,EAAE,aAAa,GAAG,GAAG,CAAC,GAAG,IAAI,QAAQ,CAACC,GAAGC,MAAM;AACpD,UAAE;AAAA,UACA,CAACC,MAAM;AACL,YAAAA,IAAIF,EAAEE,CAAC,IAAID,EAAE,IAAI,MAAM,wBAAwB,CAAC;AAAA,UAClD;AAAA,WACC,KAAK,OAAO,SAAS,EAAE,iBAAiB;AAAA,QACnD;AAAA,MACM,CAAC;AAAA,IACH,SAASJ,GAAG;AACV,YAAM,IAAI,MAAM,eAAeA,KAAK,OAAO,SAASA,EAAE,YAAY,MAAM,EAAE;AAAA,IAC5E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAIA,MAAM,YAAY,GAAG;AACnB,WAAO;AAAA,MACL,QAAQ;AAAA,IACd;AAAA,EACE;AACF;AACK,MAACM,IAAI,IAAIP,EAAC;"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
class l {
|
|
2
|
+
/**
|
|
3
|
+
* HEIC 格式浏览器均不原生支持,始终需要解码
|
|
4
|
+
*/
|
|
5
|
+
async needsDecode(a) {
|
|
6
|
+
return a === "image/heic" || a === "image/heif";
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* 解码 HEIC 文件为 JPEG Blob
|
|
10
|
+
*/
|
|
11
|
+
async decode(a, r) {
|
|
12
|
+
var n, o;
|
|
13
|
+
try {
|
|
14
|
+
const e = await import("heic2any"), i = a instanceof Blob ? a : new Blob([a], { type: "image/heic" }), t = await e.default({
|
|
15
|
+
blob: i,
|
|
16
|
+
toType: (r == null ? void 0 : r.outputFormat) || "image/jpeg",
|
|
17
|
+
quality: 0.9
|
|
18
|
+
});
|
|
19
|
+
return Array.isArray(t) ? t[0] : t;
|
|
20
|
+
} catch (e) {
|
|
21
|
+
throw (n = e == null ? void 0 : e.message) != null && n.includes("DRM") || (o = e == null ? void 0 : e.message) != null && o.includes("protected") ? new Error("HEIC 解码失败,文件受 DRM 保护") : new Error(`HEIC 解码失败,文件可能损坏: ${(e == null ? void 0 : e.message) || "未知错误"}`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* 获取 HEIC 元数据(当前版本暂不实现,返回空对象)
|
|
26
|
+
*/
|
|
27
|
+
async getMetadata(a) {
|
|
28
|
+
return {
|
|
29
|
+
format: "heic"
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
const c = new l();
|
|
34
|
+
export {
|
|
35
|
+
c as default
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=heicLoader-CH_raQNn-1fBLaICM.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heicLoader-CH_raQNn-1fBLaICM.mjs","sources":["../../../file-preview-core/lib/heicLoader-CH_raQNn.js"],"sourcesContent":["class r {\n /**\n * HEIC 格式浏览器均不原生支持,始终需要解码\n */\n async needsDecode(a) {\n return a === \"image/heic\" || a === \"image/heif\";\n }\n /**\n * 解码 HEIC 文件为 JPEG Blob\n */\n async decode(a, t) {\n var s, n;\n try {\n const e = await import(\"heic2any\"), i = a instanceof Blob ? a : new Blob([a], { type: \"image/heic\" }), c = await e.default({\n blob: i,\n toType: (t == null ? void 0 : t.outputFormat) || \"image/jpeg\",\n quality: 0.9\n });\n return Array.isArray(c) ? c[0] : c;\n } catch (e) {\n throw (s = e == null ? void 0 : e.message) != null && s.includes(\"DRM\") || (n = e == null ? void 0 : e.message) != null && n.includes(\"protected\") ? new Error(\"HEIC 解码失败,文件受 DRM 保护\") : new Error(`HEIC 解码失败,文件可能损坏: ${(e == null ? void 0 : e.message) || \"未知错误\"}`);\n }\n }\n /**\n * 获取 HEIC 元数据(当前版本暂不实现,返回空对象)\n */\n async getMetadata(a) {\n return {\n format: \"heic\"\n };\n }\n}\nconst u = new r();\nexport {\n u as default\n};\n//# sourceMappingURL=heicLoader-CH_raQNn.js.map\n"],"names":["r","t","s","n","c","u"],"mappings":"AAAA,MAAMA,EAAE;AAAA;AAAA;AAAA;AAAA,EAIN,MAAM,YAAY,GAAG;AACnB,WAAO,MAAM,gBAAgB,MAAM;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAIA,MAAM,OAAO,GAAGC,GAAG;AACjB,QAAIC,GAAGC;AACP,QAAI;AACF,YAAM,IAAI,MAAM,OAAO,UAAU,GAAG,IAAI,aAAa,OAAO,IAAI,IAAI,KAAK,CAAC,CAAC,GAAG,EAAE,MAAM,aAAY,CAAE,GAAGC,IAAI,MAAM,EAAE,QAAQ;AAAA,QACzH,MAAM;AAAA,QACN,SAASH,KAAK,OAAO,SAASA,EAAE,iBAAiB;AAAA,QACjD,SAAS;AAAA,MACjB,CAAO;AACD,aAAO,MAAM,QAAQG,CAAC,IAAIA,EAAE,CAAC,IAAIA;AAAA,IACnC,SAAS,GAAG;AACV,aAAOF,IAAI,KAAK,OAAO,SAAS,EAAE,YAAY,QAAQA,EAAE,SAAS,KAAK,MAAMC,IAAI,KAAK,OAAO,SAAS,EAAE,YAAY,QAAQA,EAAE,SAAS,WAAW,IAAI,IAAI,MAAM,sBAAsB,IAAI,IAAI,MAAM,sBAAsB,KAAK,OAAO,SAAS,EAAE,YAAY,MAAM,EAAE;AAAA,IACtQ;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAIA,MAAM,YAAY,GAAG;AACnB,WAAO;AAAA,MACL,QAAQ;AAAA,IACd;AAAA,EACE;AACF;AACK,MAACE,IAAI,IAAIL,EAAC;"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { defineComponent as k, ref as p, onMounted as T, watch as D, onBeforeUnmount as M, openBlock as v, createElementBlock as h, createElementVNode as m, toDisplayString as S, unref as z, createCommentVNode as w, createBlock as C, normalizeStyle as N } from "vue";
|
|
2
|
+
import B from "x-data-spreadsheet";
|
|
3
|
+
/* empty css */
|
|
4
|
+
import { u as E, a as H, E as R, S as W, M as U, U as V } from "./index-CQFN4h-t.mjs";
|
|
5
|
+
import { _ as F } from "./RendererError.vue_vue_type_script_setup_true_lang-CbgZBSDr.mjs";
|
|
6
|
+
const L = { class: "vfp-relative vfp-flex vfp-flex-col vfp-items-center vfp-w-full vfp-h-full" }, O = {
|
|
7
|
+
key: 0,
|
|
8
|
+
class: "vfp-absolute vfp-inset-0 vfp-flex vfp-items-center vfp-justify-center vfp-bg-surface-toolbar vfp-backdrop-blur-sm vfp-z-10"
|
|
9
|
+
}, j = { class: "vfp-text-center" }, q = { class: "vfp-text-xs md:vfp-text-sm vfp-text-fg-secondary vfp-font-medium" }, K = /* @__PURE__ */ k({
|
|
10
|
+
__name: "index",
|
|
11
|
+
props: {
|
|
12
|
+
url: {},
|
|
13
|
+
fileName: {}
|
|
14
|
+
},
|
|
15
|
+
setup(_) {
|
|
16
|
+
const i = _, { t: b } = E(), y = H(), n = p(!0), a = p(null), s = p(null);
|
|
17
|
+
let r = null, f = null, o = null, u = { width: 0, height: 0 };
|
|
18
|
+
const d = () => {
|
|
19
|
+
if (!s.value) return { width: 800, height: 600 };
|
|
20
|
+
const t = s.value.clientWidth, e = s.value.clientHeight, l = t > 100 ? t : 800, c = e > 100 ? e : 600;
|
|
21
|
+
return { width: l, height: c };
|
|
22
|
+
}, g = () => {
|
|
23
|
+
if (!s.value || !r) return;
|
|
24
|
+
s.value.innerHTML = "";
|
|
25
|
+
const { width: t, height: e } = d(), l = t < 640;
|
|
26
|
+
new B(s.value, {
|
|
27
|
+
mode: "read",
|
|
28
|
+
showToolbar: !1,
|
|
29
|
+
showContextmenu: !1,
|
|
30
|
+
showGrid: !0,
|
|
31
|
+
row: {
|
|
32
|
+
len: 100,
|
|
33
|
+
height: 25
|
|
34
|
+
},
|
|
35
|
+
col: {
|
|
36
|
+
len: 26,
|
|
37
|
+
width: l ? 80 : 100,
|
|
38
|
+
indexWidth: l ? 40 : 60,
|
|
39
|
+
minWidth: l ? 40 : 60
|
|
40
|
+
},
|
|
41
|
+
view: {
|
|
42
|
+
height: () => e,
|
|
43
|
+
width: () => t
|
|
44
|
+
}
|
|
45
|
+
}).loadData(r);
|
|
46
|
+
}, x = async () => {
|
|
47
|
+
if (s.value) {
|
|
48
|
+
n.value = !0, a.value = null;
|
|
49
|
+
try {
|
|
50
|
+
const t = await R(i.url, { fetcher: y.value }), e = W(t, { delimiter: U(i.fileName) });
|
|
51
|
+
r = V(e.header, e.rows, i.fileName), g(), n.value = !1;
|
|
52
|
+
} catch (t) {
|
|
53
|
+
console.error("CSV 解析错误:", t), a.value = b.value("csv.load_failed"), n.value = !1;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
return T(() => {
|
|
58
|
+
if (!s.value) return;
|
|
59
|
+
let t = !0;
|
|
60
|
+
f = new ResizeObserver(() => {
|
|
61
|
+
if (t) {
|
|
62
|
+
t = !1, u = d();
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
const e = d(), l = Math.abs(u.width - e.width), c = Math.abs(u.height - e.height);
|
|
66
|
+
l < 10 && c < 10 || (u = e, o !== null && clearTimeout(o), o = window.setTimeout(() => {
|
|
67
|
+
r && g();
|
|
68
|
+
}, 500));
|
|
69
|
+
}), f.observe(s.value), setTimeout(() => {
|
|
70
|
+
requestAnimationFrame(() => x());
|
|
71
|
+
}, 100);
|
|
72
|
+
}), D(
|
|
73
|
+
() => i.url,
|
|
74
|
+
() => {
|
|
75
|
+
x();
|
|
76
|
+
}
|
|
77
|
+
), M(() => {
|
|
78
|
+
f && f.disconnect(), o !== null && clearTimeout(o), r = null, s.value && (s.value.innerHTML = "");
|
|
79
|
+
}), (t, e) => (v(), h("div", L, [
|
|
80
|
+
n.value ? (v(), h("div", O, [
|
|
81
|
+
m("div", j, [
|
|
82
|
+
e[0] || (e[0] = m("div", { class: "vfp-w-10 vfp-h-10 md:vfp-w-12 md:vfp-h-12 vfp-mx-auto vfp-mb-3 vfp-border-4 vfp-border-line-strong vfp-border-t-spinner-head vfp-rounded-full vfp-animate-spin" }, null, -1)),
|
|
83
|
+
m("p", q, S(z(b)("csv.loading")), 1)
|
|
84
|
+
])
|
|
85
|
+
])) : w("", !0),
|
|
86
|
+
a.value && !n.value ? (v(), C(F, {
|
|
87
|
+
key: 1,
|
|
88
|
+
message: a.value,
|
|
89
|
+
class: "vfp-absolute vfp-inset-0 vfp-bg-surface-toolbar vfp-backdrop-blur-sm vfp-z-10"
|
|
90
|
+
}, null, 8, ["message"])) : w("", !0),
|
|
91
|
+
a.value ? w("", !0) : (v(), h("div", {
|
|
92
|
+
key: 2,
|
|
93
|
+
ref_key: "containerRef",
|
|
94
|
+
ref: s,
|
|
95
|
+
class: "xlsx-spreadsheet-container vfp-w-full vfp-h-full",
|
|
96
|
+
style: N({ opacity: n.value ? 0 : 1 })
|
|
97
|
+
}, null, 4))
|
|
98
|
+
]));
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
export {
|
|
102
|
+
K as default
|
|
103
|
+
};
|
|
104
|
+
//# sourceMappingURL=index-B3-ezDVJ.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-B3-ezDVJ.mjs","sources":["../../src/renderers/Csv/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, watch, onMounted, onBeforeUnmount } from 'vue';\nimport Spreadsheet from 'x-data-spreadsheet';\nimport 'x-data-spreadsheet/dist/xspreadsheet.css';\nimport {\n parseCsv,\n guessCsvDelimiter,\n fetchTextUtf8,\n convertCsvToSpreadsheetData,\n} from '@eternalheart/file-preview-core';\nimport { useTranslator } from '../../composables/useTranslator';\nimport { useFetcher } from '../../composables/useRequest';\nimport RendererError from '../RendererError.vue';\n\nconst props = defineProps<{\n url: string;\n fileName: string;\n}>();\n\nconst { t } = useTranslator();\nconst fetcher = useFetcher();\n\nconst loading = ref(true);\nconst error = ref<string | null>(null);\nconst containerRef = ref<HTMLDivElement | null>(null);\nlet sheetData: Record<string, unknown>[] | null = null;\nlet resizeObserver: ResizeObserver | null = null;\nlet resizeTimeout: number | null = null;\nlet lastDimensions = { width: 0, height: 0 };\n\nconst calculateDimensions = () => {\n if (!containerRef.value) return { width: 800, height: 600 };\n const rawWidth = containerRef.value.clientWidth;\n const rawHeight = containerRef.value.clientHeight;\n const width = rawWidth > 100 ? rawWidth : 800;\n const height = rawHeight > 100 ? rawHeight : 600;\n return { width, height };\n};\n\nconst mountSpreadsheet = () => {\n if (!containerRef.value || !sheetData) return;\n\n containerRef.value.innerHTML = '';\n\n const { width, height } = calculateDimensions();\n const isMobile = width < 640;\n\n const s = new Spreadsheet(containerRef.value, {\n mode: 'read',\n showToolbar: false,\n showContextmenu: false,\n showGrid: true,\n row: {\n len: 100,\n height: 25,\n },\n col: {\n len: 26,\n width: isMobile ? 80 : 100,\n indexWidth: isMobile ? 40 : 60,\n minWidth: isMobile ? 40 : 60,\n },\n view: {\n height: () => height,\n width: () => width,\n },\n });\n\n s.loadData(sheetData as unknown as Record<string, unknown>);\n};\n\nconst loadCsv = async () => {\n if (!containerRef.value) return;\n\n loading.value = true;\n error.value = null;\n\n try {\n const text = await fetchTextUtf8(props.url, { fetcher: fetcher.value });\n const parsed = parseCsv(text, { delimiter: guessCsvDelimiter(props.fileName) });\n const data = convertCsvToSpreadsheetData(parsed.header, parsed.rows, props.fileName);\n\n sheetData = data as unknown as Record<string, unknown>[];\n mountSpreadsheet();\n loading.value = false;\n } catch (err) {\n console.error('CSV 解析错误:', err);\n error.value = t.value('csv.load_failed');\n loading.value = false;\n }\n};\n\nonMounted(() => {\n if (!containerRef.value) return;\n\n let isInitialRender = true;\n\n resizeObserver = new ResizeObserver(() => {\n if (isInitialRender) {\n isInitialRender = false;\n lastDimensions = calculateDimensions();\n return;\n }\n\n const newDimensions = calculateDimensions();\n const widthDiff = Math.abs(lastDimensions.width - newDimensions.width);\n const heightDiff = Math.abs(lastDimensions.height - newDimensions.height);\n\n if (widthDiff < 10 && heightDiff < 10) return;\n\n lastDimensions = newDimensions;\n\n if (resizeTimeout !== null) clearTimeout(resizeTimeout);\n\n resizeTimeout = window.setTimeout(() => {\n if (sheetData) mountSpreadsheet();\n }, 500);\n });\n\n resizeObserver.observe(containerRef.value);\n\n setTimeout(() => {\n requestAnimationFrame(() => loadCsv());\n }, 100);\n});\n\nwatch(\n () => props.url,\n () => {\n loadCsv();\n }\n);\n\nonBeforeUnmount(() => {\n if (resizeObserver) resizeObserver.disconnect();\n if (resizeTimeout !== null) clearTimeout(resizeTimeout);\n sheetData = null;\n if (containerRef.value) containerRef.value.innerHTML = '';\n});\n</script>\n\n<template>\n <div class=\"vfp-relative vfp-flex vfp-flex-col vfp-items-center vfp-w-full vfp-h-full\">\n <div\n v-if=\"loading\"\n class=\"vfp-absolute vfp-inset-0 vfp-flex vfp-items-center vfp-justify-center vfp-bg-surface-toolbar vfp-backdrop-blur-sm vfp-z-10\"\n >\n <div class=\"vfp-text-center\">\n <div\n class=\"vfp-w-10 vfp-h-10 md:vfp-w-12 md:vfp-h-12 vfp-mx-auto vfp-mb-3 vfp-border-4 vfp-border-line-strong vfp-border-t-spinner-head vfp-rounded-full vfp-animate-spin\"\n />\n <p class=\"vfp-text-xs md:vfp-text-sm vfp-text-fg-secondary vfp-font-medium\">{{ t('csv.loading') }}</p>\n </div>\n </div>\n\n <RendererError\n v-if=\"error && !loading\"\n :message=\"error\"\n class=\"vfp-absolute vfp-inset-0 vfp-bg-surface-toolbar vfp-backdrop-blur-sm vfp-z-10\"\n />\n\n <div\n v-if=\"!error\"\n ref=\"containerRef\"\n class=\"xlsx-spreadsheet-container vfp-w-full vfp-h-full\"\n :style=\"{ opacity: loading ? 0 : 1 }\"\n />\n </div>\n</template>\n"],"names":["props","__props","t","useTranslator","fetcher","useFetcher","loading","ref","error","containerRef","sheetData","resizeObserver","resizeTimeout","lastDimensions","calculateDimensions","rawWidth","rawHeight","width","height","mountSpreadsheet","isMobile","Spreadsheet","loadCsv","text","fetchTextUtf8","parsed","parseCsv","guessCsvDelimiter","convertCsvToSpreadsheetData","err","onMounted","isInitialRender","newDimensions","widthDiff","heightDiff","watch","onBeforeUnmount","_openBlock","_createElementBlock","_hoisted_1","_hoisted_2","_createElementVNode","_hoisted_3","_hoisted_4","_toDisplayString","_unref","_createBlock","RendererError"],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { defineComponent as y, ref as n, computed as _, watch as d, openBlock as e, createElementBlock as o, createElementVNode as m, createBlock as x, normalizeClass as h, toDisplayString as k } from "vue";
|
|
2
|
+
import { u as b, a as T, c as B, y as E, E as N, _ as H } from "./index-CQFN4h-t.mjs";
|
|
3
|
+
import { codeToHtml as W } from "shiki";
|
|
4
|
+
import { _ as C } from "./RendererError.vue_vue_type_script_setup_true_lang-CbgZBSDr.mjs";
|
|
5
|
+
const L = {
|
|
6
|
+
key: 0,
|
|
7
|
+
class: "vfp-flex vfp-items-center vfp-justify-center vfp-w-full vfp-h-full"
|
|
8
|
+
}, M = {
|
|
9
|
+
key: 2,
|
|
10
|
+
class: "vfp-w-full vfp-h-full vfp-bg-surface-toolbar"
|
|
11
|
+
}, P = ["srcdoc", "title"], j = {
|
|
12
|
+
key: 3,
|
|
13
|
+
class: "vfp-w-full vfp-h-full vfp-overflow-auto",
|
|
14
|
+
style: { background: "var(--fp-code-bg)" }
|
|
15
|
+
}, z = ["innerHTML"], D = /* @__PURE__ */ y({
|
|
16
|
+
__name: "index",
|
|
17
|
+
props: {
|
|
18
|
+
url: {},
|
|
19
|
+
fileName: {},
|
|
20
|
+
wordWrap: { type: Boolean, default: !0 },
|
|
21
|
+
htmlPreview: { type: Boolean, default: !1 }
|
|
22
|
+
},
|
|
23
|
+
setup(l) {
|
|
24
|
+
const u = l, { t: w } = b(), g = T(), c = B(), r = n(""), t = n(""), v = n(!0), s = n(null), f = _(() => E(u.fileName)), i = async () => {
|
|
25
|
+
v.value = !0, s.value = null;
|
|
26
|
+
try {
|
|
27
|
+
const a = await N(u.url, { fetcher: g.value });
|
|
28
|
+
if (r.value = a, f.value !== "text")
|
|
29
|
+
try {
|
|
30
|
+
t.value = await W(a, {
|
|
31
|
+
lang: f.value,
|
|
32
|
+
theme: c.value === "light" ? "github-light" : "dark-plus"
|
|
33
|
+
});
|
|
34
|
+
} catch {
|
|
35
|
+
t.value = "";
|
|
36
|
+
}
|
|
37
|
+
else
|
|
38
|
+
t.value = "";
|
|
39
|
+
} catch (a) {
|
|
40
|
+
console.error(a), s.value = w.value("text.load_failed");
|
|
41
|
+
} finally {
|
|
42
|
+
v.value = !1;
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
return d(() => u.url, i, { immediate: !0 }), d(c, () => {
|
|
46
|
+
r.value && f.value !== "text" && i();
|
|
47
|
+
}), (a, p) => v.value ? (e(), o("div", L, [...p[0] || (p[0] = [
|
|
48
|
+
m("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)
|
|
49
|
+
])])) : s.value ? (e(), x(C, {
|
|
50
|
+
key: 1,
|
|
51
|
+
message: s.value
|
|
52
|
+
}, null, 8, ["message"])) : l.htmlPreview && f.value === "html" ? (e(), o("div", M, [
|
|
53
|
+
m("iframe", {
|
|
54
|
+
srcdoc: r.value,
|
|
55
|
+
sandbox: "allow-same-origin",
|
|
56
|
+
class: "vfp-w-full vfp-h-full vfp-border-0",
|
|
57
|
+
title: l.fileName
|
|
58
|
+
}, null, 8, P)
|
|
59
|
+
])) : (e(), o("div", j, [
|
|
60
|
+
t.value ? (e(), o("div", {
|
|
61
|
+
key: 1,
|
|
62
|
+
class: h(["shiki-wrapper", { "no-wrap": !l.wordWrap }]),
|
|
63
|
+
innerHTML: t.value
|
|
64
|
+
}, null, 10, z)) : (e(), o("pre", {
|
|
65
|
+
key: 0,
|
|
66
|
+
class: h(["vfp-p-6 vfp-text-fg-primary vfp-font-mono vfp-text-sm", l.wordWrap ? "vfp-whitespace-pre-wrap vfp-break-words" : "vfp-whitespace-pre"])
|
|
67
|
+
}, k(r.value), 3))
|
|
68
|
+
]));
|
|
69
|
+
}
|
|
70
|
+
}), V = /* @__PURE__ */ H(D, [["__scopeId", "data-v-fd282330"]]);
|
|
71
|
+
export {
|
|
72
|
+
V as default
|
|
73
|
+
};
|
|
74
|
+
//# sourceMappingURL=index-B9RAbllH.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-B9RAbllH.mjs","sources":["../../src/renderers/Text/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, computed, watch } from 'vue';\nimport { getLanguageFromFileName, fetchTextUtf8 } from '@eternalheart/file-preview-core';\nimport { codeToHtml } from 'shiki';\nimport { useTranslator } from '../../composables/useTranslator';\nimport { useFetcher } from '../../composables/useRequest';\nimport { useResolvedTheme } from '../../composables/useResolvedTheme';\nimport RendererError from '../RendererError.vue';\n\nconst props = withDefaults(defineProps<{\n url: string;\n fileName: string;\n wordWrap?: boolean;\n htmlPreview?: boolean;\n}>(), {\n wordWrap: true,\n htmlPreview: false,\n});\n\nconst { t } = useTranslator();\nconst fetcher = useFetcher();\nconst resolvedTheme = useResolvedTheme();\n\nconst content = ref<string>('');\nconst highlighted = ref<string>('');\nconst loading = ref(true);\nconst error = ref<string | null>(null);\n\nconst language = computed(() => getLanguageFromFileName(props.fileName));\n\nconst loadText = async () => {\n loading.value = true;\n error.value = null;\n try {\n const text = await fetchTextUtf8(props.url, { fetcher: fetcher.value });\n content.value = text;\n\n if (language.value !== 'text') {\n try {\n highlighted.value = await codeToHtml(text, {\n lang: language.value,\n theme: resolvedTheme.value === 'light' ? 'github-light' : 'dark-plus',\n });\n } catch {\n highlighted.value = '';\n }\n } else {\n highlighted.value = '';\n }\n } catch (err) {\n console.error(err);\n error.value = t.value('text.load_failed');\n } finally {\n loading.value = false;\n }\n};\n\nwatch(() => props.url, loadText, { immediate: true });\nwatch(resolvedTheme, () => {\n // 主题切换时重新高亮\n if (content.value && language.value !== 'text') {\n loadText();\n }\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 <RendererError v-else-if=\"error\" :message=\"error\" />\n\n <!-- HTML 预览模式 -->\n <div v-else-if=\"htmlPreview && language === 'html'\" class=\"vfp-w-full vfp-h-full vfp-bg-surface-toolbar\">\n <iframe\n :srcdoc=\"content\"\n sandbox=\"allow-same-origin\"\n class=\"vfp-w-full vfp-h-full vfp-border-0\"\n :title=\"fileName\"\n />\n </div>\n\n <!-- 源码模式 -->\n <div v-else class=\"vfp-w-full vfp-h-full vfp-overflow-auto\" style=\"background: var(--fp-code-bg);\">\n <pre\n v-if=\"!highlighted\"\n class=\"vfp-p-6 vfp-text-fg-primary vfp-font-mono vfp-text-sm\"\n :class=\"wordWrap ? 'vfp-whitespace-pre-wrap vfp-break-words' : 'vfp-whitespace-pre'\"\n >{{ content }}</pre>\n <div v-else class=\"shiki-wrapper\" :class=\"{ 'no-wrap': !wordWrap }\" v-html=\"highlighted\" />\n </div>\n</template>\n\n<style scoped>\n.shiki-wrapper :deep(pre) {\n margin: 0;\n padding: 1.5rem 1.5rem 1.5rem 0;\n background: transparent !important;\n font-size: 0.875rem;\n overflow-x: auto;\n}\n.shiki-wrapper :deep(code) {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n counter-reset: line;\n}\n.shiki-wrapper :deep(code .line) {\n counter-increment: line;\n}\n.shiki-wrapper :deep(code .line::before) {\n content: counter(line);\n display: inline-block;\n width: 3em;\n padding-right: 1em;\n margin-right: 0.5em;\n text-align: right;\n color: var(--fp-fg-disabled);\n user-select: none;\n border-right: 1px solid var(--fp-line);\n}\n.shiki-wrapper.no-wrap :deep(code) {\n white-space: pre;\n word-break: normal;\n overflow-wrap: normal;\n}\n.shiki-wrapper:not(.no-wrap) :deep(code) {\n white-space: pre-wrap;\n word-break: break-word;\n overflow-wrap: break-word;\n}\n</style>\n"],"names":["props","__props","t","useTranslator","fetcher","useFetcher","resolvedTheme","useResolvedTheme","content","ref","highlighted","loading","error","language","computed","getLanguageFromFileName","loadText","text","fetchTextUtf8","codeToHtml","err","watch","_openBlock","_createElementBlock","_hoisted_1","_cache","_createElementVNode","_createBlock","RendererError","_hoisted_2","_hoisted_4","_normalizeClass"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AASA,UAAMA,IAAQC,GAUR,EAAE,GAAAC,EAAA,IAAMC,EAAA,GACRC,IAAUC,EAAA,GACVC,IAAgBC,EAAA,GAEhBC,IAAUC,EAAY,EAAE,GACxBC,IAAcD,EAAY,EAAE,GAC5BE,IAAUF,EAAI,EAAI,GAClBG,IAAQH,EAAmB,IAAI,GAE/BI,IAAWC,EAAS,MAAMC,EAAwBf,EAAM,QAAQ,CAAC,GAEjEgB,IAAW,YAAY;AAC3B,MAAAL,EAAQ,QAAQ,IAChBC,EAAM,QAAQ;AACd,UAAI;AACF,cAAMK,IAAO,MAAMC,EAAclB,EAAM,KAAK,EAAE,SAASI,EAAQ,OAAO;AAGtE,YAFAI,EAAQ,QAAQS,GAEZJ,EAAS,UAAU;AACrB,cAAI;AACF,YAAAH,EAAY,QAAQ,MAAMS,EAAWF,GAAM;AAAA,cACzC,MAAMJ,EAAS;AAAA,cACf,OAAOP,EAAc,UAAU,UAAU,iBAAiB;AAAA,YAAA,CAC3D;AAAA,UACH,QAAQ;AACN,YAAAI,EAAY,QAAQ;AAAA,UACtB;AAAA;AAEA,UAAAA,EAAY,QAAQ;AAAA,MAExB,SAASU,GAAK;AACZ,gBAAQ,MAAMA,CAAG,GACjBR,EAAM,QAAQV,EAAE,MAAM,kBAAkB;AAAA,MAC1C,UAAA;AACE,QAAAS,EAAQ,QAAQ;AAAA,MAClB;AAAA,IACF;AAEA,WAAAU,EAAM,MAAMrB,EAAM,KAAKgB,GAAU,EAAE,WAAW,IAAM,GACpDK,EAAMf,GAAe,MAAM;AAEzB,MAAIE,EAAQ,SAASK,EAAS,UAAU,UACtCG,EAAA;AAAA,IAEJ,CAAC,aAIYL,EAAA,SAAXW,EAAA,GAAAC,EAIM,OAJNC,GAIM,CAAA,GAAAC,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,MAHJC,EAEE,OAAA,EADA,OAAM,oHAAA,GAAmH,MAAA,EAAA;AAAA,IAAA,QAInGd,EAAA,cAA1Be,EAAoDC,GAAA;AAAA;MAAlB,SAAShB,EAAA;AAAA,IAAA,4BAG3BX,EAAA,eAAeY,EAAA,UAAQ,UAAvCS,EAAA,GAAAC,EAOM,OAPNM,GAOM;AAAA,MANJH,EAKE,UAAA;AAAA,QAJC,QAAQlB,EAAA;AAAA,QACT,SAAQ;AAAA,QACR,OAAM;AAAA,QACL,OAAOP,EAAA;AAAA,MAAA;WAKZqB,EAAA,GAAAC,EAOM,OAPNO,GAOM;AAAA,MALKpB,EAAA,cAITa,EAA2F,OAAA;AAAA;QAA/E,OAAKQ,EAAA,CAAC,iBAAe,EAAA,WAAA,CAAuB9B,EAAA,SAAA,CAAQ,CAAA;AAAA,QAAI,WAAQS,EAAA;AAAA,MAAA,yBAL5Ea,EAIoB,OAAA;AAAA;QAFlB,OAAKQ,EAAA,CAAC,yDACE9B,EAAA,WAAQ,4CAAA,oBAAA,CAAA;AAAA,MAAA,KACdO,EAAA,KAAO,GAAA,CAAA;AAAA;;;"}
|
|
@@ -1,39 +1,36 @@
|
|
|
1
|
-
import { defineComponent as
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import { codeToHtml as
|
|
5
|
-
import { u as
|
|
6
|
-
import "
|
|
7
|
-
const
|
|
1
|
+
import { defineComponent as A, computed as G, ref as s, watch as y, nextTick as I, openBlock as c, createElementBlock as d, createElementVNode as _, createBlock as P, toDisplayString as D } from "vue";
|
|
2
|
+
import K from "markdown-it";
|
|
3
|
+
import O from "@traptitech/markdown-it-katex";
|
|
4
|
+
import { codeToHtml as H } from "shiki";
|
|
5
|
+
import { u as R, a as N, c as Y, E as F, _ as W } from "./index-CQFN4h-t.mjs";
|
|
6
|
+
import { _ as z } from "./RendererError.vue_vue_type_script_setup_true_lang-CbgZBSDr.mjs";
|
|
7
|
+
const J = {
|
|
8
8
|
key: 0,
|
|
9
9
|
class: "vfp-flex vfp-items-center vfp-justify-center vfp-w-full vfp-h-full"
|
|
10
|
-
},
|
|
11
|
-
key: 1,
|
|
12
|
-
class: "vfp-flex vfp-items-center vfp-justify-center vfp-w-full vfp-h-full"
|
|
13
|
-
}, J = { class: "vfp-text-fg-secondary vfp-text-center" }, Q = { class: "vfp-text-lg" }, U = {
|
|
10
|
+
}, Q = {
|
|
14
11
|
key: 2,
|
|
15
12
|
class: "vfp-w-full vfp-h-full vfp-overflow-auto",
|
|
16
13
|
style: { background: "var(--fp-code-bg)" }
|
|
17
|
-
},
|
|
14
|
+
}, U = {
|
|
18
15
|
key: 0,
|
|
19
16
|
class: "vfp-p-6 vfp-text-fg-primary vfp-font-mono vfp-text-sm vfp-whitespace-pre-wrap vfp-break-words"
|
|
20
|
-
},
|
|
17
|
+
}, X = ["innerHTML"], Z = {
|
|
21
18
|
key: 3,
|
|
22
19
|
class: "vfp-w-full vfp-h-full vfp-overflow-auto vfp-p-6 md:vfp-p-10"
|
|
23
|
-
},
|
|
20
|
+
}, ee = { class: "vfp-max-w-full md:vfp-max-w-4xl vfp-mx-auto" }, te = ["innerHTML"], E = '<svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect width="14" height="14" x="8" y="8" rx="2" ry="2"/><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"/></svg>', B = '<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect width="14" height="14" x="8" y="8" rx="2" ry="2"/><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"/></svg>', oe = '<svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M20 6 9 17l-5-5"/></svg>', re = '<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M20 6 9 17l-5-5"/></svg>', ne = /* @__PURE__ */ A({
|
|
24
21
|
__name: "index",
|
|
25
22
|
props: {
|
|
26
23
|
url: {},
|
|
27
24
|
viewMode: {}
|
|
28
25
|
},
|
|
29
26
|
setup(b) {
|
|
30
|
-
const x = b, { t:
|
|
27
|
+
const x = b, { t: i } = R(), L = N(), q = Y(), k = G(() => q.value === "light" ? "github-light" : "github-dark"), g = s(""), p = s(""), u = s(""), v = s(!0), f = s(null), h = s(null), l = new K({
|
|
31
28
|
html: !0,
|
|
32
29
|
linkify: !0,
|
|
33
30
|
typographer: !1,
|
|
34
31
|
breaks: !1
|
|
35
32
|
});
|
|
36
|
-
l.use(
|
|
33
|
+
l.use(O), l.renderer.rules.fence = (o, r) => {
|
|
37
34
|
const e = o[r], n = e.info ? e.info.trim() : "", t = e.content;
|
|
38
35
|
return n ? `<div class="code-block-wrapper">
|
|
39
36
|
<div class="code-block-header">
|
|
@@ -51,24 +48,24 @@ const W = {
|
|
|
51
48
|
};
|
|
52
49
|
const V = l.renderer.rules.table_open || ((o, r, e, n, t) => t.renderToken(o, r, e));
|
|
53
50
|
l.renderer.rules.table_open = (o, r, e, n, t) => '<div class="table-wrapper">' + V(o, r, e, n, t);
|
|
54
|
-
const
|
|
55
|
-
l.renderer.rules.table_close = (o, r, e, n, t) =>
|
|
51
|
+
const j = l.renderer.rules.table_close || ((o, r, e, n, t) => t.renderToken(o, r, e));
|
|
52
|
+
l.renderer.rules.table_close = (o, r, e, n, t) => j(o, r, e, n, t) + "</div>";
|
|
56
53
|
const C = async () => {
|
|
57
|
-
|
|
54
|
+
v.value = !0, f.value = null;
|
|
58
55
|
try {
|
|
59
|
-
const o = await
|
|
60
|
-
|
|
56
|
+
const o = await F(x.url, { fetcher: L.value });
|
|
57
|
+
g.value = o, p.value = l.render(o), v.value = !1;
|
|
61
58
|
try {
|
|
62
|
-
|
|
59
|
+
u.value = await H(o, { lang: "markdown", theme: k.value });
|
|
63
60
|
} catch {
|
|
64
|
-
|
|
61
|
+
u.value = "";
|
|
65
62
|
}
|
|
66
63
|
} catch (o) {
|
|
67
|
-
console.error(o),
|
|
64
|
+
console.error(o), f.value = i.value("markdown.load_failed"), v.value = !1;
|
|
68
65
|
}
|
|
69
66
|
}, M = (o, r) => {
|
|
70
67
|
const e = document.createElement("button");
|
|
71
|
-
return e.type = "button", e.className = r ? "code-copy-btn" : "code-copy-btn code-copy-float", e.title =
|
|
68
|
+
return e.type = "button", e.className = r ? "code-copy-btn" : "code-copy-btn code-copy-float", e.title = i.value("markdown.copy_code"), e.innerHTML = r ? E : B, e.addEventListener("click", async (n) => {
|
|
72
69
|
n.stopPropagation();
|
|
73
70
|
try {
|
|
74
71
|
await navigator.clipboard.writeText(o);
|
|
@@ -76,61 +73,60 @@ const W = {
|
|
|
76
73
|
const t = document.createElement("textarea");
|
|
77
74
|
t.value = o, document.body.appendChild(t), t.select(), document.execCommand("copy"), document.body.removeChild(t);
|
|
78
75
|
}
|
|
79
|
-
e.innerHTML = r ?
|
|
80
|
-
e.innerHTML = r ?
|
|
76
|
+
e.innerHTML = r ? oe : re, e.title = i.value("markdown.copied"), setTimeout(() => {
|
|
77
|
+
e.innerHTML = r ? E : B, e.title = i.value("markdown.copy_code");
|
|
81
78
|
}, 2e3);
|
|
82
79
|
}), e;
|
|
83
80
|
}, $ = async () => {
|
|
84
81
|
var e, n;
|
|
85
|
-
if (!
|
|
86
|
-
const o =
|
|
82
|
+
if (!h.value) return;
|
|
83
|
+
const o = h.value.querySelectorAll('pre[data-shiki-pending="1"]');
|
|
87
84
|
for (const t of o) {
|
|
88
|
-
const
|
|
85
|
+
const m = t.getAttribute("data-lang") || "text", a = ((e = t.querySelector("code")) == null ? void 0 : e.textContent) || "";
|
|
89
86
|
try {
|
|
90
|
-
const
|
|
91
|
-
T.innerHTML =
|
|
87
|
+
const w = await H(a, { lang: m, theme: k.value }), T = document.createElement("div");
|
|
88
|
+
T.innerHTML = w;
|
|
92
89
|
const S = T.firstElementChild;
|
|
93
90
|
S && t.replaceWith(S);
|
|
94
91
|
} catch {
|
|
95
92
|
t.style.backgroundColor = "var(--fp-code-bg)", t.removeAttribute("data-shiki-pending");
|
|
96
93
|
}
|
|
97
94
|
}
|
|
98
|
-
const r =
|
|
95
|
+
const r = h.value.querySelectorAll(".code-block-wrapper");
|
|
99
96
|
for (const t of r) {
|
|
100
97
|
if (t.querySelector(".code-copy-btn")) continue;
|
|
101
|
-
const
|
|
102
|
-
|
|
98
|
+
const m = t.querySelector(".code-block-header"), a = t.querySelector("pre"), w = ((n = a == null ? void 0 : a.querySelector("code")) == null ? void 0 : n.textContent) ?? (a == null ? void 0 : a.textContent) ?? "";
|
|
99
|
+
m ? m.appendChild(M(w, !0)) : t.appendChild(M(w, !1));
|
|
103
100
|
}
|
|
104
101
|
};
|
|
105
|
-
return
|
|
106
|
-
|
|
107
|
-
}),
|
|
108
|
-
|
|
109
|
-
}), (o, r) =>
|
|
110
|
-
|
|
111
|
-
])])) :
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
v.value ? (a(), d("div", {
|
|
102
|
+
return y(() => x.url, C, { immediate: !0 }), y(p, async () => {
|
|
103
|
+
p.value && (await I(), $());
|
|
104
|
+
}), y(k, () => {
|
|
105
|
+
g.value && C();
|
|
106
|
+
}), (o, r) => v.value ? (c(), d("div", J, [...r[0] || (r[0] = [
|
|
107
|
+
_("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)
|
|
108
|
+
])])) : f.value ? (c(), P(z, {
|
|
109
|
+
key: 1,
|
|
110
|
+
message: f.value
|
|
111
|
+
}, null, 8, ["message"])) : b.viewMode === "source" ? (c(), d("div", Q, [
|
|
112
|
+
u.value ? (c(), d("div", {
|
|
117
113
|
key: 1,
|
|
118
114
|
class: "shiki-wrapper",
|
|
119
|
-
innerHTML:
|
|
120
|
-
}, null, 8,
|
|
121
|
-
])) : (
|
|
122
|
-
|
|
123
|
-
|
|
115
|
+
innerHTML: u.value
|
|
116
|
+
}, null, 8, X)) : (c(), d("pre", U, D(g.value), 1))
|
|
117
|
+
])) : (c(), d("div", Z, [
|
|
118
|
+
_("div", ee, [
|
|
119
|
+
_("div", {
|
|
124
120
|
ref_key: "containerRef",
|
|
125
|
-
ref:
|
|
121
|
+
ref: h,
|
|
126
122
|
class: "markdown-body",
|
|
127
|
-
innerHTML:
|
|
128
|
-
}, null, 8,
|
|
123
|
+
innerHTML: p.value
|
|
124
|
+
}, null, 8, te)
|
|
129
125
|
])
|
|
130
126
|
]));
|
|
131
127
|
}
|
|
132
|
-
}),
|
|
128
|
+
}), pe = /* @__PURE__ */ W(ne, [["__scopeId", "data-v-c412a92f"]]);
|
|
133
129
|
export {
|
|
134
|
-
|
|
130
|
+
pe as default
|
|
135
131
|
};
|
|
136
|
-
//# sourceMappingURL=index-
|
|
132
|
+
//# sourceMappingURL=index-BA-SUKkf.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-BA-SUKkf.mjs","sources":["../../src/renderers/Markdown/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, computed, watch, nextTick } from 'vue';\nimport MarkdownIt from 'markdown-it';\nimport MarkdownItKatex from '@traptitech/markdown-it-katex';\nimport { codeToHtml } from 'shiki';\nimport { fetchTextUtf8 } from '@eternalheart/file-preview-core';\nimport { useTranslator } from '../../composables/useTranslator';\nimport { useFetcher } from '../../composables/useRequest';\nimport { useResolvedTheme } from '../../composables/useResolvedTheme';\nimport RendererError from '../RendererError.vue';\nimport 'katex/dist/katex.min.css';\n\nconst props = defineProps<{\n url: string;\n viewMode?: 'preview' | 'source';\n}>();\n\nconst { t } = useTranslator();\nconst fetcher = useFetcher();\nconst resolvedTheme = useResolvedTheme();\nconst shikiTheme = computed(() => (resolvedTheme.value === 'light' ? 'github-light' : 'github-dark'));\n\nconst content = ref('');\nconst html = ref('');\nconst highlightedSource = ref('');\nconst loading = ref(true);\nconst error = ref<string | null>(null);\nconst containerRef = ref<HTMLDivElement | null>(null);\n\n// 创建 markdown-it 实例(支持 GFM 表格、删除线、任务列表、HTML、数学公式)\nconst md = new MarkdownIt({\n html: true,\n linkify: true,\n typographer: false,\n breaks: false,\n});\nmd.use(MarkdownItKatex);\n\n// 自定义代码块渲染:包裹 code-block-wrapper + header(不含复制按钮,由 JS 动态注入)\nmd.renderer.rules.fence = (tokens, idx) => {\n const token = tokens[idx];\n const info = token.info ? token.info.trim() : '';\n const code = token.content;\n\n if (!info) {\n return `<div class=\"code-block-wrapper\">\n <pre class=\"no-lang-pre\"><code>${md.utils.escapeHtml(code)}</code></pre>\n </div>`;\n }\n\n return `<div class=\"code-block-wrapper\">\n <div class=\"code-block-header\">\n <span>${info}</span>\n </div>\n <pre data-shiki-pending=\"1\" data-lang=\"${info}\"><code>${md.utils.escapeHtml(code)}</code></pre>\n </div>`;\n};\n\n// 4-space 缩进代码块:同样包裹 code-block-wrapper(无头,注入浮动复制按钮)\nmd.renderer.rules.code_block = (tokens, idx) => {\n const code = tokens[idx].content;\n return `<div class=\"code-block-wrapper\">\n <pre class=\"no-lang-pre\"><code>${md.utils.escapeHtml(code)}</code></pre>\n </div>`;\n};\n\n// 表格添加包裹层(用于横向滚动)\nconst defaultTableOpen =\n md.renderer.rules.table_open ||\n ((tokens, idx, options, _env, self) => self.renderToken(tokens, idx, options));\nmd.renderer.rules.table_open = (tokens, idx, options, env, self) => {\n return '<div class=\"table-wrapper\">' + defaultTableOpen(tokens, idx, options, env, self);\n};\nconst defaultTableClose =\n md.renderer.rules.table_close ||\n ((tokens, idx, options, _env, self) => self.renderToken(tokens, idx, options));\nmd.renderer.rules.table_close = (tokens, idx, options, env, self) => {\n return defaultTableClose(tokens, idx, options, env, self) + '</div>';\n};\n\nconst loadMarkdown = async () => {\n loading.value = true;\n error.value = null;\n try {\n const text = await fetchTextUtf8(props.url, { fetcher: fetcher.value });\n content.value = text;\n html.value = md.render(text);\n loading.value = false;\n // 异步生成源码高亮(不阻塞预览渲染)\n try {\n highlightedSource.value = await codeToHtml(text, { lang: 'markdown', theme: shikiTheme.value });\n } catch {\n highlightedSource.value = '';\n }\n } catch (err) {\n console.error(err);\n error.value = t.value('markdown.load_failed');\n loading.value = false;\n }\n};\n\nconst COPY_SVG_SM = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg>`;\nconst COPY_SVG_MD = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg>`;\nconst CHECK_SVG_SM = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20 6 9 17l-5-5\"/></svg>`;\nconst CHECK_SVG_MD = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20 6 9 17l-5-5\"/></svg>`;\n\nconst createCopyButton = (code: string, inline: boolean): HTMLButtonElement => {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = inline ? 'code-copy-btn' : 'code-copy-btn code-copy-float';\n btn.title = t.value('markdown.copy_code');\n btn.innerHTML = inline ? COPY_SVG_SM : COPY_SVG_MD;\n btn.addEventListener('click', async (e) => {\n e.stopPropagation();\n try {\n await navigator.clipboard.writeText(code);\n } catch {\n const ta = document.createElement('textarea');\n ta.value = code;\n document.body.appendChild(ta);\n ta.select();\n document.execCommand('copy');\n document.body.removeChild(ta);\n }\n btn.innerHTML = inline ? CHECK_SVG_SM : CHECK_SVG_MD;\n btn.title = t.value('markdown.copied');\n setTimeout(() => {\n btn.innerHTML = inline ? COPY_SVG_SM : COPY_SVG_MD;\n btn.title = t.value('markdown.copy_code');\n }, 2000);\n });\n return btn;\n};\n\nconst highlightAndInjectCopyButtons = async () => {\n if (!containerRef.value) return;\n\n // 1. shiki 高亮有语言的代码块\n const pending = containerRef.value.querySelectorAll<HTMLPreElement>('pre[data-shiki-pending=\"1\"]');\n for (const pre of pending) {\n const lang = pre.getAttribute('data-lang') || 'text';\n const code = pre.querySelector('code')?.textContent || '';\n try {\n const highlighted = await codeToHtml(code, { lang, theme: shikiTheme.value });\n const tmp = document.createElement('div');\n tmp.innerHTML = highlighted;\n const newPre = tmp.firstElementChild as HTMLElement;\n if (newPre) pre.replaceWith(newPre);\n } catch {\n pre.style.backgroundColor = 'var(--fp-code-bg)';\n pre.removeAttribute('data-shiki-pending');\n }\n }\n\n // 2. 为所有代码块注入复制按钮(避免重复注入)\n const wrappers = containerRef.value.querySelectorAll<HTMLElement>('.code-block-wrapper');\n for (const wrapper of wrappers) {\n if (wrapper.querySelector('.code-copy-btn')) continue;\n const header = wrapper.querySelector('.code-block-header');\n const pre = wrapper.querySelector('pre');\n const code = pre?.querySelector('code')?.textContent ?? pre?.textContent ?? '';\n if (header) {\n // 有语言:按钮放入 header 右侧\n header.appendChild(createCopyButton(code, true));\n } else {\n // 无语言:浮动按钮\n wrapper.appendChild(createCopyButton(code, false));\n }\n }\n};\n\nwatch(() => props.url, loadMarkdown, { immediate: true });\n\nwatch(html, async () => {\n if (!html.value) return;\n await nextTick();\n highlightAndInjectCopyButtons();\n});\n\n// 主题切换时重新加载(让 shiki 用新主题重新高亮)\nwatch(shikiTheme, () => {\n if (content.value) loadMarkdown();\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 <RendererError v-else-if=\"error\" :message=\"error\" />\n\n <!-- 源码视图 -->\n <div v-else-if=\"viewMode === 'source'\" class=\"vfp-w-full vfp-h-full vfp-overflow-auto\" style=\"background: var(--fp-code-bg);\">\n <pre\n v-if=\"!highlightedSource\"\n class=\"vfp-p-6 vfp-text-fg-primary vfp-font-mono vfp-text-sm vfp-whitespace-pre-wrap vfp-break-words\"\n >{{ content }}</pre\n >\n <div v-else class=\"shiki-wrapper\" v-html=\"highlightedSource\" />\n </div>\n\n <!-- 预览视图 -->\n <div v-else class=\"vfp-w-full vfp-h-full vfp-overflow-auto vfp-p-6 md:vfp-p-10\">\n <div class=\"vfp-max-w-full md:vfp-max-w-4xl vfp-mx-auto\">\n <div ref=\"containerRef\" class=\"markdown-body\" v-html=\"html\" />\n </div>\n </div>\n</template>\n\n<style scoped>\n.markdown-body :deep(.table-wrapper) {\n overflow-x: auto;\n margin: 1rem 0;\n border-radius: 0.375rem;\n border: 1px solid var(--fp-surface-3);\n}\n.markdown-body :deep(.table-wrapper > table) {\n margin: 0;\n border: 0;\n border-radius: 0;\n}\n/* shiki 生成的 pre:修正在 code-block-wrapper 内的边距与圆角 */\n.markdown-body :deep(.code-block-wrapper pre.shiki) {\n margin: 0;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n border-top: 0;\n}\n/* 无语言代码块:pre 不裁剪,让浮动按钮可见 */\n.markdown-body :deep(.code-block-wrapper) {\n overflow: visible;\n}\n.markdown-body :deep(.code-block-wrapper pre) {\n overflow: visible;\n}\n/* 无语言代码块纯文本样式 */\n.markdown-body :deep(.no-lang-pre) {\n margin: 0;\n padding: 1rem;\n background: var(--fp-code-bg);\n border-radius: 0.375rem;\n border: 1px solid var(--fp-line);\n}\n.markdown-body :deep(.no-lang-pre code) {\n display: block;\n font-size: 0.8125rem;\n line-height: 1.5;\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n color: var(--fp-fg-primary);\n white-space: pre;\n overflow-x: auto;\n}\n/* shiki 生成的 code:补充 padding,使代码有适当内边距 */\n.markdown-body :deep(pre.shiki code) {\n display: block;\n padding: 1rem;\n font-size: 0.8125rem;\n line-height: 1.5;\n overflow-x: auto;\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n}\n/* KaTeX 公式颜色适配暗色背景 */\n.markdown-body :deep(.katex) {\n color: var(--fp-fg-primary);\n}\n.markdown-body :deep(.katex-display) {\n margin: 1.25rem 0;\n overflow-x: auto;\n overflow-y: hidden;\n}\n/* 源码视图 shiki */\n.shiki-wrapper :deep(pre) {\n margin: 0;\n padding: 1.5rem;\n background: transparent !important;\n font-size: 0.875rem;\n overflow-x: auto;\n}\n.shiki-wrapper :deep(code) {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n}\n</style>\n"],"names":["COPY_SVG_SM","COPY_SVG_MD","CHECK_SVG_SM","CHECK_SVG_MD","props","__props","t","useTranslator","fetcher","useFetcher","resolvedTheme","useResolvedTheme","shikiTheme","computed","content","ref","html","highlightedSource","loading","error","containerRef","md","MarkdownIt","MarkdownItKatex","tokens","idx","token","info","code","defaultTableOpen","options","_env","self","env","defaultTableClose","loadMarkdown","text","fetchTextUtf8","codeToHtml","err","createCopyButton","inline","btn","e","ta","highlightAndInjectCopyButtons","pending","pre","lang","_a","highlighted","tmp","newPre","wrappers","wrapper","header","_b","watch","nextTick","_openBlock","_createElementBlock","_hoisted_1","_cache","_createElementVNode","_createBlock","RendererError","_hoisted_2","_hoisted_3","_toDisplayString","_hoisted_5","_hoisted_6"],"mappings":"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"}
|