diff --git a/include/yaml-cpp/emitter.h b/include/yaml-cpp/emitter.h index 4251bab..a37a2d7 100644 --- a/include/yaml-cpp/emitter.h +++ b/include/yaml-cpp/emitter.h @@ -93,6 +93,8 @@ namespace YAML void FlowMapPrepareNode(EmitterNodeType::value child); void BlockMapPrepareNode(EmitterNodeType::value child); + void SpaceOrIndentTo(bool requireSpace, unsigned indent); + const char *ComputeFullBoolName(bool b) const; bool CanEmitNewline() const; diff --git a/src/emitter.cpp b/src/emitter.cpp index a7cc60f..f411cf1 100644 --- a/src/emitter.cpp +++ b/src/emitter.cpp @@ -322,8 +322,11 @@ namespace YAML const unsigned curIndent = m_pState->CurIndent(); const unsigned nextIndent = curIndent + m_pState->CurGroupIndent(); - if(!m_pState->HasBegunNode()) { - if(m_pState->CurGroupChildCount() > 0) { + if(child == EmitterNodeType::None) + return; + + if(!m_pState->HasBegunContent()) { + if(m_pState->CurGroupChildCount() > 0 || m_stream.comment()) { m_stream << "\n"; } m_stream << IndentTo(curIndent); @@ -332,20 +335,18 @@ namespace YAML switch(child) { case EmitterNodeType::None: + break; case EmitterNodeType::Property: case EmitterNodeType::Scalar: case EmitterNodeType::FlowSeq: case EmitterNodeType::FlowMap: - if(m_pState->HasBegunContent()) - m_stream << " "; - else - m_stream << IndentTo(nextIndent); + SpaceOrIndentTo(m_pState->HasBegunContent(), nextIndent); break; case EmitterNodeType::BlockSeq: m_stream << "\n"; break; case EmitterNodeType::BlockMap: - if(m_pState->HasBegunContent()) + if(m_pState->HasBegunContent() || m_stream.comment()) m_stream << "\n"; break; } @@ -382,14 +383,12 @@ namespace YAML // key switch(child) { case EmitterNodeType::None: + break; case EmitterNodeType::Property: case EmitterNodeType::Scalar: case EmitterNodeType::FlowSeq: case EmitterNodeType::FlowMap: - if(m_pState->HasBegunContent()) - m_stream << " "; - else - m_stream << IndentTo(curIndent); + SpaceOrIndentTo(m_pState->HasBegunContent(), curIndent); break; case EmitterNodeType::BlockSeq: case EmitterNodeType::BlockMap: @@ -399,11 +398,12 @@ namespace YAML // value switch(child) { case EmitterNodeType::None: + break; case EmitterNodeType::Property: case EmitterNodeType::Scalar: case EmitterNodeType::FlowSeq: case EmitterNodeType::FlowMap: - m_stream << " "; + SpaceOrIndentTo(true, nextIndent); break; case EmitterNodeType::BlockSeq: case EmitterNodeType::BlockMap: @@ -413,6 +413,17 @@ namespace YAML } } + // SpaceOrIndentTo + // . Prepares for some more content by proper spacing + void Emitter::SpaceOrIndentTo(bool requireSpace, unsigned indent) + { + if(m_stream.comment()) + m_stream << "\n"; + if(m_stream.col() > 0 && requireSpace) + m_stream << " "; + m_stream << IndentTo(indent); + } + // ******************************************************************************************* // overloads of Write diff --git a/util/sandbox.cpp b/util/sandbox.cpp index 8960638..2ffbf0a 100644 --- a/util/sandbox.cpp +++ b/util/sandbox.cpp @@ -6,9 +6,10 @@ int main() YAML::Emitter out; out << YAML::Comment("Hello"); out << YAML::BeginSeq; - out << "item 1"; - out << YAML::BeginMap; - out << "pens" << "a"; + out << YAML::Comment("Hello"); + out << YAML::Anchor("a") << YAML::Comment("anchor") << "item 1" << YAML::Comment("a"); + out << YAML::BeginMap << YAML::Comment("b"); + out << "pens" << YAML::Comment("foo") << "a" << YAML::Comment("bar"); out << "pencils" << "b"; out << YAML::EndMap; out << "item 2";