5
0
Fork 0
mirror of https://0xacab.org/sutty/sutty synced 2024-07-03 12:36:08 +00:00
panel/app/javascript/packs/serializer.js
2020-03-21 12:46:48 -03:00

115 lines
3 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,
},
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,
},
},
)