A powerful WYSIWYG rich text web editor by pure javascript

Overview

KothingEditor

A powerful WYSIWYG rich text web editor by pure javascript

Demo : kothing.github.io/editor

The KothingEditor is a lightweight, flexible, customizable WYSIWYG text editor for your web applications.

  • Pasting from Microsoft Word and Excel.
  • Custom table selection, merge and split.
  • Media embeds, image uploads.
  • Can use CodeMirror.
  • And.. many other features :)

Table of contents

Browser Support

Chrome Firefox Opera Safari Edge Internet Explorer
Yes Yes Yes Yes Yes 11+

Install

npm

$ npm install --save kothing-editor

CDN

<link href="./kothing-editor.min.css" rel="stylesheet" />
<script src="./kothing-editor.min.js"></script>

Getting Started

1. Include

<link href="./css/kothing-editor.min.css" rel="stylesheet" />
<script src="./kothing-editor.min.js"></script>

2. Target Element

<textarea id="my-editor">Hi</textarea>

3. Create

/**
 * ID : 'my-editor'
 * ClassName : 'kothing-eidtor'
 */
// ID or DOM object
KothingEditor.create(document.getElementById('my-editor'), {
  // All of the plugins are loaded in the "window.KothingEditor" object in kothing-editor.min.js file
  // Insert options
  width: '100%',
});

4. Contents display

When you display a document created by KothingEditor
You need to include "kothing-editor/css/kothing-editor.min.css" file.

Use import statement

1. Load only what you want

import 'kothing-editor/css/kothing-editor.min.css';
import KothingEditor from 'kothing-editor';
import { font, fontSize, fontColor, horizontalRule, list, image } from 'kothing-editor/lib/plugins';
import lang from 'kothing-editor/lib/lang';

KothingEditor.create('my-editor', {
  plugins: [font, fontSize, fontColor, horizontalRule, link, image],
  toolbarItem: [['font', 'fontSize'], ['fontColor'], ['horizontalRule'], ['link', 'image']],
  lang: lang.zh_cn,
});

2. Load all plugins

import KothingEditor from 'kothing-editor';
import lang from 'kothing-editor/lib/lang';
import plugins from 'kothing-editor/lib/plugins';
import 'kothing-editor/css/kothing-editor.min.css';
import katex from 'katex';
import 'katex/dist/katex.min.css'

KothingEditor.create('document', {
    width: '100%',
    height: 'auto',
    lang: lang.en,
    plugins: plugins,
    katex: katex,
    toolbarItem: [
      ['undo', 'redo'],
      ['font', 'fontSize', 'formatBlock'],
      ['bold', 'underline', 'italic', 'strike', 'subscript', 'superscript', 'fontColor', 'hiliteColor'],
      ['outdent', 'indent', 'align', 'list', 'horizontalRule'],
      ['link', 'table', 'image', 'audio', 'video'],
      '/', // Line break
      ['lineHeight', 'paragraphStyle', 'textStyle'],
      ['showBlocks', 'codeView'],
      ['math'],
      ['preview', 'print', 'fullScreen'],
      ['save', 'template'],
      ['removeFormat']
    ],
    templates: [
      {
        name: 'Template-1',
        html: '<p>HTML source1</p>'
      },
      {
        name: 'Template-2',
        html: '<p>HTML source2</p>'
      },
    ],
    charCounter: true,
})

// You can also load what you want
KothingEditor.create('my-editor', {
    plugins: [
        plugins.font
        plugins.fontSize
    ],
    toolbarItem: [
        ['font', 'fontSize'],
        // Plugins can be used directly in the toolbar item
        [plugins.formatBlock]
    ]
})

3. Plugins can be used directly in the toolbar item

import 'kothing-editor/css/kothing-editor.min.css';
import KothingEditor from 'kothing-editor';
import {
  align,
  font,
  fontSize,
  fontColor,
  hiliteColor,
  horizontalRule,
  list,
  table,
  template,
  formatBlock,
  link,
  image,
  video,
} from 'kothing-editor/lib/plugins';

KothingEditor.create('my-editor', {
  toolbarItem: [
    ['undo', 'redo'],
    [font, fontSize, formatBlock],
    ['bold', 'underline', 'italic', 'strike', 'subscript', 'superscript'],
    ['removeFormat'],
    [fontColor, hiliteColor],
    ['outdent', 'indent'],
    [align, horizontalRule, list, table],
    [link, image, video],
    ['fullScreen', 'showBlocks', 'codeView'],
    ['preview', 'print'],
    ['save', template],
  ],
});

Init function

The init function can be used by predefining options and calling the create function on the returned object.
The value of the option argument put in the "create" function call takes precedence
import 'kothing-editor/css/kothing-editor.min.css';
import KothingEditor from 'kothing-editor';
import plugins from 'kothing-editor/lib/plugins';

// all plugins
const initEditor = KothingEditor.init({
  plugins: plugins,
  height: 200,
  toolbarItem: [
    [
      'undo',
      'redo',
      'font',
      'fontSize',
      'formatBlock',
      'bold',
      'underline',
      'italic',
      'strike',
      'subscript',
      'superscript',
      'removeFormat',
      'fontColor',
      'hiliteColor',
      'outdent',
      'indent',
      'align',
      'horizontalRule',
      'list',
      'table',
      'link',
      'image',
      'video',
      'fullScreen',
      'showBlocks',
      'codeView',
      'preview',
      'print',
      'save',
      'template',
    ],
  ],
});

initEditor.create('my-editor_1', {
  // The value of the option argument put in the "create" function call takes precedence
});

initEditor.create('my-editor_2', {
  // The value of the option argument put in the "create" function call takes precedence
  height: 'auto',
  toolbarItem: [['bold', 'underline', 'italic'], ['removeFormat'], ['preview', 'print']],
});

Use CodeMirror

<!-- codeMirror -->
<!-- Use version 5.0.0 or later. -->
<link
  rel="stylesheet"
  href="https://cdn.jsdelivr.net/npm/[email protected]/lib/codemirror.min.css"
/>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/lib/codemirror.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/mode/htmlmixed/htmlmixed.js"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/mode/xml/xml.js"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/mode/css/css.js"></script>
import 'kothing-editor/css/kothing-editor.min.css';
import KothingEditor from 'kothing-editor';
// Import codeMirror
import CodeMirror from 'codemirror';
import 'codemirror/mode/htmlmixed/htmlmixed';
import 'codemirror/lib/codemirror.css';

KothingEditor.create('my-editor', {
  codeMirror: CodeMirror,
  // Set options
  // codeMirror: {
  //     src: CodeMirror,
  //     options: {...}
  // }
  toolbarItem: [['codeView']],
  height: 400,
});

Use KaTeX (math plugin)

<!-- https://github.com/KaTeX/KaTeX -->
<!-- KaTeX (^0.11.1) -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/katex.min.css">
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/katex.min.js"></script>
import 'kothing-editor/dist/css/kothing-editor.min.css'
import KothingEditor from 'kothing-editor'
// Import katex
import katex from 'katex'
import 'katex/dist/katex.min.css'

KothingEditor.create('sample', {
    katex: katex // window.katex,
    // Set options
    // katex: {
    //     src: katex,
    //     options: {...}
    // }
    toolbarItem: [
        ['math']
    ]
});

Options

plugins: [
    font,
    fontSize,
    formatBlock,
    fontColor,
    hiliteColor,
    align,
    horizontalRule,
    list,
    table,
    template,
    link,
    image,
    video
]               : Plugins array.     default: null {Array}

// Layout-------------------------------------------------------------------------------------------------------
lang            : language object.   default : en {Object}
mode            : The mode of the editor ('classic', 'inline', 'balloon'). default: 'classic' {String}
toolbarWidth    : The width of the toolbar. Applies only when the editor mode is
                  'inline' or 'balloon' mode. default: 'auto' {Number|String}
stickyToolbar   : Reference height value that should be changed to sticky toolbar mode.
                  It can also be used when there is another fixed toolbar at the top.
                  Set to 0, '0px', '50px', etc.
                  If set to -1 or false or null to turn off.        default: 0 {Number|String|Boolean}
iframe          : Content will be placed in an iframe and isolated from the rest of the page.  default: false {Boolean}
fullPage        : Allows the usage of HTML, HEAD, BODY tags and DOCTYPE declaration.  default: false {Boolean}
iframeCSSFileName : Name of the CSS file to apply inside the iframe.
                    Applied by searching by filename in the link tag of document.  default: 'KothingEditor' {String}
codeMirror      : If you put the CodeMirror object as an option, you can do Codeview using CodeMirror. default: null {Object}
                  Use version 5.0.0 or later.
                  ex) codeMirror: CodeMirror // Default option
                      codeMirror: { // Custom option
                        src: CodeMirror,
                        options: {
                            /** default options **
                            * mode: 'htmlmixed',
                            * htmlMode: true,
                            * lineNumbers: true
                            */
                        }
                      }


// Display-------------------------------------------------------------------------------------------------------
position        : The position property of KothingEditor.               default: null {String}
display         : The display property of KothingEditor.                default: 'block' {String}
popupDisplay    : Size of background area when activating dialog window ('full'||'local') default: 'full' {String}

// Bottom resizing bar-------------------------------------------------------------------------------------------
resizingBar     : Show the bottom resizing bar.
                  If 'height' value is 'auto', it will not be resized. default: true {Boolean}
showPathLabel   : Displays the current node structure to resizingBar.  default: true {Boolean}
charCounter     : Shows the number of characters in the editor.
                  If the maxCharCount option has a value, it becomes true. default: false {Boolean}
maxCharCount    : The maximum number of characters allowed to be inserted into the editor. default: null {Number}

// Width size----------------------------------------------------------------------------------------------------
width           : The width size of the editor.                     default: clientWidth||'100%' {Number|String}
minWidth        : The min-width size of the editor.
                  Used when 'width' value is 'auto' or '~%'.        default: null {Number|String}
maxWidth        : The max-width size of the editor.
                  Used when 'width' value is 'auto' or '~%'.        default: null {Number|String}

// Height size---------------------------------------------------------------------------------------------------
height          : The height size of the editor.                    default: clientHeight||'auto' {Number|String}
minHeight       : The min-height size of the editor.
                  Used when 'height' value is 'auto'.               default: null {Number|String}
maxHeight       : The max-height size of the editor.
                  Used when 'height' value is 'auto'.               default: null {Number|String}

// Defining menu items-------------------------------------------------------------------------------------------
font            : Change default font-family array.                 default: [...] {Array}
                  Default value: [
                    'Arial', 'Comic Sans MS', 'Courier New', 'Impact',
                    'Georgia','tahoma', 'Trebuchet MS', 'Verdana'
                  ]
fontSize        : Change default font-size array.                   default: [...] {Array}
                  Default value: [
                    8, 9, 10, 11, 12, 14, 16, 18, 20, 22, 24, 26, 28, 36, 48, 72
                  ]
formats         : Change default formatBlock array.                 default: [...] {Array}
                  Default value: [
                      'p', 'div', 'blockquote', 'pre', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'
                  ],
                  Custom: [{
                      tag: 'div', // Tag name
                      class: '__ke__xxx' || null, // Class names must always begin with "__ke__"
                      title: 'Custom div' || null, // default: tag name
                      command: 'replace' || 'range' // default: "replace"
                  }]
colorList       : Change default color array of color picker.       default: [..[..]..] {Array}
                  Default value: [
                    '#ff0000', '#ff5e00', '#ffe400', '#abf200', '#00d8ff', '#0055ff', '#6600ff', '#ff00dd', '#000000',
                    '#ffd8d8', '#fae0d4', '#faf4c0', '#e4f7ba', '#d4f4fa', '#d9e5ff', '#e8d9ff', '#ffd9fa', '#f1f1f1',
                    '#ffa7a7', '#ffc19e', '#faed7d', '#cef279', '#b2ebf4', '#b2ccff', '#d1b2ff', '#ffb2f5', '#bdbdbd',
                    '#f15f5f', '#f29661', '#e5d85c', '#bce55c', '#5cd1e5', '#6699ff', '#a366ff', '#f261df', '#8c8c8c',
                    '#980000', '#993800', '#998a00', '#6b9900', '#008299', '#003399', '#3d0099', '#990085', '#353535',
                    '#670000', '#662500', '#665c00', '#476600', '#005766', '#002266', '#290066', '#660058', '#222222'
                  ]
                  ex) [
                    ['#ccc', '#dedede', 'OrangeRed', 'Orange', 'RoyalBlue', 'SaddleBrown'], // Line break
                    ['SlateGray', 'BurlyWood', 'DeepPink', 'FireBrick', 'Gold', 'SeaGreen']
                  ]

// Image---------------------------------------------------------------------------------------------------------
imageResizing   : Can resize the image.                             default: true {Boolean}
imageWidth      : The default width size of the image frame.        default: 'auto' {Number}
imageFileInput  : Choose whether to create a file input tag in the image upload window.  default: true {Boolean}
imageUrlInput   : Choose whether to create a image url input tag in the image upload window.
                  If the value of imageFileInput is false, it will be unconditionally.   default: true {Boolean}
imageUploadHeader : Http Header when uploading images.              default: null {Object}
imageUploadUrl  : The image upload to server mapping address.       default: null {String}
                  ex) "/editor/uploadImage.ajax"
                  When not used, it enters base64 data
                  return {
                            "errorMessage": "insert error message",
                            "result": [
                                {
                                    "url": "/download/editorImg/test_image.jpg",
                                    "name": "test_image.jpg",
                                    "size": "561276"
                                }
                            ]
                        }
imageUploadSizeLimit: The size of the total uploadable images (in bytes).
                      Invokes the "onImageUploadError" method.  default: null {Number}

// Video----------------------------------------------------------------------------------------------------------
videoResizing   : Can resize the video iframe.                       default: true {Boolean}
videoWidth      : The default width size of the video frame.         default: 560 {Number}
videoHeight     : The default heigth size of the video frame.        default: 315 {Number}
youtubeQuery    : The query string of a YouTube embedded URL.        default: '' {String}
                  It takes precedence over the value user entered.
                  ex) 'autoplay=1&mute=1&enablejsapi=1&controls=0&rel=0&modestbranding=1'
                    // https://developers.google.com/youtube/player_parameters

// Defining save button-------------------------------------------------------------------------------------------
callBackSave    : Callback functions that is called when the Save button is clicked.
                  Arguments - (contents).                            default: userFunction.save {Function}

// Templates Array------------------------------------------------------------------------------------------------
templates       : If you use a template plugin, add it.
                  Defines a list of templates.                       default: null {Array}
                  ex) [
                    {
                        name: 'Template-1',
                        html: '<p>HTML source1</p>'
                    },
                    {
                        name: 'Template-2',
                        html: '<p>HTML source2</p>'
                    }
                  ]

// Buttons--------------------------------------------------------------------------------------------------------
toolbarItem      : Defines toolbar item to array {Array}
                  default: [
                    ['undo', 'redo'],
                    // ['font', 'fontSize', 'formatBlock'],
                    ['bold', 'underline', 'italic', 'strike', 'subscript', 'superscript'],
                    ['removeFormat'],
                    // '/', Line break
                    // ['fontColor', 'hiliteColor'],
                    ['outdent', 'indent'],
                    // ['align', 'horizontalRule', 'list', 'table'],
                    // ['link', 'image', 'video'],
                    ['fullScreen', 'showBlocks', 'codeView'],
                    ['preview', 'print'],
                    // ['save', 'template'],
                  ]

Functions

import KothingEditor from 'kothing-editor';

const editor = KothingEditor.create('example');

// Add or reset option property
editor.setOptions({
  minHeight: '300px',
  toolbarItem: [['fontColor', 'hiliteColor']],
  colorList: [['#ccc', '#dedede', 'OrangeRed', 'Orange', 'RoyalBlue', 'SaddleBrown']],
});

// Open a notice area
editor.noticeOpen('test notice');

// Close a notice area
editor.noticeClose();

// Copies the contents of the KothingEditor into a [textarea]
editor.save();

// Gets the KothingEditor's context object. Contains settings, plugins, and cached element objects
editor.getContext();

// Gets the contents of the KothingEditor
editor.getContents();

// Gets a list of images uploaded to the editor
/**
 * {
 *  src: imgage src
 *  index: data index
 *  name: file name
 *  size: file size
 *  select: select function
 *  delete: delete function
 * }
 **/
editor.getImagesInfo();

// Upload images using image plugin
editor.insertImage(FileList);

// Inserts an HTML element or HTML string or plain string at the current cursor position
editor.insertHTML('<img src="http://kothing.github.io/editor/img/beauty.jpg">');

// Change the contents of the KothingEditor
editor.setContents('set contents');

// Add content to the KothingEditor
editor.appendContents('append contents');

// Disable the KothingEditor
editor.disabled();

// Enabled the KothingEditor
editor.enabled();

// Hide the KothingEditor
editor.hide();

// Show the KothingEditor
editor.show();

// Destroy the KothingEditor
editor.destroy();
editor = null;

// Event functions
// It can be redefined by receiving event object as parameter.
// It is not called in exceptional cases and is called after the default event function has finished.
editor.onScroll = function(e) {
  console.log('onScroll', e);
};

editor.onClick = function(e) {
  console.log('onClick', e);
};

editor.onKeyDown = function(e) {
  console.log('onKeyDown', e);
};

editor.onKeyUp = function(e) {
  console.log('onKeyUp', e);
};

editor.onDrop = function(e) {
  console.log('onDrop', e);
};

editor.onChange = function(contents) {
  console.log('onChange', contents);
};

// Paste event.
// Called before the editor's default event action.
// If it returns false, it stops without executing the rest of the action.
/**
 * cleanData : HTML string modified for editor format
 * maxCharCount : maxChartCount option (true if max character is exceeded)
 */
editor.onPaste = function(e, cleanData, maxCharCount) {
  console.log('onPaste', e, cleanData, maxCharCount);
};

// Called when the image is uploaded or the uploaded image is deleted.
/**
 * targetImgElement: Current img element
 * index: Uploaded index (key value)
 * state: Upload status ('create', 'update', 'delete')
 * imageInfo: {
 * * index: data index
 * * name: file name
 * * size: file size
 * * select: select function
 * * delete: delete function
 * }
 * remainingFilesCount: Count of remaining image files
 */
editor.onImageUpload = function(targetImgElement, index, state, imageInfo, remainingFilesCount) {
  console.log(
    `targetImgElement:${targetImgElement}, index:${index}, state('create', 'update', 'delete'):${state}`
  );
  console.log(`imageInfo:${imageInfo}, remainingFilesCount:${remainingFilesCount}`);
};

// Called when the image is upload failed.
// If you return false, the default notices are not called.
/**
 * errorMessage: Error message to show
 * result: Result object
 */
editor.onImageUploadError = function(errorMessage, result) {
  alert(errorMessage);
};

// Paste event.
// Called before the editor's default event action.
// If it returns false, it stops without executing the rest of the action.
/**
 * toolbar: Toolbar Element
 * context: The editor's context object (editor.getContext())
 */
editor.showInline = function(toolbar, context) {
  console.log('toolbar', toolbar);
  console.log('context', context);
};

Examples

Defining menu items

Char count, Button groups

Iframe, fullPage and use CodeMirror

Image management

User Functions

Options template

Options template

Custom plugins

Custom plugins

Document

Document

License

KothingEditor may be freely distributed under the MIT license.

Comments
  • no input from KothingEditor textarea, and default font size no change

    no input from KothingEditor textarea, and default font size no change

    Like my textarea has id, name, class attribute but the name attribute of my textarea is not working, i.e input is not coming from the kothingeditor. and the default font size is very small.

    opened by r-a-s-h-h 0
  • How to disable default browser context menu

    How to disable default browser context menu

    In the code example Kothing-Editor/index.html (index.js), kt-editor2 has a popup toolbar which appears when left-clicking or right-clicking in the editor area.

    How can I make it so that right-clicking causes the popup toolbar to appear, but does not also cause the default browser context menu to appear?

    image

    opened by pflagerd 0
  • Text cuts when apply format to text part

    Text cuts when apply format to text part

    1. Write in editor next text: This is some text
    2. Select all text.
    3. Set font family: Arial
    4. Set font size: 18px
    5. Select word 'some' and press bold toolbar button.

    In result we got: This is some after selected word 'some' text was cut.

    Also you can past in html mode:

    This is some text

    Then in design mode set bold word 'some'.
    opened by torgashov 0
  • Examples do not work

    Examples do not work

    Examples on page https://kothing.github.io/editor/html/examples.html#functions do not work. When i click on "setOptions" button in chrome browser, then in console i see error message: examples.html:808 Uncaught TypeError: KothingEditor.setOptions is not a function at ke_setOptions (examples.html:808) at HTMLButtonElement.onclick (VM12 examples.html:398)

    opened by torgashov 0
  • util is not defined when set editor options

    util is not defined when set editor options

    When i run example const editor = KothingEditor.create('example');

    // Add or reset option property editor.setOptions({ minHeight: '300px', toolbarItem: [['fontColor', 'hiliteColor']], colorList: [['#ccc', '#dedede', 'OrangeRed', 'Orange', 'RoyalBlue', 'SaddleBrown']], });

    in chrome console i see error: Message: util is not defined at Object._initOptions (kothing-editor.min.js?v=99AD29C45669CC3A3C4419118C2EF0DC:1) at Object._setOptions (kothing-editor.min.js?v=99AD29C45669CC3A3C4419118C2EF0DC:1) at Object.setOptions (kothing-editor.min.js?v=99AD29C45669CC3A3C4419118C2EF0DC:1)

    opened by torgashov 0
  • Strike button render DEL tag instead S tag

    Strike button render DEL tag instead S tag

    Strike button render DEL tag instead S tag. HTML DEL tag used for mark text as deleted in new text version. HTML S tag mean Strike text for mark striked text. Thanks.

    opened by torgashov 0
Owner
Kothing
Accept what was and what is, and you’ll have more positive energy to pursue what will be.
Kothing
Medium.com WYSIWYG editor clone. Uses contenteditable API to implement a rich text solution.

If you would be interested in helping to maintain one of the most successful WYSIWYG text editors on github, let us know! (See issue #1503) MediumEdit

yabwe 15.7k Jan 4, 2023
Override the rich text editor in Strapi admin with ToastUI Editor.

strapi-plugin-wysiwyg-tui-editor ⚠️ This is a strapi v4 plugin which does not support any earlier version! A Strapi plugin to replace the default rich

Zhuo Chen 12 Dec 23, 2022
Pure javascript based WYSIWYG html editor, with no dependencies.

SunEditor Pure javscript based WYSIWYG web editor, with no dependencies Demo : suneditor.com The Suneditor is a lightweight, flexible, customizable WY

Yi JiHong 1.1k Jan 2, 2023
Simple rich text editor (contentEditable) for jQuery UI

Hallo - contentEditable for jQuery UI Hallo is a very simple in-place rich text editor for web pages. It uses jQuery UI and the HTML5 contentEditable

Henri Bergius 2.4k Dec 17, 2022
Tiny bootstrap-compatible WISWYG rich text editor

bootstrap-wysiwyg Important information for Github requests/issues Please do not submit issues/comments to this repo. Instead, submit it to https://gi

MindMup 5.6k Jan 3, 2023
HTML5 rich text editor. Try the demo integration at

Squire Squire is an HTML5 rich text editor, which provides powerful cross-browser normalisation in a flexible lightweight package (only 16.5KB of JS a

Neil Jenkins 4.4k Dec 28, 2022
A rich text editor for everyday writing

Trix A Rich Text Editor for Everyday Writing Compose beautifully formatted text in your web application. Trix is a WYSIWYG editor for writing messages

Basecamp 17.3k Jan 3, 2023
Open source rich text editor based on HTML5 and the progressive-enhancement approach. Uses a sophisticated security concept and aims to generate fully valid HTML5 markup by preventing unmaintainable tag soups and inline styles.

This project isn’t maintained anymore Please check out this fork. wysihtml5 0.3.0 wysihtml5 is an open source rich text editor based on HTML5 technolo

Christopher Blum 6.5k Jan 7, 2023
Popline is an HTML5 Rich-Text-Editor Toolbar

popline Popline is a non-intrusive WYSIWYG editor that shows up only after selecting a piece of text on the page, inspired by popclip. Usage Load jQue

kenshin 1k Nov 4, 2022
Open source rich text editor based on HTML5 and the progressive-enhancement approach. Uses a sophisticated security concept and aims to generate fully valid HTML5 markup by preventing unmaintainable tag soups and inline styles.

This project isn’t maintained anymore Please check out this fork. wysihtml5 0.3.0 wysihtml5 is an open source rich text editor based on HTML5 technolo

Christopher Blum 6.5k Dec 30, 2022
The next generation Javascript WYSIWYG HTML Editor.

Froala Editor V3 Froala WYSIWYG HTML Editor is one of the most powerful JavaScript rich text editors ever. Slim - only add the plugins that you need (

Froala 5k Jan 1, 2023
A lightweight and amazing WYSIWYG JavaScript editor - 20kB only (8kB gzip)

Supporting Trumbowyg Trumbowyg is an MIT-licensed open source project and completely free to use. However, the amount of effort needed to maintain and

Alexandre Demode 3.8k Jan 7, 2023
Quill is a modern WYSIWYG editor built for compatibility and extensibility.

Note: This branch and README covers the upcoming 2.0 release. View 1.x docs here. Quill Rich Text Editor Quickstart • Documentation • Development • Co

Quill 34.3k Jan 2, 2023
Simple, beautiful wysiwyg editor

This repo is no longer maintained. bootstrap3-wysiwyg is much better Overview Bootstrap-wysihtml5 is a javascript plugin that makes it easy to create

James Hollingworth 4.2k Dec 30, 2022
Raptor, an HTML5 WYSIWYG content editor!

Raptor Editor Raptor Editor is a user-focused extensible WYSIWYG website content editor - check out the Demo. It is designed to be user and developer

PANmedia 533 Sep 24, 2022
Super simple WYSIWYG editor

Summernote Super simple WYSIWYG Editor. Summernote Summernote is a JavaScript library that helps you create WYSIWYG editors online. Home page: https:/

Summernote 11k Jan 7, 2023
🍞📝 Markdown WYSIWYG Editor. GFM Standard + Chart & UML Extensible.

TOAST UI Editor v3 major update planning ?? ?? ?? TOAST UI Editor is planning a v3 major update for 2021. You can see our detail RoadMap here! GFM Mar

NHN 15.5k Jan 3, 2023
The best enterprise-grade WYSIWYG editor. Fully customizable with countless features and plugins.

CKEditor 4 - Smart WYSIWYG HTML editor A highly configurable WYSIWYG HTML editor with hundreds of features, from creating rich text content with capti

CKEditor Ecosystem 5.7k Dec 27, 2022
An Easy and Fast WYSIWYG Editor

Simditor Simditor is a browser-based WYSIWYG text editor. It is used by Tower -- a popular project management web application. Supported Browsers: IE1

彩程设计 5k Jan 3, 2023