SunEditor
Vanilla javascript based WYSIWYG web editor, with no dependencies.
SunEditor supports IE11 and all modern browsers with no dependencies and polyfill.
The Suneditor 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 embed, images upload.
- Can use CodeMirror, KaTeX.
- 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 suneditor --save
Bower
$ bower install suneditor --save
CDN
<link href="https://cdn.jsdelivr.net/npm/suneditor@latest/dist/css/suneditor.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/suneditor@latest/dist/suneditor.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/suneditor@latest/src/lang/ko.js"></script>
jsdelivr/suneditor
Getting Started
1. Target Element
<textarea id="sample">Hi</textarea>
2. Create
const editor = SUNEDITOR.create((document.getElementById('sample') || 'sample'),{
lang: SUNEDITOR_LANG['ko']
});
3. Contents display
When you display a document created by suneditor
You need to include "src/assets/css/suneditor-contents.css" or "dist/css/suneditor.min.css" file.
Then add "sun-editor-editable" to the class name of the Tag element that displays the content.
If you are using RTL mode, you also need to add "se-rtl".
In "suneditor-contents.css", you can define the style of all the tags created in suneditor.
When inserting custom tags in the editor
- Empty tags without meaning or tags that do not fit the editor's format are modified or deleted.
Tags with the class name "se-component" or "__se__tag" of the top-level tag will not be deleted.
"se-component" is the component type of the editor.
Class name for wrapper tags such as images and videos.
Use import statement
1. Load only what you want
import 'suneditor/dist/css/suneditor.min.css'
import suneditor from 'suneditor'
import image from 'suneditor/src/plugins/dialog/link'
import list from 'suneditor/src/plugins/submenu/list'
import {font, video} from 'suneditor/src/plugins'
import lang from 'suneditor/src/lang'
import {ko} from 'suneditor/src/lang'
import de from 'suneditor/src/lang/de'
suneditor.create('sample', {
plugins: [font, video, image, list],
buttonList: [
['font', 'video', 'image', 'list']
],
lang: lang.ko
});
2. Load all plugins
import 'suneditor/dist/css/suneditor.min.css'
import suneditor from 'suneditor'
import plugins from 'suneditor/src/plugins'
suneditor.create('sample', {
plugins: plugins,
buttonList: [
['undo', 'redo'],
['font', 'fontSize', 'formatBlock'],
['paragraphStyle', 'blockquote'],
['bold', 'underline', 'italic', 'strike', 'subscript', 'superscript'],
['fontColor', 'hiliteColor', 'textStyle'],
['removeFormat'],
'/',
['outdent', 'indent'],
['align', 'horizontalRule', 'list', 'lineHeight'],
['table', 'link', 'image', 'video', 'audio' ],
['fullScreen', 'showBlocks', 'codeView'],
['preview', 'print'],
['save', 'template'],
]
})
suneditor.create('sample', {
plugins: [plugins.font],
buttonList: [
['font', plugins.image]
]
})
3. Plugins can be used directly in the button list
import 'suneditor/dist/css/suneditor.min.css'
import suneditor from 'suneditor'
import {align, font, fontSize, fontColor, hiliteColor,
horizontalRule, image, template} from 'suneditor/src/plugins'
suneditor.create('sample', {
buttonList: [
['undo', 'redo', 'removeFormat'],
[align, font, fontSize, fontColor, hiliteColor],
[horizontalRule, image, 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 'suneditor/dist/css/suneditor.min.css'
import suneditor from 'suneditor'
import plugins from 'suneditor/src/plugins'
const initEditor = suneditor.init({
plugins: plugins,
height: 200,
buttonList: [
[
'undo', 'redo',
'font', 'fontSize', 'formatBlock',
'paragraphStyle', 'blockquote',
'bold', 'underline', 'italic', 'strike', 'subscript', 'superscript',
'fontColor', 'hiliteColor', 'textStyle',
'removeFormat',
'outdent', 'indent',
'align', 'horizontalRule', 'list', 'lineHeight',
'table', 'link', 'image', 'video', 'audio',
'fullScreen', 'showBlocks', 'codeView',
'preview', 'print', 'save', 'template',
]
]
});
initEditor.create('sample_1', {
});
initEditor.create('sample_2', {
height: 'auto',
buttonList: [
['bold', 'underline', 'italic'],
['removeFormat'],
['preview', 'print']
]
});
Use CodeMirror
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/codemirror@5.49.0/lib/codemirror.min.css">
<script src="https://cdn.jsdelivr.net/npm/codemirror@5.49.0/lib/codemirror.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/codemirror@5.49.0/mode/htmlmixed/htmlmixed.js"></script>
<script src="https://cdn.jsdelivr.net/npm/codemirror@5.49.0/mode/xml/xml.js"></script>
<script src="https://cdn.jsdelivr.net/npm/codemirror@5.49.0/mode/css/css.js"></script>
import 'suneditor/dist/css/suneditor.min.css'
import suneditor from 'suneditor'
import CodeMirror from 'codemirror'
import 'codemirror/mode/htmlmixed/htmlmixed'
import 'codemirror/lib/codemirror.css'
suneditor.create('sample', {
codeMirror: CodeMirror
buttonList: [
['codeView']
],
height: 400
});
Use KaTeX (math plugin)
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.11.1/dist/katex.min.css">
<script src="https://cdn.jsdelivr.net/npm/katex@0.11.1/dist/katex.min.js"></script>
import 'suneditor/dist/css/suneditor.min.css'
import suneditor from 'suneditor'
import katex from 'katex'
import 'katex/dist/katex.min.css'
suneditor.create('sample', {
katex: katex
buttonList: [
['math']
]
});
Options
plugins: [
blockquote,
align,
font,
fontColor,
fontSize,
formatBlock,
hiliteColor,
horizontalRule,
lineHeight,
list,
paragraphStyle,
table,
template,
textStyle,
image,
link,
video,
audio,
math,
imageGallery
]
: Plugins array. default: null {Array}
lang : language object. default : en {Object}
defaultTag : Specifies default tag name of the editor. default: 'p' {String}
textTags : You can change the tag of the default text button. default: { bold: 'STRONG', underline: 'U', italic: 'EM', strike: 'DEL' }
ex) {
bold: 'b',
strike: 's'
}
value : Initial value(html string) of the edit area.
If not, the value of the "target textarea". default: null {String}
allowedClassNames : Specifies the allowed class name, It can be specified in the form of a regular expression.
Appended before the "default" value. (`${option}|${defaultValue}`) default: '^se-|__se__|katex';
historyStackDelayTime : When recording the history stack, this is the delay time(miliseconds) since the last input. default: 400 {Number}
frameAttrbutes : Specifies the properties of the editing area DIV. default: {} {Object}
ex) {
"spellcheck": false
}
addTagsWhitelist : Add tags to the default tags whitelist of editor. default: '' {String}
ex) 'mark|canvas|label|select|option|input|//'
ex) '*'
tagsBlacklist : Blacklist of the editor default tags. default: null {String}
ex) 'h1|h2'
pasteTagsWhitelist : Whitelist of tags when pasting. default: _editorTagsWhitelist {String}
ex) 'p|h1|h2|h3'
ex) '*'
pasteTagsBlacklist : Blacklist of tags when pasting. default: null {String}
ex) 'h1|h2'
attributesWhitelist : Add attributes whitelist of tags that should be kept undeleted from the editor. default: null {Object}
ex) {
'all': 'style|data-.+',
'input': 'checked|name'
'???': '*'
}
attributesBlacklist : Add attribute blacklist of tags that should be deleted in editor. default: null {Object}
ex) {
'all': 'id',
'input': 'style'
'???': '*'
}
mode : The mode of the editor ('classic', 'inline', 'balloon', 'balloon-always'). default: 'classic' {String}
rtl : If true, the editor is set to RTL(Right To Left) mode. default: false {Boolean}
lineAttrReset : Deletes other attributes except for the property set at the time of line break.
If there is no value, no all attribute is deleted. default: '' {String}
ex) 'class|style': Attributes other than "class" and "style" are deleted at line break.
'*': All attributes are deleted at line break.
toolbarWidth : The width of the toolbar. Applies only when the editor mode is
'inline' or 'balloon' mode. default: 'auto' {Number|String}
toolbarContainer: A custom HTML selector placing the toolbar inside.
The class name of the element must be 'sun-editor'.
Element or querySelector argument. default: null {Element|String}
ex) document.querySelector('#id') || '#id'
stickyToolbar : Top offset value of "sticky toolbar".
Set to 0, '0px', '50px'...
If set to -1 or false or null to turn off. default: 0 {Number|String|Boolean}
hideToolbar : The toolbar is rendered hidden. default: false {Boolean}
fullScreenOffset: Top offset value of "full Screen".
Set to 0, '0px', '50px'... default: 0 {Number|String}
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}
iframeAttributes : Attributes of the iframe. default: null {Object}
ex) {'scrolling': 'no'}
iframeCSSFileName : Name or Array of the CSS file to apply inside the iframe.
You can also use regular expressions.
Applied by searching by filename in the link tag of document,
or put the URL value (".css" can be omitted). default: 'suneditor' {Array|String}
ex) '.+' or ['suneditor', 'http://suneditor.com/sample/css/sample.css', '.+\\.min\\.css']
previewTemplate : A template of the "preview".
The {{contents}} part in the HTML string is replaced with the contents of the editor. default: null {String}
ex) "<div style='width:auto; max-width:1080px; margin:auto;'><h1>Preview Template</h1> {{contents}} <div>_Footer_</div></div>"
printTemplate : A template of the "print".
The {{contents}} part in the HTML string is replaced with the contents of the editor. default: null {String}
ex) "<div style='width:auto; max-width:1080px; margin:auto;'><h1>Print Template</h1> {{contents}} <div>_Footer_</div></div>"
codeMirror : If you put the CodeMirror object as an option, you can do Codeview using CodeMirror. default: null {Object}
Use version 5.x.x
ex) codeMirror: CodeMirror
codeMirror: {
src: CodeMirror,
options: {
}
}
katex : Required library for math plugins. default: null {Object}
Use version 0.x.x
ex) katex: katex
katex: {
src: katex,
options: {
}
}
mathFontSize : Math plugin font size list. default: [{..}] {Array}
Default value: [
{text: '1', value: '1em', default: true},
{text: '1.5', value: '1.5em'},
{text: '2', value: '2em'},
{text: '2.5', value: '2.5em'}
]
position : The position property of suneditor. default: null {String}
display : The display property of suneditor. default: 'block' {String}
popupDisplay : Size of background area when activating dialog window ('full'||'local') default: 'full' {String}
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}
resizeEnable : Enable/disable resize function of bottom resizing bar. default: true {Boolean}
resizingBarContainer: A custom HTML selector placing the resizing bar inside.
The class name of the element must be 'sun-editor'.
Element or querySelector argument. default: null {Element|String}
ex) document.querySelector('#id') || '#id'
charCounter : Shows the number of characters in the editor.
If the maxCharCount option has a value, it becomes true. default: false {Boolean}
charCounterType : Defines the calculation method of the "charCounter" option.
'char': Characters length.
'byte': Binary data size of characters.
'byte-html': Binary data size of the full HTML string. default: 'char' {String}
charCounterLabel: Text to be displayed in the "charCounter" area of the bottom bar.
Screen ex) 'charCounterLabel : 20/200'. default: null {String}
maxCharCount : The maximum number of characters allowed to be inserted into the editor. default: null {Number}
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 : 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}
className : Add a "class" to the editing area[.sun-editor-editable]. default: '' {String}
defaultStyle : You can define the style of the editing area[.sun-editor-editable].
It affects the entire editing area. default: '' {String}
('z-index', 'position' and 'width' properties apply to the top div.)
ex) 'font-family: cursive; font-size: 10px;'
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
]
fontSizeUnit : The font size unit. default: 'px' {String}
alignItems : A list of drop-down options for the 'align' plugin. default: rtl === true ? ['right', 'center', 'left', 'justify'] : ['left', 'center', 'right', 'justify'] {Array}
formats : Change default formatBlock array. default: [...] {Array}
Default value: [
'p', 'div', 'blockquote', 'pre', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'
],
Custom: [{
tag: 'div',
name: 'Custom div' || null,
command: 'replace' || 'range' || 'free',
class: '__se__format__replace_xxx' || '__se__format__range_xxx' || '__se__format__free_xxx' || '__se__format__free__closure_xxx'
}]
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'],
['SlateGray', 'BurlyWood', 'DeepPink', 'FireBrick', 'Gold', 'SeaGreen']
]
lineHeights : Change default line-height array. default: [{}..] {Array}
Default value: [
{text: '1', value: 1},
{text: '1.15', value: 1.15},
{text: '1.5', value: 1.5},
{text: '2', value: 2}
]
ex) [
{text: 'Single', value: 1},
{text: 'Double', value: 2}
]
paragraphStyles : You can apply custom class to format.
ex) '.sun-editor-editable .__se__customClass'
'.sun-editor .__se__customClass'
Default value: [
{
name: 'Spaced',
class: '__se__p-spaced',
_class: ''
},
{
name: 'Bordered',
class: '__se__p-bordered'
},
{
name: 'Neon',
class: '__se__p-neon'
}
]
ex) [
'spaced', 'neon',
{
name: 'Custom',
class: '__se__customClass'
}
]
textStyles : You can apply custom style or class to selected text.
ex(using a class)) '.sun-editor-editable .__se__customClass'
'.sun-editor .__se__customClass'
Default value: [
{
name: 'Code',
class: '__se__t-code',
tag: 'code',
},
{
name: 'Translucent',
style: 'opacity: 0.5;',
tag: 'span',
_class: ''
},
{
name: 'Shadow',
class: '__se__t-shadow',
tag: 'span'
}
]
ex) [
'Code',
{
name: 'Emphasis',
style: '-webkit-text-emphasis: filled;',
tag: 'span'
}
]
imageResizing : Can resize the image. default: true {Boolean}
imageHeightShow : Choose whether the image height input is visible. default: true {Boolean}
imageAlignShow : Choose whether the image align radio buttons are visible. default: true {Boolean}
imageWidth : The default width size of the image frame. default: 'auto' {String}
imageHeight : The default height size of the image frame. default: 'auto' {String}
imageSizeOnlyPercentage : If true, image size can only be scaled by percentage. default: false {Boolean}
imageRotation : Choose whether to image rotation buttons display.
When "imageSizeOnlyPercentage" is "true" or or "imageHeightShow" is "false" the default value is false.
If you want the button to be visible, put it a true. default: true {Boolean}
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}
(When not used the "imageUploadUrl" option, image is enters base64 data)
ex) "/editor/uploadImage"
request format: {
"file-0": File,
"file-1": File
}
response format: {
"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}
imageMultipleFile: If true, multiple images can be selected. default: false {Boolean}
imageAccept : Define the "accept" attribute of the input. default: "*" {String}
ex) "*" or ".jpg, .png .."
imageGalleryUrl : The url of the image gallery, if you use the image gallery.
When "imageUrlInput" is true, an image gallery button is created in the image modal.
You can also use it by adding "imageGallery" to the button list. default: null {String}
ex) "/editor/getGallery"
response format: {
"result": [
{
"src": "/download/editorImg/test_image.jpg",
"thumbnail": "/download/editorImg/test_thumbnail.jpg",
"name": "Test image",
"alt": "Alt text",
"tag": "Tag name"
}
],
"nullMessage": "Text string or HTML string",
"errorMessage": "Insert error message",
}
You can redefine the "plugins.imageGallery.drawItems" method.
imageGalleryHeader: Http Header when get image gallery. default: null {Object}
videoResizing : Can resize the video (iframe, video). default: true {Boolean}
videoHeightShow : Choose whether the video height input is visible. default: true {Boolean}
videoAlignShow : Choose whether the video align radio buttons are visible. default: true {Boolean}
videoRatioShow : Choose whether the video ratio options is visible. default: true {Boolean}
videoWidth : The default width size of the video frame. default: '100%' {String}
videoHeight : The default height size of the video frame. default: '56.25%' {String}
videoSizeOnlyPercentage : If true, video size can only be scaled by percentage. default: false {Boolean}
videoRotation : Choose whether to video rotation buttons display.
When "videoSizeOnlyPercentage" is "true" or "videoHeightShow" is "false" the default value is false.
If you want the button to be visible, put it a true. default: true {Boolean}
videoRatio : The default aspect ratio of the video.
Up to four decimal places are allowed. default: 0.5625 (16:9) {Float}
videoRatioList : Video ratio selection options.
default: [
{name: '16:9', value: 0.5625},
{name: '4:3', value: 0.75},
{name: '21:9', value: 0.4285}
],
ex) [
{name: 'Classic Film 3:2', value: 0.6666},
{name: 'HD', value: 0.5625}
]
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'
videoFileInput : Choose whether to create a file input tag in the video upload window. default: false {Boolean}
videoUrlInput : Choose whether to create a video url input tag in the video upload window.
If the value of videoFileInput is false, it will be unconditionally. default: true {Boolean}
videoUploadHeader : Http Header when uploading videos. default: null {Object}
videoUploadUrl : The video upload to server mapping address. default: null {String}
ex) "/editor/uploadVideo"
request format: {
"file-0": File,
"file-1": File
}
Use video tags. (supported video formats: '.mp4', '.webm', '.ogg')
response format: {
"errorMessage": "insert error message",
"result": [
{
"url": "/download/editorVideos/test_video.mp4",
"name": "test_video.mp4",
"size": "561276"
}
]
}
videoUploadSizeLimit: The size of the total uploadable videos (in bytes).
Invokes the "onVideoUploadError" method. default: null {Number}
videoMultipleFile: If true, multiple videos can be selected. default: false {Boolean}
videoTagAttrs : Define "Attributes" of the video tag. default: null {Object}
ex) { poster: "http://suneditor.com/docs/loading.gif", autoplay: true }
videoIframeAttrs : Define "Attributes" of the iframe tag. (Youtube, Vimeo). default: null {Object}
ex) { style: "border: 2px solid red;" }
videoAccept : Define the "accept" attribute of the input. default: "*" {String}
ex) "*" or ".mp4, .avi .."
audioWidth : The default width size of the audio frame. default: '300px' {String}
audioHeight : The default height size of the audio frame. default: '54px' {String}
audioFileInput : Choose whether to create a file input tag in the audio upload window. default: false {Boolean}
audioUrlInput : Choose whether to create a audio url input tag in the audio upload window.
If the value of audioFileInput is false, it will be unconditionally. default: true {Boolean}
audioUploadHeader : Http Header when uploading audios. default: null {Object}
audioUploadUrl : The audio upload to server mapping address. default: null {String}
ex) "/editor/uploadAudio"
request format: {
"file-0": File,
"file-1": File
}
Use audio tags. (supported audio formats: '.mp4', '.webm', '.ogg')
response format: {
"errorMessage": "insert error message",
"result": [
{
"url": "/download/editorAudios/test_audio.mp3",
"name": "test_audio.mp3",
"size": "561276"
}
]
}
audioUploadSizeLimit: The size of the total uploadable audios (in bytes).
Invokes the "onAudioUploadError" method. default: null {Number}
audioMultipleFile: If true, multiple audios can be selected. default: false {Boolean}
audioTagAttrs : Define "Attributes" of the audio tag. default: null {Object}
ex) { controlslist: "nodownload", autoplay: true }
videoAccept : Define the "accept" attribute of the input. default: "*" {String}
ex) "*" or ".mp3, .wav .."
tableCellControllerPosition : Define position to the table cell controller('cell', 'top'). default: 'cell' {String}
linkTargetNewWindow : Default checked value of the "Open in new window" checkbox. default: false {Boolean}
linkProtocol : Default protocol for the links. ('link', 'image', 'video', 'audio')
This applies to all plugins that enter the internet url. default: null {String}
linkRel : Defines "rel" attribute list of anchor tag. default: [] {Array}
ex) [
'author',
'external',
'help',
'license',
'next',
'follow',
'nofollow',
'noreferrer',
'noopener',
'prev',
'search',
'tag'
]
linkRelDefault : Defines default "rel" attributes of anchor tag. default: {} {Object}
ex) linkRelDefault: {
default: 'nofollow',
check_new_window: 'noreferrer noopener',
check_bookmark: 'bookmark'
},
linkRelDefault: {
check_new_window: 'only:noreferrer noopener'
}
linkNoPrefix : If true, disables the automatic prefixing of the host URL to the value of the link. default: false {Boolean}
hrItems : Defines the hr items.
"class" or "style" must be specified.
default: [
{name: lang.toolbar.hr_solid, class: '__se__solid'},
{name: lang.toolbar.hr_dashed, class: '__se__dashed'},
{name: lang.toolbar.hr_dotted, class: '__se__dotted'}
]
ex) [ {name: "Outset", style: "border-style: outset;"} ]
tabDisable : If true, disables the interaction of the editor and tab key. default: false {Boolean}
shortcutsDisable: You can disable shortcuts. default: [] {Array}
ex) ['bold', 'strike', 'underline', 'italic', 'undo', 'indent', 'save']
shortcutsHint : If false, hide the shortcuts hint. default: true {Boolean}
callBackSave : Callback functions that is called when the Save button is clicked.
Arguments - (contents, isChanged). default: functions.save {Function}
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>'
}
]
__allowedScriptTag : Allows script tags. default: false {Boolean}
placeholder : The placeholder text. default: null {String}
mediaAutoSelect : Activate the media[image, video, audio] selection status immediately after inserting the media tag. default: true {Boolean}
icons : You can redefine icons. default: null {Object}
ex) {
bold: '<span class="se-icon-text">B</span>',
table: '<i class="xx xxx></i>',
insert_row_above: '<svg></svg>'
}
buttonList : Defines button list to array {Array}
default: [
['undo', 'redo'],
['bold', 'underline', 'italic', 'strike', 'subscript', 'superscript'],
['removeFormat'],
['outdent', 'indent'],
['fullScreen', 'showBlocks', 'codeView'],
['preview', 'print'],
]
----------------- ex) When do not use group: ----------------------------------------------------------------------
[
['undo', 'redo', 'bold', 'underline', 'fontColor', 'table', 'link', 'image', 'video']
]
------------------ex) Alignment of button group:-------------------------------------------------------------------
[
['-left', 'undo', 'redo']
['-right', 'bold', 'underline', 'italic', 'strike'],
]
------------------ex) Options in the button group(#):--------------------------------------------------------------
[
['bold'],
['preview', 'print'],
['-left', '#fix', 'rtl_l', 'rtl_r']
]
----------------- ex) More button: --------------------------------------------------------------------------------
[
['undo', 'redo'],
[':t-More Text-default.more_text', 'bold', 'underline', 'italic'],
[':p-More Paragraph-default.more_paragraph', 'font', 'formatBlock', 'align', 'list'],
[':r-More Rich-default.more_plus', 'table', 'link', 'image', 'video'],
[':v-View-text.View', 'fullScreen', 'codeView', 'print'],
['-right', ':o-More Others-<i class="xxx"></i>', 'save', 'template'],
]
----------------- ex) Responsive setting: -------------------------------------------------------------------------
[
['undo', 'redo'],
['font', 'fontSize', 'formatBlock'],
['paragraphStyle', 'blockquote'],
['bold', 'underline', 'italic', 'strike', 'subscript', 'superscript'],
['fontColor', 'hiliteColor', 'textStyle'],
['removeFormat'],
['outdent', 'indent'],
['align', 'horizontalRule', 'list', 'lineHeight'],
['table', 'link', 'image', 'video', 'audio', 'math'],
['imageGallery'],
['fullScreen', 'showBlocks', 'codeView'],
['preview', 'print'],
['save', 'template'],
['-left', '#fix', 'dir_ltr', 'dir_rtl'],
['%992', [
['undo', 'redo'],
[':p-More Paragraph-default.more_paragraph', 'font', 'fontSize', 'formatBlock', 'paragraphStyle', 'blockquote'],
['bold', 'underline', 'italic', 'strike'],
[':t-More Text-default.more_text', 'subscript', 'superscript', 'fontColor', 'hiliteColor', 'textStyle'],
['removeFormat'],
['outdent', 'indent'],
['align', 'horizontalRule', 'list', 'lineHeight'],
['-right', 'dir'],
['-right', ':i-More Misc-default.more_vertical', 'fullScreen', 'showBlocks', 'codeView', 'preview', 'print', 'save', 'template'],
['-right', ':r-More Rich-default.more_plus', 'table', 'link', 'image', 'video', 'audio', 'math', 'imageGallery']
]],
['%768', [
['undo', 'redo'],
[':p-More Paragraph-default.more_paragraph', 'font', 'fontSize', 'formatBlock', 'paragraphStyle', 'blockquote'],
[':t-More Text-default.more_text', 'bold', 'underline', 'italic', 'strike', 'subscript', 'superscript', 'fontColor', 'hiliteColor', 'textStyle', 'removeFormat'],
[':e-More Line-default.more_horizontal', 'outdent', 'indent', 'align', 'horizontalRule', 'list', 'lineHeight'],
[':r-More Rich-default.more_plus', 'table', 'link', 'image', 'video', 'audio', 'math', 'imageGallery'],
['-right', 'dir'],
['-right', ':i-More Misc-default.more_vertical', 'fullScreen', 'showBlocks', 'codeView', 'preview', 'print', 'save', 'template']
]]
]
Functions
import suneditor from 'suneditor'
const editor = suneditor.create('example');
editor.core;
editor.util;
editor.setToolbarButtons([
[':moreText-More Text-default.more_horizontal', 'bold', 'underline', 'strike', 'subscript', 'superscript'],
['undo', 'redo']
]);
editor.setOptions({
minHeight: '300px',
buttonList: [
['fontColor', 'hiliteColor']
],
colorList: [
['#ccc', '#dedede', 'OrangeRed', 'Orange', 'RoyalBlue', 'SaddleBrown']
]
});
editor.setDefaultStyle('font-family: cursive; font-size: 10px;');
editor.noticeOpen('test notice');
editor.noticeClose();
editor.save();
editor.getContext();
editor.getContents(onlyContents: Boolean);
editor.getFullContents(onlyContents: Boolean);
editor.getText();
editor.getImagesInfo();
editor.getFilesInfo(pluginName);
editor.insertImage(FileList);
editor.insertHTML('<img src="http://suneditor.com/sample/img/sunset.jpg">', true, true);
editor.setContents('set contents');
editor.getCharCount((null || 'char' || 'byte' || 'byte-html'));
editor.appendContents('append contents');
editor.readOnly(true || false)
editor.disable();
editor.enable();
editor.hide();
editor.show();
editor.destroy();
editor.toolbar.disable();
editor.toolbar.enable();
editor.toolbar.hide();
editor.toolbar.show();
editor.onScroll = function (e, core) { console.log('onScroll', e) }
editor.onMouseDown = function (e, core) { console.log('onMouseDown', e) }
editor.onClick = function (e, core) { console.log('onClick', e) }
editor.onInput = function (e, core) { console.log('onInput', e) }
editor.onKeyDown = function (e, core) { console.log('onKeyDown', e) }
editor.onKeyUp = function (e, core) { console.log('onKeyUp', e) }
editor.onFocus = function (e, core) { console.log('onFocus', e) }
editor.onBlur = function (e, core) { console.log('onBlur', e) }
editor.onChange = function (contents, core) { console.log('onChange', contents) }
editor.onload = function (core, reload) {
console.log('onload-core', core)
console.log('onload-reload', reload)
}
editor.onPaste = function (e, cleanData, maxCharCount, core) { console.log('onPaste', e) }
editor.onCopy = function (e, clipboardData, core) { console.log('onCopy', e) }
editor.onCut = function (e, clipboardData, core) { console.log('onCut', e) }
editor.onDrop = function (e, cleanData, maxCharCount, core) { console.log('onDrop', e) }
editor.onSave = function (contents, core) {console.log(contents) };
editor.onImageUploadBefore: function (files, info, core, uploadHandler) {
return Boolean || return (new FileList) || return undefined;
}
editor.onVideoUploadBefore: function (files, info, core, uploadHandler) {
return Boolean || return (new FileList) || return undefined;
}
editor.onAudioUploadBefore: function (files, info, core, uploadHandler) {
return Boolean || return (new FileList) || return undefined;
}
editor.onImageUpload = function (targetElement, index, state, info, remainingFilesCount, core) {
console.log(`targetElement:${targetElement}, index:${index}, state('create', 'update', 'delete'):${state}`)
console.log(`info:${info}, remainingFilesCount:${remainingFilesCount}`)
}
editor.onVideoUpload = function (targetElement, index, state, info, remainingFilesCount, core) {
console.log(`targetElement:${targetElement}, index:${index}, state('create', 'update', 'delete'):${state}`)
console.log(`info:${info}, remainingFilesCount:${remainingFilesCount}`)
}
editor.onAudioUpload = function (targetElement, index, state, info, remainingFilesCount, core) {
console.log(`targetElement:${targetElement}, index:${index}, state('create', 'update', 'delete'):${state}`)
console.log(`info:${info}, remainingFilesCount:${remainingFilesCount}`)
}
editor.onImageUploadError = function (errorMessage, result, core) {
alert(errorMessage)
return Boolean
}
editor.onVideoUploadError = function (errorMessage, result, core) {
alert(errorMessage)
return Boolean
}
editor.onAudioUploadError = function (errorMessage, result, core) {
alert(errorMessage)
return Boolean
}
editor.onResizeEditor = function (height, prevHeight, core, resizeObserverEntry) {
console.log(`height: ${height}, prevHeight: ${prevHeight}`, resizeObserverEntry)
}
editor.onSetToolbarButtons = function (buttonList, core) {
console.log(`buttonList: ${buttonList}`)
}
editor.imageUploadHandler = function (xmlHttp, info, core) {
const response = JSON.parse(xmlHttp.responseText);
if (response.errorMessage) {
this.plugins.image.error.call(this, response.errorMessage, response);
} else {
this.plugins.image.register.call(this, info, response);
}
}
editor.videoUploadHandler = function (xmlHttp, info, core) {
const response = JSON.parse(xmlHttp.responseText);
if (response.errorMessage) {
this.plugins.video.error.call(this, response.errorMessage, response);
} else {
this.plugins.video.register.call(this, info, response);
}
}
editor.audioUploadHandler = function (xmlHttp, info, core) {
const response = JSON.parse(xmlHttp.responseText);
if (response.errorMessage) {
this.plugins.audio.error.call(this, response.errorMessage, response);
} else {
this.plugins.audio.register.call(this, info, response);
}
}
editor.toggleCodeView = function (isCodeView, core) {
console.log('isCodeView', isCodeView);
}
editor.toggleFullScreen = function (isFullScreen, core) {
console.log('isFullScreen', isFullScreen);
}
editor.showInline = function (toolbar, context, core) {
console.log('toolbar', toolbar);
console.log('context', context);
}
editor.showController = function (name, controllers, core) {
console.log('plugin name', name);
console.log('controller elements', controllers);
}
Plugins list
The plugin and the button have the same name.
Name | Type |
---|
blockquote | command |
image | dialog |
link |
video |
audio |
math |
align | submenu |
font |
fontColor |
fontSize |
formatBlock |
hiliteColor |
horizontalRule |
lineHeight |
list |
paragraphStyle |
table |
template |
textStyle |
imageGallery | fileBrowser |
Examples
Examples
Options template
Options template
Custom plugins
Custom plugins
Document
Document
Other libraries using SunEditor
suneditor-react (@mkhstar) - Pure React Component for SunEditor.
angular-suneditor (@BauViso) - Angular module for the SunEditor WYSIWYG Editor.
Livewire & Alpine.JS (@kaju74) - Using SunEditor with Livewire & Alpine.JS
Plugin for Pluxml (@sudwebdesign) - Plugin for Pluxml.
AEM-SunEditor (@ahmed-musallam) - Enables using SunEditor in AEM dialogs as an RTE replacement.
License
Suneditor may be freely distributed under the MIT license.