A rich text editor is a component that permits to edit text to make it rich. ie it allows the text to be styled via editing button.
This code is explained in the html_editor section. If you want to see the code, hover over the form and click on the Try this code button.
Ref: Example adapted from the Editing section of the spec
The most simple implementation are made via Javascript that manipulates directly the syntax tree of the HTML document called the DOM.
The content is made editable with the contentEditable attribute and the user edit that text.
In other words, the HTML DOM is edited. ie when the user bolds a word, a b html element is added.
The styling buttons are implemented with:
The basic_example is using the execCommand.
If you need to create text that is constrained in a fix format such as a page A4, you may want to use a canvas instead. 1). Google docs use it with their Kix editor 2)
If you want to create a editor for another language, there is two possible architectures that increase in complexity:
To translate you language to HTML, you can do it:
Example of parser:
The HTML dom may be and is generally virtual. Editors may use:
Some implements also there own such as:
The advantage of a virtual DOM is that the page does not need to be entirely refreshed. The virtual dom is making the diff and its update transparent.
Keep in mind that the DOM implementation chosen will limit the expressiveness of your language.
It's easy to add an inline feature such as bold but it's:
To smoothing the experience and to not render on every stroke, you should apply a debounce. It reduces overhead by not rendering for every keystroke. The rendering is triggered via a keystroke or a timer.
To avoid Xss attack, your input should be sanitized to delete every scriptable/callable text also on the server please as the client code is never reliable.
This sections regroups:
https://www.slatejs.org/ our favorite.
SlateJs provide:
https://github.com/WordPress/gutenberg
react-contenteditable - Example with:
Draft.js - Framework for building rich text editors in React such as:
(Used by purpose)
https://prosemirror.net/ uses its own sort of DOM with one important difference, is that it stops to be recursive in inline/paragraph node 3)
Prose Mirror Paragraph Dom | Xml Paragraph Dom |
---|---|
![]() | ![]() |
The explanation is that it :
Example:
https://github.com/neilj/Squire - Largely used. The HTML remains the source-of-truth (the DOM)
Medium Editor - Simple project, buggy in the extension that shows a medium like editor
https://github.com/jaredreich/pell
Text editor based on canvas.
https://github.com/capnmidnight/Primrose
https://ckeditor.com/ - JavaScript rich text editor (free + commercial)
The structure manipulated is the DOM. Meaning that creating component can be very difficult. (ie try to add a code block formatted by prism and you will understand)
https://github.com/microsoft/roosterjs
The editor may be specialized to modify code. See What are the code editor options available in HTML ?
WYSIWYG editors are good for content editing but inappropriate for creating HTML structures.