Skip to content

Commit f7c497c

Browse files
committed
Text.TOML: support underscores in numbers
1 parent e9a4a42 commit f7c497c

File tree

2 files changed

+49
-45
lines changed

2 files changed

+49
-45
lines changed

autoload/vital/__vital__/Text/TOML.vim

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ function! s:_value(input) abort
143143
return s:_boolean(a:input)
144144
elseif s:_match(a:input, '\d\{4}-')
145145
return s:_datetime(a:input)
146-
elseif s:_match(a:input, '[+-]\?\%(\d\+\.\d\|\d\+\%(\.\d\+\)\?[eE]\)')
146+
elseif s:_match(a:input, '[+-]\?\d\+\%(_\d\+\)*\%(\.\d\+\%(_\d\+\)*\|\%(\.\d\+\%(_\d\+\)*\)\?[eE]\)')
147147
return s:_float(a:input)
148148
else
149149
return s:_integer(a:input)
@@ -183,28 +183,17 @@ endfunction
183183
" Integer
184184
"
185185
function! s:_integer(input) abort
186-
let s = s:_consume(a:input, '[+-]\?\d\+')
186+
let s = s:_consume(a:input, '[+-]\?\d\+\%(_\d\+\)*')
187+
let s = substitute(s, '_', '', 'g')
187188
return str2nr(s)
188189
endfunction
189190

190191
"
191192
" Float
192193
"
193194
function! s:_float(input) abort
194-
if s:_match(a:input, '[+-]\?[0-9.]\+[eE][+-]\?\d\+')
195-
return s:_exponent(a:input)
196-
else
197-
return s:_fractional(a:input)
198-
endif
199-
endfunction
200-
201-
function! s:_fractional(input) abort
202-
let s = s:_consume(a:input, '[+-]\?[0-9.]\+')
203-
return str2float(s)
204-
endfunction
205-
206-
function! s:_exponent(input) abort
207-
let s = s:_consume(a:input, '[+-]\?[0-9.]\+[eE][+-]\?\d\+')
195+
let s = s:_consume(a:input, '[+-]\?[0-9._]\+\%([eE][+-]\?\d\+\%(_\d\+\)*\)\?')
196+
let s = substitute(s, '_', '', 'g')
208197
return str2float(s)
209198
endfunction
210199

test/Text/TOML.vim

Lines changed: 44 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -157,62 +157,77 @@ function! s:suite.__parse__()
157157

158158
function! parse.integer()
159159
let data = s:TOML.parse(join([
160-
\ 'one=+99',
161-
\ 'two=42',
162-
\ 'three=0',
163-
\ 'four=-17',
160+
\ 'int1 = +99',
161+
\ 'int2 = 42',
162+
\ 'int3 = 0',
163+
\ 'int4 = -17',
164+
\ 'int5 = 1_000',
165+
\ 'int6 = 5_349_221',
166+
\ 'int7 = 1_2_3_4_5',
164167
\], "\n"))
165168

166-
call s:assert.equals(data.one, 99)
167-
call s:assert.equals(data.two, 42)
168-
call s:assert.equals(data.three, 0)
169-
call s:assert.equals(data.four, -17)
169+
call s:assert.equals(data.int1, 99)
170+
call s:assert.equals(data.int2, 42)
171+
call s:assert.equals(data.int3, 0)
172+
call s:assert.equals(data.int4, -17)
173+
call s:assert.equals(data.int5, 1000)
174+
call s:assert.equals(data.int6, 5349221)
175+
call s:assert.equals(data.int7, 12345)
170176
endfunction
171177

172178
function! parse.__float__()
173179
let float = themis#suite('float')
174180

175181
function! float.fractional()
176182
let data = s:TOML.parse(join([
177-
\ 'one=+1.0',
178-
\ 'two=3.1415',
179-
\ 'three=-0.01',
183+
\ 'flt1 = +1.0',
184+
\ 'flt2 = 3.1415',
185+
\ 'flt3 = -0.01',
180186
\], "\n"))
181187

182-
call s:assert.is_float(data.one)
183-
call s:assert.equals(data.one, 1.0)
188+
call s:assert.is_float(data.flt1)
189+
call s:assert.equals(data.flt1, 1.0)
184190

185-
call s:assert.is_float(data.two)
186-
call s:assert.equals(data.two, 3.1415)
191+
call s:assert.is_float(data.flt2)
192+
call s:assert.equals(data.flt2, 3.1415)
187193

188-
call s:assert.is_float(data.three)
189-
call s:assert.equals(data.three, -0.01)
194+
call s:assert.is_float(data.flt3)
195+
call s:assert.equals(data.flt3, -0.01)
190196
endfunction
191197

192198
function! float.exponent()
193199
let data = s:TOML.parse(join([
194-
\ 'one=5e+22',
195-
\ 'two=1e6',
196-
\ 'three=-2E-2',
200+
\ 'flt4 = 5e+22',
201+
\ 'flt5 = 1e6',
202+
\ 'flt6 = -2E-2',
197203
\], "\n"))
198204

199-
call s:assert.is_float(data.one)
200-
call s:assert.equals(data.one, 5.0e22)
205+
call s:assert.is_float(data.flt4)
206+
call s:assert.equals(data.flt4, 5.0e22)
201207

202-
call s:assert.is_float(data.two)
203-
call s:assert.equals(data.two, 1.0e6)
208+
call s:assert.is_float(data.flt5)
209+
call s:assert.equals(data.flt5, 1.0e6)
204210

205-
call s:assert.is_float(data.three)
206-
call s:assert.equals(data.three, -2.0e-2)
211+
call s:assert.is_float(data.flt6)
212+
call s:assert.equals(data.flt6, -2.0e-2)
207213
endfunction
208214

209215
function! float.both()
210216
let data = s:TOML.parse(join([
211-
\ 'one=6.626e-34',
217+
\ 'flt7 = 6.626e-34',
212218
\], "\n"))
213219

214-
call s:assert.is_float(data.one)
215-
call s:assert.equals(data.one, 6.626e-34)
220+
call s:assert.is_float(data.flt7)
221+
call s:assert.equals(data.flt7, 6.626e-34)
222+
endfunction
223+
224+
function! float.underscores()
225+
let data = s:TOML.parse(join([
226+
\ 'flt8 = 224_617.445_991_228',
227+
\], "\n"))
228+
229+
call s:assert.is_float(data.flt8)
230+
call s:assert.equals(data.flt8, 224617.445991228)
216231
endfunction
217232
endfunction
218233

0 commit comments

Comments
 (0)