Skip to content

Commit b68675d

Browse files
committed
Color: add xterm()
1 parent 3b60417 commit b68675d

File tree

2 files changed

+302
-1
lines changed

2 files changed

+302
-1
lines changed

autoload/vital/__vital__/Color.vim

Lines changed: 279 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
" RGB/HSL conversion library
1+
" RGB/HSL/terminal code conversion library
22

33
let s:save_cpo = &cpo
44
set cpo&vim
@@ -135,6 +135,284 @@ function! s:_check_hsl_range(h, s, l) abort
135135
return 1
136136
endfunction
137137

138+
" https://en.wikipedia.org/wiki/File:Xterm_256color_chart.svg
139+
let s:XTERM_PALETTE = [
140+
\ [0x00, 0x00, 0x00],
141+
\ [0x80, 0x00, 0x00],
142+
\ [0x00, 0x80, 0x00],
143+
\ [0x80, 0x80, 0x00],
144+
\ [0x00, 0x00, 0x80],
145+
\ [0x80, 0x00, 0x80],
146+
\ [0x00, 0x80, 0x80],
147+
\ [0xC0, 0xC0, 0xC0],
148+
\ [0x80, 0x80, 0x80],
149+
\ [0xFF, 0x00, 0x00],
150+
\ [0x00, 0xFF, 0x00],
151+
\ [0xFF, 0xFF, 0x00],
152+
\ [0x00, 0x00, 0xFF],
153+
\ [0xFF, 0x00, 0xFF],
154+
\ [0x00, 0xFF, 0xFF],
155+
\ [0xFF, 0xFF, 0xFF],
156+
\
157+
\ [0x00, 0x00, 0x00],
158+
\ [0x00, 0x00, 0x5F],
159+
\ [0x00, 0x00, 0x87],
160+
\ [0x00, 0x00, 0xAF],
161+
\ [0x00, 0x00, 0xD7],
162+
\ [0x00, 0x00, 0xFF],
163+
\ [0x00, 0x5F, 0x00],
164+
\ [0x00, 0x5F, 0x5F],
165+
\ [0x00, 0x5F, 0x87],
166+
\ [0x00, 0x5F, 0xAF],
167+
\ [0x00, 0x5F, 0xD7],
168+
\ [0x00, 0x5F, 0xFF],
169+
\ [0x00, 0x87, 0x00],
170+
\ [0x00, 0x87, 0x5F],
171+
\ [0x00, 0x87, 0x87],
172+
\ [0x00, 0x87, 0xAF],
173+
\ [0x00, 0x87, 0xD7],
174+
\ [0x00, 0x87, 0xFF],
175+
\ [0x00, 0xAF, 0x00],
176+
\ [0x00, 0xAF, 0x5F],
177+
\ [0x00, 0xAF, 0x87],
178+
\ [0x00, 0xAF, 0xAF],
179+
\ [0x00, 0xAF, 0xD7],
180+
\ [0x00, 0xAF, 0xFF],
181+
\ [0x00, 0xD7, 0x00],
182+
\ [0x00, 0xD7, 0x5F],
183+
\ [0x00, 0xD7, 0x87],
184+
\ [0x00, 0xD7, 0xAF],
185+
\ [0x00, 0xD7, 0xD7],
186+
\ [0x00, 0xD7, 0xFF],
187+
\ [0x00, 0xFF, 0x00],
188+
\ [0x00, 0xFF, 0x5F],
189+
\ [0x00, 0xFF, 0x87],
190+
\ [0x00, 0xFF, 0xAF],
191+
\ [0x00, 0xFF, 0xD7],
192+
\ [0x00, 0xFF, 0xFF],
193+
\ [0x5F, 0x00, 0x00],
194+
\ [0x5F, 0x00, 0x5F],
195+
\ [0x5F, 0x00, 0x87],
196+
\ [0x5F, 0x00, 0xAF],
197+
\ [0x5F, 0x00, 0xD7],
198+
\ [0x5F, 0x00, 0xFF],
199+
\ [0x5F, 0x5F, 0x00],
200+
\ [0x5F, 0x5F, 0x5F],
201+
\ [0x5F, 0x5F, 0x87],
202+
\ [0x5F, 0x5F, 0xAF],
203+
\ [0x5F, 0x5F, 0xD7],
204+
\ [0x5F, 0x5F, 0xFF],
205+
\ [0x5F, 0x87, 0x00],
206+
\ [0x5F, 0x87, 0x5F],
207+
\ [0x5F, 0x87, 0x87],
208+
\ [0x5F, 0x87, 0xAF],
209+
\ [0x5F, 0x87, 0xD7],
210+
\ [0x5F, 0x87, 0xFF],
211+
\ [0x5F, 0xAF, 0x00],
212+
\ [0x5F, 0xAF, 0x5F],
213+
\ [0x5F, 0xAF, 0x87],
214+
\ [0x5F, 0xAF, 0xAF],
215+
\ [0x5F, 0xAF, 0xD7],
216+
\ [0x5F, 0xAF, 0xFF],
217+
\ [0x5F, 0xD7, 0x00],
218+
\ [0x5F, 0xD7, 0x5F],
219+
\ [0x5F, 0xD7, 0x87],
220+
\ [0x5F, 0xD7, 0xAF],
221+
\ [0x5F, 0xD7, 0xD7],
222+
\ [0x5F, 0xD7, 0xFF],
223+
\ [0x5F, 0xFF, 0x00],
224+
\ [0x5F, 0xFF, 0x5F],
225+
\ [0x5F, 0xFF, 0x87],
226+
\ [0x5F, 0xFF, 0xAF],
227+
\ [0x5F, 0xFF, 0xD7],
228+
\ [0x5F, 0xFF, 0xFF],
229+
\ [0x87, 0x00, 0x00],
230+
\ [0x87, 0x00, 0x5F],
231+
\ [0x87, 0x00, 0x87],
232+
\ [0x87, 0x00, 0xAF],
233+
\ [0x87, 0x00, 0xD7],
234+
\ [0x87, 0x00, 0xFF],
235+
\ [0x87, 0x5F, 0x00],
236+
\ [0x87, 0x5F, 0x5F],
237+
\ [0x87, 0x5F, 0x87],
238+
\ [0x87, 0x5F, 0xAF],
239+
\ [0x87, 0x5F, 0xD7],
240+
\ [0x87, 0x5F, 0xFF],
241+
\ [0x87, 0x87, 0x00],
242+
\ [0x87, 0x87, 0x5F],
243+
\ [0x87, 0x87, 0x87],
244+
\ [0x87, 0x87, 0xAF],
245+
\ [0x87, 0x87, 0xD7],
246+
\ [0x87, 0x87, 0xFF],
247+
\ [0x87, 0xAF, 0x00],
248+
\ [0x87, 0xAF, 0x5F],
249+
\ [0x87, 0xAF, 0x87],
250+
\ [0x87, 0xAF, 0xAF],
251+
\ [0x87, 0xAF, 0xD7],
252+
\ [0x87, 0xAF, 0xFF],
253+
\ [0x87, 0xD7, 0x00],
254+
\ [0x87, 0xD7, 0x5F],
255+
\ [0x87, 0xD7, 0x87],
256+
\ [0x87, 0xD7, 0xAF],
257+
\ [0x87, 0xD7, 0xD7],
258+
\ [0x87, 0xD7, 0xFF],
259+
\ [0x87, 0xFF, 0x00],
260+
\ [0x87, 0xFF, 0x5F],
261+
\ [0x87, 0xFF, 0x87],
262+
\ [0x87, 0xFF, 0xAF],
263+
\ [0x87, 0xFF, 0xD7],
264+
\ [0x87, 0xFF, 0xFF],
265+
\ [0xAF, 0x00, 0x00],
266+
\ [0xAF, 0x00, 0x5F],
267+
\ [0xAF, 0x00, 0x87],
268+
\ [0xAF, 0x00, 0xAF],
269+
\ [0xAF, 0x00, 0xD7],
270+
\ [0xAF, 0x00, 0xFF],
271+
\ [0xAF, 0x5F, 0x00],
272+
\ [0xAF, 0x5F, 0x5F],
273+
\ [0xAF, 0x5F, 0x87],
274+
\ [0xAF, 0x5F, 0xAF],
275+
\ [0xAF, 0x5F, 0xD7],
276+
\ [0xAF, 0x5F, 0xFF],
277+
\ [0xAF, 0x87, 0x00],
278+
\ [0xAF, 0x87, 0x5F],
279+
\ [0xAF, 0x87, 0x87],
280+
\ [0xAF, 0x87, 0xAF],
281+
\ [0xAF, 0x87, 0xD7],
282+
\ [0xAF, 0x87, 0xFF],
283+
\ [0xAF, 0xAF, 0x00],
284+
\ [0xAF, 0xAF, 0x5F],
285+
\ [0xAF, 0xAF, 0x87],
286+
\ [0xAF, 0xAF, 0xAF],
287+
\ [0xAF, 0xAF, 0xD7],
288+
\ [0xAF, 0xAF, 0xFF],
289+
\ [0xAF, 0xD7, 0x00],
290+
\ [0xAF, 0xD7, 0x5F],
291+
\ [0xAF, 0xD7, 0x87],
292+
\ [0xAF, 0xD7, 0xAF],
293+
\ [0xAF, 0xD7, 0xD7],
294+
\ [0xAF, 0xD7, 0xFF],
295+
\ [0xAF, 0xFF, 0x00],
296+
\ [0xAF, 0xFF, 0x5F],
297+
\ [0xAF, 0xFF, 0x87],
298+
\ [0xAF, 0xFF, 0xAF],
299+
\ [0xAF, 0xFF, 0xD7],
300+
\ [0xAF, 0xFF, 0xFF],
301+
\ [0xD7, 0x00, 0x00],
302+
\ [0xD7, 0x00, 0x5F],
303+
\ [0xD7, 0x00, 0x87],
304+
\ [0xD7, 0x00, 0xAF],
305+
\ [0xD7, 0x00, 0xD7],
306+
\ [0xD7, 0x00, 0xFF],
307+
\ [0xD7, 0x5F, 0x00],
308+
\ [0xD7, 0x5F, 0x5F],
309+
\ [0xD7, 0x5F, 0x87],
310+
\ [0xD7, 0x5F, 0xAF],
311+
\ [0xD7, 0x5F, 0xD7],
312+
\ [0xD7, 0x5F, 0xFF],
313+
\ [0xD7, 0x87, 0x00],
314+
\ [0xD7, 0x87, 0x5F],
315+
\ [0xD7, 0x87, 0x87],
316+
\ [0xD7, 0x87, 0xAF],
317+
\ [0xD7, 0x87, 0xD7],
318+
\ [0xD7, 0x87, 0xFF],
319+
\ [0xDF, 0xAF, 0x00],
320+
\ [0xDF, 0xAF, 0x5F],
321+
\ [0xDF, 0xAF, 0x87],
322+
\ [0xDF, 0xAF, 0xAF],
323+
\ [0xDF, 0xAF, 0xDF],
324+
\ [0xDF, 0xAF, 0xFF],
325+
\ [0xDF, 0xDF, 0x00],
326+
\ [0xDF, 0xDF, 0x5F],
327+
\ [0xDF, 0xDF, 0x87],
328+
\ [0xDF, 0xDF, 0xAF],
329+
\ [0xDF, 0xDF, 0xDF],
330+
\ [0xDF, 0xDF, 0xFF],
331+
\ [0xDF, 0xFF, 0x00],
332+
\ [0xDF, 0xFF, 0x5F],
333+
\ [0xDF, 0xFF, 0x87],
334+
\ [0xDF, 0xFF, 0xAF],
335+
\ [0xDF, 0xFF, 0xDF],
336+
\ [0xDF, 0xFF, 0xFF],
337+
\ [0xFF, 0x00, 0x00],
338+
\ [0xFF, 0x00, 0x5F],
339+
\ [0xFF, 0x00, 0x87],
340+
\ [0xFF, 0x00, 0xAF],
341+
\ [0xFF, 0x00, 0xDF],
342+
\ [0xFF, 0x00, 0xFF],
343+
\ [0xFF, 0x5F, 0x00],
344+
\ [0xFF, 0x5F, 0x5F],
345+
\ [0xFF, 0x5F, 0x87],
346+
\ [0xFF, 0x5F, 0xAF],
347+
\ [0xFF, 0x5F, 0xDF],
348+
\ [0xFF, 0x5F, 0xFF],
349+
\ [0xFF, 0x87, 0x00],
350+
\ [0xFF, 0x87, 0x5F],
351+
\ [0xFF, 0x87, 0x87],
352+
\ [0xFF, 0x87, 0xAF],
353+
\ [0xFF, 0x87, 0xDF],
354+
\ [0xFF, 0x87, 0xFF],
355+
\ [0xFF, 0xAF, 0x00],
356+
\ [0xFF, 0xAF, 0x5F],
357+
\ [0xFF, 0xAF, 0x87],
358+
\ [0xFF, 0xAF, 0xAF],
359+
\ [0xFF, 0xAF, 0xDF],
360+
\ [0xFF, 0xAF, 0xFF],
361+
\ [0xFF, 0xDF, 0x00],
362+
\ [0xFF, 0xDF, 0x5F],
363+
\ [0xFF, 0xDF, 0x87],
364+
\ [0xFF, 0xDF, 0xAF],
365+
\ [0xFF, 0xDF, 0xDF],
366+
\ [0xFF, 0xDF, 0xFF],
367+
\ [0xFF, 0xFF, 0x00],
368+
\ [0xFF, 0xFF, 0x5F],
369+
\ [0xFF, 0xFF, 0x87],
370+
\ [0xFF, 0xFF, 0xAF],
371+
\ [0xFF, 0xFF, 0xDF],
372+
\ [0xFF, 0xFF, 0xFF],
373+
\
374+
\ [0x08, 0x08, 0x08],
375+
\ [0x12, 0x12, 0x12],
376+
\ [0x1C, 0x1C, 0x1C],
377+
\ [0x26, 0x26, 0x26],
378+
\ [0x30, 0x30, 0x30],
379+
\ [0x3A, 0x3A, 0x3A],
380+
\ [0x44, 0x44, 0x44],
381+
\ [0x4E, 0x4E, 0x4E],
382+
\ [0x58, 0x58, 0x58],
383+
\ [0x62, 0x62, 0x62],
384+
\ [0x6C, 0x6C, 0x6C],
385+
\ [0x76, 0x76, 0x76],
386+
\ [0x80, 0x80, 0x80],
387+
\ [0x8A, 0x8A, 0x8A],
388+
\ [0x94, 0x94, 0x94],
389+
\ [0x9E, 0x9E, 0x9E],
390+
\ [0xA8, 0xA8, 0xA8],
391+
\ [0xB2, 0xB2, 0xB2],
392+
\ [0xBC, 0xBC, 0xBC],
393+
\ [0xC6, 0xC6, 0xC6],
394+
\ [0xD0, 0xD0, 0xD0],
395+
\ [0xDA, 0xDA, 0xDA],
396+
\ [0xE4, 0xE4, 0xE4],
397+
\ [0xEE, 0xEE, 0xEE],
398+
\]
399+
400+
function! s:xterm(code) abort
401+
return s:_term(a:code, s:XTERM_PALETTE)
402+
endfunction
403+
404+
function! s:_term(code, palette) abort
405+
if !s:_check_terminal_code_range(a:code)
406+
throw printf('vital: Color: xterm(): invalid value: %s', string(a:code))
407+
endif
408+
let [r, g, b] = a:palette[a:code]
409+
return extend(deepcopy(s:RGB), {'_r': r, '_g': g, '_b': b})
410+
endfunction
411+
412+
function! s:_check_terminal_code_range(code) abort
413+
return type(a:code) ==# type(0) && 0 <=# a:code && a:code <=# 255
414+
endfunction
415+
138416

139417
" Numeric Conversion Functions
140418

test/Color.vim

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,29 @@ function! s:suite.hsl()
3131
call s:assert.equals(s:C.hsl(0, 0, 0).as_hsl_str(), 'hsl(0,0%,0%)')
3232
endfunction
3333

34+
function! s:suite.xterm()
35+
for [code, hex] in [
36+
\ [0, '#000000'],
37+
\ [1, '#800000'],
38+
\ [2, '#008000'],
39+
\ [3, '#808000'],
40+
\ [4, '#000080'],
41+
\ [5, '#800080'],
42+
\ [6, '#008080'],
43+
\ [7, '#C0C0C0'],
44+
\ [8, '#808080'],
45+
\ [9, '#FF0000'],
46+
\ [10, '#00FF00'],
47+
\ [11, '#FFFF00'],
48+
\ [12, '#0000FF'],
49+
\ [13, '#FF00FF'],
50+
\ [14, '#00FFFF'],
51+
\ [15, '#FFFFFF'],
52+
\]
53+
call s:assert.equals(s:C.xterm(code).as_rgb_hex(), hex)
54+
endfor
55+
endfunction
56+
3457
function! s:suite.eq() abort
3558
for [l, r] in [
3659
\ [s:C.parse('#abcdef'), s:C.parse('rgb('.0xAB.', '.0xCD.', '.0xEF.')')],

0 commit comments

Comments
 (0)