tiptap/tests/cypress/integration/html/generateHTML.spec.ts

249 lines
7.5 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/// <reference types="cypress" />
import Document from '@tiptap/extension-document'
import Paragraph from '@tiptap/extension-paragraph'
import Text from '@tiptap/extension-text'
import { TextStyle } from '@tiptap/extension-text-style'
import Youtube from '@tiptap/extension-youtube'
import { generateHTML, generateJSON } from '@tiptap/html'
import StarterKit from '@tiptap/starter-kit'
describe('generateHTML', () => {
it('generate HTML from JSON without an editor instance', () => {
const json = {
type: 'doc',
content: [
{
type: 'paragraph',
content: [
{
type: 'text',
text: 'Example Text',
},
],
},
],
}
const html = generateHTML(json, [Document, Paragraph, Text])
expect(html).to.eq('<p xmlns="http://www.w3.org/1999/xhtml">Example Text</p>')
})
it('can convert from & to html', async () => {
const extensions = [Document, Paragraph, Text, Youtube]
const html = `<p>Tiptap now supports YouTube embeds! Awesome!</p>
<div data-youtube-video>
<iframe src="https://www.youtube.com/watch?v=cqHqLQgVCgY"></iframe>
</div>`
const json = generateJSON(html, extensions)
expect(json).to.deep.equal({
type: 'doc',
content: [
{
type: 'paragraph',
content: [
{
type: 'text',
text: 'Tiptap now supports YouTube embeds! Awesome!',
},
],
},
{
type: 'youtube',
attrs: {
src: 'https://www.youtube.com/watch?v=cqHqLQgVCgY',
start: 0,
width: 640,
height: 480,
},
},
],
})
expect(generateHTML(json, extensions)).to.equal(
'<p xmlns="http://www.w3.org/1999/xhtml">Tiptap now supports YouTube embeds! Awesome!</p><div xmlns="http://www.w3.org/1999/xhtml" data-youtube-video=""><iframe width="640" height="480" allowfullscreen="true" autoplay="false" disablekbcontrols="false" enableiframeapi="false" endtime="0" ivloadpolicy="0" loop="false" modestbranding="false" origin="" playlist="" rel="1" src="https://www.youtube.com/embed/cqHqLQgVCgY?rel=1" start="0"></iframe></div>',
)
})
it('can convert from & to HTML with a complex schema', async () => {
const extensions = [StarterKit, TextStyle]
const html = `
<h2>
Hi there,
</h2>
<p>
this is a <em>basic</em> example of <strong>Tiptap</strong>. Sure, there are all kind of basic text styles youd probably expect from a text editor. But wait until you see the lists:
</p>
<ul>
<li>
Thats a bullet list with one …
</li>
<li>
… or two list items.
</li>
</ul>
<p>
Isnt that great? And all of that is editable. But wait, theres more. Lets try a code block:
</p>
<pre><code class="language-css">body {
display: none;
}</code></pre>
<p>
I know, I know, this is impressive. Its only the tip of the iceberg though. Give it a try and click a little bit around. Dont forget to check the other examples too.
</p>
<blockquote>
Wow, thats amazing. Good work, boy! 👏
<br />
— Mom
</blockquote>`
const json = generateJSON(html, extensions)
const expected = {
type: 'doc',
content: [
{
type: 'heading',
attrs: {
level: 2,
},
content: [
{
type: 'text',
text: 'Hi there,',
},
],
},
{
type: 'paragraph',
content: [
{
type: 'text',
text: 'this is a ',
},
{
type: 'text',
marks: [
{
type: 'italic',
},
],
text: 'basic',
},
{
type: 'text',
text: ' example of ',
},
{
type: 'text',
marks: [
{
type: 'bold',
},
],
text: 'Tiptap',
},
{
type: 'text',
text: '. Sure, there are all kind of basic text styles youd probably expect from a text editor. But wait until you see the lists:',
},
],
},
{
type: 'bulletList',
content: [
{
type: 'listItem',
content: [
{
type: 'paragraph',
content: [
{
type: 'text',
text: 'Thats a bullet list with one …',
},
],
},
],
},
{
type: 'listItem',
content: [
{
type: 'paragraph',
content: [
{
type: 'text',
text: '… or two list items.',
},
],
},
],
},
],
},
{
type: 'paragraph',
content: [
{
type: 'text',
text: 'Isnt that great? And all of that is editable. But wait, theres more. Lets try a code block:',
},
],
},
{
type: 'codeBlock',
attrs: {
language: 'css',
},
content: [
{
type: 'text',
text: 'body {\n display: none;\n}',
},
],
},
{
type: 'paragraph',
content: [
{
type: 'text',
text: 'I know, I know, this is impressive. Its only the tip of the iceberg though. Give it a try and click a little bit around. Dont forget to check the other examples too.',
},
],
},
{
type: 'blockquote',
content: [
{
type: 'paragraph',
content: [
{
type: 'text',
text: 'Wow, thats amazing. Good work, boy! 👏 ',
},
{
type: 'hardBreak',
},
{
type: 'text',
text: '— Mom',
},
],
},
],
},
],
}
expect(json).to.deep.equal(expected)
expect(generateHTML(json, extensions)).to.equal(
`<h2 xmlns="http://www.w3.org/1999/xhtml">Hi there,</h2><p xmlns="http://www.w3.org/1999/xhtml">this is a <em>basic</em> example of <strong>Tiptap</strong>. Sure, there are all kind of basic text styles youd probably expect from a text editor. But wait until you see the lists:</p><ul xmlns="http://www.w3.org/1999/xhtml"><li><p>Thats a bullet list with one …</p></li><li><p>… or two list items.</p></li></ul><p xmlns="http://www.w3.org/1999/xhtml">Isnt that great? And all of that is editable. But wait, theres more. Lets try a code block:</p><pre xmlns="http://www.w3.org/1999/xhtml"><code class="language-css">body {
display: none;
}</code></pre><p xmlns="http://www.w3.org/1999/xhtml">I know, I know, this is impressive. Its only the tip of the iceberg though. Give it a try and click a little bit around. Dont forget to check the other examples too.</p><blockquote xmlns="http://www.w3.org/1999/xhtml"><p>Wow, thats amazing. Good work, boy! 👏 <br />— Mom</p></blockquote>`,
)
})
})