tiptap/tests/cypress/integration/html/generateHTML.spec.ts
Nick Perez bf040b9044
Some checks are pending
build / build (20) (push) Waiting to run
build / test (20, map[name:Demos/Commands spec:./demos/src/Commands/**/*.spec.{js,ts}]) (push) Blocked by required conditions
build / test (20, map[name:Demos/Examples spec:./demos/src/Examples/**/*.spec.{js,ts}]) (push) Blocked by required conditions
build / test (20, map[name:Demos/Experiments spec:./demos/src/Experiments/**/*.spec.{js,ts}]) (push) Blocked by required conditions
build / test (20, map[name:Demos/Extensions spec:./demos/src/Extensions/**/*.spec.{js,ts}]) (push) Blocked by required conditions
build / test (20, map[name:Demos/GuideContent spec:./demos/src/GuideContent/**/*.spec.{js,ts}]) (push) Blocked by required conditions
build / test (20, map[name:Demos/GuideGettingStarted spec:./demos/src/GuideGettingStarted/**/*.spec.{js,ts}]) (push) Blocked by required conditions
build / test (20, map[name:Demos/Marks spec:./demos/src/Marks/**/*.spec.{js,ts}]) (push) Blocked by required conditions
build / test (20, map[name:Demos/Nodes spec:./demos/src/Nodes/**/*.spec.{js,ts}]) (push) Blocked by required conditions
build / test (20, map[name:Integration spec:./tests/cypress/integration/**/*.spec.{js,ts}]) (push) Blocked by required conditions
build / release (20) (push) Blocked by required conditions
Publish / Release (20) (push) Waiting to run
feat(html): switch from zeed-dom to happy-dom-without-node (#5984)
2025-01-08 09:45:39 +01:00

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="" src="https://www.youtube.com/embed/cqHqLQgVCgY" 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>`,
)
})
})