@@ -145,14 +145,19 @@ function! s:encode(val, ...) abort
145
145
let settings = extend ({
146
146
\ ' indent' : 0 ,
147
147
\ ' allow_nan' : 1 ,
148
+ \ ' from_encoding' : &encoding ,
148
149
\} , get (a: 000 , 0 , {})
149
150
\)
151
+ return s: _encode (a: val , settings)
152
+ endfunction
153
+
154
+ function ! s: _encode (val, settings) abort
150
155
let t = type (a: val )
151
156
if t == 0
152
157
return a: val
153
158
elseif t == 1
154
- let s = substitute (a: val , ' [\x01-\x1f\\"] ' , ' \=s:control_chars[submatch(0)] ' , ' g ' )
155
- let s = iconv (s , & encoding , ' utf-8 ' )
159
+ let s = iconv (a: val , a: settings .from_encoding , ' utf-8 ' )
160
+ let s = substitute (s , ' [\x01-\x1f\\"] ' , ' \=s:control_chars[submatch(0)] ' , ' g ' )
156
161
return ' "' . s . ' "'
157
162
elseif t == 2
158
163
if s: const .true == a: val
@@ -166,12 +171,12 @@ function! s:encode(val, ...) abort
166
171
return string (a: val )
167
172
endif
168
173
elseif t == 3
169
- return s: _encode_list (a: val , settings)
174
+ return s: _encode_list (a: val , a: settings )
170
175
elseif t == 4
171
- return s: _encode_dict (a: val , settings)
176
+ return s: _encode_dict (a: val , a: settings )
172
177
elseif t == 5
173
178
let val = string (a: val )
174
- if settings.allow_nan
179
+ if a: settings .allow_nan
175
180
let val = get (s: float_constants , val, val)
176
181
elseif has_key (s: float_constants , val)
177
182
throw ' vital: Web.JSON: Invalid float value: ' . val
@@ -189,7 +194,7 @@ function! s:_encode_list(val, settings) abort
189
194
if empty (a: val )
190
195
return ' []'
191
196
elseif ! a: settings .indent
192
- let encoded_candidates = map (copy (a: val ), ' s:encode (v:val, a:settings)' )
197
+ let encoded_candidates = map (copy (a: val ), ' s:_encode (v:val, a:settings)' )
193
198
return printf (' [%s]' , join (encoded_candidates, ' ,' ))
194
199
else
195
200
let previous_indent = get (a: settings , ' _previous_indent' )
@@ -199,7 +204,7 @@ function! s:_encode_list(val, settings) abort
199
204
\} )
200
205
let encoded_candidates = map (
201
206
\ copy (a: val ),
202
- \ printf (' ' ' %s'' . s:encode (v:val, ns)' , repeat (' ' , indent )),
207
+ \ printf (' ' ' %s'' . s:_encode (v:val, ns)' , repeat (' ' , indent )),
203
208
\)
204
209
return printf (
205
210
\ " [\n %s\n %s]" ,
@@ -216,7 +221,7 @@ function! s:_encode_dict(val, settings) abort
216
221
return ' {}'
217
222
elseif ! a: settings .indent
218
223
let encoded_candidates = map (keys (a: val ),
219
- \ ' s:encode (v:val, a:settings) . '' :'' . s:encode (a:val[v:val], a:settings)'
224
+ \ ' s:_encode (v:val, a:settings) . '' :'' . s:_encode (a:val[v:val], a:settings)'
220
225
\)
221
226
return printf (' {%s}' , join (encoded_candidates, ' ,' ))
222
227
else
@@ -227,7 +232,7 @@ function! s:_encode_dict(val, settings) abort
227
232
\} )
228
233
let encoded_candidates = map (keys (a: val ),
229
234
\ printf (
230
- \ ' ' ' %s'' . s:encode (v:val, ns) . '' : '' . s:encode (a:val[v:val], ns)' ,
235
+ \ ' ' ' %s'' . s:_encode (v:val, ns) . '' : '' . s:_encode (a:val[v:val], ns)' ,
231
236
\ repeat (' ' , indent ),
232
237
\ ),
233
238
\)
0 commit comments