+ "content": "'use client';\n\nimport type { AutoformatRule } from '@platejs/autoformat';\n\nimport {\n autoformatArrow,\n autoformatLegal,\n autoformatLegalHtml,\n autoformatMath,\n AutoformatPlugin,\n autoformatPunctuation,\n autoformatSmartQuotes,\n} from '@platejs/autoformat';\nimport { insertEmptyCodeBlock } from '@platejs/code-block';\nimport { toggleList } from '@platejs/list';\nimport { KEYS } from 'platejs';\n\nconst autoformatMarks: AutoformatRule[] = [\n {\n match: '***',\n mode: 'mark',\n type: [KEYS.bold, KEYS.italic],\n },\n {\n match: '__*',\n mode: 'mark',\n type: [KEYS.underline, KEYS.italic],\n },\n {\n match: '__**',\n mode: 'mark',\n type: [KEYS.underline, KEYS.bold],\n },\n {\n match: '___***',\n mode: 'mark',\n type: [KEYS.underline, KEYS.bold, KEYS.italic],\n },\n {\n match: '**',\n mode: 'mark',\n type: KEYS.bold,\n },\n {\n match: '__',\n mode: 'mark',\n type: KEYS.underline,\n },\n {\n match: '*',\n mode: 'mark',\n type: KEYS.italic,\n },\n {\n match: '_',\n mode: 'mark',\n type: KEYS.italic,\n },\n {\n match: '~~',\n mode: 'mark',\n type: KEYS.strikethrough,\n },\n {\n match: '^',\n mode: 'mark',\n type: KEYS.sup,\n },\n {\n match: '~',\n mode: 'mark',\n type: KEYS.sub,\n },\n {\n match: '==',\n mode: 'mark',\n type: KEYS.highlight,\n },\n {\n match: '≡',\n mode: 'mark',\n type: KEYS.highlight,\n },\n {\n match: '`',\n mode: 'mark',\n type: KEYS.code,\n },\n];\n\nconst autoformatBlocks: AutoformatRule[] = [\n {\n match: '# ',\n mode: 'block',\n type: KEYS.h1,\n },\n {\n match: '## ',\n mode: 'block',\n type: KEYS.h2,\n },\n {\n match: '### ',\n mode: 'block',\n type: KEYS.h3,\n },\n {\n match: '#### ',\n mode: 'block',\n type: KEYS.h4,\n },\n {\n match: '##### ',\n mode: 'block',\n type: KEYS.h5,\n },\n {\n match: '###### ',\n mode: 'block',\n type: KEYS.h6,\n },\n {\n allowSameTypeAbove: true,\n format: (editor) => {\n editor.tf.wrapNodes({ children: [], type: KEYS.blockquote });\n },\n match: '> ',\n mode: 'block',\n type: KEYS.blockquote,\n },\n {\n match: '```',\n mode: 'block',\n type: KEYS.codeBlock,\n format: (editor) => {\n insertEmptyCodeBlock(editor, {\n defaultType: KEYS.p,\n insertNodesOptions: { select: true },\n });\n },\n },\n // {\n // match: '+ ',\n // mode: 'block',\n // preFormat: openNextToggles,\n // type: KEYS.toggle,\n // },\n {\n match: ['---', '—-', '___ '],\n mode: 'block',\n type: KEYS.hr,\n format: (editor) => {\n editor.tf.setNodes({ type: KEYS.hr });\n editor.tf.insertNodes({\n children: [{ text: '' }],\n type: KEYS.p,\n });\n },\n },\n];\n\nconst autoformatLists: AutoformatRule[] = [\n {\n match: ['* ', '- '],\n mode: 'block',\n type: 'list',\n format: (editor) => {\n toggleList(editor, {\n listStyleType: KEYS.ul,\n });\n },\n },\n {\n match: [String.raw`^\\d+\\.$ `, String.raw`^\\d+\\)$ `],\n matchByRegex: true,\n mode: 'block',\n type: 'list',\n format: (editor, { matchString }) => {\n toggleList(editor, {\n listRestartPolite: Number(matchString) || 1,\n listStyleType: KEYS.ol,\n });\n },\n },\n {\n match: ['[] '],\n mode: 'block',\n type: 'list',\n format: (editor) => {\n toggleList(editor, {\n listStyleType: KEYS.listTodo,\n });\n editor.tf.setNodes({\n checked: false,\n listStyleType: KEYS.listTodo,\n });\n },\n },\n {\n match: ['[x] '],\n mode: 'block',\n type: 'list',\n format: (editor) => {\n toggleList(editor, {\n listStyleType: KEYS.listTodo,\n });\n editor.tf.setNodes({\n checked: true,\n listStyleType: KEYS.listTodo,\n });\n },\n },\n];\n\nexport const AutoformatKit = [\n AutoformatPlugin.configure({\n options: {\n enableUndoOnDelete: true,\n rules: [\n ...autoformatBlocks,\n ...autoformatMarks,\n ...autoformatSmartQuotes,\n ...autoformatPunctuation,\n ...autoformatLegal,\n ...autoformatLegalHtml,\n ...autoformatArrow,\n ...autoformatMath,\n ...autoformatLists,\n ].map(\n (rule): AutoformatRule => ({\n ...rule,\n query: (editor) =>\n !editor.api.some({\n match: { type: editor.getType(KEYS.codeBlock) },\n }),\n })\n ),\n },\n }),\n];\n",
0 commit comments