JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
942c1555f78770e5710689117aec80b5bb7572a2
[ckeditor.git] / plugins / htmldataprocessor / plugin.js
1 /*\r
2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.\r
3 For licensing, see LICENSE.html or http://ckeditor.com/license\r
4 */\r
5 \r
6 (function(){var a=/^[\t\r\n ]*(?:&nbsp;|\xa0)$/,b='{cke_protected}';function c(A,B){var C=A.children,D=C[C.length-1];if(D){if((B||!CKEDITOR.env.ie)&&(D.type==CKEDITOR.NODE_ELEMENT&&D.name=='br'))C.pop();if(D.type==CKEDITOR.NODE_TEXT&&a.test(D.value))C.pop();}};function d(A){if(A.children.length<1)return true;var B=A.children[A.children.length-1];return B.type==CKEDITOR.NODE_ELEMENT&&B.name=='br';};function e(A){c(A,true);if(d(A))if(CKEDITOR.env.ie)A.add(new CKEDITOR.htmlParser.text('\xa0'));else A.add(new CKEDITOR.htmlParser.element('br',{}));};function f(A){c(A);if(d(A))A.add(new CKEDITOR.htmlParser.text('\xa0'));};var g=CKEDITOR.dtd,h=CKEDITOR.tools.extend({},g.$block,g.$listItem,g.$tableContent);for(var i in h)if(!('br' in g[i]))delete h[i];delete h.pre;var j={attributeNames:[[/^on/,'_cke_pa_on']]},k={elements:{}};for(i in h)k.elements[i]=e;var l={elementNames:[[/^cke:/,''],[/^\?xml:namespace$/,'']],attributeNames:[[/^_cke_(saved|pa)_/,''],[/^_cke.*/,'']],elements:{$:function(A){var B=A.attributes;if(B){var C=['name','href','src'],D;for(var E=0;E<C.length;E++){D='_cke_saved_'+C[E];D in B&&delete B[C[E]];}}},embed:function(A){var B=A.parent;if(B&&B.name=='object'){var C=B.attributes.width,D=B.attributes.height;C&&(A.attributes.width=C);D&&(A.attributes.height=D);}},param:function(A){A.children=[];A.isEmpty=true;return A;},a:function(A){if(!(A.children.length||A.attributes.name||A.attributes._cke_saved_name))return false;}},attributes:{'class':function(A,B){return CKEDITOR.tools.ltrim(A.replace(/(?:^|\s+)cke_[^\s]*/g,''))||false;}},comment:function(A){if(A.substr(0,b.length)==b)return new CKEDITOR.htmlParser.cdata(decodeURIComponent(A.substr(b.length)));return A;}},m={elements:{}};for(i in h)m.elements[i]=f;if(CKEDITOR.env.ie)l.attributes.style=function(A,B){return A.toLowerCase();};var n=/<(?:a|area|img|input).*?\s((?:href|src|name)\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|(?:[^ "'>]+)))/gi;function o(A){return A.replace(n,'$& _cke_saved_$1');};var p=/<(style)(?=[ >])[^>]*>[^<]*<\/\1>/gi,q=/<cke:encoded>([^<]*)<\/cke:encoded>/gi,r=/(<\/?)((?:object|embed|param).*?>)/gi,s=/<cke:param(.*?)\/>/gi;function t(A){return '<cke:encoded>'+encodeURIComponent(A)+'</cke:encoded>';};function u(A){return A.replace(p,t);};function v(A){return A.replace(r,'$1cke:$2');};function w(A){return A.replace(s,'<cke:param$1></cke:param>');};function x(A,B){return decodeURIComponent(B);};function y(A){return A.replace(q,x);};function z(A,B){var C=[],D=/<\!--\{cke_temp\}(\d*?)-->/g,E=[/<!--[\s\S]*?-->/g,/<script[\s\S]*?<\/script>/gi,/<noscript[\s\S]*?<\/noscript>/gi].concat(B);\r
7 for(var F=0;F<E.length;F++)A=A.replace(E[F],function(G){G=G.replace(D,function(H,I){return C[I];});return '<!--{cke_temp}'+(C.push(G)-1)+'-->';});A=A.replace(D,function(G,H){return '<!--'+b+encodeURIComponent(C[H]).replace(/--/g,'%2D%2D')+'-->';});return A;};CKEDITOR.plugins.add('htmldataprocessor',{requires:['htmlwriter'],init:function(A){var B=A.dataProcessor=new CKEDITOR.htmlDataProcessor(A);B.writer.forceSimpleAmpersand=A.config.forceSimpleAmpersand;B.dataFilter.addRules(j);B.dataFilter.addRules(k);B.htmlFilter.addRules(l);B.htmlFilter.addRules(m);}});CKEDITOR.htmlDataProcessor=function(A){var B=this;B.editor=A;B.writer=new CKEDITOR.htmlWriter();B.dataFilter=new CKEDITOR.htmlParser.filter();B.htmlFilter=new CKEDITOR.htmlParser.filter();};CKEDITOR.htmlDataProcessor.prototype={toHtml:function(A,B){A=z(A,this.editor.config.protectedSource);A=o(A);if(CKEDITOR.env.ie)A=u(A);A=v(A);A=w(A);var C=document.createElement('div');C.innerHTML='a'+A;A=C.innerHTML.substr(1);if(CKEDITOR.env.ie)A=y(A);var D=CKEDITOR.htmlParser.fragment.fromHtml(A,B),E=new CKEDITOR.htmlParser.basicWriter();D.writeHtml(E,this.dataFilter);return E.getHtml(true);},toDataFormat:function(A,B){var C=this.writer,D=CKEDITOR.htmlParser.fragment.fromHtml(A,B);C.reset();D.writeHtml(C,this.htmlFilter);return C.getHtml(true);}};})();CKEDITOR.config.forceSimpleAmpersand=false;\r