osgEarth 2.1.1
Public Member Functions | Private Types | Private Member Functions | Static Private Member Functions | Private Attributes

osgEarth::Json::StyledWriter Class Reference

Writes a Value in JSON format in a human friendly way. More...

Inheritance diagram for osgEarth::Json::StyledWriter:
Collaboration diagram for osgEarth::Json::StyledWriter:

List of all members.

Public Member Functions

 StyledWriter ()
virtual ~StyledWriter ()
virtual std::string write (const Value &root)
 Serialize a Value in JSON format.

Private Types

typedef std::vector< std::string > ChildValues

Private Member Functions

void writeValue (const Value &value)
void writeArrayValue (const Value &value)
bool isMultineArray (const Value &value)
void pushValue (const std::string &value)
void writeIndent ()
void writeWithIndent (const std::string &value)
void indent ()
void unindent ()
void writeCommentBeforeValue (const Value &root)
void writeCommentAfterValueOnSameLine (const Value &root)
bool hasCommentForValue (const Value &value)

Static Private Member Functions

static std::string normalizeEOL (const std::string &text)

Private Attributes

ChildValues childValues_
std::string document_
std::string indentString_
int rightMargin_
int indentSize_
bool addChildValues_

Detailed Description

Writes a Value in JSON format in a human friendly way.

The rules for line break and indent are as follow:

If the Value have comments then they are outputed according to their CommentPlacement.

See also:
Reader, Value, Value::setComment()

Definition at line 1167 of file JsonUtils.


Member Typedef Documentation

typedef std::vector<std::string> osgEarth::Json::StyledWriter::ChildValues [private]

Definition at line 1194 of file JsonUtils.


Constructor & Destructor Documentation

StyledWriter::StyledWriter ( )

Definition at line 2959 of file JsonUtils.cpp.

   : rightMargin_( 74 )
   , indentSize_( 3 )
{
}
virtual osgEarth::Json::StyledWriter::~StyledWriter ( ) [inline, virtual]

Definition at line 1171 of file JsonUtils.

{}

Member Function Documentation

bool StyledWriter::hasCommentForValue ( const Value value) [private]

Definition at line 3199 of file JsonUtils.cpp.

Here is the call graph for this function:

Here is the caller graph for this function:

void StyledWriter::indent ( ) [private]

Definition at line 3159 of file JsonUtils.cpp.

{
   indentString_ += std::string( indentSize_, ' ' );
}

Here is the caller graph for this function:

bool StyledWriter::isMultineArray ( const Value value) [private]

Definition at line 3095 of file JsonUtils.cpp.

{
   int size = value.size();
   bool isMultiLine = size*3 >= rightMargin_ ;
   childValues_.clear();
   for ( int index =0; index < size  &&  !isMultiLine; ++index )
   {
      const Value &childValue = value[index];
      isMultiLine = isMultiLine  ||
                     ( (childValue.isArray()  ||  childValue.isObject())  &&  
                        childValue.size() > 0 );
   }
   if ( !isMultiLine ) // check if line length > max line length
   {
      childValues_.reserve( size );
      addChildValues_ = true;
      int lineLength = 4 + (size-1)*2; // '[ ' + ', '*n + ' ]'
      for ( int index =0; index < size  &&  !isMultiLine; ++index )
      {
         writeValue( value[index] );
         lineLength += int( childValues_[index].length() );
         isMultiLine = isMultiLine  &&  hasCommentForValue( value[index] );
      }
      addChildValues_ = false;
      isMultiLine = isMultiLine  ||  lineLength >= rightMargin_;
   }
   return isMultiLine;
}

Here is the call graph for this function:

Here is the caller graph for this function:

std::string StyledWriter::normalizeEOL ( const std::string &  text) [static, private]

Definition at line 3208 of file JsonUtils.cpp.

{
   std::string normalized;
   normalized.reserve( text.length() );
   const char *begin = text.c_str();
   const char *end = begin + text.length();
   const char *current = begin;
   while ( current != end )
   {
      char c = *current++;
      if ( c == '\r' ) // mac or dos EOL
      {
         if ( *current == '\n' ) // convert dos EOL
            ++current;
         normalized += '\n';
      }
      else // handle unix EOL & other char
         normalized += c;
   }
   return normalized;
}

Here is the caller graph for this function:

void StyledWriter::pushValue ( const std::string &  value) [private]

Definition at line 3126 of file JsonUtils.cpp.

{
   if ( addChildValues_ )
      childValues_.push_back( value );
   else
      document_ += value;
}

Here is the caller graph for this function:

void StyledWriter::unindent ( ) [private]

Definition at line 3166 of file JsonUtils.cpp.

{
   assert( int(indentString_.size()) >= indentSize_ );
   indentString_.resize( indentString_.size() - indentSize_ );
}

Here is the caller graph for this function:

std::string StyledWriter::write ( const Value root) [virtual]

Serialize a Value in JSON format.

Parameters:
rootValue to serialize.
Returns:
String containing the JSON document that represents the root value.

Implements osgEarth::Json::Writer.

Definition at line 2967 of file JsonUtils.cpp.

Here is the call graph for this function:

Here is the caller graph for this function:

void StyledWriter::writeArrayValue ( const Value value) [private]

Definition at line 3042 of file JsonUtils.cpp.

{
   unsigned size = value.size();
   if ( size == 0 )
      pushValue( "[]" );
   else
   {
      bool isArrayMultiLine = isMultineArray( value );
      if ( isArrayMultiLine )
      {
         writeWithIndent( "[" );
         indent();
         bool hasChildValue = !childValues_.empty();
         unsigned index =0;
         while ( true )
         {
            const Value &childValue = value[index];
            writeCommentBeforeValue( childValue );
            if ( hasChildValue )
               writeWithIndent( childValues_[index] );
            else
            {
               writeIndent();
               writeValue( childValue );
            }
            if ( ++index == size )
            {
               writeCommentAfterValueOnSameLine( childValue );
               break;
            }
            document_ += ",";
            writeCommentAfterValueOnSameLine( childValue );
         }
         unindent();
         writeWithIndent( "]" );
      }
      else // output on a single line
      {
         assert( childValues_.size() == size );
         document_ += "[ ";
         for ( unsigned index =0; index < size; ++index )
         {
            if ( index > 0 )
               document_ += ", ";
            document_ += childValues_[index];
         }
         document_ += " ]";
      }
   }
}

Here is the call graph for this function:

Here is the caller graph for this function:

void StyledWriter::writeCommentAfterValueOnSameLine ( const Value root) [private]

Definition at line 3184 of file JsonUtils.cpp.

{
   if ( root.hasComment( commentAfterOnSameLine ) )
      document_ += std::string(" ") + normalizeEOL( root.getComment( commentAfterOnSameLine ) );

   if ( root.hasComment( commentAfter ) )
   {
      document_ += "\n";
      document_ += normalizeEOL( root.getComment( commentAfter ) );
      document_ += "\n";
   }
}

Here is the call graph for this function:

Here is the caller graph for this function:

void StyledWriter::writeCommentBeforeValue ( const Value root) [private]

Definition at line 3174 of file JsonUtils.cpp.

{
   if ( !root.hasComment( commentBefore ) )
      return;
   document_ += normalizeEOL( root.getComment( commentBefore ) );
   document_ += "\n";
}

Here is the call graph for this function:

Here is the caller graph for this function:

void StyledWriter::writeIndent ( ) [private]

Definition at line 3136 of file JsonUtils.cpp.

{
   if ( !document_.empty() )
   {
      char last = document_[document_.length()-1];
      if ( last == ' ' )     // already indented
         return;
      if ( last != '\n' )    // Comments may add new-line
         document_ += '\n';
   }
   document_ += indentString_;
}

Here is the caller graph for this function:

void StyledWriter::writeValue ( const Value value) [private]

Definition at line 2981 of file JsonUtils.cpp.

{
   switch ( value.type() )
   {
   case nullValue:
      pushValue( "null" );
      break;
   case intValue:
      pushValue( valueToString( value.asInt() ) );
      break;
   case uintValue:
      pushValue( valueToString( value.asUInt() ) );
      break;
   case realValue:
      pushValue( valueToString( value.asDouble() ) );
      break;
   case stringValue:
      pushValue( valueToQuotedString( value.asCString() ) );
      break;
   case booleanValue:
      pushValue( valueToString( value.asBool() ) );
      break;
   case arrayValue:
      writeArrayValue( value);
      break;
   case objectValue:
      {
         Value::Members members( value.getMemberNames() );
         if ( members.empty() )
            pushValue( "{}" );
         else
         {
            writeWithIndent( "{" );
            indent();
            Value::Members::iterator it = members.begin();
            while ( true )
            {
               const std::string &name = *it;
               const Value &childValue = value[name];
               writeCommentBeforeValue( childValue );
               writeWithIndent( valueToQuotedString( name.c_str() ) );
               document_ += " : ";
               writeValue( childValue );
               if ( ++it == members.end() )
               {
                  writeCommentAfterValueOnSameLine( childValue );
                  break;
               }
               document_ += ",";
               writeCommentAfterValueOnSameLine( childValue );
            }
            unindent();
            writeWithIndent( "}" );
         }
      }
      break;
   }
}

Here is the call graph for this function:

Here is the caller graph for this function:

void StyledWriter::writeWithIndent ( const std::string &  value) [private]

Definition at line 3151 of file JsonUtils.cpp.

{
   writeIndent();
   document_ += value;
}

Here is the call graph for this function:

Here is the caller graph for this function:


Member Data Documentation

Definition at line 1201 of file JsonUtils.

Definition at line 1196 of file JsonUtils.

Definition at line 1197 of file JsonUtils.

Definition at line 1200 of file JsonUtils.

Definition at line 1198 of file JsonUtils.

Definition at line 1199 of file JsonUtils.


The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines