91 lines
3.2 KiB
JavaScript
91 lines
3.2 KiB
JavaScript
|
|
import {Schema} from "prosemirror-model";
|
||
|
|
import {splitListItem} from "prosemirror-schema-list";
|
||
|
|
import {
|
||
|
|
paragraph, blockquote, hr as horizontal_rule, heading, pre as code_block, br as hard_break
|
||
|
|
} from "./schema/core.mjs";
|
||
|
|
import {ol as ordered_list, ul as bullet_list, li as list_item, liText as list_item_text} from "./schema/lists.mjs";
|
||
|
|
import{
|
||
|
|
builtInTableNodes, tableComplex as table_complex, colgroup, col, thead, tbody, tfoot, caption,
|
||
|
|
captionBlock as caption_block, tableRowComplex as table_row_complex, tableCellComplex as table_cell_complex,
|
||
|
|
tableCellComplexBlock as table_cell_complex_block, tableHeaderComplex as table_header_complex,
|
||
|
|
tableHeaderComplexBlock as table_header_complex_block
|
||
|
|
} from "./schema/tables.mjs";
|
||
|
|
import {
|
||
|
|
details, summary, summaryBlock as summary_block, dl, dt, dd, fieldset, legend, picture, audio, video, track, source,
|
||
|
|
object, figure, figcaption, small, ruby, rp, rt, iframe
|
||
|
|
} from "./schema/other.mjs"
|
||
|
|
import {
|
||
|
|
superscript, subscript, span, font, em, strong, underline, strikethrough, code
|
||
|
|
} from "./schema/marks.mjs";
|
||
|
|
import ImageNode from "./schema/image-node.mjs";
|
||
|
|
import LinkMark from "./schema/link-mark.mjs";
|
||
|
|
import ImageLinkNode from "./schema/image-link-node.mjs";
|
||
|
|
import SecretNode from "./schema/secret-node.mjs";
|
||
|
|
import AttributeCapture from "./schema/attribute-capture.mjs";
|
||
|
|
|
||
|
|
const doc = {
|
||
|
|
content: "block+"
|
||
|
|
};
|
||
|
|
|
||
|
|
const text = {
|
||
|
|
group: "inline"
|
||
|
|
};
|
||
|
|
|
||
|
|
const secret = SecretNode.make();
|
||
|
|
const link = LinkMark.make();
|
||
|
|
const image = ImageNode.make();
|
||
|
|
const imageLink = ImageLinkNode.make();
|
||
|
|
|
||
|
|
export const nodes = {
|
||
|
|
// Core Nodes.
|
||
|
|
doc, text, paragraph, blockquote, secret, horizontal_rule, heading, code_block, image_link: imageLink, image,
|
||
|
|
hard_break,
|
||
|
|
|
||
|
|
// Lists.
|
||
|
|
ordered_list, bullet_list, list_item, list_item_text,
|
||
|
|
|
||
|
|
// Tables
|
||
|
|
table_complex, tbody, thead, tfoot, caption, caption_block, colgroup, col, table_row_complex, table_cell_complex,
|
||
|
|
table_header_complex, table_cell_complex_block, table_header_complex_block,
|
||
|
|
...builtInTableNodes,
|
||
|
|
|
||
|
|
// Misc.
|
||
|
|
details, summary, summary_block, dl, dt, dd, fieldset, legend, picture, audio, video, track, source, object, figure,
|
||
|
|
figcaption, small, ruby, rp, rt, iframe
|
||
|
|
};
|
||
|
|
|
||
|
|
export const marks = {superscript, subscript, span, font, link, em, strong, underline, strikethrough, code};
|
||
|
|
|
||
|
|
// Auto-generated specifications for HTML preservation.
|
||
|
|
["header", "main", "section", "article", "aside", "nav", "footer", "div", "address"].forEach(tag => {
|
||
|
|
nodes[tag] = {
|
||
|
|
content: "block+",
|
||
|
|
group: "block",
|
||
|
|
defining: true,
|
||
|
|
parseDOM: [{tag}],
|
||
|
|
toDOM: () => [tag, 0]
|
||
|
|
};
|
||
|
|
});
|
||
|
|
|
||
|
|
["abbr", "cite", "mark", "q", "time", "ins"].forEach(tag => {
|
||
|
|
marks[tag] = {
|
||
|
|
parseDOM: [{tag}],
|
||
|
|
toDOM: () => [tag, 0]
|
||
|
|
};
|
||
|
|
});
|
||
|
|
|
||
|
|
const all = Object.values(nodes).concat(Object.values(marks));
|
||
|
|
const capture = new AttributeCapture();
|
||
|
|
all.forEach(capture.attributeCapture.bind(capture));
|
||
|
|
|
||
|
|
export const schema = new Schema({nodes, marks});
|
||
|
|
|
||
|
|
/* -------------------------------------------- */
|
||
|
|
/* Handlers */
|
||
|
|
/* -------------------------------------------- */
|
||
|
|
|
||
|
|
schema.nodes.list_item.split = splitListItem(schema.nodes.list_item);
|
||
|
|
schema.nodes.secret.split = SecretNode.split;
|
||
|
|
schema.marks.link.onClick = LinkMark.onClick;
|
||
|
|
schema.nodes.image_link.onClick = ImageLinkNode.onClick;
|