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;
  }
}

 

posted @ 2018-03-30 15:12  【云】风过无痕  阅读(1110)  评论(0编辑  收藏  举报