sasslint 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/LICENSE.txt +22 -0
- data/README.md +29 -0
- data/bin/sasslint +6 -0
- data/lib/sasslint.rb +10 -0
- data/lib/sasslint/cli.rb +28 -0
- data/lib/sasslint/helpers/path_helper.rb +10 -0
- data/lib/sasslint/helpers/rule_importer.rb +25 -0
- data/lib/sasslint/rules/css/adjoining-classes.rb +52 -0
- data/lib/sasslint/rules/css/box-model.rb +108 -0
- data/lib/sasslint/rules/css/box-sizing.rb +35 -0
- data/lib/sasslint/rules/css/bulletproof-font-face.rb +73 -0
- data/lib/sasslint/rules/css/compatible-vendor-prefixes.rb +193 -0
- data/lib/sasslint/rules/css/display-property-grouping.rb +124 -0
- data/lib/sasslint/rules/css/duplicate-background-images.rb +44 -0
- data/lib/sasslint/rules/css/duplicate-properties.rb +53 -0
- data/lib/sasslint/rules/css/empty-rules.rb +41 -0
- data/lib/sasslint/rules/css/errors.rb +30 -0
- data/lib/sasslint/rules/css/fallback-colors.rb +84 -0
- data/lib/sasslint/rules/css/floats.rb +43 -0
- data/lib/sasslint/rules/css/font-faces.rb +37 -0
- data/lib/sasslint/rules/css/font-sizes.rb +42 -0
- data/lib/sasslint/rules/css/gradients.rb +71 -0
- data/lib/sasslint/rules/css/ids.rb +57 -0
- data/lib/sasslint/rules/css/import.rb +30 -0
- data/lib/sasslint/rules/css/important.rb +44 -0
- data/lib/sasslint/rules/css/known-properties.rb +36 -0
- data/lib/sasslint/rules/css/outline-none.rb +80 -0
- data/lib/sasslint/rules/css/overqualified-elements.rb +70 -0
- data/lib/sasslint/rules/css/qualified-headings.rb +45 -0
- data/lib/sasslint/rules/css/regex-selectors.rb +51 -0
- data/lib/sasslint/rules/css/rules-count.rb +35 -0
- data/lib/sasslint/rules/css/selector-max-approaching.rb +35 -0
- data/lib/sasslint/rules/css/selector-max.rb +35 -0
- data/lib/sasslint/rules/css/shorthand.rb +94 -0
- data/lib/sasslint/rules/css/star-property-hack.rb +34 -0
- data/lib/sasslint/rules/css/text-indent.rb +60 -0
- data/lib/sasslint/rules/css/underscore-property-hack.rb +34 -0
- data/lib/sasslint/rules/css/unique-headings.rb +81 -0
- data/lib/sasslint/rules/css/universal-selector.rb +42 -0
- data/lib/sasslint/rules/css/unqualified-attributes.rb +49 -0
- data/lib/sasslint/rules/css/vendor-prefix.rb +150 -0
- data/lib/sasslint/rules/css/zero-units.rb +41 -0
- data/lib/sasslint/version.rb +3 -0
- data/sasslint.gemspec +29 -0
- metadata +146 -0
@@ -0,0 +1,51 @@
|
|
1
|
+
# This rule is taken from https://github.com/stubbornella/csslint/tree/master/src/rules
|
2
|
+
#
|
3
|
+
#
|
4
|
+
# Copyright (c) 2011 Nicole Sullivan and Nicholas C. Zakas. All rights reserved.
|
5
|
+
# TODO: Paste the CSSLint LICENSE here.
|
6
|
+
#
|
7
|
+
#
|
8
|
+
# /*
|
9
|
+
# * Rule: Selectors that look like regular expressions are slow and should be avoided.
|
10
|
+
# */
|
11
|
+
# /*global CSSLint*/
|
12
|
+
# CSSLint.addRule({
|
13
|
+
#
|
14
|
+
# //rule information
|
15
|
+
# id: "regex-selectors",
|
16
|
+
# name: "Disallow selectors that look like regexs",
|
17
|
+
# desc: "Selectors that look like regular expressions are slow and should be avoided.",
|
18
|
+
# browsers: "All",
|
19
|
+
#
|
20
|
+
# //initialization
|
21
|
+
# init: function(parser, reporter){
|
22
|
+
# var rule = this;
|
23
|
+
#
|
24
|
+
# parser.addListener("startrule", function(event){
|
25
|
+
# var selectors = event.selectors,
|
26
|
+
# selector,
|
27
|
+
# part,
|
28
|
+
# modifier,
|
29
|
+
# i, j, k;
|
30
|
+
#
|
31
|
+
# for (i=0; i < selectors.length; i++){
|
32
|
+
# selector = selectors[i];
|
33
|
+
# for (j=0; j < selector.parts.length; j++){
|
34
|
+
# part = selector.parts[j];
|
35
|
+
# if (part.type == parser.SELECTOR_PART_TYPE){
|
36
|
+
# for (k=0; k < part.modifiers.length; k++){
|
37
|
+
# modifier = part.modifiers[k];
|
38
|
+
# if (modifier.type == "attribute"){
|
39
|
+
# if (/([\~\|\^\$\*]=)/.test(modifier)){
|
40
|
+
# reporter.report("Attribute selectors with " + RegExp.$1 + " are slow!", modifier.line, modifier.col, rule);
|
41
|
+
# }
|
42
|
+
# }
|
43
|
+
#
|
44
|
+
# }
|
45
|
+
# }
|
46
|
+
# }
|
47
|
+
# }
|
48
|
+
# });
|
49
|
+
# }
|
50
|
+
#
|
51
|
+
# });
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# This rule is taken from https://github.com/stubbornella/csslint/tree/master/src/rules
|
2
|
+
#
|
3
|
+
#
|
4
|
+
# Copyright (c) 2011 Nicole Sullivan and Nicholas C. Zakas. All rights reserved.
|
5
|
+
# TODO: Paste the CSSLint LICENSE here.
|
6
|
+
#
|
7
|
+
#
|
8
|
+
# /*
|
9
|
+
# * Rule: Total number of rules should not exceed x.
|
10
|
+
# */
|
11
|
+
# /*global CSSLint*/
|
12
|
+
# CSSLint.addRule({
|
13
|
+
#
|
14
|
+
# //rule information
|
15
|
+
# id: "rules-count",
|
16
|
+
# name: "Rules Count",
|
17
|
+
# desc: "Track how many rules there are.",
|
18
|
+
# browsers: "All",
|
19
|
+
#
|
20
|
+
# //initialization
|
21
|
+
# init: function(parser, reporter){
|
22
|
+
# var rule = this,
|
23
|
+
# count = 0;
|
24
|
+
#
|
25
|
+
# //count each rule
|
26
|
+
# parser.addListener("startrule", function(){
|
27
|
+
# count++;
|
28
|
+
# });
|
29
|
+
#
|
30
|
+
# parser.addListener("endstylesheet", function(){
|
31
|
+
# reporter.stat("rule-count", count);
|
32
|
+
# });
|
33
|
+
# }
|
34
|
+
#
|
35
|
+
# });
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# This rule is taken from https://github.com/stubbornella/csslint/tree/master/src/rules
|
2
|
+
#
|
3
|
+
#
|
4
|
+
# Copyright (c) 2011 Nicole Sullivan and Nicholas C. Zakas. All rights reserved.
|
5
|
+
# TODO: Paste the CSSLint LICENSE here.
|
6
|
+
#
|
7
|
+
#
|
8
|
+
# /*
|
9
|
+
# * Rule: Warn people with approaching the IE 4095 limit
|
10
|
+
# */
|
11
|
+
# /*global CSSLint*/
|
12
|
+
# CSSLint.addRule({
|
13
|
+
#
|
14
|
+
# //rule information
|
15
|
+
# id: "selector-max-approaching",
|
16
|
+
# name: "Warn when approaching the 4095 selector limit for IE",
|
17
|
+
# desc: "Will warn when selector count is >= 3800 selectors.",
|
18
|
+
# browsers: "IE",
|
19
|
+
#
|
20
|
+
# //initialization
|
21
|
+
# init: function(parser, reporter) {
|
22
|
+
# var rule = this, count = 0;
|
23
|
+
#
|
24
|
+
# parser.addListener('startrule', function(event) {
|
25
|
+
# count += event.selectors.length;
|
26
|
+
# });
|
27
|
+
#
|
28
|
+
# parser.addListener("endstylesheet", function() {
|
29
|
+
# if (count >= 3800) {
|
30
|
+
# reporter.report("You have " + count + " selectors. Internet Explorer supports a maximum of 4095 selectors per stylesheet. Consider refactoring.",0,0,rule);
|
31
|
+
# }
|
32
|
+
# });
|
33
|
+
# }
|
34
|
+
#
|
35
|
+
# });
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# This rule is taken from https://github.com/stubbornella/csslint/tree/master/src/rules
|
2
|
+
#
|
3
|
+
#
|
4
|
+
# Copyright (c) 2011 Nicole Sullivan and Nicholas C. Zakas. All rights reserved.
|
5
|
+
# TODO: Paste the CSSLint LICENSE here.
|
6
|
+
#
|
7
|
+
#
|
8
|
+
# /*
|
9
|
+
# * Rule: Warn people past the IE 4095 limit
|
10
|
+
# */
|
11
|
+
# /*global CSSLint*/
|
12
|
+
# CSSLint.addRule({
|
13
|
+
#
|
14
|
+
# //rule information
|
15
|
+
# id: "selector-max",
|
16
|
+
# name: "Error when past the 4095 selector limit for IE",
|
17
|
+
# desc: "Will error when selector count is > 4095.",
|
18
|
+
# browsers: "IE",
|
19
|
+
#
|
20
|
+
# //initialization
|
21
|
+
# init: function(parser, reporter){
|
22
|
+
# var rule = this, count = 0;
|
23
|
+
#
|
24
|
+
# parser.addListener('startrule',function(event) {
|
25
|
+
# count += event.selectors.length;
|
26
|
+
# });
|
27
|
+
#
|
28
|
+
# parser.addListener("endstylesheet", function() {
|
29
|
+
# if (count > 4095) {
|
30
|
+
# reporter.report("You have " + count + " selectors. Internet Explorer supports a maximum of 4095 selectors per stylesheet. Consider refactoring.",0,0,rule);
|
31
|
+
# }
|
32
|
+
# });
|
33
|
+
# }
|
34
|
+
#
|
35
|
+
# });
|
@@ -0,0 +1,94 @@
|
|
1
|
+
# This rule is taken from https://github.com/stubbornella/csslint/tree/master/src/rules
|
2
|
+
#
|
3
|
+
#
|
4
|
+
# Copyright (c) 2011 Nicole Sullivan and Nicholas C. Zakas. All rights reserved.
|
5
|
+
# TODO: Paste the CSSLint LICENSE here.
|
6
|
+
#
|
7
|
+
#
|
8
|
+
# /*
|
9
|
+
# * Rule: Use shorthand properties where possible.
|
10
|
+
# *
|
11
|
+
# */
|
12
|
+
# /*global CSSLint*/
|
13
|
+
# CSSLint.addRule({
|
14
|
+
#
|
15
|
+
# //rule information
|
16
|
+
# id: "shorthand",
|
17
|
+
# name: "Require shorthand properties",
|
18
|
+
# desc: "Use shorthand properties where possible.",
|
19
|
+
# browsers: "All",
|
20
|
+
#
|
21
|
+
# //initialization
|
22
|
+
# init: function(parser, reporter){
|
23
|
+
# var rule = this,
|
24
|
+
# prop, i, len,
|
25
|
+
# propertiesToCheck = {},
|
26
|
+
# properties,
|
27
|
+
# mapping = {
|
28
|
+
# "margin": [
|
29
|
+
# "margin-top",
|
30
|
+
# "margin-bottom",
|
31
|
+
# "margin-left",
|
32
|
+
# "margin-right"
|
33
|
+
# ],
|
34
|
+
# "padding": [
|
35
|
+
# "padding-top",
|
36
|
+
# "padding-bottom",
|
37
|
+
# "padding-left",
|
38
|
+
# "padding-right"
|
39
|
+
# ]
|
40
|
+
# };
|
41
|
+
#
|
42
|
+
# //initialize propertiesToCheck
|
43
|
+
# for (prop in mapping){
|
44
|
+
# if (mapping.hasOwnProperty(prop)){
|
45
|
+
# for (i=0, len=mapping[prop].length; i < len; i++){
|
46
|
+
# propertiesToCheck[mapping[prop][i]] = prop;
|
47
|
+
# }
|
48
|
+
# }
|
49
|
+
# }
|
50
|
+
#
|
51
|
+
# function startRule(event){
|
52
|
+
# properties = {};
|
53
|
+
# }
|
54
|
+
#
|
55
|
+
# //event handler for end of rules
|
56
|
+
# function endRule(event){
|
57
|
+
#
|
58
|
+
# var prop, i, len, total;
|
59
|
+
#
|
60
|
+
# //check which properties this rule has
|
61
|
+
# for (prop in mapping){
|
62
|
+
# if (mapping.hasOwnProperty(prop)){
|
63
|
+
# total=0;
|
64
|
+
#
|
65
|
+
# for (i=0, len=mapping[prop].length; i < len; i++){
|
66
|
+
# total += properties[mapping[prop][i]] ? 1 : 0;
|
67
|
+
# }
|
68
|
+
#
|
69
|
+
# if (total == mapping[prop].length){
|
70
|
+
# reporter.report("The properties " + mapping[prop].join(", ") + " can be replaced by " + prop + ".", event.line, event.col, rule);
|
71
|
+
# }
|
72
|
+
# }
|
73
|
+
# }
|
74
|
+
# }
|
75
|
+
#
|
76
|
+
# parser.addListener("startrule", startRule);
|
77
|
+
# parser.addListener("startfontface", startRule);
|
78
|
+
#
|
79
|
+
# //check for use of "font-size"
|
80
|
+
# parser.addListener("property", function(event){
|
81
|
+
# var name = event.property.toString().toLowerCase(),
|
82
|
+
# value = event.value.parts[0].value;
|
83
|
+
#
|
84
|
+
# if (propertiesToCheck[name]){
|
85
|
+
# properties[name] = 1;
|
86
|
+
# }
|
87
|
+
# });
|
88
|
+
#
|
89
|
+
# parser.addListener("endrule", endRule);
|
90
|
+
# parser.addListener("endfontface", endRule);
|
91
|
+
#
|
92
|
+
# }
|
93
|
+
#
|
94
|
+
# });
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# This rule is taken from https://github.com/stubbornella/csslint/tree/master/src/rules
|
2
|
+
#
|
3
|
+
#
|
4
|
+
# Copyright (c) 2011 Nicole Sullivan and Nicholas C. Zakas. All rights reserved.
|
5
|
+
# TODO: Paste the CSSLint LICENSE here.
|
6
|
+
#
|
7
|
+
#
|
8
|
+
# /*
|
9
|
+
# * Rule: Don't use properties with a star prefix.
|
10
|
+
# *
|
11
|
+
# */
|
12
|
+
# /*global CSSLint*/
|
13
|
+
# CSSLint.addRule({
|
14
|
+
#
|
15
|
+
# //rule information
|
16
|
+
# id: "star-property-hack",
|
17
|
+
# name: "Disallow properties with a star prefix",
|
18
|
+
# desc: "Checks for the star property hack (targets IE6/7)",
|
19
|
+
# browsers: "All",
|
20
|
+
#
|
21
|
+
# //initialization
|
22
|
+
# init: function(parser, reporter){
|
23
|
+
# var rule = this;
|
24
|
+
#
|
25
|
+
# //check if property name starts with "*"
|
26
|
+
# parser.addListener("property", function(event){
|
27
|
+
# var property = event.property;
|
28
|
+
#
|
29
|
+
# if (property.hack == "*") {
|
30
|
+
# reporter.report("Property with star prefix found.", event.property.line, event.property.col, rule);
|
31
|
+
# }
|
32
|
+
# });
|
33
|
+
# }
|
34
|
+
# });
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# This rule is taken from https://github.com/stubbornella/csslint/tree/master/src/rules
|
2
|
+
#
|
3
|
+
#
|
4
|
+
# Copyright (c) 2011 Nicole Sullivan and Nicholas C. Zakas. All rights reserved.
|
5
|
+
# TODO: Paste the CSSLint LICENSE here.
|
6
|
+
#
|
7
|
+
#
|
8
|
+
# /*
|
9
|
+
# * Rule: Don't use text-indent for image replacement if you need to support rtl.
|
10
|
+
# *
|
11
|
+
# */
|
12
|
+
# /*global CSSLint*/
|
13
|
+
# CSSLint.addRule({
|
14
|
+
#
|
15
|
+
# //rule information
|
16
|
+
# id: "text-indent",
|
17
|
+
# name: "Disallow negative text-indent",
|
18
|
+
# desc: "Checks for text indent less than -99px",
|
19
|
+
# browsers: "All",
|
20
|
+
#
|
21
|
+
# //initialization
|
22
|
+
# init: function(parser, reporter){
|
23
|
+
# var rule = this,
|
24
|
+
# textIndent,
|
25
|
+
# direction;
|
26
|
+
#
|
27
|
+
#
|
28
|
+
# function startRule(event){
|
29
|
+
# textIndent = false;
|
30
|
+
# direction = "inherit";
|
31
|
+
# }
|
32
|
+
#
|
33
|
+
# //event handler for end of rules
|
34
|
+
# function endRule(event){
|
35
|
+
# if (textIndent && direction != "ltr"){
|
36
|
+
# reporter.report("Negative text-indent doesn't work well with RTL. If you use text-indent for image replacement explicitly set direction for that item to ltr.", textIndent.line, textIndent.col, rule);
|
37
|
+
# }
|
38
|
+
# }
|
39
|
+
#
|
40
|
+
# parser.addListener("startrule", startRule);
|
41
|
+
# parser.addListener("startfontface", startRule);
|
42
|
+
#
|
43
|
+
# //check for use of "font-size"
|
44
|
+
# parser.addListener("property", function(event){
|
45
|
+
# var name = event.property.toString().toLowerCase(),
|
46
|
+
# value = event.value;
|
47
|
+
#
|
48
|
+
# if (name == "text-indent" && value.parts[0].value < -99){
|
49
|
+
# textIndent = event.property;
|
50
|
+
# } else if (name == "direction" && value == "ltr"){
|
51
|
+
# direction = "ltr";
|
52
|
+
# }
|
53
|
+
# });
|
54
|
+
#
|
55
|
+
# parser.addListener("endrule", endRule);
|
56
|
+
# parser.addListener("endfontface", endRule);
|
57
|
+
#
|
58
|
+
# }
|
59
|
+
#
|
60
|
+
# });
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# This rule is taken from https://github.com/stubbornella/csslint/tree/master/src/rules
|
2
|
+
#
|
3
|
+
#
|
4
|
+
# Copyright (c) 2011 Nicole Sullivan and Nicholas C. Zakas. All rights reserved.
|
5
|
+
# TODO: Paste the CSSLint LICENSE here.
|
6
|
+
#
|
7
|
+
#
|
8
|
+
# /*
|
9
|
+
# * Rule: Don't use properties with a underscore prefix.
|
10
|
+
# *
|
11
|
+
# */
|
12
|
+
# /*global CSSLint*/
|
13
|
+
# CSSLint.addRule({
|
14
|
+
#
|
15
|
+
# //rule information
|
16
|
+
# id: "underscore-property-hack",
|
17
|
+
# name: "Disallow properties with an underscore prefix",
|
18
|
+
# desc: "Checks for the underscore property hack (targets IE6)",
|
19
|
+
# browsers: "All",
|
20
|
+
#
|
21
|
+
# //initialization
|
22
|
+
# init: function(parser, reporter){
|
23
|
+
# var rule = this;
|
24
|
+
#
|
25
|
+
# //check if property name starts with "_"
|
26
|
+
# parser.addListener("property", function(event){
|
27
|
+
# var property = event.property;
|
28
|
+
#
|
29
|
+
# if (property.hack == "_") {
|
30
|
+
# reporter.report("Property with underscore prefix found.", event.property.line, event.property.col, rule);
|
31
|
+
# }
|
32
|
+
# });
|
33
|
+
# }
|
34
|
+
# });
|
@@ -0,0 +1,81 @@
|
|
1
|
+
# This rule is taken from https://github.com/stubbornella/csslint/tree/master/src/rules
|
2
|
+
#
|
3
|
+
#
|
4
|
+
# Copyright (c) 2011 Nicole Sullivan and Nicholas C. Zakas. All rights reserved.
|
5
|
+
# TODO: Paste the CSSLint LICENSE here.
|
6
|
+
#
|
7
|
+
#
|
8
|
+
# /*
|
9
|
+
# * Rule: Headings (h1-h6) should be defined only once.
|
10
|
+
# */
|
11
|
+
# /*global CSSLint*/
|
12
|
+
# CSSLint.addRule({
|
13
|
+
#
|
14
|
+
# //rule information
|
15
|
+
# id: "unique-headings",
|
16
|
+
# name: "Headings should only be defined once",
|
17
|
+
# desc: "Headings should be defined only once.",
|
18
|
+
# browsers: "All",
|
19
|
+
#
|
20
|
+
# //initialization
|
21
|
+
# init: function(parser, reporter){
|
22
|
+
# var rule = this;
|
23
|
+
#
|
24
|
+
# var headings = {
|
25
|
+
# h1: 0,
|
26
|
+
# h2: 0,
|
27
|
+
# h3: 0,
|
28
|
+
# h4: 0,
|
29
|
+
# h5: 0,
|
30
|
+
# h6: 0
|
31
|
+
# };
|
32
|
+
#
|
33
|
+
# parser.addListener("startrule", function(event){
|
34
|
+
# var selectors = event.selectors,
|
35
|
+
# selector,
|
36
|
+
# part,
|
37
|
+
# pseudo,
|
38
|
+
# i, j;
|
39
|
+
#
|
40
|
+
# for (i=0; i < selectors.length; i++){
|
41
|
+
# selector = selectors[i];
|
42
|
+
# part = selector.parts[selector.parts.length-1];
|
43
|
+
#
|
44
|
+
# if (part.elementName && /(h[1-6])/i.test(part.elementName.toString())){
|
45
|
+
#
|
46
|
+
# for (j=0; j < part.modifiers.length; j++){
|
47
|
+
# if (part.modifiers[j].type == "pseudo"){
|
48
|
+
# pseudo = true;
|
49
|
+
# break;
|
50
|
+
# }
|
51
|
+
# }
|
52
|
+
#
|
53
|
+
# if (!pseudo){
|
54
|
+
# headings[RegExp.$1]++;
|
55
|
+
# if (headings[RegExp.$1] > 1) {
|
56
|
+
# reporter.report("Heading (" + part.elementName + ") has already been defined.", part.line, part.col, rule);
|
57
|
+
# }
|
58
|
+
# }
|
59
|
+
# }
|
60
|
+
# }
|
61
|
+
# });
|
62
|
+
#
|
63
|
+
# parser.addListener("endstylesheet", function(event){
|
64
|
+
# var prop,
|
65
|
+
# messages = [];
|
66
|
+
#
|
67
|
+
# for (prop in headings){
|
68
|
+
# if (headings.hasOwnProperty(prop)){
|
69
|
+
# if (headings[prop] > 1){
|
70
|
+
# messages.push(headings[prop] + " " + prop + "s");
|
71
|
+
# }
|
72
|
+
# }
|
73
|
+
# }
|
74
|
+
#
|
75
|
+
# if (messages.length){
|
76
|
+
# reporter.rollupWarn("You have " + messages.join(", ") + " defined in this stylesheet.", rule);
|
77
|
+
# }
|
78
|
+
# });
|
79
|
+
# }
|
80
|
+
#
|
81
|
+
# });
|