in jspwiki-war/src/main/scripts/wiki-wysiwyg/Source/MooEditable/MooEditable.js [743:859]
cleanup: function(source){
if (!this.options.cleanup) return source.trim();
do {
var oSource = source;
// replace base URL references: ie localize links
if (this.options.baseURL){
source = source.replace('="' + this.options.baseURL, '="');
}
// Webkit cleanup
source = source.replace(/<br class\="webkit-block-placeholder">/gi, "<br />");
source = source.replace(/<span class="Apple-style-span">(.*)<\/span>/gi, '$1');
source = source.replace(/ class="Apple-style-span"/gi, '');
source = source.replace(/<span style="">/gi, '');
// Remove padded paragraphs
source = source.replace(/<p>\s*<br ?\/?>\s*<\/p>/gi, '<p>\u00a0</p>');
source = source.replace(/<p>( |\s)*<\/p>/gi, '<p>\u00a0</p>');
if (!this.options.semantics){
source = source.replace(/\s*<br ?\/?>\s*<\/p>/gi, '</p>');
}
// Replace improper BRs (only if XHTML : true)
if (this.options.xhtml){
source = source.replace(/<br>/gi, "<br />");
}
if (this.options.semantics){
//remove divs from <li>
if (Browser.ie){
source = source.replace(/<li>\s*<div>(.+?)<\/div><\/li>/g, '<li>$1</li>');
}
//remove stupid apple divs
if (Browser.safari || Browser.chrome){
source = source.replace(/^([\w\s]+.*?)<div>/i, '<p>$1</p><div>');
source = source.replace(/<div>(.+?)<\/div>/ig, '<p>$1</p>');
}
//<p> tags around a list will get moved to after the list
if (!Browser.ie){
//not working properly in safari?
source = source.replace(/<p>[\s\n]*(<(?:ul|ol)>.*?<\/(?:ul|ol)>)(.*?)<\/p>/ig, '$1<p>$2</p>');
source = source.replace(/<\/(ol|ul)>\s*(?!<(?:p|ol|ul|img).*?>)((?:<[^>]*>)?\w.*)$/g, '</$1><p>$2</p>');
}
source = source.replace(/<br[^>]*><\/p>/g, '</p>'); // remove <br>'s that end a paragraph here.
source = source.replace(/<p>\s*(<img[^>]+>)\s*<\/p>/ig, '$1\n'); // if a <p> only contains <img>, remove the <p> tags
//format the source
source = source.replace(/<p([^>]*)>(.*?)<\/p>(?!\n)/g, '<p$1>$2</p>\n'); // break after paragraphs
source = source.replace(/<\/(ul|ol|p)>(?!\n)/g, '</$1>\n'); // break after </p></ol></ul> tags
source = source.replace(/><li>/g, '>\n\t<li>'); // break and indent <li>
source = source.replace(/([^\n])<\/(ol|ul)>/g, '$1\n</$2>'); //break before </ol></ul> tags
source = source.replace(/([^\n])<img/ig, '$1\n<img'); // move images to their own line
source = source.replace(/^\s*$/g, ''); // delete empty lines in the source code (not working in opera)
}
// Remove leading and trailing BRs
source = source.replace(/<br ?\/?>$/gi, '');
source = source.replace(/^<br ?\/?>/gi, '');
// Remove useless BRs
if (this.options.paragraphise) source = source.replace(/(h[1-6]|p|div|address|pre|li|ol|ul|blockquote|center|dl|dt|dd)><br ?\/?>/gi, '$1>');
// Remove BRs right before the end of blocks
source = source.replace(/<br ?\/?>\s*<\/(h1|h2|h3|h4|h5|h6|li|p)/gi, '</$1');
// Semantic conversion
source = source.replace(/<span style="font-weight: bold;">(.*)<\/span>/gi, '<strong>$1</strong>');
source = source.replace(/<span style="font-style: italic;">(.*)<\/span>/gi, '<em>$1</em>');
source = source.replace(/<b\b[^>]*>(.*?)<\/b[^>]*>/gi, '<strong>$1</strong>');
source = source.replace(/<i\b[^>]*>(.*?)<\/i[^>]*>/gi, '<em>$1</em>');
source = source.replace(/<u\b[^>]*>(.*?)<\/u[^>]*>/gi, '<span style="text-decoration: underline;">$1</span>');
source = source.replace(/<strong><span style="font-weight: normal;">(.*)<\/span><\/strong>/gi, '$1');
source = source.replace(/<em><span style="font-weight: normal;">(.*)<\/span><\/em>/gi, '$1');
source = source.replace(/<span style="text-decoration: underline;"><span style="font-weight: normal;">(.*)<\/span><\/span>/gi, '$1');
source = source.replace(/<strong style="font-weight: normal;">(.*)<\/strong>/gi, '$1');
source = source.replace(/<em style="font-weight: normal;">(.*)<\/em>/gi, '$1');
// Replace uppercase element names with lowercase
source = source.replace(/<[^> ]*/g, function(match){return match.toLowerCase();});
// Replace uppercase attribute names with lowercase
source = source.replace(/<[^>]*>/g, function(match){
match = match.replace(/ [^=]+=/g, function(match2){return match2.toLowerCase();});
return match;
});
// Put quotes around unquoted attributes
source = source.replace(/<[^!][^>]*>/g, function(match){
match = match.replace(/( [^=]+=)([^"][^ >]*)/g, "$1\"$2\"");
return match;
});
//make img tags xhtml compatible <img>,<img></img> -> <img/>
if (this.options.xhtml){
source = source.replace(/<img([^>]+)(\s*[^\/])>(<\/img>)*/gi, '<img$1$2 />');
}
//remove double <p> tags and empty <p> tags
source = source.replace(/<p>(?:\s*)<p>/g, '<p>');
source = source.replace(/<\/p>\s*<\/p>/g, '</p>');
// Replace <br>s inside <pre> automatically added by some browsers
source = source.replace(/<pre[^>]*>.*?<\/pre>/gi, function(match){
return match.replace(/<br ?\/?>/gi, '\n');
});
// Final trim
source = source.trim();
}
while (source != oSource);
return source;
}