Skip to content
Merged
Show file tree
Hide file tree
Changes from 9 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -303,6 +303,10 @@ function MUITextAlignButton(props: {
editor.focus();
}, [editor, props.textAlignment]);

if (!activeTextAlignment) {
return null;
}

return (
<MUIToolbarButton
tooltip={tooltip}
Expand Down
12 changes: 10 additions & 2 deletions packages/core/src/blocks/Audio/block.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import {
createBlockConfig,
createBlockSpec,
} from "../../schema/index.js";
import { defaultProps } from "../defaultProps.js";
import { defaultProps, parseDefaultProps } from "../defaultProps.js";
import { parseFigureElement } from "../File/helpers/parse/parseFigureElement.js";
import { createFileBlockWrapper } from "../File/helpers/render/createFileBlockWrapper.js";
import { createFigureWithCaption } from "../File/helpers/toExternalHTML/createFigureWithCaption.js";
Expand Down Expand Up @@ -56,7 +56,12 @@ export const audioParse =
return undefined;
}

return parseAudioElement(element as HTMLAudioElement);
const { backgroundColor } = parseDefaultProps(element);

return {
...parseAudioElement(element as HTMLAudioElement),
backgroundColor,
};
}

if (element.tagName === "FIGURE") {
Expand All @@ -67,8 +72,11 @@ export const audioParse =

const { targetElement, caption } = parsedFigure;

const { backgroundColor } = parseDefaultProps(element);

return {
...parseAudioElement(targetElement as HTMLAudioElement),
backgroundColor,
caption,
};
}
Expand Down
12 changes: 10 additions & 2 deletions packages/core/src/blocks/File/block.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { createBlockConfig, createBlockSpec } from "../../schema/index.js";
import { defaultProps } from "../defaultProps.js";
import { defaultProps, parseDefaultProps } from "../defaultProps.js";
import { parseEmbedElement } from "./helpers/parse/parseEmbedElement.js";
import { parseFigureElement } from "./helpers/parse/parseFigureElement.js";
import { createFileBlockWrapper } from "./helpers/render/createFileBlockWrapper.js";
Expand Down Expand Up @@ -37,7 +37,12 @@ export const fileParse = () => (element: HTMLElement) => {
return undefined;
}

return parseEmbedElement(element as HTMLEmbedElement);
const { backgroundColor } = parseDefaultProps(element);

return {
...parseEmbedElement(element as HTMLEmbedElement),
backgroundColor,
};
}

if (element.tagName === "FIGURE") {
Expand All @@ -48,8 +53,11 @@ export const fileParse = () => (element: HTMLElement) => {

const { targetElement, caption } = parsedFigure;

const { backgroundColor } = parseDefaultProps(element);

return {
...parseEmbedElement(targetElement as HTMLEmbedElement),
backgroundColor,
caption,
};
}
Expand Down
8 changes: 7 additions & 1 deletion packages/core/src/blocks/Heading/block.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
import { createBlockConfig, createBlockSpec } from "../../schema/index.js";
import { createBlockNoteExtension } from "../../editor/BlockNoteExtension.js";
import { defaultProps } from "../defaultProps.js";
import {
addDefaultPropsExternalHTML,
defaultProps,
parseDefaultProps,
} from "../defaultProps.js";
import { createToggleWrapper } from "../ToggleWrapper/createToggleWrapper.js";

const HEADING_LEVELS = [1, 2, 3, 4, 5, 6] as const;
Expand Down Expand Up @@ -65,6 +69,7 @@ export const createHeadingBlockSpec = createBlockSpec(
}

return {
...parseDefaultProps(e),
level,
};
},
Expand All @@ -83,6 +88,7 @@ export const createHeadingBlockSpec = createBlockSpec(
},
toExternalHTML(block) {
const dom = document.createElement(`h${block.props.level}`);
addDefaultPropsExternalHTML(block.props, dom);

return {
dom,
Expand Down
12 changes: 10 additions & 2 deletions packages/core/src/blocks/Image/block.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import {
createBlockConfig,
createBlockSpec,
} from "../../schema/index.js";
import { defaultProps } from "../defaultProps.js";
import { defaultProps, parseDefaultProps } from "../defaultProps.js";
import { parseFigureElement } from "../File/helpers/parse/parseFigureElement.js";
import { createResizableFileBlockWrapper } from "../File/helpers/render/createResizableFileBlockWrapper.js";
import { createFigureWithCaption } from "../File/helpers/toExternalHTML/createFigureWithCaption.js";
Expand Down Expand Up @@ -62,7 +62,12 @@ export const imageParse =
return undefined;
}

return parseImageElement(element as HTMLImageElement);
const { backgroundColor } = parseDefaultProps(element);

return {
...parseImageElement(element as HTMLImageElement),
backgroundColor,
};
}

if (element.tagName === "FIGURE") {
Expand All @@ -73,8 +78,11 @@ export const imageParse =

const { targetElement, caption } = parsedFigure;

const { backgroundColor } = parseDefaultProps(element);

return {
...parseImageElement(targetElement as HTMLImageElement),
backgroundColor,
caption,
};
}
Expand Down
23 changes: 18 additions & 5 deletions packages/core/src/blocks/ListItem/BulletListItem/block.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
import { createBlockNoteExtension } from "../../../editor/BlockNoteExtension.js";
import { createBlockConfig, createBlockSpec } from "../../../schema/index.js";
import { defaultProps } from "../../defaultProps.js";
import {
addDefaultPropsExternalHTML,
defaultProps,
parseDefaultProps,
} from "../../defaultProps.js";
import { handleEnter } from "../../utils/listItemEnterHandler.js";
import { getListItemContent } from "../getListItemContent.js";

Expand All @@ -27,23 +31,23 @@ export const createBulletListItemBlockSpec = createBlockSpec(
},
parse(element) {
if (element.tagName !== "LI") {
return false;
return undefined;
}

const parent = element.parentElement;

if (parent === null) {
return false;
return undefined;
}

if (
parent.tagName === "UL" ||
(parent.tagName === "DIV" && parent.parentElement?.tagName === "UL")
) {
return {};
return parseDefaultProps(element);
}

return false;
return undefined;
},
// As `li` elements can contain multiple paragraphs, we need to merge their contents
// into a single one so that ProseMirror can parse everything correctly.
Expand All @@ -55,6 +59,15 @@ export const createBulletListItemBlockSpec = createBlockSpec(
// schema.
const dom = document.createElement("p");

return {
dom,
contentDOM: dom,
};
},
toExternalHTML(block) {
const dom = document.createElement("p");
addDefaultPropsExternalHTML(block.props, dom);

return {
dom,
contentDOM: dom,
Expand Down
40 changes: 33 additions & 7 deletions packages/core/src/blocks/ListItem/CheckListItem/block.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
import { createBlockNoteExtension } from "../../../editor/BlockNoteExtension.js";
import { createBlockConfig, createBlockSpec } from "../../../schema/index.js";
import { defaultProps } from "../../defaultProps.js";
import {
addDefaultPropsExternalHTML,
defaultProps,
parseDefaultProps,
} from "../../defaultProps.js";
import { handleEnter } from "../../utils/listItemEnterHandler.js";
import { getListItemContent } from "../getListItemContent.js";

Expand Down Expand Up @@ -30,22 +34,22 @@ export const createCheckListItemBlockSpec = createBlockSpec(
if (element.tagName === "input") {
// Ignore if we already parsed an ancestor list item to avoid double-parsing.
if (element.closest("[data-content-type]") || element.closest("li")) {
return;
return undefined;
}

if ((element as HTMLInputElement).type === "checkbox") {
return { checked: (element as HTMLInputElement).checked };
}
return;
return undefined;
}
if (element.tagName !== "LI") {
return;
return undefined;
}

const parent = element.parentElement;

if (parent === null) {
return;
return undefined;
}

if (
Expand All @@ -57,10 +61,10 @@ export const createCheckListItemBlockSpec = createBlockSpec(
null;

if (checkbox === null) {
return;
return undefined;
}

return { checked: checkbox.checked };
return { ...parseDefaultProps(element), checked: checkbox.checked };
}

return;
Expand Down Expand Up @@ -90,6 +94,28 @@ export const createCheckListItemBlockSpec = createBlockSpec(
contentDOM: paragraph,
};
},
toExternalHTML(block) {
const dom = document.createDocumentFragment();
const checkbox = document.createElement("input");
checkbox.type = "checkbox";
checkbox.checked = block.props.checked;
if (block.props.checked) {
checkbox.setAttribute("checked", "");
}
// We use a <p> tag, because for <li> tags we'd need a <ul> element to put
// them in to be semantically correct, which we can't have due to the
// schema.
const paragraph = document.createElement("p");
addDefaultPropsExternalHTML(block.props, paragraph);

dom.appendChild(checkbox);
dom.appendChild(paragraph);

return {
dom,
contentDOM: paragraph,
};
},
runsBefore: ["bulletListItem"],
},
[
Expand Down
37 changes: 31 additions & 6 deletions packages/core/src/blocks/ListItem/NumberedListItem/block.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
import { createBlockNoteExtension } from "../../../editor/BlockNoteExtension.js";
import { createBlockConfig, createBlockSpec } from "../../../schema/index.js";
import { defaultProps } from "../../defaultProps.js";
import {
addDefaultPropsExternalHTML,
defaultProps,
parseDefaultProps,
} from "../../defaultProps.js";
import { handleEnter } from "../../utils/listItemEnterHandler.js";
import { getListItemContent } from "../getListItemContent.js";
import { NumberedListIndexingDecorationPlugin } from "./IndexingPlugin.js";
Expand Down Expand Up @@ -29,23 +33,34 @@ export const createNumberedListItemBlockSpec = createBlockSpec(
},
parse(element) {
if (element.tagName !== "LI") {
return false;
return undefined;
}

const parent = element.parentElement;

if (parent === null) {
return false;
return undefined;
}

if (
parent.tagName === "OL" ||
(parent.tagName === "DIV" && parent.parentElement?.tagName === "OL")
) {
return {};
const startIndex = parseInt(parent.getAttribute("start") || "1");

const defaultProps = parseDefaultProps(element);

if (element.previousElementSibling || startIndex === 1) {
return defaultProps;
}

return {
...defaultProps,
start: startIndex,
};
}

return false;
return undefined;
},
// As `li` elements can contain multiple paragraphs, we need to merge their contents
// into a single one so that ProseMirror can parse everything correctly.
Expand All @@ -57,6 +72,15 @@ export const createNumberedListItemBlockSpec = createBlockSpec(
// schema.
const dom = document.createElement("p");

return {
dom,
contentDOM: dom,
};
},
toExternalHTML(block) {
const dom = document.createElement("p");
addDefaultPropsExternalHTML(block.props, dom);

return {
dom,
contentDOM: dom,
Expand All @@ -70,10 +94,11 @@ export const createNumberedListItemBlockSpec = createBlockSpec(
{
find: new RegExp(`^(\\d+)\\.\\s$`),
replace({ match }) {
const start = parseInt(match[1]);
return {
type: "numberedListItem",
props: {
start: parseInt(match[1]),
start: start !== 1 ? start : undefined,
},
};
},
Expand Down
8 changes: 6 additions & 2 deletions packages/core/src/blocks/ListItem/ToggleListItem/block.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
import { createBlockNoteExtension } from "../../../editor/BlockNoteExtension.js";
import { createBlockConfig, createBlockSpec } from "../../../schema/index.js";
import { defaultProps } from "../../defaultProps.js";
import {
addDefaultPropsExternalHTML,
defaultProps,
} from "../../defaultProps.js";
import { createToggleWrapper } from "../../ToggleWrapper/createToggleWrapper.js";
import { handleEnter } from "../../utils/listItemEnterHandler.js";

Expand Down Expand Up @@ -34,8 +37,9 @@ export const createToggleListItemBlockSpec = createBlockSpec(
);
return { ...toggleWrapper, contentDOM: paragraphEl };
},
toExternalHTML() {
toExternalHTML(block) {
const paragraphEl = document.createElement("p");
addDefaultPropsExternalHTML(block.props, paragraphEl);
return { dom: paragraphEl, contentDOM: paragraphEl };
},
},
Expand Down
Loading
Loading