1
0
mirror of https://github.com/BookStackApp/BookStack.git synced 2025-06-27 16:41:53 +03:00
Files
bookstack/resources/js/editor/schema-nodes.js

184 lines
4.1 KiB
JavaScript

import {orderedList, bulletList, listItem} from "prosemirror-schema-list";
const alignAttrFromDomNode = node => {
if (node.classList.contains('align-right')) {
return 'right';
}
if (node.classList.contains('align-left')) {
return 'left';
}
if (node.classList.contains('align-center')) {
return 'center';
}
if (node.classList.contains('align-justify')) {
return 'justify';
}
return null;
};
const doc = {
content: "block+",
};
const paragraph = {
content: "inline*",
group: "block",
parseDOM: [
{
tag: "p",
getAttrs(node) {
return {
align: alignAttrFromDomNode(node),
};
}
}
],
attrs: {
align: {
default: null,
}
},
toDOM(node) {
const attrs = {};
if (node.attrs.align === 'right') {
attrs['class'] = 'align-right';
}
if (node.attrs.align === 'left') {
attrs['class'] = 'align-left';
}
return ["p", attrs, 0];
}
};
const blockquote = {
content: "block+",
group: "block",
defining: true,
parseDOM: [{tag: "blockquote"}],
align: {
default: null,
},
toDOM() {
return ["blockquote", 0];
}
};
const horizontal_rule = {
group: "block",
parseDOM: [{tag: "hr"}],
toDOM() {
return ["hr"];
}
};
const heading = {
attrs: {level: {default: 1}, align: {default: null}},
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"];
}
};
const callout = {
attrs: {
type: {default: 'info'},
align: {default: null},
},
content: "inline*",
group: "block",
defining: true,
parseDOM: [
{tag: 'p.callout.info', attrs: {type: 'info'}, priority: 75,},
{tag: 'p.callout.success', attrs: {type: 'success'}, priority: 75,},
{tag: 'p.callout.danger', attrs: {type: 'danger'}, priority: 75,},
{tag: 'p.callout.warning', attrs: {type: 'warning'}, priority: 75,},
{tag: 'p.callout', attrs: {type: 'info'}, priority: 75},
],
toDOM(node) {
const type = node.attrs.type || 'info';
return ['p', {class: 'callout ' + type}, 0];
}
};
const ordered_list = Object.assign({}, orderedList, {content: "list_item+", group: "block"});
const bullet_list = Object.assign({}, bulletList, {content: "list_item+", group: "block"});
const list_item = Object.assign({}, listItem, {content: 'paragraph block*'});
const nodes = {
doc,
paragraph,
blockquote,
horizontal_rule,
heading,
code_block,
text,
image,
hard_break,
callout,
ordered_list,
bullet_list,
list_item,
};
export default nodes;