/* This file is part of the Notesnook project (https://notesnook.com/) Copyright (C) 2023 Streetwriters (Private) Limited This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ import { Editor, AnyExtension, Extensions } from "@tiptap/core"; import StarterKit from "@tiptap/starter-kit"; import { builders, NodeBuilder } from "prosemirror-test-builder"; import { Schema } from "@tiptap/pm/model"; type Builder = { scheme: Schema; } & Record; type EditorOptions = { element?: HTMLElement; extensions: Record; initialContent?: string; }; export function createEditor( options: EditorOptions ) { const { extensions, initialContent, element } = options; const editor = new Editor({ element, content: initialContent, extensions: [ StarterKit.configure({ ...Object.entries(extensions).reduce( (prev, [name]) => ({ ...prev, [name]: false }), {} ) }), ...(Object.values(extensions) as Extensions) ] }); const builder = builders(editor.schema) as unknown as Builder; return { editor, builder }; } export function h( tag: K, children: (HTMLElement | string)[] = [], attr: Record = {} ): HTMLElementTagNameMap[K] { const element = document.createElement(tag); element.append( ...children.map((v) => typeof v === "string" ? document.createTextNode(v) : v ) ); for (const key in attr) { const value = attr[key]; if (value) element.setAttribute(key, value); } return element; } function elem(tag: K) { return function ( children: (HTMLElement | string)[] = [], attr: Record = {} ): HTMLElementTagNameMap[K] { return h(tag, children, attr); }; } export const ul = elem("ul"); export const li = elem("li"); export const p = elem("p"); export function text(text: string) { return document.createTextNode(text); } export function outlineList(...children: HTMLLIElement[]) { return ul(children, { "data-type": "outlineList" }); } export function outlineListItem( paragraphChildren: (string | HTMLElement)[], subList?: HTMLUListElement ) { const children: HTMLElement[] = [h("p", paragraphChildren)]; if (subList) children.push(subList); return li(children, { "data-type": "outlineListItem" }); }