Merge branch 'main' of github.com:ueberdosis/tiptap-next into main

This commit is contained in:
Hans Pagel
2020-11-13 15:08:40 +01:00
52 changed files with 177 additions and 179 deletions

View File

@@ -5,7 +5,7 @@ context('/examples/export-html-or-json', () => {
beforeEach(() => { beforeEach(() => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.setContent('<p>Example Text</p>') editor.commands.setContent('<p>Example Text</p>')
}) })
}) })

View File

@@ -69,7 +69,7 @@ export default {
methods: { methods: {
setContent() { setContent() {
// You can pass a JSON document … // You can pass a JSON document …
this.editor.setContent({ this.editor.commands.setContent({
type: 'document', type: 'document',
content: [{ content: [{
type: 'paragraph', type: 'paragraph',
@@ -86,12 +86,15 @@ export default {
// this.editor.setContent('<p>This is some inserted text. 👋</p>') // this.editor.setContent('<p>This is some inserted text. 👋</p>')
// Its likely that youd like to focus the Editor after most commands. // Its likely that youd like to focus the Editor after most commands.
this.editor.focus() this.editor.commands.focus()
}, },
clearContent() { clearContent() {
this.editor.clearContent(true) this.editor
this.editor.focus() .chain()
.clearContent(true)
.focus()
.run()
}, },
}, },

View File

@@ -11,7 +11,7 @@
</template> </template>
<script> <script>
import { Editor, mergeAttributes } from '@tiptap/core' import { Editor } from '@tiptap/core'
import { EditorContent } from '@tiptap/vue' import { EditorContent } from '@tiptap/vue'
import Document from '@tiptap/extension-document' import Document from '@tiptap/extension-document'
import Paragraph from '@tiptap/extension-paragraph' import Paragraph from '@tiptap/extension-paragraph'

View File

@@ -5,7 +5,7 @@ context('/examples/markdown-shortcuts', () => {
beforeEach(() => { beforeEach(() => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.clearContent() editor.commands.clearContent()
}) })
}) })

View File

@@ -7,7 +7,7 @@ context('/examples/read-only', () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
cy.get('#editable').uncheck() cy.get('#editable').uncheck()
editor.insertText('Edited: ') editor.commands.insertText('Edited: ')
cy.get('.ProseMirror p:first').should('not.contain', 'Edited: ') cy.get('.ProseMirror p:first').should('not.contain', 'Edited: ')
}) })
@@ -17,7 +17,7 @@ context('/examples/read-only', () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
cy.get('#editable').check() cy.get('#editable').check()
editor.insertText('Edited: ') editor.commands.insertText('Edited: ')
cy.get('.ProseMirror p:first').should('contain', 'Edited: ') cy.get('.ProseMirror p:first').should('contain', 'Edited: ')
}) })

View File

@@ -5,7 +5,7 @@ context('/api/extensions/history', () => {
beforeEach(() => { beforeEach(() => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.setContent('<p>Mistake</p>') editor.commands.setContent('<p>Mistake</p>')
}) })
}) })

View File

@@ -5,34 +5,34 @@ context('/api/extensions/text-align', () => {
beforeEach(() => { beforeEach(() => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.setContent('<p>Example Text</p>') editor.commands.setContent('<p>Example Text</p>')
}) })
}) })
it('should parse left align text correctly', () => { it('should parse left align text correctly', () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.setContent('<p style="text-align: left">Example Text</p>') editor.commands.setContent('<p style="text-align: left">Example Text</p>')
expect(editor.getHTML()).to.eq('<p style="text-align: left">Example Text</p>') expect(editor.getHTML()).to.eq('<p style="text-align: left">Example Text</p>')
}) })
}) })
it('should parse center align text correctly', () => { it('should parse center align text correctly', () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.setContent('<p style="text-align: center">Example Text</p>') editor.commands.setContent('<p style="text-align: center">Example Text</p>')
expect(editor.getHTML()).to.eq('<p style="text-align: center">Example Text</p>') expect(editor.getHTML()).to.eq('<p style="text-align: center">Example Text</p>')
}) })
}) })
it('should parse right align text correctly', () => { it('should parse right align text correctly', () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.setContent('<p style="text-align: right">Example Text</p>') editor.commands.setContent('<p style="text-align: right">Example Text</p>')
expect(editor.getHTML()).to.eq('<p style="text-align: right">Example Text</p>') expect(editor.getHTML()).to.eq('<p style="text-align: right">Example Text</p>')
}) })
}) })
it('should parse left justify text correctly', () => { it('should parse left justify text correctly', () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.setContent('<p style="text-align: justify">Example Text</p>') editor.commands.setContent('<p style="text-align: justify">Example Text</p>')
expect(editor.getHTML()).to.eq('<p style="text-align: justify">Example Text</p>') expect(editor.getHTML()).to.eq('<p style="text-align: justify">Example Text</p>')
}) })
}) })

View File

@@ -5,7 +5,7 @@ context('/api/extensions/typography', () => {
beforeEach(() => { beforeEach(() => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.clearContent() editor.commands.clearContent()
}) })
}) })

View File

@@ -5,37 +5,37 @@ context('/api/marks/bold', () => {
beforeEach(() => { beforeEach(() => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.setContent('<p>Example Text</p>') editor.commands.setContent('<p>Example Text</p>')
editor.selectAll() editor.commands.selectAll()
}) })
}) })
it('should transform b tags to strong tags', () => { it('should transform b tags to strong tags', () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.setContent('<p><b>Example Text</b></p>') editor.commands.setContent('<p><b>Example Text</b></p>')
expect(editor.getHTML()).to.eq('<p><strong>Example Text</strong></p>') expect(editor.getHTML()).to.eq('<p><strong>Example Text</strong></p>')
}) })
}) })
it('sould omit b tags with normal font weight inline style', () => { it('sould omit b tags with normal font weight inline style', () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.setContent('<p><b style="font-weight: normal">Example Text</b></p>') editor.commands.setContent('<p><b style="font-weight: normal">Example Text</b></p>')
expect(editor.getHTML()).to.eq('<p>Example Text</p>') expect(editor.getHTML()).to.eq('<p>Example Text</p>')
}) })
}) })
it('should transform any tag with bold inline style to strong tags', () => { it('should transform any tag with bold inline style to strong tags', () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.setContent('<p><span style="font-weight: bold">Example Text</span></p>') editor.commands.setContent('<p><span style="font-weight: bold">Example Text</span></p>')
expect(editor.getHTML()).to.eq('<p><strong>Example Text</strong></p>') expect(editor.getHTML()).to.eq('<p><strong>Example Text</strong></p>')
editor.setContent('<p><span style="font-weight: bolder">Example Text</span></p>') editor.commands.setContent('<p><span style="font-weight: bolder">Example Text</span></p>')
expect(editor.getHTML()).to.eq('<p><strong>Example Text</strong></p>') expect(editor.getHTML()).to.eq('<p><strong>Example Text</strong></p>')
editor.setContent('<p><span style="font-weight: 500">Example Text</span></p>') editor.commands.setContent('<p><span style="font-weight: 500">Example Text</span></p>')
expect(editor.getHTML()).to.eq('<p><strong>Example Text</strong></p>') expect(editor.getHTML()).to.eq('<p><strong>Example Text</strong></p>')
editor.setContent('<p><span style="font-weight: 900">Example Text</span></p>') editor.commands.setContent('<p><span style="font-weight: 900">Example Text</span></p>')
expect(editor.getHTML()).to.eq('<p><strong>Example Text</strong></p>') expect(editor.getHTML()).to.eq('<p><strong>Example Text</strong></p>')
}) })
}) })

View File

@@ -5,17 +5,17 @@ context('/api/marks/code', () => {
beforeEach(() => { beforeEach(() => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.setContent('<p>Example Text</p>') editor.commands.setContent('<p>Example Text</p>')
editor.selectAll() editor.commands.selectAll()
}) })
}) })
it('should parse code tags correctly', () => { it('should parse code tags correctly', () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.setContent('<p><code>Example Text</code></p>') editor.commands.setContent('<p><code>Example Text</code></p>')
expect(editor.getHTML()).to.eq('<p><code>Example Text</code></p>') expect(editor.getHTML()).to.eq('<p><code>Example Text</code></p>')
editor.setContent('<code>Example Text</code>') editor.commands.setContent('<code>Example Text</code>')
expect(editor.getHTML()).to.eq('<p><code>Example Text</code></p>') expect(editor.getHTML()).to.eq('<p><code>Example Text</code></p>')
}) })
}) })

View File

@@ -24,7 +24,7 @@ context('/api/marks/highlight', () => {
it('should highlight the text in a specific color', () => { it('should highlight the text in a specific color', () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.highlight({ color: 'red' }) editor.commands.highlight({ color: 'red' })
cy.get('.ProseMirror') cy.get('.ProseMirror')
.find('mark') .find('mark')

View File

@@ -5,28 +5,28 @@ context('/api/marks/italic', () => {
beforeEach(() => { beforeEach(() => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.setContent('<p>Example Text</p>') editor.commands.setContent('<p>Example Text</p>')
editor.selectAll() editor.commands.selectAll()
}) })
}) })
it('i tags should be transformed to em tags', () => { it('i tags should be transformed to em tags', () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.setContent('<p><i>Example Text</i></p>') editor.commands.setContent('<p><i>Example Text</i></p>')
expect(editor.getHTML()).to.eq('<p><em>Example Text</em></p>') expect(editor.getHTML()).to.eq('<p><em>Example Text</em></p>')
}) })
}) })
it('i tags with normal font style should be omitted', () => { it('i tags with normal font style should be omitted', () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.setContent('<p><i style="font-style: normal">Example Text</i></p>') editor.commands.setContent('<p><i style="font-style: normal">Example Text</i></p>')
expect(editor.getHTML()).to.eq('<p>Example Text</p>') expect(editor.getHTML()).to.eq('<p>Example Text</p>')
}) })
}) })
it('generic tags with italic style should be transformed to strong tags', () => { it('generic tags with italic style should be transformed to strong tags', () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.setContent('<p><span style="font-style: italic">Example Text</span></p>') editor.commands.setContent('<p><span style="font-style: italic">Example Text</span></p>')
expect(editor.getHTML()).to.eq('<p><em>Example Text</em></p>') expect(editor.getHTML()).to.eq('<p><em>Example Text</em></p>')
}) })
}) })

View File

@@ -5,28 +5,28 @@ context('/api/marks/link', () => {
beforeEach(() => { beforeEach(() => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.setContent('<p>Example Text</p>') editor.commands.setContent('<p>Example Text</p>')
editor.selectAll() editor.commands.selectAll()
}) })
}) })
it('should parse a tags correctly', () => { it('should parse a tags correctly', () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.setContent('<p><a href="#">Example Text</a></p>') editor.commands.setContent('<p><a href="#">Example Text</a></p>')
expect(editor.getHTML()).to.eq('<p><a href="#" target="_blank" rel="noopener noreferrer nofollow">Example Text</a></p>') expect(editor.getHTML()).to.eq('<p><a href="#" target="_blank" rel="noopener noreferrer nofollow">Example Text</a></p>')
}) })
}) })
it('should parse a tags with target attribute correctly', () => { it('should parse a tags with target attribute correctly', () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.setContent('<p><a href="#" target="_self">Example Text</a></p>') editor.commands.setContent('<p><a href="#" target="_self">Example Text</a></p>')
expect(editor.getHTML()).to.eq('<p><a href="#" target="_self" rel="noopener noreferrer nofollow">Example Text</a></p>') expect(editor.getHTML()).to.eq('<p><a href="#" target="_self" rel="noopener noreferrer nofollow">Example Text</a></p>')
}) })
}) })
it('should parse a tags with rel attribute correctly', () => { it('should parse a tags with rel attribute correctly', () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.setContent('<p><a href="#" rel="follow">Example Text</a></p>') editor.commands.setContent('<p><a href="#" rel="follow">Example Text</a></p>')
expect(editor.getHTML()).to.eq('<p><a href="#" target="_blank" rel="noopener noreferrer nofollow">Example Text</a></p>') expect(editor.getHTML()).to.eq('<p><a href="#" target="_blank" rel="noopener noreferrer nofollow">Example Text</a></p>')
}) })
}) })

View File

@@ -5,35 +5,35 @@ context('/api/marks/strike', () => {
beforeEach(() => { beforeEach(() => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.setContent('<p>Example Text</p>') editor.commands.setContent('<p>Example Text</p>')
editor.selectAll() editor.commands.selectAll()
}) })
}) })
it('should parse s tags correctly', () => { it('should parse s tags correctly', () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.setContent('<p><s>Example Text</s></p>') editor.commands.setContent('<p><s>Example Text</s></p>')
expect(editor.getHTML()).to.eq('<p><s>Example Text</s></p>') expect(editor.getHTML()).to.eq('<p><s>Example Text</s></p>')
}) })
}) })
it('should transform del tags to s tags', () => { it('should transform del tags to s tags', () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.setContent('<p><del>Example Text</del></p>') editor.commands.setContent('<p><del>Example Text</del></p>')
expect(editor.getHTML()).to.eq('<p><s>Example Text</s></p>') expect(editor.getHTML()).to.eq('<p><s>Example Text</s></p>')
}) })
}) })
it('should transform strike tags to s tags', () => { it('should transform strike tags to s tags', () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.setContent('<p><strike>Example Text</strike></p>') editor.commands.setContent('<p><strike>Example Text</strike></p>')
expect(editor.getHTML()).to.eq('<p><s>Example Text</s></p>') expect(editor.getHTML()).to.eq('<p><s>Example Text</s></p>')
}) })
}) })
it('should transform any tag with text decoration line through to s tags', () => { it('should transform any tag with text decoration line through to s tags', () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.setContent('<p><span style="text-decoration: line-through">Example Text</span></p>') editor.commands.setContent('<p><span style="text-decoration: line-through">Example Text</span></p>')
expect(editor.getHTML()).to.eq('<p><s>Example Text</s></p>') expect(editor.getHTML()).to.eq('<p><s>Example Text</s></p>')
}) })
}) })

View File

@@ -5,21 +5,21 @@ context('/api/marks/underline', () => {
beforeEach(() => { beforeEach(() => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.setContent('<p>Example Text</p>') editor.commands.setContent('<p>Example Text</p>')
editor.selectAll() editor.commands.selectAll()
}) })
}) })
it('should parse u tags correctly', () => { it('should parse u tags correctly', () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.setContent('<p><u>Example Text</u></p>') editor.commands.setContent('<p><u>Example Text</u></p>')
expect(editor.getHTML()).to.eq('<p><u>Example Text</u></p>') expect(editor.getHTML()).to.eq('<p><u>Example Text</u></p>')
}) })
}) })
it('should transform any tag with text decoration underline to u tags', () => { it('should transform any tag with text decoration underline to u tags', () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.setContent('<p><span style="text-decoration: underline">Example Text</span></p>') editor.commands.setContent('<p><span style="text-decoration: underline">Example Text</span></p>')
expect(editor.getHTML()).to.eq('<p><u>Example Text</u></p>') expect(editor.getHTML()).to.eq('<p><u>Example Text</u></p>')
}) })
}) })

View File

@@ -5,21 +5,21 @@ context('/api/nodes/blockquote', () => {
beforeEach(() => { beforeEach(() => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.setContent('<p>Example Text</p>') editor.commands.setContent('<p>Example Text</p>')
editor.selectAll() editor.commands.selectAll()
}) })
}) })
it('should parse blockquote tags correctly', () => { it('should parse blockquote tags correctly', () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.setContent('<blockquote><p>Example Text</p></blockquote>') editor.commands.setContent('<blockquote><p>Example Text</p></blockquote>')
expect(editor.getHTML()).to.eq('<blockquote><p>Example Text</p></blockquote>') expect(editor.getHTML()).to.eq('<blockquote><p>Example Text</p></blockquote>')
}) })
}) })
it('should parse blockquote tags without paragraphs correctly', () => { it('should parse blockquote tags without paragraphs correctly', () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.setContent('<blockquote>Example Text</blockquote>') editor.commands.setContent('<blockquote>Example Text</blockquote>')
expect(editor.getHTML()).to.eq('<blockquote><p>Example Text</p></blockquote>') expect(editor.getHTML()).to.eq('<blockquote><p>Example Text</p></blockquote>')
}) })
}) })
@@ -38,8 +38,8 @@ context('/api/nodes/blockquote', () => {
it('the button should wrap all nodes in one blockquote', () => { it('the button should wrap all nodes in one blockquote', () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.setContent('<p>Example Text</p><p>Example Text</p>') editor.commands.setContent('<p>Example Text</p><p>Example Text</p>')
editor.selectAll() editor.commands.selectAll()
}) })
cy.get('.demo__preview button:first') cy.get('.demo__preview button:first')

View File

@@ -5,21 +5,21 @@ context('/api/nodes/bullet-list', () => {
beforeEach(() => { beforeEach(() => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.setContent('<p>Example Text</p>') editor.commands.setContent('<p>Example Text</p>')
editor.selectAll() editor.commands.selectAll()
}) })
}) })
it('should parse unordered lists correctly', () => { it('should parse unordered lists correctly', () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.setContent('<ul><li><p>Example Text</p></li></ul>') editor.commands.setContent('<ul><li><p>Example Text</p></li></ul>')
expect(editor.getHTML()).to.eq('<ul><li><p>Example Text</p></li></ul>') expect(editor.getHTML()).to.eq('<ul><li><p>Example Text</p></li></ul>')
}) })
}) })
it('should parse unordered lists without paragraphs correctly', () => { it('should parse unordered lists without paragraphs correctly', () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.setContent('<ul><li>Example Text</li></ul>') editor.commands.setContent('<ul><li>Example Text</li></ul>')
expect(editor.getHTML()).to.eq('<ul><li><p>Example Text</p></li></ul>') expect(editor.getHTML()).to.eq('<ul><li><p>Example Text</p></li></ul>')
}) })
}) })
@@ -63,7 +63,7 @@ context('/api/nodes/bullet-list', () => {
it('should leave the list with double enter', () => { it('should leave the list with double enter', () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.clearContent() editor.commands.clearContent()
}) })
cy.get('.ProseMirror') cy.get('.ProseMirror')
@@ -81,7 +81,7 @@ context('/api/nodes/bullet-list', () => {
it('should make a bullet list from an asterisk', () => { it('should make a bullet list from an asterisk', () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.clearContent() editor.commands.clearContent()
}) })
cy.get('.ProseMirror') cy.get('.ProseMirror')
@@ -98,7 +98,7 @@ context('/api/nodes/bullet-list', () => {
it('should make a bullet list from a dash', () => { it('should make a bullet list from a dash', () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.clearContent() editor.commands.clearContent()
}) })
cy.get('.ProseMirror') cy.get('.ProseMirror')
@@ -115,7 +115,7 @@ context('/api/nodes/bullet-list', () => {
it('should make a bullet list from a plus', () => { it('should make a bullet list from a plus', () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.clearContent() editor.commands.clearContent()
}) })
cy.get('.ProseMirror') cy.get('.ProseMirror')
@@ -132,7 +132,7 @@ context('/api/nodes/bullet-list', () => {
it('should remove the bullet list after pressing backspace', () => { it('should remove the bullet list after pressing backspace', () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.clearContent() editor.commands.clearContent()
}) })
cy.get('.ProseMirror') cy.get('.ProseMirror')

View File

@@ -5,21 +5,21 @@ context('/api/nodes/code-block', () => {
beforeEach(() => { beforeEach(() => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.setContent('<p>Example Text</p>') editor.commands.setContent('<p>Example Text</p>')
editor.selectAll() editor.commands.selectAll()
}) })
}) })
it('should parse code blocks correctly', () => { it('should parse code blocks correctly', () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.setContent('<pre><code>Example Text</code></pre>') editor.commands.setContent('<pre><code>Example Text</code></pre>')
expect(editor.getHTML()).to.eq('<pre><code>Example Text</code></pre>') expect(editor.getHTML()).to.eq('<pre><code>Example Text</code></pre>')
}) })
}) })
it('should parse code blocks with language correctly', () => { it('should parse code blocks with language correctly', () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.setContent('<pre><code class="language-css">Example Text</code></pre>') editor.commands.setContent('<pre><code class="language-css">Example Text</code></pre>')
expect(editor.getHTML()).to.eq('<pre><code class="language-css">Example Text</code></pre>') expect(editor.getHTML()).to.eq('<pre><code class="language-css">Example Text</code></pre>')
}) })
}) })
@@ -74,7 +74,7 @@ context('/api/nodes/code-block', () => {
it('should parse the language from a HTML code block', () => { it('should parse the language from a HTML code block', () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.setContent('<pre><code class="language-css">body { display: none; }</code></pre>') editor.commands.setContent('<pre><code class="language-css">body { display: none; }</code></pre>')
cy.get('.ProseMirror') cy.get('.ProseMirror')
.find('pre>code.language-css') .find('pre>code.language-css')
@@ -84,7 +84,7 @@ context('/api/nodes/code-block', () => {
it('should make a code block from backtick markdown shortcuts', () => { it('should make a code block from backtick markdown shortcuts', () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.clearContent() editor.commands.clearContent()
cy.get('.ProseMirror') cy.get('.ProseMirror')
.type('``` Code') .type('``` Code')
@@ -95,7 +95,7 @@ context('/api/nodes/code-block', () => {
it('should make a code block from tilde markdown shortcuts', () => { it('should make a code block from tilde markdown shortcuts', () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.clearContent() editor.commands.clearContent()
cy.get('.ProseMirror') cy.get('.ProseMirror')
.type('~~~ Code') .type('~~~ Code')
@@ -106,7 +106,7 @@ context('/api/nodes/code-block', () => {
it('should make a code block for js with backticks', () => { it('should make a code block for js with backticks', () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.clearContent() editor.commands.clearContent()
cy.get('.ProseMirror') cy.get('.ProseMirror')
.type('```js Code') .type('```js Code')
@@ -117,7 +117,7 @@ context('/api/nodes/code-block', () => {
it('should make a code block for js with tildes', () => { it('should make a code block for js with tildes', () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.clearContent() editor.commands.clearContent()
cy.get('.ProseMirror') cy.get('.ProseMirror')
.type('~~~js Code') .type('~~~js Code')

View File

@@ -5,7 +5,7 @@ context('/api/nodes/document', () => {
beforeEach(() => { beforeEach(() => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.setContent('<p></p>') editor.commands.setContent('<p></p>')
}) })
}) })

View File

@@ -5,20 +5,20 @@ context('/api/nodes/hard-break', () => {
beforeEach(() => { beforeEach(() => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.setContent('<p>Example Text</p>') editor.commands.setContent('<p>Example Text</p>')
}) })
}) })
it('should parse hard breaks correctly', () => { it('should parse hard breaks correctly', () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.setContent('<p>Example<br>Text</p>') editor.commands.setContent('<p>Example<br>Text</p>')
expect(editor.getHTML()).to.eq('<p>Example<br>Text</p>') expect(editor.getHTML()).to.eq('<p>Example<br>Text</p>')
}) })
}) })
it('should parse hard breaks with self-closing tag correctly', () => { it('should parse hard breaks with self-closing tag correctly', () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.setContent('<p>Example<br />Text</p>') editor.commands.setContent('<p>Example<br />Text</p>')
expect(editor.getHTML()).to.eq('<p>Example<br>Text</p>') expect(editor.getHTML()).to.eq('<p>Example<br>Text</p>')
}) })
}) })

View File

@@ -5,8 +5,8 @@ context('/api/nodes/heading', () => {
beforeEach(() => { beforeEach(() => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.setContent('<p>Example Text</p>') editor.commands.setContent('<p>Example Text</p>')
editor.selectAll() editor.commands.selectAll()
}) })
}) })
@@ -19,7 +19,7 @@ context('/api/nodes/heading', () => {
headings.forEach(html => { headings.forEach(html => {
it(`should parse headings correctly (${html})`, () => { it(`should parse headings correctly (${html})`, () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.setContent(html) editor.commands.setContent(html)
expect(editor.getHTML()).to.eq(html) expect(editor.getHTML()).to.eq(html)
}) })
}) })
@@ -27,7 +27,7 @@ context('/api/nodes/heading', () => {
it('should omit disabled heading levels', () => { it('should omit disabled heading levels', () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.setContent('<h4>Example Text</h4>') editor.commands.setContent('<h4>Example Text</h4>')
expect(editor.getHTML()).to.eq('<p>Example Text</p>') expect(editor.getHTML()).to.eq('<p>Example Text</p>')
}) })
}) })
@@ -88,7 +88,7 @@ context('/api/nodes/heading', () => {
it('should make a heading from the default markdown shortcut', () => { it('should make a heading from the default markdown shortcut', () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.clearContent() editor.commands.clearContent()
}) })
cy.get('.ProseMirror') cy.get('.ProseMirror')

View File

@@ -5,20 +5,20 @@ context('/api/nodes/horizontal-rule', () => {
beforeEach(() => { beforeEach(() => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.setContent('<p>Example Text</p>') editor.commands.setContent('<p>Example Text</p>')
}) })
}) })
it('should parse horizontal rules correctly', () => { it('should parse horizontal rules correctly', () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.setContent('<p>Example Text</p><hr>') editor.commands.setContent('<p>Example Text</p><hr>')
expect(editor.getHTML()).to.eq('<p>Example Text</p><hr>') expect(editor.getHTML()).to.eq('<p>Example Text</p><hr>')
}) })
}) })
it('should parse horizontal rules with self-closing tag correctly', () => { it('should parse horizontal rules with self-closing tag correctly', () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.setContent('<p>Example Text</p><hr />') editor.commands.setContent('<p>Example Text</p><hr />')
expect(editor.getHTML()).to.eq('<p>Example Text</p><hr>') expect(editor.getHTML()).to.eq('<p>Example Text</p><hr>')
}) })
}) })
@@ -36,7 +36,7 @@ context('/api/nodes/horizontal-rule', () => {
it('the default markdown shortcut should add a horizontal rule', () => { it('the default markdown shortcut should add a horizontal rule', () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.clearContent() editor.commands.clearContent()
cy.get('.ProseMirror hr') cy.get('.ProseMirror hr')
.should('not.exist') .should('not.exist')
@@ -51,7 +51,7 @@ context('/api/nodes/horizontal-rule', () => {
it('the alternative markdown shortcut should add a horizontal rule', () => { it('the alternative markdown shortcut should add a horizontal rule', () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.clearContent() editor.commands.clearContent()
cy.get('.ProseMirror hr') cy.get('.ProseMirror hr')
.should('not.exist') .should('not.exist')

View File

@@ -5,8 +5,8 @@ context('/api/nodes/image', () => {
beforeEach(() => { beforeEach(() => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.setContent('<p>Example Text</p>') editor.commands.setContent('<p>Example Text</p>')
editor.selectAll() editor.commands.selectAll()
}) })
}) })

View File

@@ -5,21 +5,21 @@ context('/api/nodes/ordered-list', () => {
beforeEach(() => { beforeEach(() => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.setContent('<p>Example Text</p>') editor.commands.setContent('<p>Example Text</p>')
editor.selectAll() editor.commands.selectAll()
}) })
}) })
it('should parse ordered lists correctly', () => { it('should parse ordered lists correctly', () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.setContent('<ol><li><p>Example Text</p></li></ol>') editor.commands.setContent('<ol><li><p>Example Text</p></li></ol>')
expect(editor.getHTML()).to.eq('<ol><li><p>Example Text</p></li></ol>') expect(editor.getHTML()).to.eq('<ol><li><p>Example Text</p></li></ol>')
}) })
}) })
it('should parse ordered lists without paragraphs correctly', () => { it('should parse ordered lists without paragraphs correctly', () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.setContent('<ol><li>Example Text</li></ol>') editor.commands.setContent('<ol><li>Example Text</li></ol>')
expect(editor.getHTML()).to.eq('<ol><li><p>Example Text</p></li></ol>') expect(editor.getHTML()).to.eq('<ol><li><p>Example Text</p></li></ol>')
}) })
}) })
@@ -63,7 +63,7 @@ context('/api/nodes/ordered-list', () => {
it('should leave the list with double enter', () => { it('should leave the list with double enter', () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.clearContent() editor.commands.clearContent()
}) })
cy.get('.ProseMirror') cy.get('.ProseMirror')
@@ -81,7 +81,7 @@ context('/api/nodes/ordered-list', () => {
it('should make a ordered list from a number', () => { it('should make a ordered list from a number', () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.clearContent() editor.commands.clearContent()
}) })
cy.get('.ProseMirror') cy.get('.ProseMirror')
@@ -98,7 +98,7 @@ context('/api/nodes/ordered-list', () => {
it('should remove the ordered list after pressing backspace', () => { it('should remove the ordered list after pressing backspace', () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.clearContent() editor.commands.clearContent()
}) })
cy.get('.ProseMirror') cy.get('.ProseMirror')

View File

@@ -5,19 +5,19 @@ context('/api/nodes/paragraph', () => {
beforeEach(() => { beforeEach(() => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.clearContent() editor.commands.clearContent()
}) })
}) })
it('should parse paragraphs correctly', () => { it('should parse paragraphs correctly', () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.setContent('<p>Example Text</p>') editor.commands.setContent('<p>Example Text</p>')
expect(editor.getHTML()).to.eq('<p>Example Text</p>') expect(editor.getHTML()).to.eq('<p>Example Text</p>')
editor.setContent('<p><x-unknown>Example Text</x-unknown></p>') editor.commands.setContent('<p><x-unknown>Example Text</x-unknown></p>')
expect(editor.getHTML()).to.eq('<p>Example Text</p>') expect(editor.getHTML()).to.eq('<p>Example Text</p>')
editor.setContent('<p style="display: block;">Example Text</p>') editor.commands.setContent('<p style="display: block;">Example Text</p>')
expect(editor.getHTML()).to.eq('<p>Example Text</p>') expect(editor.getHTML()).to.eq('<p>Example Text</p>')
}) })
}) })

View File

@@ -5,21 +5,21 @@ context('/api/nodes/task-list', () => {
beforeEach(() => { beforeEach(() => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.setContent('<p>Example Text</p>') editor.commands.setContent('<p>Example Text</p>')
editor.selectAll() editor.commands.selectAll()
}) })
}) })
it('should parse unordered lists correctly', () => { it('should parse unordered lists correctly', () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.setContent('<ul data-type="task_list"><li data-checked="true" data-type="taskItem"><p>Example Text</p></li></ul>') editor.commands.setContent('<ul data-type="task_list"><li data-checked="true" data-type="taskItem"><p>Example Text</p></li></ul>')
expect(editor.getHTML()).to.eq('<ul data-type="task_list"><li data-checked="true" data-type="taskItem"><p>Example Text</p></li></ul>') expect(editor.getHTML()).to.eq('<ul data-type="task_list"><li data-checked="true" data-type="taskItem"><p>Example Text</p></li></ul>')
}) })
}) })
it('should parse unordered lists without paragraphs correctly', () => { it('should parse unordered lists without paragraphs correctly', () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.setContent('<ul data-type="task_list"><li data-checked="false" data-type="taskItem">Example Text</li></ul>') editor.commands.setContent('<ul data-type="task_list"><li data-checked="false" data-type="taskItem">Example Text</li></ul>')
expect(editor.getHTML()).to.eq('<ul data-type="task_list"><li data-checked="false" data-type="taskItem"><p>Example Text</p></li></ul>') expect(editor.getHTML()).to.eq('<ul data-type="task_list"><li data-checked="false" data-type="taskItem"><p>Example Text</p></li></ul>')
}) })
}) })
@@ -63,7 +63,7 @@ context('/api/nodes/task-list', () => {
it('should leave the list with double enter', () => { it('should leave the list with double enter', () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.clearContent() editor.commands.clearContent()
}) })
cy.get('.ProseMirror') cy.get('.ProseMirror')
@@ -81,7 +81,7 @@ context('/api/nodes/task-list', () => {
it('should make a task list from square brackets', () => { it('should make a task list from square brackets', () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.clearContent() editor.commands.clearContent()
}) })
cy.get('.ProseMirror') cy.get('.ProseMirror')
@@ -100,7 +100,7 @@ context('/api/nodes/task-list', () => {
it.only('should make a task list from checked square brackets', () => { it.only('should make a task list from checked square brackets', () => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.clearContent() editor.commands.clearContent()
}) })
cy.get('.ProseMirror') cy.get('.ProseMirror')

View File

@@ -5,7 +5,7 @@ context('/api/nodes/text', () => {
beforeEach(() => { beforeEach(() => {
cy.get('.ProseMirror').then(([{ editor }]) => { cy.get('.ProseMirror').then(([{ editor }]) => {
editor.clearContent() editor.commands.clearContent()
}) })
}) })

View File

@@ -9,7 +9,7 @@ The editor provides a ton of commands to programmtically add or change content o
All available commands are accessible through an editor instance. Lets say you want to make text bold when a user clicks on a button. Thats how that would look like: All available commands are accessible through an editor instance. Lets say you want to make text bold when a user clicks on a button. Thats how that would look like:
```js ```js
editor.bold() editor.commands.bold()
``` ```
While thats perfectly fine and does make the selected bold, youd likely want to change multiple commands in one run. Lets have a look at how that works. While thats perfectly fine and does make the selected bold, youd likely want to change multiple commands in one run. Lets have a look at how that works.

View File

@@ -104,7 +104,7 @@ const CustomBulletList = BulletList.extend({
addKeyboardShortcuts() { addKeyboardShortcuts() {
return { return {
// ↓ your new keyboard shortcut // ↓ your new keyboard shortcut
'Mod-l': () => this.editor.bulletList(), 'Mod-l': () => this.editor.commands.bulletList(),
} }
}, },
}) })

View File

@@ -25,7 +25,7 @@ import BulletList from '@tiptap/extension-bullet-list'
const CustomBulletList = BulletList.extend({ const CustomBulletList = BulletList.extend({
addKeyboardShortcuts() { addKeyboardShortcuts() {
return { return {
'Mod-l': () => this.editor.bulletList(), 'Mod-l': () => this.editor.commands.bulletList(),
} }
}, },
}) })
@@ -296,7 +296,7 @@ import BulletList from '@tiptap/extension-bullet-list'
const CustomBulletList = BulletList.extend({ const CustomBulletList = BulletList.extend({
addKeyboardShortcuts() { addKeyboardShortcuts() {
return { return {
'Mod-l': () => this.editor.bulletList(), 'Mod-l': () => this.editor.commands.bulletList(),
} }
}, },
}) })

View File

@@ -10,7 +10,7 @@ Lets start to add your first button to the editor. Once initiated the editor
<demo name="SimpleMenuBar" highlight="5-11" /> <demo name="SimpleMenuBar" highlight="5-11" />
To mark selected text bold we can use `this.editor.bold`. There a ton of other commands and you can even chain them to do multiple things at once. To mark selected text bold we can use `editor.commands.bold()`. There a ton of other commands and you can even chain them to do multiple things at once.
You might wonder what features tiptap supports out of the box. In the above example we added the `@tiptap/starter-kit`. That already includes support for paragraphs, text, bold, italic, inline code and code blocks. There are a lot more, but you have to explicitly import them. You will learn how that works in the next example. You might wonder what features tiptap supports out of the box. In the above example we added the `@tiptap/starter-kit`. That already includes support for paragraphs, text, bold, italic, inline code and code blocks. There are a lot more, but you have to explicitly import them. You will learn how that works in the next example.

View File

@@ -73,7 +73,7 @@ new Editor({
Or if you want to restore the content later (e. g. after an API call has finished), you can do that too: Or if you want to restore the content later (e. g. after an API call has finished), you can do that too:
```js ```js
editor.setContent(`<p>Example Text</p>`) editor.commands.setContent(`<p>Example Text</p>`)
``` ```
## Not an option: Markdown ## Not an option: Markdown

View File

@@ -1,6 +1,9 @@
import { EditorState, Transaction } from 'prosemirror-state' import { EditorState, Transaction } from 'prosemirror-state'
import { import {
SingleCommands, ChainedCommands, Editor, CommandSpec, SingleCommands,
ChainedCommands,
Editor,
CommandSpec,
} from './Editor' } from './Editor'
import getAllMethodNames from './utils/getAllMethodNames' import getAllMethodNames from './utils/getAllMethodNames'
@@ -37,18 +40,14 @@ export default class CommandManager {
return this.editor return this.editor
} }
public runSingleCommand(name: string) { public createCommands() {
const { commands, editor } = this const { commands, editor } = this
const { state, view } = editor const { state, view } = editor
const command = commands[name]
if (!command) { return Object.fromEntries(Object
// TODO: prevent vue devtools to throw error .entries(commands)
// throw new Error(`tiptap: command '${name}' not found.`) .map(([name, command]) => {
return const method = (...args: any) => {
}
return (...args: any) => {
const { tr } = state const { tr } = state
const props = this.buildProps(tr) const props = this.buildProps(tr)
const callback = command(...args)(props) const callback = command(...args)(props)
@@ -57,6 +56,9 @@ export default class CommandManager {
return callback return callback
} }
return [name, method]
})) as SingleCommands
} }
public createChain(startTr?: Transaction, shouldDispatch = true) { public createChain(startTr?: Transaction, shouldDispatch = true) {
@@ -64,11 +66,7 @@ export default class CommandManager {
const { state, view } = editor const { state, view } = editor
const callbacks: boolean[] = [] const callbacks: boolean[] = []
const hasStartTransaction = !!startTr const hasStartTransaction = !!startTr
const tr = hasStartTransaction ? startTr : state.tr const tr = startTr || state.tr
if (!tr) {
return
}
return new Proxy({}, { return new Proxy({}, {
get: (_, name: string, proxy) => { get: (_, name: string, proxy) => {
@@ -101,13 +99,7 @@ export default class CommandManager {
const { commands, editor } = this const { commands, editor } = this
const { state } = editor const { state } = editor
const dispatch = false const dispatch = false
const hasStartTransaction = !!startTr const tr = startTr || state.tr
const tr = hasStartTransaction ? startTr : state.tr
if (!tr) {
return
}
const props = this.buildProps(tr, dispatch) const props = this.buildProps(tr, dispatch)
const formattedCommands = Object.fromEntries(Object const formattedCommands = Object.fromEntries(Object
.entries(commands) .entries(commands)

View File

@@ -68,10 +68,6 @@ interface EditorOptions {
editable: boolean, editable: boolean,
} }
declare module './Editor' {
interface Editor extends SingleCommands {}
}
@magicMethods @magicMethods
export class Editor extends EventEmitter { export class Editor extends EventEmitter {
@@ -116,7 +112,7 @@ export class Editor extends EventEmitter {
this.createView() this.createView()
this.injectCSS() this.injectCSS()
window.setTimeout(() => this.proxy.focus(this.options.autoFocus), 0) window.setTimeout(() => this.commands.focus(this.options.autoFocus), 0)
} }
/** /**
@@ -126,7 +122,14 @@ export class Editor extends EventEmitter {
*/ */
// eslint-disable-next-line // eslint-disable-next-line
private __get(name: string) { private __get(name: string) {
return this.commandManager.runSingleCommand(name) // TODO: maybe remove proxy
}
/**
* An object of all registered commands.
*/
public get commands() {
return this.commandManager.createCommands()
} }
/** /**

View File

@@ -14,21 +14,21 @@ import { createExtension } from '../Extension'
export const Keymap = createExtension({ export const Keymap = createExtension({
addKeyboardShortcuts() { addKeyboardShortcuts() {
const handleBackspace = () => this.editor.try(({ state, dispatch }) => [ const handleBackspace = () => this.editor.commands.try(({ state, dispatch }) => [
() => undoInputRule(state, dispatch), () => undoInputRule(state, dispatch),
() => deleteSelection(state, dispatch), () => deleteSelection(state, dispatch),
() => joinBackward(state, dispatch), () => joinBackward(state, dispatch),
() => selectNodeBackward(state, dispatch), () => selectNodeBackward(state, dispatch),
]) ])
const handleDelete = () => this.editor.try(({ state, dispatch }) => [ const handleDelete = () => this.editor.commands.try(({ state, dispatch }) => [
() => deleteSelection(state, dispatch), () => deleteSelection(state, dispatch),
() => joinForward(state, dispatch), () => joinForward(state, dispatch),
() => selectNodeForward(state, dispatch), () => selectNodeForward(state, dispatch),
]) ])
return { return {
Enter: () => this.editor.try(({ commands, state, dispatch }) => [ Enter: () => this.editor.commands.try(({ commands, state, dispatch }) => [
() => newlineInCode(state, dispatch), () => newlineInCode(state, dispatch),
() => createParagraphNear(state, dispatch), () => createParagraphNear(state, dispatch),
() => liftEmptyBlock(state, dispatch), () => liftEmptyBlock(state, dispatch),

View File

@@ -35,7 +35,7 @@ const Blockquote = createNode({
addKeyboardShortcuts() { addKeyboardShortcuts() {
return { return {
'Shift-Mod-9': () => this.editor.blockquote(), 'Shift-Mod-9': () => this.editor.commands.blockquote(),
} }
}, },

View File

@@ -43,7 +43,7 @@ const Bold = createMark({
addKeyboardShortcuts() { addKeyboardShortcuts() {
return { return {
'Mod-b': () => this.editor.bold(), 'Mod-b': () => this.editor.commands.bold(),
} }
}, },

View File

@@ -33,7 +33,7 @@ const BulletList = createNode({
addKeyboardShortcuts() { addKeyboardShortcuts() {
return { return {
'Shift-Control-8': () => this.editor.bulletList(), 'Shift-Control-8': () => this.editor.commands.bulletList(),
} }
}, },

View File

@@ -81,7 +81,7 @@ const CodeBlock = createNode({
addKeyboardShortcuts() { addKeyboardShortcuts() {
return { return {
'Mod-Shift-c': () => this.editor.codeBlock(), 'Mod-Shift-c': () => this.editor.commands.codeBlock(),
} }
}, },

View File

@@ -33,7 +33,7 @@ const Code = createMark({
addKeyboardShortcuts() { addKeyboardShortcuts() {
return { return {
'Mod-`': () => this.editor.code(), 'Mod-`': () => this.editor.commands.code(),
} }
}, },

View File

@@ -42,8 +42,8 @@ const HardBreak = createNode({
addKeyboardShortcuts() { addKeyboardShortcuts() {
return { return {
'Mod-Enter': () => this.editor.hardBreak(), 'Mod-Enter': () => this.editor.commands.hardBreak(),
'Shift-Enter': () => this.editor.hardBreak(), 'Shift-Enter': () => this.editor.commands.hardBreak(),
} }
}, },
}) })

View File

@@ -65,7 +65,7 @@ const Heading = createNode({
return this.options.levels.reduce((items, level) => ({ return this.options.levels.reduce((items, level) => ({
...items, ...items,
...{ ...{
[`Mod-Alt-${level}`]: () => this.editor.setBlockType('heading', { level }), [`Mod-Alt-${level}`]: () => this.editor.commands.setBlockType('heading', { level }),
}, },
}), {}) }), {})
}, },

View File

@@ -59,7 +59,7 @@ const Highlight = createMark({
addKeyboardShortcuts() { addKeyboardShortcuts() {
return { return {
'Mod-e': () => this.editor.highlight(), 'Mod-e': () => this.editor.commands.highlight(),
} }
}, },

View File

@@ -37,9 +37,9 @@ const History = createExtension({
addKeyboardShortcuts() { addKeyboardShortcuts() {
return { return {
'Mod-z': () => this.editor.undo(), 'Mod-z': () => this.editor.commands.undo(),
'Mod-y': () => this.editor.redo(), 'Mod-y': () => this.editor.commands.redo(),
'Shift-Mod-z': () => this.editor.redo(), 'Shift-Mod-z': () => this.editor.commands.redo(),
} }
}, },
}) })

View File

@@ -42,7 +42,7 @@ const Italic = createMark({
addKeyboardShortcuts() { addKeyboardShortcuts() {
return { return {
'Mod-i': () => this.editor.italic(), 'Mod-i': () => this.editor.commands.italic(),
} }
}, },

View File

@@ -21,9 +21,9 @@ const ListItem = createNode({
addKeyboardShortcuts() { addKeyboardShortcuts() {
return { return {
Enter: () => this.editor.splitListItem('listItem'), Enter: () => this.editor.commands.splitListItem('listItem'),
Tab: () => this.editor.sinkListItem('listItem'), Tab: () => this.editor.commands.sinkListItem('listItem'),
'Shift-Tab': () => this.editor.liftListItem('listItem'), 'Shift-Tab': () => this.editor.commands.liftListItem('listItem'),
} }
}, },
}) })

View File

@@ -52,7 +52,7 @@ const OrderedList = createNode({
addKeyboardShortcuts() { addKeyboardShortcuts() {
return { return {
'Shift-Control-9': () => this.editor.orderedList(), 'Shift-Control-9': () => this.editor.commands.orderedList(),
} }
}, },

View File

@@ -31,7 +31,7 @@ const Paragraph = createNode({
addKeyboardShortcuts() { addKeyboardShortcuts() {
return { return {
'Mod-Alt-0': () => this.editor.paragraph(), 'Mod-Alt-0': () => this.editor.commands.paragraph(),
} }
}, },
}) })

View File

@@ -42,7 +42,7 @@ const Strike = createMark({
addKeyboardShortcuts() { addKeyboardShortcuts() {
return { return {
'Mod-d': () => this.editor.strike(), 'Mod-d': () => this.editor.commands.strike(),
} }
}, },

View File

@@ -49,8 +49,8 @@ const TaskItem = createNode({
addKeyboardShortcuts() { addKeyboardShortcuts() {
const shortcuts = { const shortcuts = {
Enter: () => this.editor.splitListItem('taskItem'), Enter: () => this.editor.commands.splitListItem('taskItem'),
'Shift-Tab': () => this.editor.liftListItem('taskItem'), 'Shift-Tab': () => this.editor.commands.liftListItem('taskItem'),
} }
if (!this.options.nested) { if (!this.options.nested) {
@@ -59,7 +59,7 @@ const TaskItem = createNode({
return { return {
...shortcuts, ...shortcuts,
Tab: () => this.editor.sinkListItem('taskItem'), Tab: () => this.editor.commands.sinkListItem('taskItem'),
} }
}, },
@@ -78,7 +78,7 @@ const TaskItem = createNode({
view.dispatch(view.state.tr.setNodeMarkup(getPos(), undefined, { view.dispatch(view.state.tr.setNodeMarkup(getPos(), undefined, {
checked, checked,
})) }))
editor.focus() editor.commands.focus()
} }
}) })

View File

@@ -52,13 +52,13 @@ const TextAlign = createExtension({
// TODO: re-use only 'textAlign' attribute // TODO: re-use only 'textAlign' attribute
// TODO: use custom splitBlock only for `this.options.types` // TODO: use custom splitBlock only for `this.options.types`
// TODO: use complete default enter handler (chainCommand) with custom splitBlock // TODO: use complete default enter handler (chainCommand) with custom splitBlock
Enter: () => this.editor.splitBlock({ Enter: () => this.editor.commands.splitBlock({
withAttributes: true, withAttributes: true,
}), }),
'Ctrl-Shift-l': () => this.editor.textAlign('left'), 'Ctrl-Shift-l': () => this.editor.commands.textAlign('left'),
'Ctrl-Shift-e': () => this.editor.textAlign('center'), 'Ctrl-Shift-e': () => this.editor.commands.textAlign('center'),
'Ctrl-Shift-r': () => this.editor.textAlign('right'), 'Ctrl-Shift-r': () => this.editor.commands.textAlign('right'),
'Ctrl-Shift-j': () => this.editor.textAlign('justify'), 'Ctrl-Shift-j': () => this.editor.commands.textAlign('justify'),
} }
}, },
}) })

View File

@@ -28,7 +28,7 @@ const Underline = createMark({
addKeyboardShortcuts() { addKeyboardShortcuts() {
return { return {
'Mod-u': () => this.editor.underline(), 'Mod-u': () => this.editor.commands.underline(),
} }
}, },
}) })