My helper class: WebStringBuilder

I'd like to build HTML source using System.Web.UI.HtmlTextWriter, code like this:

string html = string.Empty;

using (System.IO.MemoryStream stream = new System.IO.MemoryStream())

{

using (System.IO.TextWriter writer = new System.IO.StreamWriter(stream,System.Text.Encoding.UTF8))

{

using (HtmlTextWriter output = new HtmlTextWriter(writer))

{

output.RenderBeginTag(HtmlTextWriterTag.Table);

output.RenderBeginTag(HtmlTextWriterTag.Tr);

output.RenderBeginTag(HtmlTextWriterTag.Td);

output.Write("Hello world!");

output.RenderEndTag();

output.RenderEndTag();

output.RenderEndTag();

output.Flush();

}

writer.Flush();

}

stream.Flush();

html = System.Text.Encoding.UTF8.GetString(stream.GetBuffer());

}

And now I short above code by my custom class WebStringBuilder as following:

using (WebStringBuilder output = new WebStringBuilder())

{

output.RenderBeginTag(HtmlTextWriterTag.Table);

output.RenderBeginTag(HtmlTextWriterTag.Tr);

output.RenderBeginTag(HtmlTextWriterTag.Td);

output.Write("Hello world!");

output.RenderEndTag();

output.RenderEndTag();

output.RenderEndTag();

output.Flush();

html = output.ToString();

}

public class WebStringBuilder : IDisposable

{

private MemoryStream stream;

private TextWriter writer;

private HtmlTextWriter output;

private bool closed = false;

public WebStringBuilder()

: this("\t")

{

}

public WebStringBuilder(string tabString)

{

stream = new MemoryStream();

writer = new StreamWriter(stream, System.Text.Encoding.UTF8);

output = new HtmlTextWriter(writer, tabString);

}

public void AddAttribute(string key, string value)

{

output.AddAttribute(key, value);

}

public void AddAttribute(HtmlTextWriterAttribute key, string value)

{

output.AddAttribute(key, value);

}

public void AddStyleAttribute(string name, string value)

{

output.AddStyleAttribute(name, value);

}

public void AddStyleAttribute(HtmlTextWriterStyle key, string value)

{

output.AddStyleAttribute(key, value);

}

public void RenderBeginTag(HtmlTextWriterTag tagKey)

{

output.RenderBeginTag(tagKey);

}

public void Write(string s)

{

output.Write(s);

}

public void Write(object value)

{

output.Write(value);

}

public void Write(string format, object arg0)

{

output.Write(format, arg0);

}

public void Write(string format, object arg0, object arg1)

{

output.Write(format, arg0, arg1);

}

public void Write(string format, params object[] arg)

{

output.Write(format, arg);

}

public void WriteLineNoTabs(string s)

{

output.WriteLineNoTabs(s);

}

public void WriteLine()

{

output.WriteLine();

}

public void WriteLine(string s)

{

output.WriteLine(s);

}

public void WriteLine(object value)

{

output.WriteLine(value);

}

public void WriteLine(string format, object arg0)

{

output.WriteLine(format, arg0);

}

public void WriteLine(string format, object arg0, object arg1)

{

output.WriteLine(format, arg0, arg1);

}

public void WriteLine(string format, params object[] arg)

{

output.WriteLine(format, arg);

}

public void RenderBeginTag(string tagName)

{

output.RenderBeginTag(tagName);

}

public void RenderEndTag()

{

output.RenderEndTag();

}

public virtual void Flush()

{

output.Flush();

writer.Flush();

stream.Flush();

}

public void Close()

{

output.Close();

writer.Close();

stream.Close();

closed = true;

}

public override string ToString()

{

return System.Text.Encoding.UTF8.GetString(stream.GetBuffer()).Trim().Trim(new char[] { '\0' });

}

#region IDisposable Members

public void Dispose()

{

if (!closed)

Close();

}

#endregion

}

Feel free to modify these codes as you need, let me know your improved modification is appreciated. Happy coding!

 

UPDATE

thanks advice from Patrik Hägne , first class shorten as:

 public class WebStringBuilder : IDisposable
{
    //private MemoryStream stream;
    private TextWriter writer;
    private HtmlTextWriter output;
    private bool closed = false;

    public WebStringBuilder()
        : this("\t")
    {
    }

    public WebStringBuilder(string tabString)
    {
        //stream = new MemoryStream();
        writer = new StringWriter();//new StreamWriter(stream, System.Text.Encoding.UTF8);
       
        output = new HtmlTextWriter(writer, tabString);
    }

    public void AddAttribute(string key, string value)
    {
        output.AddAttribute(key, value);
    }

    public void AddAttribute(HtmlTextWriterAttribute key, string value)
    {
        output.AddAttribute(key, value);
    }

    public void AddStyleAttribute(string name, string value)
    {
        output.AddStyleAttribute(name, value);
    }

    public void AddStyleAttribute(HtmlTextWriterStyle key, string value)
    {
        output.AddStyleAttribute(key, value);
    }

    public void RenderBeginTag(HtmlTextWriterTag tagKey)
    {
        output.RenderBeginTag(tagKey);
    }

    public void Write(string s)
    {
        output.Write(s);
    }

    public void Write(object value)
    {
        output.Write(value);
    }

    public void Write(string format, object arg0)
    {
        output.Write(format, arg0);
    }

    public void Write(string format, object arg0, object arg1)
    {
        output.Write(format, arg0, arg1);
    }

    public void Write(string format, params object[] arg)
    {
        output.Write(format, arg);
    }

    public void WriteLineNoTabs(string s)
    {
        output.WriteLineNoTabs(s);
    }

    public void WriteLine()
    {
        output.WriteLine();
    }

    public void WriteLine(string s)
    {
        output.WriteLine(s);
    }

    public void WriteLine(object value)
    {
        output.WriteLine(value);
    }

    public void WriteLine(string format, object arg0)
    {
        output.WriteLine(format, arg0);
    }

    public void WriteLine(string format, object arg0, object arg1)
    {
        output.WriteLine(format, arg0, arg1);
    }

    public void WriteLine(string format, params object[] arg)
    {
        output.WriteLine(format, arg);
    }

    public void RenderBeginTag(string tagName)
    {
        output.RenderBeginTag(tagName);
    }

    public void RenderEndTag()
    {
        output.RenderEndTag();
    }

    public virtual void Flush()
    {
        output.Flush();
        writer.Flush();
        //stream.Flush();
    }

    public void Close()
    {
        output.Close();
        writer.Close();
        //stream.Close();
        closed = true;
    }

    public override string ToString()
    {
        return writer.ToString().Trim().Trim(new char[] { '\0' });
        //return System.Text.Encoding.UTF8.GetString(stream.GetBuffer()).Trim().Trim(new char[] { '\0' });
    }

    #region IDisposable Members

    public void Dispose()
    {
        if (!closed)
            Close();
    }

    #endregion
}

Published Wednesday, February 13, 2008 4:36 PM by comy
Filed under:

Comments

# re: My helper class: WebStringBuilder

Friday, February 15, 2008 3:33 AM by Patrik Hägne

There's no need to use the StreamWriter on a MemoryStream when you're not going to use the stream, just unnecessary overhead, or am I missing something? I'd have the HtmlTextWriter wrap a StringWriter instead, this considerably shortens the first example and - to me - removes the need for this class. If you still think you need the class you'd increase performance by using a StringWriter instead.

# re: My helper class: WebStringBuilder

Thursday, April 03, 2008 5:36 AM by comy

Patrik Hägne, you are right, code updated. thanks.

Leave a Comment

(required) 
(required) 
(optional)
(required)