, specially in IE. Do not enter in this if block in this case.
- if ( tagName == currentName )
- addElement( currentNode, currentNode.parent );
- else if ( tagName in CKEDITOR.dtd.$listItem ) {
- parser.onTagOpen( 'ul', {} );
- addPoint = currentNode;
- reApply = true;
- } else {
- addElement( currentNode, currentNode.parent );
-
- // The current element is an inline element, which
- // cannot hold the new one. Put it in the pending list,
- // and try adding the new one after it.
- pendingInline.unshift( currentNode );
- reApply = true;
- }
-
- if ( addPoint )
- currentNode = addPoint;
- // Try adding it to the return point, or the parent element.
- else
- currentNode = currentNode.returnPoint || currentNode.parent;
-
- if ( reApply ) {
- parser.onTagOpen.apply( this, arguments );
- return;
- }
- }
-
- checkPending( tagName );
- checkPendingBrs( tagName );
-
- element.parent = currentNode;
- element.returnPoint = returnPoint;
- returnPoint = 0;
-
- if ( element.isEmpty )
- addElement( element );
- else
- currentNode = element;
- };
-
- parser.onTagClose = function( tagName ) {
- // Check if there is any pending tag to be closed.
- for ( var i = pendingInline.length - 1; i >= 0; i-- ) {
- // If found, just remove it from the list.
- if ( tagName == pendingInline[ i ].name ) {
- pendingInline.splice( i, 1 );
- return;
- }
- }
-
- var pendingAdd = [],
- newPendingInline = [],
- candidate = currentNode;
-
- while ( candidate.type && candidate.name != tagName ) {
- // If this is an inline element, add it to the pending list, if we're
- // really closing one of the parents element later, they will continue
- // after it.
- if ( !candidate._.isBlockLike )
- newPendingInline.unshift( candidate );
-
- // This node should be added to it's parent at this point. But,
- // it should happen only if the closing tag is really closing
- // one of the nodes. So, for now, we just cache it.
- pendingAdd.push( candidate );
-
- candidate = candidate.parent;
- }
-
- if ( candidate.type ) {
- // Add all elements that have been found in the above loop.
- for ( i = 0; i < pendingAdd.length; i++ ) {
- var node = pendingAdd[ i ];
- addElement( node, node.parent );
- }
-
- currentNode = candidate;
-
-
- addElement( candidate, candidate.parent );
-
- // The parent should start receiving new nodes now, except if
- // addElement changed the currentNode.
- if ( candidate == currentNode )
- currentNode = currentNode.parent;
-
- pendingInline = pendingInline.concat( newPendingInline );
- }
- };
-
- parser.onText = function( text ) {
- var currentDtd = CKEDITOR.dtd[ currentNode.name ];
- if ( !currentDtd || currentDtd[ '#' ] ) {
- checkPendingBrs();
- checkPending();
-
- text.replace( /(\r\n|[\r\n])|[^\r\n]*/g, function( piece, lineBreak ) {
- if ( lineBreak !== undefined && lineBreak.length )
- pendingBrs++;
- else if ( piece.length ) {
- var lastIndex = 0;
-
- // Create smiley from text emotion.
- piece.replace( smileyRegExp, function( match, index ) {
- addElement( new CKEDITOR.htmlParser.text( piece.substring( lastIndex, index ) ), currentNode );
- addElement( new CKEDITOR.htmlParser.element( 'smiley', { desc: smileyReverseMap[ match ] } ), currentNode );
- lastIndex = index + match.length;
- } );
-
- if ( lastIndex != piece.length )
- addElement( new CKEDITOR.htmlParser.text( piece.substring( lastIndex, piece.length ) ), currentNode );
- }
- } );
- }
- };
-
- // Parse it.
- parser.parse( CKEDITOR.tools.htmlEncode( source ) );
-
- // Close all hanging nodes.
- while ( currentNode.type != CKEDITOR.NODE_DOCUMENT_FRAGMENT ) {
- var parent = currentNode.parent,
- node = currentNode;
-
- addElement( node, parent );
- currentNode = parent;
- }
-
- return fragment;
- };
-
- var BBCodeWriter = CKEDITOR.tools.createClass( {
- $: function() {
- this._ = {
- output: [],
- rules: []
- };
-
- // List and list item.
- this.setRules( 'list', { breakBeforeOpen: 1, breakAfterOpen: 1, breakBeforeClose: 1, breakAfterClose: 1 } );
-
- this.setRules( '*', {
- breakBeforeOpen: 1,
- breakAfterOpen: 0,
- breakBeforeClose: 1,
- breakAfterClose: 0
- } );
-
- this.setRules( 'quote', {
- breakBeforeOpen: 1,
- breakAfterOpen: 0,
- breakBeforeClose: 0,
- breakAfterClose: 1
- } );
- },
-
- proto: {
- //
- // Sets formatting rules for a given tag. The possible rules are:
- //
- // breakBeforeOpen : break line before the opener tag for this element.
- // breakAfterOpen : break line after the opener tag for this element.
- // breakBeforeClose : break line before the closer tag for this element.
- // breakAfterClose : break line after the closer tag for this element.
- //
- //
- // All rules default to "false". Each call to the function overrides
- // already present rules, leaving the undefined untouched.
- //
- // @param {String} tagName The tag name to which set the rules.
- // @param {Object} rules An object containing the element rules.
- // @example
- // // Break line before and after "img" tags.
- // writer.setRules( 'list',
- // {
- // breakBeforeOpen : true
- // breakAfterOpen : true
- // });
- setRules: function( tagName, rules ) {
- var currentRules = this._.rules[ tagName ];
-
- if ( currentRules )
- CKEDITOR.tools.extend( currentRules, rules, true );
- else
- this._.rules[ tagName ] = rules;
- },
-
- getRule: function( tagName, ruleName ) {
- return this._.rules[ tagName ] && this._.rules[ tagName ][ ruleName ];
- },
-
- openTag: function( tag ) {
- if ( tag in bbcodeMap ) {
- if ( this.getRule( tag, 'breakBeforeOpen' ) )
- this.lineBreak( 1 );
-
- this.write( '[', tag );
- }
- },
-
- openTagClose: function( tag ) {
- if ( tag == 'br' )
- this._.output.push( '\n' );
- else if ( tag in bbcodeMap ) {
- this.write( ']' );
- if ( this.getRule( tag, 'breakAfterOpen' ) )
- this.lineBreak( 1 );
- }
- },
-
- attribute: function( name, val ) {
- if ( name == 'option' ) {
- this.write( '=', val );
- }
- },
-
- closeTag: function( tag ) {
- if ( tag in bbcodeMap ) {
- if ( this.getRule( tag, 'breakBeforeClose' ) )
- this.lineBreak( 1 );
-
- tag != '*' && this.write( '[/', tag, ']' );
-
- if ( this.getRule( tag, 'breakAfterClose' ) )
- this.lineBreak( 1 );
- }
- },
-
- text: function( text ) {
- this.write( text );
- },
-
- comment: function() {},
-
- // Output line-break for formatting.
- lineBreak: function() {
- // Avoid line break when:
- // 1) Previous tag already put one.
- // 2) We're at output start.
- if ( !this._.hasLineBreak && this._.output.length ) {
- this.write( '\n' );
- this._.hasLineBreak = 1;
- }
- },
-
- write: function() {
- this._.hasLineBreak = 0;
- var data = Array.prototype.join.call( arguments, '' );
- this._.output.push( data );
- },
-
- reset: function() {
- this._.output = [];
- this._.hasLineBreak = 0;
- },
-
- getHtml: function( reset ) {
- var bbcode = this._.output.join( '' );
-
- if ( reset )
- this.reset();
-
- return decodeHtml( bbcode );
- }
- }
- } );
-
- var writer = new BBCodeWriter();
-
- CKEDITOR.plugins.add( 'bbcode', {
- requires: 'entities',
-
- // Adapt some critical editor configuration for better support
- // of BBCode environment.
- beforeInit: function( editor ) {
- var config = editor.config;
-
- CKEDITOR.tools.extend( config, {
- // This one is for backwards compatibility only as
- // editor#enterMode is already set at this stage (https://dev.ckeditor.com/ticket/11202).
- enterMode: CKEDITOR.ENTER_BR,
- basicEntities: false,
- entities: false,
- fillEmptyBlocks: false
- }, true );
-
- editor.filter.disable();
-
- // Since CKEditor 4.3.0, editor#(active)enterMode is set before
- // beforeInit. Properties got to be updated (https://dev.ckeditor.com/ticket/11202).
- editor.activeEnterMode = editor.enterMode = CKEDITOR.ENTER_BR;
- },
-
- init: function( editor ) {
- var config = editor.config;
-
- function BBCodeToHtml( code ) {
- var fragment = CKEDITOR.htmlParser.fragment.fromBBCode( code ),
- writer = new CKEDITOR.htmlParser.basicWriter();
-
- fragment.writeHtml( writer, bbcodeFilter );
- return writer.getHtml( true );
- }
-
- var bbcodeFilter = new CKEDITOR.htmlParser.filter();
- bbcodeFilter.addRules( {
- elements: {
- blockquote: function( element ) {
- var quoted = new CKEDITOR.htmlParser.element( 'div' );
- quoted.children = element.children;
- element.children = [ quoted ];
- var citeText = element.attributes.cite;
- if ( citeText ) {
- var cite = new CKEDITOR.htmlParser.element( 'cite' );
- cite.add( new CKEDITOR.htmlParser.text( citeText.replace( /^"|"$/g, '' ) ) );
- delete element.attributes.cite;
- element.children.unshift( cite );
- }
- },
- span: function( element ) {
- var bbcode;
- if ( ( bbcode = element.attributes.bbcode ) ) {
- if ( bbcode == 'img' ) {
- element.name = 'img';
- element.attributes.src = element.children[ 0 ].value;
- element.children = [];
- } else if ( bbcode == 'email' ) {
- element.name = 'a';
- element.attributes.href = 'mailto:' + element.children[ 0 ].value;
- }
-
- delete element.attributes.bbcode;
- }
- },
- ol: function( element ) {
- if ( element.attributes.listType ) {
- if ( element.attributes.listType != 'decimal' )
- element.attributes.style = 'list-style-type:' + element.attributes.listType;
- } else {
- element.name = 'ul';
- }
-
- delete element.attributes.listType;
- },
- a: function( element ) {
- if ( !element.attributes.href )
- element.attributes.href = element.children[ 0 ].value;
- },
- smiley: function( element ) {
- element.name = 'img';
-
- var description = element.attributes.desc,
- image = config.smiley_images[ CKEDITOR.tools.indexOf( config.smiley_descriptions, description ) ],
- src = CKEDITOR.tools.htmlEncode( config.smiley_path + image );
-
- element.attributes = {
- src: src,
- 'data-cke-saved-src': src,
- title: description,
- alt: description
- };
- }
- }
- } );
-
- editor.dataProcessor.htmlFilter.addRules( {
- elements: {
- $: function( element ) {
- var attributes = element.attributes,
- style = CKEDITOR.tools.parseCssText( attributes.style, 1 ),
- value;
-
- var tagName = element.name;
- if ( tagName in convertMap )
- tagName = convertMap[ tagName ];
- else if ( tagName == 'span' ) {
- if ( ( value = style.color ) ) {
- tagName = 'color';
- value = CKEDITOR.tools.convertRgbToHex( value );
- } else if ( ( value = style[ 'font-size' ] ) ) {
- var percentValue = value.match( /(\d+)%$/ );
- if ( percentValue ) {
- value = percentValue[ 1 ];
- tagName = 'size';
- }
- }
- } else if ( tagName == 'ol' || tagName == 'ul' ) {
- if ( ( value = style[ 'list-style-type' ] ) ) {
- switch ( value ) {
- case 'lower-alpha':
- value = 'a';
- break;
- case 'upper-alpha':
- value = 'A';
- break;
- }
- } else if ( tagName == 'ol' ) {
- value = 1;
- }
-
- tagName = 'list';
- } else if ( tagName == 'blockquote' ) {
- try {
- var cite = element.children[ 0 ],
- quoted = element.children[ 1 ],
- citeText = cite.name == 'cite' && cite.children[ 0 ].value;
-
- if ( citeText ) {
- value = '"' + citeText + '"';
- element.children = quoted.children;
- }
-
- } catch ( er ) {}
-
- tagName = 'quote';
- } else if ( tagName == 'a' ) {
- if ( ( value = attributes.href ) ) {
- if ( value.indexOf( 'mailto:' ) !== -1 ) {
- tagName = 'email';
- // [email] should have a single text child with email address.
- element.children = [ new CKEDITOR.htmlParser.text( value.replace( 'mailto:', '' ) ) ];
- value = '';
- } else {
- var singleton = element.children.length == 1 && element.children[ 0 ];
- if ( singleton && singleton.type == CKEDITOR.NODE_TEXT && singleton.value == value )
- value = '';
-
- tagName = 'url';
- }
- }
- } else if ( tagName == 'img' ) {
- element.isEmpty = 0;
-
- // Translate smiley (image) to text emotion.
- var src = attributes[ 'data-cke-saved-src' ] || attributes.src,
- alt = attributes.alt;
-
- if ( src && src.indexOf( editor.config.smiley_path ) != -1 && alt )
- return new CKEDITOR.htmlParser.text( smileyMap[ alt ] );
- else
- element.children = [ new CKEDITOR.htmlParser.text( src ) ];
- }
-
- element.name = tagName;
- value && ( element.attributes.option = value );
-
- return null;
- },
-
- div: function( element ) {
- var alignment = CKEDITOR.tools.parseCssText( element.attributes.style, 1 )[ 'text-align' ] || '';
-
- if ( alignment ) {
- element.name = alignment;
- return null;
- }
- },
-
- // Remove any bogus br from the end of a pseudo block,
- // e.g.
- br: function( element ) {
- var next = element.next;
- if ( next && next.name in blockLikeTags )
- return false;
- }
- }
- }, 1 );
-
- editor.dataProcessor.writer = writer;
-
- function onSetData( evt ) {
- var bbcode = evt.data.dataValue;
- evt.data.dataValue = BBCodeToHtml( bbcode );
- }
-
- // Skip the first "setData" call from inline creator, to allow content of
- // HTML to be loaded from the page element.
- if ( editor.elementMode == CKEDITOR.ELEMENT_MODE_INLINE )
- editor.once( 'contentDom', function() {
- editor.on( 'setData', onSetData );
- } );
- else
- editor.on( 'setData', onSetData );
-
- },
-
- afterInit: function( editor ) {
- var filters;
- if ( editor._.elementsPath ) {
- // Eliminate irrelevant elements from displaying, e.g body and p.
- if ( ( filters = editor._.elementsPath.filters ) ) {
- filters.push( function( element ) {
- var htmlName = element.getName(),
- name = tagnameMap[ htmlName ] || false;
-
- // Specialized anchor presents as email.
- if ( name == 'link' && element.getAttribute( 'href' ).indexOf( 'mailto:' ) === 0 )
- name = 'email';
- // Styled span could be either size or color.
- else if ( htmlName == 'span' ) {
- if ( element.getStyle( 'font-size' ) )
- name = 'size';
- else if ( element.getStyle( 'color' ) )
- name = 'color';
- // Styled div could be align
- } else if ( htmlName == 'div' && element.getStyle( 'text-align' ) ) {
- name = element.getStyle( 'text-align' );
- } else if ( name == 'img' ) {
- var src = element.data( 'cke-saved-src' ) || element.getAttribute( 'src' );
- if ( src && src.indexOf( editor.config.smiley_path ) === 0 )
- name = 'smiley';
- }
-
- return name;
- } );
- }
- }
- }
- } );
-
-} )();
diff --git a/public/ckeditor/plugins/bbcode/samples/bbcode.html b/public/ckeditor/plugins/bbcode/samples/bbcode.html
deleted file mode 100644
index be02c212..00000000
--- a/public/ckeditor/plugins/bbcode/samples/bbcode.html
+++ /dev/null
@@ -1,114 +0,0 @@
-
-
-
-
-
- BBCode Plugin — CKEditor Sample
-
-
-
-
-
-
-
-
-
-
-
-
-
- This sample shows how to configure CKEditor to output BBCode format instead of HTML.
- Please note that the editor configuration was modified to reflect what is needed in a BBCode editing environment.
- Smiley images, for example, were stripped to the emoticons that are commonly used in some BBCode dialects.
-
-
- Please note that currently there is no standard for the BBCode markup language, so its implementation
- for different platforms (message boards, blogs etc.) can vary. This means that before using CKEditor to
- output BBCode you may need to adjust the implementation to your own environment.
-
-
- A snippet of the configuration code can be seen below; check the source of this page for
- a full definition:
-
-
-CKEDITOR.replace( 'editor1', {
- extraPlugins: 'bbcode',
- toolbar: [
- [ 'Source', '-', 'Save', 'NewPage', '-', 'Undo', 'Redo' ],
- [ 'Find', 'Replace', '-', 'SelectAll', 'RemoveFormat' ],
- [ 'Link', 'Unlink', 'Image' ],
- '/',
- [ 'FontSize', 'Bold', 'Italic', 'Underline' ],
- [ 'NumberedList', 'BulletedList', '-', 'Blockquote' ],
- [ 'TextColor', '-', 'Smiley', 'SpecialChar', '-', 'Maximize' ]
- ],
- ... some other configurations omitted here
-});
-
-
-
-
-
diff --git a/public/ckeditor/plugins/markdown/dev/bbcode.html b/public/ckeditor/plugins/markdown/dev/bbcode.html
deleted file mode 100644
index bbfb1bca..00000000
--- a/public/ckeditor/plugins/markdown/dev/bbcode.html
+++ /dev/null
@@ -1,168 +0,0 @@
-
-
-
-
-
- BBCode plugin playground – CKEditor Sample
-
-
-
-
-
-
- CKEditor Sample — BBCode plugin playground
-
-
-
-
- This sample shows how to configure CKEditor to output BBCode format instead of HTML.
- Please note that the editor configuration was modified to reflect what is needed in a BBCode editing environment.
- Smiley images, for example, were stripped to the emoticons that are commonly used in some BBCode dialects.
-
-
- Please note that currently there is no standard for the BBCode markup language, so its implementation
- for different platforms (message boards, blogs etc.) can vary. This means that before using CKEditor to
- output BBCode you may need to adjust the implementation to your own environment.
-
-
- A snippet of the configuration code can be seen below; check the source of this page for
- a full definition:
-
-
-CKEDITOR.inline( 'editor1', {
- extraPlugins : 'bbcode',
- (below configurations details omitted:)
- toolbar : ...,
- fontSize_sizes : ...,
- smiley_images : ...,
- smiley_descriptions : ...
-});
-
-
-
-
-[img]http://a.cksource.com/f/1/img/logo-ckeditor.gif[/img]
-"[b]Little Red Riding Hood[/b]" is a famous [url=http://en.wikipedia.org/wiki/Fairy_tale]fairy tale[/url] about a young girl's encounter with a wolf. The story has been changed considerably in its history and subject to numerous modern adaptations and readings.
-[list]
-[*]Chinese: [i]小紅帽[/i]
-[*]Italian: [i]Cappuccetto Rosso[/i]
-[*]Spanish: [i]Caperucita Roja[/i]
-[/list]
-[quote]It is about a girl called [color=#FF0000]Little Red Riding Hood :)[/color], after the red [url=http://en.wikipedia.org/wiki/Hood_%28headgear%29]hooded[/url] [url=http://en.wikipedia.org/wiki/Cape]cape[/url] or [url=http://en.wikipedia.org/wiki/Cloak]cloak[/url] she wears.
-The girl walks through the woods to deliver food to her sick grandmother. A wolf wants to eat the girl but is afraid to do so in public. He approaches the girl, and she naïvely tells him where she is going.
-He suggests the girl pick some flowers, which she does. In the meantime, he goes to the grandmother's house and gains entry by pretending to be the girl. He swallows the grandmother whole, and waits for the girl, disguised as the grandmother. When the girl arrives, she notices he looks very strange to be her grandma. In most retellings, this eventually culminates with Little Red Riding Hood saying, "My, what big teeth you have!"
-To which the wolf replies, "The better to eat you with," and swallows her whole, too.[/quote]
-The above version most widely known today is based on the [url=http://en.wikipedia.org/wiki/Brothers_Grimm]Brothers Grimm[/url] variant.
-
-
-
-
-
-
-
-
diff --git a/public/ckeditor/plugins/markdown/plugin.js b/public/ckeditor/plugins/markdown/plugin.js
index d650cb9b..4f728ab4 100644
--- a/public/ckeditor/plugins/markdown/plugin.js
+++ b/public/ckeditor/plugins/markdown/plugin.js
@@ -1,5 +1,8 @@
/**
- * This software is licensed under MIT License
+ * A markdown output plugin for CKEDITOR.
+ * Uses showdown.js for conversion and DOMPurifier for HTML filtering.
+ *
+ * This software is licensed under MIT License.
*
* Copyright (c) 2019 Jan Böhmer
*
@@ -24,14 +27,15 @@
(function() {
- var unchangedData = null;
-
function overrideDataProcessor(editor)
{
//Both showdown and DOMPurify must be loaded
if(typeof(showdown) == 'undefined') return;
if (typeof(DOMPurify) == 'undefined') return;
+ //If the dataprocessor were already be overriden do nothing
+ if(editor.dataProcessor.markdown) return;
+
var converter = new showdown.Converter();
//Set some useful options on Showdown
converter.setFlavor('github');
@@ -42,25 +46,26 @@
editor.dataProcessor = {
toDataFormat: function(html, fixForBody) {
- html = html.replace(/(\r\n|\n|\r)/gm,"");
+ //html = html.replace(/(\r\n|\n|\r)/gm,"");
html = html.replace(' ', '\n');
- //Support for strikethrough
+ //Support for strikethrough in markdown
html = html.replace('', '').replace(' ', '');
return converter.makeMarkdown(html);
},
- toHtml: function(data) {
- if(unchangedData) {
- data = unchangedData;
- unchangedData = null;
- }
- //Strip html tags from data.
- //This is useful, to convert unsupported HTML feauters to plain text and adds an basic XSS protection
- //The HTML is inside an iframe so an XSS attack can not do much harm.
- data = DOMPurify.sanitize(data);
-
- return tmp = converter.makeHtml(data);
+ toHtml: function(data){
+ //Convert markdown to HTML and remove unsafe things from it.
+ var unsafe = converter.makeHtml(data);
+ return DOMPurify.sanitize(unsafe);
},
+ //Mark this dataprocessor
+ markdown: true
};
+
+ //Set the original data
+ if(editor.markdown_unchangedData) {
+ editor.setData(editor.markdown_unchangedData);
+ editor.markdown_unchangedData = null;
+ }
}
CKEDITOR.plugins.add( 'markdown', {
@@ -129,20 +134,19 @@
var config = editor.config;
var rootPath = this.path;
- //We override the dataprocessor later (after we loaded t
- unchangedData = editor.getData();
+ //We override the dataprocessor later (after we loaded the needes scripts), sow we need the save untouched data now.
+ editor.markdown_unchangedData = editor.getData();
if (typeof(showdown) == 'undefined') {
CKEDITOR.scriptLoader.load(rootPath + 'js/showdown.min.js', function() {
overrideDataProcessor(editor);
- editor.setData(unchangedData);
- });
+ }, CKEDITOR, true);
}
if (typeof(DOMPurify) == 'undefined') {
CKEDITOR.scriptLoader.load(rootPath + 'js/purify.min.js', function() {
- overrideDataProcessor(editor);
- });
+ overrideDataProcessor()
+ }, CKEDITOR, true);
}
},
@@ -151,5 +155,4 @@
overrideDataProcessor(editor);
}
} );
-
} )();
diff --git a/public/ckeditor/plugins/markdown/samples/bbcode.html b/public/ckeditor/plugins/markdown/samples/bbcode.html
deleted file mode 100644
index be02c212..00000000
--- a/public/ckeditor/plugins/markdown/samples/bbcode.html
+++ /dev/null
@@ -1,114 +0,0 @@
-
-
-
-
-
- BBCode Plugin — CKEditor Sample
-
-
-
-
-
-
-
-
-
-
-
-
-
- This sample shows how to configure CKEditor to output BBCode format instead of HTML.
- Please note that the editor configuration was modified to reflect what is needed in a BBCode editing environment.
- Smiley images, for example, were stripped to the emoticons that are commonly used in some BBCode dialects.
-
-
- Please note that currently there is no standard for the BBCode markup language, so its implementation
- for different platforms (message boards, blogs etc.) can vary. This means that before using CKEditor to
- output BBCode you may need to adjust the implementation to your own environment.
-
-
- A snippet of the configuration code can be seen below; check the source of this page for
- a full definition:
-
-
-CKEDITOR.replace( 'editor1', {
- extraPlugins: 'bbcode',
- toolbar: [
- [ 'Source', '-', 'Save', 'NewPage', '-', 'Undo', 'Redo' ],
- [ 'Find', 'Replace', '-', 'SelectAll', 'RemoveFormat' ],
- [ 'Link', 'Unlink', 'Image' ],
- '/',
- [ 'FontSize', 'Bold', 'Italic', 'Underline' ],
- [ 'NumberedList', 'BulletedList', '-', 'Blockquote' ],
- [ 'TextColor', '-', 'Smiley', 'SpecialChar', '-', 'Maximize' ]
- ],
- ... some other configurations omitted here
-});
-
-
-
-
- Editor 1:
-
- This is some [b]sample text[/b]. You are using [url=https://ckeditor.com/]CKEditor[/url].
-
-
-
-
-
-
-
-
-