Security News
Weekly Downloads Now Available in npm Package Search Results
Socket's package search now displays weekly downloads for npm packages, helping developers quickly assess popularity and make more informed decisions.
draft-convert
Advanced tools
Extensibly serialize & deserialize Draft.js content with HTML
See draft-extend for more on how to use draft-convert with plugins
npm install draft-convert --save
or yarn add draft-convert
Jump to:
Extensibly serialize Draft.js ContentState
to HTML.
Basic usage:
const html = convertToHTML(editorState.getCurrentContent());
Advanced usage:
// convert to HTML with blue text, paragraphs, and links
const html = convertToHTML({
styleToHTML: (style) => {
if (style === 'BOLD') {
return <span style={{color: 'blue'}} />;
}
},
blockToHTML: (block) => {
if (block.type === 'PARAGRAPH') {
return <p />;
}
},
entityToHTML: (entity, originalText) => {
if (entity.type === 'LINK') {
return <a href={entity.data.url}>{originalText}</a>;
}
return originalText;
}
})(editorState.getCurrentContent());
// convert content state to HTML with functionality defined in the plugins applied
const html = compose(
FirstPlugin,
SecondPlugin,
ThirdPlugin
)(convertToHTML)(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:
type ContentStateConverter = (contentState: ContentState) => string
type Tag =
ReactElement |
{start: string, end: string, empty?: string} |
{element: ReactElement, empty?: ReactElement}
type RawEntity = {
type: string,
mutability: DraftEntityMutability,
data: Object
}
type RawBlock = {
type: string,
depth: number,
data?: object,
text: string
}
type convertToHTML = ContentStateConverter | ({
styleToHTML?: (style: string) => Tag,
blockToHTML?: (block: RawBlock) => Tag),
entityToHTML?: (entity: RawEntity, originalText: string) => Tag | string
}) => ContentStateConverter
Extensibly deserialize HTML to Draft.js ContentState
.
Basic usage:
const editorState = EditorState.createWithContent(convertFromHTML(html));
Advanced usage:
// convert HTML to ContentState with blue text, links, and at-mentions
const contentState = convertFromHTML({
htmlToStyle: (nodeName, node, currentStyle) => {
if (nodeName === 'span' && node.style.color === 'blue') {
return currentStyle.add('BLUE');
} else {
return currentStyle;
}
},
htmlToEntity: (nodeName, node) => {
if (nodeName === 'a') {
return Entity.create(
'LINK',
'MUTABLE',
{url: node.href}
)
}
},
textToEntity: (text) => {
const result = [];
text.replace(/\@(\w+)/g, (match, name, offset) => {
const entityKey = Entity.create(
'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: {}
};
}
}
})(html);
// convert HTML to ContentState with functionality defined in the plugins applied
const contentState = compose(
FirstPlugin,
SecondPlugin,
ThirdPlugin
)(convertFromHTML);
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:
type HTMLConverter = (html: string, {flat: ?boolean}, DOMBuilder: ?Function) => ContentState
type EntityKey = string
type convertFromHTML = HTMLConverter | ({
htmlToStyle: ?(nodeName: string, node: Node) => DraftInlineStyle,
htmlToBlock: ?(nodeName: string, node: Node) => ?(DraftBlockType | {type: DraftBlockType, data: object} | false),
htmlToEntity: ?(nodeName: string, node: string): ?EntityKey,
textToEntity: ?(text) => Array<{entity: EntityKey, offset: number, length: number, result: ?string}>
}) => HTMLConverter
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.
FAQs
Extensibly serialize & deserialize Draft.js ContentState
The npm package draft-convert receives a total of 64,915 weekly downloads. As such, draft-convert popularity was classified as popular.
We found that draft-convert demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 10 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Socket's package search now displays weekly downloads for npm packages, helping developers quickly assess popularity and make more informed decisions.
Security News
A Stanford study reveals 9.5% of engineers contribute almost nothing, costing tech $90B annually, with remote work fueling the rise of "ghost engineers."
Research
Security News
Socket’s threat research team has detected six malicious npm packages typosquatting popular libraries to insert SSH backdoors.