@@ -8197,6 +8197,48 @@ CSSLint.addRule({
81978197
81988198} ) ;
81998199
8200+ /*
8201+ * Rule: IE6-9 supports up to 31 stylesheet import.
8202+ * Reference:
8203+ * http://blogs.msdn.com/b/ieinternals/archive/2011/05/14/internet-explorer-stylesheet-rule-selector-import-sheet-limit-maximum.aspx
8204+ */
8205+
8206+ CSSLint . addRule ( {
8207+
8208+ //rule information
8209+ id : "import-ie-limit" ,
8210+ name : "@import limit on IE6-IE9" ,
8211+ desc : "IE6-9 supports up to 31 @import per stylesheet" ,
8212+ browsers : "IE6, IE7, IE8, IE9" ,
8213+
8214+ //initialization
8215+ init : function ( parser , reporter ) {
8216+ "use strict" ;
8217+ var rule = this ,
8218+ MAX_IMPORT_COUNT = 31 ,
8219+ count = 0 ;
8220+
8221+ function startPage ( ) {
8222+ count = 0 ;
8223+ }
8224+
8225+ parser . addListener ( "startpage" , startPage ) ;
8226+
8227+ parser . addListener ( "import" , function ( ) {
8228+ count ++ ;
8229+ } ) ;
8230+
8231+ parser . addListener ( "endstylesheet" , function ( ) {
8232+ if ( count > MAX_IMPORT_COUNT ) {
8233+ reporter . rollupError (
8234+ "Too many @import rules (" + count + "). IE6-9 supports up to 31 import per stylesheet." ,
8235+ rule
8236+ ) ;
8237+ }
8238+ } ) ;
8239+ }
8240+
8241+ } ) ;
82008242/*
82018243 * Rule: Don't use @import, use <link> instead.
82028244 */
@@ -9036,11 +9078,13 @@ CSSLint.addRule({
90369078 //initialization
90379079 init : function ( parser , reporter ) {
90389080 "use strict" ;
9081+
90399082 var rule = this ;
90409083
90419084 parser . addListener ( "startrule" , function ( event ) {
90429085
90439086 var selectors = event . selectors ,
9087+ selectorContainsClassOrId = false ,
90449088 selector ,
90459089 part ,
90469090 modifier ,
@@ -9053,8 +9097,19 @@ CSSLint.addRule({
90539097 if ( part . type === parser . SELECTOR_PART_TYPE ) {
90549098 for ( k = 0 ; k < part . modifiers . length ; k ++ ) {
90559099 modifier = part . modifiers [ k ] ;
9056- if ( modifier . type === "attribute" && ( ! part . elementName || part . elementName === "*" ) ) {
9057- reporter . report ( rule . desc , part . line , part . col , rule ) ;
9100+
9101+ if ( modifier . type === "class" || modifier . type === "id" ) {
9102+ selectorContainsClassOrId = true ;
9103+ break ;
9104+ }
9105+ }
9106+
9107+ if ( ! selectorContainsClassOrId ) {
9108+ for ( k = 0 ; k < part . modifiers . length ; k ++ ) {
9109+ modifier = part . modifiers [ k ] ;
9110+ if ( modifier . type === "attribute" && ( ! part . elementName || part . elementName === "*" ) ) {
9111+ reporter . report ( rule . desc , part . line , part . col , rule ) ;
9112+ }
90589113 }
90599114 }
90609115 }
@@ -10055,20 +10110,28 @@ function cli(api) {
1005510110 function readConfigData ( config ) {
1005610111 var data = readConfigFile ( config ) ,
1005710112 json ,
10113+ optionName ,
10114+ optionValue ,
10115+ args ,
1005810116 options = { } ;
1005910117 if ( data ) {
1006010118 if ( data . charAt ( 0 ) === "{" ) {
1006110119 try {
1006210120 json = JSON . parse ( data ) ;
1006310121 data = "" ;
10064- for ( var optionName in json ) {
10122+ for ( optionName in json ) {
1006510123 if ( json . hasOwnProperty ( optionName ) ) {
10066- data += "--" + optionName + "=" + json [ optionName ] . join ( ) ;
10124+ optionValue = json [ optionName ] ;
10125+ if ( Array . isArray ( optionValue ) ) {
10126+ optionValue = optionValue . join ( "," ) ;
10127+ }
10128+ data += "--" + optionName + "=" + optionValue ;
1006710129 }
1006810130 }
1006910131 } catch ( e ) { }
1007010132 }
10071- options = processArguments ( data . split ( / [ \s \n \r ] + / m) ) ;
10133+ args = data . replace ( / \s + / g, "" ) . split ( / (? = - - ) / ) ;
10134+ options = processArguments ( args ) ;
1007210135 }
1007310136
1007410137 return options ;
0 commit comments