( 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 () { if (arguments && 1 < arguments.length) { return '' + arguments[1] + arguments[2].replace(//g, '>'); } return ''; }, 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: false, init: function(editor) { // Source mode isn't available in inline mode yet. 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( { // IE7 has overflow the