OLD | NEW |
| (Empty) |
1 var convert; | |
2 (function(exports) { | |
3 'use strict'; | |
4 let ASCII = new AsciiCodec(); | |
5 let _ASCII_MASK = 127; | |
6 let _allowInvalid = Symbol('_allowInvalid'); | |
7 let Codec$ = dart.generic(function(S, T) { | |
8 class Codec extends core.Object { | |
9 Codec() { | |
10 } | |
11 encode(input) { | |
12 return this.encoder.convert(input); | |
13 } | |
14 decode(encoded) { | |
15 return this.decoder.convert(encoded); | |
16 } | |
17 fuse(other) { | |
18 return new _FusedCodec(this, other); | |
19 } | |
20 get inverted() { | |
21 return new _InvertedCodec(this); | |
22 } | |
23 } | |
24 return Codec; | |
25 }); | |
26 let Codec = Codec$(dart.dynamic, dart.dynamic); | |
27 class Encoding extends Codec$(core.String, core.List$(core.int)) { | |
28 Encoding() { | |
29 super.Codec(); | |
30 } | |
31 decodeStream(byteStream) { | |
32 return dart.as(byteStream.transform(dart.as(this.decoder, async.StreamTran
sformer$(core.List$(core.int), dynamic))).fold(new core.StringBuffer(), (buffer,
string) => dart.dinvoke(buffer, 'write', string), buffer).then((buffer) => dart
.dinvoke(buffer, 'toString')), async.Future$(core.String)); | |
33 } | |
34 static getByName(name) { | |
35 if (name === null) | |
36 return null; | |
37 name = name.toLowerCase(); | |
38 return _nameToEncoding.get(name); | |
39 } | |
40 } | |
41 dart.defineLazyProperties(Encoding, { | |
42 get _nameToEncoding() { | |
43 return dart.map({"iso_8859-1:1987": LATIN1, "iso-ir-100": LATIN1, "iso_885
9-1": LATIN1, "iso-8859-1": LATIN1, latin1: LATIN1, l1: LATIN1, ibm819: LATIN1,
cp819: LATIN1, csisolatin1: LATIN1, "iso-ir-6": ASCII, "ansi_x3.4-1968": ASCII,
"ansi_x3.4-1986": ASCII, "iso_646.irv:1991": ASCII, "iso646-us": ASCII, "us-asci
i": ASCII, us: ASCII, ibm367: ASCII, cp367: ASCII, csascii: ASCII, ascii: ASCII,
csutf8: UTF8, "utf-8": UTF8}); | |
44 }, | |
45 set _nameToEncoding(_) {} | |
46 }); | |
47 class AsciiCodec extends Encoding { | |
48 AsciiCodec(opt$) { | |
49 let allowInvalid = opt$.allowInvalid === void 0 ? false : opt$.allowInvali
d; | |
50 this[_allowInvalid] = allowInvalid; | |
51 super.Encoding(); | |
52 } | |
53 get name() { | |
54 return "us-ascii"; | |
55 } | |
56 decode(bytes, opt$) { | |
57 let allowInvalid = opt$.allowInvalid === void 0 ? null : opt$.allowInvalid
; | |
58 if (allowInvalid === null) | |
59 allowInvalid = this[_allowInvalid]; | |
60 if (allowInvalid) { | |
61 return new AsciiDecoder({allowInvalid: true}).convert(bytes); | |
62 } else { | |
63 return new AsciiDecoder({allowInvalid: false}).convert(bytes); | |
64 } | |
65 } | |
66 get encoder() { | |
67 return new AsciiEncoder(); | |
68 } | |
69 get decoder() { | |
70 return this[_allowInvalid] ? new AsciiDecoder({allowInvalid: true}) : new
AsciiDecoder({allowInvalid: false}); | |
71 } | |
72 } | |
73 let _subsetMask = Symbol('_subsetMask'); | |
74 let Converter$ = dart.generic(function(S, T) { | |
75 class Converter extends core.Object { | |
76 Converter() { | |
77 } | |
78 fuse(other) { | |
79 return new _FusedConverter(this, other); | |
80 } | |
81 startChunkedConversion(sink) { | |
82 throw new core.UnsupportedError(`This converter does not support chunked
conversions: ${this}`); | |
83 } | |
84 bind(source) { | |
85 return new async.Stream.eventTransformed(source, ((sink) => new _Convert
erStreamEventSink(this, sink)).bind(this)); | |
86 } | |
87 } | |
88 return Converter; | |
89 }); | |
90 let Converter = Converter$(dart.dynamic, dart.dynamic); | |
91 class _UnicodeSubsetEncoder extends Converter$(core.String, core.List$(core.in
t)) { | |
92 _UnicodeSubsetEncoder($_subsetMask) { | |
93 this[_subsetMask] = $_subsetMask; | |
94 super.Converter(); | |
95 } | |
96 convert(string, start, end) { | |
97 if (start === void 0) | |
98 start = 0; | |
99 if (end === void 0) | |
100 end = null; | |
101 let stringLength = string.length; | |
102 core.RangeError.checkValidRange(start, end, stringLength); | |
103 if (end === null) | |
104 end = stringLength; | |
105 let length = dart.notNull(end) - dart.notNull(start); | |
106 let result = new typed_data.Uint8List(length); | |
107 for (let i = 0; dart.notNull(i) < dart.notNull(length); i = dart.notNull(i
) + 1) { | |
108 let codeUnit = string.codeUnitAt(dart.notNull(start) + dart.notNull(i)); | |
109 if ((dart.notNull(codeUnit) & ~dart.notNull(this[_subsetMask])) !== 0) { | |
110 throw new core.ArgumentError("String contains invalid characters."); | |
111 } | |
112 result.set(i, codeUnit); | |
113 } | |
114 return dart.as(result, core.List$(core.int)); | |
115 } | |
116 startChunkedConversion(sink) { | |
117 if (!dart.is(sink, ByteConversionSink)) { | |
118 sink = new ByteConversionSink.from(sink); | |
119 } | |
120 return new _UnicodeSubsetEncoderSink(this[_subsetMask], dart.as(sink, Byte
ConversionSink)); | |
121 } | |
122 bind(stream) { | |
123 return dart.as(super.bind(stream), async.Stream$(core.List$(core.int))); | |
124 } | |
125 } | |
126 class AsciiEncoder extends _UnicodeSubsetEncoder { | |
127 AsciiEncoder() { | |
128 super._UnicodeSubsetEncoder(_ASCII_MASK); | |
129 } | |
130 } | |
131 let _sink = Symbol('_sink'); | |
132 class StringConversionSinkMixin extends core.Object { | |
133 add(str) { | |
134 return this.addSlice(str, 0, str.length, false); | |
135 } | |
136 asUtf8Sink(allowMalformed) { | |
137 return new _Utf8ConversionSink(this, allowMalformed); | |
138 } | |
139 asStringSink() { | |
140 return new _StringConversionSinkAsStringSinkAdapter(this); | |
141 } | |
142 } | |
143 class StringConversionSinkBase extends StringConversionSinkMixin { | |
144 } | |
145 class _UnicodeSubsetEncoderSink extends StringConversionSinkBase { | |
146 _UnicodeSubsetEncoderSink($_subsetMask, $_sink) { | |
147 this[_subsetMask] = $_subsetMask; | |
148 this[_sink] = $_sink; | |
149 super.StringConversionSinkBase(); | |
150 } | |
151 close() { | |
152 this[_sink].close(); | |
153 } | |
154 addSlice(source, start, end, isLast) { | |
155 core.RangeError.checkValidRange(start, end, source.length); | |
156 for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(
i) + 1) { | |
157 let codeUnit = source.codeUnitAt(i); | |
158 if ((dart.notNull(codeUnit) & ~dart.notNull(this[_subsetMask])) !== 0) { | |
159 throw new core.ArgumentError(`Source contains invalid character with c
ode point: ${codeUnit}.`); | |
160 } | |
161 } | |
162 this[_sink].add(source.codeUnits.sublist(start, end)); | |
163 if (isLast) { | |
164 this.close(); | |
165 } | |
166 } | |
167 } | |
168 let _convertInvalid = Symbol('_convertInvalid'); | |
169 class _UnicodeSubsetDecoder extends Converter$(core.List$(core.int), core.Stri
ng) { | |
170 _UnicodeSubsetDecoder($_allowInvalid, $_subsetMask) { | |
171 this[_allowInvalid] = $_allowInvalid; | |
172 this[_subsetMask] = $_subsetMask; | |
173 super.Converter(); | |
174 } | |
175 convert(bytes, start, end) { | |
176 if (start === void 0) | |
177 start = 0; | |
178 if (end === void 0) | |
179 end = null; | |
180 let byteCount = bytes.length; | |
181 core.RangeError.checkValidRange(start, end, byteCount); | |
182 if (end === null) | |
183 end = byteCount; | |
184 let length = dart.notNull(end) - dart.notNull(start); | |
185 for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(
i) + 1) { | |
186 let byte = bytes.get(i); | |
187 if ((dart.notNull(byte) & ~dart.notNull(this[_subsetMask])) !== 0) { | |
188 if (!dart.notNull(this[_allowInvalid])) { | |
189 throw new core.FormatException(`Invalid value in input: ${byte}`); | |
190 } | |
191 return this[_convertInvalid](bytes, start, end); | |
192 } | |
193 } | |
194 return new core.String.fromCharCodes(bytes, start, end); | |
195 } | |
196 [_convertInvalid](bytes, start, end) { | |
197 let buffer = new core.StringBuffer(); | |
198 for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(
i) + 1) { | |
199 let value = bytes.get(i); | |
200 if ((dart.notNull(value) & ~dart.notNull(this[_subsetMask])) !== 0) | |
201 value = 65533; | |
202 buffer.writeCharCode(value); | |
203 } | |
204 return buffer.toString(); | |
205 } | |
206 bind(stream) { | |
207 return dart.as(super.bind(stream), async.Stream$(core.String)); | |
208 } | |
209 } | |
210 class AsciiDecoder extends _UnicodeSubsetDecoder { | |
211 AsciiDecoder(opt$) { | |
212 let allowInvalid = opt$.allowInvalid === void 0 ? false : opt$.allowInvali
d; | |
213 super._UnicodeSubsetDecoder(allowInvalid, _ASCII_MASK); | |
214 } | |
215 startChunkedConversion(sink) { | |
216 let stringSink = null; | |
217 if (dart.is(sink, StringConversionSink)) { | |
218 stringSink = sink; | |
219 } else { | |
220 stringSink = new StringConversionSink.from(sink); | |
221 } | |
222 if (this[_allowInvalid]) { | |
223 return new _ErrorHandlingAsciiDecoderSink(stringSink.asUtf8Sink(false)); | |
224 } else { | |
225 return new _SimpleAsciiDecoderSink(stringSink); | |
226 } | |
227 } | |
228 } | |
229 let _utf8Sink = Symbol('_utf8Sink'); | |
230 let ChunkedConversionSink$ = dart.generic(function(T) { | |
231 class ChunkedConversionSink extends core.Object { | |
232 ChunkedConversionSink() { | |
233 } | |
234 ChunkedConversionSink$withCallback(callback) { | |
235 return new _SimpleCallbackSink(callback); | |
236 } | |
237 } | |
238 dart.defineNamedConstructor(ChunkedConversionSink, 'withCallback'); | |
239 return ChunkedConversionSink; | |
240 }); | |
241 let ChunkedConversionSink = ChunkedConversionSink$(dart.dynamic); | |
242 class ByteConversionSink extends ChunkedConversionSink$(core.List$(core.int))
{ | |
243 ByteConversionSink() { | |
244 super.ChunkedConversionSink(); | |
245 } | |
246 ByteConversionSink$withCallback(callback) { | |
247 return new _ByteCallbackSink(callback); | |
248 } | |
249 ByteConversionSink$from(sink) { | |
250 return new _ByteAdapterSink(sink); | |
251 } | |
252 } | |
253 dart.defineNamedConstructor(ByteConversionSink, 'withCallback'); | |
254 dart.defineNamedConstructor(ByteConversionSink, 'from'); | |
255 class ByteConversionSinkBase extends ByteConversionSink { | |
256 addSlice(chunk, start, end, isLast) { | |
257 this.add(chunk.sublist(start, end)); | |
258 if (isLast) | |
259 this.close(); | |
260 } | |
261 } | |
262 class _ErrorHandlingAsciiDecoderSink extends ByteConversionSinkBase { | |
263 _ErrorHandlingAsciiDecoderSink($_utf8Sink) { | |
264 this[_utf8Sink] = $_utf8Sink; | |
265 super.ByteConversionSinkBase(); | |
266 } | |
267 close() { | |
268 this[_utf8Sink].close(); | |
269 } | |
270 add(source) { | |
271 this.addSlice(source, 0, source.length, false); | |
272 } | |
273 addSlice(source, start, end, isLast) { | |
274 core.RangeError.checkValidRange(start, end, source.length); | |
275 for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(
i) + 1) { | |
276 if ((dart.notNull(source.get(i)) & ~dart.notNull(_ASCII_MASK)) !== 0) { | |
277 if (dart.notNull(i) > dart.notNull(start)) | |
278 this[_utf8Sink].addSlice(source, start, i, false); | |
279 this[_utf8Sink].add(/* Unimplemented const */new List.from([239, 191,
189])); | |
280 start = dart.notNull(i) + 1; | |
281 } | |
282 } | |
283 if (dart.notNull(start) < dart.notNull(end)) { | |
284 this[_utf8Sink].addSlice(source, start, end, isLast); | |
285 } else if (isLast) { | |
286 this.close(); | |
287 } | |
288 } | |
289 } | |
290 class _SimpleAsciiDecoderSink extends ByteConversionSinkBase { | |
291 _SimpleAsciiDecoderSink($_sink) { | |
292 this[_sink] = $_sink; | |
293 super.ByteConversionSinkBase(); | |
294 } | |
295 close() { | |
296 this[_sink].close(); | |
297 } | |
298 add(source) { | |
299 for (let i = 0; dart.notNull(i) < dart.notNull(source.length); i = dart.no
tNull(i) + 1) { | |
300 if ((dart.notNull(source.get(i)) & ~dart.notNull(_ASCII_MASK)) !== 0) { | |
301 throw new core.FormatException("Source contains non-ASCII bytes."); | |
302 } | |
303 } | |
304 this[_sink].add(new core.String.fromCharCodes(source)); | |
305 } | |
306 addSlice(source, start, end, isLast) { | |
307 let length = source.length; | |
308 core.RangeError.checkValidRange(start, end, length); | |
309 if (dart.notNull(start) < dart.notNull(end)) { | |
310 if (start !== 0 || end !== length) { | |
311 source = source.sublist(start, end); | |
312 } | |
313 this.add(source); | |
314 } | |
315 if (isLast) | |
316 this.close(); | |
317 } | |
318 } | |
319 class _ByteAdapterSink extends ByteConversionSinkBase { | |
320 _ByteAdapterSink($_sink) { | |
321 this[_sink] = $_sink; | |
322 super.ByteConversionSinkBase(); | |
323 } | |
324 add(chunk) { | |
325 return this[_sink].add(chunk); | |
326 } | |
327 close() { | |
328 return this[_sink].close(); | |
329 } | |
330 } | |
331 let _buffer = Symbol('_buffer'); | |
332 let _callback = Symbol('_callback'); | |
333 let _bufferIndex = Symbol('_bufferIndex'); | |
334 let _roundToPowerOf2 = Symbol('_roundToPowerOf2'); | |
335 class _ByteCallbackSink extends ByteConversionSinkBase { | |
336 _ByteCallbackSink(callback) { | |
337 this[_buffer] = new typed_data.Uint8List(_ByteCallbackSink._INITIAL_BUFFER
_SIZE); | |
338 this[_callback] = callback; | |
339 this[_bufferIndex] = 0; | |
340 super.ByteConversionSinkBase(); | |
341 } | |
342 add(chunk) { | |
343 let freeCount = dart.notNull(this[_buffer].length) - dart.notNull(this[_bu
fferIndex]); | |
344 if (dart.notNull(chunk.length) > dart.notNull(freeCount)) { | |
345 let oldLength = this[_buffer].length; | |
346 let newLength = dart.notNull(_roundToPowerOf2(dart.notNull(chunk.length)
+ dart.notNull(oldLength))) * 2; | |
347 let grown = new typed_data.Uint8List(newLength); | |
348 grown.setRange(0, this[_buffer].length, this[_buffer]); | |
349 this[_buffer] = grown; | |
350 } | |
351 this[_buffer].setRange(this[_bufferIndex], dart.notNull(this[_bufferIndex]
) + dart.notNull(chunk.length), chunk); | |
352 this[_bufferIndex] = chunk.length; | |
353 } | |
354 static [_roundToPowerOf2](v) { | |
355 dart.assert(dart.notNull(v) > 0); | |
356 v = dart.notNull(v) - 1; | |
357 v = dart.notNull(v) >> 1; | |
358 v = dart.notNull(v) >> 2; | |
359 v = dart.notNull(v) >> 4; | |
360 v = dart.notNull(v) >> 8; | |
361 v = dart.notNull(v) >> 16; | |
362 v = dart.notNull(v) + 1; | |
363 return v; | |
364 } | |
365 close() { | |
366 this[_callback](this[_buffer].sublist(0, this[_bufferIndex])); | |
367 } | |
368 } | |
369 _ByteCallbackSink._INITIAL_BUFFER_SIZE = 1024; | |
370 let _accumulated = Symbol('_accumulated'); | |
371 let _SimpleCallbackSink$ = dart.generic(function(T) { | |
372 class _SimpleCallbackSink extends ChunkedConversionSink$(T) { | |
373 _SimpleCallbackSink($_callback) { | |
374 this[_accumulated] = new List.from([]); | |
375 this[_callback] = $_callback; | |
376 super.ChunkedConversionSink(); | |
377 } | |
378 add(chunk) { | |
379 this[_accumulated].add(chunk); | |
380 } | |
381 close() { | |
382 this[_callback](this[_accumulated]); | |
383 } | |
384 } | |
385 return _SimpleCallbackSink; | |
386 }); | |
387 let _SimpleCallbackSink = _SimpleCallbackSink$(dart.dynamic); | |
388 let _EventSinkAdapter$ = dart.generic(function(T) { | |
389 class _EventSinkAdapter extends core.Object { | |
390 _EventSinkAdapter($_sink) { | |
391 this[_sink] = $_sink; | |
392 } | |
393 add(data) { | |
394 return this[_sink].add(data); | |
395 } | |
396 close() { | |
397 return this[_sink].close(); | |
398 } | |
399 } | |
400 return _EventSinkAdapter; | |
401 }); | |
402 let _EventSinkAdapter = _EventSinkAdapter$(dart.dynamic); | |
403 let _eventSink = Symbol('_eventSink'); | |
404 let _chunkedSink = Symbol('_chunkedSink'); | |
405 let _ConverterStreamEventSink$ = dart.generic(function(S, T) { | |
406 class _ConverterStreamEventSink extends core.Object { | |
407 _ConverterStreamEventSink(converter, sink) { | |
408 this[_eventSink] = sink; | |
409 this[_chunkedSink] = converter.startChunkedConversion(sink); | |
410 } | |
411 add(o) { | |
412 return this[_chunkedSink].add(o); | |
413 } | |
414 addError(error, stackTrace) { | |
415 if (stackTrace === void 0) | |
416 stackTrace = null; | |
417 this[_eventSink].addError(error, stackTrace); | |
418 } | |
419 close() { | |
420 return this[_chunkedSink].close(); | |
421 } | |
422 } | |
423 return _ConverterStreamEventSink; | |
424 }); | |
425 let _ConverterStreamEventSink = _ConverterStreamEventSink$(dart.dynamic, dart.
dynamic); | |
426 let _first = Symbol('_first'); | |
427 let _second = Symbol('_second'); | |
428 let _FusedCodec$ = dart.generic(function(S, M, T) { | |
429 class _FusedCodec extends Codec$(S, T) { | |
430 get encoder() { | |
431 return dart.as(this[_first].encoder.fuse(this[_second].encoder), Convert
er$(S, T)); | |
432 } | |
433 get decoder() { | |
434 return dart.as(this[_second].decoder.fuse(this[_first].decoder), Convert
er$(T, S)); | |
435 } | |
436 _FusedCodec($_first, $_second) { | |
437 this[_first] = $_first; | |
438 this[_second] = $_second; | |
439 super.Codec(); | |
440 } | |
441 } | |
442 return _FusedCodec; | |
443 }); | |
444 let _FusedCodec = _FusedCodec$(dart.dynamic, dart.dynamic, dart.dynamic); | |
445 let _codec = Symbol('_codec'); | |
446 let _InvertedCodec$ = dart.generic(function(T, S) { | |
447 class _InvertedCodec extends Codec$(T, S) { | |
448 _InvertedCodec(codec) { | |
449 this[_codec] = codec; | |
450 super.Codec(); | |
451 } | |
452 get encoder() { | |
453 return this[_codec].decoder; | |
454 } | |
455 get decoder() { | |
456 return this[_codec].encoder; | |
457 } | |
458 get inverted() { | |
459 return this[_codec]; | |
460 } | |
461 } | |
462 return _InvertedCodec; | |
463 }); | |
464 let _InvertedCodec = _InvertedCodec$(dart.dynamic, dart.dynamic); | |
465 let _FusedConverter$ = dart.generic(function(S, M, T) { | |
466 class _FusedConverter extends Converter$(S, T) { | |
467 _FusedConverter($_first, $_second) { | |
468 this[_first] = $_first; | |
469 this[_second] = $_second; | |
470 super.Converter(); | |
471 } | |
472 convert(input) { | |
473 return dart.as(this[_second].convert(this[_first].convert(input)), T); | |
474 } | |
475 startChunkedConversion(sink) { | |
476 return this[_first].startChunkedConversion(this[_second].startChunkedCon
version(sink)); | |
477 } | |
478 } | |
479 return _FusedConverter; | |
480 }); | |
481 let _FusedConverter = _FusedConverter$(dart.dynamic, dart.dynamic, dart.dynami
c); | |
482 let HTML_ESCAPE = new HtmlEscape(); | |
483 let _name = Symbol('_name'); | |
484 class HtmlEscapeMode extends core.Object { | |
485 HtmlEscapeMode$_($_name, escapeLtGt, escapeQuot, escapeApos, escapeSlash) { | |
486 this[_name] = $_name; | |
487 this.escapeLtGt = escapeLtGt; | |
488 this.escapeQuot = escapeQuot; | |
489 this.escapeApos = escapeApos; | |
490 this.escapeSlash = escapeSlash; | |
491 } | |
492 toString() { | |
493 return this[_name]; | |
494 } | |
495 } | |
496 dart.defineNamedConstructor(HtmlEscapeMode, '_'); | |
497 HtmlEscapeMode.UNKNOWN = new HtmlEscapeMode._('unknown', true, true, true, tru
e); | |
498 HtmlEscapeMode.ATTRIBUTE = new HtmlEscapeMode._('attribute', false, true, fals
e, false); | |
499 HtmlEscapeMode.ELEMENT = new HtmlEscapeMode._('element', true, false, false, t
rue); | |
500 let _convert = Symbol('_convert'); | |
501 class HtmlEscape extends Converter$(core.String, core.String) { | |
502 HtmlEscape(mode) { | |
503 if (mode === void 0) | |
504 mode = HtmlEscapeMode.UNKNOWN; | |
505 this.mode = mode; | |
506 super.Converter(); | |
507 } | |
508 convert(text) { | |
509 let val = this[_convert](text, 0, text.length); | |
510 return val === null ? text : val; | |
511 } | |
512 [_convert](text, start, end) { | |
513 let result = null; | |
514 for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(
i) + 1) { | |
515 let ch = text.get(i); | |
516 let replace = null; | |
517 switch (ch) { | |
518 case '&': | |
519 replace = '&'; | |
520 break; | |
521 case ' ': | |
522 replace = ' '; | |
523 break; | |
524 case '"': | |
525 if (this.mode.escapeQuot) | |
526 replace = '"'; | |
527 break; | |
528 case "'": | |
529 if (this.mode.escapeApos) | |
530 replace = '''; | |
531 break; | |
532 case '<': | |
533 if (this.mode.escapeLtGt) | |
534 replace = '<'; | |
535 break; | |
536 case '>': | |
537 if (this.mode.escapeLtGt) | |
538 replace = '>'; | |
539 break; | |
540 case '/': | |
541 if (this.mode.escapeSlash) | |
542 replace = '/'; | |
543 break; | |
544 } | |
545 if (replace !== null) { | |
546 if (result === null) | |
547 result = new core.StringBuffer(text.substring(start, i)); | |
548 result.write(replace); | |
549 } else if (result !== null) { | |
550 result.write(ch); | |
551 } | |
552 } | |
553 return result !== null ? result.toString() : null; | |
554 } | |
555 startChunkedConversion(sink) { | |
556 if (!dart.is(sink, StringConversionSink)) { | |
557 sink = new StringConversionSink.from(sink); | |
558 } | |
559 return new _HtmlEscapeSink(this, dart.as(sink, StringConversionSink)); | |
560 } | |
561 } | |
562 let _escape = Symbol('_escape'); | |
563 class _HtmlEscapeSink extends StringConversionSinkBase { | |
564 _HtmlEscapeSink($_escape, $_sink) { | |
565 this[_escape] = $_escape; | |
566 this[_sink] = $_sink; | |
567 super.StringConversionSinkBase(); | |
568 } | |
569 addSlice(chunk, start, end, isLast) { | |
570 let val = this[_escape]._convert(chunk, start, end); | |
571 if (val === null) { | |
572 this[_sink].addSlice(chunk, start, end, isLast); | |
573 } else { | |
574 this[_sink].add(val); | |
575 if (isLast) | |
576 this[_sink].close(); | |
577 } | |
578 } | |
579 close() { | |
580 return this[_sink].close(); | |
581 } | |
582 } | |
583 class JsonUnsupportedObjectError extends core.Error { | |
584 JsonUnsupportedObjectError(unsupportedObject, opt$) { | |
585 let cause = opt$.cause === void 0 ? null : opt$.cause; | |
586 this.unsupportedObject = unsupportedObject; | |
587 this.cause = cause; | |
588 super.Error(); | |
589 } | |
590 toString() { | |
591 if (this.cause !== null) { | |
592 return "Converting object to an encodable object failed."; | |
593 } else { | |
594 return "Converting object did not return an encodable object."; | |
595 } | |
596 } | |
597 } | |
598 class JsonCyclicError extends JsonUnsupportedObjectError { | |
599 JsonCyclicError(object) { | |
600 super.JsonUnsupportedObjectError(object); | |
601 } | |
602 toString() { | |
603 return "Cyclic error in JSON stringify"; | |
604 } | |
605 } | |
606 let JSON = new JsonCodec(); | |
607 let _reviver = Symbol('_reviver'); | |
608 let _toEncodable = Symbol('_toEncodable'); | |
609 class JsonCodec extends Codec$(core.Object, core.String) { | |
610 JsonCodec(opt$) { | |
611 let reviver = opt$.reviver === void 0 ? null : opt$.reviver; | |
612 let toEncodable = opt$.toEncodable === void 0 ? null : opt$.toEncodable; | |
613 this[_reviver] = reviver; | |
614 this[_toEncodable] = toEncodable; | |
615 super.Codec(); | |
616 } | |
617 JsonCodec$withReviver(reviver) { | |
618 this.JsonCodec({reviver: reviver}); | |
619 } | |
620 decode(source, opt$) { | |
621 let reviver = opt$.reviver === void 0 ? null : opt$.reviver; | |
622 if (reviver === null) | |
623 reviver = this[_reviver]; | |
624 if (reviver === null) | |
625 return this.decoder.convert(source); | |
626 return new JsonDecoder(reviver).convert(source); | |
627 } | |
628 encode(value, opt$) { | |
629 let toEncodable = opt$.toEncodable === void 0 ? null : opt$.toEncodable; | |
630 if (toEncodable === null) | |
631 toEncodable = this[_toEncodable]; | |
632 if (toEncodable === null) | |
633 return this.encoder.convert(value); | |
634 return new JsonEncoder(dart.closureWrap(toEncodable, "(Object) → Object"))
.convert(value); | |
635 } | |
636 get encoder() { | |
637 if (this[_toEncodable] === null) | |
638 return new JsonEncoder(); | |
639 return new JsonEncoder(dart.closureWrap(this[_toEncodable], "(Object) → Ob
ject")); | |
640 } | |
641 get decoder() { | |
642 if (this[_reviver] === null) | |
643 return new JsonDecoder(); | |
644 return new JsonDecoder(this[_reviver]); | |
645 } | |
646 } | |
647 dart.defineNamedConstructor(JsonCodec, 'withReviver'); | |
648 class JsonEncoder extends Converter$(core.Object, core.String) { | |
649 JsonEncoder(toEncodable) { | |
650 if (toEncodable === void 0) | |
651 toEncodable = null; | |
652 this.indent = null; | |
653 this[_toEncodable] = toEncodable; | |
654 super.Converter(); | |
655 } | |
656 JsonEncoder$withIndent(indent, toEncodable) { | |
657 if (toEncodable === void 0) | |
658 toEncodable = null; | |
659 this.indent = indent; | |
660 this[_toEncodable] = toEncodable; | |
661 super.Converter(); | |
662 } | |
663 convert(object) { | |
664 return _JsonStringStringifier.stringify(object, dart.as(this[_toEncodable]
, dart.throw_("Unimplemented type (dynamic) → dynamic")), this.indent); | |
665 } | |
666 startChunkedConversion(sink) { | |
667 if (!dart.is(sink, StringConversionSink)) { | |
668 sink = new StringConversionSink.from(sink); | |
669 } else if (dart.is(sink, _Utf8EncoderSink)) { | |
670 return new _JsonUtf8EncoderSink(sink[_sink], this[_toEncodable], JsonUtf
8Encoder._utf8Encode(this.indent), JsonUtf8Encoder.DEFAULT_BUFFER_SIZE); | |
671 } | |
672 return new _JsonEncoderSink(dart.as(sink, StringConversionSink), this[_toE
ncodable], this.indent); | |
673 } | |
674 bind(stream) { | |
675 return dart.as(super.bind(stream), async.Stream$(core.String)); | |
676 } | |
677 fuse(other) { | |
678 if (dart.is(other, Utf8Encoder)) { | |
679 return new JsonUtf8Encoder(this.indent, dart.as(this[_toEncodable], dart
.throw_("Unimplemented type (Object) → dynamic"))); | |
680 } | |
681 return super.fuse(other); | |
682 } | |
683 } | |
684 dart.defineNamedConstructor(JsonEncoder, 'withIndent'); | |
685 let _indent = Symbol('_indent'); | |
686 let _bufferSize = Symbol('_bufferSize'); | |
687 let _utf8Encode = Symbol('_utf8Encode'); | |
688 class JsonUtf8Encoder extends Converter$(core.Object, core.List$(core.int)) { | |
689 JsonUtf8Encoder(indent, toEncodable, bufferSize) { | |
690 if (indent === void 0) | |
691 indent = null; | |
692 if (toEncodable === void 0) | |
693 toEncodable = null; | |
694 if (bufferSize === void 0) | |
695 bufferSize = JsonUtf8Encoder.DEFAULT_BUFFER_SIZE; | |
696 this[_indent] = _utf8Encode(indent); | |
697 this[_toEncodable] = toEncodable; | |
698 this[_bufferSize] = bufferSize; | |
699 super.Converter(); | |
700 } | |
701 static [_utf8Encode](string) { | |
702 if (string === null) | |
703 return null; | |
704 if (string.isEmpty) | |
705 return new typed_data.Uint8List(0); | |
706 checkAscii: { | |
707 for (let i = 0; dart.notNull(i) < dart.notNull(string.length); i = dart.
notNull(i) + 1) { | |
708 if (dart.notNull(string.codeUnitAt(i)) >= 128) | |
709 break checkAscii; | |
710 } | |
711 return string.codeUnits; | |
712 } | |
713 return UTF8.encode(string); | |
714 } | |
715 convert(object) { | |
716 let bytes = dart.as(new List.from([]), core.List$(core.List$(core.int))); | |
717 // Function addChunk: (Uint8List, int, int) → void | |
718 function addChunk(chunk, start, end) { | |
719 if (dart.notNull(start) > 0 || dart.notNull(end) < dart.notNull(chunk.le
ngth)) { | |
720 let length = dart.notNull(end) - dart.notNull(start); | |
721 chunk = new typed_data.Uint8List.view(chunk.buffer, dart.notNull(chunk
.offsetInBytes) + dart.notNull(start), length); | |
722 } | |
723 bytes.add(chunk); | |
724 } | |
725 _JsonUtf8Stringifier.stringify(object, this[_indent], dart.as(this[_toEnco
dable], dart.throw_("Unimplemented type (Object) → dynamic")), this[_bufferSize]
, addChunk); | |
726 if (bytes.length === 1) | |
727 return bytes.get(0); | |
728 let length = 0; | |
729 for (let i = 0; dart.notNull(i) < dart.notNull(bytes.length); i = dart.not
Null(i) + 1) { | |
730 length = bytes.get(i).length; | |
731 } | |
732 let result = new typed_data.Uint8List(length); | |
733 for (let i = 0, offset = 0; dart.notNull(i) < dart.notNull(bytes.length);
i = dart.notNull(i) + 1) { | |
734 let byteList = bytes.get(i); | |
735 let end = dart.notNull(offset) + dart.notNull(byteList.length); | |
736 result.setRange(offset, end, byteList); | |
737 offset = end; | |
738 } | |
739 return result; | |
740 } | |
741 startChunkedConversion(sink) { | |
742 let byteSink = null; | |
743 if (dart.is(sink, ByteConversionSink)) { | |
744 byteSink = sink; | |
745 } else { | |
746 byteSink = new ByteConversionSink.from(sink); | |
747 } | |
748 return new _JsonUtf8EncoderSink(byteSink, this[_toEncodable], this[_indent
], this[_bufferSize]); | |
749 } | |
750 bind(stream) { | |
751 return dart.as(super.bind(stream), async.Stream$(core.List$(core.int))); | |
752 } | |
753 fuse(other) { | |
754 return super.fuse(other); | |
755 } | |
756 } | |
757 JsonUtf8Encoder.DEFAULT_BUFFER_SIZE = 256; | |
758 let _isDone = Symbol('_isDone'); | |
759 class _JsonEncoderSink extends ChunkedConversionSink$(core.Object) { | |
760 _JsonEncoderSink($_sink, $_toEncodable, $_indent) { | |
761 this[_sink] = $_sink; | |
762 this[_toEncodable] = $_toEncodable; | |
763 this[_indent] = $_indent; | |
764 this[_isDone] = false; | |
765 super.ChunkedConversionSink(); | |
766 } | |
767 add(o) { | |
768 if (this[_isDone]) { | |
769 throw new core.StateError("Only one call to add allowed"); | |
770 } | |
771 this[_isDone] = true; | |
772 let stringSink = this[_sink].asStringSink(); | |
773 _JsonStringStringifier.printOn(o, stringSink, dart.as(this[_toEncodable],
dart.throw_("Unimplemented type (dynamic) → dynamic")), this[_indent]); | |
774 stringSink.close(); | |
775 } | |
776 close() {} | |
777 } | |
778 let _addChunk = Symbol('_addChunk'); | |
779 class _JsonUtf8EncoderSink extends ChunkedConversionSink$(core.Object) { | |
780 _JsonUtf8EncoderSink($_sink, $_toEncodable, $_indent, $_bufferSize) { | |
781 this[_sink] = $_sink; | |
782 this[_toEncodable] = $_toEncodable; | |
783 this[_indent] = $_indent; | |
784 this[_bufferSize] = $_bufferSize; | |
785 this[_isDone] = false; | |
786 super.ChunkedConversionSink(); | |
787 } | |
788 [_addChunk](chunk, start, end) { | |
789 this[_sink].addSlice(chunk, start, end, false); | |
790 } | |
791 add(object) { | |
792 if (this[_isDone]) { | |
793 throw new core.StateError("Only one call to add allowed"); | |
794 } | |
795 this[_isDone] = true; | |
796 _JsonUtf8Stringifier.stringify(object, this[_indent], dart.as(this[_toEnco
dable], dart.throw_("Unimplemented type (Object) → dynamic")), this[_bufferSize]
, this[_addChunk]); | |
797 this[_sink].close(); | |
798 } | |
799 close() { | |
800 if (!dart.notNull(this[_isDone])) { | |
801 this[_isDone] = true; | |
802 this[_sink].close(); | |
803 } | |
804 } | |
805 } | |
806 class JsonDecoder extends Converter$(core.String, core.Object) { | |
807 JsonDecoder(reviver) { | |
808 if (reviver === void 0) | |
809 reviver = null; | |
810 this[_reviver] = reviver; | |
811 super.Converter(); | |
812 } | |
813 convert(input) { | |
814 return _parseJson(input, this[_reviver]); | |
815 } | |
816 startChunkedConversion(sink) { | |
817 return new _JsonDecoderSink(this[_reviver], sink); | |
818 } | |
819 bind(stream) { | |
820 return dart.as(super.bind(stream), async.Stream$(core.Object)); | |
821 } | |
822 } | |
823 // Function _parseJson: (String, (dynamic, dynamic) → dynamic) → dynamic | |
824 function _parseJson(source, reviver) { | |
825 if (!(typeof source == string)) | |
826 throw new core.ArgumentError(source); | |
827 let parsed = null; | |
828 try { | |
829 parsed = JSON.parse(source); | |
830 } catch (e) { | |
831 throw new core.FormatException(String(e)); | |
832 } | |
833 | |
834 if (reviver === null) { | |
835 return _convertJsonToDartLazy(parsed); | |
836 } else { | |
837 return _convertJsonToDart(parsed, reviver); | |
838 } | |
839 } | |
840 // Function _defaultToEncodable: (dynamic) → Object | |
841 function _defaultToEncodable(object) { | |
842 return dart.dinvoke(object, 'toJson'); | |
843 } | |
844 let _seen = Symbol('_seen'); | |
845 let _checkCycle = Symbol('_checkCycle'); | |
846 let _removeSeen = Symbol('_removeSeen'); | |
847 class _JsonStringifier extends core.Object { | |
848 _JsonStringifier(_toEncodable) { | |
849 this[_seen] = new core.List(); | |
850 this[_toEncodable] = dart.as(_toEncodable !== null ? _toEncodable : _defau
ltToEncodable, core.Function); | |
851 } | |
852 static hexDigit(x) { | |
853 return dart.notNull(x) < 10 ? 48 + dart.notNull(x) : 87 + dart.notNull(x); | |
854 } | |
855 writeStringContent(s) { | |
856 let offset = 0; | |
857 let length = s.length; | |
858 for (let i = 0; dart.notNull(i) < dart.notNull(length); i = dart.notNull(i
) + 1) { | |
859 let charCode = s.codeUnitAt(i); | |
860 if (dart.notNull(charCode) > dart.notNull(_JsonStringifier.BACKSLASH)) | |
861 continue; | |
862 if (dart.notNull(charCode) < 32) { | |
863 if (dart.notNull(i) > dart.notNull(offset)) | |
864 this.writeStringSlice(s, offset, i); | |
865 offset = dart.notNull(i) + 1; | |
866 this.writeCharCode(_JsonStringifier.BACKSLASH); | |
867 switch (charCode) { | |
868 case _JsonStringifier.BACKSPACE: | |
869 this.writeCharCode(_JsonStringifier.CHAR_b); | |
870 break; | |
871 case _JsonStringifier.TAB: | |
872 this.writeCharCode(_JsonStringifier.CHAR_t); | |
873 break; | |
874 case _JsonStringifier.NEWLINE: | |
875 this.writeCharCode(_JsonStringifier.CHAR_n); | |
876 break; | |
877 case _JsonStringifier.FORM_FEED: | |
878 this.writeCharCode(_JsonStringifier.CHAR_f); | |
879 break; | |
880 case _JsonStringifier.CARRIAGE_RETURN: | |
881 this.writeCharCode(_JsonStringifier.CHAR_r); | |
882 break; | |
883 default: | |
884 this.writeCharCode(_JsonStringifier.CHAR_u); | |
885 this.writeCharCode(_JsonStringifier.CHAR_0); | |
886 this.writeCharCode(_JsonStringifier.CHAR_0); | |
887 this.writeCharCode(hexDigit(dart.notNull(charCode) >> 4 & 15)); | |
888 this.writeCharCode(hexDigit(dart.notNull(charCode) & 15)); | |
889 break; | |
890 } | |
891 } else if (charCode === _JsonStringifier.QUOTE || charCode === _JsonStri
ngifier.BACKSLASH) { | |
892 if (dart.notNull(i) > dart.notNull(offset)) | |
893 this.writeStringSlice(s, offset, i); | |
894 offset = dart.notNull(i) + 1; | |
895 this.writeCharCode(_JsonStringifier.BACKSLASH); | |
896 this.writeCharCode(charCode); | |
897 } | |
898 } | |
899 if (offset === 0) { | |
900 this.writeString(s); | |
901 } else if (dart.notNull(offset) < dart.notNull(length)) { | |
902 this.writeStringSlice(s, offset, length); | |
903 } | |
904 } | |
905 [_checkCycle](object) { | |
906 for (let i = 0; dart.notNull(i) < dart.notNull(this[_seen].length); i = da
rt.notNull(i) + 1) { | |
907 if (core.identical(object, this[_seen].get(i))) { | |
908 throw new JsonCyclicError(object); | |
909 } | |
910 } | |
911 this[_seen].add(object); | |
912 } | |
913 [_removeSeen](object) { | |
914 dart.assert(!dart.notNull(this[_seen].isEmpty)); | |
915 dart.assert(core.identical(this[_seen].last, object)); | |
916 this[_seen].removeLast(); | |
917 } | |
918 writeObject(object) { | |
919 if (this.writeJsonValue(object)) | |
920 return; | |
921 this[_checkCycle](object); | |
922 try { | |
923 let customJson = dart.dinvokef(this[_toEncodable], object); | |
924 if (!dart.notNull(this.writeJsonValue(customJson))) { | |
925 throw new JsonUnsupportedObjectError(object); | |
926 } | |
927 this[_removeSeen](object); | |
928 } catch (e) { | |
929 throw new JsonUnsupportedObjectError(object, {cause: e}); | |
930 } | |
931 | |
932 } | |
933 writeJsonValue(object) { | |
934 if (dart.is(object, core.num)) { | |
935 if (dart.dunary('!', dart.dload(object, 'isFinite'))) | |
936 return false; | |
937 this.writeNumber(dart.as(object, core.num)); | |
938 return true; | |
939 } else if (core.identical(object, true)) { | |
940 this.writeString('true'); | |
941 return true; | |
942 } else if (core.identical(object, false)) { | |
943 this.writeString('false'); | |
944 return true; | |
945 } else if (object === null) { | |
946 this.writeString('null'); | |
947 return true; | |
948 } else if (typeof object == string) { | |
949 this.writeString('"'); | |
950 this.writeStringContent(dart.as(object, core.String)); | |
951 this.writeString('"'); | |
952 return true; | |
953 } else if (dart.is(object, core.List)) { | |
954 this[_checkCycle](object); | |
955 this.writeList(dart.as(object, core.List)); | |
956 this[_removeSeen](object); | |
957 return true; | |
958 } else if (dart.is(object, core.Map)) { | |
959 this[_checkCycle](object); | |
960 this.writeMap(dart.as(object, core.Map$(core.String, core.Object))); | |
961 this[_removeSeen](object); | |
962 return true; | |
963 } else { | |
964 return false; | |
965 } | |
966 } | |
967 writeList(list) { | |
968 this.writeString('['); | |
969 if (dart.notNull(list.length) > 0) { | |
970 this.writeObject(list.get(0)); | |
971 for (let i = 1; dart.notNull(i) < dart.notNull(list.length); i = dart.no
tNull(i) + 1) { | |
972 this.writeString(','); | |
973 this.writeObject(list.get(i)); | |
974 } | |
975 } | |
976 this.writeString(']'); | |
977 } | |
978 writeMap(map) { | |
979 this.writeString('{'); | |
980 let separator = '"'; | |
981 map.forEach(dart.closureWrap(((key, value) => { | |
982 this.writeString(separator); | |
983 separator = ',"'; | |
984 this.writeStringContent(key); | |
985 this.writeString('":'); | |
986 this.writeObject(value); | |
987 }).bind(this), "(String, Object) → void")); | |
988 this.writeString('}'); | |
989 } | |
990 } | |
991 _JsonStringifier.BACKSPACE = 8; | |
992 _JsonStringifier.TAB = 9; | |
993 _JsonStringifier.NEWLINE = 10; | |
994 _JsonStringifier.CARRIAGE_RETURN = 13; | |
995 _JsonStringifier.FORM_FEED = 12; | |
996 _JsonStringifier.QUOTE = 34; | |
997 _JsonStringifier.CHAR_0 = 48; | |
998 _JsonStringifier.BACKSLASH = 92; | |
999 _JsonStringifier.CHAR_b = 98; | |
1000 _JsonStringifier.CHAR_f = 102; | |
1001 _JsonStringifier.CHAR_n = 110; | |
1002 _JsonStringifier.CHAR_r = 114; | |
1003 _JsonStringifier.CHAR_t = 116; | |
1004 _JsonStringifier.CHAR_u = 117; | |
1005 let _indentLevel = Symbol('_indentLevel'); | |
1006 class _JsonPrettyPrintMixin extends core.Object { | |
1007 _JsonPrettyPrintMixin() { | |
1008 this[_indentLevel] = 0; | |
1009 } | |
1010 writeList(list) { | |
1011 if (list.isEmpty) { | |
1012 this.writeString('[]'); | |
1013 } else { | |
1014 this.writeString('[\n'); | |
1015 this[_indentLevel] = dart.notNull(this[_indentLevel]) + 1; | |
1016 this.writeIndentation(this[_indentLevel]); | |
1017 this.writeObject(list.get(0)); | |
1018 for (let i = 1; dart.notNull(i) < dart.notNull(list.length); i = dart.no
tNull(i) + 1) { | |
1019 this.writeString(',\n'); | |
1020 this.writeIndentation(this[_indentLevel]); | |
1021 this.writeObject(list.get(i)); | |
1022 } | |
1023 this.writeString('\n'); | |
1024 this[_indentLevel] = dart.notNull(this[_indentLevel]) - 1; | |
1025 this.writeIndentation(this[_indentLevel]); | |
1026 this.writeString(']'); | |
1027 } | |
1028 } | |
1029 writeMap(map) { | |
1030 if (map.isEmpty) { | |
1031 this.writeString('{}'); | |
1032 } else { | |
1033 this.writeString('{\n'); | |
1034 this[_indentLevel] = dart.notNull(this[_indentLevel]) + 1; | |
1035 let first = true; | |
1036 map.forEach(((key, value) => { | |
1037 if (!dart.notNull(first)) { | |
1038 this.writeString(",\n"); | |
1039 } | |
1040 this.writeIndentation(this[_indentLevel]); | |
1041 this.writeString('"'); | |
1042 this.writeStringContent(key); | |
1043 this.writeString('": '); | |
1044 this.writeObject(value); | |
1045 first = false; | |
1046 }).bind(this)); | |
1047 this.writeString('\n'); | |
1048 this[_indentLevel] = dart.notNull(this[_indentLevel]) - 1; | |
1049 this.writeIndentation(this[_indentLevel]); | |
1050 this.writeString('}'); | |
1051 } | |
1052 } | |
1053 } | |
1054 class _JsonStringStringifier extends _JsonStringifier { | |
1055 _JsonStringStringifier($_sink, _toEncodable) { | |
1056 this[_sink] = $_sink; | |
1057 super._JsonStringifier(dart.as(_toEncodable, dart.throw_("Unimplemented ty
pe (Object) → Object"))); | |
1058 } | |
1059 static stringify(object, toEncodable, indent) { | |
1060 let output = new core.StringBuffer(); | |
1061 printOn(object, output, toEncodable, indent); | |
1062 return output.toString(); | |
1063 } | |
1064 static printOn(object, output, toEncodable, indent) { | |
1065 let stringifier = null; | |
1066 if (indent === null) { | |
1067 stringifier = new _JsonStringStringifier(output, toEncodable); | |
1068 } else { | |
1069 stringifier = new _JsonStringStringifierPretty(output, toEncodable, inde
nt); | |
1070 } | |
1071 dart.dinvoke(stringifier, 'writeObject', object); | |
1072 } | |
1073 writeNumber(number) { | |
1074 this[_sink].write(number.toString()); | |
1075 } | |
1076 writeString(string) { | |
1077 this[_sink].write(string); | |
1078 } | |
1079 writeStringSlice(string, start, end) { | |
1080 this[_sink].write(string.substring(start, end)); | |
1081 } | |
1082 writeCharCode(charCode) { | |
1083 this[_sink].writeCharCode(charCode); | |
1084 } | |
1085 } | |
1086 class _JsonStringStringifierPretty extends dart.mixin(_JsonStringStringifier,
_JsonPrettyPrintMixin) { | |
1087 _JsonStringStringifierPretty(sink, toEncodable, $_indent) { | |
1088 this[_indent] = $_indent; | |
1089 super._JsonStringStringifier(sink, toEncodable); | |
1090 } | |
1091 writeIndentation(count) { | |
1092 for (let i = 0; dart.notNull(i) < dart.notNull(count); i = dart.notNull(i)
+ 1) | |
1093 this.writeString(this[_indent]); | |
1094 } | |
1095 } | |
1096 class _JsonUtf8Stringifier extends _JsonStringifier { | |
1097 _JsonUtf8Stringifier(toEncodable, bufferSize, addChunk) { | |
1098 this.addChunk = addChunk; | |
1099 this.bufferSize = bufferSize; | |
1100 this.buffer = new typed_data.Uint8List(bufferSize); | |
1101 this.index = 0; | |
1102 super._JsonStringifier(dart.as(toEncodable, dart.throw_("Unimplemented typ
e (Object) → Object"))); | |
1103 } | |
1104 static stringify(object, indent, toEncodableFunction, bufferSize, addChunk)
{ | |
1105 let stringifier = null; | |
1106 if (indent !== null) { | |
1107 stringifier = new _JsonUtf8StringifierPretty(toEncodableFunction, indent
, bufferSize, addChunk); | |
1108 } else { | |
1109 stringifier = new _JsonUtf8Stringifier(toEncodableFunction, bufferSize,
addChunk); | |
1110 } | |
1111 stringifier.writeObject(object); | |
1112 stringifier.flush(); | |
1113 } | |
1114 flush() { | |
1115 if (dart.notNull(this.index) > 0) { | |
1116 dart.dinvokef(this.addChunk, this.buffer, 0, this.index); | |
1117 } | |
1118 this.buffer = null; | |
1119 this.index = 0; | |
1120 } | |
1121 writeNumber(number) { | |
1122 this.writeAsciiString(number.toString()); | |
1123 } | |
1124 writeAsciiString(string) { | |
1125 for (let i = 0; dart.notNull(i) < dart.notNull(string.length); i = dart.no
tNull(i) + 1) { | |
1126 let char = string.codeUnitAt(i); | |
1127 dart.assert(dart.notNull(char) <= 127); | |
1128 this.writeByte(char); | |
1129 } | |
1130 } | |
1131 writeString(string) { | |
1132 this.writeStringSlice(string, 0, string.length); | |
1133 } | |
1134 writeStringSlice(string, start, end) { | |
1135 for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(
i) + 1) { | |
1136 let char = string.codeUnitAt(i); | |
1137 if (dart.notNull(char) <= 127) { | |
1138 this.writeByte(char); | |
1139 } else { | |
1140 if ((dart.notNull(char) & 64512) === 55296 && dart.notNull(i) + 1 < da
rt.notNull(end)) { | |
1141 let nextChar = string.codeUnitAt(dart.notNull(i) + 1); | |
1142 if ((dart.notNull(nextChar) & 64512) === 56320) { | |
1143 char = 65536 + ((dart.notNull(char) & 1023) << 10) + (dart.notNull
(nextChar) & 1023); | |
1144 this.writeFourByteCharCode(char); | |
1145 i = dart.notNull(i) + 1; | |
1146 continue; | |
1147 } | |
1148 } | |
1149 this.writeMultiByteCharCode(char); | |
1150 } | |
1151 } | |
1152 } | |
1153 writeCharCode(charCode) { | |
1154 if (dart.notNull(charCode) <= 127) { | |
1155 this.writeByte(charCode); | |
1156 return; | |
1157 } | |
1158 this.writeMultiByteCharCode(charCode); | |
1159 } | |
1160 writeMultiByteCharCode(charCode) { | |
1161 if (dart.notNull(charCode) <= 2047) { | |
1162 this.writeByte(192 | dart.notNull(charCode) >> 6); | |
1163 this.writeByte(128 | dart.notNull(charCode) & 63); | |
1164 return; | |
1165 } | |
1166 if (dart.notNull(charCode) <= 65535) { | |
1167 this.writeByte(224 | dart.notNull(charCode) >> 12); | |
1168 this.writeByte(128 | dart.notNull(charCode) >> 6 & 63); | |
1169 this.writeByte(128 | dart.notNull(charCode) & 63); | |
1170 return; | |
1171 } | |
1172 this.writeFourByteCharCode(charCode); | |
1173 } | |
1174 writeFourByteCharCode(charCode) { | |
1175 dart.assert(dart.notNull(charCode) <= 1114111); | |
1176 this.writeByte(240 | dart.notNull(charCode) >> 18); | |
1177 this.writeByte(128 | dart.notNull(charCode) >> 12 & 63); | |
1178 this.writeByte(128 | dart.notNull(charCode) >> 6 & 63); | |
1179 this.writeByte(128 | dart.notNull(charCode) & 63); | |
1180 } | |
1181 writeByte(byte) { | |
1182 dart.assert(dart.notNull(byte) <= 255); | |
1183 if (this.index === this.buffer.length) { | |
1184 dart.dinvokef(this.addChunk, this.buffer, 0, this.index); | |
1185 this.buffer = new typed_data.Uint8List(this.bufferSize); | |
1186 this.index = 0; | |
1187 } | |
1188 this.buffer.set((($tmp) => this.index = dart.notNull($tmp) + 1, $tmp).bind
(this)(this.index), byte); | |
1189 } | |
1190 } | |
1191 class _JsonUtf8StringifierPretty extends dart.mixin(_JsonUtf8Stringifier, _Jso
nPrettyPrintMixin) { | |
1192 _JsonUtf8StringifierPretty(toEncodableFunction, indent, bufferSize, addChunk
) { | |
1193 this.indent = indent; | |
1194 super._JsonUtf8Stringifier(toEncodableFunction, dart.as(bufferSize, core.i
nt), dart.as(addChunk, core.Function)); | |
1195 } | |
1196 writeIndentation(count) { | |
1197 let indent = this.indent; | |
1198 let indentLength = indent.length; | |
1199 if (indentLength === 1) { | |
1200 let char = indent.get(0); | |
1201 while (dart.notNull(count) > 0) { | |
1202 this.writeByte(char); | |
1203 count = 1; | |
1204 } | |
1205 return; | |
1206 } | |
1207 while (dart.notNull(count) > 0) { | |
1208 count = dart.notNull(count) - 1; | |
1209 let end = dart.notNull(this.index) + dart.notNull(indentLength); | |
1210 if (dart.notNull(end) <= dart.notNull(this.buffer.length)) { | |
1211 this.buffer.setRange(this.index, end, indent); | |
1212 this.index = end; | |
1213 } else { | |
1214 for (let i = 0; dart.notNull(i) < dart.notNull(indentLength); i = dart
.notNull(i) + 1) { | |
1215 this.writeByte(indent.get(i)); | |
1216 } | |
1217 } | |
1218 } | |
1219 } | |
1220 } | |
1221 let LATIN1 = new Latin1Codec(); | |
1222 let _LATIN1_MASK = 255; | |
1223 class Latin1Codec extends Encoding { | |
1224 Latin1Codec(opt$) { | |
1225 let allowInvalid = opt$.allowInvalid === void 0 ? false : opt$.allowInvali
d; | |
1226 this[_allowInvalid] = allowInvalid; | |
1227 super.Encoding(); | |
1228 } | |
1229 get name() { | |
1230 return "iso-8859-1"; | |
1231 } | |
1232 decode(bytes, opt$) { | |
1233 let allowInvalid = opt$.allowInvalid === void 0 ? null : opt$.allowInvalid
; | |
1234 if (allowInvalid === null) | |
1235 allowInvalid = this[_allowInvalid]; | |
1236 if (allowInvalid) { | |
1237 return new Latin1Decoder({allowInvalid: true}).convert(bytes); | |
1238 } else { | |
1239 return new Latin1Decoder({allowInvalid: false}).convert(bytes); | |
1240 } | |
1241 } | |
1242 get encoder() { | |
1243 return new Latin1Encoder(); | |
1244 } | |
1245 get decoder() { | |
1246 return this[_allowInvalid] ? new Latin1Decoder({allowInvalid: true}) : new
Latin1Decoder({allowInvalid: false}); | |
1247 } | |
1248 } | |
1249 class Latin1Encoder extends _UnicodeSubsetEncoder { | |
1250 Latin1Encoder() { | |
1251 super._UnicodeSubsetEncoder(_LATIN1_MASK); | |
1252 } | |
1253 } | |
1254 class Latin1Decoder extends _UnicodeSubsetDecoder { | |
1255 Latin1Decoder(opt$) { | |
1256 let allowInvalid = opt$.allowInvalid === void 0 ? false : opt$.allowInvali
d; | |
1257 super._UnicodeSubsetDecoder(allowInvalid, _LATIN1_MASK); | |
1258 } | |
1259 startChunkedConversion(sink) { | |
1260 let stringSink = null; | |
1261 if (dart.is(sink, StringConversionSink)) { | |
1262 stringSink = sink; | |
1263 } else { | |
1264 stringSink = new StringConversionSink.from(sink); | |
1265 } | |
1266 if (!dart.notNull(this[_allowInvalid])) | |
1267 return new _Latin1DecoderSink(stringSink); | |
1268 return new _Latin1AllowInvalidDecoderSink(stringSink); | |
1269 } | |
1270 } | |
1271 let _addSliceToSink = Symbol('_addSliceToSink'); | |
1272 class _Latin1DecoderSink extends ByteConversionSinkBase { | |
1273 _Latin1DecoderSink($_sink) { | |
1274 this[_sink] = $_sink; | |
1275 super.ByteConversionSinkBase(); | |
1276 } | |
1277 close() { | |
1278 this[_sink].close(); | |
1279 } | |
1280 add(source) { | |
1281 this.addSlice(source, 0, source.length, false); | |
1282 } | |
1283 [_addSliceToSink](source, start, end, isLast) { | |
1284 this[_sink].add(new core.String.fromCharCodes(source, start, end)); | |
1285 if (isLast) | |
1286 this.close(); | |
1287 } | |
1288 addSlice(source, start, end, isLast) { | |
1289 core.RangeError.checkValidRange(start, end, source.length); | |
1290 for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(
i) + 1) { | |
1291 let char = source.get(i); | |
1292 if (dart.notNull(char) > dart.notNull(_LATIN1_MASK) || dart.notNull(char
) < 0) { | |
1293 throw new core.FormatException("Source contains non-Latin-1 characters
."); | |
1294 } | |
1295 } | |
1296 if (dart.notNull(start) < dart.notNull(end)) { | |
1297 this[_addSliceToSink](source, start, end, isLast); | |
1298 } | |
1299 if (isLast) { | |
1300 this.close(); | |
1301 } | |
1302 } | |
1303 } | |
1304 class _Latin1AllowInvalidDecoderSink extends _Latin1DecoderSink { | |
1305 _Latin1AllowInvalidDecoderSink(sink) { | |
1306 super._Latin1DecoderSink(sink); | |
1307 } | |
1308 addSlice(source, start, end, isLast) { | |
1309 core.RangeError.checkValidRange(start, end, source.length); | |
1310 for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(
i) + 1) { | |
1311 let char = source.get(i); | |
1312 if (dart.notNull(char) > dart.notNull(_LATIN1_MASK) || dart.notNull(char
) < 0) { | |
1313 if (dart.notNull(i) > dart.notNull(start)) | |
1314 this[_addSliceToSink](source, start, i, false); | |
1315 this[_addSliceToSink](dart.as(/* Unimplemented const */new List.from([
65533]), core.List$(core.int)), 0, 1, false); | |
1316 start = dart.notNull(i) + 1; | |
1317 } | |
1318 } | |
1319 if (dart.notNull(start) < dart.notNull(end)) { | |
1320 this[_addSliceToSink](source, start, end, isLast); | |
1321 } | |
1322 if (isLast) { | |
1323 this.close(); | |
1324 } | |
1325 } | |
1326 } | |
1327 class LineSplitter extends Converter$(core.String, core.List$(core.String)) { | |
1328 LineSplitter() { | |
1329 super.Converter(); | |
1330 } | |
1331 convert(data) { | |
1332 let lines = new core.List(); | |
1333 _LineSplitterSink._addSlice(data, 0, data.length, true, lines.add); | |
1334 return lines; | |
1335 } | |
1336 startChunkedConversion(sink) { | |
1337 if (!dart.is(sink, StringConversionSink)) { | |
1338 sink = new StringConversionSink.from(sink); | |
1339 } | |
1340 return new _LineSplitterSink(dart.as(sink, StringConversionSink)); | |
1341 } | |
1342 } | |
1343 let _carry = Symbol('_carry'); | |
1344 let _addSlice = Symbol('_addSlice'); | |
1345 class _LineSplitterSink extends StringConversionSinkBase { | |
1346 _LineSplitterSink($_sink) { | |
1347 this[_sink] = $_sink; | |
1348 this[_carry] = null; | |
1349 super.StringConversionSinkBase(); | |
1350 } | |
1351 addSlice(chunk, start, end, isLast) { | |
1352 if (this[_carry] !== null) { | |
1353 chunk = core.String['+'](this[_carry], chunk.substring(start, end)); | |
1354 start = 0; | |
1355 end = chunk.length; | |
1356 this[_carry] = null; | |
1357 } | |
1358 this[_carry] = _addSlice(chunk, start, end, isLast, this[_sink].add); | |
1359 if (isLast) | |
1360 this[_sink].close(); | |
1361 } | |
1362 close() { | |
1363 this.addSlice('', 0, 0, true); | |
1364 } | |
1365 static [_addSlice](chunk, start, end, isLast, adder) { | |
1366 let pos = start; | |
1367 while (dart.notNull(pos) < dart.notNull(end)) { | |
1368 let skip = 0; | |
1369 let char = chunk.codeUnitAt(pos); | |
1370 if (char === _LineSplitterSink._LF) { | |
1371 skip = 1; | |
1372 } else if (char === _LineSplitterSink._CR) { | |
1373 skip = 1; | |
1374 if (dart.notNull(pos) + 1 < dart.notNull(end)) { | |
1375 if (chunk.codeUnitAt(dart.notNull(pos) + 1) === _LineSplitterSink._L
F) { | |
1376 skip = 2; | |
1377 } | |
1378 } else if (!dart.notNull(isLast)) { | |
1379 return chunk.substring(start, end); | |
1380 } | |
1381 } | |
1382 if (dart.notNull(skip) > 0) { | |
1383 adder(chunk.substring(start, pos)); | |
1384 start = pos = dart.notNull(pos) + dart.notNull(skip); | |
1385 } else { | |
1386 pos = dart.notNull(pos) + 1; | |
1387 } | |
1388 } | |
1389 if (pos !== start) { | |
1390 let carry = chunk.substring(start, pos); | |
1391 if (isLast) { | |
1392 adder(carry); | |
1393 } else { | |
1394 return carry; | |
1395 } | |
1396 } | |
1397 return null; | |
1398 } | |
1399 } | |
1400 _LineSplitterSink._LF = 10; | |
1401 _LineSplitterSink._CR = 13; | |
1402 class StringConversionSink extends ChunkedConversionSink$(core.String) { | |
1403 StringConversionSink() { | |
1404 super.ChunkedConversionSink(); | |
1405 } | |
1406 StringConversionSink$withCallback(callback) { | |
1407 return new _StringCallbackSink(callback); | |
1408 } | |
1409 StringConversionSink$from(sink) { | |
1410 return new _StringAdapterSink(sink); | |
1411 } | |
1412 StringConversionSink$fromStringSink(sink) { | |
1413 return new _StringSinkConversionSink(sink); | |
1414 } | |
1415 } | |
1416 dart.defineNamedConstructor(StringConversionSink, 'withCallback'); | |
1417 dart.defineNamedConstructor(StringConversionSink, 'from'); | |
1418 dart.defineNamedConstructor(StringConversionSink, 'fromStringSink'); | |
1419 class ClosableStringSink extends core.StringSink { | |
1420 ClosableStringSink$fromStringSink(sink, onClose) { | |
1421 return new _ClosableStringSink(sink, onClose); | |
1422 } | |
1423 } | |
1424 dart.defineNamedConstructor(ClosableStringSink, 'fromStringSink'); | |
1425 class _ClosableStringSink extends core.Object { | |
1426 _ClosableStringSink($_sink, $_callback) { | |
1427 this[_sink] = $_sink; | |
1428 this[_callback] = $_callback; | |
1429 } | |
1430 close() { | |
1431 return this[_callback](); | |
1432 } | |
1433 writeCharCode(charCode) { | |
1434 return this[_sink].writeCharCode(charCode); | |
1435 } | |
1436 write(o) { | |
1437 return this[_sink].write(o); | |
1438 } | |
1439 writeln(o) { | |
1440 if (o === void 0) | |
1441 o = ""; | |
1442 return this[_sink].writeln(o); | |
1443 } | |
1444 writeAll(objects, separator) { | |
1445 if (separator === void 0) | |
1446 separator = ""; | |
1447 return this[_sink].writeAll(objects, separator); | |
1448 } | |
1449 } | |
1450 let _flush = Symbol('_flush'); | |
1451 class _StringConversionSinkAsStringSinkAdapter extends core.Object { | |
1452 _StringConversionSinkAsStringSinkAdapter($_chunkedSink) { | |
1453 this[_chunkedSink] = $_chunkedSink; | |
1454 this[_buffer] = new core.StringBuffer(); | |
1455 } | |
1456 close() { | |
1457 if (this[_buffer].isNotEmpty) | |
1458 this[_flush](); | |
1459 this[_chunkedSink].close(); | |
1460 } | |
1461 writeCharCode(charCode) { | |
1462 this[_buffer].writeCharCode(charCode); | |
1463 if (dart.notNull(this[_buffer].length) > dart.notNull(_StringConversionSin
kAsStringSinkAdapter._MIN_STRING_SIZE)) | |
1464 this[_flush](); | |
1465 } | |
1466 write(o) { | |
1467 if (this[_buffer].isNotEmpty) | |
1468 this[_flush](); | |
1469 let str = o.toString(); | |
1470 this[_chunkedSink].add(o.toString()); | |
1471 } | |
1472 writeln(o) { | |
1473 if (o === void 0) | |
1474 o = ""; | |
1475 this[_buffer].writeln(o); | |
1476 if (dart.notNull(this[_buffer].length) > dart.notNull(_StringConversionSin
kAsStringSinkAdapter._MIN_STRING_SIZE)) | |
1477 this[_flush](); | |
1478 } | |
1479 writeAll(objects, separator) { | |
1480 if (separator === void 0) | |
1481 separator = ""; | |
1482 if (this[_buffer].isNotEmpty) | |
1483 this[_flush](); | |
1484 let iterator = objects.iterator; | |
1485 if (!dart.notNull(iterator.moveNext())) | |
1486 return; | |
1487 if (separator.isEmpty) { | |
1488 do { | |
1489 this[_chunkedSink].add(dart.as(dart.dinvoke(iterator.current, 'toStrin
g'), core.String)); | |
1490 } while (iterator.moveNext()); | |
1491 } else { | |
1492 this[_chunkedSink].add(dart.as(dart.dinvoke(iterator.current, 'toString'
), core.String)); | |
1493 while (iterator.moveNext()) { | |
1494 this.write(separator); | |
1495 this[_chunkedSink].add(dart.as(dart.dinvoke(iterator.current, 'toStrin
g'), core.String)); | |
1496 } | |
1497 } | |
1498 } | |
1499 [_flush]() { | |
1500 let accumulated = this[_buffer].toString(); | |
1501 this[_buffer].clear(); | |
1502 this[_chunkedSink].add(accumulated); | |
1503 } | |
1504 } | |
1505 _StringConversionSinkAsStringSinkAdapter._MIN_STRING_SIZE = 16; | |
1506 let _stringSink = Symbol('_stringSink'); | |
1507 class _StringSinkConversionSink extends StringConversionSinkBase { | |
1508 _StringSinkConversionSink($_stringSink) { | |
1509 this[_stringSink] = $_stringSink; | |
1510 super.StringConversionSinkBase(); | |
1511 } | |
1512 close() {} | |
1513 addSlice(str, start, end, isLast) { | |
1514 if (start !== 0 || end !== str.length) { | |
1515 for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNul
l(i) + 1) { | |
1516 this[_stringSink].writeCharCode(str.codeUnitAt(i)); | |
1517 } | |
1518 } else { | |
1519 this[_stringSink].write(str); | |
1520 } | |
1521 if (isLast) | |
1522 this.close(); | |
1523 } | |
1524 add(str) { | |
1525 return this[_stringSink].write(str); | |
1526 } | |
1527 asUtf8Sink(allowMalformed) { | |
1528 return new _Utf8StringSinkAdapter(this, this[_stringSink], allowMalformed)
; | |
1529 } | |
1530 asStringSink() { | |
1531 return new ClosableStringSink.fromStringSink(this[_stringSink], this.close
); | |
1532 } | |
1533 } | |
1534 class _StringCallbackSink extends _StringSinkConversionSink { | |
1535 _StringCallbackSink($_callback) { | |
1536 this[_callback] = $_callback; | |
1537 super._StringSinkConversionSink(new core.StringBuffer()); | |
1538 } | |
1539 close() { | |
1540 let buffer = dart.as(this[_stringSink], core.StringBuffer); | |
1541 let accumulated = buffer.toString(); | |
1542 buffer.clear(); | |
1543 this[_callback](accumulated); | |
1544 } | |
1545 asUtf8Sink(allowMalformed) { | |
1546 return new _Utf8StringSinkAdapter(this, this[_stringSink], allowMalformed)
; | |
1547 } | |
1548 } | |
1549 class _StringAdapterSink extends StringConversionSinkBase { | |
1550 _StringAdapterSink($_sink) { | |
1551 this[_sink] = $_sink; | |
1552 super.StringConversionSinkBase(); | |
1553 } | |
1554 add(str) { | |
1555 return this[_sink].add(str); | |
1556 } | |
1557 addSlice(str, start, end, isLast) { | |
1558 if (start === 0 && end === str.length) { | |
1559 this.add(str); | |
1560 } else { | |
1561 this.add(str.substring(start, end)); | |
1562 } | |
1563 if (isLast) | |
1564 this.close(); | |
1565 } | |
1566 close() { | |
1567 return this[_sink].close(); | |
1568 } | |
1569 } | |
1570 let _decoder = Symbol('_decoder'); | |
1571 class _Utf8StringSinkAdapter extends ByteConversionSink { | |
1572 _Utf8StringSinkAdapter($_sink, stringSink, allowMalformed) { | |
1573 this[_sink] = $_sink; | |
1574 this[_decoder] = new _Utf8Decoder(stringSink, allowMalformed); | |
1575 super.ByteConversionSink(); | |
1576 } | |
1577 close() { | |
1578 this[_decoder].close(); | |
1579 if (this[_sink] !== null) | |
1580 this[_sink].close(); | |
1581 } | |
1582 add(chunk) { | |
1583 this.addSlice(chunk, 0, chunk.length, false); | |
1584 } | |
1585 addSlice(codeUnits, startIndex, endIndex, isLast) { | |
1586 this[_decoder].convert(codeUnits, startIndex, endIndex); | |
1587 if (isLast) | |
1588 this.close(); | |
1589 } | |
1590 } | |
1591 let _Utf8ConversionSink$_ = Symbol('_Utf8ConversionSink$_'); | |
1592 class _Utf8ConversionSink extends ByteConversionSink { | |
1593 _Utf8ConversionSink(sink, allowMalformed) { | |
1594 this[_Utf8ConversionSink$_](sink, new core.StringBuffer(), allowMalformed)
; | |
1595 } | |
1596 _Utf8ConversionSink$_($_chunkedSink, stringBuffer, allowMalformed) { | |
1597 this[_chunkedSink] = $_chunkedSink; | |
1598 this[_decoder] = new _Utf8Decoder(stringBuffer, allowMalformed); | |
1599 this[_buffer] = stringBuffer; | |
1600 super.ByteConversionSink(); | |
1601 } | |
1602 close() { | |
1603 this[_decoder].close(); | |
1604 if (this[_buffer].isNotEmpty) { | |
1605 let accumulated = this[_buffer].toString(); | |
1606 this[_buffer].clear(); | |
1607 this[_chunkedSink].addSlice(accumulated, 0, accumulated.length, true); | |
1608 } else { | |
1609 this[_chunkedSink].close(); | |
1610 } | |
1611 } | |
1612 add(chunk) { | |
1613 this.addSlice(chunk, 0, chunk.length, false); | |
1614 } | |
1615 addSlice(chunk, startIndex, endIndex, isLast) { | |
1616 this[_decoder].convert(chunk, startIndex, endIndex); | |
1617 if (this[_buffer].isNotEmpty) { | |
1618 let accumulated = this[_buffer].toString(); | |
1619 this[_chunkedSink].addSlice(accumulated, 0, accumulated.length, isLast); | |
1620 this[_buffer].clear(); | |
1621 return; | |
1622 } | |
1623 if (isLast) | |
1624 this.close(); | |
1625 } | |
1626 } | |
1627 dart.defineNamedConstructor(_Utf8ConversionSink, '_'); | |
1628 let UNICODE_REPLACEMENT_CHARACTER_RUNE = 65533; | |
1629 let UNICODE_BOM_CHARACTER_RUNE = 65279; | |
1630 let UTF8 = new Utf8Codec(); | |
1631 let _allowMalformed = Symbol('_allowMalformed'); | |
1632 class Utf8Codec extends Encoding { | |
1633 Utf8Codec(opt$) { | |
1634 let allowMalformed = opt$.allowMalformed === void 0 ? false : opt$.allowMa
lformed; | |
1635 this[_allowMalformed] = allowMalformed; | |
1636 super.Encoding(); | |
1637 } | |
1638 get name() { | |
1639 return "utf-8"; | |
1640 } | |
1641 decode(codeUnits, opt$) { | |
1642 let allowMalformed = opt$.allowMalformed === void 0 ? null : opt$.allowMal
formed; | |
1643 if (allowMalformed === null) | |
1644 allowMalformed = this[_allowMalformed]; | |
1645 return new Utf8Decoder({allowMalformed: allowMalformed}).convert(codeUnits
); | |
1646 } | |
1647 get encoder() { | |
1648 return new Utf8Encoder(); | |
1649 } | |
1650 get decoder() { | |
1651 return new Utf8Decoder({allowMalformed: this[_allowMalformed]}); | |
1652 } | |
1653 } | |
1654 class Utf8Encoder extends Converter$(core.String, core.List$(core.int)) { | |
1655 Utf8Encoder() { | |
1656 super.Converter(); | |
1657 } | |
1658 convert(string, start, end) { | |
1659 if (start === void 0) | |
1660 start = 0; | |
1661 if (end === void 0) | |
1662 end = null; | |
1663 let stringLength = string.length; | |
1664 core.RangeError.checkValidRange(start, end, stringLength); | |
1665 if (end === null) | |
1666 end = stringLength; | |
1667 let length = dart.notNull(end) - dart.notNull(start); | |
1668 if (length === 0) | |
1669 return new typed_data.Uint8List(0); | |
1670 let encoder = new _Utf8Encoder.withBufferSize(dart.notNull(length) * 3); | |
1671 let endPosition = encoder._fillBuffer(string, start, end); | |
1672 dart.assert(dart.notNull(endPosition) >= dart.notNull(end) - 1); | |
1673 if (endPosition !== end) { | |
1674 let lastCodeUnit = string.codeUnitAt(dart.notNull(end) - 1); | |
1675 dart.assert(_isLeadSurrogate(lastCodeUnit)); | |
1676 let wasCombined = encoder._writeSurrogate(lastCodeUnit, 0); | |
1677 dart.assert(!dart.notNull(wasCombined)); | |
1678 } | |
1679 return encoder[_buffer].sublist(0, encoder[_bufferIndex]); | |
1680 } | |
1681 startChunkedConversion(sink) { | |
1682 if (!dart.is(sink, ByteConversionSink)) { | |
1683 sink = new ByteConversionSink.from(sink); | |
1684 } | |
1685 return new _Utf8EncoderSink(dart.as(sink, ByteConversionSink)); | |
1686 } | |
1687 bind(stream) { | |
1688 return dart.as(super.bind(stream), async.Stream$(core.List$(core.int))); | |
1689 } | |
1690 } | |
1691 let _Utf8Encoder$withBufferSize = Symbol('_Utf8Encoder$withBufferSize'); | |
1692 let _createBuffer = Symbol('_createBuffer'); | |
1693 let _writeSurrogate = Symbol('_writeSurrogate'); | |
1694 let _fillBuffer = Symbol('_fillBuffer'); | |
1695 class _Utf8Encoder extends core.Object { | |
1696 _Utf8Encoder() { | |
1697 this[_Utf8Encoder$withBufferSize](_Utf8Encoder._DEFAULT_BYTE_BUFFER_SIZE); | |
1698 } | |
1699 _Utf8Encoder$withBufferSize(bufferSize) { | |
1700 this[_buffer] = _createBuffer(bufferSize); | |
1701 this[_carry] = 0; | |
1702 this[_bufferIndex] = 0; | |
1703 } | |
1704 static [_createBuffer](size) { | |
1705 return new typed_data.Uint8List(size); | |
1706 } | |
1707 [_writeSurrogate](leadingSurrogate, nextCodeUnit) { | |
1708 if (_isTailSurrogate(nextCodeUnit)) { | |
1709 let rune = _combineSurrogatePair(leadingSurrogate, nextCodeUnit); | |
1710 dart.assert(dart.notNull(rune) > dart.notNull(_THREE_BYTE_LIMIT)); | |
1711 dart.assert(dart.notNull(rune) <= dart.notNull(_FOUR_BYTE_LIMIT)); | |
1712 this[_buffer].set((($tmp) => this[_bufferIndex] = dart.notNull($tmp) + 1
, $tmp).bind(this)(this[_bufferIndex]), 240 | dart.notNull(rune) >> 18); | |
1713 this[_buffer].set((($tmp) => this[_bufferIndex] = dart.notNull($tmp) + 1
, $tmp).bind(this)(this[_bufferIndex]), 128 | dart.notNull(rune) >> 12 & 63); | |
1714 this[_buffer].set((($tmp) => this[_bufferIndex] = dart.notNull($tmp) + 1
, $tmp).bind(this)(this[_bufferIndex]), 128 | dart.notNull(rune) >> 6 & 63); | |
1715 this[_buffer].set((($tmp) => this[_bufferIndex] = dart.notNull($tmp) + 1
, $tmp).bind(this)(this[_bufferIndex]), 128 | dart.notNull(rune) & 63); | |
1716 return true; | |
1717 } else { | |
1718 this[_buffer].set((($tmp) => this[_bufferIndex] = dart.notNull($tmp) + 1
, $tmp).bind(this)(this[_bufferIndex]), 224 | dart.notNull(leadingSurrogate) >>
12); | |
1719 this[_buffer].set((($tmp) => this[_bufferIndex] = dart.notNull($tmp) + 1
, $tmp).bind(this)(this[_bufferIndex]), 128 | dart.notNull(leadingSurrogate) >>
6 & 63); | |
1720 this[_buffer].set((($tmp) => this[_bufferIndex] = dart.notNull($tmp) + 1
, $tmp).bind(this)(this[_bufferIndex]), 128 | dart.notNull(leadingSurrogate) & 6
3); | |
1721 return false; | |
1722 } | |
1723 } | |
1724 [_fillBuffer](str, start, end) { | |
1725 if (start !== end && dart.notNull(_isLeadSurrogate(str.codeUnitAt(dart.not
Null(end) - 1)))) { | |
1726 end = dart.notNull(end) - 1; | |
1727 } | |
1728 let stringIndex = null; | |
1729 for (stringIndex = start; dart.notNull(stringIndex) < dart.notNull(end); s
tringIndex = dart.notNull(stringIndex) + 1) { | |
1730 let codeUnit = str.codeUnitAt(stringIndex); | |
1731 if (dart.notNull(codeUnit) <= dart.notNull(_ONE_BYTE_LIMIT)) { | |
1732 if (dart.notNull(this[_bufferIndex]) >= dart.notNull(this[_buffer].len
gth)) | |
1733 break; | |
1734 this[_buffer].set((($tmp) => this[_bufferIndex] = dart.notNull($tmp) +
1, $tmp).bind(this)(this[_bufferIndex]), codeUnit); | |
1735 } else if (_isLeadSurrogate(codeUnit)) { | |
1736 if (dart.notNull(this[_bufferIndex]) + 3 >= dart.notNull(this[_buffer]
.length)) | |
1737 break; | |
1738 let nextCodeUnit = str.codeUnitAt(dart.notNull(stringIndex) + 1); | |
1739 let wasCombined = this[_writeSurrogate](codeUnit, nextCodeUnit); | |
1740 if (wasCombined) | |
1741 stringIndex = dart.notNull(stringIndex) + 1; | |
1742 } else { | |
1743 let rune = codeUnit; | |
1744 if (dart.notNull(rune) <= dart.notNull(_TWO_BYTE_LIMIT)) { | |
1745 if (dart.notNull(this[_bufferIndex]) + 1 >= dart.notNull(this[_buffe
r].length)) | |
1746 break; | |
1747 this[_buffer].set((($tmp) => this[_bufferIndex] = dart.notNull($tmp)
+ 1, $tmp).bind(this)(this[_bufferIndex]), 192 | dart.notNull(rune) >> 6); | |
1748 this[_buffer].set((($tmp) => this[_bufferIndex] = dart.notNull($tmp)
+ 1, $tmp).bind(this)(this[_bufferIndex]), 128 | dart.notNull(rune) & 63); | |
1749 } else { | |
1750 dart.assert(dart.notNull(rune) <= dart.notNull(_THREE_BYTE_LIMIT)); | |
1751 if (dart.notNull(this[_bufferIndex]) + 2 >= dart.notNull(this[_buffe
r].length)) | |
1752 break; | |
1753 this[_buffer].set((($tmp) => this[_bufferIndex] = dart.notNull($tmp)
+ 1, $tmp).bind(this)(this[_bufferIndex]), 224 | dart.notNull(rune) >> 12); | |
1754 this[_buffer].set((($tmp) => this[_bufferIndex] = dart.notNull($tmp)
+ 1, $tmp).bind(this)(this[_bufferIndex]), 128 | dart.notNull(rune) >> 6 & 63); | |
1755 this[_buffer].set((($tmp) => this[_bufferIndex] = dart.notNull($tmp)
+ 1, $tmp).bind(this)(this[_bufferIndex]), 128 | dart.notNull(rune) & 63); | |
1756 } | |
1757 } | |
1758 } | |
1759 return stringIndex; | |
1760 } | |
1761 } | |
1762 dart.defineNamedConstructor(_Utf8Encoder, 'withBufferSize'); | |
1763 _Utf8Encoder._DEFAULT_BYTE_BUFFER_SIZE = 1024; | |
1764 class _Utf8EncoderSink extends dart.mixin(_Utf8Encoder, StringConversionSinkMi
xin) { | |
1765 _Utf8EncoderSink($_sink) { | |
1766 this[_sink] = $_sink; | |
1767 super._Utf8Encoder(); | |
1768 } | |
1769 close() { | |
1770 if (this[_carry] !== 0) { | |
1771 this.addSlice("", 0, 0, true); | |
1772 return; | |
1773 } | |
1774 this[_sink].close(); | |
1775 } | |
1776 addSlice(str, start, end, isLast) { | |
1777 this[_bufferIndex] = 0; | |
1778 if (start === end && !dart.notNull(isLast)) { | |
1779 return; | |
1780 } | |
1781 if (this[_carry] !== 0) { | |
1782 let nextCodeUnit = 0; | |
1783 if (start !== end) { | |
1784 nextCodeUnit = str.codeUnitAt(start); | |
1785 } else { | |
1786 dart.assert(isLast); | |
1787 } | |
1788 let wasCombined = this[_writeSurrogate](this[_carry], nextCodeUnit); | |
1789 dart.assert(!dart.notNull(wasCombined) || start !== end); | |
1790 if (wasCombined) | |
1791 start = dart.notNull(start) + 1; | |
1792 this[_carry] = 0; | |
1793 } | |
1794 do { | |
1795 start = this[_fillBuffer](str, start, end); | |
1796 let isLastSlice = dart.notNull(isLast) && start === end; | |
1797 if (start === dart.notNull(end) - 1 && dart.notNull(_isLeadSurrogate(str
.codeUnitAt(start)))) { | |
1798 if (dart.notNull(isLast) && dart.notNull(this[_bufferIndex]) < dart.no
tNull(this[_buffer].length) - 3) { | |
1799 let hasBeenCombined = this[_writeSurrogate](str.codeUnitAt(start), 0
); | |
1800 dart.assert(!dart.notNull(hasBeenCombined)); | |
1801 } else { | |
1802 this[_carry] = str.codeUnitAt(start); | |
1803 } | |
1804 start = dart.notNull(start) + 1; | |
1805 } | |
1806 this[_sink].addSlice(this[_buffer], 0, this[_bufferIndex], isLastSlice); | |
1807 this[_bufferIndex] = 0; | |
1808 } while (dart.notNull(start) < dart.notNull(end)); | |
1809 if (isLast) | |
1810 this.close(); | |
1811 } | |
1812 } | |
1813 class Utf8Decoder extends Converter$(core.List$(core.int), core.String) { | |
1814 Utf8Decoder(opt$) { | |
1815 let allowMalformed = opt$.allowMalformed === void 0 ? false : opt$.allowMa
lformed; | |
1816 this[_allowMalformed] = allowMalformed; | |
1817 super.Converter(); | |
1818 } | |
1819 convert(codeUnits, start, end) { | |
1820 if (start === void 0) | |
1821 start = 0; | |
1822 if (end === void 0) | |
1823 end = null; | |
1824 let length = codeUnits.length; | |
1825 core.RangeError.checkValidRange(start, end, length); | |
1826 if (end === null) | |
1827 end = length; | |
1828 let buffer = new core.StringBuffer(); | |
1829 let decoder = new _Utf8Decoder(buffer, this[_allowMalformed]); | |
1830 decoder.convert(codeUnits, start, end); | |
1831 decoder.close(); | |
1832 return buffer.toString(); | |
1833 } | |
1834 startChunkedConversion(sink) { | |
1835 let stringSink = null; | |
1836 if (dart.is(sink, StringConversionSink)) { | |
1837 stringSink = sink; | |
1838 } else { | |
1839 stringSink = new StringConversionSink.from(sink); | |
1840 } | |
1841 return stringSink.asUtf8Sink(this[_allowMalformed]); | |
1842 } | |
1843 bind(stream) { | |
1844 return dart.as(super.bind(stream), async.Stream$(core.String)); | |
1845 } | |
1846 fuse(next) { | |
1847 return super.fuse(next); | |
1848 } | |
1849 } | |
1850 let _ONE_BYTE_LIMIT = 127; | |
1851 let _TWO_BYTE_LIMIT = 2047; | |
1852 let _THREE_BYTE_LIMIT = 65535; | |
1853 let _FOUR_BYTE_LIMIT = 1114111; | |
1854 let _SURROGATE_MASK = 63488; | |
1855 let _SURROGATE_TAG_MASK = 64512; | |
1856 let _SURROGATE_VALUE_MASK = 1023; | |
1857 let _LEAD_SURROGATE_MIN = 55296; | |
1858 let _TAIL_SURROGATE_MIN = 56320; | |
1859 // Function _isSurrogate: (int) → bool | |
1860 function _isSurrogate(codeUnit) { | |
1861 return (dart.notNull(codeUnit) & dart.notNull(_SURROGATE_MASK)) === _LEAD_SU
RROGATE_MIN; | |
1862 } | |
1863 // Function _isLeadSurrogate: (int) → bool | |
1864 function _isLeadSurrogate(codeUnit) { | |
1865 return (dart.notNull(codeUnit) & dart.notNull(_SURROGATE_TAG_MASK)) === _LEA
D_SURROGATE_MIN; | |
1866 } | |
1867 // Function _isTailSurrogate: (int) → bool | |
1868 function _isTailSurrogate(codeUnit) { | |
1869 return (dart.notNull(codeUnit) & dart.notNull(_SURROGATE_TAG_MASK)) === _TAI
L_SURROGATE_MIN; | |
1870 } | |
1871 // Function _combineSurrogatePair: (int, int) → int | |
1872 function _combineSurrogatePair(lead, tail) { | |
1873 return 65536 + ((dart.notNull(lead) & dart.notNull(_SURROGATE_VALUE_MASK)) <
< 10) | dart.notNull(tail) & dart.notNull(_SURROGATE_VALUE_MASK); | |
1874 } | |
1875 let _isFirstCharacter = Symbol('_isFirstCharacter'); | |
1876 let _value = Symbol('_value'); | |
1877 let _expectedUnits = Symbol('_expectedUnits'); | |
1878 let _extraUnits = Symbol('_extraUnits'); | |
1879 class _Utf8Decoder extends core.Object { | |
1880 _Utf8Decoder($_stringSink, $_allowMalformed) { | |
1881 this[_stringSink] = $_stringSink; | |
1882 this[_allowMalformed] = $_allowMalformed; | |
1883 this[_isFirstCharacter] = true; | |
1884 this[_value] = 0; | |
1885 this[_expectedUnits] = 0; | |
1886 this[_extraUnits] = 0; | |
1887 } | |
1888 get hasPartialInput() { | |
1889 return dart.notNull(this[_expectedUnits]) > 0; | |
1890 } | |
1891 close() { | |
1892 this.flush(); | |
1893 } | |
1894 flush() { | |
1895 if (this.hasPartialInput) { | |
1896 if (!dart.notNull(this[_allowMalformed])) { | |
1897 throw new core.FormatException("Unfinished UTF-8 octet sequence"); | |
1898 } | |
1899 this[_stringSink].writeCharCode(UNICODE_REPLACEMENT_CHARACTER_RUNE); | |
1900 this[_value] = 0; | |
1901 this[_expectedUnits] = 0; | |
1902 this[_extraUnits] = 0; | |
1903 } | |
1904 } | |
1905 convert(codeUnits, startIndex, endIndex) { | |
1906 let value = this[_value]; | |
1907 let expectedUnits = this[_expectedUnits]; | |
1908 let extraUnits = this[_extraUnits]; | |
1909 this[_value] = 0; | |
1910 this[_expectedUnits] = 0; | |
1911 this[_extraUnits] = 0; | |
1912 // Function scanOneByteCharacters: (dynamic, int) → int | |
1913 function scanOneByteCharacters(units, from) { | |
1914 let to = endIndex; | |
1915 let mask = _ONE_BYTE_LIMIT; | |
1916 for (let i = from; dart.notNull(i) < dart.notNull(to); i = dart.notNull(
i) + 1) { | |
1917 let unit = dart.dindex(units, i); | |
1918 if (!dart.equals(dart.dbinary(unit, '&', mask), unit)) | |
1919 return dart.notNull(i) - dart.notNull(from); | |
1920 } | |
1921 return dart.notNull(to) - dart.notNull(from); | |
1922 } | |
1923 // Function addSingleBytes: (int, int) → void | |
1924 function addSingleBytes(from, to) { | |
1925 dart.assert(dart.notNull(from) >= dart.notNull(startIndex) && dart.notNu
ll(from) <= dart.notNull(endIndex)); | |
1926 dart.assert(dart.notNull(to) >= dart.notNull(startIndex) && dart.notNull
(to) <= dart.notNull(endIndex)); | |
1927 this[_stringSink].write(new core.String.fromCharCodes(codeUnits, from, t
o)); | |
1928 } | |
1929 let i = startIndex; | |
1930 loop: | |
1931 while (true) { | |
1932 multibyte: | |
1933 if (dart.notNull(expectedUnits) > 0) { | |
1934 do { | |
1935 if (i === endIndex) { | |
1936 break loop; | |
1937 } | |
1938 let unit = codeUnits.get(i); | |
1939 if ((dart.notNull(unit) & 192) !== 128) { | |
1940 expectedUnits = 0; | |
1941 if (!dart.notNull(this[_allowMalformed])) { | |
1942 throw new core.FormatException(`Bad UTF-8 encoding 0x${unit.
toRadixString(16)}`); | |
1943 } | |
1944 this[_isFirstCharacter] = false; | |
1945 this[_stringSink].writeCharCode(UNICODE_REPLACEMENT_CHARACTER_
RUNE); | |
1946 break multibyte; | |
1947 } else { | |
1948 value = dart.notNull(value) << 6 | dart.notNull(unit) & 63; | |
1949 expectedUnits = dart.notNull(expectedUnits) - 1; | |
1950 i = dart.notNull(i) + 1; | |
1951 } | |
1952 } while (dart.notNull(expectedUnits) > 0); | |
1953 if (dart.notNull(value) <= dart.notNull(_Utf8Decoder._LIMITS.get(d
art.notNull(extraUnits) - 1))) { | |
1954 if (!dart.notNull(this[_allowMalformed])) { | |
1955 throw new core.FormatException(`Overlong encoding of 0x${value
.toRadixString(16)}`); | |
1956 } | |
1957 expectedUnits = extraUnits = 0; | |
1958 value = UNICODE_REPLACEMENT_CHARACTER_RUNE; | |
1959 } | |
1960 if (dart.notNull(value) > dart.notNull(_FOUR_BYTE_LIMIT)) { | |
1961 if (!dart.notNull(this[_allowMalformed])) { | |
1962 throw new core.FormatException("Character outside valid Unicod
e range: " + `0x${value.toRadixString(16)}`); | |
1963 } | |
1964 value = UNICODE_REPLACEMENT_CHARACTER_RUNE; | |
1965 } | |
1966 if (!dart.notNull(this[_isFirstCharacter]) || value !== UNICODE_BO
M_CHARACTER_RUNE) { | |
1967 this[_stringSink].writeCharCode(value); | |
1968 } | |
1969 this[_isFirstCharacter] = false; | |
1970 } | |
1971 while (dart.notNull(i) < dart.notNull(endIndex)) { | |
1972 let oneBytes = scanOneByteCharacters(codeUnits, i); | |
1973 if (dart.notNull(oneBytes) > 0) { | |
1974 this[_isFirstCharacter] = false; | |
1975 addSingleBytes(i, dart.notNull(i) + dart.notNull(oneBytes)); | |
1976 i = oneBytes; | |
1977 if (i === endIndex) | |
1978 break; | |
1979 } | |
1980 let unit = codeUnits.get((($tmp) => i = dart.notNull($tmp) + 1, $tmp
)(i)); | |
1981 if (dart.notNull(unit) < 0) { | |
1982 if (!dart.notNull(this[_allowMalformed])) { | |
1983 throw new core.FormatException(`Negative UTF-8 code unit: -0x${(
-dart.notNull(unit)).toRadixString(16)}`); | |
1984 } | |
1985 this[_stringSink].writeCharCode(UNICODE_REPLACEMENT_CHARACTER_RUNE
); | |
1986 } else { | |
1987 dart.assert(dart.notNull(unit) > dart.notNull(_ONE_BYTE_LIMIT)); | |
1988 if ((dart.notNull(unit) & 224) === 192) { | |
1989 value = dart.notNull(unit) & 31; | |
1990 expectedUnits = extraUnits = 1; | |
1991 continue loop; | |
1992 } | |
1993 if ((dart.notNull(unit) & 240) === 224) { | |
1994 value = dart.notNull(unit) & 15; | |
1995 expectedUnits = extraUnits = 2; | |
1996 continue loop; | |
1997 } | |
1998 if ((dart.notNull(unit) & 248) === 240 && dart.notNull(unit) < 245
) { | |
1999 value = dart.notNull(unit) & 7; | |
2000 expectedUnits = extraUnits = 3; | |
2001 continue loop; | |
2002 } | |
2003 if (!dart.notNull(this[_allowMalformed])) { | |
2004 throw new core.FormatException(`Bad UTF-8 encoding 0x${unit.toRa
dixString(16)}`); | |
2005 } | |
2006 value = UNICODE_REPLACEMENT_CHARACTER_RUNE; | |
2007 expectedUnits = extraUnits = 0; | |
2008 this[_isFirstCharacter] = false; | |
2009 this[_stringSink].writeCharCode(value); | |
2010 } | |
2011 } | |
2012 break loop; | |
2013 } | |
2014 if (dart.notNull(expectedUnits) > 0) { | |
2015 this[_value] = value; | |
2016 this[_expectedUnits] = expectedUnits; | |
2017 this[_extraUnits] = extraUnits; | |
2018 } | |
2019 } | |
2020 } | |
2021 _Utf8Decoder._LIMITS = /* Unimplemented const */new List.from([_ONE_BYTE_LIMIT
, _TWO_BYTE_LIMIT, _THREE_BYTE_LIMIT, _FOUR_BYTE_LIMIT]); | |
2022 let _processed = Symbol('_processed'); | |
2023 let _original = Symbol('_original'); | |
2024 // Function _convertJsonToDart: (dynamic, (dynamic, dynamic) → dynamic) → dyna
mic | |
2025 function _convertJsonToDart(json, reviver) { | |
2026 dart.assert(reviver !== null); | |
2027 // Function walk: (dynamic) → dynamic | |
2028 function walk(e) { | |
2029 if (e == null || typeof e != "object") { | |
2030 return e; | |
2031 } | |
2032 if (Object.getPrototypeOf(e) === Array.prototype) { | |
2033 for (let i = 0; dart.notNull(i) < e.length; i = dart.notNull(i) + 1) { | |
2034 let item = e[i]; | |
2035 e[i] = dart.dinvokef(reviver, i, walk(item)); | |
2036 } | |
2037 return e; | |
2038 } | |
2039 let map = new _JsonMap(e); | |
2040 let processed = map[_processed]; | |
2041 let keys = map._computeKeys(); | |
2042 for (let i = 0; dart.notNull(i) < dart.notNull(keys.length); i = dart.notN
ull(i) + 1) { | |
2043 let key = keys.get(i); | |
2044 let revived = dart.dinvokef(reviver, key, walk(e[key])); | |
2045 processed[key] = revived; | |
2046 } | |
2047 map[_original] = processed; | |
2048 return map; | |
2049 } | |
2050 return dart.dinvokef(reviver, null, walk(json)); | |
2051 } | |
2052 // Function _convertJsonToDartLazy: (dynamic) → dynamic | |
2053 function _convertJsonToDartLazy(object) { | |
2054 if (object === null) | |
2055 return null; | |
2056 if (typeof object != "object") { | |
2057 return object; | |
2058 } | |
2059 if (Object.getPrototypeOf(object) !== Array.prototype) { | |
2060 return new _JsonMap(object); | |
2061 } | |
2062 for (let i = 0; dart.notNull(i) < object.length; i = dart.notNull(i) + 1) { | |
2063 let item = object[i]; | |
2064 object[i] = _convertJsonToDartLazy(item); | |
2065 } | |
2066 return object; | |
2067 } | |
2068 let _data = Symbol('_data'); | |
2069 let _isUpgraded = Symbol('_isUpgraded'); | |
2070 let _upgradedMap = Symbol('_upgradedMap'); | |
2071 let _process = Symbol('_process'); | |
2072 let _computeKeys = Symbol('_computeKeys'); | |
2073 let _upgrade = Symbol('_upgrade'); | |
2074 let _hasProperty = Symbol('_hasProperty'); | |
2075 let _getProperty = Symbol('_getProperty'); | |
2076 let _setProperty = Symbol('_setProperty'); | |
2077 let _getPropertyNames = Symbol('_getPropertyNames'); | |
2078 let _isUnprocessed = Symbol('_isUnprocessed'); | |
2079 let _newJavaScriptObject = Symbol('_newJavaScriptObject'); | |
2080 class _JsonMap extends core.Object { | |
2081 _JsonMap($_original) { | |
2082 this[_processed] = _newJavaScriptObject(); | |
2083 this[_original] = $_original; | |
2084 this[_data] = null; | |
2085 } | |
2086 get(key) { | |
2087 if (this[_isUpgraded]) { | |
2088 return this[_upgradedMap].get(key); | |
2089 } else if (!(typeof key == string)) { | |
2090 return null; | |
2091 } else { | |
2092 let result = _getProperty(this[_processed], dart.as(key, core.String)); | |
2093 if (_isUnprocessed(result)) | |
2094 result = this[_process](dart.as(key, core.String)); | |
2095 return result; | |
2096 } | |
2097 } | |
2098 get length() { | |
2099 return this[_isUpgraded] ? this[_upgradedMap].length : this[_computeKeys](
).length; | |
2100 } | |
2101 get isEmpty() { | |
2102 return this.length === 0; | |
2103 } | |
2104 get isNotEmpty() { | |
2105 return dart.notNull(this.length) > 0; | |
2106 } | |
2107 get keys() { | |
2108 if (this[_isUpgraded]) | |
2109 return this[_upgradedMap].keys; | |
2110 return new _JsonMapKeyIterable(this); | |
2111 } | |
2112 get values() { | |
2113 if (this[_isUpgraded]) | |
2114 return this[_upgradedMap].values; | |
2115 return new _internal.MappedIterable(this[_computeKeys](), ((each) => this.
get(each)).bind(this)); | |
2116 } | |
2117 set(key, value) { | |
2118 if (this[_isUpgraded]) { | |
2119 this[_upgradedMap].set(key, value); | |
2120 } else if (this.containsKey(key)) { | |
2121 let processed = this[_processed]; | |
2122 _setProperty(processed, dart.as(key, core.String), value); | |
2123 let original = this[_original]; | |
2124 if (!dart.notNull(core.identical(original, processed))) { | |
2125 _setProperty(original, dart.as(key, core.String), null); | |
2126 } | |
2127 } else { | |
2128 this[_upgrade]().set(key, value); | |
2129 } | |
2130 } | |
2131 addAll(other) { | |
2132 other.forEach(((key, value) => { | |
2133 this.set(key, value); | |
2134 }).bind(this)); | |
2135 } | |
2136 containsValue(value) { | |
2137 if (this[_isUpgraded]) | |
2138 return this[_upgradedMap].containsValue(value); | |
2139 let keys = this[_computeKeys](); | |
2140 for (let i = 0; dart.notNull(i) < dart.notNull(keys.length); i = dart.notN
ull(i) + 1) { | |
2141 let key = keys.get(i); | |
2142 if (dart.equals(this.get(key), value)) | |
2143 return true; | |
2144 } | |
2145 return false; | |
2146 } | |
2147 containsKey(key) { | |
2148 if (this[_isUpgraded]) | |
2149 return this[_upgradedMap].containsKey(key); | |
2150 if (!(typeof key == string)) | |
2151 return false; | |
2152 return _hasProperty(this[_original], dart.as(key, core.String)); | |
2153 } | |
2154 putIfAbsent(key, ifAbsent) { | |
2155 if (this.containsKey(key)) | |
2156 return this.get(key); | |
2157 let value = ifAbsent(); | |
2158 this.set(key, value); | |
2159 return value; | |
2160 } | |
2161 remove(key) { | |
2162 if (!dart.notNull(this[_isUpgraded]) && !dart.notNull(this.containsKey(key
))) | |
2163 return null; | |
2164 return this[_upgrade]().remove(key); | |
2165 } | |
2166 clear() { | |
2167 if (this[_isUpgraded]) { | |
2168 this[_upgradedMap].clear(); | |
2169 } else { | |
2170 if (this[_data] !== null) { | |
2171 dart.dinvoke(this[_data], 'clear'); | |
2172 } | |
2173 this[_original] = this[_processed] = null; | |
2174 this[_data] = dart.map(); | |
2175 } | |
2176 } | |
2177 forEach(f) { | |
2178 if (this[_isUpgraded]) | |
2179 return this[_upgradedMap].forEach(f); | |
2180 let keys = this[_computeKeys](); | |
2181 for (let i = 0; dart.notNull(i) < dart.notNull(keys.length); i = dart.notN
ull(i) + 1) { | |
2182 let key = keys.get(i); | |
2183 let value = _getProperty(this[_processed], key); | |
2184 if (_isUnprocessed(value)) { | |
2185 value = _convertJsonToDartLazy(_getProperty(this[_original], key)); | |
2186 _setProperty(this[_processed], key, value); | |
2187 } | |
2188 dart.dinvokef(f, key, value); | |
2189 if (!dart.notNull(core.identical(keys, this[_data]))) { | |
2190 throw new core.ConcurrentModificationError(this); | |
2191 } | |
2192 } | |
2193 } | |
2194 toString() { | |
2195 return collection.Maps.mapToString(this); | |
2196 } | |
2197 get [_isUpgraded]() { | |
2198 return this[_processed] === null; | |
2199 } | |
2200 get [_upgradedMap]() { | |
2201 dart.assert(this[_isUpgraded]); | |
2202 return dart.as(this[_data], core.Map); | |
2203 } | |
2204 [_computeKeys]() { | |
2205 dart.assert(!dart.notNull(this[_isUpgraded])); | |
2206 let keys = dart.as(this[_data], core.List); | |
2207 if (keys === null) { | |
2208 keys = this[_data] = _getPropertyNames(this[_original]); | |
2209 } | |
2210 return dart.as(keys, core.List$(core.String)); | |
2211 } | |
2212 [_upgrade]() { | |
2213 if (this[_isUpgraded]) | |
2214 return this[_upgradedMap]; | |
2215 let result = dart.map(); | |
2216 let keys = this[_computeKeys](); | |
2217 for (let i = 0; dart.notNull(i) < dart.notNull(keys.length); i = dart.notN
ull(i) + 1) { | |
2218 let key = keys.get(i); | |
2219 result.set(key, this.get(key)); | |
2220 } | |
2221 if (keys.isEmpty) { | |
2222 keys.add(null); | |
2223 } else { | |
2224 keys.clear(); | |
2225 } | |
2226 this[_original] = this[_processed] = null; | |
2227 this[_data] = result; | |
2228 dart.assert(this[_isUpgraded]); | |
2229 return result; | |
2230 } | |
2231 [_process](key) { | |
2232 if (!dart.notNull(_hasProperty(this[_original], key))) | |
2233 return null; | |
2234 let result = _convertJsonToDartLazy(_getProperty(this[_original], key)); | |
2235 return _setProperty(this[_processed], key, result); | |
2236 } | |
2237 static [_hasProperty](object, key) { | |
2238 return Object.prototype.hasOwnProperty.call(object, key); | |
2239 } | |
2240 static [_getProperty](object, key) { | |
2241 return object[key]; | |
2242 } | |
2243 static [_setProperty](object, key, value) { | |
2244 return object[key] = value; | |
2245 } | |
2246 static [_getPropertyNames](object) { | |
2247 return dart.as(Object.keys(object), core.List); | |
2248 } | |
2249 static [_isUnprocessed](object) { | |
2250 return typeof object == "undefined"; | |
2251 } | |
2252 static [_newJavaScriptObject]() { | |
2253 return Object.create(null); | |
2254 } | |
2255 } | |
2256 let _parent = Symbol('_parent'); | |
2257 class _JsonMapKeyIterable extends _internal.ListIterable { | |
2258 _JsonMapKeyIterable($_parent) { | |
2259 this[_parent] = $_parent; | |
2260 super.ListIterable(); | |
2261 } | |
2262 get length() { | |
2263 return this[_parent].length; | |
2264 } | |
2265 elementAt(index) { | |
2266 return dart.as(this[_parent][_isUpgraded] ? this[_parent].keys.elementAt(i
ndex) : this[_parent]._computeKeys().get(index), core.String); | |
2267 } | |
2268 get iterator() { | |
2269 return dart.as(this[_parent][_isUpgraded] ? this[_parent].keys.iterator :
this[_parent]._computeKeys().iterator, core.Iterator); | |
2270 } | |
2271 contains(key) { | |
2272 return this[_parent].containsKey(key); | |
2273 } | |
2274 } | |
2275 class _JsonDecoderSink extends _StringSinkConversionSink { | |
2276 _JsonDecoderSink($_reviver, $_sink) { | |
2277 this[_reviver] = $_reviver; | |
2278 this[_sink] = $_sink; | |
2279 super._StringSinkConversionSink(new core.StringBuffer()); | |
2280 } | |
2281 close() { | |
2282 super.close(); | |
2283 let buffer = dart.as(this[_stringSink], core.StringBuffer); | |
2284 let accumulated = buffer.toString(); | |
2285 buffer.clear(); | |
2286 let decoded = _parseJson(accumulated, this[_reviver]); | |
2287 this[_sink].add(decoded); | |
2288 this[_sink].close(); | |
2289 } | |
2290 } | |
2291 // Exports: | |
2292 exports.ASCII = ASCII; | |
2293 exports.AsciiCodec = AsciiCodec; | |
2294 exports.Encoding = Encoding; | |
2295 exports.Codec = Codec; | |
2296 exports.Codec$ = Codec$; | |
2297 exports.Converter = Converter; | |
2298 exports.Converter$ = Converter$; | |
2299 exports.AsciiEncoder = AsciiEncoder; | |
2300 exports.StringConversionSinkBase = StringConversionSinkBase; | |
2301 exports.StringConversionSinkMixin = StringConversionSinkMixin; | |
2302 exports.AsciiDecoder = AsciiDecoder; | |
2303 exports.ByteConversionSinkBase = ByteConversionSinkBase; | |
2304 exports.ByteConversionSink = ByteConversionSink; | |
2305 exports.ChunkedConversionSink = ChunkedConversionSink; | |
2306 exports.ChunkedConversionSink$ = ChunkedConversionSink$; | |
2307 exports.HTML_ESCAPE = HTML_ESCAPE; | |
2308 exports.HtmlEscapeMode = HtmlEscapeMode; | |
2309 exports.HtmlEscape = HtmlEscape; | |
2310 exports.JsonUnsupportedObjectError = JsonUnsupportedObjectError; | |
2311 exports.JsonCyclicError = JsonCyclicError; | |
2312 exports.JSON = JSON; | |
2313 exports.JsonCodec = JsonCodec; | |
2314 exports.JsonEncoder = JsonEncoder; | |
2315 exports.JsonUtf8Encoder = JsonUtf8Encoder; | |
2316 exports.JsonDecoder = JsonDecoder; | |
2317 exports.LATIN1 = LATIN1; | |
2318 exports.Latin1Codec = Latin1Codec; | |
2319 exports.Latin1Encoder = Latin1Encoder; | |
2320 exports.Latin1Decoder = Latin1Decoder; | |
2321 exports.LineSplitter = LineSplitter; | |
2322 exports.StringConversionSink = StringConversionSink; | |
2323 exports.ClosableStringSink = ClosableStringSink; | |
2324 exports.UNICODE_REPLACEMENT_CHARACTER_RUNE = UNICODE_REPLACEMENT_CHARACTER_RUN
E; | |
2325 exports.UNICODE_BOM_CHARACTER_RUNE = UNICODE_BOM_CHARACTER_RUNE; | |
2326 exports.UTF8 = UTF8; | |
2327 exports.Utf8Codec = Utf8Codec; | |
2328 exports.Utf8Encoder = Utf8Encoder; | |
2329 exports.Utf8Decoder = Utf8Decoder; | |
2330 })(convert || (convert = {})); | |
OLD | NEW |