zoukankan      html  css  js  c++  java
  • js提取135编辑器相同的css

    135编辑器导入的内容,有重复的很多css,导致加载很慢,只能去掉

    function remove135FormatContent(content){
        	if(!content) return '';
        	//1.去掉135版本信息
            content=removeVersionInfo(content);
        	
            //2.去掉data-的无用属性
    		content=removeDataAttr(content);
            
    		//3.提取公用的style,写入class="",没有公用的还是放在 style
    	    content=extractHTMLByStyleToClass(content);
    		return content;
        }
        
        function removeDataAttr(content){
    		if(!content) return '';
    		
    		//去掉data-的无用属性
            var reg=new RegExp('\s+data-[\w-]+\s*=\s*"[\s\S]*?"','g');
            var result=content.replace(reg, function($0){
    		   return $0.replace(/^s+/, '').indexOf('data-type')==0 ? $0 : ' ';
    	    });
    		//去掉空的属性
    		result=result.replace(/s+class=""/g, "");
    		result=result.replace(/s+style=""/g, "");
    		
    		//label="Powered by 135editor.com"
    		result=result.replace(/s+label="Powered by 135editor.com"/g,"");
    		// class="_135editor"
    		result=result.replace(/s+class="_135editor"/g,"");
    
    		//p><br/><br/></p>
    		result=result.replace(/<p>(<brs*/?>)+</p>/g,"");
    		
    		result=result.replace(/<style>(<br>)+</style>/g,"");
    		
    		//这个权限有点大
    		result=result.replace(/(<br>)+/g,"");
    		
    		//<p></p>
    		result=result.replace(/<p></p>/g,"");
    		
    		//去掉title中是http的
    		result=result.replace(/ titles*=s*"https*[sS]*?"/g,"");
    		return result;
        }
        
        function extractHTMLByStyleToClass(content){
    		if(!content) return "";
    		//1.取出所有style
    		var reg=new RegExp(' style\s*=\s*"[\s\S]*?"','g');
    		var allstyles00 = content.match(reg);
    		var allstyles=[];
    		//style中包含url(或" 不处理
    		for(var i in allstyles00){
    			if(allstyles00[i].indexOf('url(')>=0){
    				continue;
    			}
    			if(allstyles00[i].indexOf('"')>=0){
    				continue;
    			}
    			allstyles.push(allstyles00[i]);
    		}
    		
    
    		//2.计算每个style出现的次数
    		var counts = {};
    		for(var i in allstyles){
    			var style = allstyles[i];
    			if( !counts[style] ) counts[style]=0;
    			counts[style]++;
    		}
    
    		//3.找到已有的zwedsty_的最大序号
    		var prefix = "zwedsty_";
    		var allHasPrefix = content.match(new RegExp('\.'+prefix+'\d+','g'));
    		var maxClassNum = 0;
    		for(var i in allHasPrefix){
    			var num = allHasPrefix[i].substring(1+prefix.length);
    			num = parseInt(num,10);
    			if( maxClassNum < num) maxClassNum = num;
    		}
    
    		//3.对于有重复的style,换成class
    		var classes = [];
    		for(var style in counts){
    			if(counts[style]<2)continue; //没有重复,不做处理
    			if(style.length<=20)continue; //太短的,不做处理
    			var oneClass = prefix + (++maxClassNum);
    			//生成一个class
    			classes.push( "."+ oneClass
    				//+"{" +replaceStyleQuotToSymble(getMiddleString(style, '"', '"'))
    					+"{" +getMiddleString(style, '"', '"')
    				+ "}");
    			//将style换成class
    			content = myReplaceByString(content, style, 
    				' class="' + oneClass + '"'); 
    		}
    
    		//将所有的class写到content最前面
    		//var styleString = "<style>
    " + classes.join("
    ") + "</style>
    " ;
    		var styleString = "<style>" + classes.join("
    ") + "</style>" ;
    		//var styleString = "<style>" + classes.join(" ") + "</style>" ; 
    		
    		//有内容再去加
    		if(classes.length>0){
    			content = styleString + content;
    		}
    		return content;
    	}
    
        function replaceStyleQuotToSymble(str){
        	if(!str) return str;
        	return myReplaceByString(str, '"', '"');
        }    
       //去掉135版本信息
    	function removeVersionInfo(content){
    		if(! content ) return "";
    		var idx1 = content.indexOf('<section powered-by="135编辑器"');
    		if(idx1<0) return content;
    		var idx2 = content.lastIndexOf('</section>');
    		if( idx2<0) idx2 = content.length;
    		return content.substring(0, idx1) + content.substring(idx2+'</section>'.length);
    	}
    	//取“”中间的值
    	function getMiddleString(content, tag1, tag2){
    		if(!content || !tag1 || !tag2) return "";
    		var idx1 = content.indexOf(tag1);
    		if(idx1<0) return "";
    		idx1 += tag1.length;
    		var idx2 = content.indexOf(tag2, idx1);
    		if( idx2<0) return "";
    		return content.substring(idx1, idx2);
    	}
    	//替换函数
    	function myReplaceByString(content, word, target){
    		//使用字符串替换全部
    		if(!content || !word ) return content;
    		while(content.indexOf(word)>=0){
    			content = content.replace(word, target);
    		}
    
    		return content;
    	}
    

      

  • 相关阅读:
    优先队列
    Problem W UVA 662 二十三 Fast Food
    UVA 607 二十二 Scheduling Lectures
    UVA 590 二十一 Always on the run
    UVA 442 二十 Matrix Chain Multiplication
    UVA 437 十九 The Tower of Babylon
    UVA 10254 十八 The Priest Mathematician
    UVA 10453 十七 Make Palindrome
    UVA 10163 十六 Storage Keepers
    UVA 1252 十五 Twenty Questions
  • 原文地址:https://www.cnblogs.com/sunliyuan/p/11263497.html
Copyright © 2011-2022 走看看