import { createRoot } from "~/editor/content/dom/Root"; import { createParagraph } from "~/editor/content/dom/Paragraph"; import { createEmptyInline, createInline } from "~/editor/content/dom/Inline"; import { createLineBreak } from "~/editor/content/dom/LineBreak"; export class TextEditorMock extends EventTarget { /** * Returns the template used for the text editor mock. * * @returns {HTMLDivElement} */ static getTemplate() { const container = document.createElement("div"); container.id = "test"; container.innerHTML = `
`; document.body.appendChild(container); return container; } /** * Creates an editor with a custom root. * * @param {HTMLDivElement} root * @returns {HTMLDivElement} */ static createTextEditorMockWithRoot(root) { const container = TextEditorMock.getTemplate(); const selectionImposterElement = container.querySelector( ".text-editor-selection-imposter" ); const textEditorMock = new TextEditorMock( container.querySelector(".text-editor-content"), { root, selectionImposterElement, } ); return textEditorMock; } /** * Creates a TextEditor mock with paragraphs. * * @param {Array} paragraphs * @returns */ static createTextEditorMockWithParagraphs(paragraphs) { const root = createRoot(paragraphs); return this.createTextEditorMockWithRoot(root); } /** * Creates an empty TextEditor mock. * * @returns */ static createTextEditorMockEmpty() { const root = createRoot([ createParagraph([createInline(createLineBreak())]), ]); return this.createTextEditorMockWithRoot(root); } /** * Creates a TextEditor mock with some text. * * NOTE: If the text is empty an empty inline will be * created. * * @param {string} text * @returns */ static createTextEditorMockWithText(text) { return this.createTextEditorMockWithParagraphs([ createParagraph([ text.length === 0 ? createEmptyInline() : createInline(new Text(text)) ]), ]); } /** * Creates a TextEditor mock with some inlines and * only one paragraph. * * @param {Array} inlines * @returns */ static createTextEditorMockWithParagraph(inlines) { return this.createTextEditorMockWithParagraphs([createParagraph(inlines)]); } #element = null; #root = null; #selectionImposterElement = null; constructor(element, options) { super(); this.#element = element; this.#root = options?.root; this.#selectionImposterElement = options?.selectionImposterElement; this.#element.appendChild(options?.root); } get element() { return this.#element; } get root() { return this.#root; } } export default TextEditorMock;