114 lines
3.4 KiB
JavaScript
114 lines
3.4 KiB
JavaScript
import {Schema} from "prosemirror-model"
|
|
|
|
// :: Schema
|
|
// This schema roughly corresponds to the document schema used by
|
|
// [CommonMark](http://commonmark.org/), minus the list elements,
|
|
// which are defined in the [`prosemirror-schema-list`](#schema-list)
|
|
// module.
|
|
//
|
|
// To reuse elements from this schema, extend or read from its
|
|
// `spec.nodes` and `spec.marks` [properties](#model.Schema.spec).
|
|
|
|
// BASIC
|
|
const basicSchema = {
|
|
nodes : {
|
|
// :: NodeSpec The top level document node.
|
|
doc: {
|
|
content: "block+"
|
|
},
|
|
// :: NodeSpec A plain paragraph textblock. Represented in the DOM
|
|
// as a `<p>` element.
|
|
paragraph: {
|
|
content: "inline*",
|
|
group: "block",
|
|
parseDOM: [{tag: "p"}],
|
|
toDOM() { return ["p", 0] }
|
|
},
|
|
// :: NodeSpec A hard line break, represented in the DOM as `<br>`.
|
|
hard_break: {
|
|
inline: true,
|
|
group: "inline",
|
|
selectable: false,
|
|
parseDOM: [{tag: "br"}],
|
|
toDOM() { return ["br"] }
|
|
},
|
|
// :: NodeSpec The text node.
|
|
text: {
|
|
group: "inline"
|
|
},
|
|
},
|
|
marks : {
|
|
// :: MarkSpec An emphasis mark. Rendered as an `<em>` element.
|
|
// Has parse rules that also match `<i>` and `font-style: italic`.
|
|
em: {
|
|
parseDOM: [{tag: "i"}, {tag: "em"}, {style: "font-style=italic"}],
|
|
toDOM() { return ["em", 0] }
|
|
},
|
|
// :: MarkSpec A strong mark. Rendered as `<strong>`, parse rules
|
|
// also match `<b>` and `font-weight: bold`.
|
|
strong: {
|
|
parseDOM: [{tag: "strong"},
|
|
// This works around a Google Docs misbehavior where
|
|
// pasted content will be inexplicably wrapped in `<b>`
|
|
// tags with a font-weight normal.
|
|
{tag: "b", getAttrs: node => node.style.fontWeight != "normal" && null},
|
|
{style: "font-weight", getAttrs: value => /^(bold(er)?|[5-9]\d{2,})$/.test(value) && null}],
|
|
toDOM() { return ["strong", 0] }
|
|
}
|
|
}
|
|
}
|
|
|
|
// HEADERS
|
|
const headersSchema = {
|
|
nodes: {
|
|
// :: NodeSpec A heading textblock, with a `level` attribute that
|
|
// should hold the number 1 to 6. Parsed and serialized as `<h1>` to
|
|
// `<h6>` elements.
|
|
heading: {
|
|
attrs: {level: {default: 1}},
|
|
content: "inline*",
|
|
marks: "em",
|
|
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] }
|
|
}
|
|
}
|
|
}
|
|
|
|
// HEADERS
|
|
const linkSchema = {
|
|
marks: {
|
|
link: {
|
|
attrs: {
|
|
href: {},
|
|
title: {default: null}
|
|
},
|
|
inclusive: false,
|
|
parseDOM: [{tag: "a[href]", getAttrs(dom) {
|
|
return {href: dom.getAttribute("href"), title: dom.getAttribute("title")}
|
|
}}],
|
|
toDOM(node) { let {href, title} = node.attrs; return ["a", {href, title}, 0] }
|
|
},
|
|
}
|
|
}
|
|
|
|
const basic_schema = new Schema(basicSchema);
|
|
|
|
const headers_schema = new Schema({
|
|
nodes: basic_schema.spec.nodes.append(headersSchema.nodes),
|
|
marks: basic_schema.spec.marks
|
|
});
|
|
|
|
const full_schema = new Schema({
|
|
nodes: basic_schema.spec.nodes.append(headersSchema.nodes),
|
|
marks: basic_schema.spec.marks.append(linkSchema.marks)
|
|
})
|
|
|
|
export { basic_schema, headers_schema, full_schema };
|