vic 0.0.4 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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:
|