This commit is contained in:
Lemongrass3110 2020-07-10 10:46:23 +08:00 committed by GitHub
commit 7e29647d22
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 30 additions and 2 deletions

View File

@ -25,6 +25,7 @@ enum EMITTER_MANIP {
SingleQuoted, SingleQuoted,
DoubleQuoted, DoubleQuoted,
Literal, Literal,
Folded,
// null manipulators // null manipulators
LowerNull, LowerNull,

View File

@ -695,7 +695,7 @@ Emitter& Emitter::Write(const std::string& str) {
Utils::ComputeStringFormat(str, m_pState->GetStringFormat(), Utils::ComputeStringFormat(str, m_pState->GetStringFormat(),
m_pState->CurGroupFlowType(), escapeNonAscii); m_pState->CurGroupFlowType(), escapeNonAscii);
if (strFormat == StringFormat::Literal) if (strFormat == StringFormat::Literal || strFormat == StringFormat::Folded)
m_pState->SetMapKeyFormat(YAML::LongKey, FmtScope::Local); m_pState->SetMapKeyFormat(YAML::LongKey, FmtScope::Local);
PrepareNode(EmitterNodeType::Scalar); PrepareNode(EmitterNodeType::Scalar);
@ -713,6 +713,9 @@ Emitter& Emitter::Write(const std::string& str) {
case StringFormat::Literal: case StringFormat::Literal:
Utils::WriteLiteralString(m_stream, str, Utils::WriteLiteralString(m_stream, str,
m_pState->CurIndent() + m_pState->GetIndent()); m_pState->CurIndent() + m_pState->GetIndent());
case StringFormat::Folded:
Utils::WriteFoldedString(m_stream, str,
m_pState->CurIndent() + m_pState->GetIndent());
break; break;
} }

View File

@ -244,6 +244,7 @@ bool EmitterState::SetStringFormat(EMITTER_MANIP value, FmtScope::value scope) {
case SingleQuoted: case SingleQuoted:
case DoubleQuoted: case DoubleQuoted:
case Literal: case Literal:
case Folded:
_Set(m_strFmt, value, scope); _Set(m_strFmt, value, scope);
return true; return true;
default: default:

View File

@ -275,6 +275,11 @@ StringFormat::value ComputeStringFormat(const std::string& str,
return StringFormat::Literal; return StringFormat::Literal;
} }
return StringFormat::DoubleQuoted; return StringFormat::DoubleQuoted;
case Folded:
if (IsValidLiteralScalar(str, flowType, escapeNonAscii)) {
return StringFormat::Folded;
}
return StringFormat::DoubleQuoted;
default: default:
break; break;
} }
@ -362,6 +367,22 @@ bool WriteLiteralString(ostream_wrapper& out, const std::string& str,
return true; 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) { bool WriteChar(ostream_wrapper& out, char ch) {
if (('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z')) { if (('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z')) {
out << ch; out << ch;

View File

@ -21,7 +21,7 @@ namespace YAML {
class Binary; class Binary;
struct StringFormat { struct StringFormat {
enum value { Plain, SingleQuoted, DoubleQuoted, Literal }; enum value { Plain, SingleQuoted, DoubleQuoted, Literal, Folded };
}; };
namespace Utils { namespace Utils {
@ -35,6 +35,8 @@ bool WriteDoubleQuotedString(ostream_wrapper& out, const std::string& str,
bool escapeNonAscii); bool escapeNonAscii);
bool WriteLiteralString(ostream_wrapper& out, const std::string& str, bool WriteLiteralString(ostream_wrapper& out, const std::string& str,
std::size_t indent); 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 WriteChar(ostream_wrapper& out, char ch);
bool WriteComment(ostream_wrapper& out, const std::string& str, bool WriteComment(ostream_wrapper& out, const std::string& str,
std::size_t postCommentIndent); std::size_t postCommentIndent);