Quill Delta from HTML
This is a package that converts HTML input into Quill Delta format, which is used in the Quill Js package.
This package supports the conversion of a wide range of HTML tags and attributes into their corresponding Delta operations, ensuring that your HTML content is accurately represented in the Quill editor.
Supported tags
<b>, <strong>: Bold text
<i>, <em>: Italic text
<u>, <ins>: Underlined text
<s>, <del>: Strikethrough text
<sup>: Superscript text
<sub>: Subscript text
<h1> to <h6>: Headings of various levels
<ul>: Unordered lists
<ol>: Ordered lists
<li>: List items
<li data-checked="true">: Check lists
<input type="checkbox">: Another alternative to make a check lists
<a>: Hyperlinks with support for the href attribute
<img>: Images with support for the src, align, and styles
<div>: HTML tag containers
<video>: Videos with support for the src
<blockquote>: Block quotations
<pre>, <code>: Code blocks
<p style="text-align:left|center|right|justify">: Paragraph style alignment
<p align="left|center|right|justify">: Paragraph alignment
<p dir="rtl">: Paragraph direction
<p style="padding: 10px;font-size: 12px;font-family: Times New Roman;color:#ffffff">: Inline attributes
<pullquote data-author="john">: Custom html
Quick Example
import { HtmlToDelta } from 'quill-delta-from-html';
const htmlContent: string = '<p>Hello, <b>world</b>!</p>';
const delta = new HtmlToDelta(<your_custom_blocks>, <YourHtmlToOperationsImpl>, <your_black_nodes_list>).convert(htmlContent);
Creating your own CustomHtmlPart
What is a CustomHtmlPart?
CustomHtmlPart
is a special class that let us convert custom HTML
elements in Operation to Quill Delta
.
First you need to define your own CustomHtmlPart
import { CustomHtmlPart } from 'quill-delta-from-html';
import { HTMLElement } from 'node-html-parser';
import Delta, { AttributeMap, Op } from 'quill-delta';
class PullquoteBlock extends CustomHtmlPart {
matches(element: HTMLElement): boolean {
return element.rawTagName === 'pullquote';
}
convert(element: HTMLElement, currentAttributes: AttributeMap): Op[] {
const delta: Delta = new Delta();
const attributes = { ...currentAttributes };
const author = element.attribs['data-author'];
const style = element.attribs['data-style'];
if (author) {
delta.insert(
`Pullquote: "${element.children[0].data}" by ${author}`,
attributes,
);
} else {
delta.insert(`Pullquote: "${element.children[0].data}"`, attributes);
}
if (style && style.toLowerCase() === 'italic') {
attributes['italic'] = true;
}
return delta;
}
}
After, put your PullquoteBlock
to HtmlToDelta
using the param customBlocks
import { HtmlToDelta } from 'quill-delta-from-html';
const htmlText: string = `
<html>
<body>
<p>Regular paragraph before the custom block</p>
<pullquote data-author="John Doe" data-style="italic">This is a custom pullquote</pullquote>
<p>Regular paragraph after the custom block</p>
</body>
</html>
`;
const customBlocks = [new PullquoteBlock()];
const converter = new HtmlToDelta(customBlocks);
const delta = converter.convert(htmlText);
HtmlOperations
The HtmlOperations
class is designed to streamline the conversion process from HTML
to Delta
operations, accommodating a wide range of HTML
structures and attributes commonly used in web content.
To utilize HtmlOperations
, extend this class and implement the methods necessary to handle specific HTML
elements. Each method corresponds to a different HTML
tag or element type and converts it into Delta operations suitable for use with Quill JS
.
abstract class HtmlOperations {
protected customBlocks?: CustomHtmlPart[];
resolveCurrentElement(
element: dom.Element,
indentLevel?: number,
): Operation[];
abstract brToOp(element: dom.Element): Operation[];
abstract headerToOp(element: dom.Element): Operation[];
abstract listToOp(element: dom.Element, indentLevel?: number): Operation[];
abstract paragraphToOp(element: dom.Element): Operation[];
abstract linkToOp(element: dom.Element): Operation[];
abstract spanToOp(element: dom.Element): Operation[];
abstract imgToOp(element: dom.Element): Operation[];
abstract videoToOp(element: dom.Element): Operation[];
abstract codeblockToOp(element: dom.Element): Operation[];
abstract blockquoteToOp(element: dom.Element): Operation[];
}
Passing a custom HtmlOperations
implementation
import { HtmlToDelta } from 'quill-delta-from-html';
const converter = new HtmlToDelta(...your_custom_blocks, <YourHtmlToOperationsImpl>);
Contributions
If you find a bug or want to add a new feature, please open an issue or submit a pull request on the GitHub repository.
This project is licensed under the MIT License - see the LICENSE file for details.