mirror of
https://github.com/BookStackApp/BookStack.git
synced 2025-06-27 16:41:53 +03:00
184 lines
4.1 KiB
JavaScript
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; |