|
|
|
import { MarkdownParser } from "prosemirror-markdown";
|
|
|
|
import markdownit from "markdown-it";
|
|
|
|
|
|
|
|
import { writeFreelySchema } from "./schema";
|
|
|
|
|
|
|
|
export const writeFreelyMarkdownParser = new MarkdownParser(
|
|
|
|
writeFreelySchema,
|
|
|
|
markdownit("commonmark", { html: true }),
|
|
|
|
{
|
|
|
|
blockquote: { block: "blockquote" },
|
|
|
|
paragraph: { block: "paragraph" },
|
|
|
|
list_item: { block: "list_item" },
|
|
|
|
bullet_list: { block: "bullet_list" },
|
|
|
|
ordered_list: {
|
|
|
|
block: "ordered_list",
|
|
|
|
getAttrs: (tok) => ({ order: +tok.attrGet("start") || 1 }),
|
|
|
|
},
|
|
|
|
heading: {
|
|
|
|
block: "heading",
|
|
|
|
getAttrs: (tok) => ({ level: +tok.tag.slice(1) }),
|
|
|
|
},
|
|
|
|
code_block: { block: "code_block", noCloseToken: true },
|
|
|
|
fence: {
|
|
|
|
block: "code_block",
|
|
|
|
getAttrs: (tok) => ({ params: tok.info || "" }),
|
|
|
|
noCloseToken: true,
|
|
|
|
},
|
|
|
|
hr: { node: "horizontal_rule" },
|
|
|
|
image: {
|
|
|
|
node: "image",
|
|
|
|
getAttrs: (tok) => ({
|
|
|
|
src: tok.attrGet("src"),
|
|
|
|
title: tok.attrGet("title") || null,
|
|
|
|
alt: (tok.children !== null && typeof tok.children[0] !== 'undefined' ? tok.children[0].content : null),
|
|
|
|
}),
|
|
|
|
},
|
|
|
|
hardbreak: { node: "hard_break" },
|
|
|
|
|
|
|
|
em: { mark: "em" },
|
|
|
|
strong: { mark: "strong" },
|
|
|
|
link: {
|
|
|
|
mark: "link",
|
|
|
|
getAttrs: (tok) => ({
|
|
|
|
href: tok.attrGet("href"),
|
|
|
|
title: tok.attrGet("title") || null,
|
|
|
|
}),
|
|
|
|
},
|
|
|
|
code_inline: { mark: "code", noCloseToken: true },
|
|
|
|
html_block: {
|
|
|
|
node: "readmore",
|
|
|
|
getAttrs(token) {
|
|
|
|
// TODO: Give different attributes depending on the token content
|
|
|
|
return {};
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
);
|