nl_tokens: 收集需要合并的样式和图片
pl_tokens: function collectStyleRules ( styleSheet , result , styleSheetUrl ) { if ( ! result ) { result = { // an StyleObjList length : 0 } } if ( ! styleSheet . cssRules . length ) { return result ; } var styleSheetDir = path . dirname ( styleSheetUrl ) ; // 遍历所有 css 规则收集进行图片合并的样式规则 styleSheet . cssRules . forEach ( function ( rule , i ) { // typeof rule === 'CSSStyleRule' if ( <mask> . href && rule . styleSheet ) { // @import 引入的样式表, 把 css 文件读取进来继续处理 var fileName = rule . href ; // 忽略掉链接到网络上的文件 if ( ! fileName || regexp . ignoreNetwork . test ( fileName ) ) { return ; } var match = fileName . match ( regexp . css ) ; if ( ! match ) { return ; } fileName = match [ 1 ] ; var url = path . join ( styleSheetDir , fileName ) ; var styleSheet = readStyleSheet ( url ) ; debug ( 'read import style: ' + url + ' , has styleSheet == : ' + ! ! styleSheet ) ; if ( ! styleSheet ) { return ; } rule . styleSheet = styleSheet ; debug ( 'collect import style: ' + fileName ) ; // 继续收集 import 的样式 collectStyleRules ( styleSheet , result , url ) ; return ; } if ( rule . cssRules && rule . cssRules . length ) { if ( rule instanceof CSSOM . CSSKeyframesRule ) { return ; // FIXME 先跳过 keyframes 的属性 } // 遇到有子样式的，比如 @media, 递归收集 collectStyleRules ( rule , result , styleSheetUrl ) ; return ; } if ( ! rule . style ) { // 有可能 @media 等中没有任何样式, 如: @media xxx {} return ; } /* 
           * typeof style === 'CSSStyleDeclaration'
           * 给 style 对象扩展基本的方法
           */ var style = us . extend ( rule . style , BaseCSSStyleDeclaration ) ; if ( style [ 'background-size' ] ) { /* 
               * 跳过有 background-size 的样式, 因为:
               * 1. background-size 不能简写在 background 里面, 而拆分 background 之后再组装,
               *    background 就变成在 background-size 后面了, 会导致 background-size 被 background 覆盖;
               * 2. 拥有 background-size 的背景图片一般都涉及到拉伸, 这类图片是不能合并的
               */ return ; } if ( style [ 'background' ] ) { // 有 background 属性的 style 就先把 background 简写拆分出来 style . splitBackground ( ) ; } else if ( style [ 'background-position' ] ) { var value = style [ 'background-position' ] ; value = value . trim ( ) . replace ( / \s{2} / g , '' ) . split ( ' ' ) ; if ( ! value [ 1 ] ) { value [ 1 ] = value [ 0 ] ; } style . setProperty ( 'background-position-x' , value [ 0 ] ) ; style . setProperty ( 'background-position-y' , value [ 1 ] ) ; } if ( regexp . ignorePosition . test ( style [ 'background-position-x' ] ) || regexp . ignorePosition . test ( style [ 'background-position-y' ] ) ) { /*
               * background 定位是 right center bottom 的图片不合并
               * 因为这三个的定位方式比较特殊, 浏览器有个自动适应的特性
               * 把刚刚拆分的 background 属性合并并返回
               */ style . mergeBackgound ( ) ; return ; } if ( regexp . ignoreRepeat . test ( style [ 'background-repeat' ] ) || regexp . ignoreRepeat . test ( style [ 'background-repeat-x' ] ) || regexp . ignoreRepeat . test ( style [ 'background-repeat-y' ] ) ) { // 显式的使用了平铺的图片, 也不进行合并 style . mergeBackgound ( ) ; return ; } var imageUrl = getImageUrl ( style , styleSheetDir ) , imageAbsUrl , fileName ; if ( imageUrl ) { imageAbsUrl = path . join ( styleSheetDir , imageUrl ) ; fileName = path . join ( spriteConfig . workspace , imageAbsUrl ) ; if ( ! fs . existsSync ( fileName ) ) { // 如果这个图片是不存在的, 就直接返回了, 进行容错 info ( '>>Skip: "' + fileName + '" is not exist' ) ; return ; } // 把用了同一个文件的样式汇集在一起 if ( ! result [ imageUrl ] ) { result [ imageUrl ] = { // an StyleObj imageUrl : imageUrl , imageAbsUrl : imageAbsUrl , cssRules : [ ] } ; result . length ++ ; } result [ imageUrl ] . cssRules . push ( style ) ; } else { //图片找不到css_backgound合并还原  20150405 style . mergeBackgound ( ) ; } } ) ; return result ; }