Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Initial commit. Got a hex to short color translator written.

  • Loading branch information...
commit 6d9a5f4fb33286d69d35cc9045ed90ae5446b954 1 parent 0cbf085
@samwho authored
View
2  .gitignore
@@ -0,0 +1,2 @@
+.rvmrc
+Gemfile.lock
View
10 Gemfile
@@ -0,0 +1,10 @@
+source :rubygems
+
+group :test do
+ gem 'rspec'
+ gem 'rake'
+end
+
+group :development do
+ gem 'pry'
+end
View
0  README.md
No changes.
View
8 Rakefile
@@ -0,0 +1,8 @@
+require 'rspec/core/rake_task'
+
+task :default => [:test]
+
+desc "Run all tests"
+RSpec::Core::RakeTask.new(:test) do |t|
+ t.rspec_opts = '-cfs'
+end
View
8 lib/colorschemerb.rb
@@ -0,0 +1,8 @@
+libdir = File.dirname(__FILE__)
+$LOAD_PATH.unshift(libdir) unless $LOAD_PATH.include?(libdir)
+
+module ColorSchemeRb
+ ROOTDIR = File.expand_path(File.dirname(__FILE__) + '/..')
+end
+
+require 'colorschemerb/hex2term'
View
357 lib/colorschemerb/hex2term.rb
@@ -0,0 +1,357 @@
+module ColorSchemeRb
+ class Hex2Term
+ # This colour lookup table is taken from the following gist:
+ # https://gist.github.com/719710
+ SCLUT = {
+ # Primary 3-bit (8 colors). Unique representation!
+ '00' => '000000',
+ '01' => '800000',
+ '02' => '008000',
+ '03' => '808000',
+ '04' => '000080',
+ '05' => '800080',
+ '06' => '008080',
+ '07' => 'c0c0c0',
+
+ # Equivalent "bright" versions of original 8 colors.
+ '08' => '808080',
+ '09' => 'ff0000',
+ '10' => '00ff00',
+ '11' => 'ffff00',
+ '12' => '0000ff',
+ '13' => 'ff00ff',
+ '14' => '00ffff',
+ '15' => 'ffffff',
+
+ # Strictly ascending.
+ '16' => '000000',
+ '17' => '00005f',
+ '18' => '000087',
+ '19' => '0000af',
+ '20' => '0000d7',
+ '21' => '0000ff',
+ '22' => '005f00',
+ '23' => '005f5f',
+ '24' => '005f87',
+ '25' => '005faf',
+ '26' => '005fd7',
+ '27' => '005fff',
+ '28' => '008700',
+ '29' => '00875f',
+ '30' => '008787',
+ '31' => '0087af',
+ '32' => '0087d7',
+ '33' => '0087ff',
+ '34' => '00af00',
+ '35' => '00af5f',
+ '36' => '00af87',
+ '37' => '00afaf',
+ '38' => '00afd7',
+ '39' => '00afff',
+ '40' => '00d700',
+ '41' => '00d75f',
+ '42' => '00d787',
+ '43' => '00d7af',
+ '44' => '00d7d7',
+ '45' => '00d7ff',
+ '46' => '00ff00',
+ '47' => '00ff5f',
+ '48' => '00ff87',
+ '49' => '00ffaf',
+ '50' => '00ffd7',
+ '51' => '00ffff',
+ '52' => '5f0000',
+ '53' => '5f005f',
+ '54' => '5f0087',
+ '55' => '5f00af',
+ '56' => '5f00d7',
+ '57' => '5f00ff',
+ '58' => '5f5f00',
+ '59' => '5f5f5f',
+ '60' => '5f5f87',
+ '61' => '5f5faf',
+ '62' => '5f5fd7',
+ '63' => '5f5fff',
+ '64' => '5f8700',
+ '65' => '5f875f',
+ '66' => '5f8787',
+ '67' => '5f87af',
+ '68' => '5f87d7',
+ '69' => '5f87ff',
+ '70' => '5faf00',
+ '71' => '5faf5f',
+ '72' => '5faf87',
+ '73' => '5fafaf',
+ '74' => '5fafd7',
+ '75' => '5fafff',
+ '76' => '5fd700',
+ '77' => '5fd75f',
+ '78' => '5fd787',
+ '79' => '5fd7af',
+ '80' => '5fd7d7',
+ '81' => '5fd7ff',
+ '82' => '5fff00',
+ '83' => '5fff5f',
+ '84' => '5fff87',
+ '85' => '5fffaf',
+ '86' => '5fffd7',
+ '87' => '5fffff',
+ '88' => '870000',
+ '89' => '87005f',
+ '90' => '870087',
+ '91' => '8700af',
+ '92' => '8700d7',
+ '93' => '8700ff',
+ '94' => '875f00',
+ '95' => '875f5f',
+ '96' => '875f87',
+ '97' => '875faf',
+ '98' => '875fd7',
+ '99' => '875fff',
+ '100' => '878700',
+ '101' => '87875f',
+ '102' => '878787',
+ '103' => '8787af',
+ '104' => '8787d7',
+ '105' => '8787ff',
+ '106' => '87af00',
+ '107' => '87af5f',
+ '108' => '87af87',
+ '109' => '87afaf',
+ '110' => '87afd7',
+ '111' => '87afff',
+ '112' => '87d700',
+ '113' => '87d75f',
+ '114' => '87d787',
+ '115' => '87d7af',
+ '116' => '87d7d7',
+ '117' => '87d7ff',
+ '118' => '87ff00',
+ '119' => '87ff5f',
+ '120' => '87ff87',
+ '121' => '87ffaf',
+ '122' => '87ffd7',
+ '123' => '87ffff',
+ '124' => 'af0000',
+ '125' => 'af005f',
+ '126' => 'af0087',
+ '127' => 'af00af',
+ '128' => 'af00d7',
+ '129' => 'af00ff',
+ '130' => 'af5f00',
+ '131' => 'af5f5f',
+ '132' => 'af5f87',
+ '133' => 'af5faf',
+ '134' => 'af5fd7',
+ '135' => 'af5fff',
+ '136' => 'af8700',
+ '137' => 'af875f',
+ '138' => 'af8787',
+ '139' => 'af87af',
+ '140' => 'af87d7',
+ '141' => 'af87ff',
+ '142' => 'afaf00',
+ '143' => 'afaf5f',
+ '144' => 'afaf87',
+ '145' => 'afafaf',
+ '146' => 'afafd7',
+ '147' => 'afafff',
+ '148' => 'afd700',
+ '149' => 'afd75f',
+ '150' => 'afd787',
+ '151' => 'afd7af',
+ '152' => 'afd7d7',
+ '153' => 'afd7ff',
+ '154' => 'afff00',
+ '155' => 'afff5f',
+ '156' => 'afff87',
+ '157' => 'afffaf',
+ '158' => 'afffd7',
+ '159' => 'afffff',
+ '160' => 'd70000',
+ '161' => 'd7005f',
+ '162' => 'd70087',
+ '163' => 'd700af',
+ '164' => 'd700d7',
+ '165' => 'd700ff',
+ '166' => 'd75f00',
+ '167' => 'd75f5f',
+ '168' => 'd75f87',
+ '169' => 'd75faf',
+ '170' => 'd75fd7',
+ '171' => 'd75fff',
+ '172' => 'd78700',
+ '173' => 'd7875f',
+ '174' => 'd78787',
+ '175' => 'd787af',
+ '176' => 'd787d7',
+ '177' => 'd787ff',
+ '178' => 'd7af00',
+ '179' => 'd7af5f',
+ '180' => 'd7af87',
+ '181' => 'd7afaf',
+ '182' => 'd7afd7',
+ '183' => 'd7afff',
+ '184' => 'd7d700',
+ '185' => 'd7d75f',
+ '186' => 'd7d787',
+ '187' => 'd7d7af',
+ '188' => 'd7d7d7',
+ '189' => 'd7d7ff',
+ '190' => 'd7ff00',
+ '191' => 'd7ff5f',
+ '192' => 'd7ff87',
+ '193' => 'd7ffaf',
+ '194' => 'd7ffd7',
+ '195' => 'd7ffff',
+ '196' => 'ff0000',
+ '197' => 'ff005f',
+ '198' => 'ff0087',
+ '199' => 'ff00af',
+ '200' => 'ff00d7',
+ '201' => 'ff00ff',
+ '202' => 'ff5f00',
+ '203' => 'ff5f5f',
+ '204' => 'ff5f87',
+ '205' => 'ff5faf',
+ '206' => 'ff5fd7',
+ '207' => 'ff5fff',
+ '208' => 'ff8700',
+ '209' => 'ff875f',
+ '210' => 'ff8787',
+ '211' => 'ff87af',
+ '212' => 'ff87d7',
+ '213' => 'ff87ff',
+ '214' => 'ffaf00',
+ '215' => 'ffaf5f',
+ '216' => 'ffaf87',
+ '217' => 'ffafaf',
+ '218' => 'ffafd7',
+ '219' => 'ffafff',
+ '220' => 'ffd700',
+ '221' => 'ffd75f',
+ '222' => 'ffd787',
+ '223' => 'ffd7af',
+ '224' => 'ffd7d7',
+ '225' => 'ffd7ff',
+ '226' => 'ffff00',
+ '227' => 'ffff5f',
+ '228' => 'ffff87',
+ '229' => 'ffffaf',
+ '230' => 'ffffd7',
+ '231' => 'ffffff',
+
+ # Gr' => scale rang.
+ '232' => '080808',
+ '233' => '121212',
+ '234' => '1c1c1c',
+ '235' => '262626',
+ '236' => '303030',
+ '237' => '3a3a3a',
+ '238' => '444444',
+ '239' => '4e4e4e',
+ '240' => '585858',
+ '241' => '626262',
+ '242' => '6c6c6c',
+ '243' => '767676',
+ '244' => '808080',
+ '245' => '8a8a8a',
+ '246' => '949494',
+ '247' => '9e9e9e',
+ '248' => 'a8a8a8',
+ '249' => 'b2b2b2',
+ '250' => 'bcbcbc',
+ '251' => 'c6c6c6',
+ '252' => 'd0d0d0',
+ '253' => 'dadada',
+ '254' => 'e4e4e4',
+ '255' => 'eeeeee',
+ }
+
+ # Hex color lookup table. Essentially this is exactly the same as the short
+ # color lookup table but inverted. So k => v becomes v => k.
+ HCLUT = SCLUT.invert
+
+ # Takes either a short color value or a hexidecimal color value and converts
+ # it to the other format respectively.
+ #
+ # Example:
+ #
+ # convert(23)
+ # # => '005f5f'
+ #
+ # convert('#ffffff')
+ # # => '231'
+ def self.convert value
+ if value.to_s.length < 4 and value.to_s.to_i < 256
+ short2rb(value)
+ else
+ rgb2short(value)
+ end
+ end
+
+ # Takes a short color value (e.g. between 0 and 255) and returns the
+ # hexadecimal equivalent without a leading hash.
+ #
+ # Example:
+ #
+ # short2rb(231)
+ # # => 'ffffff'
+ def self.short2rb short
+ SCLUT[short.to_s]
+ end
+
+ # Takes an RGB hex value, with or without the leading hash, and converts it
+ # into one of 256 color values used by terminals.
+ #
+ # The method for doing it was borrowed with lots of love from this gist:
+ # https://gist.github.com/719710
+ #
+ # Example:
+ #
+ # rgb2short('#ffffff')
+ # # => '231'
+ def self.rgb2short rgb
+ rgb = strip_hash(rgb)
+ incs = [0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff]
+ parts = rgb.split(/(..)(..)(..)/).map { |part| part.to_i(16) }
+ res = []
+
+ # The above split will have an empty string at the start, this gets rid of
+ # it
+ parts.shift
+
+ parts.each do |part|
+ incs.each_cons(2) do |s, b|
+ if s <= part and part <= b
+ s1 = (s - part).abs
+ b1 = (b - part).abs
+
+ if s1 < b1
+ closest = s
+ else
+ closest = b
+ end
+
+ res << closest
+ break
+ end
+ end
+ end
+
+ key = res.map { |part| part.to_s(16).center(2, '0') }.join
+ HCLUT[key]
+ end
+
+ # Takes a string that may or may not have a hash at the start and returns a
+ # string that does not have a hash at the start.
+ #
+ # Example:
+ #
+ # strip_hash('#ffffff')
+ # # => 'ffffff'
+ def self.strip_hash hex
+ hex.delete '#'
+ end
+ end
+end
View
25 spec/hex2term_spec.rb
@@ -0,0 +1,25 @@
+require 'spec_helper'
+
+describe ColorSchemeRb::Hex2Term do
+ # Just a method to reduce clutter in this test. Delegates to the Hex2Term
+ # class in the ColorSchemeRb module.
+ def convert value
+ ColorSchemeRb::Hex2Term.convert value
+ end
+
+ it "correctly convert hex colors to term colors" do
+ convert('123456').should == '23'
+ convert('ffffff').should == '231'
+ convert('odadd6').should == '38'
+
+ convert('231').should == 'ffffff'
+ convert(231).should == 'ffffff'
+ convert(23).should == '005f5f'
+ end
+
+ it "correctly handle hex number with leading hashes" do
+ convert('#123456').should == '23'
+ convert('#ffffff').should == '231'
+ convert('#odadd6').should == '38'
+ end
+end
View
1  spec/spec_helper.rb
@@ -0,0 +1 @@
+require File.dirname(__FILE__) + '/../lib/colorschemerb.rb'
Please sign in to comment.
Something went wrong with that request. Please try again.