(function() { var selectRange = function (el, start, end) { if (!el) { return; } if (end === undefined) { end = start; } if('selectionStart' in el) { el.selectionStart = start; el.selectionEnd = end; } else if(el.setSelectionRange) { el.setSelectionRange(start, end); } else if(el.createTextRange) { var range = el.createTextRange(); range.collapse(true); range.moveEnd('character', end); range.moveStart('character', start); range.select(); } }, toTop = function (el) { selectRange(el, 0); if (el) { el.scrollTop = 0; } } ; CKEDITOR.plugins.add('plain', { lang: '', icons: 'plain', hidpi: true, init: function(editor) { if (editor.elementMode === CKEDITOR.ELEMENT_MODE_INLINE) { return; } editor.__textUtils = { plainToHtml: data => rl.Utils.plainToHtml(data, true), htmlToPlain: data => rl.Utils.htmlToPlain(data, true) }; var plain = CKEDITOR.plugins.plain; editor.addMode('plain', function(callback) { var contentsSpace = editor.ui.space('contents'), textarea = contentsSpace.getDocument().createElement('textarea') ; textarea.setStyles( CKEDITOR.tools.extend({ width: CKEDITOR.env.ie7Compat ? '99%' : '100%', height: '100%', resize: 'none', outline: 'none', 'text-align': 'left' }, CKEDITOR.tools.cssVendorPrefix('tab-size', 4))) ; textarea.setAttribute('dir', 'ltr'); textarea.addClass('cke_plain'); CKEDITOR.plugins.clipboard.preventDefaultDropOnElement(textarea); contentsSpace.append(textarea); var editable = editor.editable(new plainEditable(editor, textarea)); editable.setData(editor.getData(1)); editor.__plain = editable; editor.__textarea = textarea.$; if (CKEDITOR.env.ie) { editable.attachListener(editor, 'resize', onResize, editable); editable.attachListener(CKEDITOR.document.getWindow(), 'resize', onResize, editable); CKEDITOR.tools.setTimeout(onResize, 0, editable); } editor.fire('ariaWidget', this); callback(); }); editor.addCommand('plain', plain.commands.plain); if (editor.ui.addButton) { editor.ui.addButton('plain', { label: window.rl && window.rl.i18n ? window.rl.i18n('EDITOR/TEXT_SWITCHER_PLAINT_TEXT') : 'Plain', command: 'plain', toolbar: 'spec,10' }); } editor.on('mode', function() { editor.getCommand('plain').setState(editor.mode === 'plain' ? CKEDITOR.TRISTATE_ON : CKEDITOR.TRISTATE_OFF); editor.editable().addClass('cke_enable_context_menu'); editor.focus(); if (editor.mode === 'plain') { toTop(editor.__textarea); } }); function onResize() { this.hide(); this.setStyle('height', this.getParent().$.clientHeight + 'px'); this.setStyle('width', this.getParent().$.clientWidth + 'px'); this.show(); } } }); var plainEditable = CKEDITOR.tools.createClass({ base: CKEDITOR.editable, proto: { setData: function(data) { this.setValue(this.editor.__textUtils.htmlToPlain(data)); this.editor.fire('dataReady'); }, setRawData: function(data) { this.setValue(data); this.editor.fire('dataReady'); }, getData: function() { return this.editor.__textUtils.plainToHtml(this.getValue()); }, getRawData: function() { return this.getValue(); }, insertHtml: function() {}, insertElement: function() {}, insertText: function() {}, setReadOnly: function( isReadOnly ) { this[(isReadOnly ? 'set' : 'remove') + 'Attribute' ]('readOnly', 'readonly'); }, detach: function() { plainEditable.baseProto.detach.call( this ); this.clearCustomData(); this.remove(); } } }); CKEDITOR.plugins.plain = { commands: { plain: { modes: { wysiwyg: 1, plain: 1 }, editorFocus: true, readOnly: false, exec: function(editor) { if (editor.mode === 'wysiwyg') { editor.fire('saveSnapshot'); } editor.getCommand('plain').setState(CKEDITOR.TRISTATE_DISABLED); editor.setMode(editor.mode === 'plain' ? 'wysiwyg' : 'plain'); }, canUndo: false } } }; }());