move history plugin to extension package
This commit is contained in:
@@ -84,6 +84,7 @@ import {
|
|||||||
Code,
|
Code,
|
||||||
Italic,
|
Italic,
|
||||||
Link,
|
Link,
|
||||||
|
History,
|
||||||
} from 'tiptap-extensions'
|
} from 'tiptap-extensions'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
@@ -106,6 +107,7 @@ export default {
|
|||||||
new Code(),
|
new Code(),
|
||||||
new Italic(),
|
new Italic(),
|
||||||
new Link(),
|
new Link(),
|
||||||
|
new History(),
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -130,7 +132,8 @@ The most powerful feature of tiptap is that you can create you own extensions. T
|
|||||||
| `get name()` | `String` | `null` | Define a name for your extension. |
|
| `get name()` | `String` | `null` | Define a name for your extension. |
|
||||||
| `get defaultOptions()` | `Object` | `{}` | Define some default options. The options are available as `this.$options`. |
|
| `get defaultOptions()` | `Object` | `{}` | Define some default options. The options are available as `this.$options`. |
|
||||||
| `get plugins()` | `Array` | `[]` | Define a list of [Prosemirror plugins](https://prosemirror.net/docs/guide/). |
|
| `get plugins()` | `Array` | `[]` | Define a list of [Prosemirror plugins](https://prosemirror.net/docs/guide/). |
|
||||||
| `get inputRules()` | `Array` | `[]` | Define a list of input rules. |
|
| `keys({ schema })` | `Object` | `null` | Define some keybindings. |
|
||||||
|
| `inputRules({ schema })` | `Array` | `[]` | Define a list of input rules. |
|
||||||
|
|
||||||
### Node|Mark Class
|
### Node|Mark Class
|
||||||
|
|
||||||
|
|||||||
@@ -132,6 +132,7 @@ import {
|
|||||||
Code,
|
Code,
|
||||||
Italic,
|
Italic,
|
||||||
Link,
|
Link,
|
||||||
|
History,
|
||||||
} from 'tiptap-extensions'
|
} from 'tiptap-extensions'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
@@ -155,6 +156,7 @@ export default {
|
|||||||
new Code(),
|
new Code(),
|
||||||
new Italic(),
|
new Italic(),
|
||||||
new Link(),
|
new Link(),
|
||||||
|
new History(),
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ import {
|
|||||||
Code,
|
Code,
|
||||||
Italic,
|
Italic,
|
||||||
Link,
|
Link,
|
||||||
|
History,
|
||||||
} from 'tiptap-extensions'
|
} from 'tiptap-extensions'
|
||||||
import Iframe from './Iframe.js'
|
import Iframe from './Iframe.js'
|
||||||
|
|
||||||
@@ -57,6 +58,7 @@ export default {
|
|||||||
new Code(),
|
new Code(),
|
||||||
new Italic(),
|
new Italic(),
|
||||||
new Link(),
|
new Link(),
|
||||||
|
new History(),
|
||||||
// custom extension
|
// custom extension
|
||||||
new Iframe(),
|
new Iframe(),
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -118,6 +118,7 @@ import {
|
|||||||
Code,
|
Code,
|
||||||
Italic,
|
Italic,
|
||||||
Link,
|
Link,
|
||||||
|
History,
|
||||||
} from 'tiptap-extensions'
|
} from 'tiptap-extensions'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
@@ -141,6 +142,7 @@ export default {
|
|||||||
new Code(),
|
new Code(),
|
||||||
new Italic(),
|
new Italic(),
|
||||||
new Link(),
|
new Link(),
|
||||||
|
new History(),
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -53,6 +53,7 @@ import {
|
|||||||
Code,
|
Code,
|
||||||
Italic,
|
Italic,
|
||||||
Link,
|
Link,
|
||||||
|
History,
|
||||||
} from 'tiptap-extensions'
|
} from 'tiptap-extensions'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
@@ -76,6 +77,7 @@ export default {
|
|||||||
new Code(),
|
new Code(),
|
||||||
new Italic(),
|
new Italic(),
|
||||||
new Link(),
|
new Link(),
|
||||||
|
new History(),
|
||||||
],
|
],
|
||||||
linkUrl: null,
|
linkUrl: null,
|
||||||
linkMenuIsActive: false,
|
linkMenuIsActive: false,
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ import {
|
|||||||
Code,
|
Code,
|
||||||
Italic,
|
Italic,
|
||||||
Link,
|
Link,
|
||||||
|
History,
|
||||||
} from 'tiptap-extensions'
|
} from 'tiptap-extensions'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
@@ -58,6 +59,7 @@ export default {
|
|||||||
new Code(),
|
new Code(),
|
||||||
new Italic(),
|
new Italic(),
|
||||||
new Link(),
|
new Link(),
|
||||||
|
new History(),
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -62,6 +62,7 @@ import {
|
|||||||
Code,
|
Code,
|
||||||
Italic,
|
Italic,
|
||||||
Link,
|
Link,
|
||||||
|
History,
|
||||||
} from 'tiptap-extensions'
|
} from 'tiptap-extensions'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
@@ -85,6 +86,7 @@ export default {
|
|||||||
new Code(),
|
new Code(),
|
||||||
new Italic(),
|
new Italic(),
|
||||||
new Link(),
|
new Link(),
|
||||||
|
new History(),
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ import {
|
|||||||
Code,
|
Code,
|
||||||
Italic,
|
Italic,
|
||||||
Link,
|
Link,
|
||||||
|
History,
|
||||||
} from 'tiptap-extensions'
|
} from 'tiptap-extensions'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
@@ -55,6 +56,7 @@ export default {
|
|||||||
new Code(),
|
new Code(),
|
||||||
new Italic(),
|
new Italic(),
|
||||||
new Link(),
|
new Link(),
|
||||||
|
new History(),
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -84,6 +84,7 @@ import {
|
|||||||
Code,
|
Code,
|
||||||
Italic,
|
Italic,
|
||||||
Link,
|
Link,
|
||||||
|
History,
|
||||||
} from 'tiptap-extensions'
|
} from 'tiptap-extensions'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
@@ -107,6 +108,7 @@ export default {
|
|||||||
new Code(),
|
new Code(),
|
||||||
new Italic(),
|
new Italic(),
|
||||||
new Link(),
|
new Link(),
|
||||||
|
new History(),
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -20,6 +20,7 @@
|
|||||||
"url": "https://github.com/heyscrumpy/tiptap/issues"
|
"url": "https://github.com/heyscrumpy/tiptap/issues"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"prosemirror-history": "^1.0.2",
|
||||||
"tiptap": "^0.5.1",
|
"tiptap": "^0.5.1",
|
||||||
"tiptap-commands": "^0.2.0"
|
"tiptap-commands": "^0.2.0"
|
||||||
}
|
}
|
||||||
|
|||||||
30
packages/tiptap-extensions/src/extensions/History.js
Normal file
30
packages/tiptap-extensions/src/extensions/History.js
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
import { Extension } from 'tiptap'
|
||||||
|
import { history, undo, redo } from 'prosemirror-history'
|
||||||
|
|
||||||
|
export default class HistoryExtension extends Extension {
|
||||||
|
|
||||||
|
get name() {
|
||||||
|
return 'history'
|
||||||
|
}
|
||||||
|
|
||||||
|
keys() {
|
||||||
|
const isMac = typeof navigator !== 'undefined' ? /Mac/.test(navigator.platform) : false
|
||||||
|
const keymap = {
|
||||||
|
'Mod-z': undo,
|
||||||
|
'Shift-Mod-z': redo,
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isMac) {
|
||||||
|
keymap['Mod-y'] = redo
|
||||||
|
}
|
||||||
|
|
||||||
|
return keymap
|
||||||
|
}
|
||||||
|
|
||||||
|
get plugins() {
|
||||||
|
return [
|
||||||
|
history(),
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -12,3 +12,5 @@ export { default as Bold } from './marks/Bold'
|
|||||||
export { default as Code } from './marks/Code'
|
export { default as Code } from './marks/Code'
|
||||||
export { default as Italic } from './marks/Italic'
|
export { default as Italic } from './marks/Italic'
|
||||||
export { default as Link } from './marks/Link'
|
export { default as Link } from './marks/Link'
|
||||||
|
|
||||||
|
export { default as History } from './extensions/History'
|
||||||
|
|||||||
@@ -26,7 +26,6 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"prosemirror-commands": "^1.0.7",
|
"prosemirror-commands": "^1.0.7",
|
||||||
"prosemirror-gapcursor": "^1.0.2",
|
"prosemirror-gapcursor": "^1.0.2",
|
||||||
"prosemirror-history": "^1.0.2",
|
|
||||||
"prosemirror-inputrules": "^1.0.1",
|
"prosemirror-inputrules": "^1.0.1",
|
||||||
"prosemirror-keymap": "^1.0.1",
|
"prosemirror-keymap": "^1.0.1",
|
||||||
"prosemirror-model": "^1.5.0",
|
"prosemirror-model": "^1.5.0",
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ import { EditorState, Plugin } from 'prosemirror-state'
|
|||||||
import { EditorView } from 'prosemirror-view'
|
import { EditorView } from 'prosemirror-view'
|
||||||
import { Schema, DOMParser } from 'prosemirror-model'
|
import { Schema, DOMParser } from 'prosemirror-model'
|
||||||
import { gapCursor } from 'prosemirror-gapcursor'
|
import { gapCursor } from 'prosemirror-gapcursor'
|
||||||
import { history } from 'prosemirror-history'
|
|
||||||
import { keymap } from 'prosemirror-keymap'
|
import { keymap } from 'prosemirror-keymap'
|
||||||
import { baseKeymap } from 'prosemirror-commands'
|
import { baseKeymap } from 'prosemirror-commands'
|
||||||
import { inputRules } from 'prosemirror-inputrules'
|
import { inputRules } from 'prosemirror-inputrules'
|
||||||
@@ -165,7 +164,6 @@ export default {
|
|||||||
keymap(builtInKeymap),
|
keymap(builtInKeymap),
|
||||||
keymap(baseKeymap),
|
keymap(baseKeymap),
|
||||||
gapCursor(),
|
gapCursor(),
|
||||||
history(),
|
|
||||||
new Plugin({
|
new Plugin({
|
||||||
props: {
|
props: {
|
||||||
editable: () => this.editable,
|
editable: () => this.editable,
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ export default class ExtensionManager {
|
|||||||
|
|
||||||
get views() {
|
get views() {
|
||||||
return this.extensions
|
return this.extensions
|
||||||
|
.filter(extension => ['node', 'mark'].includes(extension.type))
|
||||||
.filter(extension => extension.view)
|
.filter(extension => extension.view)
|
||||||
.reduce((views, { name, view }) => ({
|
.reduce((views, { name, view }) => ({
|
||||||
...views,
|
...views,
|
||||||
@@ -43,23 +44,52 @@ export default class ExtensionManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
keymaps({ schema }) {
|
keymaps({ schema }) {
|
||||||
return this.extensions
|
const extensionKeymaps = this.extensions
|
||||||
|
.filter(extension => ['extension'].includes(extension.type))
|
||||||
|
.filter(extension => extension.keys)
|
||||||
|
.map(extension => extension.keys({ schema }))
|
||||||
|
|
||||||
|
const nodeMarkKeymaps = this.extensions
|
||||||
|
.filter(extension => ['node', 'mark'].includes(extension.type))
|
||||||
.filter(extension => extension.keys)
|
.filter(extension => extension.keys)
|
||||||
.map(extension => extension.keys({
|
.map(extension => extension.keys({
|
||||||
type: schema[`${extension.type}s`][extension.name],
|
type: schema[`${extension.type}s`][extension.name],
|
||||||
schema,
|
schema,
|
||||||
}))
|
}))
|
||||||
.map(keys => keymap(keys))
|
|
||||||
|
return [
|
||||||
|
...extensionKeymaps,
|
||||||
|
...nodeMarkKeymaps,
|
||||||
|
].map(keys => keymap(keys))
|
||||||
|
|
||||||
|
// return this.extensions
|
||||||
|
// .filter(extension => ['node', 'mark'].includes(extension.type))
|
||||||
|
// .filter(extension => extension.keys)
|
||||||
|
// .map(extension => extension.keys({
|
||||||
|
// type: schema[`${extension.type}s`][extension.name],
|
||||||
|
// schema,
|
||||||
|
// }))
|
||||||
|
// .map(keys => keymap(keys))
|
||||||
}
|
}
|
||||||
|
|
||||||
inputRules({ schema }) {
|
inputRules({ schema }) {
|
||||||
return this.extensions
|
const extensionInputRules = this.extensions
|
||||||
|
.filter(extension => ['extension'].includes(extension.type))
|
||||||
|
.filter(extension => extension.inputRules)
|
||||||
|
.map(extension => extension.inputRules({ schema }))
|
||||||
|
|
||||||
|
const nodeMarkInputRules = this.extensions
|
||||||
|
.filter(extension => ['node', 'mark'].includes(extension.type))
|
||||||
.filter(extension => extension.inputRules)
|
.filter(extension => extension.inputRules)
|
||||||
.map(extension => extension.inputRules({
|
.map(extension => extension.inputRules({
|
||||||
type: schema[`${extension.type}s`][extension.name],
|
type: schema[`${extension.type}s`][extension.name],
|
||||||
schema,
|
schema,
|
||||||
}))
|
}))
|
||||||
.reduce((allInputRules, inputRules) => ([
|
|
||||||
|
return [
|
||||||
|
...extensionInputRules,
|
||||||
|
...nodeMarkInputRules,
|
||||||
|
].reduce((allInputRules, inputRules) => ([
|
||||||
...allInputRules,
|
...allInputRules,
|
||||||
...inputRules,
|
...inputRules,
|
||||||
]), [])
|
]), [])
|
||||||
@@ -67,6 +97,7 @@ export default class ExtensionManager {
|
|||||||
|
|
||||||
commands({ schema, view }) {
|
commands({ schema, view }) {
|
||||||
return this.extensions
|
return this.extensions
|
||||||
|
.filter(extension => ['node', 'mark'].includes(extension.type))
|
||||||
.filter(extension => extension.command)
|
.filter(extension => extension.command)
|
||||||
.reduce((commands, { name, type, command }) => ({
|
.reduce((commands, { name, type, command }) => ({
|
||||||
...commands,
|
...commands,
|
||||||
|
|||||||
@@ -1,18 +1,10 @@
|
|||||||
import { lift, selectParentNode } from 'prosemirror-commands'
|
import { lift, selectParentNode } from 'prosemirror-commands'
|
||||||
import { undo, redo } from 'prosemirror-history'
|
|
||||||
import { undoInputRule } from 'prosemirror-inputrules'
|
import { undoInputRule } from 'prosemirror-inputrules'
|
||||||
import isMac from './isMac'
|
|
||||||
|
|
||||||
const keymap = {
|
const keymap = {
|
||||||
'Mod-z': undo,
|
|
||||||
'Shift-Mod-z': undo,
|
|
||||||
'Mod-BracketLeft': lift,
|
'Mod-BracketLeft': lift,
|
||||||
Backspace: undoInputRule,
|
Backspace: undoInputRule,
|
||||||
Escape: selectParentNode,
|
Escape: selectParentNode,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isMac) {
|
|
||||||
keymap['Mod-y'] = redo
|
|
||||||
}
|
|
||||||
|
|
||||||
export default keymap
|
export default keymap
|
||||||
|
|||||||
@@ -27,4 +27,8 @@ export default class Extension {
|
|||||||
return []
|
return []
|
||||||
}
|
}
|
||||||
|
|
||||||
|
keys() {
|
||||||
|
return {}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,5 @@ export { default as buildMenuActions } from './buildMenuActions'
|
|||||||
export { default as builtInKeymap } from './builtInKeymap'
|
export { default as builtInKeymap } from './builtInKeymap'
|
||||||
export { default as ComponentView } from './ComponentView'
|
export { default as ComponentView } from './ComponentView'
|
||||||
export { default as initNodeViews } from './initNodeViews'
|
export { default as initNodeViews } from './initNodeViews'
|
||||||
export { default as isMac } from './isMac'
|
|
||||||
export { default as menuBubble } from './menuBubble'
|
export { default as menuBubble } from './menuBubble'
|
||||||
export { default as ExtensionManager } from './ExtensionManager'
|
export { default as ExtensionManager } from './ExtensionManager'
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
export default typeof navigator !== 'undefined' ? /Mac/.test(navigator.platform) : false
|
|
||||||
@@ -22,8 +22,4 @@ export default class Mark extends Extension {
|
|||||||
return () => {}
|
return () => {}
|
||||||
}
|
}
|
||||||
|
|
||||||
keys() {
|
|
||||||
return {}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,8 +22,4 @@ export default class Node extends Extension {
|
|||||||
return () => {}
|
return () => {}
|
||||||
}
|
}
|
||||||
|
|
||||||
keys() {
|
|
||||||
return {}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user