From a6008d8c9d70981dd8fc4c0a330928a5e2876ea4 Mon Sep 17 00:00:00 2001 From: Hans Pagel Date: Tue, 19 Jan 2021 18:01:25 +0100 Subject: [PATCH] add character limit experiment --- .../Annotation/extension/AnnotationPlugin.ts | 4 +- .../extension/CharacterLimit.ts | 64 ++++++++++++++++ .../CharacterLimit/extension/index.ts | 4 + .../Experiments/CharacterLimit/index.vue | 73 +++++++++++++++++++ .../Experiments/Linter/extension/Linter.ts | 4 +- docs/src/docPages/experiments.md | 1 + .../docPages/experiments/character-limit.md | 5 ++ 7 files changed, 151 insertions(+), 4 deletions(-) create mode 100644 docs/src/demos/Experiments/CharacterLimit/extension/CharacterLimit.ts create mode 100644 docs/src/demos/Experiments/CharacterLimit/extension/index.ts create mode 100644 docs/src/demos/Experiments/CharacterLimit/index.vue create mode 100644 docs/src/docPages/experiments/character-limit.md diff --git a/docs/src/demos/Experiments/Annotation/extension/AnnotationPlugin.ts b/docs/src/demos/Experiments/Annotation/extension/AnnotationPlugin.ts index 290b9cef..7542bc59 100644 --- a/docs/src/demos/Experiments/Annotation/extension/AnnotationPlugin.ts +++ b/docs/src/demos/Experiments/Annotation/extension/AnnotationPlugin.ts @@ -7,8 +7,8 @@ export const AnnotationPlugin = (options: any) => new Plugin({ key: AnnotationPluginKey, state: { init: AnnotationState.init, - apply(transaction, prevState) { - return prevState.apply(transaction) + apply(transaction, oldState) { + return oldState.apply(transaction) }, }, props: { diff --git a/docs/src/demos/Experiments/CharacterLimit/extension/CharacterLimit.ts b/docs/src/demos/Experiments/CharacterLimit/extension/CharacterLimit.ts new file mode 100644 index 00000000..42ff0a88 --- /dev/null +++ b/docs/src/demos/Experiments/CharacterLimit/extension/CharacterLimit.ts @@ -0,0 +1,64 @@ +// @ts-nocheck +import { Extension } from '@tiptap/core' +import { + Plugin, PluginKey, EditorState, Transaction, +} from 'prosemirror-state' + +export interface CharacterLimitOptions { + limit: number, +} + +export const CharacterLimit = Extension.create({ + name: 'characterLimit', + + defaultOptions: { + limit: 100, + }, + + addProseMirrorPlugins() { + const { options } = this + + return [ + new Plugin({ + + key: new PluginKey('characterLimit'), + + // state: { + // init(_, config) { + // // console.log(_, config) + // // const length = config.doc.content.size + + // // if (length > options.limit) { + // // console.log('too long', options.limit, config) + + // // const transaction = config.tr.insertText('', options.limit + 1, length) + + // // return config.apply(transaction) + // // } + // }, + // apply() { + // // + // }, + // }, + + appendTransaction: (transactions, oldState, newState) => { + const oldLength = oldState.doc.content.size + const newLength = newState.doc.content.size + + if (newLength > options.limit && newLength > oldLength) { + const newTr = newState.tr + newTr.insertText('', options.limit + 1, newLength) + + return newTr + } + }, + }), + ] + }, +}) + +declare module '@tiptap/core' { + interface AllExtensions { + CharacterLimit: typeof CharacterLimit, + } +} diff --git a/docs/src/demos/Experiments/CharacterLimit/extension/index.ts b/docs/src/demos/Experiments/CharacterLimit/extension/index.ts new file mode 100644 index 00000000..7770eb81 --- /dev/null +++ b/docs/src/demos/Experiments/CharacterLimit/extension/index.ts @@ -0,0 +1,4 @@ +import { CharacterLimit } from './CharacterLimit' + +export * from './CharacterLimit' +export default CharacterLimit diff --git a/docs/src/demos/Experiments/CharacterLimit/index.vue b/docs/src/demos/Experiments/CharacterLimit/index.vue new file mode 100644 index 00000000..16a4822c --- /dev/null +++ b/docs/src/demos/Experiments/CharacterLimit/index.vue @@ -0,0 +1,73 @@ + + + + + diff --git a/docs/src/demos/Experiments/Linter/extension/Linter.ts b/docs/src/demos/Experiments/Linter/extension/Linter.ts index 42fe777f..4307ed66 100644 --- a/docs/src/demos/Experiments/Linter/extension/Linter.ts +++ b/docs/src/demos/Experiments/Linter/extension/Linter.ts @@ -51,10 +51,10 @@ export const Linter = Extension.create({ init(_, { doc }) { return runAllLinterPlugins(doc, plugins) }, - apply(transaction, prevState) { + apply(transaction, oldState) { return transaction.docChanged ? runAllLinterPlugins(transaction.doc, plugins) - : prevState + : oldState }, }, props: { diff --git a/docs/src/docPages/experiments.md b/docs/src/docPages/experiments.md index 34e2966d..262720b5 100644 --- a/docs/src/docPages/experiments.md +++ b/docs/src/docPages/experiments.md @@ -4,3 +4,4 @@ Congratulations! You’ve found our secret playground with a list of experiments * [Linter](/experiments/linter) * [Annotation](/experiments/annotation) * [Comments](/experiments/comments) +* [CharacterLimit](/experiments/character-limit) diff --git a/docs/src/docPages/experiments/character-limit.md b/docs/src/docPages/experiments/character-limit.md new file mode 100644 index 00000000..fa6a209a --- /dev/null +++ b/docs/src/docPages/experiments/character-limit.md @@ -0,0 +1,5 @@ +# CharacterLimit + +⚠️ Experiment + +