HubSpot/draft-convert

Name: draft-convert

Owner: HubSpot

Description: Extensibly serialize & deserialize Draft.js ContentState with HTML.

Created: 2016-07-10 04:08:10.0

Updated: 2018-05-17 13:31:18.0

Pushed: 2018-05-11 09:02:29.0

Homepage: null

Size: 256

Language: JavaScript

GitHub Committers

UserMost Recent Commit# Commits

Other Committers

UserEmailMost Recent Commit# Commits

README

draft-convert

npm version License

Extensibly serialize & deserialize Draft.js content with HTML

See draft-extend for more on how to use draft-convert with plugins

Installation

npm install draft-convert --save or yarn add draft-convert

Jump to:

convertToHTML

Extensibly serialize Draft.js ContentState to HTML.

Basic usage:

t html = convertToHTML(editorState.getCurrentContent());

Advanced usage:

onvert to HTML with blue text, paragraphs, and links
t html = convertToHTML({
yleToHTML: (style) => {
if (style === 'BOLD') {
  return <span style={{color: 'blue'}} />;
}

ockToHTML: (block) => {
if (block.type === 'PARAGRAPH') {
  return <p />;
}

tityToHTML: (entity, originalText) => {
if (entity.type === 'LINK') {
  return <a href={entity.data.url}>{originalText}</a>;
}
return originalText;

ditorState.getCurrentContent());

onvert content state to HTML with functionality defined in the plugins applied
t html = compose(
FirstPlugin,
SecondPlugin,
ThirdPlugin
nvertToHTML)(editorState.getCurrentContent());

styleToHTML, blockToHtml, and entityToHTML are functions that take Draft content data and may return a ReactElement or an object of shape {start, end} defining strings for the beginning and end tags of the style, block, or entity. entityToHTML may return either a string with or without HTML if the use case demands it. blockToHTML also may return an optional empty property to handle alternative behavior for empty blocks. To use this along with a ReactElement return value an object of shape {element: ReactElement, empty: ReactElement} may be returned. If no additional functionality is necessary convertToHTML can be invoked with just a ContentState to serialize using just the default Draft functionality. convertToHTML can be passed as an argument to a plugin to modularly augment its functionality.

Legacy alternative conversion options styleToHTML and blockToHTML options may be plain objects keyed by style or block type with values of ReactElement s or {start, end} objects. These objects will eventually be removed in favor of the functions described above.

Type info:

 ContentStateConverter = (contentState: ContentState) => string

 Tag =
actElement |
tart: string, end: string, empty?: string} |
lement: ReactElement, empty?: ReactElement}

 RawEntity = {
type: string,
mutability: DraftEntityMutability,
data: Object


 RawBlock = {
type: string,
depth: number,
data?: object,
text: string


 convertToHTML = ContentStateConverter | ({
styleToHTML?: (style: string) => Tag,
blockToHTML?: (block: RawBlock) => Tag),
entityToHTML?: (entity: RawEntity, originalText: string) => Tag | string
> ContentStateConverter
convertFromHTML

Extensibly deserialize HTML to Draft.js ContentState.

Basic usage:

t editorState = EditorState.createWithContent(convertFromHTML(html));

Advanced usage:

onvert HTML to ContentState with blue text, links, and at-mentions
t contentState = convertFromHTML({
htmlToStyle: (nodeName, node, currentStyle) => {
    if (nodeName === 'span' && node.style.color === 'blue') {
        return currentStyle.add('BLUE');
    } else {
        return currentStyle;
    }
},
htmlToEntity: (nodeName, node, createEntity) => {
    if (nodeName === 'a') {
        return createEntity(
            'LINK',
            'MUTABLE',
            {url: node.href}
        )
    }
},
textToEntity: (text, createEntity) => {
    const result = [];
    text.replace(/\@(\w+)/g, (match, name, offset) => {
        const entityKey = createEntity(
            'AT-MENTION',
            'IMMUTABLE',
            {name}
        );
        result.push({
            entity: entityKey,
            offset,
            length: match.length,
            result: match
        });
    });
    return result;
},
htmlToBlock: (nodeName, node) => {
    if (nodeName === 'blockquote') {
        return {
            type: 'blockquote',
            data: {}
        };
    }
}
tml);

onvert HTML to ContentState with functionality defined in the plugins applied
t contentState = compose(
FirstPlugin,
SecondPlugin,
ThirdPlugin
nvertFromHTML);

If no additional functionality is necessary convertToHTML can be invoked with just an HTML string to deserialize using just the default Draft functionality. Any convertFromHTML can be passed as an argument to a plugin to modularly augment its functionality. A flat option may be provided to force nested block elements to split into flat, separate blocks. For example, the HTML input <p>line one<br />linetwo</p> will produce two unstyled blocks in flat mode.

Type info:

 HTMLConverter = (html: string, {flat: ?boolean}, DOMBuilder: ?Function, generateKey: ?Function) => ContentState

 EntityKey = string

 convertFromHTML = HTMLConverter | ({
htmlToStyle: ?(nodeName: string, node: Node) => DraftInlineStyle,
htmlToBlock: ?(nodeName: string, node: Node) => ?(DraftBlockType | {type: DraftBlockType, data: object} | false),
htmlToEntity: ?(
    nodeName: string,
    node: Node,
    createEntity: (type: string, mutability: string, data: object) => EntityKey,
    getEntity: (key: EntityKey) => Entity,
    mergeEntityData: (key: string, data: object) => void,
    replaceEntityData: (key: string, data: object) => void
): ?EntityKey,
textToEntity: ?(
    text: string,
    createEntity: (type: string, mutability: string, data: object) => EntityKey,
    getEntity: (key: EntityKey) => Entity,
    mergeEntityData: (key: string, data: object) => void,
    replaceEntityData: (key: string, data: object) => void
) => Array<{entity: EntityKey, offset: number, length: number, result: ?string}>
> HTMLConverter
Middleware functions

Any conversion option for convertToHTML or convertFromHTML may also accept a middleware function of shape (next) => (?args) => result , where ?args are the normal configuration function paramaters and result is the expected return type for that function. These functions can transform results of the default conversion included in convertToHTML or convertFromHTML by leveraging the result of next(...args). These middleware functions are most useful when passed as the result of composition of draft-extend plugins. If you choose to use them independently, a __isMiddleware property must be set to true on the function for draft-convert to properly handle it.


This work is supported by the National Institutes of Health's National Center for Advancing Translational Sciences, Grant Number U24TR002306. This work is solely the responsibility of the creators and does not necessarily represent the official views of the National Institutes of Health.