| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115 |
- ///import core
- ///commands 定制过滤规则
- ///commandsName Serialize
- ///commandsTitle 定制过滤规则
- UE.plugins['serialize'] = function () {
- var ie = browser.ie,
- version = browser.version;
- function ptToPx(value){
- return /pt/.test(value) ? value.replace( /([\d.]+)pt/g, function( str ) {
- return Math.round(parseFloat(str) * 96 / 72) + "px";
- } ) : value;
- }
- var me = this, autoClearEmptyNode = me.options.autoClearEmptyNode,
- EMPTY_TAG = dtd.$empty,
- parseHTML = function () {
- //干掉<a> 后便变得空格,保留</a> 这样的空格
- var RE_PART = /<(?:(?:\/([^>]+)>)|(?:!--([\S|\s]*?)-->)|(?:([^\s\/>]+)\s*((?:(?:"[^"]*")|(?:'[^']*')|[^"'<>])*)\/?>))/g,
- RE_ATTR = /([\w\-:.]+)(?:(?:\s*=\s*(?:(?:"([^"]*)")|(?:'([^']*)')|([^\s>]+)))|(?=\s|$))/g,
- EMPTY_ATTR = {checked:1,compact:1,declare:1,defer:1,disabled:1,ismap:1,multiple:1,nohref:1,noresize:1,noshade:1,nowrap:1,readonly:1,selected:1},
- CDATA_TAG = {script:1,style: 1},
- NEED_PARENT_TAG = {
- "li": { "$": 'ul', "ul": 1, "ol": 1 },
- "dd": { "$": "dl", "dl": 1 },
- "dt": { "$": "dl", "dl": 1 },
- "option": { "$": "select", "select": 1 },
- "td": { "$": "tr", "tr": 1 },
- "th": { "$": "tr", "tr": 1 },
- "tr": { "$": "tbody", "tbody": 1, "thead": 1, "tfoot": 1, "table": 1 },
- "tbody": { "$": "table", 'table':1,"colgroup": 1 },
- "thead": { "$": "table", "table": 1 },
- "tfoot": { "$": "table", "table": 1 },
- "col": { "$": "colgroup","colgroup":1 }
- };
- var NEED_CHILD_TAG = {
- "table": "td", "tbody": "td", "thead": "td", "tfoot": "td", "tr": "td",
- "colgroup": "col",
- "ul": "li", "ol": "li",
- "dl": "dd",
- "select": "option"
- };
- function parse( html, callbacks ) {
- var match,
- nextIndex = 0,
- tagName,
- cdata;
- RE_PART.exec( "" );
- while ( (match = RE_PART.exec( html )) ) {
- var tagIndex = match.index;
- if ( tagIndex > nextIndex ) {
- var text = html.slice( nextIndex, tagIndex );
- if ( cdata ) {
- cdata.push( text );
- } else {
- callbacks.onText( text );
- }
- }
- nextIndex = RE_PART.lastIndex;
- if ( (tagName = match[1]) ) {
- tagName = tagName.toLowerCase();
- if ( cdata && tagName == cdata._tag_name ) {
- callbacks.onCDATA( cdata.join( '' ) );
- cdata = null;
- }
- if ( !cdata ) {
- callbacks.onTagClose( tagName );
- continue;
- }
- }
- if ( cdata ) {
- cdata.push( match[0] );
- continue;
- }
- if ( (tagName = match[3]) ) {
- if ( /="/.test( tagName ) ) {
- continue;
- }
- tagName = tagName.toLowerCase();
- var attrPart = match[4],
- attrMatch,
- attrMap = {},
- selfClosing = attrPart && attrPart.slice( -1 ) == '/';
- if ( attrPart ) {
- RE_ATTR.exec( "" );
- while ( (attrMatch = RE_ATTR.exec( attrPart )) ) {
- var attrName = attrMatch[1].toLowerCase(),
- attrValue = attrMatch[2] || attrMatch[3] || attrMatch[4] || '';
- if ( !attrValue && EMPTY_ATTR[attrName] ) {
- attrValue = attrName;
- }
- if ( attrName == 'style' ) {
- if ( ie && version <= 6 ) {
- attrValue = attrValue.replace( /(?!;)\s*([\w-]+):/g, function ( m, p1 ) {
- return p1.toLowerCase() + ':';
- } );
- }
- }
- //没有值的属性不添加
- if ( attrValue ) {
- attrMap[attrName] = attrValue.replace( /:\s*/g, ':' )
- }
- }
- }
- callbacks.onTagOpen( tagName, attrMap, selfClosing );
- if ( !cdata && CDATA_TAG[tagName] ) {
- cdata = [];
- cdata._tag_name = tagName;
- }
- continue;
- }
- if ( (tagName = match[2]) ) {
- callbacks.onComment( tagName );
- }
- }
- if ( html.length > nextIndex ) {
- callbacks.onText( html.slice( nextIndex, html.length ) );
- }
- }
- return function ( html, forceDtd ) {
- var fragment = {
- type: 'fragment',
- parent: null,
- children: []
- };
- var currentNode = fragment;
- function addChild( node ) {
- node.parent = currentNode;
- currentNode.children.push( node );
- }
- function addElement( element, open ) {
- var node = element;
- // 遇到结构化标签的时候
- if ( NEED_PARENT_TAG[node.tag] ) {
- // 考虑这种情况的时候, 结束之前的标签
- // e.g. <table><tr><td>12312`<tr>`4566
- while ( NEED_PARENT_TAG[currentNode.tag] && NEED_PARENT_TAG[currentNode.tag][node.tag] ) {
- currentNode = currentNode.parent;
- }
- // 如果前一个标签和这个标签是同一级, 结束之前的标签
- // e.g. <ul><li>123<li>
- if ( currentNode.tag == node.tag ) {
- currentNode = currentNode.parent;
- }
- // 向上补齐父标签
- while ( NEED_PARENT_TAG[node.tag] ) {
- if ( NEED_PARENT_TAG[node.tag][currentNode.tag] ) break;
- node = node.parent = {
- type: 'element',
- tag: NEED_PARENT_TAG[node.tag]['$'],
- attributes: {},
- children: [node]
- };
- }
- }
- if ( forceDtd ) {
- // 如果遇到这个标签不能放在前一个标签内部,则结束前一个标签,span单独处理
- while ( dtd[node.tag] && !(currentNode.tag == 'span' ? utils.extend( dtd['strong'], {'a':1,'A':1} ) : (dtd[currentNode.tag] || dtd['div']))[node.tag] ) {
- if ( tagEnd( currentNode ) ) continue;
- if ( !currentNode.parent ) break;
- currentNode = currentNode.parent;
- }
- }
- node.parent = currentNode;
- currentNode.children.push( node );
- if ( open ) {
- currentNode = element;
- }
- if ( element.attributes.style ) {
- element.attributes.style = element.attributes.style.toLowerCase();
- }
- return element;
- }
- // 结束一个标签的时候,需要判断一下它是否缺少子标签
- // e.g. <table></table>
- function tagEnd( node ) {
- var needTag;
- if ( !node.children.length && (needTag = NEED_CHILD_TAG[node.tag]) ) {
- addElement( {
- type: 'element',
- tag: needTag,
- attributes: {},
- children: []
- }, true );
- return true;
- }
- return false;
- }
- parse( html, {
- onText: function ( text ) {
- while ( !(dtd[currentNode.tag] || dtd['div'])['#'] ) {
- //节点之间的空白不能当作节点处理
- // if(/^[ \t\r\n]+$/.test( text )){
- // return;
- // }
- if ( tagEnd( currentNode ) ) continue;
- currentNode = currentNode.parent;
- }
- //if(/^[ \t\n\r]*/.test(text))
- addChild( {
- type: 'text',
- data: text
- } );
- },
- onComment: function ( text ) {
- addChild( {
- type: 'comment',
- data: text
- } );
- },
- onCDATA: function ( text ) {
- while ( !(dtd[currentNode.tag] || dtd['div'])['#'] ) {
- if ( tagEnd( currentNode ) ) continue;
- currentNode = currentNode.parent;
- }
- addChild( {
- type: 'cdata',
- data: text
- } );
- },
- onTagOpen: function ( tag, attrs, closed ) {
- closed = closed || EMPTY_TAG[tag] ;
- addElement( {
- type: 'element',
- tag: tag,
- attributes: attrs,
- closed: closed,
- children: []
- }, !closed );
- },
- onTagClose: function ( tag ) {
- var node = currentNode;
- // 向上找匹配的标签, 这里不考虑dtd的情况是因为tagOpen的时候已经处理过了, 这里不会遇到
- while ( node && tag != node.tag ) {
- node = node.parent;
- }
- if ( node ) {
- // 关闭中间的标签
- for ( var tnode = currentNode; tnode !== node.parent; tnode = tnode.parent ) {
- tagEnd( tnode );
- }
- //去掉空白的inline节点
- //分页,锚点保留
- //|| dtd.$removeEmptyBlock[node.tag])
- // if ( !node.children.length && dtd.$removeEmpty[node.tag] && !node.attributes.anchorname && node.attributes['class'] != 'pagebreak' && node.tag != 'a') {
- //
- // node.parent.children.pop();
- // }
- currentNode = node.parent;
- } else {
- // 如果没有找到开始标签, 则创建新标签
- // eg. </div> => <div></div>
- //针对视屏网站embed会给结束符,这里特殊处理一下
- if ( !(dtd.$removeEmpty[tag] || dtd.$removeEmptyBlock[tag] || tag == 'embed') ) {
- node = {
- type: 'element',
- tag: tag,
- attributes: {},
- children: []
- };
- addElement( node, true );
- tagEnd( node );
- currentNode = node.parent;
- }
- }
- }
- } );
- // 处理这种情况, 只有开始标签没有结束标签的情况, 需要关闭开始标签
- // eg. <table>
- while ( currentNode !== fragment ) {
- tagEnd( currentNode );
- currentNode = currentNode.parent;
- }
- return fragment;
- };
- }();
- var unhtml1 = function () {
- var map = { '<': '<', '>': '>', '"': '"', "'": ''' };
- function rep( m ) {
- return map[m];
- }
- return function ( str ) {
- str = str + '';
- return str ? str.replace( /[<>"']/g, rep ) : '';
- };
- }();
- var toHTML = function () {
- function printChildren( node, pasteplain ) {
- var children = node.children;
- var buff = [];
- for ( var i = 0,ci; ci = children[i]; i++ ) {
- buff.push( toHTML( ci, pasteplain ) );
- }
- return buff.join( '' );
- }
- function printAttrs( attrs ) {
- var buff = [];
- for ( var k in attrs ) {
- var value = attrs[k];
-
- if(k == 'style'){
- //pt==>px
- value = ptToPx(value);
- //color rgb ==> hex
- if(/rgba?\s*\([^)]*\)/.test(value)){
- value = value.replace( /rgba?\s*\(([^)]*)\)/g, function( str ) {
- return utils.fixColor('color',str);
- } )
- }
- //过滤掉所有的white-space,在纯文本编辑器里粘贴过来的内容,到chrome中会带有span和white-space属性,导致出现不能折行的情况
- //所以在这里去掉这个属性
- attrs[k] = utils.optCss(value.replace(/windowtext/g,'#000'))
- .replace(/white-space[^;]+;/g,'');
- }
- buff.push( k + '="' + unhtml1( attrs[k] ) + '"' );
- }
- return buff.join( ' ' )
- }
- function printData( node, notTrans ) {
- //trace:1399 输入html代码时空格转换成为
- //node.data.replace(/ /g,' ') 针对pre中的空格和出现的 把他们在得到的html代码中都转换成为空格,为了在源码模式下显示为空格而不是
- return notTrans ? node.data.replace(/ /g,' ') : unhtml1( node.data ).replace(/ /g,' ');
- }
- //纯文本模式下标签转换
- var transHtml = {
- 'div':'p',
- 'li':'p',
- 'tr':'p',
- 'br':'br',
- 'p':'p'//trace:1398 碰到p标签自己要加上p,否则transHtml[tag]是undefined
- };
- function printElement( node, pasteplain ) {
- if ( node.type == 'element' && !node.children.length && (dtd.$removeEmpty[node.tag]) && node.tag != 'a' && utils.isEmptyObject(node.attributes) && autoClearEmptyNode) {// 锚点保留
- return html;
- }
- var tag = node.tag;
- if ( pasteplain && tag == 'td' ) {
- if ( !html ) html = '';
- html += printChildren( node, pasteplain ) + ' ';
- } else {
- var attrs = printAttrs( node.attributes );
- var html = '<' + (pasteplain && transHtml[tag] ? transHtml[tag] : tag) + (attrs ? ' ' + attrs : '') + (EMPTY_TAG[tag] ? ' />' : '>');
- if ( !EMPTY_TAG[tag] ) {
- //trace:1627 ,2070
- //p标签为空,将不占位这里占位符不起作用,用 或者br
- if( tag == 'p' && !node.children.length){
- html += browser.ie ? ' ' : '<br/>';
- }
- html += printChildren( node, pasteplain );
- html += '</' + (pasteplain && transHtml[tag] ? transHtml[tag] : tag) + '>';
- }
- }
- return html;
- }
- return function ( node, pasteplain ) {
- if ( node.type == 'fragment' ) {
- return printChildren( node, pasteplain );
- } else if ( node.type == 'element' ) {
- return printElement( node, pasteplain );
- } else if ( node.type == 'text' || node.type == 'cdata' ) {
- return printData( node, dtd.$notTransContent[node.parent.tag] );
- } else if ( node.type == 'comment' ) {
- return '<!--' + node.data + '-->';
- }
- return '';
- };
- }();
- //过滤word
- var transformWordHtml = function () {
- function isWordDocument( strValue ) {
- var re = new RegExp( /(class="?Mso|style="[^"]*\bmso\-|w:WordDocument|<v:)/ig );
- return re.test( strValue );
- }
- function ensureUnits( v ) {
- v = v.replace( /([\d.]+)([\w]+)?/g, function ( m, p1, p2 ) {
- return (Math.round( parseFloat( p1 ) ) || 1) + (p2 || 'px');
- } );
- return v;
- }
- function filterPasteWord( str ) {
- str = str.replace( /<!--\s*EndFragment\s*-->[\s\S]*$/, '' )
- //remove link break
- .replace( /^(\r\n|\n|\r)|(\r\n|\n|\r)$/ig, "" )
- //remove entities at the start of contents
- .replace( /^\s*( )+/ig, "" )
- //remove entities at the end of contents
- .replace( /( |<br[^>]*>)+\s*$/ig, "" )
- // Word comments like conditional comments etc
- .replace( /<!--[\s\S]*?-->/ig, "" )
- //转换图片
- .replace(/<v:shape [^>]*>[\s\S]*?.<\/v:shape>/gi,function(str){
- try{
- var width = str.match(/width:([ \d.]*p[tx])/i)[1],
- height = str.match(/height:([ \d.]*p[tx])/i)[1],
- src = str.match(/src=\s*"([^"]*)"/i)[1];
- return '<img width="'+ptToPx(width)+'" height="'+ptToPx(height)+'" src="' + src + '" />'
- } catch(e){
- return '';
- }
- })
- //去掉多余的属性
- .replace( /v:\w+=["']?[^'"]+["']?/g, '' )
- // Remove comments, scripts (e.g., msoShowComment), XML tag, VML content, MS Office namespaced tags, and a few other tags
- .replace( /<(!|script[^>]*>.*?<\/script(?=[>\s])|\/?(\?xml(:\w+)?|xml|meta|link|style|\w+:\w+)(?=[\s\/>]))[^>]*>/gi, "" )
- //convert word headers to strong
- .replace( /<p [^>]*class="?MsoHeading"?[^>]*>(.*?)<\/p>/gi, "<p><strong>$1</strong></p>" )
- //remove lang attribute
- .replace( /(lang)\s*=\s*([\'\"]?)[\w-]+\2/ig, "" )
- //清除多余的font不能匹配 有可能是空格
- .replace( /<font[^>]*>\s*<\/font>/gi, '' )
- //清除多余的class
- .replace( /class\s*=\s*["']?(?:(?:MsoTableGrid)|(?:MsoListParagraph)|(?:MsoNormal(Table)?))\s*["']?/gi, '' );
- // Examine all styles: delete junk, transform some, and keep the rest
- //修复了原有的问题, 比如style='fontsize:"宋体"'原来的匹配失效了
- str = str.replace( /(<[a-z][^>]*)\sstyle=(["'])([^\2]*?)\2/gi, function( str, tag, tmp, style ) {
- var n = [],
- i = 0,
- s = style.replace( /^\s+|\s+$/, '' ).replace( /"/gi, "'" ).split( /;\s*/g );
- // Examine each style definition within the tag's style attribute
- for ( var i = 0; i < s.length; i++ ) {
- var v = s[i];
- var name, value,
- parts = v.split( ":" );
- if ( parts.length == 2 ) {
- name = parts[0].toLowerCase();
- value = parts[1].toLowerCase();
- // Translate certain MS Office styles into their CSS equivalents
- switch ( name ) {
- case "mso-padding-alt":
- case "mso-padding-top-alt":
- case "mso-padding-right-alt":
- case "mso-padding-bottom-alt":
- case "mso-padding-left-alt":
- case "mso-margin-alt":
- case "mso-margin-top-alt":
- case "mso-margin-right-alt":
- case "mso-margin-bottom-alt":
- case "mso-margin-left-alt":
- //ie下会出现挤到一起的情况
- // case "mso-table-layout-alt":
- case "mso-height":
- case "mso-width":
- case "mso-vertical-align-alt":
- //trace:1819 ff下会解析出padding在table上
- if(!/<table/.test(tag))
- n[i] = name.replace( /^mso-|-alt$/g, "" ) + ":" + ensureUnits( value );
- continue;
- case "horiz-align":
- n[i] = "text-align:" + value;
- continue;
- case "vert-align":
- n[i] = "vertical-align:" + value;
- continue;
- case "font-color":
- case "mso-foreground":
- n[i] = "color:" + value;
- continue;
- case "mso-background":
- case "mso-highlight":
- n[i] = "background:" + value;
- continue;
- case "mso-default-height":
- n[i] = "min-height:" + ensureUnits( value );
- continue;
- case "mso-default-width":
- n[i] = "min-width:" + ensureUnits( value );
- continue;
- case "mso-padding-between-alt":
- n[i] = "border-collapse:separate;border-spacing:" + ensureUnits( value );
- continue;
- case "text-line-through":
- if ( (value == "single") || (value == "double") ) {
- n[i] = "text-decoration:line-through";
- }
- continue;
- //trace:1870
- // //word里边的字体统一干掉
- // case 'font-family':
- // continue;
- case "mso-zero-height":
- if ( value == "yes" ) {
- n[i] = "display:none";
- }
- continue;
- case 'margin':
- if ( !/[1-9]/.test( parts[1] ) ) {
- continue;
- }
- }
- if ( /^(mso|column|font-emph|lang|layout|line-break|list-image|nav|panose|punct|row|ruby|sep|size|src|tab-|table-border|text-(?:decor|trans)|top-bar|version|vnd|word-break)/.test( name ) ) {
- // if ( !/mso\-list/.test( name ) )
- continue;
- }
- if(/text\-indent|padding|margin/.test(name) && /\-[\d.]+/.test(value)){
- continue;
- }
- n[i] = name + ":" + parts[1]; // Lower-case name, but keep value case
- }
- }
- // If style attribute contained any valid styles the re-write it; otherwise delete style attribute.
- if ( i > 0 ) {
- return tag + ' style="' + n.join( ';' ) + '"';
- } else {
- return tag;
- }
- } );
- str = str.replace( /([ ]+)<\/span>/ig, function ( m, p ) {
- return new Array( p.length + 1 ).join( ' ' ) + '</span>';
- } );
- return str;
- }
- return function ( html ) {
- //过了word,才能转p->li
- first = null;
- parentTag = '',liStyle = '',firstTag = '';
- if ( isWordDocument( html ) ) {
- html = filterPasteWord( html );
- }
- return html.replace( />[ \t\r\n]*</g, '><' );
- };
- }();
- var NODE_NAME_MAP = {
- 'text': '#text',
- 'comment': '#comment',
- 'cdata': '#cdata-section',
- 'fragment': '#document-fragment'
- };
- // function _likeLi( node ) {
- // var a;
- // if ( node && node.tag == 'p' ) {
- // //office 2011下有效
- // if ( node.attributes['class'] == 'MsoListParagraph' || /mso-list/.test( node.attributes.style ) ) {
- // a = 1;
- // } else {
- // var firstChild = node.children[0];
- // if ( firstChild && firstChild.tag == 'span' && /Wingdings/i.test( firstChild.attributes.style ) ) {
- // a = 1;
- // }
- // }
- // }
- // return a;
- // }
- //为p==>li 做个标志
- var first,
- // orderStyle = {
- // 'decimal' : /\d+/,
- // 'lower-roman': /^m{0,4}(cm|cd|d?c{0,3})(xc|xl|l?x{0,3})(ix|iv|v?i{0,3})$/,
- // 'upper-roman': /^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$/,
- // 'lower-alpha' : /^\(?[a-z]+\)?$/,
- // 'upper-alpha': /^\(?[A-Z]+\)?$/
- // },
- // unorderStyle = { 'disc' : /^[l\u00B7\u2002]/, 'circle' : /^[\u006F\u00D8]/,'square' : /^[\u006E\u25C6]/},
- parentTag = '',liStyle = '',firstTag;
- //写入编辑器时,调用,进行转换操作
- function transNode( node, word_img_flag ) {
- var sizeMap = [0, 10, 12, 16, 18, 24, 32, 48],
- attr,
- indexOf = utils.indexOf;
- switch ( node.tag ) {
- case 'script':
- node.tag = 'div';
- node.attributes._ue_div_script = 1;
- node.attributes._ue_script_data = node.children[0] ? encodeURIComponent(node.children[0].data) : '';
- node.children = [];
- break;
- case 'img':
- //todo base64暂时去掉,后边做远程图片上传后,干掉这个
- if(node.attributes.src && /^data:/.test(node.attributes.src)){
- return {
- type : 'fragment',
- children:[]
- }
- }
- if ( node.attributes.src && /^(?:file)/.test( node.attributes.src ) ) {
- if ( !/(gif|bmp|png|jpg|jpeg)$/.test( node.attributes.src ) ) {
- return {
- type : 'fragment',
- children:[]
- }
- }
- node.attributes.word_img = node.attributes.src;
- node.attributes.src = me.options.UEDITOR_HOME_URL + 'themes/default/images/spacer.gif';
- var flag = parseInt(node.attributes.width)<128||parseInt(node.attributes.height)<43;
- node.attributes.style="background:url(" + me.options.UEDITOR_HOME_URL +"themes/default/images/"+(flag?"word.gif":"localimage.png")+") no-repeat center center;border:1px solid #ddd";
- //node.attributes.style = 'width:395px;height:173px;';
- word_img_flag && (word_img_flag.flag = 1);
- }
- if(browser.ie && browser.version < 7 )
- node.attributes.orgSrc = node.attributes.src;
- node.attributes.data_ue_src = node.attributes.data_ue_src || node.attributes.src;
- break;
- case 'li':
- var child = node.children[0];
- if ( !child || child.type != 'element' || child.tag != 'p' && dtd.p[child.tag] ) {
- var tmpPNode = {
- type: 'element',
- tag: 'p',
- attributes: {},
- parent : node
- };
- tmpPNode.children = child ? node.children :[
- browser.ie ? {
- type:'text',
- data:domUtils.fillChar,
- parent : tmpPNode
- }:
- {
- type : 'element',
- tag : 'br',
- attributes:{},
- closed: true,
- children: [],
- parent : tmpPNode
- }
- ];
- node.children = [tmpPNode];
- }
- break;
- case 'table':
- case 'td':
- optStyle( node );
- break;
- case 'a'://锚点,a==>img
- if ( node.attributes['anchorname'] ) {
- node.tag = 'img';
- node.attributes = {
- 'class' : 'anchorclass',
- 'anchorname':node.attributes['name']
- };
- node.closed = 1;
- }
- node.attributes.href && (node.attributes.data_ue_src = node.attributes.href);
- break;
- case 'b':
- node.tag = node.name = 'strong';
- break;
- case 'i':
- node.tag = node.name = 'em';
- break;
- case 'u':
- node.tag = node.name = 'span';
- node.attributes.style = (node.attributes.style || '') + ';text-decoration:underline;';
- break;
- case 's':
- case 'del':
- node.tag = node.name = 'span';
- node.attributes.style = (node.attributes.style || '') + ';text-decoration:line-through;';
- if ( node.children.length == 1 ) {
- child = node.children[0];
- if ( child.tag == node.tag ) {
- node.attributes.style += ";" + child.attributes.style;
- node.children = child.children;
- }
- }
- break;
- case 'span':
- // if ( /mso-list/.test( node.attributes.style ) ) {
- //
- //
- // //判断了两次就不在判断了
- // if ( firstTag != 'end' ) {
- //
- // var ci = node.children[0],p;
- // while ( ci.type == 'element' ) {
- // ci = ci.children[0];
- // }
- // for ( p in unorderStyle ) {
- // if ( unorderStyle[p].test( ci.data ) ) {
- //
- // // ci.data = ci.data.replace(unorderStyle[p],'');
- // parentTag = 'ul';
- // liStyle = p;
- // break;
- // }
- // }
- //
- //
- // if ( !parentTag ) {
- // for ( p in orderStyle ) {
- // if ( orderStyle[p].test( ci.data.replace( /\.$/, '' ) ) ) {
- // // ci.data = ci.data.replace(orderStyle[p],'');
- // parentTag = 'ol';
- // liStyle = p;
- // break;
- // }
- // }
- // }
- // if ( firstTag ) {
- // if ( ci.data == firstTag ) {
- // if ( parentTag != 'ul' ) {
- // liStyle = '';
- // }
- // parentTag = 'ul'
- // } else {
- // if ( parentTag != 'ol' ) {
- // liStyle = '';
- // }
- // parentTag = 'ol'
- // }
- // firstTag = 'end'
- // } else {
- // firstTag = ci.data
- // }
- // if ( parentTag ) {
- // var tmpNode = node;
- // while ( tmpNode && tmpNode.tag != 'ul' && tmpNode.tag != 'ol' ) {
- // tmpNode = tmpNode.parent;
- // }
- // if(tmpNode ){
- // tmpNode.tag = parentTag;
- // tmpNode.attributes.style = 'list-style-type:' + liStyle;
- // }
- //
- //
- //
- // }
- //
- // }
- //
- // node = {
- // type : 'fragment',
- // children : []
- // };
- // break;
- //
- //
- // }
- var style = node.attributes.style;
- if ( style ) {
- if ( !node.attributes.style || browser.webkit && style == "white-space:nowrap;") {
- delete node.attributes.style;
- }
- }
- //针对ff3.6span的样式不能正确继承的修复
-
- if(browser.gecko && browser.version <= 10902 && node.parent){
- var parent = node.parent;
- if(parent.tag == 'span' && parent.attributes && parent.attributes.style){
- node.attributes.style = parent.attributes.style + ';' + node.attributes.style;
- }
- }
- if ( utils.isEmptyObject( node.attributes ) && autoClearEmptyNode) {
- node.type = 'fragment'
- }
- break;
- case 'font':
- node.tag = node.name = 'span';
- attr = node.attributes;
- node.attributes = {
- 'style': (attr.size ? 'font-size:' + (sizeMap[attr.size] || 12) + 'px' : '')
- + ';' + (attr.color ? 'color:'+ attr.color : '')
- + ';' + (attr.face ? 'font-family:'+ attr.face : '')
- + ';' + (attr.style||'')
- };
- while(node.parent.tag == node.tag && node.parent.children.length == 1){
- node.attributes.style && (node.parent.attributes.style ? (node.parent.attributes.style += ";" + node.attributes.style) : (node.parent.attributes.style = node.attributes.style));
- node.parent.children = node.children;
- node = node.parent;
- }
- break;
- case 'p':
- if ( node.attributes.align ) {
- node.attributes.style = (node.attributes.style || '') + ';text-align:' +
- node.attributes.align + ';';
- delete node.attributes.align;
- }
- // if ( _likeLi( node ) ) {
- //
- // if ( !first ) {
- //
- // var ulNode = {
- // type: 'element',
- // tag: 'ul',
- // attributes: {},
- // children: []
- // },
- // index = indexOf( node.parent.children, node );
- // node.parent.children[index] = ulNode;
- // ulNode.parent = node.parent;
- // ulNode.children[0] = node;
- // node.parent = ulNode;
- //
- // while ( 1 ) {
- // node = ulNode.parent.children[index + 1];
- // if ( _likeLi( node ) ) {
- // ulNode.children[ulNode.children.length] = node;
- // node.parent = ulNode;
- // ulNode.parent.children.splice( index + 1, 1 );
- //
- // } else {
- // break;
- // }
- // }
- //
- // return ulNode;
- // }
- // node.tag = node.name = 'li';
- // //为chrome能找到标号做的处理
- // if ( browser.webkit ) {
- // var span = node.children[0];
- //
- // while ( span && span.type == 'element' ) {
- // span = span.children[0]
- // }
- // span && (span.parent.attributes.style = (span.parent.attributes.style || '') + ';mso-list:10');
- // }
- //
- //
- // delete node.attributes['class'];
- // delete node.attributes.style;
- //
- //
- // }
- }
- return node;
- }
- function optStyle( node ) {
- if ( ie && node.attributes.style ) {
- var style = node.attributes.style;
- node.attributes.style = style.replace(/;\s*/g,';');
- node.attributes.style = node.attributes.style.replace( /^\s*|\s*$/, '' )
- }
- }
- //getContent调用转换
- function transOutNode( node ) {
- switch ( node.tag ) {
- case 'div' :
- if(node.attributes._ue_div_script){
- node.tag = 'script';
- node.children = [{type:'cdata',data:decodeURIComponent(node.attributes._ue_script_data)||'',parent:node}];
- delete node.attributes._ue_div_script;
- delete node.attributes._ue_script_data;
- break;
- }
- case 'table':
- !node.attributes.style && delete node.attributes.style;
- if ( ie && node.attributes.style ) {
- optStyle( node );
- }
- if(node.attributes['class'] == 'noBorderTable'){
- delete node.attributes['class'];
- }
- break;
- case 'td':
- case 'th':
- if ( /display\s*:\s*none/i.test( node.attributes.style ) ) {
- return {
- type: 'fragment',
- children: []
- };
- }
- if ( ie && !node.children.length ) {
- var txtNode = {
- type: 'text',
- data:domUtils.fillChar,
- parent : node
- };
- node.children[0] = txtNode;
- }
- if ( ie && node.attributes.style ) {
- optStyle( node );
- }
- if(node.attributes['class'] == 'selectTdClass'){
- delete node.attributes['class']
- }
- break;
- case 'img'://锚点,img==>a
- if ( node.attributes.anchorname ) {
- node.tag = 'a';
- node.attributes = {
- name : node.attributes.anchorname,
- anchorname : 1
- };
- node.closed = null;
- }else{
- if(node.attributes.data_ue_src){
- node.attributes.src = node.attributes.data_ue_src;
- delete node.attributes.data_ue_src;
- }
- }
- break;
- case 'a':
- if(node.attributes.data_ue_src){
- node.attributes.href = node.attributes.data_ue_src;
- delete node.attributes.data_ue_src;
- }
- }
- return node;
- }
- function childrenAccept( node, visit, ctx ) {
- if ( !node.children || !node.children.length ) {
- return node;
- }
- var children = node.children;
- for ( var i = 0; i < children.length; i++ ) {
- var newNode = visit( children[i], ctx );
- if ( newNode.type == 'fragment' ) {
- var args = [i, 1];
- args.push.apply( args, newNode.children );
- children.splice.apply( children, args );
- //节点为空的就干掉,不然后边的补全操作会添加多余的节点
- if ( !children.length ) {
- node = {
- type: 'fragment',
- children: []
- }
- }
- i --;
- } else {
- children[i] = newNode;
- }
- }
- return node;
- }
- function Serialize( rules ) {
- this.rules = rules;
- }
- Serialize.prototype = {
- // NOTE: selector目前只支持tagName
- rules: null,
- // NOTE: node必须是fragment
- filter: function ( node, rules, modify ) {
- rules = rules || this.rules;
- var whiteList = rules && rules.whiteList;
- var blackList = rules && rules.blackList;
- function visitNode( node, parent ) {
- node.name = node.type == 'element' ?
- node.tag : NODE_NAME_MAP[node.type];
- if ( parent == null ) {
- return childrenAccept( node, visitNode, node );
- }
- if ( blackList && blackList[node.name] ) {
- modify && (modify.flag = 1);
- return {
- type: 'fragment',
- children: []
- };
- }
- if ( whiteList ) {
- if ( node.type == 'element' ) {
- if ( parent.type == 'fragment' ? whiteList[node.name] : whiteList[node.name] && whiteList[parent.name][node.name] ) {
- var props;
- if ( (props = whiteList[node.name].$) ) {
- var oldAttrs = node.attributes;
- var newAttrs = {};
- for ( var k in props ) {
- if ( oldAttrs[k] ) {
- newAttrs[k] = oldAttrs[k];
- }
- }
- node.attributes = newAttrs;
- }
- } else {
- modify && (modify.flag = 1);
- node.type = 'fragment';
- // NOTE: 这里算是一个hack
- node.name = parent.name;
- }
- } else {
- // NOTE: 文本默认允许
- }
- }
- if ( blackList || whiteList ) {
- childrenAccept( node, visitNode, node );
- }
- return node;
- }
- return visitNode( node, null );
- },
- transformInput: function ( node, word_img_flag ) {
- function visitNode( node ) {
- node = transNode( node, word_img_flag );
- // if ( node.tag == 'ol' || node.tag == 'ul' ) {
- // first = 1;
- // }
- node = childrenAccept( node, visitNode, node );
- // if ( node.tag == 'ol' || node.tag == 'ul' ) {
- // first = 0;
- // parentTag = '',liStyle = '',firstTag = '';
- // }
- if ( me.options.pageBreakTag && node.type == 'text' && node.data.replace( /\s/g, '' ) == me.options.pageBreakTag ) {
- node.type = 'element';
- node.name = node.tag = 'hr';
- delete node.data;
- node.attributes = {
- 'class' : 'pagebreak',
- noshade:"noshade",
- size:"5",
- 'unselectable' : 'on',
- 'style' : 'moz-user-select:none;-khtml-user-select: none;'
- };
- node.children = [];
- }
- //去掉多余的空格和换行
- if(node.type == 'text' && !dtd.$notTransContent[node.parent.tag]){
- node.data = node.data.replace(/[\r\t\n]*/g,'')//.replace(/[ ]*$/g,'')
- }
- return node;
- }
- return visitNode( node );
- },
- transformOutput: function ( node ) {
- function visitNode( node ) {
- if ( node.tag == 'hr' && node.attributes['class'] == 'pagebreak' ) {
- delete node.tag;
- node.type = 'text';
- node.data = me.options.pageBreakTag;
- delete node.children;
- }
- node = transOutNode( node );
- if ( node.tag == 'ol' || node.tag == 'ul' ) {
- first = 1;
- }
- node = childrenAccept( node, visitNode, node );
- if ( node.tag == 'ol' || node.tag == 'ul' ) {
- first = 0;
- }
- return node;
- }
- return visitNode( node );
- },
- toHTML: toHTML,
- parseHTML: parseHTML,
- word: transformWordHtml
- };
- me.serialize = new Serialize( me.options.serialize || {});
- UE.serialize = new Serialize( {} );
- };
|