import { Attributes, Extension, Extensions, NodeConfig } from '@tiptap/core'; import { Blockquote, BlockquoteOptions } from '@tiptap/extension-blockquote'; import { BulletList, BulletListOptions } from '@tiptap/extension-bullet-list'; import { Code, CodeOptions } from '@tiptap/extension-code'; import { CodeBlock, CodeBlockOptions } from '@tiptap/extension-code-block'; import { Document } from '@tiptap/extension-document'; import { Dropcursor, DropcursorOptions } from '@tiptap/extension-dropcursor'; import { Gapcursor } from '@tiptap/extension-gapcursor'; import { HardBreak, HardBreakOptions } from '@tiptap/extension-hard-break'; import { Heading, HeadingOptions } from '@tiptap/extension-heading'; import { History, HistoryOptions } from '@tiptap/extension-history'; import { HorizontalRule, HorizontalRuleOptions } from '@tiptap/extension-horizontal-rule'; import { ListItem, ListItemOptions } from '@tiptap/extension-list-item'; import { OrderedList, OrderedListOptions } from '@tiptap/extension-ordered-list'; import { Paragraph, ParagraphOptions } from '@tiptap/extension-paragraph'; import { Strike, StrikeOptions } from '@tiptap/extension-strike'; import { CharacterCount, CharacterCountOptions } from '@tiptap/extension-character-count'; import { Text } from '@tiptap/extension-text'; import Underline, { UnderlineOptions } from '@tiptap/extension-underline'; import TaskList, { TaskListOptions } from '@tiptap/extension-task-list'; import TaskItem, { TaskItemOptions } from '@tiptap/extension-task-item'; import Link, { LinkOptions } from '@tiptap/extension-link'; import Image, { ImageOptions } from '@tiptap/extension-image'; import BubbleMenu, { BubbleMenuOptions } from '@tiptap/extension-bubble-menu'; import Alert, { AlertOptions } from '../Extensions/Alert'; import Button, { ButtonOptions } from '../Extensions/Button'; import StepBySteo, { StepByStepOptions } from '../Extensions/StepByStep'; import Htmlsource, { HtmlsourceOptions } from '../Extensions/ToggleSource'; import Table, { TableOptions } from '@tiptap/extension-table'; import TableCell, { TableCellOptions } from '@tiptap/extension-table-cell'; import TableHeader, { TableHeaderOptions } from '@tiptap/extension-table-header'; import TableRow, { TableRowOptions } from '@tiptap/extension-table-row'; import Bold, { BoldOptions } from '../Extensions/Bold'; import { Strong, StrongOptions } from '../Extensions/Strong/strong'; import { Emphasis, EmphasisOptions } from '../Extensions/Emphasis/emphasis'; import Italic, { ItalicOptions } from '../Extensions/Italic'; export interface CustomKitOptions { blockquote: Partial | false; bold: Partial | false; strong: Partial | false; bubbleMenu: Partial | false; bulletList: Partial | false; code: Partial | false; codeBlock: Partial | false; document: false; dropcursor: Partial | false; gapcursor: false; hardBreak: Partial | false; heading: Partial | false; history: Partial | false; horizontalRule: Partial | false; italic: Partial | false; emphasis: Partial | false; listItem: Partial | false; orderedList: Partial | false; paragraph: Partial | false; strike: Partial | false; characterCount: Partial | false; text: false; underline: Partial | false; taskList: Partial | false; taskItem: Partial | false; link: Partial | false; image: Partial | false; alert: Partial; table: Partial | false; tableCell: Partial | false; tableHeader: Partial | false; tableRow: Partial | false; button: Partial | false; stepByStep: Partial | false; htmlSource: Partial | false; } export const CustomKit = Extension.create({ name: 'customKit', addExtensions() { const extensions: Extensions = []; if (this.options.bubbleMenu !== false) { extensions.push(BubbleMenu.configure(this.options?.bubbleMenu)); } if (this.options.blockquote !== false) { extensions.push(Blockquote.configure(this.options?.blockquote)); } if (this.options.bold !== false) { extensions.push(Bold.configure(this.options?.bold)); } if (this.options.strong !== false) { extensions.push(Strong.configure(this.options?.strong)); } if (this.options.bulletList !== false) { extensions.push(BulletList.configure(this.options?.bulletList)); } if (this.options.code !== false) { extensions.push(Code.configure(this.options?.code)); } if (this.options.codeBlock !== false) { extensions.push(CodeBlock.configure(this.options?.codeBlock)); } if (this.options.document !== false) { extensions.push(Document.configure(this.options?.document)); } if (this.options.dropcursor !== false) { extensions.push(Dropcursor.configure(this.options?.dropcursor)); } if (this.options.gapcursor !== false) { extensions.push(Gapcursor.configure(this.options?.gapcursor)); } if (this.options.hardBreak !== false) { extensions.push(HardBreak.configure(this.options?.hardBreak)); } if (this.options.heading !== false) { extensions.push(Heading.configure(this.options?.heading)); } if (this.options.history !== false) { extensions.push(History.configure(this.options?.history)); } if (this.options.horizontalRule !== false) { extensions.push(HorizontalRule.configure(this.options?.horizontalRule)); } if (this.options.italic !== false) { extensions.push(Italic.configure(this.options?.italic)); } if (this.options.emphasis !== false) { extensions.push(Emphasis.configure(this.options?.emphasis)); } if (this.options.listItem !== false) { extensions.push(ListItem.configure(this.options?.listItem)); } if (this.options.orderedList !== false) { extensions.push(OrderedList.configure(this.options?.orderedList)); } if (this.options.paragraph !== false) { extensions.push(Paragraph.configure(this.options?.paragraph)); } if (this.options.strike !== false) { extensions.push(Strike.configure(this.options?.strike)); } if (this.options.text !== false) { extensions.push(Text.configure(this.options?.text)); } if (this.options.characterCount !== false) { extensions.push(CharacterCount.configure(this.options?.characterCount)); } if (this.options.underline !== false) { extensions.push(Underline.configure(this.options?.underline)); } if (this.options.taskList !== false) { extensions.push(TaskList.configure(this.options?.taskList)); } if (this.options.taskItem !== false) { extensions.push(TaskItem.configure(this.options?.taskItem)); } if (this.options.link !== false) { extensions.push( Link.extend({ addAttributes() { return { ...this.parent?.(), 'data-internal-link': { default: undefined } }; } }).configure(this.options?.link) ); } if (this.options.image !== false) { extensions.push(Image.extend(imageExtendOptions).configure(this.options?.image)); } extensions.push(Alert.configure(this.options?.alert)); if (this.options.button !== false) { extensions.push(Button.configure(this.options?.button)); } if (this.options.stepByStep !== false) { extensions.push(StepBySteo.configure(this.options?.stepByStep)); } if (this.options.htmlSource !== false) { extensions.push(Htmlsource.configure(this.options?.htmlSource)); } if (this.options.table !== false) { extensions.push(Table.configure(this.options?.table)); } if (this.options.tableCell !== false) { extensions.push(TableCell.configure(this.options?.tableCell)); } if (this.options.tableHeader !== false) { extensions.push(TableHeader.configure(this.options?.tableHeader)); } if (this.options.tableRow !== false) { extensions.push(TableRow.configure(this.options?.tableRow)); } return extensions; } }); const imageExtendOptions: Partial> = { addAttributes() { return { // @ts-ignore ...this.parent?.(), width: { default: null }, height: { default: null }, loading: { default: null }, renderHTML: (attributes: Attributes) => { return { width: attributes.width, height: attributes.height, loading: attributes.loading }; } }; } };