@4399ywkf/editor 0.5.0 → 0.7.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.
Files changed (49) hide show
  1. package/README.md +164 -11
  2. package/dist/PptxView-ZH4FZKNO.js +3 -0
  3. package/dist/PptxView-ZH4FZKNO.js.map +1 -0
  4. package/dist/SheetView-SDBRSTVS.js +3 -0
  5. package/dist/{SheetView-DSADIZNS.js.map → SheetView-SDBRSTVS.js.map} +1 -1
  6. package/dist/chunk-5HMKRNIH.js +27 -0
  7. package/dist/chunk-5HMKRNIH.js.map +1 -0
  8. package/dist/chunk-5XG4YMAB.js +149 -0
  9. package/dist/chunk-5XG4YMAB.js.map +1 -0
  10. package/dist/chunk-DGUNVCOM.js +711 -0
  11. package/dist/chunk-DGUNVCOM.js.map +1 -0
  12. package/dist/chunk-HPSPOM2O.js +128 -0
  13. package/dist/chunk-HPSPOM2O.js.map +1 -0
  14. package/dist/chunk-KRP5V7VF.js +130 -0
  15. package/dist/chunk-KRP5V7VF.js.map +1 -0
  16. package/dist/chunk-SBTKDJAL.js +107 -0
  17. package/dist/chunk-SBTKDJAL.js.map +1 -0
  18. package/dist/{chunk-L6ZR5HHW.js → chunk-SYCK6Y5F.js} +15 -10
  19. package/dist/chunk-SYCK6Y5F.js.map +1 -0
  20. package/dist/chunk-WF7PIIFR.js +21 -0
  21. package/dist/chunk-WF7PIIFR.js.map +1 -0
  22. package/dist/csv-parse-D0zTBvDB.d.ts +216 -0
  23. package/dist/csv.d.ts +86 -0
  24. package/dist/csv.js +34 -0
  25. package/dist/csv.js.map +1 -0
  26. package/dist/docx.d.ts +15 -0
  27. package/dist/docx.js +61 -3
  28. package/dist/docx.js.map +1 -1
  29. package/dist/import-GVZDLWA2.js +6 -0
  30. package/dist/import-GVZDLWA2.js.map +1 -0
  31. package/dist/index.d.ts +2 -2
  32. package/dist/index.js +21 -2
  33. package/dist/index.js.map +1 -1
  34. package/dist/pdf.d.ts +1 -1
  35. package/dist/pptx.d.ts +36 -0
  36. package/dist/pptx.js +3 -0
  37. package/dist/pptx.js.map +1 -0
  38. package/dist/{registry-BBL8yeIT.d.ts → registry-XJFJXtZ_.d.ts} +6 -0
  39. package/dist/sheet-runtime.d.ts +212 -0
  40. package/dist/sheet-runtime.js +416 -0
  41. package/dist/sheet-runtime.js.map +1 -0
  42. package/dist/sheet.d.ts +7 -5
  43. package/dist/sheet.js +1 -1
  44. package/dist/xlsx.d.ts +127 -189
  45. package/dist/xlsx.js +8 -104
  46. package/dist/xlsx.js.map +1 -1
  47. package/package.json +19 -3
  48. package/dist/SheetView-DSADIZNS.js +0 -3
  49. package/dist/chunk-L6ZR5HHW.js.map +0 -1
@@ -0,0 +1,6 @@
1
+ export { importCsv, importSheetSource, importXlsx } from './chunk-DGUNVCOM.js';
2
+ import './chunk-SBTKDJAL.js';
3
+ import './chunk-KRP5V7VF.js';
4
+ import './chunk-5HMKRNIH.js';
5
+ //# sourceMappingURL=import-GVZDLWA2.js.map
6
+ //# sourceMappingURL=import-GVZDLWA2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"import-GVZDLWA2.js"}
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import * as react from 'react';
2
2
  import { ReactNode } from 'react';
3
- import { D as DocumentViewProps, a as DocumentFormat } from './registry-BBL8yeIT.js';
4
- export { F as FormatAdapter, b as FormatCapabilities, S as SheetOptions, c as SheetUiOptions, d as detectFormat, g as getFormat, l as listFormats, r as registerFormat } from './registry-BBL8yeIT.js';
3
+ import { D as DocumentViewProps, a as DocumentFormat } from './registry-XJFJXtZ_.js';
4
+ export { F as FormatAdapter, b as FormatCapabilities, S as SheetOptions, c as SheetUiOptions, d as detectFormat, g as getFormat, l as listFormats, r as registerFormat } from './registry-XJFJXtZ_.js';
5
5
 
6
6
  interface DocumentViewComponentProps extends DocumentViewProps {
7
7
  /** 文档格式。不传则尝试从 source 的扩展名推断 */
package/dist/index.js CHANGED
@@ -39,13 +39,19 @@ registerFormat({
39
39
  extensions: [".xls", ".xlsx", ".xlt", ".xltx", ".xlsm", ".xltm", ".csv", ".tsv"],
40
40
  capabilities: {
41
41
  editable: true,
42
+ // 结构化工具面在 ./sheet-runtime(SheetRuntime),工具定义在 editor-mcp
43
+ // 的 SHEET_TOOLS —— 读走快照、写走 Univer facade 的 command 体系
42
44
  aiOperable: true,
43
45
  collaborative: false,
44
46
  // Univer 协同属于 Pro,OSS 核心不含
45
- importExtensions: [".xlsx", ".csv"],
47
+ // 导入实现在 ./xlsx 的 importSheetSource:xlsx 本地解包、csv/tsv 带编码嗅探。
48
+ // .xls 老格式是二进制复合文档,不解析(会给出「另存为 .xlsx」的可读报错)
49
+ importExtensions: [".xlsx", ".csv", ".tsv"],
50
+ // 导出实现分别在 ./xlsx 与 ./csv 两个子路径。csv 是单表格式,
51
+ // 只导活动表、其余表在 warnings 里点名
46
52
  exportFormats: ["xlsx", "csv"]
47
53
  },
48
- load: () => import('./SheetView-DSADIZNS.js')
54
+ load: () => import('./SheetView-SDBRSTVS.js')
49
55
  });
50
56
  registerFormat({
51
57
  format: "pdf",
@@ -61,6 +67,19 @@ registerFormat({
61
67
  },
62
68
  load: () => import('./PdfView-JDCHTG7Y.js')
63
69
  });
70
+ registerFormat({
71
+ format: "pptx",
72
+ label: "演示文稿",
73
+ extensions: [".pptx", ".ppsx", ".potx", ".pptm", ".ppsm", ".potm"],
74
+ capabilities: {
75
+ editable: false,
76
+ aiOperable: false,
77
+ collaborative: false,
78
+ importExtensions: [".pptx"],
79
+ exportFormats: []
80
+ },
81
+ load: () => import('./PptxView-ZH4FZKNO.js')
82
+ });
64
83
  function DocumentView({
65
84
  format,
66
85
  source,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/registry.ts","../src/DocumentView.tsx","../src/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * 格式注册表 —— 整个包的骨架。\n *\n * 设计取自腾讯 WorkBuddy 的三通道结构:**按「文档住在哪 / 是什么」分通道,\n * 每个通道一个独立引擎,上面加一层路由**。它没有试图用一套编辑器覆盖全部格式,\n * 我们也不该。\n *\n * 三条硬约束:\n *\n * 1. **引擎必须懒加载。** Univer sheets 核心 gzip 后 871KB、pdf.js 也有几百 KB。\n * 塞进主包会毁掉阅读侧的首屏 —— 只有用户真的打开一个表格 / PDF 时才该下载。\n *\n * 2. **能力要可申报,不能靠猜。** `capabilities` 明确说清每种格式能不能编辑、\n * 能不能被 AI 结构化操作。上层据此决定给什么 UI,而不是先渲染再报错。\n *\n * 3. **宿主可注册自有引擎。** 内置覆盖不了的格式(如 pptx)留给宿主接,\n * 而不是我们假装支持。\n */\nimport type { ComponentType } from \"react\"\nimport type { SheetOptions } from \"./sheet-options\"\n\nexport type DocumentFormat = \"doc\" | \"sheet\" | \"pdf\" | \"pptx\" | (string & {})\n\nexport interface FormatCapabilities {\n /** 能否编辑。false 表示只读预览 */\n editable: boolean\n /** 能否被 AI 通过结构化工具面操作(读结构、按 id 定位、增删改) */\n aiOperable: boolean\n /** 能否协同编辑 */\n collaborative: boolean\n /** 支持导入的扩展名 */\n importExtensions: string[]\n /** 支持导出的格式 */\n exportFormats: string[]\n}\n\nexport interface FormatAdapter {\n format: DocumentFormat\n /** 展示名,给 UI 用 */\n label: string\n capabilities: FormatCapabilities\n /** 该格式认领哪些扩展名(小写、带点) */\n extensions: string[]\n /**\n * 懒加载视图组件。**必须是动态 import**,否则引擎会被打进主包。\n */\n load: () => Promise<{ default: ComponentType<DocumentViewProps> }>\n}\n\nexport interface DocumentViewProps {\n /** 文档来源:URL / File / 已有内容 */\n source?: string | Blob | File\n /** 已有内容(doc 走 tiptap JSON 或 HTML;sheet 走 Univer snapshot) */\n content?: unknown\n readOnly?: boolean\n /** 协同房间号,仅 collaborative 为 true 的格式有意义 */\n room?: string\n className?: string\n /**\n * sheet 通道专属配置(Univer preset 与 UI 开关),其它格式忽略。\n *\n * 放在这里而不是只给 `SheetView`,是因为宿主通常只见得到 `DocumentView`\n * 这一层路由 —— 配置进不来的话,只读预览就只能顶着整条编辑工具条。\n */\n sheet?: SheetOptions\n /** 引擎就绪回调,拿到底层实例(tiptap Editor / Univer API / PDFDocumentProxy) */\n onReady?: (instance: unknown) => void\n onError?: (error: Error) => void\n}\n\nconst registry = new Map<DocumentFormat, FormatAdapter>()\n\nexport function registerFormat(adapter: FormatAdapter): void {\n registry.set(adapter.format, adapter)\n}\n\nexport function getFormat(format: DocumentFormat): FormatAdapter | undefined {\n return registry.get(format)\n}\n\nexport function listFormats(): FormatAdapter[] {\n return [...registry.values()]\n}\n\n/** 按扩展名判定格式。传文件名、路径或裸扩展名都行。 */\nexport function detectFormat(nameOrExt: string): DocumentFormat | undefined {\n const m = /\\.([a-z0-9]+)$/i.exec(nameOrExt.trim())\n const ext = `.${(m ? m[1] : nameOrExt.replace(/^\\./, \"\")).toLowerCase()}`\n for (const a of registry.values()) if (a.extensions.includes(ext)) return a.format\n return undefined\n}\n\n/* --------------------------- 内置格式 --------------------------- */\n\nregisterFormat({\n format: \"doc\",\n label: \"文档\",\n extensions: [\".doc\", \".docx\", \".dot\", \".dotx\", \".docm\", \".dotm\", \".wps\", \".wpt\", \".md\", \".html\"],\n capabilities: {\n editable: true,\n aiOperable: true,\n collaborative: true,\n importExtensions: [\".docx\", \".md\", \".html\"],\n exportFormats: [\"docx\", \"html\", \"json\", \"markdown\"],\n },\n load: () => import(\"./views/DocView\"),\n})\n\nregisterFormat({\n format: \"sheet\",\n label: \"表格\",\n extensions: [\".xls\", \".xlsx\", \".xlt\", \".xltx\", \".xlsm\", \".xltm\", \".csv\", \".tsv\"],\n capabilities: {\n editable: true,\n aiOperable: true,\n collaborative: false, // Univer 协同属于 Pro,OSS 核心不含\n importExtensions: [\".xlsx\", \".csv\"],\n exportFormats: [\"xlsx\", \"csv\"],\n },\n load: () => import(\"./views/SheetView\"),\n})\n\nregisterFormat({\n format: \"pdf\",\n label: \"PDF\",\n extensions: [\".pdf\"],\n capabilities: {\n editable: false, // 只读预览。PDF 编辑是 OOXML 引擎那一档的事\n aiOperable: false,\n collaborative: false,\n importExtensions: [\".pdf\"],\n exportFormats: [],\n },\n load: () => import(\"./views/PdfView\"),\n})\n\n/**\n * pptx 刻意**不内置**。\n *\n * 调研结论:Univer Slides 官方文档原文写着「请勿用于生产环境」,\n * `@univerjs/slides` 只有 0.17MB 骨架;开源世界里没有第二个可用的\n * 前端 pptx 编辑/渲染引擎。真要做只有 OnlyOffice / Collabora 那一档\n * (AGPL,需法务口径 + 独立部署)。\n *\n * 与其假装支持,不如把口子留给宿主:\n *\n * ```ts\n * registerFormat({\n * format: \"pptx\",\n * label: \"演示文稿\",\n * extensions: [\".ppt\", \".pptx\"],\n * capabilities: { editable: false, aiOperable: false, collaborative: false,\n * importExtensions: [], exportFormats: [] },\n * load: () => import(\"./MyOnlyOfficeSlideView\"),\n * })\n * ```\n */\n","import { Suspense, lazy, useMemo, type ComponentType, type ReactNode } from \"react\"\nimport { detectFormat, getFormat, type DocumentFormat, type DocumentViewProps } from \"./registry\"\n\nexport interface DocumentViewComponentProps extends DocumentViewProps {\n /** 文档格式。不传则尝试从 source 的扩展名推断 */\n format?: DocumentFormat\n /** 引擎加载中的占位 */\n fallback?: ReactNode\n /** 格式不支持时的兜底渲染。不传则渲染一段说明文字 */\n unsupported?: (format: string) => ReactNode\n}\n\n/**\n * 按格式路由到对应引擎,引擎按需下载。\n *\n * 为什么用 registry + lazy 而不是 if/else 直接 import:\n * 直接 import 会让 Univer(871KB gzip)和 pdf.js 无条件进主包,\n * 哪怕用户从头到尾只看文章。这在阅读侧是不可接受的 ——\n * 本仓刚做完「服务端直出 588KB」的优化,一个表格引擎就能全毁掉。\n */\nexport function DocumentView({\n format,\n source,\n fallback,\n unsupported,\n ...rest\n}: DocumentViewComponentProps) {\n const resolved = useMemo<DocumentFormat | undefined>(() => {\n if (format) return format\n const name = typeof source === \"string\" ? source : (source as File | undefined)?.name\n if (!name) return undefined\n return detectFormat(name)\n }, [format, source])\n\n const adapter = resolved ? getFormat(resolved) : undefined\n\n const View = useMemo<ComponentType<DocumentViewProps> | null>(() => {\n if (!adapter) return null\n return lazy(adapter.load)\n }, [adapter])\n\n if (!adapter || !View) {\n return (\n <>\n {unsupported?.(String(resolved ?? \"unknown\")) ?? (\n <div data-editor-unsupported={String(resolved ?? \"unknown\")}>\n 暂不支持该格式{resolved ? `(${resolved})` : \"\"}。\n 可通过 registerFormat() 注册自有引擎。\n </div>\n )}\n </>\n )\n }\n\n return (\n <Suspense fallback={fallback ?? <div data-editor-loading={adapter.format} />}>\n <View source={source} {...rest} />\n </Suspense>\n )\n}\n","/**\n * @4399ywkf/editor —— 多格式文档编辑器\n *\n * 主入口只放**格式路由与能力申报**,具体引擎全部懒加载。\n * 直接 import 这里不会把 tiptap / Univer / pdf.js 打进你的主包。\n *\n * ```tsx\n * import { DocumentView, detectFormat } from \"@4399ywkf/editor\"\n * import \"@4399ywkf/editor/styles\"\n *\n * <DocumentView format={detectFormat(\"年度报告.docx\")} content={html} />\n * ```\n *\n * 需要直接用某个引擎时走子路径,能拿到完整 API:\n *\n * ```ts\n * import { NotionEditor } from \"@4399ywkf/editor/doc\"\n * import { ImportDocx, ExportDocx } from \"@4399ywkf/editor/docx\"\n * ```\n */\n\nexport { DocumentView, type DocumentViewComponentProps } from \"./DocumentView\"\nexport {\n type DocumentFormat,\n type DocumentViewProps,\n detectFormat,\n type FormatAdapter,\n type FormatCapabilities,\n getFormat,\n listFormats,\n registerFormat,\n} from \"./registry\"\n\nexport type { SheetOptions, SheetUiOptions } from \"./sheet-options\"\n\nexport const VERSION = \"0.1.0\"\n"]}
1
+ {"version":3,"sources":["../src/registry.ts","../src/DocumentView.tsx","../src/index.ts"],"names":[],"mappings":";;;;;;AA4EA,IAAM,QAAA,uBAAe,GAAA,EAAmC;AAEjD,SAAS,eAAe,OAAA,EAA8B;AAC3D,EAAA,QAAA,CAAS,GAAA,CAAI,OAAA,CAAQ,MAAA,EAAQ,OAAO,CAAA;AACtC;AAEO,SAAS,UAAU,MAAA,EAAmD;AAC3E,EAAA,OAAO,QAAA,CAAS,IAAI,MAAM,CAAA;AAC5B;AAEO,SAAS,WAAA,GAA+B;AAC7C,EAAA,OAAO,CAAC,GAAG,QAAA,CAAS,MAAA,EAAQ,CAAA;AAC9B;AAGO,SAAS,aAAa,SAAA,EAA+C;AAC1E,EAAA,MAAM,CAAA,GAAI,iBAAA,CAAkB,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AACjD,EAAA,MAAM,GAAA,GAAM,CAAA,CAAA,EAAA,CAAK,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,GAAI,SAAA,CAAU,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA,EAAG,WAAA,EAAa,CAAA,CAAA;AACvE,EAAA,KAAA,MAAW,CAAA,IAAK,QAAA,CAAS,MAAA,EAAO,EAAG,IAAI,CAAA,CAAE,UAAA,CAAW,QAAA,CAAS,GAAG,CAAA,EAAG,OAAO,CAAA,CAAE,MAAA;AAC5E,EAAA,OAAO,MAAA;AACT;AAIA,cAAA,CAAe;AAAA,EACb,MAAA,EAAQ,KAAA;AAAA,EACR,KAAA,EAAO,IAAA;AAAA,EACP,UAAA,EAAY,CAAC,MAAA,EAAQ,OAAA,EAAS,MAAA,EAAQ,OAAA,EAAS,OAAA,EAAS,OAAA,EAAS,MAAA,EAAQ,MAAA,EAAQ,KAAA,EAAO,OAAO,CAAA;AAAA,EAC/F,YAAA,EAAc;AAAA,IACZ,QAAA,EAAU,IAAA;AAAA,IACV,UAAA,EAAY,IAAA;AAAA,IACZ,aAAA,EAAe,IAAA;AAAA,IACf,gBAAA,EAAkB,CAAC,OAAA,EAAS,KAAA,EAAO,OAAO,CAAA;AAAA,IAC1C,aAAA,EAAe,CAAC,MAAA,EAAQ,MAAA,EAAQ,QAAQ,UAAU;AAAA,GACpD;AAAA,EACA,IAAA,EAAM,MAAM,OAAO,uBAAiB;AACtC,CAAC,CAAA;AAED,cAAA,CAAe;AAAA,EACb,MAAA,EAAQ,OAAA;AAAA,EACR,KAAA,EAAO,IAAA;AAAA,EACP,UAAA,EAAY,CAAC,MAAA,EAAQ,OAAA,EAAS,QAAQ,OAAA,EAAS,OAAA,EAAS,OAAA,EAAS,MAAA,EAAQ,MAAM,CAAA;AAAA,EAC/E,YAAA,EAAc;AAAA,IACZ,QAAA,EAAU,IAAA;AAAA;AAAA;AAAA,IAGV,UAAA,EAAY,IAAA;AAAA,IACZ,aAAA,EAAe,KAAA;AAAA;AAAA;AAAA;AAAA,IAGf,gBAAA,EAAkB,CAAC,OAAA,EAAS,MAAA,EAAQ,MAAM,CAAA;AAAA;AAAA;AAAA,IAG1C,aAAA,EAAe,CAAC,MAAA,EAAQ,KAAK;AAAA,GAC/B;AAAA,EACA,IAAA,EAAM,MAAM,OAAO,yBAAmB;AACxC,CAAC,CAAA;AAED,cAAA,CAAe;AAAA,EACb,MAAA,EAAQ,KAAA;AAAA,EACR,KAAA,EAAO,KAAA;AAAA,EACP,UAAA,EAAY,CAAC,MAAM,CAAA;AAAA,EACnB,YAAA,EAAc;AAAA,IACZ,QAAA,EAAU,KAAA;AAAA;AAAA,IACV,UAAA,EAAY,KAAA;AAAA,IACZ,aAAA,EAAe,KAAA;AAAA,IACf,gBAAA,EAAkB,CAAC,MAAM,CAAA;AAAA,IACzB,eAAe;AAAC,GAClB;AAAA,EACA,IAAA,EAAM,MAAM,OAAO,uBAAiB;AACtC,CAAC,CAAA;AAsBD,cAAA,CAAe;AAAA,EACb,MAAA,EAAQ,MAAA;AAAA,EACR,KAAA,EAAO,MAAA;AAAA,EACP,YAAY,CAAC,OAAA,EAAS,SAAS,OAAA,EAAS,OAAA,EAAS,SAAS,OAAO,CAAA;AAAA,EACjE,YAAA,EAAc;AAAA,IACZ,QAAA,EAAU,KAAA;AAAA,IACV,UAAA,EAAY,KAAA;AAAA,IACZ,aAAA,EAAe,KAAA;AAAA,IACf,gBAAA,EAAkB,CAAC,OAAO,CAAA;AAAA,IAC1B,eAAe;AAAC,GAClB;AAAA,EACA,IAAA,EAAM,MAAM,OAAO,wBAAkB;AACvC,CAAC,CAAA;AChKM,SAAS,YAAA,CAAa;AAAA,EAC3B,MAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA+B;AAC7B,EAAA,MAAM,QAAA,GAAW,QAAoC,MAAM;AACzD,IAAA,IAAI,QAAQ,OAAO,MAAA;AACnB,IAAA,MAAM,IAAA,GAAO,OAAO,MAAA,KAAW,QAAA,GAAW,SAAU,MAAA,EAA6B,IAAA;AACjF,IAAA,IAAI,CAAC,MAAM,OAAO,MAAA;AAClB,IAAA,OAAO,aAAa,IAAI,CAAA;AAAA,EAC1B,CAAA,EAAG,CAAC,MAAA,EAAQ,MAAM,CAAC,CAAA;AAEnB,EAAA,MAAM,OAAA,GAAU,QAAA,GAAW,SAAA,CAAU,QAAQ,CAAA,GAAI,MAAA;AAEjD,EAAA,MAAM,IAAA,GAAO,QAAiD,MAAM;AAClE,IAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,IAAA,OAAO,IAAA,CAAK,QAAQ,IAAI,CAAA;AAAA,EAC1B,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,IAAI,CAAC,OAAA,IAAW,CAAC,IAAA,EAAM;AACrB,IAAA,uBACE,GAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA,WAAA,GAAc,MAAA,CAAO,QAAA,IAAY,SAAS,CAAC,CAAA,oBAC1C,IAAA,CAAC,KAAA,EAAA,EAAI,yBAAA,EAAyB,MAAA,CAAO,QAAA,IAAY,SAAS,CAAA,EAAG,QAAA,EAAA;AAAA,MAAA,SAAA;AAAA,MACnD,QAAA,GAAW,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,CAAA,GAAM,EAAA;AAAA,MAAG;AAAA,KAAA,EAE1C,CAAA,EAEJ,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACE,GAAA,CAAC,QAAA,EAAA,EAAS,QAAA,EAAU,QAAA,wBAAa,KAAA,EAAA,EAAI,qBAAA,EAAqB,OAAA,CAAQ,MAAA,EAAQ,GACxE,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,MAAA,EAAiB,GAAG,MAAM,CAAA,EAClC,CAAA;AAEJ;;;ACxBO,IAAM,OAAA,GAAU","file":"index.js","sourcesContent":["/**\n * 格式注册表 —— 整个包的骨架。\n *\n * 设计取自腾讯 WorkBuddy 的三通道结构:**按「文档住在哪 / 是什么」分通道,\n * 每个通道一个独立引擎,上面加一层路由**。它没有试图用一套编辑器覆盖全部格式,\n * 我们也不该。\n *\n * 三条硬约束:\n *\n * 1. **引擎必须懒加载。** Univer sheets 核心 gzip 后 871KB、pdf.js 也有几百 KB。\n * 塞进主包会毁掉阅读侧的首屏 —— 只有用户真的打开一个表格 / PDF 时才该下载。\n *\n * 2. **能力要可申报,不能靠猜。** `capabilities` 明确说清每种格式能不能编辑、\n * 能不能被 AI 结构化操作。上层据此决定给什么 UI,而不是先渲染再报错。\n *\n * 3. **宿主可注册自有引擎。** 内置覆盖不了的格式(如 pptx)留给宿主接,\n * 而不是我们假装支持。\n */\nimport type { ComponentType } from \"react\"\nimport type { SheetOptions } from \"./sheet-options\"\n\nexport type DocumentFormat = \"doc\" | \"sheet\" | \"pdf\" | \"pptx\" | (string & {})\n\nexport interface FormatCapabilities {\n /** 能否编辑。false 表示只读预览 */\n editable: boolean\n /** 能否被 AI 通过结构化工具面操作(读结构、按 id 定位、增删改) */\n aiOperable: boolean\n /** 能否协同编辑 */\n collaborative: boolean\n /** 支持导入的扩展名 */\n importExtensions: string[]\n /** 支持导出的格式 */\n exportFormats: string[]\n}\n\nexport interface FormatAdapter {\n format: DocumentFormat\n /** 展示名,给 UI 用 */\n label: string\n capabilities: FormatCapabilities\n /** 该格式认领哪些扩展名(小写、带点) */\n extensions: string[]\n /**\n * 懒加载视图组件。**必须是动态 import**,否则引擎会被打进主包。\n */\n load: () => Promise<{ default: ComponentType<DocumentViewProps> }>\n}\n\nexport interface DocumentViewProps {\n /** 文档来源:URL / File / 已有内容 */\n source?: string | Blob | File\n /** 已有内容(doc 走 tiptap JSON 或 HTML;sheet 走 Univer snapshot) */\n content?: unknown\n readOnly?: boolean\n /** 协同房间号,仅 collaborative 为 true 的格式有意义 */\n room?: string\n className?: string\n /**\n * sheet 通道专属配置(Univer preset 与 UI 开关),其它格式忽略。\n *\n * 放在这里而不是只给 `SheetView`,是因为宿主通常只见得到 `DocumentView`\n * 这一层路由 —— 配置进不来的话,只读预览就只能顶着整条编辑工具条。\n */\n sheet?: SheetOptions\n /** 引擎就绪回调,拿到底层实例(tiptap Editor / Univer API / PDFDocumentProxy) */\n onReady?: (instance: unknown) => void\n onError?: (error: Error) => void\n /**\n * 导入过程「丢了什么/降级了什么」的报告(如 xlsx 里的图片、条件格式)。\n * 这不是错误 —— 文档打开了,只是不完整。**请展示给用户**,\n * 打开文件才发现少了东西远比导入时被告知糟糕。\n */\n onWarnings?: (warnings: string[]) => void\n}\n\nconst registry = new Map<DocumentFormat, FormatAdapter>()\n\nexport function registerFormat(adapter: FormatAdapter): void {\n registry.set(adapter.format, adapter)\n}\n\nexport function getFormat(format: DocumentFormat): FormatAdapter | undefined {\n return registry.get(format)\n}\n\nexport function listFormats(): FormatAdapter[] {\n return [...registry.values()]\n}\n\n/** 按扩展名判定格式。传文件名、路径或裸扩展名都行。 */\nexport function detectFormat(nameOrExt: string): DocumentFormat | undefined {\n const m = /\\.([a-z0-9]+)$/i.exec(nameOrExt.trim())\n const ext = `.${(m ? m[1] : nameOrExt.replace(/^\\./, \"\")).toLowerCase()}`\n for (const a of registry.values()) if (a.extensions.includes(ext)) return a.format\n return undefined\n}\n\n/* --------------------------- 内置格式 --------------------------- */\n\nregisterFormat({\n format: \"doc\",\n label: \"文档\",\n extensions: [\".doc\", \".docx\", \".dot\", \".dotx\", \".docm\", \".dotm\", \".wps\", \".wpt\", \".md\", \".html\"],\n capabilities: {\n editable: true,\n aiOperable: true,\n collaborative: true,\n importExtensions: [\".docx\", \".md\", \".html\"],\n exportFormats: [\"docx\", \"html\", \"json\", \"markdown\"],\n },\n load: () => import(\"./views/DocView\"),\n})\n\nregisterFormat({\n format: \"sheet\",\n label: \"表格\",\n extensions: [\".xls\", \".xlsx\", \".xlt\", \".xltx\", \".xlsm\", \".xltm\", \".csv\", \".tsv\"],\n capabilities: {\n editable: true,\n // 结构化工具面在 ./sheet-runtime(SheetRuntime),工具定义在 editor-mcp\n // 的 SHEET_TOOLS —— 读走快照、写走 Univer facade 的 command 体系\n aiOperable: true,\n collaborative: false, // Univer 协同属于 Pro,OSS 核心不含\n // 导入实现在 ./xlsx 的 importSheetSource:xlsx 本地解包、csv/tsv 带编码嗅探。\n // .xls 老格式是二进制复合文档,不解析(会给出「另存为 .xlsx」的可读报错)\n importExtensions: [\".xlsx\", \".csv\", \".tsv\"],\n // 导出实现分别在 ./xlsx 与 ./csv 两个子路径。csv 是单表格式,\n // 只导活动表、其余表在 warnings 里点名\n exportFormats: [\"xlsx\", \"csv\"],\n },\n load: () => import(\"./views/SheetView\"),\n})\n\nregisterFormat({\n format: \"pdf\",\n label: \"PDF\",\n extensions: [\".pdf\"],\n capabilities: {\n editable: false, // 只读预览。PDF 编辑是 OOXML 引擎那一档的事\n aiOperable: false,\n collaborative: false,\n importExtensions: [\".pdf\"],\n exportFormats: [],\n },\n load: () => import(\"./views/PdfView\"),\n})\n\n/**\n * pptx **只读预览**,引擎是 `pptx-preview`(可选 peer)。\n *\n * 只申报 OOXML 那几个扩展名。`.ppt` / `.pps` / `.pot` 是二进制复合文档、\n * 根本不是 zip,该库解不了 —— 列进来就是假申报,宁可让它落到「暂不支持」。\n *\n * **编辑仍然不做。** Univer Slides 官方文档原文写着「请勿用于生产环境」,\n * 开源世界里没有第二个可用的前端 pptx 编辑引擎;真要做只有\n * OnlyOffice / Collabora 那一档(AGPL,需法务口径 + 独立部署)。\n *\n * 预览的保真度边界见 `views/PptxView` 的注释 —— 尤其**图表渲染不出数据**。\n * 需要更高保真的宿主可以用同名 `registerFormat` 覆盖掉本通道:\n *\n * ```ts\n * registerFormat({ format: \"pptx\", label: \"演示文稿\", extensions: [\".pptx\"],\n * capabilities: { editable: false, aiOperable: false, collaborative: false,\n * importExtensions: [], exportFormats: [] },\n * load: () => import(\"./MyOnlyOfficeSlideView\") })\n * ```\n */\nregisterFormat({\n format: \"pptx\",\n label: \"演示文稿\",\n extensions: [\".pptx\", \".ppsx\", \".potx\", \".pptm\", \".ppsm\", \".potm\"],\n capabilities: {\n editable: false,\n aiOperable: false,\n collaborative: false,\n importExtensions: [\".pptx\"],\n exportFormats: [],\n },\n load: () => import(\"./views/PptxView\"),\n})\n","import { Suspense, lazy, useMemo, type ComponentType, type ReactNode } from \"react\"\nimport { detectFormat, getFormat, type DocumentFormat, type DocumentViewProps } from \"./registry\"\n\nexport interface DocumentViewComponentProps extends DocumentViewProps {\n /** 文档格式。不传则尝试从 source 的扩展名推断 */\n format?: DocumentFormat\n /** 引擎加载中的占位 */\n fallback?: ReactNode\n /** 格式不支持时的兜底渲染。不传则渲染一段说明文字 */\n unsupported?: (format: string) => ReactNode\n}\n\n/**\n * 按格式路由到对应引擎,引擎按需下载。\n *\n * 为什么用 registry + lazy 而不是 if/else 直接 import:\n * 直接 import 会让 Univer(871KB gzip)和 pdf.js 无条件进主包,\n * 哪怕用户从头到尾只看文章。这在阅读侧是不可接受的 ——\n * 本仓刚做完「服务端直出 588KB」的优化,一个表格引擎就能全毁掉。\n */\nexport function DocumentView({\n format,\n source,\n fallback,\n unsupported,\n ...rest\n}: DocumentViewComponentProps) {\n const resolved = useMemo<DocumentFormat | undefined>(() => {\n if (format) return format\n const name = typeof source === \"string\" ? source : (source as File | undefined)?.name\n if (!name) return undefined\n return detectFormat(name)\n }, [format, source])\n\n const adapter = resolved ? getFormat(resolved) : undefined\n\n const View = useMemo<ComponentType<DocumentViewProps> | null>(() => {\n if (!adapter) return null\n return lazy(adapter.load)\n }, [adapter])\n\n if (!adapter || !View) {\n return (\n <>\n {unsupported?.(String(resolved ?? \"unknown\")) ?? (\n <div data-editor-unsupported={String(resolved ?? \"unknown\")}>\n 暂不支持该格式{resolved ? `(${resolved})` : \"\"}。\n 可通过 registerFormat() 注册自有引擎。\n </div>\n )}\n </>\n )\n }\n\n return (\n <Suspense fallback={fallback ?? <div data-editor-loading={adapter.format} />}>\n <View source={source} {...rest} />\n </Suspense>\n )\n}\n","/**\n * @4399ywkf/editor —— 多格式文档编辑器\n *\n * 主入口只放**格式路由与能力申报**,具体引擎全部懒加载。\n * 直接 import 这里不会把 tiptap / Univer / pdf.js 打进你的主包。\n *\n * ```tsx\n * import { DocumentView, detectFormat } from \"@4399ywkf/editor\"\n * import \"@4399ywkf/editor/styles\"\n *\n * <DocumentView format={detectFormat(\"年度报告.docx\")} content={html} />\n * ```\n *\n * 需要直接用某个引擎时走子路径,能拿到完整 API:\n *\n * ```ts\n * import { NotionEditor } from \"@4399ywkf/editor/doc\"\n * import { ImportDocx, ExportDocx } from \"@4399ywkf/editor/docx\"\n * ```\n */\n\nexport { DocumentView, type DocumentViewComponentProps } from \"./DocumentView\"\nexport {\n type DocumentFormat,\n type DocumentViewProps,\n detectFormat,\n type FormatAdapter,\n type FormatCapabilities,\n getFormat,\n listFormats,\n registerFormat,\n} from \"./registry\"\n\nexport type { SheetOptions, SheetUiOptions } from \"./sheet-options\"\n\nexport const VERSION = \"0.1.0\"\n"]}
package/dist/pdf.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as react from 'react';
2
- import { D as DocumentViewProps } from './registry-BBL8yeIT.js';
2
+ import { D as DocumentViewProps } from './registry-XJFJXtZ_.js';
3
3
 
4
4
  /**
5
5
  * pdf 通道:pdf.js 只读预览。
package/dist/pptx.d.ts ADDED
@@ -0,0 +1,36 @@
1
+ import { D as DocumentViewProps } from './registry-XJFJXtZ_.js';
2
+ import * as react from 'react';
3
+
4
+ /**
5
+ * pptx 的「幽灵 slideMaster」修复。
6
+ *
7
+ * 很多 pptx 的 `[Content_Types].xml` 里声明了 zip 中**并不存在**的
8
+ * `ppt/slideMasters/slideMasterN.xml`。PowerPoint 自己不介意,但 `pptx-preview`
9
+ * 会因为解析不到这些部件而整份失败 —— 表现是 `slideCount === 0`、面板一片空白,
10
+ * 不抛错、不报警。
11
+ *
12
+ * 这不是边缘情况:在 17 份真实文件上实测,**12 份中招**(AI 生成的和
13
+ * PowerPoint 16 存出来的都有)。裸接这个库只有 5/17 能打开,加上本修复后 17/17。
14
+ *
15
+ * 做法与腾讯 WorkBuddy 内置 pptx 预览里的 `checkPPTXFile` 一致:删掉指向缺失
16
+ * 部件的 `<Override>` 再重新打包。只处理 slideMaster —— 其它部件缺失时该库
17
+ * 能自己降级,动它反而可能改坏。
18
+ */
19
+ interface RepairPptxResult {
20
+ /** 修好的字节;没问题时**原样返回入参**,不做无谓的解压重打包 */
21
+ bytes: Uint8Array;
22
+ /** 删掉了几条幽灵声明。0 表示这份文件本来就是好的 */
23
+ removed: number;
24
+ /** 修复过程中放弃的原因(文件不是 zip、没有 [Content_Types].xml 等) */
25
+ skipped?: string;
26
+ }
27
+ /**
28
+ * @param input pptx 原始字节
29
+ * @returns 可交给 `pptx-preview` 的字节。**任何异常都退回原字节** ——
30
+ * 修不了也不该让预览失败,让引擎自己去报它的错。
31
+ */
32
+ declare function repairPptx(input: Uint8Array): RepairPptxResult;
33
+
34
+ declare function PptxView({ source, content, className, onReady, onError, }: DocumentViewProps): react.JSX.Element;
35
+
36
+ export { DocumentViewProps, PptxView, type RepairPptxResult, repairPptx };
package/dist/pptx.js ADDED
@@ -0,0 +1,3 @@
1
+ export { PptxView, repairPptx } from './chunk-5XG4YMAB.js';
2
+ //# sourceMappingURL=pptx.js.map
3
+ //# sourceMappingURL=pptx.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"pptx.js"}
@@ -138,6 +138,12 @@ interface DocumentViewProps {
138
138
  /** 引擎就绪回调,拿到底层实例(tiptap Editor / Univer API / PDFDocumentProxy) */
139
139
  onReady?: (instance: unknown) => void;
140
140
  onError?: (error: Error) => void;
141
+ /**
142
+ * 导入过程「丢了什么/降级了什么」的报告(如 xlsx 里的图片、条件格式)。
143
+ * 这不是错误 —— 文档打开了,只是不完整。**请展示给用户**,
144
+ * 打开文件才发现少了东西远比导入时被告知糟糕。
145
+ */
146
+ onWarnings?: (warnings: string[]) => void;
141
147
  }
142
148
  declare function registerFormat(adapter: FormatAdapter): void;
143
149
  declare function getFormat(format: DocumentFormat): FormatAdapter | undefined;
@@ -0,0 +1,212 @@
1
+ /**
2
+ * sheet 工具面的操作实现。每个工具一个函数,`runtime.ts` 只做分发。
3
+ *
4
+ * 读写分两条路,这是有意的:
5
+ *
6
+ * - **读走快照**(`snapshotFromUniver`):纯数据,不碰 facade 的方法面 ——
7
+ * Univer 版本漂移伤不到读路径;输出是 CSV 文本 + 公式清单,token 成本
8
+ * 是 JSON 单元格矩阵的几分之一。
9
+ * - **写走 facade**(`facade.ts`):写必须进 Univer 的 command 体系才有
10
+ * 撤销栈和协同广播,直接改快照是死路。facade 探测集中在 facade.ts。
11
+ */
12
+ interface SheetReadArgs {
13
+ /** 工作表 id 或表名,省略用活动表 */
14
+ sheet?: string;
15
+ /** A1 区域(如 "B2:F40"),省略读整个已用范围 */
16
+ range?: string;
17
+ /** 是否附带公式清单,默认 true */
18
+ includeFormulas?: boolean;
19
+ }
20
+ declare function readSheet(univerAPI: unknown, args?: SheetReadArgs): {
21
+ truncated?: boolean | undefined;
22
+ note?: string | undefined;
23
+ formulas?: {
24
+ ref: string;
25
+ formula: string;
26
+ }[] | undefined;
27
+ sheets: {
28
+ active?: boolean | undefined;
29
+ hidden?: boolean | undefined;
30
+ id: string;
31
+ name: string;
32
+ rows: number;
33
+ cols: number;
34
+ }[];
35
+ sheet: string;
36
+ /** 本次实际读到的区域(A1 形式) */
37
+ range: string | null;
38
+ /** CSV 文本。首行是区域第一行,**不是表头行标注** —— 列含义自己看内容 */
39
+ csv: string;
40
+ };
41
+ interface SheetFindArgs {
42
+ query: string;
43
+ /** 最多返回几条,默认 20 */
44
+ limit?: number;
45
+ }
46
+ declare function findInWorkbook(univerAPI: unknown, args: SheetFindArgs): {
47
+ matches: {
48
+ sheet: string;
49
+ ref: string;
50
+ value: string;
51
+ formula?: string;
52
+ }[];
53
+ total: number;
54
+ capped: boolean;
55
+ } | {
56
+ matches: {
57
+ sheet: string;
58
+ ref: string;
59
+ value: string;
60
+ formula?: string;
61
+ }[];
62
+ total: number;
63
+ capped?: undefined;
64
+ };
65
+ type SheetCellInput = string | number | boolean | null;
66
+ interface SetValuesArgs {
67
+ sheet?: string;
68
+ /** 写入区域左上角,A1 形式(如 "B2") */
69
+ start: string;
70
+ /** 二维数组,各行等长。"=…" 是公式,null 清空该格 */
71
+ values: SheetCellInput[][];
72
+ }
73
+ declare function setValues(univerAPI: unknown, args: SetValuesArgs): {
74
+ sheet: string;
75
+ range: string;
76
+ written: number;
77
+ };
78
+ interface EditRowsColsArgs {
79
+ sheet?: string;
80
+ action: "insert_rows" | "delete_rows" | "insert_cols" | "delete_cols";
81
+ /** 0-based。insert 在此位置**之前**插入;delete 从此位置开始删 */
82
+ index: number;
83
+ /** 默认 1 */
84
+ count?: number;
85
+ }
86
+ declare function editRowsCols(univerAPI: unknown, args: EditRowsColsArgs): {
87
+ sheet: string;
88
+ action: "insert_rows" | "delete_rows" | "insert_cols" | "delete_cols";
89
+ index: number;
90
+ count: number;
91
+ };
92
+ interface ManageSheetsArgs {
93
+ action: "add" | "rename" | "delete" | "activate";
94
+ /** rename / delete / activate 的目标(id 或表名) */
95
+ sheet?: string;
96
+ /** add 的表名 / rename 的新名 */
97
+ name?: string;
98
+ }
99
+ declare function manageSheets(univerAPI: unknown, args: ManageSheetsArgs): {
100
+ sheets: {
101
+ id: string;
102
+ name: string;
103
+ }[];
104
+ };
105
+ declare function exportXlsxBase64(univerAPI: unknown, args?: {
106
+ filename?: string;
107
+ }): Promise<{
108
+ filename: string;
109
+ base64: string;
110
+ bytes: number;
111
+ warnings: string[];
112
+ stats: Record<string, number>;
113
+ }>;
114
+
115
+ /**
116
+ * SheetRuntime —— 包着一个 Univer facade(FUniver)实例的结构化操作面。
117
+ *
118
+ * **这层不知道 MCP 存在**,也不知道 HTTP、WebSocket、tool schema 存在。
119
+ * 和 `DocRuntime` 完全对称:`setUniverAPI` / `isReady` / 一组方法 / `call` 分发。
120
+ * 工具定义和传输在 `@4399ywkf/editor-mcp`。
121
+ *
122
+ * ```tsx
123
+ * const runtime = useMemo(() => new SheetRuntime(), [])
124
+ * <DocumentView format="sheet" onReady={(api) => runtime.setUniverAPI(api)} />
125
+ * ```
126
+ */
127
+
128
+ declare class SheetRuntime {
129
+ private univerAPI;
130
+ constructor(univerAPI?: unknown);
131
+ /** Univer 实例就绪 / 卸载时调用。配合 `<DocumentView onReady>` 用。 */
132
+ setUniverAPI(univerAPI: unknown): void;
133
+ isReady(): boolean;
134
+ private use;
135
+ /** 工作簿概览 + 一张表的 CSV 视图与公式清单。要写之前先调它看清现状。 */
136
+ read(args?: SheetReadArgs): {
137
+ truncated?: boolean | undefined;
138
+ note?: string | undefined;
139
+ formulas?: {
140
+ ref: string;
141
+ formula: string;
142
+ }[] | undefined;
143
+ sheets: {
144
+ active?: boolean | undefined;
145
+ hidden?: boolean | undefined;
146
+ id: string;
147
+ name: string;
148
+ rows: number;
149
+ cols: number;
150
+ }[];
151
+ sheet: string;
152
+ range: string | null;
153
+ csv: string;
154
+ };
155
+ /** 全簿检索(值和公式都搜),返回可回填给写工具的 sheet + ref。 */
156
+ find(args: SheetFindArgs): {
157
+ matches: {
158
+ sheet: string;
159
+ ref: string;
160
+ value: string;
161
+ formula?: string;
162
+ }[];
163
+ total: number;
164
+ capped: boolean;
165
+ } | {
166
+ matches: {
167
+ sheet: string;
168
+ ref: string;
169
+ value: string;
170
+ formula?: string;
171
+ }[];
172
+ total: number;
173
+ capped?: undefined;
174
+ };
175
+ /** 从 start 起写一块二维值。"=…" 是公式,null 清空。 */
176
+ setValues(args: SetValuesArgs): {
177
+ sheet: string;
178
+ range: string;
179
+ written: number;
180
+ };
181
+ /** 插入 / 删除行列。 */
182
+ editRowsCols(args: EditRowsColsArgs): {
183
+ sheet: string;
184
+ action: "insert_rows" | "delete_rows" | "insert_cols" | "delete_cols";
185
+ index: number;
186
+ count: number;
187
+ };
188
+ /** 新建 / 重命名 / 删除 / 激活工作表。 */
189
+ manageSheets(args: ManageSheetsArgs): {
190
+ sheets: {
191
+ id: string;
192
+ name: string;
193
+ }[];
194
+ };
195
+ /** 导出 .xlsx(base64 给传输层,模型只看路径 —— 和 doc_export_docx 同一约定)。 */
196
+ exportXlsx(args?: {
197
+ filename?: string;
198
+ }): Promise<{
199
+ filename: string;
200
+ base64: string;
201
+ bytes: number;
202
+ warnings: string[];
203
+ stats: Record<string, number>;
204
+ }>;
205
+ /**
206
+ * 工具名 → 方法。给传输层(MCP 桥、agent executor)用的单一分发口,
207
+ * 和 `DocRuntime.call` 同构 —— 桥不需要知道自己面对的是文档还是表格。
208
+ */
209
+ call(tool: string, args?: Record<string, unknown>): Promise<unknown>;
210
+ }
211
+
212
+ export { type EditRowsColsArgs, type ManageSheetsArgs, type SetValuesArgs, type SheetCellInput, type SheetFindArgs, type SheetReadArgs, SheetRuntime, editRowsCols, exportXlsxBase64, findInWorkbook, manageSheets, readSheet, setValues };