// From https://raw.githubusercontent.com/ProseMirror/prosemirror-markdown/master/src/to_markdown.js import {MarkdownSerializer} from "prosemirror-markdown" export default new MarkdownSerializer({ blockquote(state, node) { state.wrapBlock("> ", null, node, () => state.renderContent(node)) }, code_block(state, node) { state.write("```" + (node.attrs.params || "") + "\n") state.text(node.textContent, false) state.ensureNewLine() state.write("```") state.closeBlock(node) }, heading(state, node) { state.write(state.repeat("#", node.attrs.level) + " ") state.renderInline(node) state.closeBlock(node) }, horizontal_rule(state, node) { state.write(node.attrs.markup || "---") state.closeBlock(node) }, bullet_list(state, node) { state.renderList(node, " ", () => (node.attrs.bullet || "*") + " ") }, ordered_list(state, node) { let start = node.attrs.order || 1 let maxW = String(start + node.childCount - 1).length let space = state.repeat(" ", maxW + 2) state.renderList(node, space, i => { let nStr = String(start + i) return state.repeat(" ", maxW - nStr.length) + nStr + ". " }) }, list_item(state, node) { state.renderContent(node) }, paragraph(state, node) { state.renderInline(node) state.closeBlock(node) }, image(state, node) { state.write("![" + state.esc(node.attrs.alt || "") + "](" + state.esc(node.attrs.src) + (node.attrs.title ? " " + state.quote(node.attrs.title) : "") + ")") }, hard_break(state, node, parent, index) { for (let i = index + 1; i < parent.childCount; i++) if (parent.child(i).type != node.type) { state.write("\\\n") return } }, text(state, node) { state.text(node.text) } }, { em: {open: "*", close: "*", mixable: true, expelEnclosingWhitespace: true}, strong: {open: "**", close: "**", mixable: true, expelEnclosingWhitespace: true}, mark: {open: "==", close: "==", mixable: true, expelEnclosingWhitespace: true}, link: { open(_state, mark, parent, index) { return isPlainURL(mark, parent, index, 1) ? "<" : "[" }, close(state, mark, parent, index) { return isPlainURL(mark, parent, index, -1) ? ">" : "](" + state.esc(mark.attrs.href) + (mark.attrs.title ? " " + state.quote(mark.attrs.title) : "") + ")" } }, code: {open(_state, _mark, parent, index) { return backticksFor(parent.child(index), -1) }, close(_state, _mark, parent, index) { return backticksFor(parent.child(index - 1), 1) }, escape: false} })