Draft.js is a framework for
building rich text editors. However, it does not support exporting
documents at HTML. This gem is designed to take the raw ContentState
(output of convertToRaw)
from Draft.js and convert it to HTML using Ruby.
# Create configuration for entities and styles
config = {
entity_decorators: {
'LINK' => DraftjsExporter::Entities::Link.new(className: 'link')
},
block_map: {
'header-one' => { element: 'h1', attrs: { id: 'foo-bar' }},
'unordered-list-item' => {
element: 'li',
wrapper: {
element: 'ul',
attrs: { class: 'public-DraftStyleDefault-ul' }
}
},
'unstyled' => { element: 'div' }
},
style_map: {
'ITALIC' => { fontStyle: 'italic' }
},
style_block_map: {
'ITALIC' => 'i',
'BOLD' => 'b'
}
}
# New up the exporter
exporter = DraftjsExporter::HTML.new(config)
# Provide raw content state
exporter.call({
entityMap: {
'0' => {
type: 'LINK',
mutability: 'MUTABLE',
data: {
url: 'http://example.com'
}
}
},
blocks: [
{
key: '5s7g9',
text: 'Header',
type: 'header-one',
depth: 0,
inlineStyleRanges: [],
entityRanges: []
},
{
key: 'dem5p',
text: 'some paragraph text',
type: 'unstyled',
depth: 0,
inlineStyleRanges: [
{
offset: 0,
length: 4,
style: 'ITALIC'
},
{
offset: 0,
length: 4,
style: 'BOLD'
}
],
entityRanges: [
{
offset: 5,
length: 9,
key: 0
}
]
},
{
key: '7dhap',
text: 'hello world',
type: 'atomic',
depth: 0,
inlineStyleRanges: [],
entityRanges: [],
data: {
type: 'task',
checked: true,
title: 'hello'
}
},
{
key: '6usk2',
text: 'foo bar foo',
type: 'atomic',
depth: 0,
inlineStyleRanges: [],
entityRanges: [],
data: {
type: 'checklist'
}
}
]
})
# => "<h1 id='foo-bar'>Header</h1><div>\n<i><b><span style=\"font-style: italic;\">some</span></b></i> <a href=\"http://example.com\" class=\"link\">paragraph</a> text</div><span>hello world</span><div>foo bar foo</div>"$ rspec