+const doc = {
+ content: "block+",
+};
+
+const paragraph = {
+ content: "inline*",
+ group: "block",
+ parseDOM: [{tag: "p"}],
+ toDOM() {
+ return ["p", 0];
+ }
+};
+
+const blockquote = {
+ content: "block+",
+ group: "block",
+ defining: true,
+ parseDOM: [{tag: "blockquote"}],
+ toDOM() {
+ return ["blockquote", 0];
+ }
+};
+
+const horizontal_rule = {
+ group: "block",
+ parseDOM: [{tag: "hr"}],
+ toDOM() {
+ return ["hr"];
+ }
+};
+
+const heading = {
+ attrs: {level: {default: 1}},
+ content: "inline*",
+ group: "block",
+ defining: true,
+ parseDOM: [{tag: "h1", attrs: {level: 1}},
+ {tag: "h2", attrs: {level: 2}},
+ {tag: "h3", attrs: {level: 3}},
+ {tag: "h4", attrs: {level: 4}},
+ {tag: "h5", attrs: {level: 5}},
+ {tag: "h6", attrs: {level: 6}}],
+ toDOM(node) {
+ return ["h" + node.attrs.level, 0]
+ }
+};
+
+const code_block = {
+ content: "text*",
+ marks: "",
+ group: "block",
+ code: true,
+ defining: true,
+ parseDOM: [{tag: "pre", preserveWhitespace: "full"}],
+ toDOM() {
+ return ["pre", ["code", 0]];
+ }
+};
+
+const text = {
+ group: "inline"
+};
+
+const image = {
+ inline: true,
+ attrs: {
+ src: {},
+ alt: {default: null},
+ title: {default: null}
+ },
+ group: "inline",
+ draggable: true,
+ parseDOM: [{
+ tag: "img[src]", getAttrs: function getAttrs(dom) {
+ return {
+ src: dom.getAttribute("src"),
+ title: dom.getAttribute("title"),
+ alt: dom.getAttribute("alt")
+ }
+ }
+ }],
+ toDOM: function toDOM(node) {
+ const ref = node.attrs;
+ const src = ref.src;
+ const alt = ref.alt;
+ const title = ref.title;
+ return ["img", {src: src, alt: alt, title: title}]
+ }
+};
+
+const hard_break = {
+ inline: true,
+ group: "inline",
+ selectable: false,
+ parseDOM: [{tag: "br"}],
+ toDOM() {
+ return ["br"];
+ }
+};