|
|
@@ -0,0 +1,85 @@
|
|
|
+/*
|
|
|
+* Arduino JSON library
|
|
|
+* Benoit Blanchon 2014 - MIT License
|
|
|
+*/
|
|
|
+
|
|
|
+#include "../../include/ArduinoJson/Internals/Prettyfier.hpp"
|
|
|
+
|
|
|
+using namespace ArduinoJson::Internals;
|
|
|
+
|
|
|
+size_t Prettyfier::write(uint8_t c) {
|
|
|
+ size_t n = _inString ? handleStringChar(c) : handleMarkupChar(c);
|
|
|
+ _previousChar = c;
|
|
|
+ return n;
|
|
|
+}
|
|
|
+
|
|
|
+inline size_t Prettyfier::handleStringChar(uint8_t c) {
|
|
|
+ bool isQuote = c == '"' && _previousChar != '\\';
|
|
|
+
|
|
|
+ if (isQuote) _inString = false;
|
|
|
+
|
|
|
+ return _sink.write(c);
|
|
|
+}
|
|
|
+
|
|
|
+inline size_t Prettyfier::handleMarkupChar(uint8_t c) {
|
|
|
+ switch (c) {
|
|
|
+ case '{':
|
|
|
+ case '[':
|
|
|
+ return handleBlockOpen(c);
|
|
|
+
|
|
|
+ case '}':
|
|
|
+ case ']':
|
|
|
+ return handleBlockClose(c);
|
|
|
+
|
|
|
+ case ':':
|
|
|
+ return handleColumn();
|
|
|
+
|
|
|
+ case ',':
|
|
|
+ return handleComma();
|
|
|
+
|
|
|
+ case '"':
|
|
|
+ return handleQuoteOpen();
|
|
|
+
|
|
|
+ default:
|
|
|
+ return handleNormalChar(c);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+inline size_t Prettyfier::handleBlockOpen(uint8_t c) {
|
|
|
+ return indentIfNeeded() + _sink.write(c);
|
|
|
+}
|
|
|
+
|
|
|
+inline size_t Prettyfier::handleBlockClose(uint8_t c) {
|
|
|
+ return unindentIfNeeded() + _sink.write(c);
|
|
|
+}
|
|
|
+
|
|
|
+inline size_t Prettyfier::handleColumn() {
|
|
|
+ return _sink.write(':') + _sink.write(' ');
|
|
|
+}
|
|
|
+
|
|
|
+inline size_t Prettyfier::handleComma() {
|
|
|
+ return _sink.write(',') + _sink.println();
|
|
|
+}
|
|
|
+
|
|
|
+inline size_t Prettyfier::handleQuoteOpen() {
|
|
|
+ _inString = true;
|
|
|
+ return indentIfNeeded() + _sink.write('"');
|
|
|
+}
|
|
|
+
|
|
|
+inline size_t Prettyfier::handleNormalChar(uint8_t c) {
|
|
|
+ return indentIfNeeded() + _sink.write(c);
|
|
|
+}
|
|
|
+
|
|
|
+size_t Prettyfier::indentIfNeeded() {
|
|
|
+ if (!inEmptyBlock()) return 0;
|
|
|
+
|
|
|
+ _sink.indent();
|
|
|
+ return _sink.println();
|
|
|
+}
|
|
|
+
|
|
|
+size_t Prettyfier::unindentIfNeeded() {
|
|
|
+ if (inEmptyBlock()) return 0;
|
|
|
+
|
|
|
+ _sink.unindent();
|
|
|
+ return _sink.println();
|
|
|
+}
|