]> BookStack Code Mirror - bookstack/blob - resources/js/editor/markdown-serializer.js
c194ceaf7874c6552741fbaae1f7c87bb02702aa
[bookstack] / resources / js / editor / markdown-serializer.js
1 import {MarkdownSerializer, defaultMarkdownSerializer} from "prosemirror-markdown";
2 import {docToHtml} from "./util";
3
4 const nodes = defaultMarkdownSerializer.nodes;
5 const marks = defaultMarkdownSerializer.marks;
6
7
8 nodes.callout = function(state, node) {
9     writeNodeAsHtml(state, node);
10 };
11
12
13 marks.underline = {
14     open: '<span style="text-decoration: underline;">',
15     close: '</span>',
16 };
17
18 marks.strike = {
19     open: '<span style="text-decoration: line-through;">',
20     close: '</span>',
21 };
22
23 marks.superscript = {
24     open: '<sup>',
25     close: '</sup>',
26 };
27
28 marks.subscript = {
29     open: '<sub>',
30     close: '</sub>',
31 };
32
33
34 function writeNodeAsHtml(state, node) {
35     const html = docToHtml({ content: [node] });
36     state.write(html);
37     state.ensureNewLine();
38     state.write('\n');
39     state.closeBlock();
40 }
41
42 // Update serializers to just write out as HTML if we have an attribute
43 // or element that cannot be represented in commonmark without losing
44 // formatting or content.
45 for (const [nodeType, serializerFunction] of Object.entries(nodes)) {
46     nodes[nodeType] = function(state, node) {
47         if (node.attrs.align) {
48             writeNodeAsHtml(state, node);
49         } else {
50             serializerFunction(state, node);
51         }
52     }
53 }
54
55
56 const serializer = new MarkdownSerializer(nodes, marks);
57
58 export default serializer;