fix charset; use file-saver

This commit is contained in:
fantasticit 2023-01-08 20:01:00 +08:00
parent 00a6d034ba
commit 241bcab7f9
5 changed files with 21 additions and 18 deletions

View File

@ -64,7 +64,7 @@
"cross-env": "^7.0.3", "cross-env": "^7.0.3",
"deep-equal": "^2.0.5", "deep-equal": "^2.0.5",
"dompurify": "^2.3.5", "dompurify": "^2.3.5",
"downloadjs": "^1.4.7", "file-saver": "^2.0.5",
"htmldiff-js": "^1.0.5", "htmldiff-js": "^1.0.5",
"interactjs": "^1.10.11", "interactjs": "^1.10.11",
"katex": "^0.15.2", "katex": "^0.15.2",

View File

@ -2,7 +2,7 @@ import { Badge, Button, Dropdown, Modal, Space, Typography } from '@douyinfe/sem
import { IDocument } from '@think/domains'; import { IDocument } from '@think/domains';
import { IconJSON, IconMarkdown, IconPDF, IconWord } from 'components/icons'; import { IconJSON, IconMarkdown, IconPDF, IconWord } from 'components/icons';
import { useDocumentDetail } from 'data/document'; import { useDocumentDetail } from 'data/document';
import download from 'downloadjs'; import FileSaver from 'file-saver';
import { safeJSONParse, safeJSONStringify } from 'helpers/json'; import { safeJSONParse, safeJSONStringify } from 'helpers/json';
import { IsOnMobile } from 'hooks/use-on-mobile'; import { IsOnMobile } from 'hooks/use-on-mobile';
import { useToggle } from 'hooks/use-toggle'; import { useToggle } from 'hooks/use-toggle';
@ -40,18 +40,21 @@ export const DocumentExporter: React.FC<IProps> = ({ document, render }) => {
const exportMarkdown = useCallback(() => { const exportMarkdown = useCallback(() => {
const md = prosemirrorToMarkdown({ content: editor.state.doc.slice(0).content }); const md = prosemirrorToMarkdown({ content: editor.state.doc.slice(0).content });
download(md, `${document.title}.md`, 'text/plain'); const blob = new Blob([md], { type: 'text/plain;charset=utf-8' });
FileSaver.saveAs(blob, `${document.title}.md`);
}, [document, editor]); }, [document, editor]);
const exportJSON = useCallback(() => { const exportJSON = useCallback(() => {
download(safeJSONStringify(editor.getJSON()), `${document.title}.json`, 'text/plain'); const blob = new Blob([safeJSONStringify(editor.getJSON())], { type: 'text/plain;charset=utf-8' });
FileSaver.saveAs(blob, `${document.title}.json`);
}, [document, editor]); }, [document, editor]);
const exportWord = useCallback(() => { const exportWord = useCallback(() => {
const editorContent = editor.view.dom.closest('.ProseMirror'); const editorContent = editor.view.dom.closest('.ProseMirror');
if (editorContent) { if (editorContent) {
exportDocx(editorContent.outerHTML).then((res) => { exportDocx(editorContent.outerHTML).then((res) => {
download(Buffer.from(res as Buffer), `${document.title}.docx`); const blob = new Blob([Buffer.from(res as Buffer)], { type: 'text/plain;charset=utf-8' });
FileSaver.saveAs(blob, `${document.title}.docx`);
}); });
} }
}, [editor, exportDocx, document]); }, [editor, exportDocx, document]);

View File

@ -159,7 +159,9 @@ const SerializerConfig = {
[TaskList.name]: (state, node) => { [TaskList.name]: (state, node) => {
state.renderList(node, ' ', () => (node.attrs.bullet || '*') + ' '); state.renderList(node, ' ', () => (node.attrs.bullet || '*') + ' ');
}, },
[Text.name]: defaultMarkdownSerializer.nodes.text, [Text.name]: (state, node) => {
state.text(node.text, false);
},
[Title.name]: renderHTMLNode('div', false, true, { class: 'title' }), [Title.name]: renderHTMLNode('div', false, true, { class: 'title' }),
}, },
}; };
@ -171,6 +173,7 @@ const SerializerConfig = {
*/ */
export const prosemirrorToMarkdown = ({ content }) => { export const prosemirrorToMarkdown = ({ content }) => {
const serializer = new ProseMirrorMarkdownSerializer(SerializerConfig.nodes, SerializerConfig.marks); const serializer = new ProseMirrorMarkdownSerializer(SerializerConfig.nodes, SerializerConfig.marks);
const markdown = serializer.serialize(content, { const markdown = serializer.serialize(content, {
tightLists: true, tightLists: true,
}); });

View File

@ -1,8 +1,5 @@
import FileSaver from 'file-saver';
export function download(url, name) { export function download(url, name) {
const link = document.createElement('a'); FileSaver.saveAs(url, name);
link.download = name;
link.href = url;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
} }

View File

@ -102,7 +102,6 @@ importers:
cross-env: ^7.0.3 cross-env: ^7.0.3
deep-equal: ^2.0.5 deep-equal: ^2.0.5
dompurify: ^2.3.5 dompurify: ^2.3.5
downloadjs: ^1.4.7
eslint: ^8.14.0 eslint: ^8.14.0
eslint-config-prettier: ^8.5.0 eslint-config-prettier: ^8.5.0
eslint-plugin-import: ^2.26.0 eslint-plugin-import: ^2.26.0
@ -110,6 +109,7 @@ importers:
eslint-plugin-react: ^7.29.4 eslint-plugin-react: ^7.29.4
eslint-plugin-react-hooks: ^4.5.0 eslint-plugin-react-hooks: ^4.5.0
eslint-plugin-simple-import-sort: ^7.0.0 eslint-plugin-simple-import-sort: ^7.0.0
file-saver: ^2.0.5
fs-extra: ^10.0.0 fs-extra: ^10.0.0
htmldiff-js: ^1.0.5 htmldiff-js: ^1.0.5
interactjs: ^1.10.11 interactjs: ^1.10.11
@ -213,7 +213,7 @@ importers:
cross-env: 7.0.3 cross-env: 7.0.3
deep-equal: 2.0.5 deep-equal: 2.0.5
dompurify: 2.3.5 dompurify: 2.3.5
downloadjs: 1.4.7 file-saver: 2.0.5
htmldiff-js: 1.0.5 htmldiff-js: 1.0.5
interactjs: 1.10.11 interactjs: 1.10.11
katex: 0.15.2 katex: 0.15.2
@ -5774,10 +5774,6 @@ packages:
engines: {node: '>=10'} engines: {node: '>=10'}
dev: false dev: false
/downloadjs/1.4.7:
resolution: {integrity: sha512-LN1gO7+u9xjU5oEScGFKvXhYf7Y/empUIIEAGBs1LzUq/rg5duiDrkuH5A2lQGd5jfMOb9X9usDa2oVXwJ0U/Q==}
dev: false
/duplexify/4.1.2: /duplexify/4.1.2:
resolution: {integrity: sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==} resolution: {integrity: sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==}
dependencies: dependencies:
@ -6509,6 +6505,10 @@ packages:
flat-cache: 3.0.4 flat-cache: 3.0.4
dev: true dev: true
/file-saver/2.0.5:
resolution: {integrity: sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==}
dev: false
/file-uri-to-path/2.0.0: /file-uri-to-path/2.0.0:
resolution: {integrity: sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg==} resolution: {integrity: sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg==}
engines: {node: '>= 6'} engines: {node: '>= 6'}