diff --git a/package-lock.json b/package-lock.json index 994e0fa266..8e7a3197dc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -52,6 +52,7 @@ "codemirror-lang-hcl": "^0.1.0", "crc-32": "^1.2.2", "dayjs": "^1.11.10", + "docx-preview": "^0.4.0", "dompurify": "^3.2.6", "eventsource-parser": "^1.1.2", "fast-deep-equal": "^3.1.3", @@ -7640,6 +7641,15 @@ "node": ">=6.0.0" } }, + "node_modules/docx-preview": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/docx-preview/-/docx-preview-0.4.0.tgz", + "integrity": "sha512-OdKtE/uj3M4RfGarLkGjahUzRg8/kBp0Sraj1r1NAY1tp/sTpHOBqDrzVf9onMBt9vxP6SdQ6bpLCUCsFwjgcA==", + "license": "Apache-2.0", + "dependencies": { + "jszip": ">=3.0.0" + } + }, "node_modules/dom-serializer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", diff --git a/package.json b/package.json index 8864d55895..8cdcd7333d 100644 --- a/package.json +++ b/package.json @@ -96,6 +96,7 @@ "codemirror-lang-hcl": "^0.1.0", "crc-32": "^1.2.2", "dayjs": "^1.11.10", + "docx-preview": "^0.4.0", "dompurify": "^3.2.6", "eventsource-parser": "^1.1.2", "fast-deep-equal": "^3.1.3", diff --git a/src/lib/components/chat/FileNav.svelte b/src/lib/components/chat/FileNav.svelte index f3cd3828b2..fe726defd8 100644 --- a/src/lib/components/chat/FileNav.svelte +++ b/src/lib/components/chat/FileNav.svelte @@ -184,6 +184,7 @@ let fileAudioUrl: string | null = null; let filePdfData: ArrayBuffer | null = null; let fileSqliteData: ArrayBuffer | null = null; + let fileDocxData: ArrayBuffer | null = null; let fileLoading = false; let filePreviewRef: FilePreview; @@ -247,8 +248,7 @@ const chatScoped = !!systemTerminal && chatConfig?.context_id === 'chat_id'; terminalChatContextHidden = !!systemTerminal && (chatConfig === false || (chatScoped && isTemporaryChatId(chatId))); - terminalChatContextPending = - chatScoped && !terminalChatContextHidden && !isSavedChatId(chatId); + terminalChatContextPending = chatScoped && !terminalChatContextHidden && !isSavedChatId(chatId); if (terminalChatContextHidden || terminalChatContextPending) return null; const userTerminal = ($settings?.terminalServers ?? []).find( @@ -395,6 +395,7 @@ } filePdfData = null; fileSqliteData = null; + fileDocxData = null; fileOfficeHtml = null; fileOfficeSlides = null; currentSlide = 0; @@ -505,10 +506,7 @@ const arrayBuffer = await result.blob.arrayBuffer(); try { if (ext === 'docx') { - const mammoth = await import('mammoth'); - const res = await mammoth.convertToHtml({ arrayBuffer }); - const DOMPurify = (await import('dompurify')).default; - fileOfficeHtml = DOMPurify.sanitize(res.value); + fileDocxData = arrayBuffer; } else if (ext === 'xlsx') { const XLSX = await import('xlsx'); const wb = XLSX.read(new Uint8Array(arrayBuffer), { type: 'array' }); @@ -1396,6 +1394,7 @@ {fileAudioUrl} {filePdfData} {fileSqliteData} + {fileDocxData} {fileContent} {fileOfficeHtml} {fileOfficeSlides} diff --git a/src/lib/components/chat/FileNav/FilePreview.svelte b/src/lib/components/chat/FileNav/FilePreview.svelte index ada8862ff3..37489d008a 100644 --- a/src/lib/components/chat/FileNav/FilePreview.svelte +++ b/src/lib/components/chat/FileNav/FilePreview.svelte @@ -9,6 +9,7 @@ import Spinner from '../../common/Spinner.svelte'; import PDFViewer from '../../common/PDFViewer.svelte'; import PanzoomContainer from '../../common/PanzoomContainer.svelte'; + import DocxPreview from '../../common/DocxPreview.svelte'; import JsonTreeView from './JsonTreeView.svelte'; import NotebookView from './NotebookView.svelte'; import SqliteView from './SqliteView.svelte'; @@ -26,6 +27,7 @@ export let fileAudioUrl: string | null = null; export let filePdfData: ArrayBuffer | null = null; export let fileSqliteData: ArrayBuffer | null = null; + export let fileDocxData: ArrayBuffer | null = null; export let fileContent: string | null = null; // Terminal connection for notebook execution @@ -271,7 +273,9 @@