UNPKG

quill-react-commercial

Version:
112 lines (103 loc) 4.16 kB
import { Range } from 'quill'; export const keyboardBindsFn = (options) => { const { onSave } = options; return { // 有序列表只能输入“1. ”才会触发,改变比如输入“30. ”会变为“1. ”开始的有序列表的行为 'list autofill': { key: ' ', collapsed: true, prefix: /^\d+\.$/, format: { list: false, 'code-block': false, blockquote: false, header: false, table: false, 'table-cell-line': false, // 在table中不触发有序列表 }, handler(range: Range, context) { const { prefix, line } = context; const start = parseInt(prefix.replace('.', ''), 10); if (start !== 1) { this.quill.formatLine(range.index, 1, 'list', `ordered-${start}`); // // 这个ol在编辑器中本身没啥作用,编辑器css已经将ol的样式设置为none,主要样式在li的伪类中定义;主要给转html等富文本使用 // const ol = line?.next?.parent?.domNode; // ol.setAttribute('start', start); // ol.style.setProperty('--list-item-start', start); // // 真正设置有序列表起始值 // const li = line?.next?.domNode; // li.dataset.reset = parseInt(prefix.replace('.', ''), 10); // li.style.setProperty('counter-set', `list-0 ${parseInt(prefix.replace('.', ''), 10)}`); this.quill.formatLine(range.index, 1, 'list', `ordered-${start}`); } else { this.quill.formatLine(range.index, 1, 'list', 'ordered'); this.quill.formatLine(range.index, 1, 'list', 'ordered'); } this.quill.deleteText(range.index - prefix.length, prefix.length); // this.quill.setSelection(range.index, 1); }, }, // bugfix: 当最开始是code块、list、引用块时,无法使用Backspace删除样式 'code backspace': { key: 'Backspace', format: ['code-block', 'list', 'blockquote'], handler( range: Range, context: { line: { parent: { domNode: HTMLDivElement; }; }; suffix: string; prefix: string; offset: number; }, ) { if (this.quill) { // const [line] = this.quill.getLine(range.index); // const isEmpty = !line.children.head.text || line.children.head.text.trim() === ''; const format = this.quill.getFormat(range); const allCode = context?.line?.parent?.domNode?.innerHTML .replace(/<select>(.+)<\/span><\/span>/, '') .replace(/<[^<>]+>/g, ''); // parent指代码块 div.ql-code-block-container // // 当是起始,代码块且整块中已无字符,或引用/列表且当前行为空,去除当前行格式;其他情况执行默认Backspace的handler // if ( // range.index === 0 && // context.suffix === '' && // ((format['code-block'] && (allCode === '\n' || allCode === '')) || // (!format['code-block'] && isEmpty)) // ) { // this.quill.removeFormat(range.index, range.length); // return false; // } // 只要光标在list、引用的开头删除,直接移除格式;去除原只能文档开头的条件 if ((format['list'] || format['blockquote']) && context.prefix === '') { this.quill.removeFormat(range.index, range.length); return false; } else if ( format['code-block'] && (allCode === '\n' || allCode === '' || allCode === undefined) ) { // 光标在Code块中,只要块内内容为空,直接移除格式 this.quill.removeFormat(range.index, range.length); return false; } } return true; }, }, save: { key: 's', shortKey: true, handler(range: Range, context) { console.log('keyboard save!'); if (onSave) { onSave(); return false; } return true; }, }, }; };