(function() { var trim = $.trim, /** * @param {string} sHtml * @return {string} */ htmlToPlain = function (sHtml) { var sText = '', sQuoteChar = '> ', convertBlockquote = function () { if (arguments && 1 < arguments.length) { var sText = trim(arguments[1]) .replace(/__bq__start__([\s\S\n\r]*)__bq__end__/gm, convertBlockquote) ; sText = '\n' + sQuoteChar + trim(sText).replace(/\n/gm, '\n' + sQuoteChar) + '\n>\n'; return sText.replace(/\n([> ]+)/gm, function () { return (arguments && 1 < arguments.length) ? '\n' + trim(arguments[1].replace(/[\s]/, '')) + ' ' : ''; }); } return ''; }, convertDivs = function () { if (arguments && 1 < arguments.length) { var sText = trim(arguments[1]); if (0 < sText.length) { sText = sText.replace(/]*>([\s\S\r\n]*)<\/div>/gmi, convertDivs); sText = '\n' + trim(sText) + '\n'; } return sText; } return ''; }, fixAttibuteValue = function () { return (arguments && 1 < arguments.length) ? '' + arguments[1] + arguments[2].replace(//g, '>') : ''; }, convertLinks = function () { return (arguments && 1 < arguments.length) ? trim(arguments[1]) : ''; } ; sText = sHtml .replace(/[\s]+/gm, ' ') .replace(/((?:href|data)\s?=\s?)("[^"]+?"|'[^']+?')/gmi, fixAttibuteValue) .replace(//gmi, '\n') .replace(/<\/h\d>/gi, '\n') .replace(/<\/p>/gi, '\n\n') .replace(/<\/li>/gi, '\n') .replace(/<\/td>/gi, '\n') .replace(/<\/tr>/gi, '\n') .replace(/]*>/gmi, '\n_______________________________\n\n') .replace(/]*>/gmi, '') .replace(/]*>([\s\S\r\n]*)<\/div>/gmi, convertDivs) .replace(/]*>/gmi, '\n__bq__start__\n') .replace(/<\/blockquote>/gmi, '\n__bq__end__\n') .replace(/]*>([\s\S\r\n]*?)<\/a>/gmi, convertLinks) .replace(/ /gi, ' ') .replace(/<[^>]*>/gm, '') .replace(/>/gi, '>') .replace(/</gi, '<') .replace(/&/gi, '&') .replace(/&\w{2,6};/gi, '') ; return sText .replace(/\n[ \t]+/gm, '\n') .replace(/[\n]{3,}/gm, '\n\n') .replace(/__bq__start__([\s\S\r\n]*)__bq__end__/gm, convertBlockquote) .replace(/__bq__start__/gm, '') .replace(/__bq__end__/gm, '') ; }, /** * @param {string} sPlain * @return {string} */ plainToHtml = function (sPlain) { return sPlain.toString() .replace(/&/g, '&').replace(/>/g, '>').replace(/'); } ; CKEDITOR.plugins.add('plain', { lang: '', icons: 'plain', hidpi: true, init: function(editor) { if (editor.elementMode === CKEDITOR.ELEMENT_MODE_INLINE) return; 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'); contentsSpace.append(textarea); var editable = editor.editable(new plainEditable(editor, textarea)); editable.setData(editor.getData(1)); editor.__plain = editable; // Having to make