ruby_css_lint 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (118) hide show
  1. data/.document +5 -0
  2. data/Gemfile +13 -0
  3. data/LICENSE.txt +20 -0
  4. data/README.rdoc +19 -0
  5. data/Rakefile +71 -0
  6. data/VERSION +1 -0
  7. data/csslint/CHANGELOG +286 -0
  8. data/csslint/LICENSE +20 -0
  9. data/csslint/README.md +25 -0
  10. data/csslint/build.xml +242 -0
  11. data/csslint/demos/CSSLintDemo.htm +105 -0
  12. data/csslint/demos/demo.css +43 -0
  13. data/csslint/lib/js.jar +0 -0
  14. data/csslint/lib/jshint.js +3963 -0
  15. data/csslint/lib/parserlib.js +6295 -0
  16. data/csslint/lib/yuitest-rhino-cli.js +3955 -0
  17. data/csslint/lib/yuitest.js +4561 -0
  18. data/csslint/npm/package.json +30 -0
  19. data/csslint/release/csslint-node.js +9125 -0
  20. data/csslint/release/csslint-rhino.js +9390 -0
  21. data/csslint/release/csslint-tests.js +1921 -0
  22. data/csslint/release/csslint-worker.js +9148 -0
  23. data/csslint/release/csslint-wsh.js +9477 -0
  24. data/csslint/release/csslint.js +9127 -0
  25. data/csslint/release/npm/cli.js +307 -0
  26. data/csslint/release/npm/lib/csslint-node.js +9125 -0
  27. data/csslint/release/npm/package.json +30 -0
  28. data/csslint/src/cli/common.js +215 -0
  29. data/csslint/src/cli/node.js +87 -0
  30. data/csslint/src/cli/rhino.js +47 -0
  31. data/csslint/src/cli/wsh.js +134 -0
  32. data/csslint/src/core/CSSLint.js +181 -0
  33. data/csslint/src/core/Reporter.js +161 -0
  34. data/csslint/src/core/Util.js +62 -0
  35. data/csslint/src/formatters/checkstyle-xml.js +109 -0
  36. data/csslint/src/formatters/compact.js +59 -0
  37. data/csslint/src/formatters/csslint-xml.js +68 -0
  38. data/csslint/src/formatters/lint-xml.js +69 -0
  39. data/csslint/src/formatters/text.js +64 -0
  40. data/csslint/src/rules/adjoining-classes.js +45 -0
  41. data/csslint/src/rules/box-model.js +93 -0
  42. data/csslint/src/rules/box-sizing.js +28 -0
  43. data/csslint/src/rules/compatible-vendor-prefixes.js +171 -0
  44. data/csslint/src/rules/display-property-grouping.js +117 -0
  45. data/csslint/src/rules/duplicate-background-images.js +37 -0
  46. data/csslint/src/rules/duplicate-properties.js +46 -0
  47. data/csslint/src/rules/empty-rules.js +34 -0
  48. data/csslint/src/rules/errors.js +23 -0
  49. data/csslint/src/rules/fallback-colors.js +67 -0
  50. data/csslint/src/rules/floats.js +36 -0
  51. data/csslint/src/rules/font-faces.js +30 -0
  52. data/csslint/src/rules/font-sizes.js +35 -0
  53. data/csslint/src/rules/gradients.js +69 -0
  54. data/csslint/src/rules/ids.js +50 -0
  55. data/csslint/src/rules/import.js +23 -0
  56. data/csslint/src/rules/important.js +37 -0
  57. data/csslint/src/rules/known-properties.js +29 -0
  58. data/csslint/src/rules/outline-none.js +73 -0
  59. data/csslint/src/rules/overqualified-elements.js +63 -0
  60. data/csslint/src/rules/qualified-headings.js +38 -0
  61. data/csslint/src/rules/regex-selectors.js +44 -0
  62. data/csslint/src/rules/rules-count.js +28 -0
  63. data/csslint/src/rules/shorthand.js +87 -0
  64. data/csslint/src/rules/star-property-hack.js +27 -0
  65. data/csslint/src/rules/text-indent.js +53 -0
  66. data/csslint/src/rules/underscore-property-hack.js +27 -0
  67. data/csslint/src/rules/unique-headings.js +74 -0
  68. data/csslint/src/rules/universal-selector.js +35 -0
  69. data/csslint/src/rules/unqualified-attributes.js +42 -0
  70. data/csslint/src/rules/vendor-prefix.js +143 -0
  71. data/csslint/src/rules/zero-units.js +34 -0
  72. data/csslint/src/worker/Worker.js +26 -0
  73. data/csslint/tests/all-rules.js +64 -0
  74. data/csslint/tests/core/CSSLint.js +22 -0
  75. data/csslint/tests/core/Reporter.js +36 -0
  76. data/csslint/tests/css/width-100.html +76 -0
  77. data/csslint/tests/formatters/checkstyle-xml.js +44 -0
  78. data/csslint/tests/formatters/compact.js +47 -0
  79. data/csslint/tests/formatters/csslint-xml.js +42 -0
  80. data/csslint/tests/formatters/lint-xml.js +43 -0
  81. data/csslint/tests/formatters/text.js +36 -0
  82. data/csslint/tests/rules/adjoining-classes.js +31 -0
  83. data/csslint/tests/rules/box-model.js +211 -0
  84. data/csslint/tests/rules/box-sizing.js +23 -0
  85. data/csslint/tests/rules/compatible-vendor-prefixes.js +56 -0
  86. data/csslint/tests/rules/display-property-grouping.js +213 -0
  87. data/csslint/tests/rules/duplicate-background-images.js +25 -0
  88. data/csslint/tests/rules/duplicate-properties.js +54 -0
  89. data/csslint/tests/rules/empty-rules.js +18 -0
  90. data/csslint/tests/rules/errors.js +17 -0
  91. data/csslint/tests/rules/fallback-colors.js +162 -0
  92. data/csslint/tests/rules/floats.js +35 -0
  93. data/csslint/tests/rules/font-faces.js +28 -0
  94. data/csslint/tests/rules/font-sizes.js +30 -0
  95. data/csslint/tests/rules/gradients.js +60 -0
  96. data/csslint/tests/rules/ids.js +25 -0
  97. data/csslint/tests/rules/import.js +18 -0
  98. data/csslint/tests/rules/important.js +27 -0
  99. data/csslint/tests/rules/known-properties.js +44 -0
  100. data/csslint/tests/rules/outline-none.js +50 -0
  101. data/csslint/tests/rules/overqualified-elements.js +41 -0
  102. data/csslint/tests/rules/qualified-headings.js +19 -0
  103. data/csslint/tests/rules/regex-selectors.js +52 -0
  104. data/csslint/tests/rules/shorthand.js +36 -0
  105. data/csslint/tests/rules/star-property-hack.js +24 -0
  106. data/csslint/tests/rules/text-indent.js +55 -0
  107. data/csslint/tests/rules/underscore-property-hack.js +24 -0
  108. data/csslint/tests/rules/unique-headings.js +47 -0
  109. data/csslint/tests/rules/universal-selector.js +31 -0
  110. data/csslint/tests/rules/unqualified-attributes.js +37 -0
  111. data/csslint/tests/rules/vendor-prefix.js +76 -0
  112. data/csslint/tests/rules/zero-units.js +44 -0
  113. data/csslint/tests/testrunner.htm +138 -0
  114. data/js.jar +0 -0
  115. data/lib/ruby_css_lint.rb +168 -0
  116. data/test/helper.rb +17 -0
  117. data/test/test_ruby_css_lint.rb +7 -0
  118. metadata +240 -0
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "csslint",
3
+ "version": "0.9.8",
4
+ "description": "CSSLint",
5
+ "author": "Nicholas C. Zakas",
6
+ "os": ["darwin", "linux", "win32"],
7
+ "contributors": [
8
+ "Nicole Sullivan"
9
+ ],
10
+ "engines": {
11
+ "node" : ">=0.2.0"
12
+ },
13
+ "directories": {
14
+ "lib" : "lib"
15
+ },
16
+ "main": "./lib/csslint-node.js",
17
+ "bin": {
18
+ "csslint": "./cli.js"
19
+ },
20
+ "licenses":[
21
+ {
22
+ "type" : "MIT",
23
+ "url" : "https://github.com/stubbornella/csslint/blame/master/LICENSE"
24
+ }
25
+ ],
26
+ "repository": {
27
+ "type":"git",
28
+ "url":"http://github.com/stubbornella/csslint.git"
29
+ }
30
+ }
@@ -0,0 +1,215 @@
1
+ /*
2
+ * Encapsulates all of the CLI functionality. The api argument simply
3
+ * provides environment-specific functionality.
4
+ */
5
+ /*global CSSLint*/
6
+ function cli(api){
7
+
8
+ //-------------------------------------------------------------------------
9
+ // Helper functions
10
+ //-------------------------------------------------------------------------
11
+
12
+ /**
13
+ * Returns an array of messages for a particular type.
14
+ * @param messages {Array} Array of CSS Lint messages.
15
+ * @param type {String} The type of message to filter on.
16
+ * @return {Array} An array of matching messages.
17
+ */
18
+ function pluckByType(messages, type){
19
+ return messages.filter(function(message) {
20
+ return message.type === type;
21
+ });
22
+ }
23
+
24
+ /**
25
+ * Returns a ruleset object based on the CLI options.
26
+ * @param options {Object} The CLI options.
27
+ * @return {Object} A ruleset object.
28
+ */
29
+ function gatherRules(options){
30
+ var ruleset,
31
+ warnings = options.rules || options.warnings,
32
+ errors = options.errors;
33
+
34
+ if (warnings){
35
+ ruleset = ruleset || {};
36
+ warnings.split(",").forEach(function(value){
37
+ ruleset[value] = 1;
38
+ });
39
+ }
40
+
41
+ if (errors){
42
+ ruleset = ruleset || {};
43
+ errors.split(",").forEach(function(value){
44
+ ruleset[value] = 2;
45
+ });
46
+ }
47
+
48
+ return ruleset;
49
+ }
50
+
51
+ /**
52
+ * Outputs all available rules to the CLI.
53
+ * @return {void}
54
+ */
55
+ function printRules(){
56
+ api.print("");
57
+ var rules = CSSLint.getRules();
58
+ rules.forEach(function(rule){
59
+ api.print(rule.id + "\n " + rule.desc + "\n");
60
+ });
61
+ }
62
+
63
+ /**
64
+ * Given a file name and options, run verification and print formatted output.
65
+ * @param {String} relativeFilePath absolute file location
66
+ * @param {Object} options for processing
67
+ * @return {Number} exit code
68
+ */
69
+ function processFile(relativeFilePath, options) {
70
+ var input = api.readFile(relativeFilePath),
71
+ result = CSSLint.verify(input, gatherRules(options)),
72
+ formatter = CSSLint.getFormatter(options.format || "text"),
73
+ messages = result.messages || [],
74
+ output,
75
+ exitCode = 0;
76
+
77
+ if (!input) {
78
+ if (formatter.readError) {
79
+ api.print(formatter.readError(relativeFilePath, "Could not read file data. Is the file empty?"));
80
+ } else {
81
+ api.print("csslint: Could not read file data in " + relativeFilePath + ". Is the file empty?");
82
+ }
83
+ exitCode = 1;
84
+ } else {
85
+ //var relativeFilePath = getRelativePath(api.getWorkingDirectory(), fullFilePath);
86
+ options.fullPath = api.getFullPath(relativeFilePath);
87
+ output = formatter.formatResults(result, relativeFilePath, options);
88
+ if (output){
89
+ api.print(output);
90
+ }
91
+
92
+ if (messages.length > 0 && pluckByType(messages, "error").length > 0) {
93
+ exitCode = 1;
94
+ }
95
+ }
96
+
97
+ return exitCode;
98
+ }
99
+
100
+
101
+ /**
102
+ * Outputs the help screen to the CLI.
103
+ * @return {void}
104
+ */
105
+ function outputHelp(){
106
+ api.print([
107
+ "\nUsage: csslint-rhino.js [options]* [file|dir]*",
108
+ " ",
109
+ "Global Options",
110
+ " --help Displays this information.",
111
+ " --format=<format> Indicate which format to use for output.",
112
+ " --list-rules Outputs all of the rules available.",
113
+ " --quiet Only output when errors are present.",
114
+ " --errors=<rule[,rule]+> Indicate which rules to include as errors.",
115
+ " --warnings=<rule[,rule]+> Indicate which rules to include as warnings.",
116
+ " --version Outputs the current version number."
117
+ ].join("\n") + "\n");
118
+ }
119
+
120
+ /**
121
+ * Given an Array of filenames, print wrapping output and process them.
122
+ * @param files {Array} filenames list
123
+ * @param options {Object} options object
124
+ * @return {Number} exit code
125
+ */
126
+ function processFiles(files, options){
127
+ var exitCode = 0,
128
+ formatId = options.format || "text",
129
+ formatter,
130
+ output;
131
+
132
+ if (!files.length) {
133
+ api.print("csslint: No files specified.");
134
+ exitCode = 1;
135
+ } else {
136
+ if (!CSSLint.hasFormat(formatId)){
137
+ api.print("csslint: Unknown format '" + formatId + "'. Cannot proceed.");
138
+ exitCode = 1;
139
+ } else {
140
+ formatter = CSSLint.getFormatter(formatId);
141
+
142
+ output = formatter.startFormat();
143
+ if (output){
144
+ api.print(output);
145
+ }
146
+
147
+ files.forEach(function(file){
148
+ if (exitCode === 0) {
149
+ exitCode = processFile(file,options);
150
+ } else {
151
+ processFile(file,options);
152
+ }
153
+ });
154
+
155
+ output = formatter.endFormat();
156
+ if (output){
157
+ api.print(output);
158
+ }
159
+ }
160
+ }
161
+ return exitCode;
162
+ }
163
+
164
+ //-----------------------------------------------------------------------------
165
+ // Process command line
166
+ //-----------------------------------------------------------------------------
167
+
168
+ var args = api.args,
169
+ argName,
170
+ parts,
171
+ arg = args.shift(),
172
+ options = {},
173
+ files = [];
174
+
175
+ while(arg){
176
+ if (arg.indexOf("--") === 0){
177
+ argName = arg.substring(2);
178
+ options[argName] = true;
179
+
180
+ if (argName.indexOf("=") > -1){
181
+ parts = argName.split("=");
182
+ options[parts[0]] = parts[1];
183
+ } else {
184
+ options[argName] = true;
185
+ }
186
+
187
+ } else {
188
+
189
+ //see if it's a directory or a file
190
+ if (api.isDirectory(arg)){
191
+ files = files.concat(api.getFiles(arg));
192
+ } else {
193
+ files.push(arg);
194
+ }
195
+ }
196
+ arg = args.shift();
197
+ }
198
+
199
+ if (options.help || arguments.length === 0){
200
+ outputHelp();
201
+ api.quit(0);
202
+ }
203
+
204
+ if (options.version){
205
+ api.print("v" + CSSLint.version);
206
+ api.quit(0);
207
+ }
208
+
209
+ if (options["list-rules"]){
210
+ printRules();
211
+ api.quit(0);
212
+ }
213
+
214
+ api.quit(processFiles(files,options));
215
+ }
@@ -0,0 +1,87 @@
1
+ /*
2
+ * CSSLint Node.js Command Line Interface
3
+ */
4
+
5
+ /*jshint node:true*/
6
+ /*global cli*/
7
+
8
+ var fs = require("fs"),
9
+ path = require("path"),
10
+ CSSLint = require("./lib/csslint-node").CSSLint;
11
+
12
+ cli({
13
+ args: process.argv.slice(2),
14
+
15
+ print: function(message){
16
+ fs.writeSync(1, message + "\n");
17
+ },
18
+
19
+ quit: function(code){
20
+
21
+ //Workaround for https://github.com/joyent/node/issues/1669
22
+
23
+ if ((!process.stdout.flush || !process.stdout.flush()) && (parseFloat(process.versions.node) < 0.5)) {
24
+ process.once("drain", function () {
25
+ process.exit(code || 0);
26
+ });
27
+ } else {
28
+ process.exit(code || 0);
29
+ }
30
+ },
31
+
32
+ isDirectory: function(name){
33
+ try {
34
+ return fs.statSync(name).isDirectory();
35
+ } catch (ex) {
36
+ return false;
37
+ }
38
+ },
39
+
40
+ getFiles: function(dir){
41
+ var files = [];
42
+
43
+ try {
44
+ fs.statSync(dir);
45
+ } catch (ex){
46
+ return [];
47
+ }
48
+
49
+ function traverse(dir, stack){
50
+ stack.push(dir);
51
+ fs.readdirSync(stack.join("/")).forEach(function(file){
52
+ var path = stack.concat([file]).join("/"),
53
+ stat = fs.statSync(path);
54
+
55
+ if (file[0] == ".") {
56
+ return;
57
+ } else if (stat.isFile() && /\.css$/.test(file)){
58
+ files.push(path);
59
+ } else if (stat.isDirectory()){
60
+ traverse(file, stack);
61
+ }
62
+ });
63
+ stack.pop();
64
+ }
65
+
66
+ traverse(dir, []);
67
+
68
+ return files;
69
+ },
70
+
71
+ getWorkingDirectory: function() {
72
+ return process.cwd();
73
+ },
74
+
75
+ getFullPath: function(filename){
76
+ return path.resolve(process.cwd(), filename);
77
+ },
78
+
79
+ readFile: function(filename){
80
+ try {
81
+ return fs.readFileSync(filename, "utf-8");
82
+ } catch (ex) {
83
+ return "";
84
+ }
85
+ }
86
+ });
87
+
@@ -0,0 +1,47 @@
1
+ /*
2
+ * CSSLint Rhino Command Line Interface
3
+ */
4
+ /*jshint rhino:true*/
5
+ /*global cli, File*/
6
+
7
+ importPackage(java.io);
8
+
9
+ cli({
10
+ args: arguments,
11
+ print: print,
12
+ quit: quit,
13
+
14
+ isDirectory: function(name){
15
+ var dir = new File(name);
16
+ return dir.isDirectory();
17
+ },
18
+
19
+ getFiles: function(dir){
20
+ var files = [];
21
+
22
+ function traverse(dir) {
23
+ var dirList = dir.listFiles();
24
+ dirList.forEach(function (file) {
25
+ if (/\.css$/.test(file)) {
26
+ files.push(file.toString());
27
+ } else if (file.isDirectory()) {
28
+ traverse(file);
29
+ }
30
+ });
31
+ }
32
+
33
+ traverse(new File(dir));
34
+
35
+ return files;
36
+ },
37
+
38
+ getWorkingDirectory: function() {
39
+ return (new File(".")).getCanonicalPath();
40
+ },
41
+
42
+ getFullPath: function(filename){
43
+ return (new File(filename)).getCanonicalPath();
44
+ },
45
+
46
+ readFile: readFile
47
+ });
@@ -0,0 +1,134 @@
1
+ /*
2
+ * Windows Script Host Command Line Interface
3
+ */
4
+ /*global ActiveXObject, WScript, Enumerator, cli*/
5
+ //TODO: This file needs major cleanup!!!
6
+
7
+ var wshapi = (function(){
8
+ var fso = new ActiveXObject("Scripting.FileSystemObject");
9
+ var shell = WScript.CreateObject("WScript.Shell");
10
+ var finalArgs = [], i, args = WScript.Arguments;
11
+
12
+ if (typeof Array.prototype.forEach !== "function") {
13
+ Array.prototype.forEach = function(f,m) {
14
+ for (var i=0, L=this.length; i<L; ++i) {
15
+ f(this[i], i, m);
16
+ }
17
+ };
18
+ }
19
+
20
+ if (typeof Array.prototype.filter !== "function") {
21
+ Array.prototype.filter = function(fn /*, thisp*/) {
22
+ if (typeof fn != "function") {
23
+ throw new Error("not a function");
24
+ }
25
+ var res = [], val, thisp = finalArgs[1];
26
+ for (var i = 0, L = this.length; i < L; i++) {
27
+ if (i in this) {
28
+ val = this[i]; // in case fun mutates this
29
+ if (fn.call(thisp, val, i, this)){
30
+ res.push(val);
31
+ }
32
+ }
33
+ }
34
+
35
+ return res;
36
+ };
37
+ }
38
+
39
+ if (!Array.prototype.indexOf) {
40
+ Array.prototype.indexOf = function (searchElement /*, fromIndex */ ) {
41
+ "use strict";
42
+ if (this === void 0 || this === null) {
43
+ throw new Error("unknown instance");
44
+ }
45
+ var t = this;
46
+ var len = t.length >>> 0;
47
+ if (len === 0) {
48
+ return -1;
49
+ }
50
+ var n = 0;
51
+ if (finalArgs.length > 0) {
52
+ n = Number(finalArgs[1]);
53
+ if (n !== n) { // shortcut for verifying if it's NaN
54
+ n = 0;
55
+ } else if (n !== 0 && n !== Infinity && n !== -Infinity) {
56
+ n = (n > 0 || -1) * Math.floor(Math.abs(n));
57
+ }
58
+ }
59
+ if (n >= len) {
60
+ return -1;
61
+ }
62
+ var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0);
63
+ for (; k < len; k++) {
64
+ if (k in t && t[k] === searchElement) {
65
+ return k;
66
+ }
67
+ }
68
+ return -1;
69
+ };
70
+ }
71
+
72
+ function traverseDir(files, path) {
73
+ var filename, folder = fso.GetFolder(path),
74
+ subFlds, fc = new Enumerator(folder.files);
75
+
76
+ for (; !fc.atEnd(); fc.moveNext()) {
77
+ filename = fc.item();
78
+ if (/\.css$/.test(filename)) {
79
+ files.push(filename);
80
+ }
81
+ }
82
+
83
+ subFlds = new Enumerator(folder.SubFolders);
84
+ for (; !subFlds.atEnd(); subFlds.moveNext()) {
85
+ traverseDir(files, subFlds.item());
86
+ }
87
+ }
88
+
89
+ // turn the WScript.Arguments thing into a regular array
90
+ if (args.Length > 0) {
91
+ for (i = 0; i < args.Length; i++) {
92
+ finalArgs.push(args(i));
93
+ }
94
+ }
95
+
96
+ return {
97
+ args: finalArgs,
98
+ print: function(s) { WScript.Echo(s);},
99
+ quit: function (v) { WScript.Quit(v);},
100
+
101
+ isDirectory: function(name){
102
+ return fso.FolderExists(name);
103
+ },
104
+
105
+ getFiles: function(dir){
106
+ var files = [];
107
+ traverseDir(files, dir);
108
+ return files;
109
+ },
110
+
111
+ fixFilenames: function(files){
112
+ return files;
113
+ },
114
+
115
+ getWorkingDirectory: function() {
116
+ return shell.CurrentDirectory;
117
+ },
118
+
119
+ getFullPath: function(filename){
120
+ return fso.GetAbsolutePathName(filename);
121
+ },
122
+
123
+ readFile: function(path){
124
+ var forReading = 1;
125
+ var tf = fso.OpenTextFile(path, forReading);
126
+ var allText = tf.ReadAll();
127
+ tf.Close();
128
+ return allText;
129
+ }
130
+ };
131
+
132
+ }());
133
+
134
+ cli(wshapi);