Files
Foundry-VTT-Docker/resources/app/common/prosemirror/schema/other.mjs
2025-01-04 00:34:03 +01:00

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];
}
};