From 7710859f3866f83599528e01afd30eb5c6948277 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philipp=20Ku=CC=88hn?= Date: Thu, 2 Apr 2020 13:26:56 +0200 Subject: [PATCH] add code extension --- packages/extension-code/index.ts | 105 +++++++++++++++++++++++++++ packages/extension-code/package.json | 17 +++++ src/demos/HandleExtensions/index.vue | 2 + 3 files changed, 124 insertions(+) create mode 100644 packages/extension-code/index.ts create mode 100644 packages/extension-code/package.json diff --git a/packages/extension-code/index.ts b/packages/extension-code/index.ts new file mode 100644 index 00000000..65069919 --- /dev/null +++ b/packages/extension-code/index.ts @@ -0,0 +1,105 @@ +import { Mark, markInputRule, markPasteRule } from '@tiptap/core' +import { toggleMark } from 'prosemirror-commands' +import { MarkSpec } from 'prosemirror-model' +import VerEx from 'verbal-expressions' + +declare module '@tiptap/core/src/Editor' { + interface Editor { + code(): Editor, + } +} + +export default class Code extends Mark { + + name = 'code' + + created() { + this.editor.registerCommand('code', (next, { view }) => { + toggleMark(this.schemaType)(view.state, view.dispatch) + next() + }) + } + + schema(): MarkSpec { + return { + excludes: '_', + parseDOM: [ + { tag: 'code' }, + ], + toDOM: () => ['code', 0], + } + } + + keys() { + return { + 'Mod-`': () => this.editor.code(), + } + } + + inputRules() { + return ['`'].map(character => ([ + // match start of line + markInputRule( + VerEx() + .startOfLine() + .beginCapture() + .find(character) + .beginCapture() + .somethingBut(character) + .endCapture() + .find(character) + .endCapture() + .endOfLine(), + this.schemaType, + ), + // match before whitespace + markInputRule( + VerEx() + .whitespace() + .beginCapture() + .find(character) + .beginCapture() + .somethingBut(character) + .endCapture() + .find(character) + .endCapture() + .endOfLine(), + this.schemaType, + ), + ])) + .flat(1) + } + + pasteRules() { + return ['`'].map(character => ([ + // match start of line + markPasteRule( + VerEx() + .startOfLine() + .beginCapture() + .find(character) + .beginCapture() + .somethingBut(character) + .endCapture() + .find(character) + .endCapture(), + this.schemaType, + ), + // match before whitespace + markPasteRule( + VerEx() + .whitespace() + .beginCapture() + .find(character) + .beginCapture() + .somethingBut(character) + .endCapture() + .find(character) + .endCapture(), + this.schemaType, + ), + ])) + .flat(1) + } + +} \ No newline at end of file diff --git a/packages/extension-code/package.json b/packages/extension-code/package.json new file mode 100644 index 00000000..e101e0d5 --- /dev/null +++ b/packages/extension-code/package.json @@ -0,0 +1,17 @@ +{ + "name": "@tiptap/extension-code", + "version": "1.0.0", + "source": "index.ts", + "main": "dist/tiptap-extension-code.js", + "umd:main": "dist/tiptap-extension-code.umd.js", + "module": "dist/tiptap-extension-code.mjs", + "unpkg": "dist/tiptap-extension-code.js", + "jsdelivr": "dist/tiptap-extension-code.js", + "files": [ + "src", + "dist" + ], + "peerDependencies": { + "@tiptap/core": "2.x" + } +} diff --git a/src/demos/HandleExtensions/index.vue b/src/demos/HandleExtensions/index.vue index 84de33ff..8c6005ac 100644 --- a/src/demos/HandleExtensions/index.vue +++ b/src/demos/HandleExtensions/index.vue @@ -27,6 +27,7 @@ import Text from '@tiptap/extension-text' import History from '@tiptap/extension-history' import Bold from '@tiptap/extension-bold' import Italic from '@tiptap/extension-italic' +import Code from '@tiptap/extension-code' import CodeBlock from '@tiptap/extension-codeblock' export default { @@ -51,6 +52,7 @@ export default { new History(), new Bold(), new Italic(), + new Code(), ], }) },