sasslint 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +15 -0
  2. data/LICENSE.txt +22 -0
  3. data/README.md +29 -0
  4. data/bin/sasslint +6 -0
  5. data/lib/sasslint.rb +10 -0
  6. data/lib/sasslint/cli.rb +28 -0
  7. data/lib/sasslint/helpers/path_helper.rb +10 -0
  8. data/lib/sasslint/helpers/rule_importer.rb +25 -0
  9. data/lib/sasslint/rules/css/adjoining-classes.rb +52 -0
  10. data/lib/sasslint/rules/css/box-model.rb +108 -0
  11. data/lib/sasslint/rules/css/box-sizing.rb +35 -0
  12. data/lib/sasslint/rules/css/bulletproof-font-face.rb +73 -0
  13. data/lib/sasslint/rules/css/compatible-vendor-prefixes.rb +193 -0
  14. data/lib/sasslint/rules/css/display-property-grouping.rb +124 -0
  15. data/lib/sasslint/rules/css/duplicate-background-images.rb +44 -0
  16. data/lib/sasslint/rules/css/duplicate-properties.rb +53 -0
  17. data/lib/sasslint/rules/css/empty-rules.rb +41 -0
  18. data/lib/sasslint/rules/css/errors.rb +30 -0
  19. data/lib/sasslint/rules/css/fallback-colors.rb +84 -0
  20. data/lib/sasslint/rules/css/floats.rb +43 -0
  21. data/lib/sasslint/rules/css/font-faces.rb +37 -0
  22. data/lib/sasslint/rules/css/font-sizes.rb +42 -0
  23. data/lib/sasslint/rules/css/gradients.rb +71 -0
  24. data/lib/sasslint/rules/css/ids.rb +57 -0
  25. data/lib/sasslint/rules/css/import.rb +30 -0
  26. data/lib/sasslint/rules/css/important.rb +44 -0
  27. data/lib/sasslint/rules/css/known-properties.rb +36 -0
  28. data/lib/sasslint/rules/css/outline-none.rb +80 -0
  29. data/lib/sasslint/rules/css/overqualified-elements.rb +70 -0
  30. data/lib/sasslint/rules/css/qualified-headings.rb +45 -0
  31. data/lib/sasslint/rules/css/regex-selectors.rb +51 -0
  32. data/lib/sasslint/rules/css/rules-count.rb +35 -0
  33. data/lib/sasslint/rules/css/selector-max-approaching.rb +35 -0
  34. data/lib/sasslint/rules/css/selector-max.rb +35 -0
  35. data/lib/sasslint/rules/css/shorthand.rb +94 -0
  36. data/lib/sasslint/rules/css/star-property-hack.rb +34 -0
  37. data/lib/sasslint/rules/css/text-indent.rb +60 -0
  38. data/lib/sasslint/rules/css/underscore-property-hack.rb +34 -0
  39. data/lib/sasslint/rules/css/unique-headings.rb +81 -0
  40. data/lib/sasslint/rules/css/universal-selector.rb +42 -0
  41. data/lib/sasslint/rules/css/unqualified-attributes.rb +49 -0
  42. data/lib/sasslint/rules/css/vendor-prefix.rb +150 -0
  43. data/lib/sasslint/rules/css/zero-units.rb +41 -0
  44. data/lib/sasslint/version.rb +3 -0
  45. data/sasslint.gemspec +29 -0
  46. metadata +146 -0
@@ -0,0 +1,124 @@
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: Certain properties don't play well with certain display values.
10
+ # * - float should not be used with inline-block
11
+ # * - height, width, margin-top, margin-bottom, float should not be used with inline
12
+ # * - vertical-align should not be used with block
13
+ # * - margin, float should not be used with table-*
14
+ # */
15
+ # /*global CSSLint*/
16
+ # CSSLint.addRule({
17
+ #
18
+ # //rule information
19
+ # id: "display-property-grouping",
20
+ # name: "Require properties appropriate for display",
21
+ # desc: "Certain properties shouldn't be used with certain display property values.",
22
+ # browsers: "All",
23
+ #
24
+ # //initialization
25
+ # init: function(parser, reporter){
26
+ # var rule = this;
27
+ #
28
+ # var propertiesToCheck = {
29
+ # display: 1,
30
+ # "float": "none",
31
+ # height: 1,
32
+ # width: 1,
33
+ # margin: 1,
34
+ # "margin-left": 1,
35
+ # "margin-right": 1,
36
+ # "margin-bottom": 1,
37
+ # "margin-top": 1,
38
+ # padding: 1,
39
+ # "padding-left": 1,
40
+ # "padding-right": 1,
41
+ # "padding-bottom": 1,
42
+ # "padding-top": 1,
43
+ # "vertical-align": 1
44
+ # },
45
+ # properties;
46
+ #
47
+ # function reportProperty(name, display, msg){
48
+ # if (properties[name]){
49
+ # if (typeof propertiesToCheck[name] != "string" || properties[name].value.toLowerCase() != propertiesToCheck[name]){
50
+ # reporter.report(msg || name + " can't be used with display: " + display + ".", properties[name].line, properties[name].col, rule);
51
+ # }
52
+ # }
53
+ # }
54
+ #
55
+ # function startRule(){
56
+ # properties = {};
57
+ # }
58
+ #
59
+ # function endRule(){
60
+ #
61
+ # var display = properties.display ? properties.display.value : null;
62
+ # if (display){
63
+ # switch(display){
64
+ #
65
+ # case "inline":
66
+ # //height, width, margin-top, margin-bottom, float should not be used with inline
67
+ # reportProperty("height", display);
68
+ # reportProperty("width", display);
69
+ # reportProperty("margin", display);
70
+ # reportProperty("margin-top", display);
71
+ # reportProperty("margin-bottom", display);
72
+ # reportProperty("float", display, "display:inline has no effect on floated elements (but may be used to fix the IE6 double-margin bug).");
73
+ # break;
74
+ #
75
+ # case "block":
76
+ # //vertical-align should not be used with block
77
+ # reportProperty("vertical-align", display);
78
+ # break;
79
+ #
80
+ # case "inline-block":
81
+ # //float should not be used with inline-block
82
+ # reportProperty("float", display);
83
+ # break;
84
+ #
85
+ # default:
86
+ # //margin, float should not be used with table
87
+ # if (display.indexOf("table-") === 0){
88
+ # reportProperty("margin", display);
89
+ # reportProperty("margin-left", display);
90
+ # reportProperty("margin-right", display);
91
+ # reportProperty("margin-top", display);
92
+ # reportProperty("margin-bottom", display);
93
+ # reportProperty("float", display);
94
+ # }
95
+ #
96
+ # //otherwise do nothing
97
+ # }
98
+ # }
99
+ #
100
+ # }
101
+ #
102
+ # parser.addListener("startrule", startRule);
103
+ # parser.addListener("startfontface", startRule);
104
+ # parser.addListener("startkeyframerule", startRule);
105
+ # parser.addListener("startpagemargin", startRule);
106
+ # parser.addListener("startpage", startRule);
107
+ #
108
+ # parser.addListener("property", function(event){
109
+ # var name = event.property.text.toLowerCase();
110
+ #
111
+ # if (propertiesToCheck[name]){
112
+ # properties[name] = { value: event.value.text, line: event.property.line, col: event.property.col };
113
+ # }
114
+ # });
115
+ #
116
+ # parser.addListener("endrule", endRule);
117
+ # parser.addListener("endfontface", endRule);
118
+ # parser.addListener("endkeyframerule", endRule);
119
+ # parser.addListener("endpagemargin", endRule);
120
+ # parser.addListener("endpage", endRule);
121
+ #
122
+ # }
123
+ #
124
+ # });
@@ -0,0 +1,44 @@
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: Disallow duplicate background-images (using url).
10
+ # */
11
+ # /*global CSSLint*/
12
+ # CSSLint.addRule({
13
+ #
14
+ # //rule information
15
+ # id: "duplicate-background-images",
16
+ # name: "Disallow duplicate background images",
17
+ # desc: "Every background-image should be unique. Use a common class for e.g. sprites.",
18
+ # browsers: "All",
19
+ #
20
+ # //initialization
21
+ # init: function(parser, reporter){
22
+ # var rule = this,
23
+ # stack = {};
24
+ #
25
+ # parser.addListener("property", function(event){
26
+ # var name = event.property.text,
27
+ # value = event.value,
28
+ # i, len;
29
+ #
30
+ # if (name.match(/background/i)) {
31
+ # for (i=0, len=value.parts.length; i < len; i++) {
32
+ # if (value.parts[i].type == 'uri') {
33
+ # if (typeof stack[value.parts[i].uri] === 'undefined') {
34
+ # stack[value.parts[i].uri] = event;
35
+ # }
36
+ # else {
37
+ # reporter.report("Background image '" + value.parts[i].uri + "' was used multiple times, first declared at line " + stack[value.parts[i].uri].line + ", col " + stack[value.parts[i].uri].col + ".", event.line, event.col, rule);
38
+ # }
39
+ # }
40
+ # }
41
+ # }
42
+ # });
43
+ # }
44
+ # });
@@ -0,0 +1,53 @@
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: Duplicate properties must appear one after the other. If an already-defined
10
+ # * property appears somewhere else in the rule, then it's likely an error.
11
+ # */
12
+ # /*global CSSLint*/
13
+ # CSSLint.addRule({
14
+ #
15
+ # //rule information
16
+ # id: "duplicate-properties",
17
+ # name: "Disallow duplicate properties",
18
+ # desc: "Duplicate properties must appear one after the other.",
19
+ # browsers: "All",
20
+ #
21
+ # //initialization
22
+ # init: function(parser, reporter){
23
+ # var rule = this,
24
+ # properties,
25
+ # lastProperty;
26
+ #
27
+ # function startRule(event){
28
+ # properties = {};
29
+ # }
30
+ #
31
+ # parser.addListener("startrule", startRule);
32
+ # parser.addListener("startfontface", startRule);
33
+ # parser.addListener("startpage", startRule);
34
+ # parser.addListener("startpagemargin", startRule);
35
+ # parser.addListener("startkeyframerule", startRule);
36
+ #
37
+ # parser.addListener("property", function(event){
38
+ # var property = event.property,
39
+ # name = property.text.toLowerCase();
40
+ #
41
+ # if (properties[name] && (lastProperty != name || properties[name] == event.value.text)){
42
+ # reporter.report("Duplicate property '" + event.property + "' found.", event.line, event.col, rule);
43
+ # }
44
+ #
45
+ # properties[name] = event.value.text;
46
+ # lastProperty = name;
47
+ #
48
+ # });
49
+ #
50
+ #
51
+ # }
52
+ #
53
+ # });
@@ -0,0 +1,41 @@
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: Style rules without any properties defined should be removed.
10
+ # */
11
+ # /*global CSSLint*/
12
+ # CSSLint.addRule({
13
+ #
14
+ # //rule information
15
+ # id: "empty-rules",
16
+ # name: "Disallow empty rules",
17
+ # desc: "Rules without any properties specified should be removed.",
18
+ # browsers: "All",
19
+ #
20
+ # //initialization
21
+ # init: function(parser, reporter){
22
+ # var rule = this,
23
+ # count = 0;
24
+ #
25
+ # parser.addListener("startrule", function(){
26
+ # count=0;
27
+ # });
28
+ #
29
+ # parser.addListener("property", function(){
30
+ # count++;
31
+ # });
32
+ #
33
+ # parser.addListener("endrule", function(event){
34
+ # var selectors = event.selectors;
35
+ # if (count === 0){
36
+ # reporter.report("Rule is empty.", selectors[0].line, selectors[0].col, rule);
37
+ # }
38
+ # });
39
+ # }
40
+ #
41
+ # });
@@ -0,0 +1,30 @@
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: There should be no syntax errors. (Duh.)
10
+ # */
11
+ # /*global CSSLint*/
12
+ # CSSLint.addRule({
13
+ #
14
+ # //rule information
15
+ # id: "errors",
16
+ # name: "Parsing Errors",
17
+ # desc: "This rule looks for recoverable syntax errors.",
18
+ # browsers: "All",
19
+ #
20
+ # //initialization
21
+ # init: function(parser, reporter){
22
+ # var rule = this;
23
+ #
24
+ # parser.addListener("error", function(event){
25
+ # reporter.error(event.message, event.line, event.col, rule);
26
+ # });
27
+ #
28
+ # }
29
+ #
30
+ # });
@@ -0,0 +1,84 @@
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
+ # /*global CSSLint*/
10
+ # CSSLint.addRule({
11
+ #
12
+ # //rule information
13
+ # id: "fallback-colors",
14
+ # name: "Require fallback colors",
15
+ # desc: "For older browsers that don't support RGBA, HSL, or HSLA, provide a fallback color.",
16
+ # browsers: "IE6,IE7,IE8",
17
+ #
18
+ # //initialization
19
+ # init: function(parser, reporter){
20
+ # var rule = this,
21
+ # lastProperty,
22
+ # propertiesToCheck = {
23
+ # color: 1,
24
+ # background: 1,
25
+ # "border-color": 1,
26
+ # "border-top-color": 1,
27
+ # "border-right-color": 1,
28
+ # "border-bottom-color": 1,
29
+ # "border-left-color": 1,
30
+ # border: 1,
31
+ # "border-top": 1,
32
+ # "border-right": 1,
33
+ # "border-bottom": 1,
34
+ # "border-left": 1,
35
+ # "background-color": 1
36
+ # },
37
+ # properties;
38
+ #
39
+ # function startRule(event){
40
+ # properties = {};
41
+ # lastProperty = null;
42
+ # }
43
+ #
44
+ # parser.addListener("startrule", startRule);
45
+ # parser.addListener("startfontface", startRule);
46
+ # parser.addListener("startpage", startRule);
47
+ # parser.addListener("startpagemargin", startRule);
48
+ # parser.addListener("startkeyframerule", startRule);
49
+ #
50
+ # parser.addListener("property", function(event){
51
+ # var property = event.property,
52
+ # name = property.text.toLowerCase(),
53
+ # parts = event.value.parts,
54
+ # i = 0,
55
+ # colorType = "",
56
+ # len = parts.length;
57
+ #
58
+ # if(propertiesToCheck[name]){
59
+ # while(i < len){
60
+ # if (parts[i].type == "color"){
61
+ # if ("alpha" in parts[i] || "hue" in parts[i]){
62
+ #
63
+ # if (/([^\)]+)\(/.test(parts[i])){
64
+ # colorType = RegExp.$1.toUpperCase();
65
+ # }
66
+ #
67
+ # if (!lastProperty || (lastProperty.property.text.toLowerCase() != name || lastProperty.colorType != "compat")){
68
+ # reporter.report("Fallback " + name + " (hex or RGB) should precede " + colorType + " " + name + ".", event.line, event.col, rule);
69
+ # }
70
+ # } else {
71
+ # event.colorType = "compat";
72
+ # }
73
+ # }
74
+ #
75
+ # i++;
76
+ # }
77
+ # }
78
+ #
79
+ # lastProperty = event;
80
+ # });
81
+ #
82
+ # }
83
+ #
84
+ # });
@@ -0,0 +1,43 @@
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: You shouldn't use more than 10 floats. If you do, there's probably
10
+ # * room for some abstraction.
11
+ # */
12
+ # /*global CSSLint*/
13
+ # CSSLint.addRule({
14
+ #
15
+ # //rule information
16
+ # id: "floats",
17
+ # name: "Disallow too many floats",
18
+ # desc: "This rule tests if the float property is used too many times",
19
+ # browsers: "All",
20
+ #
21
+ # //initialization
22
+ # init: function(parser, reporter){
23
+ # var rule = this;
24
+ # var count = 0;
25
+ #
26
+ # //count how many times "float" is used
27
+ # parser.addListener("property", function(event){
28
+ # if (event.property.text.toLowerCase() == "float" &&
29
+ # event.value.text.toLowerCase() != "none"){
30
+ # count++;
31
+ # }
32
+ # });
33
+ #
34
+ # //report the results
35
+ # parser.addListener("endstylesheet", function(){
36
+ # reporter.stat("floats", count);
37
+ # if (count >= 10){
38
+ # reporter.rollupWarn("Too many floats (" + count + "), you're probably using them for layout. Consider using a grid system instead.", rule);
39
+ # }
40
+ # });
41
+ # }
42
+ #
43
+ # });
@@ -0,0 +1,37 @@
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: Avoid too many @font-face declarations in the same stylesheet.
10
+ # */
11
+ # /*global CSSLint*/
12
+ # CSSLint.addRule({
13
+ #
14
+ # //rule information
15
+ # id: "font-faces",
16
+ # name: "Don't use too many web fonts",
17
+ # desc: "Too many different web fonts in the same stylesheet.",
18
+ # browsers: "All",
19
+ #
20
+ # //initialization
21
+ # init: function(parser, reporter){
22
+ # var rule = this,
23
+ # count = 0;
24
+ #
25
+ #
26
+ # parser.addListener("startfontface", function(){
27
+ # count++;
28
+ # });
29
+ #
30
+ # parser.addListener("endstylesheet", function(){
31
+ # if (count > 5){
32
+ # reporter.rollupWarn("Too many @font-face declarations (" + count + ").", rule);
33
+ # }
34
+ # });
35
+ # }
36
+ #
37
+ # });