After parsing a JSON file, calling Write on the JsonParser now writes
valid JSON as an output; also fixed the indent levels and rolled up
arrays of numbers onto a single line to make it more readable.
Change-Id: I9413f5c3f7f4695b39e4f305eccf84b638c632bb
Signed-off-by: David Steele <david.steele@partner.samsung.com>
-void Indent(std::ostream& o, int indent)
+void Indent(std::ostream& o, int level, int indentWidth)
- for (int i = 0; i < indent; ++i)
+ for (int i = 0; i < level*indentWidth; ++i)
+std::string EscapeQuotes( const char* aString)
+{
+ std::string escapedString;
+ int length = strlen(aString);
+ escapedString.reserve(length);
+
+ const char* end = aString+length;
+ for( const char* iter = aString; iter != end ; ++iter)
+ {
+ if(*iter != '\"')
+ {
+ escapedString.push_back(*iter);
+ }
+ else
+ {
+ escapedString.append("\\\"");
+ }
+ }
+ return escapedString;
+} // anonymous namespace
+
TreeNodeManipulator::TreeNodeManipulator(TreeNode* node)
: mNode(node)
{
TreeNodeManipulator::TreeNodeManipulator(TreeNode* node)
: mNode(node)
{
void TreeNodeManipulator::Write(std::ostream& output, int indent) const
{
DALI_ASSERT_DEBUG(mNode && "Operation on NULL JSON node");
void TreeNodeManipulator::Write(std::ostream& output, int indent) const
{
DALI_ASSERT_DEBUG(mNode && "Operation on NULL JSON node");
- DoWrite(mNode, output, indent);
+ DoWrite(mNode, output, 0, indent, false);
-void TreeNodeManipulator::DoWrite(const TreeNode *value, std::ostream& output, int indent) const
+void TreeNodeManipulator::DoWrite(const TreeNode *value, std::ostream& output, int level, int indentWidth, bool groupChildren) const
{
DALI_ASSERT_DEBUG(value && "Operation on NULL JSON node");
{
DALI_ASSERT_DEBUG(value && "Operation on NULL JSON node");
- Indent(output, indent);
+ if(!groupChildren)
+ {
+ Indent(output, level, indentWidth);
+ }
output << "null";
if(NULL != value->mNextSibling)
{
output << "null";
if(NULL != value->mNextSibling)
{
case TreeNode::OBJECT:
case TreeNode::ARRAY:
{
case TreeNode::OBJECT:
case TreeNode::ARRAY:
{
+ bool groupMyChildren = false;
+
+ if( TreeNode::ARRAY == value->GetType() &&
+ ( TreeNode::INTEGER == value->mFirstChild->GetType() ||
+ TreeNode::FLOAT == value->mFirstChild->GetType() ) )
+ {
+ groupMyChildren = true;
+ }
+
if( value->GetType() == TreeNode::OBJECT)
{
if( value->GetType() == TreeNode::OBJECT)
{
+ output << std::endl;
+ Indent(output, level, indentWidth);
- if(indent)
- {
- output << std::endl;
- }
- output << "[";
- if(indent)
+ Indent(output, level, indentWidth);
+ output << "[";
+ }
+
+ if( groupMyChildren )
+ {
+ output << " ";
+ }
+ else
+ {
+ output << std::endl;
}
for (TreeNode::ConstIterator it = value->CBegin(); it != value->CEnd(); ++it)
{
}
for (TreeNode::ConstIterator it = value->CBegin(); it != value->CEnd(); ++it)
{
- DoWrite( &((*it).second), output, indent + 1);
+ DoWrite( &((*it).second), output, level+1, indentWidth, groupMyChildren );
+ }
+
+ if( !groupMyChildren )
+ {
+ Indent(output, level, indentWidth);
- Indent(output, indent);
if( value->GetType() == TreeNode::OBJECT )
{
output << "}";
if( value->GetType() == TreeNode::OBJECT )
{
output << "}";
- if(indent)
- {
- output << std::endl;
- }
- if(indent)
- {
- output << std::endl;
- }
+
+ if( NULL != value->mNextSibling )
+ {
+ output << ",";
+ }
+
+ if( !groupChildren )
+ {
+ output << std::endl;
+ }
+
+ groupChildren = false;
break;
}
case TreeNode::STRING:
{
break;
}
case TreeNode::STRING:
{
- output << "\"" << value->GetString() << "\"";
+ std::string escapedString = EscapeQuotes(value->GetString());
+ output << "\"" << escapedString << "\"";
if(NULL != value->mNextSibling)
{
output << ",";
}
if(NULL != value->mNextSibling)
{
output << ",";
}
+
+ if( groupChildren )
+ {
+ output << " ";
+ }
+ else
break;
}
case TreeNode::INTEGER:
break;
}
case TreeNode::INTEGER:
+
+ if( groupChildren )
+ {
+ output << " ";
+ }
+ else
break;
}
case TreeNode::FLOAT:
break;
}
case TreeNode::FLOAT:
+
+ if( groupChildren )
+ {
+ output << " ";
+ }
+ else
if(NULL != value->mNextSibling)
{
output << ",";
}
if(NULL != value->mNextSibling)
{
output << ",";
}
+
+ if( groupChildren )
+ {
+ output << " ";
+ }
+ else
} // namespace Toolkit
} // namespace Dali
} // namespace Toolkit
} // namespace Dali
/*
* Do write to string stream
*/
/*
* Do write to string stream
*/
- void DoWrite(const TreeNode *value, std::ostream& output, int ident) const;
+ void DoWrite(const TreeNode *value, std::ostream& output, int level, int ident, bool groupChildren) const;