# DraftjsHtml [![Gem Version](https://badge.fury.io/rb/draftjs_html.svg)](https://badge.fury.io/rb/draftjs_html) [![Build Status](https://app.travis-ci.com/dugancathal/draftjs_html.svg?branch=main)](https://app.travis-ci.com/dugancathal/draftjs_html) This gem provides conversion utilities between "raw" [DraftJS] JSON and HTML. My team and I have found a need on many occasions to manipulate and convert DraftJS on our Ruby backend - this library is the result. [DraftJS]: https://draftjs.org/ ## Installation Add this line to your application's Gemfile: ```ruby gem 'draftjs_html' ``` And then execute: $ bundle install Or install it yourself as: $ gem install draftjs_html ## Usage This gem aims to provide a very high-level API for conversion. The most basic usage is: ```ruby raw_draftjs = { 'blocks' => [{ 'text' => 'Hello world!' }], 'entityMap' => {} } DraftjsHtml.to_html(raw_draftjs) # =>
Hello world!
``` Things can get more complicated as you have custom entities and/or inline styles. If this is the case, you can supply various configuration options to the top-level conversion method(s) for describing how to translate your content. One example might look like: ```ruby raw_draftjs = { 'blocks' => [ { 'text' => 'Hello @Arya!', 'entityRanges' => [{ 'key' => 'abc', 'offset' => 6, 'length' => 5 }], } ], 'entityMap' => { 'abc' => { 'mutability' => 'IMMUTABLE', 'type' => 'mention', 'data' => { 'user_id' => 123 }, }, }, } DraftjsHtml.to_html(raw_draftjs, options: { entity_style_mappings: { abc: ->(entity, content) { %Q{#{content}} }, }, }) # =>Hello @Arya
``` Almost all of the options support Procs (or otherwise `.call`-ables) to provide flexibility in the conversion process. As the library uses Nokogiri to generate HTML, it's also possible to return `Nokogiri::Node` objects or String objects. ### ToHtml Options #### `:encoding` Specify the HTML generation encoding. Defaults to `UTF-8`. #### `:entity_style_mappings` Allows the author to specify special mapping functions for entities. By default, we render `LINK` and `IMAGE` entities using the standard `` and `` tags, respectively. The author may supply a Proc object that returns any object Nokogiri can consume for adding to HTML. This includes `String`, `Nokogiri::Document::Fragment`, and `Nokogiri::Document` objects. #### `:block_type_mapping` You may wish to override the default HTML tags used for DraftJS block types. By default, we convert block types to tags as defined by `DraftjsHtml::ToHtml::BLOCK_TYPE_TO_HTML`. These may be overridden and appended to, like so: ```ruby DraftjsHtml.to_html(raw_draftjs, options: { block_type_mapping: { 'unstyled' => 'span', }, }) # This would generate tags instead of tags for "unstyled" DraftJS blocks.
```
#### `:inline_style_mapping`
You may wish to override the default HTML tags used to render DraftJS `inlineStyleRanges`.
This works very similarly to `:block_type_mapping`, and the tags are defined by `DraftjsHtml::ToHtml::STYLE_MAP`.
These may be overridden and appended to, like so:
```ruby
DraftjsHtml.to_html(raw_draftjs, options: {
inline_style_mapping: {
'BOLD' => 'strong',
},
})
# This would generate tags instead of tags around ranges of `BOLD` inline styles.
```
#### `:inline_style_renderer`
If the direct mapping from `:inline_style_mapping` isn't enough, you can supply a custom function for rendering a style range.
This function, when provided, will be called with all applicable styles for a range, and the relevant content/text for that range.
It bears stressing that this `#call`-able will be called with *all* defined styles for the content/character range.
This means that by declaring this function, you take responsibility for handling _all_ styles for that range.
However, if you "return" `nil` (or `false-y`) from the proc, it will fallback to the standard "mapping" fucntionality.
```ruby
DraftjsHtml.to_html(raw_draftjs, options: {
inline_style_renderer: ->(style_names, content) {
next if style_names != ['CUSTOM']
"#{content}
"
},
})
# This would use the default inline style rendering UNLESS the *only* applied style for this range was "CUSTOM"
```
## Development
After checking out the repo, run `bin/setup` to install dependencies. Then, run
`rake spec` to run the tests. You can also run `bin/console` for an interactive
prompt that will allow you to experiment.
To install this gem onto your local machine, run `bundle exec rake install`. To
release a new version, update the version number in `version.rb`, and then run
`bundle exec rake release`, which will create a git tag for the version, push
git commits and the created tag, and push the `.gem` file to
[rubygems.org](https://rubygems.org).
## Contributing
Bug reports and pull requests are welcome on GitHub at
https://github.com/dugancathal/draftjs_html. This project is intended to be a
safe, welcoming space for collaboration, and contributors are expected to adhere
to the [code of
conduct](https://github.com/dugancathal/draftjs_html/blob/main/CODE_OF_CONDUCT.md).
## License
The gem is available as open source under the terms of the [MIT
License](https://opensource.org/licenses/MIT).
## Code of Conduct
Everyone interacting in the DraftjsHtml project's codebases, issue trackers,
chat rooms and mailing lists is expected to follow the [code of
conduct](https://github.com/dugancathal/draftjs_html/blob/main/CODE_OF_CONDUCT.md).