vic 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/vic.rb +3 -2
- data/lib/vic/color.rb +86 -0
- data/lib/vic/color_error.rb +7 -0
- data/lib/vic/colorscheme.rb +9 -1
- data/lib/vic/colorscheme/highlight.rb +44 -14
- data/lib/vic/colorscheme/highlight/argument.rb +7 -11
- data/lib/vic/colorscheme/highlight/argument_set.rb +15 -4
- data/lib/vic/colorscheme/highlight_set.rb +18 -3
- metadata +4 -1
data/lib/vic.rb
CHANGED
data/lib/vic/color.rb
ADDED
@@ -0,0 +1,86 @@
|
|
1
|
+
module Vic
|
2
|
+
module Color extend self
|
3
|
+
# System colors (0-15)
|
4
|
+
SYSTEM_COLORS = [
|
5
|
+
[0x00, 0x00, 0x00],
|
6
|
+
[0x80, 0x00, 0x00],
|
7
|
+
[0x00, 0x80, 0x00],
|
8
|
+
[0x80, 0x80, 0x00],
|
9
|
+
[0x00, 0x00, 0x80],
|
10
|
+
[0x80, 0x00, 0x80],
|
11
|
+
[0x00, 0x80, 0x80],
|
12
|
+
[0xc0, 0xc0, 0xc0],
|
13
|
+
[0x80, 0x80, 0x80],
|
14
|
+
[0xff, 0x00, 0x00],
|
15
|
+
[0x00, 0xff, 0x00],
|
16
|
+
[0xff, 0xff, 0x00],
|
17
|
+
[0x00, 0x00, 0xff],
|
18
|
+
[0xff, 0x00, 0xff],
|
19
|
+
[0x00, 0xff, 0xff],
|
20
|
+
[0xff, 0xff, 0xff]
|
21
|
+
]
|
22
|
+
|
23
|
+
# RGB colors (16 - 231)
|
24
|
+
RGB_COLORS = [0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff].repeated_permutation(3).to_a
|
25
|
+
|
26
|
+
# Grayscale colors (232 - 255)
|
27
|
+
GRAYSCALE_COLORS = (0x08..0xee).step(0x0a).to_a.map {|v| Array.new(3).fill(v) }
|
28
|
+
|
29
|
+
# All 256 colors of the rainbow. Organized from 0 to 255.
|
30
|
+
COLORS_256 = SYSTEM_COLORS + RGB_COLORS + GRAYSCALE_COLORS
|
31
|
+
|
32
|
+
# Convert hexidecimal color to an Array of RGB values.
|
33
|
+
#
|
34
|
+
# @param [String] hex the hexidecimal color
|
35
|
+
# @return [Array] the RGB color conversion
|
36
|
+
def hex_to_rgb(hex)
|
37
|
+
hex.match(/#?(..)(..)(..)/)[1..4].to_a.map {|v| v.to_i(16) }
|
38
|
+
end
|
39
|
+
|
40
|
+
# Takes a hexidecimal color and returns is closest 256 color match.
|
41
|
+
#
|
42
|
+
# Credit goes to Micheal Elliot for the algorithm which was originally written
|
43
|
+
# in Python.
|
44
|
+
#
|
45
|
+
# @see https://gist.github.com/719710
|
46
|
+
# @param [String] hex the hexidecimal color
|
47
|
+
# @return [FixNum] the closest 256 color match
|
48
|
+
def hex_to_256(hex)
|
49
|
+
parts = hex_to_rgb(hex)
|
50
|
+
|
51
|
+
# If the hex is a member of the 256 colors club, we'll just return it's 256
|
52
|
+
# color value. No sense in doing extra work, right?
|
53
|
+
return COLORS_256.index(parts) if COLORS_256.include?(parts)
|
54
|
+
|
55
|
+
increments = 0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff
|
56
|
+
|
57
|
+
# For each part we need to check if it's between any two of the increments.
|
58
|
+
# If it is we'll determine the closest match, change it's value, break,
|
59
|
+
# and move on to the next part.
|
60
|
+
parts.map! do |part|
|
61
|
+
closest = nil
|
62
|
+
for i in (0..(increments.length - 1))
|
63
|
+
lower = increments[i]
|
64
|
+
upper = increments[i + 1]
|
65
|
+
next unless (lower <= part) && (part <= upper)
|
66
|
+
distance_from_lower = (lower - part).abs
|
67
|
+
distance_from_upper = (upper - part).abs
|
68
|
+
closest = distance_from_lower < distance_from_upper ? lower : upper
|
69
|
+
break
|
70
|
+
end
|
71
|
+
closest
|
72
|
+
end
|
73
|
+
|
74
|
+
# Return the index of the color
|
75
|
+
COLORS_256.index(parts)
|
76
|
+
end
|
77
|
+
|
78
|
+
# Checks if the subjec is a valid hexidecimal color.
|
79
|
+
#
|
80
|
+
# @param [String] subject the string in question
|
81
|
+
# @return [Match
|
82
|
+
def hex_color?(subject)
|
83
|
+
subject.match(/#[\da-f]{6}/) ? true : false
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
data/lib/vic/colorscheme.rb
CHANGED
@@ -72,8 +72,16 @@ module Vic
|
|
72
72
|
hilight = highlight_set.find_by_group(group)
|
73
73
|
no_args = args.empty?
|
74
74
|
|
75
|
+
# If the highlight doesn't exist or no args were passed, create the
|
76
|
+
# highlight. This enables more flexible syntax for situations where you
|
77
|
+
# may need to create or update a highlight using this syntax:
|
78
|
+
#
|
79
|
+
# `hi('Normal').gui('bold')
|
80
|
+
#
|
81
|
+
# Note: If a highlight has no arguments it isn't rendered.
|
75
82
|
if not hilight and no_args
|
76
|
-
|
83
|
+
hilight = Highlight.new("#{language}#{group}")
|
84
|
+
highlight_set.add(hilight)
|
77
85
|
elsif hilight and no_args
|
78
86
|
return hilight
|
79
87
|
elsif hilight
|
@@ -1,5 +1,7 @@
|
|
1
1
|
module Vic
|
2
2
|
class Colorscheme::Highlight
|
3
|
+
include Vic::Color
|
4
|
+
|
3
5
|
attr_accessor :group
|
4
6
|
|
5
7
|
# Creates an instance of Vic::Colorscheme::Highlight. Uses
|
@@ -15,24 +17,52 @@ module Vic
|
|
15
17
|
|
16
18
|
# Sets the methods term, term=, start, start=, etc. for settings arguments.
|
17
19
|
self.class_eval do
|
18
|
-
%w{term start stop cterm ctermfg ctermbg gui guibg
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
20
|
+
%w{term start stop cterm ctermfg ctermbg gui guifg guibg}.each do |m|
|
21
|
+
|
22
|
+
# Getter method
|
23
|
+
define_method(m) do
|
24
|
+
arg = argument_set.find_by_key(m)
|
25
|
+
return arg.val if arg
|
26
|
+
end
|
27
|
+
|
28
|
+
# Setter method
|
29
|
+
define_method("#{m}=") do |val|
|
30
|
+
arg = argument_set.find_by_key(m)
|
31
|
+
if arg
|
32
|
+
arg.val = val
|
27
33
|
else
|
28
|
-
|
29
|
-
argument_set.add
|
34
|
+
arg = Argument.new(m, val)
|
35
|
+
argument_set.add arg
|
30
36
|
end
|
31
|
-
|
32
|
-
|
37
|
+
|
38
|
+
# Return self for chaining
|
39
|
+
self
|
40
|
+
end
|
33
41
|
end
|
34
42
|
end
|
35
43
|
|
44
|
+
# Sets guifg and ctermfg simultaneously. `hex` is automatically converted to
|
45
|
+
# the 256 color code for ctermfg.
|
46
|
+
#
|
47
|
+
# @param [String] hex a hexidecimal color
|
48
|
+
def fg=(hex)
|
49
|
+
self.guifg = hex
|
50
|
+
self.ctermfg = Color.hex_to_256(hex)
|
51
|
+
|
52
|
+
# Return self for chaining
|
53
|
+
self
|
54
|
+
end
|
55
|
+
|
56
|
+
# Sets guibg and ctermbg simultaneously. `hex` is automatically converted to
|
57
|
+
# the 256 color code for ctermbg.
|
58
|
+
def bg=(hex)
|
59
|
+
self.guibg = hex
|
60
|
+
self.ctermbg = Color.hex_to_256(hex)
|
61
|
+
|
62
|
+
# Return self for chaining
|
63
|
+
self
|
64
|
+
end
|
65
|
+
|
36
66
|
# Updates/sets the current highlight's arguments.
|
37
67
|
#
|
38
68
|
# @param [Hash] args the arguments to update/set, `:guibg => '#333333'`
|
@@ -54,7 +84,7 @@ module Vic
|
|
54
84
|
#
|
55
85
|
# @return [String] the highlight as a string
|
56
86
|
def write
|
57
|
-
"hi #{group} #{arguments.sort_by_key.map(&:write).join(' ')}"
|
87
|
+
"hi #{group} #{arguments.sort_by_key.map(&:write).compact.join(' ')}"
|
58
88
|
end
|
59
89
|
end
|
60
90
|
end
|
@@ -1,23 +1,19 @@
|
|
1
1
|
module Vic
|
2
2
|
class Colorscheme::Highlight::Argument
|
3
|
-
VALID = {
|
4
|
-
:normal_terminal => %w{term start stop},
|
5
|
-
:color_terminal => %w{cterm ctermfg ctermbg},
|
6
|
-
:gui => %w{gui guifg guibg guisp font}
|
7
|
-
}
|
3
|
+
VALID = %w{term start stop cterm ctermfg ctermbg gui guifg guibg guisp font}
|
8
4
|
|
9
|
-
attr_accessor :key, :
|
5
|
+
attr_accessor :key, :val
|
10
6
|
|
11
|
-
def initialize(key,
|
12
|
-
@key, @
|
7
|
+
def initialize(key, val)
|
8
|
+
@key, @val = key, val
|
13
9
|
end
|
14
10
|
|
15
11
|
# The argument as a string
|
16
12
|
#
|
17
13
|
# @return [String,nil] the string if argument has been set
|
18
14
|
def write
|
19
|
-
return unless
|
20
|
-
"#{key}=#{
|
15
|
+
return unless val
|
16
|
+
"#{key}=#{val.respond_to?(:join) ? val.join(',') : val}"
|
21
17
|
end
|
22
18
|
|
23
19
|
# Checks if `key` is valid vim key for an argument
|
@@ -25,7 +21,7 @@ module Vic
|
|
25
21
|
# @param [String,Symbol]
|
26
22
|
# @return [true,false] the key is valid
|
27
23
|
def self.is_valid?(key)
|
28
|
-
VALID.
|
24
|
+
VALID.include?(key.to_s)
|
29
25
|
end
|
30
26
|
end
|
31
27
|
end
|
@@ -1,14 +1,25 @@
|
|
1
1
|
module Vic
|
2
|
-
class Colorscheme::Highlight::ArgumentSet
|
2
|
+
class Colorscheme::Highlight::ArgumentSet
|
3
|
+
include Enumerable
|
4
|
+
|
5
|
+
def arguments
|
6
|
+
@arguments ||= []
|
7
|
+
end
|
8
|
+
|
9
|
+
def each
|
10
|
+
arguments.each {|a| yield a }
|
11
|
+
end
|
12
|
+
|
3
13
|
# Adds a new argument to the set
|
4
14
|
#
|
5
15
|
# @param [Colorscheme::Highlight::Argument] argument the argument to add
|
6
16
|
# @return [Colorscheme::Highlight::ArgumentSet] the new set of arguments
|
7
17
|
def add(argument)
|
8
|
-
if argument.respond_to? :
|
9
|
-
|
18
|
+
if argument.respond_to? :val
|
19
|
+
arguments.push argument
|
10
20
|
else
|
11
21
|
# Raise an Exception
|
22
|
+
raise TypeError.new("expted type Colorscheme::Highlight::Argument")
|
12
23
|
end
|
13
24
|
end
|
14
25
|
|
@@ -24,7 +35,7 @@ module Vic
|
|
24
35
|
#
|
25
36
|
# @return [Colorscheme::Highlight::ArgumentSet] the sorted set of arguments
|
26
37
|
def sort_by_key
|
27
|
-
sort {|a, b| a.key <=> b.key}
|
38
|
+
sort {|a, b| a.key.to_s <=> b.key.to_s }
|
28
39
|
end
|
29
40
|
end
|
30
41
|
end
|
@@ -1,17 +1,32 @@
|
|
1
1
|
module Vic
|
2
|
-
class Colorscheme::HighlightSet
|
2
|
+
class Colorscheme::HighlightSet
|
3
|
+
include Enumerable
|
4
|
+
|
5
|
+
def highlights
|
6
|
+
@highlights ||= []
|
7
|
+
end
|
8
|
+
|
9
|
+
def each
|
10
|
+
highlights.each {|h| yield h }
|
11
|
+
end
|
12
|
+
|
3
13
|
# Adds a highlight to the set.
|
4
14
|
#
|
5
15
|
# @param [Colorscheme::Highlight] highlight the highlight to add
|
6
16
|
# @return [Colorscheme::HighlightSet] the updated set of highlights
|
7
17
|
def add(highlight)
|
8
|
-
if highlight.respond_to?
|
9
|
-
|
18
|
+
if highlight.respond_to? :gui
|
19
|
+
highlights.push highlight
|
10
20
|
else
|
11
21
|
# Raise and Exception
|
22
|
+
raise TypeError.new("expected type Colorscheme::Vic::Highlight")
|
12
23
|
end
|
13
24
|
end
|
14
25
|
|
26
|
+
# Find a highlight by group name
|
27
|
+
#
|
28
|
+
# @param [String] group the group name
|
29
|
+
# @return [Colorscheme::Highlight,nil] the highlight
|
15
30
|
def find_by_group(group)
|
16
31
|
find {|h| h.group == group }
|
17
32
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vic
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -18,6 +18,8 @@ extensions: []
|
|
18
18
|
extra_rdoc_files: []
|
19
19
|
files:
|
20
20
|
- lib/vic.rb
|
21
|
+
- lib/vic/color.rb
|
22
|
+
- lib/vic/color_error.rb
|
21
23
|
- lib/vic/colorscheme.rb
|
22
24
|
- lib/vic/colorscheme/highlight.rb
|
23
25
|
- lib/vic/colorscheme/highlight_set.rb
|
@@ -48,3 +50,4 @@ signing_key:
|
|
48
50
|
specification_version: 3
|
49
51
|
summary: Create Vim colorschemes
|
50
52
|
test_files: []
|
53
|
+
has_rdoc:
|