| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271 | using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace InABox.Core{    public class HTMLStyle : Dictionary<string, string>    {    }    public enum HTMLFontStyle    {        Regular,        Bold,        Italic,        Underline    }    public class HTMLBuilder    {        private readonly Dictionary<string, object> _attributes = new Dictionary<string, object>();        private Dictionary<string, string> _styles = new Dictionary<string, string>();        private readonly StringBuilder body = new StringBuilder();        private readonly HTMLBuilder parent;        public HTMLBuilder()        {        }        public HTMLBuilder(string TagName, HTMLBuilder Parent)        {            this.TagName = TagName;            parent = Parent;            if (Parent != null)            {                DefaultStyle = Parent.DefaultStyle;                TableStyle = Parent.TableStyle;                CellStyle = Parent.CellStyle;            }        }        public HTMLStyle DefaultStyle { get; set; }        public HTMLStyle TableStyle { get; set; }        public HTMLStyle CellStyle { get; set; }        public string TagName { get; }        public HTMLBuilder AddContent(string Content, HTMLFontStyle style = HTMLFontStyle.Regular)        {            if (style == HTMLFontStyle.Regular)            {                body.Append(Content);                return this;            }            var tmp = new HTMLBuilder();            if (style == HTMLFontStyle.Bold)                tmp = tmp.StartTag("b", null);            if (style == HTMLFontStyle.Italic)                tmp = tmp.StartTag("i", null);            if (style == HTMLFontStyle.Underline)                tmp = tmp.StartTag("u", null);            tmp.AddContent(Content);            if (style != HTMLFontStyle.Regular)                tmp = tmp.EndTag();            body.Append(tmp);            return this;        }        public HTMLBuilder AddContentFormat(string Format, params object[] args)        {            body.AppendFormat(Format, args);            return this;        }        private HTMLBuilder StartTag(string TagName, HTMLStyle tagStyle)        {            var tag = new HTMLBuilder(TagName, this)            {                DefaultStyle = tagStyle, //(tagStyle != null ? tagStyle : this.DefaultStyle),                TableStyle = TableStyle,                CellStyle = CellStyle            };            return tag;        }        private HTMLBuilder EndTag()        {            parent.AddContent(ToString());            return parent;        }        public HTMLBuilder AddAttribute(string Name, object Value)        {            _attributes.Add(Name, Value);            return this;        }        public HTMLBuilder StartBody(HTMLStyle style = null)        {            return StartTag("body", style);        }        public HTMLBuilder EndBody()        {            if (TagName.Equals("body"))                return EndTag();            throw new Exception("EndBody() Exception");        }        public HTMLBuilder StartFont(string Face, string Size)        {            return StartTag("font", null).AddAttribute("face", Face).AddAttribute("size", Size);        }        public HTMLBuilder EndFont()        {            if (TagName.Equals("font"))                return EndTag();            throw new Exception("EndFont() Exception");        }        public HTMLBuilder StartParagraph(HTMLStyle style = null)        {            return StartTag("p", style);        }        public HTMLBuilder AddBreak()        {            body.Append("<br>");            return this;        }        public HTMLBuilder EndParagraph()        {            if (TagName.Equals("p"))                return EndTag();            throw new Exception("EndParagraph() Exception");        }        public HTMLBuilder StartTable(HTMLStyle style = null)        {            return StartTag("table", style != null ? style : TableStyle);        }        public HTMLBuilder EndTable()        {            if (TagName.Equals("table"))                return EndTag();            throw new Exception("EndTable() Exception");        }        public HTMLBuilder StartRow(HTMLStyle style = null)        {            if (TagName.Equals("table"))                return StartTag("tr", style);            throw new Exception("StartRow() Exception");        }        public HTMLBuilder EndRow()        {            if (TagName.Equals("tr"))                return EndTag();            throw new Exception("EndRow() Exception");        }        public HTMLBuilder StartCell(HTMLStyle style = null, int colspan = 1, int rowspan = 1, string width = "",            Alignment align = Alignment.MiddleLeft, string color = "#FFFFFF00")        {            if (TagName.Equals("tr"))            {                var tag = StartTag("td", style != null ? style : CellStyle);                if (colspan != 1)                    tag.AddAttribute("colspan", colspan.ToString());                if (rowspan != 1)                    tag.AddAttribute("rowspan", rowspan.ToString());                if (!string.IsNullOrEmpty(width))                    tag.AddAttribute("width", width);                if (align.Equals(Alignment.TopCenter) || align.Equals(Alignment.MiddleCenter) || align.Equals(Alignment.BottomCenter))                    tag.AddAttribute("align", "center");                else if (align.Equals(Alignment.TopRight) || align.Equals(Alignment.MiddleRight) || align.Equals(Alignment.BottomRight))                    tag.AddAttribute("align", "right");                if (align.Equals(Alignment.BottomLeft) || align.Equals(Alignment.BottomCenter) || align.Equals(Alignment.BottomRight))                    tag.AddAttribute("valign", "bottom");                else if (align.Equals(Alignment.MiddleLeft) || align.Equals(Alignment.MiddleCenter) || align.Equals(Alignment.MiddleRight))                    tag.AddAttribute("valign", "middle");                if (!color.ToUpper().Equals("#FFFFFF00"))                    tag.AddAttribute("bgcolor", color);                return tag;            }            throw new Exception("StartCell() Exception");        }        public HTMLBuilder EndCell()        {            if (TagName.Equals("td"))                return EndTag();            throw new Exception("EndCell() Exception");        }        public HTMLBuilder AddImage(string FileName, string Width, string Height)        {            body.AppendFormat("<img src=\"{0}\" alt=\"{0}\"", FileName);            if (!Height.Equals(""))                body.AppendFormat(" height=\"{0}\"", Height);            if (!Width.Equals(""))                body.AppendFormat(" width=\"{0}\"", Width);            body.Append(">");            return this;        }        public override string ToString()        {            var tag = new StringBuilder();            // preamble            if (!string.IsNullOrEmpty(TagName))            {                tag.AppendFormat("<{0}", TagName);                if (DefaultStyle != null)                {                    tag.Append(" style=\"");                    foreach (var key in DefaultStyle.Keys)                        tag.AppendFormat("{0}:{1};", key, DefaultStyle[key]);                    tag.Append("\"");                }            }            if (_attributes.Count > 0)            {                tag.Append(" ");                tag.Append(                    string.Join(" ",                        _attributes                            .Select(                                kvp => string.Format("{0}={1}", kvp.Key,                                    kvp.Value.GetType().Equals(typeof(string)) ? "\"" + kvp.Value + "\"" : kvp.Value.ToString()))                            .ToArray()));            }            // body/ending            if (body.Length > 0)            {                if (!string.IsNullOrEmpty(TagName) || _attributes.Count > 0)                    tag.Append(">");                tag.Append(body.ToString());                if (!string.IsNullOrEmpty(TagName))                    tag.AppendFormat("</{0}>", TagName);            }            else if (!string.IsNullOrEmpty(TagName))            {                tag.Append("/>");            }            return tag.ToString();        }    }}
 |