mirror of
https://0xacab.org/sutty/sutty
synced 2024-10-04 22:36:57 +00:00
75 lines
2.5 KiB
JavaScript
75 lines
2.5 KiB
JavaScript
|
// 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}
|
||
|
})
|