211 lines
4.7 KiB
JavaScript
211 lines
4.7 KiB
JavaScript
|
|
import {isElementEmpty, onlyInlineContent} from "./utils.mjs";
|
||
|
|
|
||
|
|
// These nodes are supported for HTML preservation purposes, but do not have robust editing support for now.
|
||
|
|
|
||
|
|
export const details = {
|
||
|
|
content: "(summary | summary_block) block*",
|
||
|
|
group: "block",
|
||
|
|
defining: true,
|
||
|
|
parseDOM: [{tag: "details"}],
|
||
|
|
toDOM: () => ["details", 0]
|
||
|
|
};
|
||
|
|
|
||
|
|
/* -------------------------------------------- */
|
||
|
|
|
||
|
|
export const summary = {
|
||
|
|
content: "text*",
|
||
|
|
defining: true,
|
||
|
|
parseDOM: [{tag: "summary", getAttrs: el => {
|
||
|
|
// If this contains any non-inline elements, do not use this node type.
|
||
|
|
if ( !isElementEmpty(el) && !onlyInlineContent(el) ) return false;
|
||
|
|
}}],
|
||
|
|
toDOM: () => ["summary", 0]
|
||
|
|
};
|
||
|
|
|
||
|
|
/* -------------------------------------------- */
|
||
|
|
|
||
|
|
export const summaryBlock = {
|
||
|
|
content: "block+",
|
||
|
|
defining: true,
|
||
|
|
parseDOM: [{tag: "summary", getAttrs: el => {
|
||
|
|
// If this contains only text nodes and no elements, do not use this node type.
|
||
|
|
if ( isElementEmpty(el) || onlyInlineContent(el) ) return false;
|
||
|
|
}}],
|
||
|
|
toDOM: () => ["summary", 0]
|
||
|
|
};
|
||
|
|
|
||
|
|
/* -------------------------------------------- */
|
||
|
|
|
||
|
|
export const dl = {
|
||
|
|
content: "(block|dt|dd)*",
|
||
|
|
group: "block",
|
||
|
|
defining: true,
|
||
|
|
parseDOM: [{tag: "dl"}],
|
||
|
|
toDOM: () => ["dl", 0]
|
||
|
|
};
|
||
|
|
|
||
|
|
/* -------------------------------------------- */
|
||
|
|
|
||
|
|
export const dt = {
|
||
|
|
content: "block+",
|
||
|
|
defining: true,
|
||
|
|
parseDOM: [{tag: "dt"}],
|
||
|
|
toDOM: () => ["dt", 0]
|
||
|
|
};
|
||
|
|
|
||
|
|
/* -------------------------------------------- */
|
||
|
|
|
||
|
|
export const dd = {
|
||
|
|
content: "block+",
|
||
|
|
defining: true,
|
||
|
|
parseDOM: [{tag: "dd"}],
|
||
|
|
toDOM: () => ["dd", 0]
|
||
|
|
};
|
||
|
|
|
||
|
|
/* -------------------------------------------- */
|
||
|
|
|
||
|
|
export const fieldset = {
|
||
|
|
content: "legend block*",
|
||
|
|
group: "block",
|
||
|
|
defining: true,
|
||
|
|
parseDOM: [{tag: "fieldset"}],
|
||
|
|
toDOM: () => ["fieldset", 0]
|
||
|
|
};
|
||
|
|
|
||
|
|
/* -------------------------------------------- */
|
||
|
|
|
||
|
|
export const legend = {
|
||
|
|
content: "inline+",
|
||
|
|
defining: true,
|
||
|
|
parseDOM: [{tag: "legend"}],
|
||
|
|
toDOM: () => ["legend", 0]
|
||
|
|
};
|
||
|
|
|
||
|
|
/* -------------------------------------------- */
|
||
|
|
|
||
|
|
export const picture = {
|
||
|
|
content: "source* image",
|
||
|
|
group: "block",
|
||
|
|
defining: true,
|
||
|
|
parseDOM: [{tag: "picture"}],
|
||
|
|
toDOM: () => ["picture", 0]
|
||
|
|
};
|
||
|
|
|
||
|
|
/* -------------------------------------------- */
|
||
|
|
|
||
|
|
export const audio = {
|
||
|
|
content: "source* track*",
|
||
|
|
group: "block",
|
||
|
|
parseDOM: [{tag: "audio"}],
|
||
|
|
toDOM: () => ["audio", 0]
|
||
|
|
};
|
||
|
|
|
||
|
|
/* -------------------------------------------- */
|
||
|
|
|
||
|
|
export const video = {
|
||
|
|
content: "source* track*",
|
||
|
|
group: "block",
|
||
|
|
parseDOM: [{tag: "video"}],
|
||
|
|
toDOM: () => ["video", 0]
|
||
|
|
};
|
||
|
|
|
||
|
|
/* -------------------------------------------- */
|
||
|
|
|
||
|
|
export const track = {
|
||
|
|
parseDOM: [{tag: "track"}],
|
||
|
|
toDOM: () => ["track"]
|
||
|
|
};
|
||
|
|
|
||
|
|
/* -------------------------------------------- */
|
||
|
|
|
||
|
|
export const source = {
|
||
|
|
parseDOM: [{tag: "source"}],
|
||
|
|
toDOM: () => ["source"]
|
||
|
|
}
|
||
|
|
|
||
|
|
/* -------------------------------------------- */
|
||
|
|
|
||
|
|
export const object = {
|
||
|
|
inline: true,
|
||
|
|
group: "inline",
|
||
|
|
parseDOM: [{tag: "object"}],
|
||
|
|
toDOM: () => ["object"]
|
||
|
|
};
|
||
|
|
|
||
|
|
/* -------------------------------------------- */
|
||
|
|
|
||
|
|
export const figure = {
|
||
|
|
content: "(figcaption|block)*",
|
||
|
|
group: "block",
|
||
|
|
defining: true,
|
||
|
|
parseDOM: [{tag: "figure"}],
|
||
|
|
toDOM: () => ["figure", 0]
|
||
|
|
};
|
||
|
|
|
||
|
|
/* -------------------------------------------- */
|
||
|
|
|
||
|
|
export const figcaption = {
|
||
|
|
content: "inline+",
|
||
|
|
defining: true,
|
||
|
|
parseDOM: [{tag: "figcaption"}],
|
||
|
|
toDOM: () => ["figcaption", 0]
|
||
|
|
};
|
||
|
|
|
||
|
|
/* -------------------------------------------- */
|
||
|
|
|
||
|
|
export const small = {
|
||
|
|
content: "paragraph block*",
|
||
|
|
group: "block",
|
||
|
|
defining: true,
|
||
|
|
parseDOM: [{tag: "small"}],
|
||
|
|
toDOM: () => ["small", 0]
|
||
|
|
};
|
||
|
|
|
||
|
|
/* -------------------------------------------- */
|
||
|
|
|
||
|
|
export const ruby = {
|
||
|
|
content: "(rp|rt|block)+",
|
||
|
|
group: "block",
|
||
|
|
defining: true,
|
||
|
|
parseDOM: [{tag: "ruby"}],
|
||
|
|
toDOM: () => ["ruby", 0]
|
||
|
|
};
|
||
|
|
|
||
|
|
/* -------------------------------------------- */
|
||
|
|
|
||
|
|
export const rp = {
|
||
|
|
content: "inline+",
|
||
|
|
parseDOM: [{tag: "rp"}],
|
||
|
|
toDOM: () => ["rp", 0]
|
||
|
|
};
|
||
|
|
|
||
|
|
/* -------------------------------------------- */
|
||
|
|
|
||
|
|
export const rt = {
|
||
|
|
content: "inline+",
|
||
|
|
parseDOM: [{tag: "rt"}],
|
||
|
|
toDOM: () => ["rt", 0]
|
||
|
|
};
|
||
|
|
|
||
|
|
/* -------------------------------------------- */
|
||
|
|
|
||
|
|
export const iframe = {
|
||
|
|
attrs: { sandbox: { default: "allow-scripts allow-forms" } },
|
||
|
|
managed: { attributes: ["sandbox"] },
|
||
|
|
group: "block",
|
||
|
|
defining: true,
|
||
|
|
parseDOM: [{tag: "iframe", getAttrs: el => {
|
||
|
|
let sandbox = "allow-scripts allow-forms";
|
||
|
|
const url = URL.parseSafe(el.src);
|
||
|
|
const host = url?.hostname;
|
||
|
|
const isTrusted = CONST.TRUSTED_IFRAME_DOMAINS.some(domain => (host === domain) || host?.endsWith(`.${domain}`));
|
||
|
|
if ( isTrusted ) sandbox = null;
|
||
|
|
return { sandbox };
|
||
|
|
}}],
|
||
|
|
toDOM: node => {
|
||
|
|
const attrs = {};
|
||
|
|
if ( node.attrs.sandbox ) attrs.sandbox = node.attrs.sandbox;
|
||
|
|
return ["iframe", attrs];
|
||
|
|
}
|
||
|
|
};
|