@4399ywkf/editor 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,55 @@
1
+ import { useRef, useState, useEffect } from 'react';
2
+ import { jsx } from 'react/jsx-runtime';
3
+
4
+ // src/views/PdfView.tsx
5
+ function PdfView({ source, className, onReady, onError }) {
6
+ const hostRef = useRef(null);
7
+ const [pages, setPages] = useState(0);
8
+ useEffect(() => {
9
+ let cancelled = false;
10
+ const host = hostRef.current;
11
+ if (!host || !source) return;
12
+ (async () => {
13
+ try {
14
+ const pdfjs = await import('pdfjs-dist');
15
+ const gs = pdfjs.GlobalWorkerOptions;
16
+ if (gs && !gs.workerSrc) {
17
+ gs.workerSrc = new URL("pdfjs-dist/build/pdf.worker.min.mjs", import.meta.url).toString();
18
+ }
19
+ const data = typeof source === "string" ? source : new Uint8Array(await source.arrayBuffer());
20
+ const doc = await pdfjs.getDocument(typeof data === "string" ? data : { data }).promise;
21
+ if (cancelled) return;
22
+ const d = doc;
23
+ setPages(d.numPages);
24
+ host.replaceChildren();
25
+ for (let i = 1; i <= d.numPages; i++) {
26
+ const page = await d.getPage(i);
27
+ if (cancelled) return;
28
+ const viewport = page.getViewport({ scale: 1.5 });
29
+ const canvas = document.createElement("canvas");
30
+ canvas.width = viewport.width;
31
+ canvas.height = viewport.height;
32
+ canvas.style.cssText = "display:block;margin:0 auto 16px;max-width:100%;height:auto";
33
+ host.appendChild(canvas);
34
+ await page.render({ canvasContext: canvas.getContext("2d"), viewport }).promise;
35
+ }
36
+ onReady?.(doc);
37
+ } catch (e) {
38
+ const err = e instanceof Error ? e : new Error(String(e));
39
+ onError?.(
40
+ new Error(
41
+ `PDF 预览失败:${err.message}。请确认已安装可选依赖 pdfjs-dist(pnpm add pdfjs-dist)`
42
+ )
43
+ );
44
+ }
45
+ })();
46
+ return () => {
47
+ cancelled = true;
48
+ };
49
+ }, [source, onReady, onError]);
50
+ return /* @__PURE__ */ jsx("div", { ref: hostRef, className, "data-pdf-pages": pages });
51
+ }
52
+
53
+ export { PdfView };
54
+ //# sourceMappingURL=chunk-IRALXCLP.js.map
55
+ //# sourceMappingURL=chunk-IRALXCLP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/views/PdfView.tsx"],"names":[],"mappings":";;;;AAUe,SAAR,QAAyB,EAAE,MAAA,EAAQ,SAAA,EAAW,OAAA,EAAS,SAAQ,EAAsB;AAC1F,EAAA,MAAM,OAAA,GAAU,OAAuB,IAAI,CAAA;AAC3C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAS,CAAC,CAAA;AAEpC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,MAAM,OAAO,OAAA,CAAQ,OAAA;AACrB,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,MAAA,EAAQ;AAErB,IAAA,CAAC,YAAY;AACZ,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,GAAQ,MAAM,OAAO,YAAY,CAAA;AAEvC,QAAA,MAAM,KAAM,KAAA,CAA0D,mBAAA;AACtE,QAAA,IAAI,EAAA,IAAM,CAAC,EAAA,CAAG,SAAA,EAAW;AACvB,UAAA,EAAA,CAAG,YAAY,IAAI,GAAA,CAAI,uCAAuC,MAAA,CAAA,IAAA,CAAY,GAAG,EAAE,QAAA,EAAS;AAAA,QAC1F;AAEA,QAAA,MAAM,IAAA,GACJ,OAAO,MAAA,KAAW,QAAA,GAAW,MAAA,GAAS,IAAI,UAAA,CAAW,MAAO,MAAA,CAAgB,WAAA,EAAa,CAAA;AAC3F,QAAA,MAAM,GAAA,GAAM,MAAO,KAAA,CAChB,WAAA,CAAY,OAAO,IAAA,KAAS,QAAA,GAAW,IAAA,GAAO,EAAE,IAAA,EAAM,CAAA,CACtD,OAAA;AACH,QAAA,IAAI,SAAA,EAAW;AAEf,QAAA,MAAM,CAAA,GAAI,GAAA;AACV,QAAA,QAAA,CAAS,EAAE,QAAQ,CAAA;AACnB,QAAA,IAAA,CAAK,eAAA,EAAgB;AAErB,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,CAAA,CAAE,UAAU,CAAA,EAAA,EAAK;AACpC,UAAA,MAAM,IAAA,GAAQ,MAAM,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA;AAI/B,UAAA,IAAI,SAAA,EAAW;AACf,UAAA,MAAM,WAAW,IAAA,CAAK,WAAA,CAAY,EAAE,KAAA,EAAO,KAAK,CAAA;AAChD,UAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,UAAA,MAAA,CAAO,QAAQ,QAAA,CAAS,KAAA;AACxB,UAAA,MAAA,CAAO,SAAS,QAAA,CAAS,MAAA;AACzB,UAAA,MAAA,CAAO,MAAM,OAAA,GAAU,6DAAA;AACvB,UAAA,IAAA,CAAK,YAAY,MAAM,CAAA;AACvB,UAAA,MAAM,IAAA,CAAK,MAAA,CAAO,EAAE,aAAA,EAAe,MAAA,CAAO,WAAW,IAAI,CAAA,EAAG,QAAA,EAAU,CAAA,CAAE,OAAA;AAAA,QAC1E;AACA,QAAA,OAAA,GAAU,GAAG,CAAA;AAAA,MACf,SAAS,CAAA,EAAG;AACV,QAAA,MAAM,GAAA,GAAM,aAAa,KAAA,GAAQ,CAAA,GAAI,IAAI,KAAA,CAAM,MAAA,CAAO,CAAC,CAAC,CAAA;AACxD,QAAA,OAAA;AAAA,UACE,IAAI,KAAA;AAAA,YACF,CAAA,SAAA,EAAY,IAAI,OAAO,CAAA,2CAAA;AAAA;AAEzB,SACF;AAAA,MACF;AAAA,IACF,CAAA,GAAG;AAEH,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,OAAA,EAAS,OAAO,CAAC,CAAA;AAE7B,EAAA,2BAAQ,KAAA,EAAA,EAAI,GAAA,EAAK,OAAA,EAAS,SAAA,EAAsB,kBAAgB,KAAA,EAAO,CAAA;AACzE","file":"chunk-IRALXCLP.js","sourcesContent":["import { useEffect, useRef, useState } from \"react\"\nimport type { DocumentViewProps } from \"../registry\"\n\n/**\n * pdf 通道:pdf.js 只读预览。\n *\n * 刻意只做「看」。PDF 编辑是 OOXML 引擎那一档(OnlyOffice / Collabora)的事,\n * 不该混进语义编辑器 —— 这也是腾讯把本地文件、在线文档、生成内容分成三条\n * 通道的原因:看和改本来就是两件事。\n */\nexport default function PdfView({ source, className, onReady, onError }: DocumentViewProps) {\n const hostRef = useRef<HTMLDivElement>(null)\n const [pages, setPages] = useState(0)\n\n useEffect(() => {\n let cancelled = false\n const host = hostRef.current\n if (!host || !source) return\n\n ;(async () => {\n try {\n const pdfjs = await import(\"pdfjs-dist\")\n // worker 必须由宿主提供路径,包内不硬编码 CDN\n const gs = (pdfjs as { GlobalWorkerOptions?: { workerSrc: string } }).GlobalWorkerOptions\n if (gs && !gs.workerSrc) {\n gs.workerSrc = new URL(\"pdfjs-dist/build/pdf.worker.min.mjs\", import.meta.url).toString()\n }\n\n const data =\n typeof source === \"string\" ? source : new Uint8Array(await (source as Blob).arrayBuffer())\n const doc = await (pdfjs as { getDocument: (s: unknown) => { promise: Promise<unknown> } })\n .getDocument(typeof data === \"string\" ? data : { data })\n .promise\n if (cancelled) return\n\n const d = doc as { numPages: number; getPage: (n: number) => Promise<never> }\n setPages(d.numPages)\n host.replaceChildren()\n\n for (let i = 1; i <= d.numPages; i++) {\n const page = (await d.getPage(i)) as unknown as {\n getViewport: (o: { scale: number }) => { width: number; height: number }\n render: (o: object) => { promise: Promise<void> }\n }\n if (cancelled) return\n const viewport = page.getViewport({ scale: 1.5 })\n const canvas = document.createElement(\"canvas\")\n canvas.width = viewport.width\n canvas.height = viewport.height\n canvas.style.cssText = \"display:block;margin:0 auto 16px;max-width:100%;height:auto\"\n host.appendChild(canvas)\n await page.render({ canvasContext: canvas.getContext(\"2d\"), viewport }).promise\n }\n onReady?.(doc)\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e))\n onError?.(\n new Error(\n `PDF 预览失败:${err.message}。` +\n `请确认已安装可选依赖 pdfjs-dist(pnpm add pdfjs-dist)`,\n ),\n )\n }\n })()\n\n return () => {\n cancelled = true\n }\n }, [source, onReady, onError])\n\n return <div ref={hostRef} className={className} data-pdf-pages={pages} />\n}\n"]}
@@ -0,0 +1,56 @@
1
+ import { useRef, useEffect } from 'react';
2
+ import { jsx } from 'react/jsx-runtime';
3
+
4
+ // src/views/SheetView.tsx
5
+ function SheetView({ content, readOnly, className, onReady, onError }) {
6
+ const hostRef = useRef(null);
7
+ const disposeRef = useRef(null);
8
+ useEffect(() => {
9
+ let cancelled = false;
10
+ const host = hostRef.current;
11
+ if (!host) return;
12
+ (async () => {
13
+ try {
14
+ const [{ createUniver, LocaleType, merge }, sheetsCore, zhCN] = await Promise.all([
15
+ import('@univerjs/presets'),
16
+ import('@univerjs/presets/preset-sheets-core'),
17
+ import('@univerjs/presets/preset-sheets-core/locales/zh-CN')
18
+ ]);
19
+ if (cancelled) return;
20
+ const { univerAPI, univer } = createUniver({
21
+ locale: LocaleType.ZH_CN,
22
+ locales: { [LocaleType.ZH_CN]: merge({}, zhCN.default) },
23
+ // 可选 peer:@univerjs/presets 未安装时这里的类型解析不到,
24
+ // 统一用 never 过桥,运行时由上面的 try/catch 兜底并给出可读提示
25
+ presets: [
26
+ sheetsCore.UniverSheetsCorePreset({
27
+ container: host
28
+ })
29
+ ]
30
+ });
31
+ if (content) univerAPI.createWorkbook(content);
32
+ else univerAPI.createWorkbook({});
33
+ if (readOnly) univerAPI.getActiveWorkbook?.()?.setEditable?.(false);
34
+ disposeRef.current = () => univer.dispose();
35
+ onReady?.(univerAPI);
36
+ } catch (e) {
37
+ const err = e instanceof Error ? e : new Error(String(e));
38
+ onError?.(
39
+ new Error(
40
+ `表格引擎加载失败:${err.message}。请确认已安装可选依赖 @univerjs/presets(pnpm add @univerjs/presets)`
41
+ )
42
+ );
43
+ }
44
+ })();
45
+ return () => {
46
+ cancelled = true;
47
+ disposeRef.current?.();
48
+ disposeRef.current = null;
49
+ };
50
+ }, [content, readOnly, onReady, onError]);
51
+ return /* @__PURE__ */ jsx("div", { ref: hostRef, className, style: { width: "100%", height: "100%" } });
52
+ }
53
+
54
+ export { SheetView };
55
+ //# sourceMappingURL=chunk-RJUDOUEZ.js.map
56
+ //# sourceMappingURL=chunk-RJUDOUEZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/views/SheetView.tsx"],"names":[],"mappings":";;;;AAae,SAAR,UAA2B,EAAE,OAAA,EAAS,UAAU,SAAA,EAAW,OAAA,EAAS,SAAQ,EAAsB;AACvG,EAAA,MAAM,OAAA,GAAU,OAAuB,IAAI,CAAA;AAC3C,EAAA,MAAM,UAAA,GAAa,OAA4B,IAAI,CAAA;AAEnD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,MAAM,OAAO,OAAA,CAAQ,OAAA;AACrB,IAAA,IAAI,CAAC,IAAA,EAAM;AAEV,IAAA,CAAC,YAAY;AACZ,MAAA,IAAI;AAEF,QAAA,MAAM,CAAC,EAAE,YAAA,EAAc,UAAA,EAAY,KAAA,EAAM,EAAG,UAAA,EAAY,IAAI,CAAA,GAAI,MAAM,OAAA,CAAQ,GAAA,CAAI;AAAA,UAChF,OAAO,mBAAmB,CAAA;AAAA,UAC1B,OAAO,sCAAsC,CAAA;AAAA,UAC7C,OAAO,oDAAoD;AAAA,SAC5D,CAAA;AACD,QAAA,IAAI,SAAA,EAAW;AAEf,QAAA,MAAM,EAAE,SAAA,EAAW,MAAA,EAAO,GAAI,YAAA,CAAa;AAAA,UACzC,QAAQ,UAAA,CAAW,KAAA;AAAA,UACnB,OAAA,EAAS,EAAE,CAAC,UAAA,CAAW,KAAK,GAAG,KAAA,CAAM,EAAC,EAAI,IAAA,CAAwC,OAAO,CAAA,EAAE;AAAA;AAAA;AAAA,UAG3F,OAAA,EAAS;AAAA,YACN,WAA2E,sBAAA,CAAuB;AAAA,cACjG,SAAA,EAAW;AAAA,aACZ;AAAA;AACH,SACD,CAAA;AAED,QAAA,IAAI,OAAA,EAAS,SAAA,CAAU,cAAA,CAAe,OAAgB,CAAA;AAAA,aACjD,SAAA,CAAU,cAAA,CAAe,EAAE,CAAA;AAChC,QAAA,IAAI,QAAA,EAAU,SAAA,CAAU,iBAAA,IAAoB,EAAG,cAAc,KAAK,CAAA;AAElE,QAAA,UAAA,CAAW,OAAA,GAAU,MAAO,MAAA,CAA8C,OAAA,EAAQ;AAClF,QAAA,OAAA,GAAU,SAAS,CAAA;AAAA,MACrB,SAAS,CAAA,EAAG;AACV,QAAA,MAAM,GAAA,GAAM,aAAa,KAAA,GAAQ,CAAA,GAAI,IAAI,KAAA,CAAM,MAAA,CAAO,CAAC,CAAC,CAAA;AACxD,QAAA,OAAA;AAAA,UACE,IAAI,KAAA;AAAA,YACF,CAAA,SAAA,EAAY,IAAI,OAAO,CAAA,yDAAA;AAAA;AAEzB,SACF;AAAA,MACF;AAAA,IACF,CAAA,GAAG;AAEH,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AACZ,MAAA,UAAA,CAAW,OAAA,IAAU;AACrB,MAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AAAA,IACvB,CAAA;AAAA,EACF,GAAG,CAAC,OAAA,EAAS,QAAA,EAAU,OAAA,EAAS,OAAO,CAAC,CAAA;AAExC,EAAA,uBAAO,GAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,OAAA,EAAS,SAAA,EAAsB,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAO,EAAG,CAAA;AAC5F","file":"chunk-RJUDOUEZ.js","sourcesContent":["import { useEffect, useRef } from \"react\"\nimport type { DocumentViewProps } from \"../registry\"\n\n/**\n * sheet 通道:Univer 适配。\n *\n * 只用 Apache-2.0 的 OSS 核心。**不碰** `@univerjs-pro/*` 与 `univer-cli`:\n * 前者要自建 Univer Server 且需商业授权,后者 63MB、license 字段为 None、\n * 90/91 个 JS 被混淆、还会向 univer.ai 上报遥测 —— 不能进生产链路。\n *\n * xlsx 出入建议走 SheetJS(Apache-2.0)在宿主侧做,接受公式/图表保真损失,\n * 换零采购与代码可控。\n */\nexport default function SheetView({ content, readOnly, className, onReady, onError }: DocumentViewProps) {\n const hostRef = useRef<HTMLDivElement>(null)\n const disposeRef = useRef<(() => void) | null>(null)\n\n useEffect(() => {\n let cancelled = false\n const host = hostRef.current\n if (!host) return\n\n ;(async () => {\n try {\n // 动态 import:871KB gzip 的引擎只在真的打开表格时才下载\n const [{ createUniver, LocaleType, merge }, sheetsCore, zhCN] = await Promise.all([\n import(\"@univerjs/presets\"),\n import(\"@univerjs/presets/preset-sheets-core\"),\n import(\"@univerjs/presets/preset-sheets-core/locales/zh-CN\"),\n ])\n if (cancelled) return\n\n const { univerAPI, univer } = createUniver({\n locale: LocaleType.ZH_CN,\n locales: { [LocaleType.ZH_CN]: merge({}, (zhCN as unknown as { default: object }).default) },\n // 可选 peer:@univerjs/presets 未安装时这里的类型解析不到,\n // 统一用 never 过桥,运行时由上面的 try/catch 兜底并给出可读提示\n presets: [\n (sheetsCore as unknown as { UniverSheetsCorePreset: (o: object) => never }).UniverSheetsCorePreset({\n container: host,\n }),\n ] as never,\n })\n\n if (content) univerAPI.createWorkbook(content as never)\n else univerAPI.createWorkbook({})\n if (readOnly) univerAPI.getActiveWorkbook?.()?.setEditable?.(false)\n\n disposeRef.current = () => (univer as unknown as { dispose: () => void }).dispose()\n onReady?.(univerAPI)\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e))\n onError?.(\n new Error(\n `表格引擎加载失败:${err.message}。` +\n `请确认已安装可选依赖 @univerjs/presets(pnpm add @univerjs/presets)`,\n ),\n )\n }\n })()\n\n return () => {\n cancelled = true\n disposeRef.current?.()\n disposeRef.current = null\n }\n }, [content, readOnly, onReady, onError])\n\n return <div ref={hostRef} className={className} style={{ width: \"100%\", height: \"100%\" }} />\n}\n"]}