import { Editor } from 'editor/editor' import { safeGetSelection, safeGetRangeAt, moveChildren, markNames, blockNames, parentBlockNames, } from 'editor/utils' import { EditorNode, getType, getValidParentInSelection } from 'editor/types' export interface EditorBlock extends EditorNode { } function makeBlock (tag: string): EditorBlock { return { selector: tag, allowedChildren: [...markNames, 'text'], handleEmpty: 'do-nothing', create: () => document.createElement(tag), } } export const li: EditorBlock = makeBlock('li') // XXX: si agregás algo acá, agregalo a blockNames // (y probablemente le quieras hacer un botón en app/views/posts/attributes/_content.haml) export const blocks: { [propName: string]: EditorBlock } = { paragraph: makeBlock('p'), h1: makeBlock('h1'), h2: makeBlock('h2'), h3: makeBlock('h3'), h4: makeBlock('h4'), h5: makeBlock('h5'), h6: makeBlock('h6'), unordered_list: { ...makeBlock('ul'), allowedChildren: ['li'], handleEmpty: li, }, ordered_list: { ...makeBlock('ol'), allowedChildren: ['li'], handleEmpty: li, }, } export function setupButtons (editor: Editor): void { for (const [ name, type ] of Object.entries(blocks)) { const buttonEl = editor.toolbarEl.querySelector(`[data-editor-button="block-${name}"]`) if (!buttonEl) continue buttonEl.addEventListener("click", event => { event.preventDefault() const list = getValidParentInSelection({ editor, type: name }) // No borrar cosas como multimedia if (blockNames.indexOf(getType(list[1])!.typeName) === -1) { return } let replacementType = list[1].matches(type.selector) ? blocks.paragraph : type const el = replacementType.create(editor) replacementType.onClick && replacementType.onClick(editor, el) moveChildren(list[1], el, null) list[0].replaceChild(el, list[1]) window.getSelection()?.collapse(el) return false }) } }