vimcolorscheme 0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile.lock +28 -0
- data/README.md +293 -0
- data/examples/simple_theme.rb +20 -0
- data/examples/vimscheme1.rb +27 -0
- data/lib/vimcolorscheme.rb +13 -0
- data/lib/vimcolorscheme/base.rb +11 -0
- data/lib/vimcolorscheme/comment_node.rb +15 -0
- data/lib/vimcolorscheme/document.rb +149 -0
- data/lib/vimcolorscheme/hex2term.rb +357 -0
- data/lib/vimcolorscheme/highlight_node.rb +114 -0
- data/lib/vimcolorscheme/raw_node.rb +15 -0
- data/spec/base_spec.rb +92 -0
- data/spec/comment_node_spec.rb +22 -0
- data/spec/hex2term_spec.rb +25 -0
- data/spec/highlight_node_spec.rb +77 -0
- data/spec/raw_node_spec.rb +12 -0
- data/spec/spec_helper.rb +1 -0
- data/vimcolorscheme.gemspec +16 -0
- metadata +64 -0
@@ -0,0 +1,357 @@
|
|
1
|
+
module VimColorScheme
|
2
|
+
class Hex2Term
|
3
|
+
# This colour lookup table is taken from the following gist:
|
4
|
+
# https://gist.github.com/719710
|
5
|
+
SCLUT = {
|
6
|
+
# Primary 3-bit (8 colors). Unique representation!
|
7
|
+
'00' => '000000',
|
8
|
+
'01' => '800000',
|
9
|
+
'02' => '008000',
|
10
|
+
'03' => '808000',
|
11
|
+
'04' => '000080',
|
12
|
+
'05' => '800080',
|
13
|
+
'06' => '008080',
|
14
|
+
'07' => 'c0c0c0',
|
15
|
+
|
16
|
+
# Equivalent "bright" versions of original 8 colors.
|
17
|
+
'08' => '808080',
|
18
|
+
'09' => 'ff0000',
|
19
|
+
'10' => '00ff00',
|
20
|
+
'11' => 'ffff00',
|
21
|
+
'12' => '0000ff',
|
22
|
+
'13' => 'ff00ff',
|
23
|
+
'14' => '00ffff',
|
24
|
+
'15' => 'ffffff',
|
25
|
+
|
26
|
+
# Strictly ascending.
|
27
|
+
'16' => '000000',
|
28
|
+
'17' => '00005f',
|
29
|
+
'18' => '000087',
|
30
|
+
'19' => '0000af',
|
31
|
+
'20' => '0000d7',
|
32
|
+
'21' => '0000ff',
|
33
|
+
'22' => '005f00',
|
34
|
+
'23' => '005f5f',
|
35
|
+
'24' => '005f87',
|
36
|
+
'25' => '005faf',
|
37
|
+
'26' => '005fd7',
|
38
|
+
'27' => '005fff',
|
39
|
+
'28' => '008700',
|
40
|
+
'29' => '00875f',
|
41
|
+
'30' => '008787',
|
42
|
+
'31' => '0087af',
|
43
|
+
'32' => '0087d7',
|
44
|
+
'33' => '0087ff',
|
45
|
+
'34' => '00af00',
|
46
|
+
'35' => '00af5f',
|
47
|
+
'36' => '00af87',
|
48
|
+
'37' => '00afaf',
|
49
|
+
'38' => '00afd7',
|
50
|
+
'39' => '00afff',
|
51
|
+
'40' => '00d700',
|
52
|
+
'41' => '00d75f',
|
53
|
+
'42' => '00d787',
|
54
|
+
'43' => '00d7af',
|
55
|
+
'44' => '00d7d7',
|
56
|
+
'45' => '00d7ff',
|
57
|
+
'46' => '00ff00',
|
58
|
+
'47' => '00ff5f',
|
59
|
+
'48' => '00ff87',
|
60
|
+
'49' => '00ffaf',
|
61
|
+
'50' => '00ffd7',
|
62
|
+
'51' => '00ffff',
|
63
|
+
'52' => '5f0000',
|
64
|
+
'53' => '5f005f',
|
65
|
+
'54' => '5f0087',
|
66
|
+
'55' => '5f00af',
|
67
|
+
'56' => '5f00d7',
|
68
|
+
'57' => '5f00ff',
|
69
|
+
'58' => '5f5f00',
|
70
|
+
'59' => '5f5f5f',
|
71
|
+
'60' => '5f5f87',
|
72
|
+
'61' => '5f5faf',
|
73
|
+
'62' => '5f5fd7',
|
74
|
+
'63' => '5f5fff',
|
75
|
+
'64' => '5f8700',
|
76
|
+
'65' => '5f875f',
|
77
|
+
'66' => '5f8787',
|
78
|
+
'67' => '5f87af',
|
79
|
+
'68' => '5f87d7',
|
80
|
+
'69' => '5f87ff',
|
81
|
+
'70' => '5faf00',
|
82
|
+
'71' => '5faf5f',
|
83
|
+
'72' => '5faf87',
|
84
|
+
'73' => '5fafaf',
|
85
|
+
'74' => '5fafd7',
|
86
|
+
'75' => '5fafff',
|
87
|
+
'76' => '5fd700',
|
88
|
+
'77' => '5fd75f',
|
89
|
+
'78' => '5fd787',
|
90
|
+
'79' => '5fd7af',
|
91
|
+
'80' => '5fd7d7',
|
92
|
+
'81' => '5fd7ff',
|
93
|
+
'82' => '5fff00',
|
94
|
+
'83' => '5fff5f',
|
95
|
+
'84' => '5fff87',
|
96
|
+
'85' => '5fffaf',
|
97
|
+
'86' => '5fffd7',
|
98
|
+
'87' => '5fffff',
|
99
|
+
'88' => '870000',
|
100
|
+
'89' => '87005f',
|
101
|
+
'90' => '870087',
|
102
|
+
'91' => '8700af',
|
103
|
+
'92' => '8700d7',
|
104
|
+
'93' => '8700ff',
|
105
|
+
'94' => '875f00',
|
106
|
+
'95' => '875f5f',
|
107
|
+
'96' => '875f87',
|
108
|
+
'97' => '875faf',
|
109
|
+
'98' => '875fd7',
|
110
|
+
'99' => '875fff',
|
111
|
+
'100' => '878700',
|
112
|
+
'101' => '87875f',
|
113
|
+
'102' => '878787',
|
114
|
+
'103' => '8787af',
|
115
|
+
'104' => '8787d7',
|
116
|
+
'105' => '8787ff',
|
117
|
+
'106' => '87af00',
|
118
|
+
'107' => '87af5f',
|
119
|
+
'108' => '87af87',
|
120
|
+
'109' => '87afaf',
|
121
|
+
'110' => '87afd7',
|
122
|
+
'111' => '87afff',
|
123
|
+
'112' => '87d700',
|
124
|
+
'113' => '87d75f',
|
125
|
+
'114' => '87d787',
|
126
|
+
'115' => '87d7af',
|
127
|
+
'116' => '87d7d7',
|
128
|
+
'117' => '87d7ff',
|
129
|
+
'118' => '87ff00',
|
130
|
+
'119' => '87ff5f',
|
131
|
+
'120' => '87ff87',
|
132
|
+
'121' => '87ffaf',
|
133
|
+
'122' => '87ffd7',
|
134
|
+
'123' => '87ffff',
|
135
|
+
'124' => 'af0000',
|
136
|
+
'125' => 'af005f',
|
137
|
+
'126' => 'af0087',
|
138
|
+
'127' => 'af00af',
|
139
|
+
'128' => 'af00d7',
|
140
|
+
'129' => 'af00ff',
|
141
|
+
'130' => 'af5f00',
|
142
|
+
'131' => 'af5f5f',
|
143
|
+
'132' => 'af5f87',
|
144
|
+
'133' => 'af5faf',
|
145
|
+
'134' => 'af5fd7',
|
146
|
+
'135' => 'af5fff',
|
147
|
+
'136' => 'af8700',
|
148
|
+
'137' => 'af875f',
|
149
|
+
'138' => 'af8787',
|
150
|
+
'139' => 'af87af',
|
151
|
+
'140' => 'af87d7',
|
152
|
+
'141' => 'af87ff',
|
153
|
+
'142' => 'afaf00',
|
154
|
+
'143' => 'afaf5f',
|
155
|
+
'144' => 'afaf87',
|
156
|
+
'145' => 'afafaf',
|
157
|
+
'146' => 'afafd7',
|
158
|
+
'147' => 'afafff',
|
159
|
+
'148' => 'afd700',
|
160
|
+
'149' => 'afd75f',
|
161
|
+
'150' => 'afd787',
|
162
|
+
'151' => 'afd7af',
|
163
|
+
'152' => 'afd7d7',
|
164
|
+
'153' => 'afd7ff',
|
165
|
+
'154' => 'afff00',
|
166
|
+
'155' => 'afff5f',
|
167
|
+
'156' => 'afff87',
|
168
|
+
'157' => 'afffaf',
|
169
|
+
'158' => 'afffd7',
|
170
|
+
'159' => 'afffff',
|
171
|
+
'160' => 'd70000',
|
172
|
+
'161' => 'd7005f',
|
173
|
+
'162' => 'd70087',
|
174
|
+
'163' => 'd700af',
|
175
|
+
'164' => 'd700d7',
|
176
|
+
'165' => 'd700ff',
|
177
|
+
'166' => 'd75f00',
|
178
|
+
'167' => 'd75f5f',
|
179
|
+
'168' => 'd75f87',
|
180
|
+
'169' => 'd75faf',
|
181
|
+
'170' => 'd75fd7',
|
182
|
+
'171' => 'd75fff',
|
183
|
+
'172' => 'd78700',
|
184
|
+
'173' => 'd7875f',
|
185
|
+
'174' => 'd78787',
|
186
|
+
'175' => 'd787af',
|
187
|
+
'176' => 'd787d7',
|
188
|
+
'177' => 'd787ff',
|
189
|
+
'178' => 'd7af00',
|
190
|
+
'179' => 'd7af5f',
|
191
|
+
'180' => 'd7af87',
|
192
|
+
'181' => 'd7afaf',
|
193
|
+
'182' => 'd7afd7',
|
194
|
+
'183' => 'd7afff',
|
195
|
+
'184' => 'd7d700',
|
196
|
+
'185' => 'd7d75f',
|
197
|
+
'186' => 'd7d787',
|
198
|
+
'187' => 'd7d7af',
|
199
|
+
'188' => 'd7d7d7',
|
200
|
+
'189' => 'd7d7ff',
|
201
|
+
'190' => 'd7ff00',
|
202
|
+
'191' => 'd7ff5f',
|
203
|
+
'192' => 'd7ff87',
|
204
|
+
'193' => 'd7ffaf',
|
205
|
+
'194' => 'd7ffd7',
|
206
|
+
'195' => 'd7ffff',
|
207
|
+
'196' => 'ff0000',
|
208
|
+
'197' => 'ff005f',
|
209
|
+
'198' => 'ff0087',
|
210
|
+
'199' => 'ff00af',
|
211
|
+
'200' => 'ff00d7',
|
212
|
+
'201' => 'ff00ff',
|
213
|
+
'202' => 'ff5f00',
|
214
|
+
'203' => 'ff5f5f',
|
215
|
+
'204' => 'ff5f87',
|
216
|
+
'205' => 'ff5faf',
|
217
|
+
'206' => 'ff5fd7',
|
218
|
+
'207' => 'ff5fff',
|
219
|
+
'208' => 'ff8700',
|
220
|
+
'209' => 'ff875f',
|
221
|
+
'210' => 'ff8787',
|
222
|
+
'211' => 'ff87af',
|
223
|
+
'212' => 'ff87d7',
|
224
|
+
'213' => 'ff87ff',
|
225
|
+
'214' => 'ffaf00',
|
226
|
+
'215' => 'ffaf5f',
|
227
|
+
'216' => 'ffaf87',
|
228
|
+
'217' => 'ffafaf',
|
229
|
+
'218' => 'ffafd7',
|
230
|
+
'219' => 'ffafff',
|
231
|
+
'220' => 'ffd700',
|
232
|
+
'221' => 'ffd75f',
|
233
|
+
'222' => 'ffd787',
|
234
|
+
'223' => 'ffd7af',
|
235
|
+
'224' => 'ffd7d7',
|
236
|
+
'225' => 'ffd7ff',
|
237
|
+
'226' => 'ffff00',
|
238
|
+
'227' => 'ffff5f',
|
239
|
+
'228' => 'ffff87',
|
240
|
+
'229' => 'ffffaf',
|
241
|
+
'230' => 'ffffd7',
|
242
|
+
'231' => 'ffffff',
|
243
|
+
|
244
|
+
# Gr' => scale rang.
|
245
|
+
'232' => '080808',
|
246
|
+
'233' => '121212',
|
247
|
+
'234' => '1c1c1c',
|
248
|
+
'235' => '262626',
|
249
|
+
'236' => '303030',
|
250
|
+
'237' => '3a3a3a',
|
251
|
+
'238' => '444444',
|
252
|
+
'239' => '4e4e4e',
|
253
|
+
'240' => '585858',
|
254
|
+
'241' => '626262',
|
255
|
+
'242' => '6c6c6c',
|
256
|
+
'243' => '767676',
|
257
|
+
'244' => '808080',
|
258
|
+
'245' => '8a8a8a',
|
259
|
+
'246' => '949494',
|
260
|
+
'247' => '9e9e9e',
|
261
|
+
'248' => 'a8a8a8',
|
262
|
+
'249' => 'b2b2b2',
|
263
|
+
'250' => 'bcbcbc',
|
264
|
+
'251' => 'c6c6c6',
|
265
|
+
'252' => 'd0d0d0',
|
266
|
+
'253' => 'dadada',
|
267
|
+
'254' => 'e4e4e4',
|
268
|
+
'255' => 'eeeeee',
|
269
|
+
}
|
270
|
+
|
271
|
+
# Hex color lookup table. Essentially this is exactly the same as the short
|
272
|
+
# color lookup table but inverted. So k => v becomes v => k.
|
273
|
+
HCLUT = SCLUT.invert
|
274
|
+
|
275
|
+
# Takes either a short color value or a hexidecimal color value and converts
|
276
|
+
# it to the other format respectively.
|
277
|
+
#
|
278
|
+
# Example:
|
279
|
+
#
|
280
|
+
# convert(23)
|
281
|
+
# # => '005f5f'
|
282
|
+
#
|
283
|
+
# convert('#ffffff')
|
284
|
+
# # => '231'
|
285
|
+
def self.convert value
|
286
|
+
if value.to_s.length < 4 and value.to_s.to_i < 256
|
287
|
+
short2rb(value)
|
288
|
+
else
|
289
|
+
rgb2short(value)
|
290
|
+
end
|
291
|
+
end
|
292
|
+
|
293
|
+
# Takes a short color value (e.g. between 0 and 255) and returns the
|
294
|
+
# hexadecimal equivalent with a leading hash.
|
295
|
+
#
|
296
|
+
# Example:
|
297
|
+
#
|
298
|
+
# short2rb(231)
|
299
|
+
# # => '#ffffff'
|
300
|
+
def self.short2rb short
|
301
|
+
'#' + SCLUT[short.to_s]
|
302
|
+
end
|
303
|
+
|
304
|
+
# Takes an RGB hex value, with or without the leading hash, and converts it
|
305
|
+
# into one of 256 color values used by terminals.
|
306
|
+
#
|
307
|
+
# The method for doing it was borrowed with lots of love from this gist:
|
308
|
+
# https://gist.github.com/719710
|
309
|
+
#
|
310
|
+
# Example:
|
311
|
+
#
|
312
|
+
# rgb2short('#ffffff')
|
313
|
+
# # => '231'
|
314
|
+
def self.rgb2short rgb
|
315
|
+
rgb = strip_hash(rgb)
|
316
|
+
incs = [0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff]
|
317
|
+
parts = rgb.split(/(..)(..)(..)/).map { |part| part.to_i(16) }
|
318
|
+
res = []
|
319
|
+
|
320
|
+
# The above split will have an empty string at the start, this gets rid of
|
321
|
+
# it
|
322
|
+
parts.shift
|
323
|
+
|
324
|
+
parts.each do |part|
|
325
|
+
incs.each_cons(2) do |s, b|
|
326
|
+
if s <= part and part <= b
|
327
|
+
s1 = (s - part).abs
|
328
|
+
b1 = (b - part).abs
|
329
|
+
|
330
|
+
if s1 < b1
|
331
|
+
closest = s
|
332
|
+
else
|
333
|
+
closest = b
|
334
|
+
end
|
335
|
+
|
336
|
+
res << closest
|
337
|
+
break
|
338
|
+
end
|
339
|
+
end
|
340
|
+
end
|
341
|
+
|
342
|
+
key = res.map { |part| part.to_s(16).center(2, '0') }.join
|
343
|
+
HCLUT[key]
|
344
|
+
end
|
345
|
+
|
346
|
+
# Takes a string that may or may not have a hash at the start and returns a
|
347
|
+
# string that does not have a hash at the start.
|
348
|
+
#
|
349
|
+
# Example:
|
350
|
+
#
|
351
|
+
# strip_hash('#ffffff')
|
352
|
+
# # => 'ffffff'
|
353
|
+
def self.strip_hash hex
|
354
|
+
hex.delete '#'
|
355
|
+
end
|
356
|
+
end
|
357
|
+
end
|
@@ -0,0 +1,114 @@
|
|
1
|
+
module VimColorScheme
|
2
|
+
class HighlightNode
|
3
|
+
def initialize name, options = {}
|
4
|
+
@name = name
|
5
|
+
@options = options
|
6
|
+
end
|
7
|
+
|
8
|
+
# Processes the values of a node. Basically, if there are values that have
|
9
|
+
# not been set, we try to guess them. So we convert gui colors to cterm
|
10
|
+
# colors if the cterm colors are not present and default to :none if that
|
11
|
+
# isn't possible and so on.
|
12
|
+
#
|
13
|
+
# This gets called in the to_s method so there's no need to call it
|
14
|
+
# explicitly.
|
15
|
+
def process
|
16
|
+
# Process colors. Set cterm if none, gui if none, based on their
|
17
|
+
# counterparts.
|
18
|
+
if !gui and cterm
|
19
|
+
gui(cterm)
|
20
|
+
end
|
21
|
+
|
22
|
+
if !guifg and ctermfg
|
23
|
+
guifg Hex2Term.convert(ctermfg)
|
24
|
+
end
|
25
|
+
|
26
|
+
if !guibg and ctermbg
|
27
|
+
guibg Hex2Term.convert(ctermbg)
|
28
|
+
end
|
29
|
+
|
30
|
+
if !cterm and gui
|
31
|
+
cterm(gui)
|
32
|
+
end
|
33
|
+
|
34
|
+
if !ctermfg and guifg
|
35
|
+
ctermfg Hex2Term.convert(guifg)
|
36
|
+
end
|
37
|
+
|
38
|
+
if !ctermbg and guibg
|
39
|
+
ctermbg Hex2Term.convert(guibg)
|
40
|
+
end
|
41
|
+
|
42
|
+
# Default things to none if they are nil or false.
|
43
|
+
gui :none unless gui
|
44
|
+
guifg :none unless guifg
|
45
|
+
guibg :none unless guibg
|
46
|
+
cterm :none unless cterm
|
47
|
+
ctermfg :none unless ctermfg
|
48
|
+
ctermbg :none unless ctermbg
|
49
|
+
end
|
50
|
+
|
51
|
+
# Converts the Node to a valid entry in a vim color scheme file.
|
52
|
+
def to_s
|
53
|
+
# Make sure the node has been processed before converting to string.
|
54
|
+
process
|
55
|
+
|
56
|
+
result = "highlight #{@name.to_s} "
|
57
|
+
result += "gui=#{attr_to_s(gui)} "
|
58
|
+
result += "guifg=#{attr_to_s(guifg)} "
|
59
|
+
result += "guibg=#{attr_to_s(guibg)} "
|
60
|
+
result += "cterm=#{attr_to_s(cterm)} "
|
61
|
+
result += "ctermfg=#{attr_to_s(ctermfg)} "
|
62
|
+
result += "ctermbg=#{attr_to_s(ctermbg)}\n"
|
63
|
+
end
|
64
|
+
|
65
|
+
# Converts an attribute to string. This accounts for cases such as :none and
|
66
|
+
# :reverse and returns the appropriate string.
|
67
|
+
def attr_to_s attribute
|
68
|
+
case attribute
|
69
|
+
when Array
|
70
|
+
attribute.map { |a| attr_to_s(a) }.join(',')
|
71
|
+
when :none
|
72
|
+
'NONE'
|
73
|
+
when :reverse
|
74
|
+
'REVERSE'
|
75
|
+
else
|
76
|
+
attribute
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
#
|
81
|
+
# The following are just default accessors for the various members of the
|
82
|
+
# options hash on this object.
|
83
|
+
#
|
84
|
+
def gui *args
|
85
|
+
@options[:gui] = args if args.length > 0
|
86
|
+
@options[:gui]
|
87
|
+
end
|
88
|
+
|
89
|
+
def guibg new_guibg = nil
|
90
|
+
@options[:guibg] = new_guibg if new_guibg
|
91
|
+
@options[:guibg]
|
92
|
+
end
|
93
|
+
|
94
|
+
def guifg new_guifg = nil
|
95
|
+
@options[:guifg] = new_guifg if new_guifg
|
96
|
+
@options[:guifg]
|
97
|
+
end
|
98
|
+
|
99
|
+
def cterm *args
|
100
|
+
@options[:cterm] = args if args.length > 0
|
101
|
+
@options[:cterm]
|
102
|
+
end
|
103
|
+
|
104
|
+
def ctermbg new_ctermbg = nil
|
105
|
+
@options[:ctermbg] = new_ctermbg if new_ctermbg
|
106
|
+
@options[:ctermbg]
|
107
|
+
end
|
108
|
+
|
109
|
+
def ctermfg new_ctermfg = nil
|
110
|
+
@options[:ctermfg] = new_ctermfg if new_ctermfg
|
111
|
+
@options[:ctermfg]
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|