Parley
view release on metacpan or search on metacpan
root/static/yui/editor/simpleeditor.js view on Meta::CPAN
return null;
}
return this._getDoc().body.innerHTML;
},
/**
* @method show
* @description This method needs to be called if the Editor was hidden (like in a TabView or Panel). It is used to reset the editor after being in a container that was set to display none.
*/
show: function() {
if (this.browser.gecko) {
this._setDesignMode('on');
this.focus();
}
if (this.browser.webkit) {
var self = this;
window.setTimeout(function() {
self._setInitialContent.call(self);
}, 10);
}
//Adding this will close all other Editor window's when showing this one.
if (this.currentWindow) {
this.closeWindow();
}
//Put the iframe back in place
this.get('iframe').setStyle('position', 'static');
this.get('iframe').setStyle('left', '');
},
/**
* @method hide
* @description This method needs to be called if the Editor is to be hidden (like in a TabView or Panel). It should be called to clear timeouts and close open editor windows.
*/
hide: function() {
//Adding this will close all other Editor window's.
if (this.currentWindow) {
this.closeWindow();
}
if (this._fixNodesTimer) {
clearTimeout(this._fixNodesTimer);
this._fixNodesTimer = null;
}
if (this._nodeChangeTimer) {
clearTimeout(this._nodeChangeTimer);
this._nodeChangeTimer = null;
}
this._lastNodeChange = 0;
//Move the iframe off of the screen, so that in containers with visiblity hidden, IE will not cover other elements.
this.get('iframe').setStyle('position', 'absolute');
this.get('iframe').setStyle('left', '-9999px');
},
/**
* @method _cleanIncomingHTML
* @param {String} html The unfiltered HTML
* @description Process the HTML with a few regexes to clean it up and stabilize the input
* @return {String} The filtered HTML
*/
_cleanIncomingHTML: function(html) {
html = html.replace(/<strong([^>]*)>/gi, '<b$1>');
html = html.replace(/<\/strong>/gi, '</b>');
//replace embed before em check
html = html.replace(/<embed([^>]*)>/gi, '<YUI_EMBED$1>');
html = html.replace(/<\/embed>/gi, '</YUI_EMBED>');
html = html.replace(/<em([^>]*)>/gi, '<i$1>');
html = html.replace(/<\/em>/gi, '</i>');
html = html.replace(/_moz_dirty=""/gi, '');
//Put embed tags back in..
html = html.replace(/<YUI_EMBED([^>]*)>/gi, '<embed$1>');
html = html.replace(/<\/YUI_EMBED>/gi, '</embed>');
if (this.get('plainText')) {
html = html.replace(/\n/g, '<br>').replace(/\r/g, '<br>');
html = html.replace(/ /gi, ' '); //Replace all double spaces
html = html.replace(/\t/gi, ' '); //Replace all tabs
}
//Removing Script Tags from the Editor
html = html.replace(/<script([^>]*)>/gi, '<bad>');
html = html.replace(/<\/script([^>]*)>/gi, '</bad>');
html = html.replace(/<script([^>]*)>/gi, '<bad>');
html = html.replace(/<\/script([^>]*)>/gi, '</bad>');
//Replace the line feeds
html = html.replace(/\r\n/g, '<YUI_LF>').replace(/\n/g, '<YUI_LF>').replace(/\r/g, '<YUI_LF>');
//Remove Bad HTML elements (used to be script nodes)
html = html.replace(new RegExp('<bad([^>]*)>(.*?)<\/bad>', 'gi'), '');
//Replace the lines feeds
html = html.replace(/<YUI_LF>/g, '\n');
return html;
},
/**
* @method cleanHTML
* @param {String} html The unfiltered HTML
* @description Process the HTML with a few regexes to clean it up and stabilize the output
* @return {String} The filtered HTML
*/
cleanHTML: function(html) {
//Start Filtering Output
//Begin RegExs..
if (!html) {
html = this.getEditorHTML();
}
var markup = this.get('markup');
//Make some backups...
html = this.pre_filter_linebreaks(html, markup);
//Filter MS Word
html = this.filter_msword(html);
html = html.replace(/<img([^>]*)\/>/gi, '<YUI_IMG$1>');
html = html.replace(/<img([^>]*)>/gi, '<YUI_IMG$1>');
html = html.replace(/<input([^>]*)\/>/gi, '<YUI_INPUT$1>');
html = html.replace(/<input([^>]*)>/gi, '<YUI_INPUT$1>');
html = html.replace(/<ul([^>]*)>/gi, '<YUI_UL$1>');
html = html.replace(/<\/ul>/gi, '<\/YUI_UL>');
html = html.replace(/<blockquote([^>]*)>/gi, '<YUI_BQ$1>');
html = html.replace(/<\/blockquote>/gi, '<\/YUI_BQ>');
html = html.replace(/<embed([^>]*)>/gi, '<YUI_EMBED$1>');
html = html.replace(/<\/embed>/gi, '<\/YUI_EMBED>');
//Convert b and i tags to strong and em tags
if ((markup == 'semantic') || (markup == 'xhtml')) {
html = html.replace(/<i(\s+[^>]*)?>/gi, '<em$1>');
html = html.replace(/<\/i>/gi, '</em>');
html = html.replace(/<b(\s+[^>]*)?>/gi, '<strong$1>');
html = html.replace(/<\/b>/gi, '</strong>');
}
html = html.replace(/_moz_dirty=""/gi, '');
//normalize strikethrough
html = html.replace(/<strike/gi, '<span style="text-decoration: line-through;"');
html = html.replace(/\/strike>/gi, '/span>');
//Case Changing
if (this.browser.ie) {
html = html.replace(/text-decoration/gi, 'text-decoration');
html = html.replace(/font-weight/gi, 'font-weight');
html = html.replace(/_width="([^>]*)"/gi, '');
html = html.replace(/_height="([^>]*)"/gi, '');
//Cleanup Image URL's
var url = this._baseHREF.replace(/\//gi, '\\/'),
re = new RegExp('src="' + url, 'gi');
html = html.replace(re, 'src="');
}
html = html.replace(/<font/gi, '<font');
html = html.replace(/<\/font>/gi, '</font>');
html = html.replace(/<span/gi, '<span');
html = html.replace(/<\/span>/gi, '</span>');
if ((markup == 'semantic') || (markup == 'xhtml') || (markup == 'css')) {
html = html.replace(new RegExp('<font([^>]*)face="([^>]*)">(.*?)<\/font>', 'gi'), '<span $1 style="font-family: $2;">$3</span>');
html = html.replace(/<u/gi, '<span style="text-decoration: underline;"');
if (this.browser.webkit) {
html = html.replace(new RegExp('<span class="Apple-style-span" style="font-weight: bold;">([^>]*)<\/span>', 'gi'), '<strong>$1</strong>');
html = html.replace(new RegExp('<span class="Apple-style-span" style="font-style: italic;">([^>]*)<\/span>', 'gi'), '<em>$1</em>');
}
html = html.replace(/\/u>/gi, '/span>');
if (markup == 'css') {
html = html.replace(/<em([^>]*)>/gi, '<i$1>');
html = html.replace(/<\/em>/gi, '</i>');
html = html.replace(/<strong([^>]*)>/gi, '<b$1>');
html = html.replace(/<\/strong>/gi, '</b>');
html = html.replace(/<b/gi, '<span style="font-weight: bold;"');
html = html.replace(/\/b>/gi, '/span>');
html = html.replace(/<i/gi, '<span style="font-style: italic;"');
html = html.replace(/\/i>/gi, '/span>');
}
html = html.replace(/ /gi, ' '); //Replace all double spaces and replace with a single
} else {
html = html.replace(/<u/gi, '<u');
html = html.replace(/\/u>/gi, '/u>');
}
html = html.replace(/<ol([^>]*)>/gi, '<ol$1>');
html = html.replace(/\/ol>/gi, '/ol>');
html = html.replace(/<li/gi, '<li');
html = html.replace(/\/li>/gi, '/li>');
html = this.filter_safari(html);
html = this.filter_internals(html);
html = this.filter_all_rgb(html);
//Replace our backups with the real thing
html = this.post_filter_linebreaks(html, markup);
if (markup == 'xhtml') {
html = html.replace(/<YUI_IMG([^>]*)>/g, '<img $1 />');
html = html.replace(/<YUI_INPUT([^>]*)>/g, '<input $1 />');
} else {
html = html.replace(/<YUI_IMG([^>]*)>/g, '<img $1>');
html = html.replace(/<YUI_INPUT([^>]*)>/g, '<input $1>');
}
html = html.replace(/<YUI_UL([^>]*)>/g, '<ul$1>');
html = html.replace(/<\/YUI_UL>/g, '<\/ul>');
html = this.filter_invalid_lists(html);
html = html.replace(/<YUI_BQ([^>]*)>/g, '<blockquote$1>');
html = html.replace(/<\/YUI_BQ>/g, '<\/blockquote>');
html = html.replace(/<YUI_EMBED([^>]*)>/g, '<embed$1>');
html = html.replace(/<\/YUI_EMBED>/g, '<\/embed>');
//This should fix &s in URL's
html = html.replace(/ & /gi, 'YUI_AMP');
html = html.replace(/&/gi, '&');
html = html.replace(/YUI_AMP/gi, ' & ');
//Trim the output, removing whitespace from the beginning and end
html = YAHOO.lang.trim(html);
if (this.get('removeLineBreaks')) {
html = html.replace(/\n/g, '').replace(/\r/g, '');
html = html.replace(/ /gi, ' '); //Replace all double spaces and replace with a single
}
//First empty span
if (html.substring(0, 6).toLowerCase() == '<span>') {
html = html.substring(6);
//Last empty span
if (html.substring(html.length - 7, html.length).toLowerCase() == '</span>') {
html = html.substring(0, html.length - 7);
}
}
for (var v in this.invalidHTML) {
if (YAHOO.lang.hasOwnProperty(this.invalidHTML, v)) {
if (Lang.isObject(v) && v.keepContents) {
html = html.replace(new RegExp('<' + v + '([^>]*)>(.*?)<\/' + v + '>', 'gi'), '$1');
} else {
html = html.replace(new RegExp('<' + v + '([^>]*)>(.*?)<\/' + v + '>', 'gi'), '');
}
}
}
this.fireEvent('cleanHTML', { type: 'cleanHTML', target: this, html: html });
return html;
},
/**
* @method filter_msword
* @param String html The HTML string to filter
* @description Filters out msword html attributes and other junk. Activate with filterWord: true in config
*/
filter_msword: function(html) {
if (!this.get('filterWord')) {
return html;
}
//Remove the ms o: tags
html = html.replace(/<o:p>\s*<\/o:p>/g, '');
html = html.replace(/<o:p>[\s\S]*?<\/o:p>/g, ' ');
//Remove the ms w: tags
html = html.replace( /<w:[^>]*>[\s\S]*?<\/w:[^>]*>/gi, '');
//Remove mso-? styles.
html = html.replace( /\s*mso-[^:]+:[^;"]+;?/gi, '');
//Remove more bogus MS styles.
html = html.replace( /\s*MARGIN: 0cm 0cm 0pt\s*;/gi, '');
html = html.replace( /\s*MARGIN: 0cm 0cm 0pt\s*"/gi, "\"");
html = html.replace( /\s*TEXT-INDENT: 0cm\s*;/gi, '');
( run in 1.035 second using v1.01-cache-2.11-cpan-71847e10f99 )