css字符串转换为类map对象及反转
存储对象为啥是类map(即:{key:val,...}格式),因为Map对象的val为字符时,无法存储 '('、')' 左右括号,我也很无奈╮(╯▽╰)╭
解析脚本:
<!DOCTYPE html>
<html>
<head>
<title>css parser</title>
<meta charset="UTF-8" >
</head> <body>
</body>
<script type="text/javascript">
var css = ` .c1,.c1:hover{
color: #fff;
border-color: #3c8b3c;
background: #4cae4c;
background: -webkit-linear-gradient(top,#4cae4c 0,#449d44 100%);
background: -moz-linear-gradient(top,#4cae4c 0,#449d44 100%);
background: -o-linear-gradient(top,#4cae4c 0,#449d44 100%);
background: linear-gradient(to bottom,#4cae4c 0,#449d44 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#4cae4c,endColorstr=#449d44,GradientType=0);
}`;
/**
* 传入的是css字符串则返回map对象,传入是css的map对象则返回css字符串
* @param: res 处理的源数据
* @param: bool 控制样式外部的注释是否保留(生成map对象时)
**/
function parseCssFile(res, bool) {
if (typeof res == 'string') return txt2Map(res);
if (typeof res == 'object') return map2Txt(res); function txt2Map(cssTxt) { /* css匹配正则 '\——\;\,\。\/\*\u2E80-\u9FFF' 处理中文注释 */
var reg = /([\w\s\-\#\.\:\~\>\,\[\]\=\'\"]+\w+\s*|({[\——\;\,\。\/\*\u2E80-\u9FFF\w\s\-\+\=\.\!\:\(\)\;\,\%\#\'\"]+}))/ig;
if (bool == true) { /* 保留样式外部的注释 */
reg = /([\——\;\,\。\/\*\u2E80-\u9FFF\w\s\-\#\.\:\~\>\,\[\]\=\'\"]+\w+\s*|({[\——\;\,\。\/\*\u2E80-\u9FFF\w\s\-\+\=\.\!\:\(\)\;\,\%\#\'\"]+}))/ig;
} var cssmap = {},
matchs = cssTxt.match(reg);
for (var i = 0; i < matchs.length; i++) {
if(i%2==0) {
var cssVal = matchs[i+1].trim(), cssKey = matchs[i].trim(), oldVal = cssmap[cssKey];
if(oldVal) cssVal = oldVal.replace('}','')+ cssVal.replace('{',''); /* 存在则合并 */
cssmap[cssKey] = cssVal;
}
}
return cssmap;
} function map2Txt(mapObj) {
var buf = '';
for(var key in mapObj) {
buf += key + ' ' + mapObj[key] + '\n';
};
return buf;
}
}
var cMap = parseCssFile(css,true);
console.log(cMap);
console.log(parseCssFile(cMap));
</script>
</html>
结果:

增强版:(支持多文件)
/**
* 传入的是css字符串则返回map对象(多文件时返回对象数组),传入是css的map对象(暂不支持对象数组)则返回css字符串
* @param: res 处理的源数据
* @param: options: {
external: bool 控制样式外部的注释是否保留(生成map对象时),
note: string 合并处的文本注释
}
**/
var parseCssFile = function(res, options = {}) {
var resType = Object.prototype.toString.call(res);
if (resType == '[object Array]' || resType == '[object String]') { /* 单文件、多文件 */
return txt2Map(res);
}
if (resType == '[object Object]') return map2Txt(res); function txt2Map(cssTxt) {
if (Object.prototype.toString.call(cssTxt) == '[object Array]') { /* 多文件 */
var mapArr = [];
cssTxt.map(function(item) {
mapArr.push(_css2Json(item));
});
return mapArr;
} else { /* 单文件 */
return _css2Json(cssTxt);
} }
/*css to json*/
function _css2Json(cssTxt) { /* css匹配正则 '\——\;\,\。\/\*\u2E80-\u9FFF' 处理中文注释 */
var reg = /([\w\s\-\#\.\:\~\>\,\[\]\=\'\"]+\w+\s*|({[\——\;\,\。\/\*\u2E80-\u9FFF\w\s\-\+\=\.\!\:\(\)\;\,\%\#\'\"]+}))/ig;
if (options == true || options.external == true) { /* 保留样式外部的注释 */
reg = /([\——\;\,\。\/\*\u2E80-\u9FFF\w\s\-\#\.\:\~\>\,\[\]\=\'\"]+\w+\s*|({[\——\;\,\。\/\*\u2E80-\u9FFF\w\s\-\+\=\.\!\:\(\)\;\,\%\#\'\"]+}))/ig;
}
/* 用户清除注释的样式定义 */
var clearReg = /\/\*[\——\;\,\。\/\*\u2E80-\u9FFF\w\s\-\#\.\:\~\>\,\[\]\=\'\"]+\w+\s*{[\——\;\,\。\/\*\u2E80-\u9FFF\w\s\-\+\=\.\!\:\(\)\;\,\%\#\'\"]+}\s*\*\//g;
var cssmap = {}, note = '/* self cancat part */', cssTxt = cssTxt.replace(clearReg, ''),
matchs = cssTxt.match(reg);
for (var i = 0; i < matchs.length; i++) {
if (i % 2 == 0) {
var cssVal = matchs[i + 1].trim(), cssKey = matchs[i].trim(), oldVal = cssmap[cssKey];
if (oldVal) cssVal = oldVal.replace('}', note) + cssVal.replace('{', '');
cssmap[cssKey] = cssVal;
}
}
return cssmap;
}
/*json to text*/
function map2Txt(mapObj) {
var buf = '';
for (var key in mapObj) {
buf += key + ' ' + mapObj[key] + '\n';
};
return buf;
}
}
css字符串转换为类map对象及反转的更多相关文章
- 011-JSON、JSONObject、JSONArray使用、JSON数组形式字符串转换为List<Map<String,String>>的8种方法
一.JSON数据格式 1.1.常用JSON数据格式 1.对象方式:JSONObject的数据是用 { } 来表示的, 例如: { "id" : "123", & ...
- java中将jsonObject字符串转化为Map对象
java中将jsonObject字符串转化为Map对象 1.我们这里使用json-lib包进行转换,可在http://json-lib.sourceforge.net/下载依赖于下面的jar包: ja ...
- ruby中字符串转换为类
最近有个需求,需要根据一个字符串当作一个类来使用,例如: 有一个字符串 “ChinaMag”,根据这个字符串调用 类 ChinaMag下的方法. 解决办法: 1. rails可以使用 constant ...
- JSON数组形式字符串转换为List<Map<String,String>>的几种方法
package com.zkn.newlearn.json; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArr ...
- js动态获取当前系统时间+js字符串转换为date日期对象
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- JSON数组形式字符串转换为List<Map<String,String>>的8种方法
package com.zkn.newlearn.json; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArr ...
- Java 利用Gson将json字符串转换为List<Map<String, String>>
json字符串类似于: [ { "userPhone": "123", "userNo": "123-2", " ...
- Java 中 json字符串转换为类
使用到alibaba.fastjson包 具体实现 JSONObject jsonObject = JSONObject.parseObject(msg); SmsSenderStatus smsSe ...
- 将json数组字符串转换为json数组对象(值是json对象的数组)
var str1 ='[{"name":"kevin","age":18},{"name":"rose&quo ...
随机推荐
- 深入理解 mysql 索引
1.资源准备 FQ软件下载:蓝灯 2.红黑树模拟:https://www.cs.usfca.edu/~galles/visualization/RedBlack.html 3.B树模拟:https:/ ...
- appium多机并行测试
在实际应用中需要对多个机型并行测试,节省时间 多机测试的思路 启动多个appium server与多台机器交互(android和ios均可) 注意:一定要使用node安装appium的命令行,使用 ...
- 830. Positions of Large Groups
In a string S of lowercase letters, these letters form consecutive groups of the same character. For ...
- telnet ip/域名 端口 是否成功
有时候会ping ip 通,但是telnet不通,可能端口未开. telnet不成功,则显示不能打开到主机的链接,链接失败 . telnet成功,则进入telnet页面(全黑的),证明端口可用.
- Idea设置类注释模板
1.选择File–>Settings–>Editor–>File and Code Templates–>Includes–>File Header. 在Descript ...
- elk6快速安装
rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch [elasticsearch-6.x] name=Elasticsear ...
- PHP20-challenge12
看下eval+var_dump的妙用. eval会执行括号中的内容:var_dump中内容是字符串时输出的模式是 string(x) "xxxx".如果他俩结合,是可以很好 ...
- Netty实践二(心跳检测)
我们使用Socket通信一般经常会处理多个服务器之间的心跳检测,一般来讲,我们去维护服务器集群,肯定要有一台或几台服务器主机(Master),然后还应该有N台(Slave),那么我们的主机肯定要时时刻 ...
- 20 【python】入门指南:常用数据结构
Python内置了三种高级数据结构:list,tuple,dict list:数组,相同类型的元素组成的数组 tuple:元组,相同类型的元素组成的数组,但是这里有限定条件(长度是固定的,并且值也是固 ...
- Python: subprocess.Popen()不支持unicode问题解决
起源: 所下载视频,有音视频分离者,需要合并起来,采用python之subprocess.Popen()调用ffmpeg实现.python版本为2.7.13,而音视频文件路径,有unicode字符者, ...