private static string formatLavaDebugInfo( object liquidizedObject, int levelsDeep = 0, string parents = "" )
{
if ( liquidizedObject is string )
{
return string.Format( "<span class='lava-debug-value'> - {0}</span>", liquidizedObject.ToString() );
}
if ( liquidizedObject is IDictionary<string, object> )
{
var sb = new StringBuilder();
bool isTopLevel = levelsDeep == 0;
if ( !isTopLevel )
{
sb.AppendFormat( "{0}<ul>{0}", Environment.NewLine );
}
foreach ( var keyVal in (IDictionary<string, object>)liquidizedObject )
{
if ( isTopLevel )
{
if ( keyVal.Value is string )
{
// item is a root level property
sb.Append( string.Format( "<ul><li><span class='lava-debug-key'>{0}</span> - {1}</li></ul>{2}", keyVal.Key, keyVal.Value.ToString(), Environment.NewLine ) );
}
else
{
// item is a root level object
string panelId = Guid.NewGuid().ToString();
sb.Append( "<div class='panel panel-default panel-lavadebug'>" );
sb.Append( string.Format( "<div class='panel-heading clearfix collapsed' data-toggle='collapse' data-target='#collapse-{0}'>", panelId ) );
sb.Append( string.Format( "<h5 class='panel-title pull-left'>{0}</h5> <div class='pull-right'><i class='fa fa-chevron-up'></i></div>", keyVal.Key.SplitCase() ) );
sb.Append( "</div>" );
sb.Append( string.Format( "<div id='collapse-{0}' class='panel-collapse collapse'>", panelId ) );
sb.Append( "<div class='panel-body'>" );
if ( keyVal.Key == "GlobalAttribute" )
{
sb.Append( "<p>Global attributes should be accessed using <code>{{ 'Global' | Attribute:'[AttributeKey]' }}</code>. Find out more about using Global Attributes in Lava at <a href='http://www.rockrms.com/lava/globalattributes' target='_blank'>rockrms.com/lava/globalattributes</a>.</p>" );
}
else if ( keyVal.Value is List<object> )
{
sb.Append( string.Format( "<p>{0} properties can be accessed by <code>{{% for {2} in {1} %}}{{{{ {2}.[PropertyKey] }}}}{{% endfor %}}</code>.</p>", char.ToUpper( keyVal.Key[0] ) + keyVal.Key.Substring( 1 ), keyVal.Key, keyVal.Key.Singularize().ToLower() ) );
}
else if ( keyVal.Key == "CurrentPerson" )
{
sb.Append( string.Format( "<p>{0} properties can be accessed by <code>{{{{ {1}.[PropertyKey] }}}}</code>. Find out more about using 'Person' fields in Lava at <a href='http://www.rockrms.com/lava/person' target='_blank'>rockrms.com/lava/person</a>.</p>", char.ToUpper( keyVal.Key[0] ) + keyVal.Key.Substring( 1 ), keyVal.Key ) );
}
else
{
sb.Append( string.Format( "<p>{0} properties can be accessed by <code>{{{{ {1}.[PropertyKey] }}}}</code>.</p>", char.ToUpper( keyVal.Key[0] ) + keyVal.Key.Substring( 1 ), keyVal.Key ) );
}
string value = formatLavaDebugInfo( keyVal.Value, 1, keyVal.Key );
sb.Append( value );
sb.Append( "</div>" );
sb.Append( "</div>" );
sb.Append( "</div>" );
}
}
else
{
string section = ( keyVal.Value is string ) ? "" : string.Format( " lava-debug-section level-{0}", levelsDeep );
string value = formatLavaDebugInfo( keyVal.Value, levelsDeep + 1, parents + "." + keyVal.Key );
sb.AppendFormat( "<li><span class='lava-debug-key{0}'>{1}</span> {2}</li>{3}", section, keyVal.Key, value, Environment.NewLine );
}
}
if ( !isTopLevel )
{
sb.AppendLine( "</ul>" );
}
return sb.ToString();
}
if ( liquidizedObject is List<object> )
{
var sb = new StringBuilder();
sb.AppendFormat( "{0}{{<ul>{0}", Environment.NewLine );
int i = 0;
foreach ( var obj in (List<object>)liquidizedObject )
{
string value = formatLavaDebugInfo( obj, 1, parents );
sb.AppendFormat( "<li>[{0}] {1}</li>{2}", i.ToString(), value, Environment.NewLine );
i++;
}
sb.AppendLine( "</ul>}" );
return sb.ToString();
}
return string.Empty;
}