@@ -16,22 +16,23 @@ var LocationIndex = _location.LocationIndex;
1616( function ( exports ) {
1717 'use strict' ;
1818 var NUM_COLS = 12 ;
19- var COL_REGEX = / \b c o l - ( x s | s m | m d | l g ) - ( \d { 1 , 2 } ) \b / ;
20- var COL_REGEX_G = / \b c o l - ( x s | s m | m d | l g ) - ( \d { 1 , 2 } ) \b / g;
19+ var COL_REGEX = / \b c o l (?: - ( s m | m d | l g | x l ) ) ? (?: - ( a u t o | \d { 1 , 2 } ) ) ? \b / ;
20+ var COL_REGEX_G = / \b c o l (?: - ( s m | m d | l g | x l ) ) ? (?: - ( a u t o | \d { 1 , 2 } ) ) ? \b / g;
2121 var COL_CLASSES = [ ] ;
22- var SCREENS = [ 'xs ' , 'sm' , 'md' , 'lg' ] ;
22+ var SCREENS = [ '' , 'sm' , 'md' , 'lg' , 'xl '] ;
2323 SCREENS . forEach ( function ( screen ) {
24- for ( var n = 1 ; n <= NUM_COLS ; n ++ ) {
25- COL_CLASSES . push ( '.col-' + screen + ' -' + n ) ;
24+ for ( var n = - 1 ; n <= NUM_COLS ; n ++ ) {
25+ COL_CLASSES . push ( '.col' + ( screen && ' -' + screen ) + ( n < 0 ? '' : ' -' + ( n || 'auto' ) ) ) ;
2626 }
2727 } ) ;
2828 var SCREEN2NUM = {
29- xs : 0 ,
30- sm : 1 ,
31- md : 2 ,
32- lg : 3
29+ '' : 0 ,
30+ 'sm' : 1 ,
31+ 'md' : 2 ,
32+ 'lg' : 3 ,
33+ 'xl' : 4
3334 } ;
34- var NUM2SCREEN = [ 'xs ' , 'sm' , 'md' , 'lg' ] ;
35+ var NUM2SCREEN = [ '' , 'sm' , 'md' , 'lg' , 'xl '] ;
3536 var IN_NODE_JS = Boolean ( cheerio . load ) ;
3637 var MIN_JQUERY_VERSION = '1.9.1' ; // as of Bootstrap v3.3.0
3738 var CURRENT_BOOTSTRAP_VERSION = '3.3.7' ;
@@ -131,11 +132,11 @@ var LocationIndex = _location.LocationIndex;
131132 var width2screens = { } ;
132133 while ( true ) {
133134 var match = COL_REGEX_G . exec ( classes ) ;
134- if ( ! match ) {
135+ if ( ! match || ! match [ 1 ] && ! match [ 2 ] ) {
135136 break ;
136137 }
137- var screen = match [ 1 ] ;
138- width = match [ 2 ] ;
138+ var screen = match [ 1 ] || '' ;
139+ width = match [ 2 ] || '' ; // can also be 'auto'
139140 var screens = width2screens [ width ] ;
140141 if ( ! screens ) {
141142 screens = width2screens [ width ] = [ ] ;
@@ -476,7 +477,6 @@ var LocationIndex = _location.LocationIndex;
476477 }
477478 });
478479 */
479- /*
480480 addLinter ( 'W009' , function lintEmptySpacerCols ( $ , reporter ) {
481481 var selector = COL_CLASSES . map ( function ( colClass ) {
482482 return colClass + ':not(:last-child)' ;
@@ -492,18 +492,9 @@ var LocationIndex = _location.LocationIndex;
492492 return ;
493493 }
494494
495- var colClasses = column.attr('class').split(/\s+/g).filter(function (klass) {
496- return COL_REGEX.test(klass);
497- });
498- colClasses = sortedColumnClasses(colClasses.join(' ')).trim();
499-
500- var colRegex = new RegExp('\\b(col-)(' + SCREENS.join('|') + ')(-\\d+)\\b', 'g');
501- var offsetClasses = colClasses.replace(colRegex, '$1$2-offset$3');
502-
503- reporter('Using empty spacer columns isn\'t necessary with Bootstrap\'s grid. So instead of having an empty grid column with `class="' + colClasses + '"` , just add `class="' + offsetClasses + '"` to the next grid column.', column);
495+ reporter ( 'Using empty spacer columns isn\'t necessary with Bootstrap\'s grid.' , column ) ;
504496 } ) ;
505497 } ) ;
506- */
507498 /*
508499 addLinter('W010', function lintMediaPulls($, reporter) {
509500 var mediaPulls = $('.media>.pull-left, .media>.pull-right');
@@ -695,18 +686,16 @@ var LocationIndex = _location.LocationIndex;
695686 }
696687 });
697688 */
698- /*
699689 addLinter ( 'E005' , function lintRowAndColOnSameElem ( $ , reporter ) {
700690 var selector = COL_CLASSES . map ( function ( col ) {
701691 return '.row' + col ;
702692 } ) . join ( ',' ) ;
703693
704694 var rowCols = $ ( selector ) ;
705695 if ( rowCols . length ) {
706- reporter('Found both `.row` and `.col-*- *` used on the same element', rowCols);
696+ reporter ( 'Found both `.row` and `.col*` used on the same element' , rowCols ) ;
707697 }
708698 } ) ;
709- */
710699 /*
711700 addLinter('E006', function lintInputGroupFormControlTypes($, reporter) {
712701 var selectInputGroups = $('.input-group select');
@@ -759,43 +748,38 @@ var LocationIndex = _location.LocationIndex;
759748 }
760749 });
761750 */
762- /*
763751 addLinter ( 'E012' , function lintGridClassMixedWithInputGroup ( $ , reporter ) {
764752 var selector = COL_CLASSES . map ( function ( colClass ) {
765753 return '.input-group' + colClass ;
766754 } ) . join ( ',' ) ;
767755
768756 var badMixes = $ ( selector ) ;
769757 if ( badMixes . length ) {
770- reporter('`.input-group` and `.col-*-* ` cannot be used directly on the same element. Instead, nest the `.input-group` within the `.col-*- *`', badMixes);
758+ reporter ( '`.input-group` and `.col* ` cannot be used directly on the same element. Instead, nest the `.input-group` within the `.col*`' , badMixes ) ;
771759 }
772760 } ) ;
773- */
774- /*
775761 addLinter ( 'E013' , function lintRowChildrenAreCols ( $ , reporter ) {
776- var ALLOWED_CHILDREN = COL_CLASSES.concat(['script', '.clearfix', '.bs-customizer-input' ]);
777- var selector = '.row>*' + ALLOWED_CHILDREN.map(function (colClass) {
762+ var ALLOWED_CHILDREN = COL_CLASSES . concat ( [ 'script' , '.clearfix' ] ) ;
763+ var disallowedChildren = ALLOWED_CHILDREN . map ( function ( colClass ) {
778764 return ':not(' + colClass + ')' ;
779765 } ) . join ( '' ) ;
766+ var selector = '.row>*' + disallowedChildren + ',.form-row>*' + disallowedChildren ;
780767
781768 var nonColRowChildren = $ ( selector ) ;
782769 if ( nonColRowChildren . length ) {
783- reporter('Only columns (`.col-*-* `) may be children of `.row`s', nonColRowChildren);
770+ reporter ( 'Only columns (`.col* `) or `.clearfix` may be children of `.row`s or `.form- row`s' , nonColRowChildren ) ;
784771 }
785772 } ) ;
786- */
787- /*
788773 addLinter ( 'E014' , function lintColParentsAreRowsOrFormGroups ( $ , reporter ) {
789774 var selector = COL_CLASSES . map ( function ( colClass ) {
790- return '*:not(.row):not(.form-group )>' + colClass + ':not(col):not(th):not(td)';
775+ return '*:not(.row):not(.form-row )>' + colClass + ':not(col):not(th):not(td)' ;
791776 } ) . join ( ',' ) ;
792777
793778 var colsOutsideRowsAndFormGroups = $ ( selector ) ;
794779 if ( colsOutsideRowsAndFormGroups . length ) {
795- reporter('Columns (`.col-*-* `) can only be children of `.row`s or `.form-group `s', colsOutsideRowsAndFormGroups);
780+ reporter ( 'Columns (`.col* `) can only be children of `.row`s or `.form-row `s' , colsOutsideRowsAndFormGroups ) ;
796781 }
797782 } ) ;
798- */
799783 /*
800784 addLinter('E015', function lintInputGroupsWithMultipleAddOnsPerSide($, reporter) {
801785 var addOnClasses = ['.input-group-addon', '.input-group-btn'];
@@ -944,7 +928,6 @@ var LocationIndex = _location.LocationIndex;
944928 }
945929 });
946930 */
947- /*
948931 addLinter ( 'E029' , function lintRedundantColumnClasses ( $ , reporter ) {
949932 var columns = $ ( COL_CLASSES . join ( ',' ) ) ;
950933 columns . each ( function ( _index , col ) {
@@ -953,27 +936,26 @@ var LocationIndex = _location.LocationIndex;
953936 var simplifiedClasses = classes ;
954937 var width2screens = width2screensFor ( classes ) ;
955938 var isRedundant = false ;
956- for (var width = 1; width <= NUM_COLS; width++) {
957- var screens = width2screens[width];
958- if (!screens) {
959- continue;
960- }
961- var runs = incrementingRunsFrom(screens);
962- if (!runs.length) {
963- continue;
964- }
939+ for ( var width in width2screens ) {
940+ if ( width2screens . hasOwnProperty ( width ) ) {
941+ var screens = width2screens [ width ] ;
942+ var runs = incrementingRunsFrom ( screens ) ;
943+ if ( ! runs . length ) {
944+ continue ;
945+ }
965946
966- isRedundant = true;
947+ isRedundant = true ;
967948
968- for (var i = 0; i < runs.length; i++) {
969- var run = runs[i];
970- var min = run[0];
971- var max = run[1];
949+ for ( var i = 0 ; i < runs . length ; i ++ ) {
950+ var run = runs [ i ] ;
951+ var min = run [ 0 ] ;
952+ var max = run [ 1 ] ;
972953
973- // remove redundant classes
974- for (var screenNum = min + 1; screenNum <= max; screenNum++) {
975- var colClass = 'col-' + NUM2SCREEN[screenNum] + '-' + width;
976- simplifiedClasses = withoutClass(simplifiedClasses, colClass);
954+ // remove redundant classes
955+ for ( var screenNum = min + 1 ; screenNum <= max ; screenNum ++ ) {
956+ var colClass = 'col' + ( NUM2SCREEN [ screenNum ] && '-' + NUM2SCREEN [ screenNum ] ) + ( width && '-' + width ) ;
957+ simplifiedClasses = withoutClass ( simplifiedClasses , colClass ) ;
958+ }
977959 }
978960 }
979961 }
@@ -992,7 +974,6 @@ var LocationIndex = _location.LocationIndex;
992974 ) ;
993975 } ) ;
994976 } ) ;
995- */
996977 /*
997978 addLinter('E030', function lintSoloGlyphiconClasses($, reporter) {
998979 var missingGlyphiconClass = $('[class*="glyphicon-"]:not(.glyphicon):not(.glyphicon-class)').filter(function () {
@@ -1076,17 +1057,15 @@ var LocationIndex = _location.LocationIndex;
10761057 }
10771058 });
10781059 */
1079- /*
10801060 addLinter ( 'E037' , function lintColZeros ( $ , reporter ) {
10811061 var selector = SCREENS . map ( function ( screen ) {
1082- return '.col-' + screen + '-0';
1062+ return '.col' + ( screen && ' -' + screen ) + '-0' ;
10831063 } ) . join ( ',' ) ;
10841064 var elements = $ ( selector ) ;
10851065 if ( elements . length ) {
1086- reporter('Column widths must be positive integers (and <= 12 by default). Found usage(s) of invalid nonexistent `.col- *-0` classes.', elements);
1066+ reporter ( 'Column widths must be positive integers (and <= 12 by default). Found usage(s) of invalid nonexistent `.col*-0` classes.' , elements ) ;
10871067 }
10881068 } ) ;
1089- */
10901069 /*
10911070 addLinter('E038', function lintMediaPulls($, reporter) {
10921071 var mediaPullsOutsideMedia = $('.media-left, .media-right').filter(function () {
@@ -1227,14 +1206,13 @@ var LocationIndex = _location.LocationIndex;
12271206 }
12281207 });
12291208 */
1230- /*
12311209 addLinter ( 'E051' , function lintColumnsNoFloats ( $ , reporter ) {
12321210 var pullSelector = COL_CLASSES . map ( function ( col ) {
1233- return '.pull -left' + col + ',.pull -right' + col;
1211+ return '.float -left' + col + ',.float -right' + col ;
12341212 } ) . join ( ',' ) ;
12351213 var pulledCols = $ ( pullSelector ) ;
12361214 if ( pulledCols . length ) {
1237- reporter('`.pull -right` and `.pull -left` must not be used on `.col-*- *` elements', pulledCols);
1215+ reporter ( '`.float -right` and `.float -left` must not be used on `.col*` elements' , pulledCols ) ;
12381216 }
12391217 var styledSelector = COL_CLASSES . map ( function ( col ) {
12401218 return col + '[style]' ;
@@ -1244,15 +1222,13 @@ var LocationIndex = _location.LocationIndex;
12441222 return / f l o a t \s * : \s * [ a - z ] + / i. test ( $ ( el ) . attr ( 'style' ) ) ;
12451223 } ) ;
12461224 if ( styledCols . length ) {
1247- reporter('Manually added `float` styles must not be added on `.col-*- *` elements', styledCols);
1225+ reporter ( 'Manually added `float` styles must not be added on `.col*` elements' , styledCols ) ;
12481226 }
12491227 } ) ;
1250- */
1251- /*
12521228 addLinter ( 'E052' , function lintRowsNoFloats ( $ , reporter ) {
1253- var pulledRows = $('.row.pull -right, .row.pull -left');
1229+ var pulledRows = $ ( '.row.float -right, .row.float -left' ) ;
12541230 if ( pulledRows . length ) {
1255- reporter('`.pull -right` and `.pull -left` must not be used on `.row` elements', pulledRows);
1231+ reporter ( '`.float -right` and `.float -left` must not be used on `.row` elements' , pulledRows ) ;
12561232 }
12571233 var styledRows = $ ( '.row[style]' ) . filter ( function ( i , el ) {
12581234 //test for `float:*` in the style attribute
@@ -1262,7 +1238,6 @@ var LocationIndex = _location.LocationIndex;
12621238 reporter ( 'Manually added `float` styles must not be added on `.row` elements' , styledRows ) ;
12631239 }
12641240 } ) ;
1265- */
12661241 exports . _lint = function ( $ , reporter , disabledIdList , html ) {
12671242 var locationIndex = IN_NODE_JS ? new LocationIndex ( html ) : null ;
12681243 var reporterWrapper = IN_NODE_JS ?
0 commit comments