2023-10-20 22:50:39 +02:00
|
|
|
RSpec.describe TiptapService do
|
2024-01-18 12:38:46 +01:00
|
|
|
let(:json) do
|
|
|
|
{
|
|
|
|
type: 'doc',
|
|
|
|
content: [
|
|
|
|
{
|
|
|
|
type: 'header',
|
|
|
|
content: [
|
|
|
|
{
|
|
|
|
type: 'headerColumn',
|
|
|
|
content: [{ type: 'text', text: 'Left' }]
|
|
|
|
},
|
|
|
|
{
|
|
|
|
type: 'headerColumn',
|
|
|
|
content: [{ type: 'text', text: 'Right' }]
|
|
|
|
}
|
|
|
|
]
|
|
|
|
},
|
|
|
|
{
|
|
|
|
type: 'title',
|
|
|
|
content: [{ type: 'text', text: 'Title' }]
|
|
|
|
},
|
|
|
|
{
|
|
|
|
type: 'title' # remained empty in editor
|
|
|
|
},
|
|
|
|
{
|
|
|
|
type: 'heading',
|
|
|
|
attrs: { level: 2, textAlign: 'center' },
|
|
|
|
content: [{ type: 'text', text: 'Heading 2' }]
|
|
|
|
},
|
|
|
|
{
|
|
|
|
type: 'heading',
|
2024-02-02 13:49:22 +01:00
|
|
|
attrs: { level: 3, textAlign: 'center' },
|
2024-01-18 12:38:46 +01:00
|
|
|
content: [{ type: 'text', text: 'Heading 3' }]
|
|
|
|
},
|
|
|
|
{
|
|
|
|
type: 'heading',
|
|
|
|
attrs: { level: 3 } # remained empty in editor
|
|
|
|
},
|
|
|
|
{
|
|
|
|
type: 'paragraph',
|
|
|
|
attrs: { textAlign: 'right' },
|
|
|
|
content: [{ type: 'text', text: 'First paragraph' }]
|
|
|
|
},
|
|
|
|
{
|
|
|
|
type: 'paragraph',
|
|
|
|
content: [
|
|
|
|
{
|
|
|
|
type: 'text',
|
|
|
|
text: 'Bonjour ',
|
|
|
|
marks: [{ type: 'italic' }, { type: 'strike' }]
|
|
|
|
},
|
|
|
|
{
|
|
|
|
type: 'mention',
|
2024-02-01 18:55:41 +01:00
|
|
|
attrs: { id: 'name', label: 'Nom' },
|
2024-01-18 12:38:46 +01:00
|
|
|
marks: [{ type: 'bold' }, { type: 'underline' }]
|
|
|
|
},
|
|
|
|
{
|
|
|
|
type: 'text',
|
|
|
|
text: ' '
|
|
|
|
},
|
|
|
|
{
|
|
|
|
type: 'text',
|
|
|
|
text: '!',
|
|
|
|
marks: [{ type: 'highlight' }]
|
|
|
|
}
|
|
|
|
]
|
|
|
|
},
|
|
|
|
{
|
|
|
|
type: 'paragraph'
|
|
|
|
# no content, empty line
|
|
|
|
},
|
|
|
|
{
|
|
|
|
type: 'bulletList',
|
|
|
|
content: [
|
|
|
|
{
|
|
|
|
type: 'listItem',
|
|
|
|
content: [
|
|
|
|
{
|
|
|
|
type: 'paragraph',
|
|
|
|
content: [
|
|
|
|
{
|
|
|
|
type: 'text',
|
|
|
|
text: 'Item 1'
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}
|
|
|
|
]
|
|
|
|
},
|
|
|
|
{
|
|
|
|
type: 'listItem',
|
|
|
|
content: [
|
|
|
|
{
|
|
|
|
type: 'paragraph',
|
|
|
|
content: [
|
|
|
|
{
|
|
|
|
type: 'text',
|
|
|
|
text: 'Item 2'
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}
|
|
|
|
]
|
|
|
|
},
|
|
|
|
{
|
|
|
|
type: 'orderedList',
|
|
|
|
content: [
|
|
|
|
{
|
|
|
|
type: 'listItem',
|
|
|
|
content: [
|
|
|
|
{
|
|
|
|
type: 'paragraph',
|
|
|
|
content: [
|
|
|
|
{
|
|
|
|
type: 'text',
|
|
|
|
text: 'Item 1'
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}
|
|
|
|
]
|
|
|
|
},
|
|
|
|
{
|
|
|
|
type: 'listItem',
|
|
|
|
content: [
|
|
|
|
{
|
|
|
|
type: 'paragraph',
|
|
|
|
content: [
|
|
|
|
{
|
|
|
|
type: 'text',
|
|
|
|
text: 'Item 2'
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}
|
|
|
|
]
|
|
|
|
},
|
|
|
|
{
|
|
|
|
type: 'footer',
|
|
|
|
content: [{ type: 'text', text: 'Footer' }]
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
2023-10-20 22:50:39 +02:00
|
|
|
describe '.to_html' do
|
2024-01-18 12:38:46 +01:00
|
|
|
let(:substitutions) { { 'name' => 'Paul' } }
|
2023-10-20 22:50:39 +02:00
|
|
|
let(:html) do
|
|
|
|
[
|
2023-12-20 22:10:51 +01:00
|
|
|
'<header><div>Left</div><div>Right</div></header>',
|
2023-11-21 16:49:50 +01:00
|
|
|
'<h1>Title</h1>',
|
2024-02-02 13:49:22 +01:00
|
|
|
'<h2 class="body-start" style="text-align: center">Heading 2</h2>',
|
|
|
|
'<h3 style="text-align: center">Heading 3</h3>',
|
|
|
|
'<p style="text-align: right">First paragraph</p>',
|
2023-12-20 22:10:51 +01:00
|
|
|
'<p><s><em>Bonjour </em></s><u><strong>Paul</strong></u> <mark>!</mark></p>',
|
2023-10-20 22:50:39 +02:00
|
|
|
'<ul><li><p>Item 1</p></li><li><p>Item 2</p></li></ul>',
|
2023-11-21 16:49:50 +01:00
|
|
|
'<ol><li><p>Item 1</p></li><li><p>Item 2</p></li></ol>',
|
|
|
|
'<footer>Footer</footer>'
|
2023-10-20 22:50:39 +02:00
|
|
|
].join
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'returns html' do
|
2024-01-18 12:38:46 +01:00
|
|
|
expect(described_class.new.to_html(json, substitutions)).to eq(html)
|
|
|
|
end
|
2024-02-02 13:49:22 +01:00
|
|
|
|
|
|
|
context 'body start on paragraph' do
|
|
|
|
let(:json) do
|
|
|
|
{
|
|
|
|
type: 'doc',
|
|
|
|
content: [
|
|
|
|
{
|
|
|
|
type: 'title',
|
|
|
|
content: [{ type: 'text', text: 'The Title' }]
|
|
|
|
},
|
|
|
|
{
|
|
|
|
type: 'paragraph',
|
|
|
|
content: [{ type: 'text', text: 'First paragraph' }]
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'defines stat body on first paragraph' do
|
|
|
|
expect(described_class.new.to_html(json, substitutions)).to eq("<h1>The Title</h1><p class=\"body-start\">First paragraph</p>")
|
|
|
|
end
|
|
|
|
end
|
2024-01-18 12:38:46 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
describe '#used_tags' do
|
|
|
|
it 'returns used tags' do
|
2024-02-01 18:55:41 +01:00
|
|
|
expect(described_class.new.used_tags_and_libelle_for(json)).to eq(Set.new([['name', 'Nom']]))
|
2023-10-20 22:50:39 +02:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|