1 | // Copyright Benoit Blanchon 2014-2016
|
---|
2 | // MIT License
|
---|
3 | //
|
---|
4 | // Arduino JSON library
|
---|
5 | // https://github.com/bblanchon/ArduinoJson
|
---|
6 | // If you like this project, please add a star!
|
---|
7 |
|
---|
8 | #include "../../include/ArduinoJson/Internals/Prettyfier.hpp"
|
---|
9 |
|
---|
10 | using namespace ArduinoJson::Internals;
|
---|
11 |
|
---|
12 | size_t Prettyfier::write(uint8_t c) {
|
---|
13 | size_t n = _inString ? handleStringChar(c) : handleMarkupChar(c);
|
---|
14 | _previousChar = c;
|
---|
15 | return n;
|
---|
16 | }
|
---|
17 |
|
---|
18 | inline size_t Prettyfier::handleStringChar(uint8_t c) {
|
---|
19 | bool isQuote = c == '"' && _previousChar != '\\';
|
---|
20 |
|
---|
21 | if (isQuote) _inString = false;
|
---|
22 |
|
---|
23 | return _sink.write(c);
|
---|
24 | }
|
---|
25 |
|
---|
26 | inline size_t Prettyfier::handleMarkupChar(uint8_t c) {
|
---|
27 | switch (c) {
|
---|
28 | case '{':
|
---|
29 | case '[':
|
---|
30 | return handleBlockOpen(c);
|
---|
31 |
|
---|
32 | case '}':
|
---|
33 | case ']':
|
---|
34 | return handleBlockClose(c);
|
---|
35 |
|
---|
36 | case ':':
|
---|
37 | return handleColon();
|
---|
38 |
|
---|
39 | case ',':
|
---|
40 | return handleComma();
|
---|
41 |
|
---|
42 | case '"':
|
---|
43 | return handleQuoteOpen();
|
---|
44 |
|
---|
45 | default:
|
---|
46 | return handleNormalChar(c);
|
---|
47 | }
|
---|
48 | }
|
---|
49 |
|
---|
50 | inline size_t Prettyfier::handleBlockOpen(uint8_t c) {
|
---|
51 | return indentIfNeeded() + _sink.write(c);
|
---|
52 | }
|
---|
53 |
|
---|
54 | inline size_t Prettyfier::handleBlockClose(uint8_t c) {
|
---|
55 | return unindentIfNeeded() + _sink.write(c);
|
---|
56 | }
|
---|
57 |
|
---|
58 | inline size_t Prettyfier::handleColon() {
|
---|
59 | return _sink.write(':') + _sink.write(' ');
|
---|
60 | }
|
---|
61 |
|
---|
62 | inline size_t Prettyfier::handleComma() {
|
---|
63 | return _sink.write(',') + _sink.println();
|
---|
64 | }
|
---|
65 |
|
---|
66 | inline size_t Prettyfier::handleQuoteOpen() {
|
---|
67 | _inString = true;
|
---|
68 | return indentIfNeeded() + _sink.write('"');
|
---|
69 | }
|
---|
70 |
|
---|
71 | inline size_t Prettyfier::handleNormalChar(uint8_t c) {
|
---|
72 | return indentIfNeeded() + _sink.write(c);
|
---|
73 | }
|
---|
74 |
|
---|
75 | size_t Prettyfier::indentIfNeeded() {
|
---|
76 | if (!inEmptyBlock()) return 0;
|
---|
77 |
|
---|
78 | _sink.indent();
|
---|
79 | return _sink.println();
|
---|
80 | }
|
---|
81 |
|
---|
82 | size_t Prettyfier::unindentIfNeeded() {
|
---|
83 | if (inEmptyBlock()) return 0;
|
---|
84 |
|
---|
85 | _sink.unindent();
|
---|
86 | return _sink.println();
|
---|
87 | }
|
---|