Skip to content

Commit

Permalink
Merge pull request #577 from comand/prettywriter-options
Browse files Browse the repository at this point in the history
Add PrettyWriter format option for writing array in single line.
  • Loading branch information
miloyip committed Mar 9, 2016
2 parents 1623ef2 + 7a79e91 commit d454d21
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 5 deletions.
30 changes: 25 additions & 5 deletions include/rapidjson/prettywriter.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,14 @@ RAPIDJSON_DIAG_OFF(effc++)

RAPIDJSON_NAMESPACE_BEGIN

//! Combination of PrettyWriter format flags.
/*! \see PrettyWriter::SetFormatOptions
*/
enum PrettyFormatOptions {
kFormatDefault = 0, //!< Default pretty formatting.
kFormatSingleLineArray = 1 //!< Format arrays on a single line.
};

//! Writer with indentation and spacing.
/*!
\tparam OutputStream Type of ouptut os.
Expand All @@ -43,7 +51,7 @@ class PrettyWriter : public Writer<OutputStream, SourceEncoding, TargetEncoding,
\param levelDepth Initial capacity of stack.
*/
explicit PrettyWriter(OutputStream& os, StackAllocator* allocator = 0, size_t levelDepth = Base::kDefaultLevelDepth) :
Base(os, allocator, levelDepth), indentChar_(' '), indentCharCount_(4) {}
Base(os, allocator, levelDepth), indentChar_(' '), indentCharCount_(4), formatOptions_(kFormatDefault) {}


explicit PrettyWriter(StackAllocator* allocator = 0, size_t levelDepth = Base::kDefaultLevelDepth) :
Expand All @@ -61,6 +69,14 @@ class PrettyWriter : public Writer<OutputStream, SourceEncoding, TargetEncoding,
return *this;
}

//! Set pretty writer formatting options.
/*! \param options Formatting options.
*/
PrettyWriter& SetFormatOptions(PrettyFormatOptions options) {
formatOptions_ = options;
return *this;
}

/*! @name Implementation of Handler
\see Handler
*/
Expand Down Expand Up @@ -130,7 +146,7 @@ class PrettyWriter : public Writer<OutputStream, SourceEncoding, TargetEncoding,
RAPIDJSON_ASSERT(Base::level_stack_.template Top<typename Base::Level>()->inArray);
bool empty = Base::level_stack_.template Pop<typename Base::Level>(1)->valueCount == 0;

if (!empty) {
if (!empty && !(formatOptions_ & kFormatSingleLineArray)) {
Base::os_->Put('\n');
WriteIndent();
}
Expand Down Expand Up @@ -173,11 +189,14 @@ class PrettyWriter : public Writer<OutputStream, SourceEncoding, TargetEncoding,
if (level->inArray) {
if (level->valueCount > 0) {
Base::os_->Put(','); // add comma if it is not the first element in array
Base::os_->Put('\n');
if (formatOptions_ & kFormatSingleLineArray)
Base::os_->Put(' ');
}
else

if (!(formatOptions_ & kFormatSingleLineArray)) {
Base::os_->Put('\n');
WriteIndent();
WriteIndent();
}
}
else { // in object
if (level->valueCount > 0) {
Expand Down Expand Up @@ -213,6 +232,7 @@ class PrettyWriter : public Writer<OutputStream, SourceEncoding, TargetEncoding,

Ch indentChar_;
unsigned indentCharCount_;
PrettyFormatOptions formatOptions_;

private:
// Prohibit copy constructor & assignment operator.
Expand Down
23 changes: 23 additions & 0 deletions test/unittest/prettywritertest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,19 @@ static const char kPrettyJson[] =
" \"i64\": -1234567890123456789\n"
"}";

static const char kPrettyJson_FormatOptions_SLA[] =
"{\n"
" \"hello\": \"world\",\n"
" \"t\": true,\n"
" \"f\": false,\n"
" \"n\": null,\n"
" \"i\": 123,\n"
" \"pi\": 3.1416,\n"
" \"a\": [1, 2, 3, -1],\n"
" \"u64\": 1234567890123456789,\n"
" \"i64\": -1234567890123456789\n"
"}";

TEST(PrettyWriter, Basic) {
StringBuffer buffer;
PrettyWriter<StringBuffer> writer(buffer);
Expand All @@ -48,6 +61,16 @@ TEST(PrettyWriter, Basic) {
EXPECT_STREQ(kPrettyJson, buffer.GetString());
}

TEST(PrettyWriter, FormatOptions) {
StringBuffer buffer;
PrettyWriter<StringBuffer> writer(buffer);
writer.SetFormatOptions(kFormatSingleLineArray);
Reader reader;
StringStream s(kJson);
reader.Parse(s, writer);
EXPECT_STREQ(kPrettyJson_FormatOptions_SLA, buffer.GetString());
}

TEST(PrettyWriter, SetIndent) {
StringBuffer buffer;
PrettyWriter<StringBuffer> writer(buffer);
Expand Down

0 comments on commit d454d21

Please sign in to comment.