@blocknote/core
Version:
A "Notion-style" block-based extensible text editor built on top of Prosemirror and Tiptap.
91 lines (81 loc) • 2.09 kB
text/typescript
import { createExtension } from "../../editor/BlockNoteExtension.js";
import { createBlockConfig, createBlockSpec } from "../../schema/index.js";
import {
addDefaultPropsExternalHTML,
defaultProps,
parseDefaultProps,
} from "../defaultProps.js";
export type QuoteBlockConfig = ReturnType<typeof createQuoteBlockConfig>;
export const createQuoteBlockConfig = createBlockConfig(
() =>
({
type: "quote" as const,
propSchema: {
backgroundColor: defaultProps.backgroundColor,
textColor: defaultProps.textColor,
},
content: "inline" as const,
}) as const,
);
export const createQuoteBlockSpec = createBlockSpec(
createQuoteBlockConfig,
{
meta: {
isolating: false,
},
parse(element) {
if (element.tagName === "BLOCKQUOTE") {
const { backgroundColor, textColor } = parseDefaultProps(element);
return { backgroundColor, textColor };
}
return undefined;
},
render() {
const quote = document.createElement("blockquote");
return {
dom: quote,
contentDOM: quote,
};
},
toExternalHTML(block) {
const quote = document.createElement("blockquote");
addDefaultPropsExternalHTML(block.props, quote);
return {
dom: quote,
contentDOM: quote,
};
},
},
[
createExtension({
key: "quote-block-shortcuts",
keyboardShortcuts: {
"Mod-Alt-q": ({ editor }) => {
const cursorPosition = editor.getTextCursorPosition();
if (
editor.schema.blockSchema[cursorPosition.block.type].content !==
"inline"
) {
return false;
}
editor.updateBlock(cursorPosition.block, {
type: "quote",
props: {},
});
return true;
},
},
inputRules: [
{
find: new RegExp(`^>\\s$`),
replace() {
return {
type: "quote",
props: {},
};
},
},
],
}),
],
);