mirror of https://github.com/fantasticit/think.git
fix charset; use file-saver
parent
00a6d034ba
commit
241bcab7f9
|
@ -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",
|
||||||
|
|
|
@ -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]);
|
||||||
|
|
|
@ -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,
|
||||||
});
|
});
|
||||||
|
|
|
@ -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);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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'}
|
||||||
|
|
Loading…
Reference in New Issue