Repository: sasstools/sass-lint (js)

Issue:
New Rule: Color Keywords
Rule to enforce the use of hexadecimal colour values rather than CSS literal ones.

as per [SCSS Lint](https://github.com/brigade/scss-lint/blob/master/lib/scss_lint/linter/README.md#colorkeyword)

Pull request description:
Add rule: Color Keyword
Rule `color-keyword` enforces the use of hexadecimal colour values instead of CSS colour literals.

A warning message will display to tell you which colour literal needs replacing and it will also display the correct hexadecimal value.

> Color 'red' should be written in its hexadecimal form `#ff0000`

closes #101 

DCO 1.1 Signed-off-by: Dan Purdy danjpurdy@gmail.com

Patch:
diff --git a/data/literals.yml b/data/literals.yml
new file mode 100644
index 0000000..66c4190
--- /dev/null
+++ b/data/literals.yml
@@ -0,0 +1,296 @@
+aliceblue
+f0f8ff
+antiquewhite
+faebd7
+aqua
+00ffff
+aquamarine
+7fffd4
+azure
+f0ffff
+beige
+f5f5dc
+bisque
+ffe4c4
+black
+000000
+blanchedalmond
+ffebcd
+blue
+0000ff
+blueviolet
+8a2be2
+brown
+a52a2a
+burlywood
+deb887
+cadetblue
+5f9ea0
+chartreuse
+7fff00
+chocolate
+d2691e
+coral
+ff7f50
+cornflowerblue
+6495ed
+cornsilk
+fff8dc
+crimson
+dc143c
+cyan
+00ffff
+darkblue
+00008b
+darkcyan
+008b8b
+darkgoldenrod
+b8860b
+darkgray
+a9a9a9
+darkgrey
+a9a9a9
+darkgreen
+006400
+darkkhaki
+bdb76b
+darkmagenta
+8b008b
+darkolivegreen
+556b2f
+darkorange
+ff8c00
+darkorchid
+9932cc
+darkred
+8b0000
+darksalmon
+e9967a
+darkseagreen
+8fbc8f
+darkslateblue
+483d8b
+darkslategray
+2f4f4f
+darkslategrey
+2f4f4f
+darkturquoise
+00ced1
+darkviolet
+9400d3
+deeppink
+ff1493
+deepskyblue
+00bfff
+dimgray
+696969
+dimgrey
+696969
+dodgerblue
+1e90ff
+firebrick
+b22222
+floralwhite
+fffaf0
+forestgreen
+228b22
+fuchsia
+ff00ff
+gainsboro
+dcdcdc
+ghostwhite
+f8f8ff
+gold
+ffd700
+goldenrod
+daa520
+gray
+808080
+grey
+808080
+green
+008000
+greenyellow
+adff2f
+honeydew
+f0fff0
+hotpink
+ff69b4
+indianred
+cd5c5c
+indigo
+4b0082
+ivory
+fffff0
+khaki
+f0e68c
+lavender
+e6e6fa
+lavenderblush
+fff0f5
+lawngreen
+7cfc00
+lemonchiffon
+fffacd
+lightblue
+add8e6
+lightcoral
+f08080
+lightcyan
+e0ffff
+lightgoldenrodyellow
+fafad2
+lightgray
+d3d3d3
+lightgrey
+d3d3d3
+lightgreen
+90ee90
+lightpink
+ffb6c1
+lightsalmon
+ffa07a
+lightseagreen
+20b2aa
+lightskyblue
+87cefa
+lightslategray
+778899
+lightslategrey
+778899
+lightsteelblue
+b0c4de
+lightyellow
+ffffe0
+lime
+00ff00
+limegreen
+32cd32
+linen
+faf0e6
+magenta
+ff00ff
+maroon
+800000
+mediumaquamarine
+66cdaa
+mediumblue
+0000cd
+mediumorchid
+ba55d3
+mediumpurple
+9370d8
+mediumseagreen
+3cb371
+mediumslateblue
+7b68ee
+mediumspringgreen
+00fa9a
+mediumturquoise
+48d1cc
+mediumvioletred
+c71585
+midnightblue
+191970
+mintcream
+f5fffa
+mistyrose
+ffe4e1
+moccasin
+ffe4b5
+navajowhite
+ffdead
+navy
+000080
+oldlace
+fdf5e6
+olive
+808000
+olivedrab
+6b8e23
+orange
+ffa500
+orangered
+ff4500
+orchid
+da70d6
+palegoldenrod
+eee8aa
+palegreen
+98fb98
+paleturquoise
+afeeee
+palevioletred
+d87093
+papayawhip
+ffefd5
+peachpuff
+ffdab9
+peru
+cd853f
+pink
+ffc0cb
+plum
+dda0dd
+powderblue
+b0e0e6
+purple
+800080
+rebeccapurple
+663399
+red
+ff0000
+rosybrown
+bc8f8f
+royalblue
+4169e1
+saddlebrown
+8b4513
+salmon
+fa8072
+sandybrown
+f4a460
+seagreen
+2e8b57
+seashell
+fff5ee
+sienna
+a0522d
+silver
+c0c0c0
+skyblue
+87ceeb
+slateblue
+6a5acd
+slategray
+708090
+slategrey
+708090
+snow
+fffafa
+springgreen
+00ff7f
+steelblue
+4682b4
+tan
+d2b48c
+teal
+008080
+thistle
+d8bfd8
+tomato
+ff6347
+turquoise
+40e0d0
+violet
+ee82ee
+wheat
+f5deb3
+white
+ffffff
+whitesmoke
+f5f5f5
+yellow
+ffff00
+yellowgreen
+9acd32
diff --git a/docs/rules/color-keyword.md b/docs/rules/color-keyword.md
new file mode 100644
index 0000000..22a0dea
--- /dev/null
+++ b/docs/rules/color-keyword.md
@@ -0,0 +1,30 @@
+# Color Keyword
+
+Rule `color-keywords` will enforce the use of hexadecimal color values rather than literals.
+
+## Options
+
+* There are no configurable options
+
+## Examples
+
+When enabled the following are allowed:
+
+```scss
+$new-red: #ff0000;
+
+.foo {
+  color: #ff0000;
+}
+
+```
+
+When enabled the following are disallowed:
+
+```scss
+$new-red: red;
+
+.foo {
+  color: red;
+}
+```
diff --git a/lib/config/sass-lint.yml b/lib/config/sass-lint.yml
index ec5052e..c1ef413 100644
--- a/lib/config/sass-lint.yml
+++ b/lib/config/sass-lint.yml
@@ -27,6 +27,7 @@ rules:
   # Style Guide
   border-zero: 1
   clean-import-paths: 1
+  color-keyword: 1
   comment: 1
   empty-args: 1
   hex-length: 1
diff --git a/lib/rules/color-keyword.js b/lib/rules/color-keyword.js
new file mode 100644
index 0000000..8929429
--- /dev/null
+++ b/lib/rules/color-keyword.js
@@ -0,0 +1,36 @@
+'use strict';
+
+var helpers = require('../helpers'),
+    yaml = require('js-yaml'),
+    fs = require('fs'),
+    path = require('path');
+
+var cssColors = yaml.safeLoad(fs.readFileSync(path.join(__dirname, '../../data', 'literals.yml'), 'utf8')).split(' ');
+
+module.exports = {
+  'name': 'color-keyword',
+  'defaults': {},
+  'detect': function (ast, parser) {
+    var result = [];
+
+    ast.traverseByType('value', function (node) {
+      node.traverse(function (elem) {
+        if (elem.type === 'ident') {
+          var index = cssColors.indexOf(elem.content.toLowerCase());
+
+          if (index !== -1) {
+            result = helpers.addUnique(result, {
+              'ruleId': parser.rule.name,
+              'line': elem.start.line,
+              'column': elem.start.column,
+              'message': 'Color \'' + elem.content + '\' should be written in its hexadecimal form #' + cssColors[index + 1],
+              'severity': parser.severity
+            });
+          }
+        }
+      });
+
+    });
+    return result;
+  }
+};


Test patch:
diff --git a/tests/main.js b/tests/main.js
index dbfe8df..be5368d 100644
--- a/tests/main.js
+++ b/tests/main.js
@@ -856,6 +856,24 @@ describe('rule', function () {
     });
   });
 
+  //////////////////////////////
+  // Color Keyword
+  //////////////////////////////
+  it('color keyword', function (done) {
+    lintFile('color-keyword.scss', {
+      'options': {
+        'merge-default-rules': false
+      },
+      'rules': {
+        'color-keyword': 1
+      }
+    }, function (data) {
+      console.log(data);
+      assert.equal(8, data.warningCount);
+      done();
+    });
+  });
+
   //////////////////////////////
   // Clean Import Paths
   //////////////////////////////
diff --git a/tests/sass/color-keyword.scss b/tests/sass/color-keyword.scss
new file mode 100644
index 0000000..0d616cd
--- /dev/null
+++ b/tests/sass/color-keyword.scss
@@ -0,0 +1,30 @@
+.literal {
+  color: mediumslateblue;
+}
+
+.linear-gradient-func {
+  background: linear-gradient(top, #fff, white);
+}
+
+.box-shadow {
+  box-shadow: 1px 1px black, 1px 1px black;
+}
+
+.background {
+  background: 1px solid white;
+  content: 100;
+}
+
+.hex {
+  color: #fff;
+}
+
+$colors: (
+  $off-red: red,
+  $off-blue : (
+    $off-orange: orange
+  )
+);
+
+$literal: mediumslateblue;
+$hexVar: #fff;