using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Web;
namespace Tango.CodeGeneration
{
/// <summary>
/// Represents a code object base class.
/// </summary>
/// <seealso cref="Tango.CodeGeneration.ICodeObject" />
public abstract class CodeObject : ICodeObject
{
/// <summary>
/// Initializes a new instance of the <see cref="CodeObject"/> class.
/// </summary>
public CodeObject()
{
Attributes = new List<string>();
IndentResult = true;
}
/// <summary>
/// Gets or sets the code object modifier.
/// </summary>
public CodeObjectModifier Modifier { get; set; }
/// <summary>
/// Gets or sets the attributes associated with this code object.
/// </summary>
public List<String> Attributes { get; set; }
/// <summary>
/// Gets or sets a value indicating whether to indent the resulting code.
/// </summary>
public bool IndentResult { get; set; }
/// <summary>
/// Generates the code represented by this code object.
/// </summary>
/// <returns></returns>
public virtual string GenerateCode()
{
var code = Helper.ParseTemplate(GetTemplate(), this);
if (IndentResult)
{
code = Helper.IndentCSharpCode(code);
code = RemoveDoubleLines(code);
}
code = code.Replace("&amp;quot;", "\"");
code = HttpUtility.HtmlDecode(code);
return code;
}
/// <summary>
/// Removes the double lines.
/// </summary>
/// <param name="str">The string.</param>
/// <returns></returns>
private String RemoveDoubleLines(string str)
{
String result = String.Empty;
using (var streamReader = new StringReader(str))
{
string line = null;
bool previousLineWasBlank = false;
while ((line = streamReader.ReadLine()) != null)
{
if (!string.IsNullOrEmpty(line) || !previousLineWasBlank)
{
result += line +Environment.NewLine;
}
previousLineWasBlank = string.IsNullOrEmpty(line);
}
}
return result;
}
/// <summary>
/// Gets the template associated with this code object.
/// </summary>
/// <returns></returns>
public virtual string GetTemplate()
{
return Helper.GetTemplate(this.GetType());
}
/// <summary>
/// Returns a <see cref="System.String" /> that represents this instance.
/// </summary>
/// <returns>
/// A <see cref="System.String" /> that represents this instance.
/// </returns>
public override string ToString()
{
return GenerateCode();
}
/// <summary>
/// Gets the modifier string.
/// </summary>
/// <returns></returns>
public String GetModifierString()
{
return Modifier.ToString().ToLower();
}
/// <summary>
/// Gets the attributes string.
/// </summary>
/// <returns></returns>
public String GetAttributesString()
{
if (Attributes != null && Attributes.Count > 0)
{
return String.Join(Environment.NewLine, Attributes);
}
else
{
return null;
}
}
}
}