From be4491fc1d745aa831835d93c9beb56514b7bc51 Mon Sep 17 00:00:00 2001 From: Lemongrass3110 Date: Tue, 25 Jun 2019 22:40:26 +0200 Subject: [PATCH] Added ability to emit folded strings --- include/yaml-cpp/emittermanip.h | 1 + src/emitter.cpp | 5 ++++- src/emitterstate.cpp | 1 + src/emitterutils.cpp | 21 +++++++++++++++++++++ src/emitterutils.h | 4 +++- 5 files changed, 30 insertions(+), 2 deletions(-) diff --git a/include/yaml-cpp/emittermanip.h b/include/yaml-cpp/emittermanip.h index 89f7256..b86a471 100644 --- a/include/yaml-cpp/emittermanip.h +++ b/include/yaml-cpp/emittermanip.h @@ -25,6 +25,7 @@ enum EMITTER_MANIP { SingleQuoted, DoubleQuoted, Literal, + Folded, // bool manipulators YesNoBool, // yes, no diff --git a/src/emitter.cpp b/src/emitter.cpp index 016beb1..2debca6 100644 --- a/src/emitter.cpp +++ b/src/emitter.cpp @@ -681,7 +681,7 @@ Emitter& Emitter::Write(const std::string& str) { Utils::ComputeStringFormat(str, m_pState->GetStringFormat(), m_pState->CurGroupFlowType(), escapeNonAscii); - if (strFormat == StringFormat::Literal) + if (strFormat == StringFormat::Literal || strFormat == StringFormat::Folded) m_pState->SetMapKeyFormat(YAML::LongKey, FmtScope::Local); PrepareNode(EmitterNodeType::Scalar); @@ -699,6 +699,9 @@ Emitter& Emitter::Write(const std::string& str) { case StringFormat::Literal: Utils::WriteLiteralString(m_stream, str, m_pState->CurIndent() + m_pState->GetIndent()); + case StringFormat::Folded: + Utils::WriteFoldedString(m_stream, str, + m_pState->CurIndent() + m_pState->GetIndent()); break; } diff --git a/src/emitterstate.cpp b/src/emitterstate.cpp index 890b4f0..8445539 100644 --- a/src/emitterstate.cpp +++ b/src/emitterstate.cpp @@ -238,6 +238,7 @@ bool EmitterState::SetStringFormat(EMITTER_MANIP value, FmtScope::value scope) { case SingleQuoted: case DoubleQuoted: case Literal: + case Folded: _Set(m_strFmt, value, scope); return true; default: diff --git a/src/emitterutils.cpp b/src/emitterutils.cpp index e348599..d8030c8 100644 --- a/src/emitterutils.cpp +++ b/src/emitterutils.cpp @@ -282,6 +282,11 @@ StringFormat::value ComputeStringFormat(const std::string& str, return StringFormat::Literal; } return StringFormat::DoubleQuoted; + case Folded: + if (IsValidLiteralScalar(str, flowType, escapeNonAscii)) { + return StringFormat::Folded; + } + return StringFormat::DoubleQuoted; default: break; } @@ -369,6 +374,22 @@ bool WriteLiteralString(ostream_wrapper& out, const std::string& str, return true; } +bool WriteFoldedString(ostream_wrapper& out, const std::string& str, + std::size_t indent) { + out << ">\n"; + out << IndentTo(indent); + int codePoint; + for (std::string::const_iterator i = str.begin(); + GetNextCodePointAndAdvance(codePoint, i, str.end());) { + if (codePoint == '\n') { + out << "\n" << IndentTo(indent); + } else { + WriteCodePoint(out, codePoint); + } + } + return true; +} + bool WriteChar(ostream_wrapper& out, char ch) { if (('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z')) { out << ch; diff --git a/src/emitterutils.h b/src/emitterutils.h index 6cc7319..2ee7992 100644 --- a/src/emitterutils.h +++ b/src/emitterutils.h @@ -21,7 +21,7 @@ namespace YAML { class Binary; struct StringFormat { - enum value { Plain, SingleQuoted, DoubleQuoted, Literal }; + enum value { Plain, SingleQuoted, DoubleQuoted, Literal, Folded }; }; namespace Utils { @@ -35,6 +35,8 @@ bool WriteDoubleQuotedString(ostream_wrapper& out, const std::string& str, bool escapeNonAscii); bool WriteLiteralString(ostream_wrapper& out, const std::string& str, std::size_t indent); +bool WriteFoldedString(ostream_wrapper& out, const std::string& str, + std::size_t indent); bool WriteChar(ostream_wrapper& out, char ch); bool WriteComment(ostream_wrapper& out, const std::string& str, std::size_t postCommentIndent);