2020-03-21 03:20:59 +00:00
|
|
|
// From https://raw.githubusercontent.com/ProseMirror/prosemirror-markdown/master/src/to_markdown.js
|
2020-03-21 15:46:48 +00:00
|
|
|
import { MarkdownSerializer } from 'prosemirror-markdown'
|
2020-03-21 03:20:59 +00:00
|
|
|
|
2020-03-21 15:46:48 +00:00
|
|
|
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)
|
|
|
|
},
|
2020-03-21 03:20:59 +00:00
|
|
|
|
2020-03-21 15:46:48 +00:00
|
|
|
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)
|
|
|
|
},
|
2020-03-21 03:20:59 +00:00
|
|
|
},
|
2020-03-21 15:46:48 +00:00
|
|
|
{
|
|
|
|
em: {
|
|
|
|
open: '*',
|
|
|
|
close: '*',
|
|
|
|
mixable: true,
|
|
|
|
expelEnclosingWhitespace: true,
|
|
|
|
},
|
|
|
|
strong: {
|
|
|
|
open: '**',
|
|
|
|
close: '**',
|
|
|
|
mixable: true,
|
|
|
|
expelEnclosingWhitespace: true,
|
|
|
|
},
|
|
|
|
mark: {
|
|
|
|
open: '==',
|
|
|
|
close: '==',
|
|
|
|
mixable: true,
|
|
|
|
expelEnclosingWhitespace: true,
|
|
|
|
},
|
|
|
|
strikethrough: {
|
|
|
|
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,
|
|
|
|
},
|
2020-03-21 03:20:59 +00:00
|
|
|
},
|
2020-03-21 15:46:48 +00:00
|
|
|
)
|