Line data Source code
1 : import 'dart:convert';
2 : import 'dart:math';
3 :
4 : /// Extension for strings.
5 : extension StringExtensions on String {
6 : /// Try to format embedded JSON in a string.
7 4 : String get prettyJson {
8 4 : final start = <int>[];
9 4 : final end = <int>[];
10 : var depth = 0;
11 12 : for (var i = 0; i < length; i++) {
12 8 : if (this[i] == '{') {
13 1 : if (depth == 0) {
14 1 : start.add(i);
15 : }
16 1 : depth++;
17 : }
18 11 : if (this[i] == '}' && start.length > end.length) {
19 1 : depth--;
20 1 : if (depth == 0) {
21 1 : end.add(i);
22 : }
23 : }
24 : }
25 :
26 4 : final substrings = <(int, int, bool)>[];
27 : var prev = 0;
28 17 : for (var i = 0; i < min(start.length, end.length); i++) {
29 : substrings
30 2 : ..add((prev, start[i], false))
31 4 : ..add((start[i], end[i] + 1, true));
32 2 : prev = end[i] + 1;
33 : }
34 :
35 : substrings
36 8 : ..add((prev, length, false))
37 12 : ..removeWhere((tuple) => tuple.$1 == tuple.$2);
38 :
39 4 : final buffer = StringBuffer();
40 :
41 12 : for (var i = 0; i < substrings.length; i++) {
42 12 : final sub = substring(substrings[i].$1, substrings[i].$2);
43 4 : final form = _tryToFormatJson(sub);
44 :
45 4 : buffer.write(form);
46 : }
47 :
48 4 : return buffer.toString();
49 : }
50 :
51 4 : String _tryToFormatJson(String json) {
52 : try {
53 7 : return '''\n ${_jsonEncoder.convert(jsonDecode(json)).replaceAll('\n', '\n ')}\n''';
54 : } catch (e) {
55 : return json;
56 : }
57 : }
58 :
59 : static const _jsonEncoder = JsonEncoder.withIndent(' ');
60 : }
|