PrettyPrintDecorator.cpp 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. /*
  2. * Arduino JSON library
  3. * Benoit Blanchon 2014 - MIT License
  4. */
  5. #include "PrettyPrintDecorator.h"
  6. size_t PrettyPrintDecorator::write(uint8_t c)
  7. {
  8. size_t n = inString ? handleStringChar(c) : handleMarkupChar(c);
  9. previousChar = c;
  10. return n;
  11. }
  12. size_t PrettyPrintDecorator::handleStringChar(uint8_t c)
  13. {
  14. bool isQuote = c == '"' && previousChar != '\\';
  15. if (isQuote) inString = false;
  16. return sink.write(c);
  17. }
  18. size_t PrettyPrintDecorator::handleMarkupChar(uint8_t c)
  19. {
  20. switch (c)
  21. {
  22. case '{':
  23. case '[':
  24. return writeOpening(c);
  25. case '}':
  26. case ']':
  27. return writeClosing(c);
  28. case ',':
  29. return writeComma();
  30. case ':':
  31. return writeColumn();
  32. case '"':
  33. return writeQuote();
  34. default:
  35. return writeValueChar(c);
  36. }
  37. }
  38. size_t PrettyPrintDecorator::writeValueChar(uint8_t c)
  39. {
  40. return inEmptyBlock() ? writeLineBreak() + sink.write(c) : sink.write(c);
  41. }
  42. size_t PrettyPrintDecorator::writeColumn()
  43. {
  44. return sink.write(':') + sink.write(' ');
  45. }
  46. size_t PrettyPrintDecorator::writeComma()
  47. {
  48. return sink.write(',') + writeLineBreak();
  49. }
  50. size_t PrettyPrintDecorator::writeOpening(uint8_t c)
  51. {
  52. size_t n = inEmptyBlock() ? writeLineBreak() + sink.write(c) : sink.write(c);
  53. indent++;
  54. return n;
  55. }
  56. size_t PrettyPrintDecorator::writeQuote()
  57. {
  58. size_t n = inEmptyBlock() ? writeLineBreak() + sink.write('"') : sink.write('"');
  59. inString = true;
  60. return n;
  61. }
  62. size_t PrettyPrintDecorator::writeClosing(uint8_t c)
  63. {
  64. indent--;
  65. return inEmptyBlock() ? sink.write(c) : writeLineBreak() + sink.write(c);
  66. }
  67. size_t PrettyPrintDecorator::writeLineBreak()
  68. {
  69. size_t n = sink.write('\n');
  70. for (int i = 0; i < indent; i++)
  71. n += sink.write(' ');
  72. return n;
  73. }