Skip to content

Commit 30da766

Browse files
committed
Color: support % in rgb(...)
1 parent a339f7c commit 30da766

File tree

3 files changed

+25
-5
lines changed

3 files changed

+25
-5
lines changed

autoload/vital/__vital__/Color.vim

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ endfunction
5858
" Constructors
5959

6060
let s:RGB_HEX_RE = '\v^#(\x{3}(\x{3})?)$'
61-
let s:RGB_RE = '\v^rgb\((\d+),\s*(\d+),\s*(\d+)\)$'
61+
let s:RGB_RE = '\v^rgb\((\d+\%?),\s*(\d+\%?),\s*(\d+\%?)\)$'
6262
let s:HSL_RE = '\v^hsl\((\d+),\s*(\d+)\%,\s*(\d+)\%\)$'
6363
let s:VIM_RGB_FILE = expand('$VIMRUNTIME/rgb.txt')
6464
function! s:parse(str) abort
@@ -76,9 +76,10 @@ function! s:parse(str) abort
7676
return s:rgb(r, g, b)
7777
endif
7878
" e.g. rgb(255,255,255)
79+
" e.g. rgb(100%,100%,100%)
7980
let m = matchlist(a:str, s:RGB_RE)
8081
if !empty(m)
81-
let [r, g, b] = [str2float(m[1]), str2float(m[2]), str2float(m[3])]
82+
let [r, g, b] = map(m[1:3], 's:_per2float(v:val, 255.0)')
8283
return s:rgb(r, g, b)
8384
endif
8485
" e.g. hsl(0,0%,100%)
@@ -99,6 +100,10 @@ function! s:parse(str) abort
99100
throw 'vital: Color: parse(): invalid format: ' . a:str
100101
endfunction
101102

103+
function! s:_per2float(per, n) abort
104+
return a:per =~# '%$' ? str2float(a:per[:-2]) * a:n / 100.0 : str2float(a:per)
105+
endfunction
106+
102107
let s:RGB_FILE_RE = '\v^\s*(\d+)\s+(\d+)\s+(\d+)\s+(.+)$'
103108
function! s:_parse_rgb_file(file) abort
104109
let color_map = {}

doc/vital/Color.txt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ parse({str}) *Vital.Color.parse()*
2828
* e.g. `#FFF`
2929
* e.g. `#000000`
3030
* CSS RGB format
31-
* e.g. `rgb(100,100,100)`
31+
* e.g. `rgb(255,255,255)`
32+
* e.g. `rgb(100%,0%,0%)`
3233
* CSS HSL format
3334
* e.g. `hsl(0,50%,100%)`
3435
* `%` is mandatory
@@ -38,6 +39,7 @@ parse({str}) *Vital.Color.parse()*
3839
let c1 = s:Color.parse('#012')
3940
let c2 = s:Color.parse('#c0ffee')
4041
let c3 = s:Color.parse('rgb(100,100,100)')
42+
let c3 = s:Color.parse('rgb(0%,100%,100%)')
4143
let c4 = s:Color.parse('hsl(0,50%,100%)')
4244
let c5 = s:Color.parse('ForestGreen')
4345
<

test/Color.vim

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ function! s:suite.rgb()
1414
call s:assert.equals(s:C.parse('#012').as_rgb_str(), 'rgb('.0x00.','.0x11.','.0x22.')')
1515
call s:assert.equals(s:C.parse('rgb(123, 56, 78)').as_rgb_hex(), '#7B384E')
1616
call s:assert.equals(s:C.parse('rgb(123, 56, 78)').as_rgb_str(), 'rgb('.0x7B.','.0x38.','.0x4E.')')
17+
call s:assert.equals(s:C.parse('rgb(100%, 0%, 0%)').as_rgb_hex(), '#FF0000')
18+
call s:assert.equals(s:C.parse('rgb(100%, 0%, 0%)').as_rgb_str(), 'rgb('.0xFF.','.0x00.','.0x00.')')
1719
call s:assert.equals(s:C.rgb(255, 255, 255).as_rgb_hex(), '#FFFFFF')
1820
call s:assert.equals(s:C.rgb(255, 255, 255).as_rgb_str(), 'rgb('.0xFF.','.0xFF.','.0xFF.')')
1921
call s:assert.equals(s:C.rgb(255, 0, 0).as_rgb_hex(), '#FF0000')
@@ -113,15 +115,26 @@ function! s:suite.error_parse()
113115
\ 'deadbee',
114116
\ 'deadbeef',
115117
\ '0xc0ffee',
116-
\ 'rgb(0,0%,0%)',
118+
\ 'rgb(-1%,0%,0%)',
119+
\ 'rgb(-2%,0%,0%)',
120+
\ 'rgb(0%,-1%,0%)',
121+
\ 'rgb(0%,-2%,0%)',
122+
\ 'rgb(0%,0%,-1%)',
123+
\ 'rgb(0%,0%,-2%)',
124+
\ 'rgb(101%,0%,0%)',
125+
\ 'rgb(102%,0%,0%)',
126+
\ 'rgb(0%,101%,0%)',
127+
\ 'rgb(0%,102%,0%)',
128+
\ 'rgb(0%,0%,101%)',
129+
\ 'rgb(0%,0%,102%)',
117130
\ 'hsl(0,0,0)',
118131
\ 'rgb(0,0,0);',
119132
\ 'hsl(0,0%,0%);',
120133
\ 'unknown_color_name',
121134
\]
122135
try
123136
call s:C.parse(l:V)
124-
catch /vital: Color: parse():/
137+
catch /vital: Color:/
125138
call s:assert.true(1, string(l:V) . ' should not be parsed')
126139
endtry
127140
endfor

0 commit comments

Comments
 (0)