private static HtmlControl TryCreateFromStateMachine(string tagName)
        {
            switch (tagName)
            {
                case "":
                    return new EmptyHtmlControl();

                case "a":
                    using (var a = new CustomHtmlAnchor())
                    {
                        a.Attributes["href"] = "";
                        return a;
                    }
                case "button":
                case "btn":
                    return new HtmlButton();

                case "input":
                    using (CustomHtmlInput input = new CustomHtmlInput())
                    {
                        input.Attributes["value"] = "";
                        input.Attributes["type"] = "";
                        return input;
                    }
                case "img":
                    using (var img = new CustomHtmlImage())
                    {
                        img.Attributes["src"] = string.Empty;
                        img.Attributes["alt"] = string.Empty;
                        return img;
                    }
                case "source":
                case "src":
                    return new HtmlGenericSelfClosing("source");

                case "meta":
                    return new CustomHtmlMeta();

                case "link":
                    return new CustomHtmlLink();

                case "abbr":
                case "acronym":
                    using (HtmlGenericControl abbr = new HtmlGenericControl(tagName))
                    {
                        abbr.Attributes["title"] = string.Empty;
                        return abbr;
                    }
                case "area":
                    using (BlockHtmlControl area = new BlockHtmlControl("area"))
                    {
                        area.Attributes["shape"] = string.Empty;
                        area.Attributes["coords"] = string.Empty;
                        area.Attributes["href"] = string.Empty;
                        area.Attributes["alt"] = string.Empty;
                        return area;
                    }
                case "iframe":
                case "ifr":
                    using (HtmlGenericControl iframe = new HtmlGenericControl("iframe"))
                    {
                        iframe.Attributes["src"] = string.Empty;
                        iframe.Attributes["frameborder"] = "0";
                        return iframe;
                    }
                case "param":
                    using (HtmlGenericSelfClosing param = new HtmlGenericSelfClosing("param"))
                    {
                        param.Attributes["name"] = string.Empty;
                        param.Attributes["value"] = string.Empty;
                        return param;
                    }
                case "section":
                case "sect":
                    return new BlockHtmlControl("section");

                case "article":
                case "art":
                    return new BlockHtmlControl("article");

                case "hgroup":
                case "hgr":
                    return new BlockHtmlControl("hgroup");

                case "header":
                case "hdr":
                    return new BlockHtmlControl("header");

                case "footer":
                case "ftr":
                    return new BlockHtmlControl("footer");

                case "adr":
                    return new BlockHtmlControl("address");

                case "dlg":
                    return new BlockHtmlControl("dialog");

                case "bq":
                    return new HtmlGenericControl("blockquote");

                case "acr":
                    return new HtmlGenericControl("acronym");

                case "prog":
                    return new HtmlGenericControl("progress");

                case "figure":
                case "fig":
                    return new BlockHtmlControl("figure");

                case "emb":
                    return new HtmlGenericControl("embed");

                case "object":
                case "obj":
                    return new BlockHtmlControl("object");

                case "cap":
                    return new HtmlGenericControl("caption");

                case "colg":
                    return new HtmlGenericControl("colgroup");

                case "fset":
                    return new BlockHtmlControl("fieldset");

                case "leg":
                    return new BlockHtmlControl("legend");

                case "optg":
                    return new HtmlGenericControl("optgroup");

                case "opt":
                    return new HtmlGenericControl("option");

                case "datag":
                    return new HtmlGenericControl("datagrid");

                case "datal":
                    return new HtmlGenericControl("datalist");

                case "textarea":
                case "tarea":
                    using (var textarea = new CustomHtmlTextArea())
                    {
                        textarea.ID = string.Empty;
                        textarea.Attributes["cols"] = string.Empty;
                        textarea.Attributes["rows"] = string.Empty;
                        return textarea;
                    }
                case "kg":
                    return new HtmlGenericControl("keygen");

                case "out":
                    return new HtmlGenericControl("output");

                case "html":
                case "head":
                case "body":
                case "div":
                case "table":
                case "tr":
                case "p":
                    return new BlockHtmlControl(tagName);

                case "br":
                case "hr":
                    return new HtmlGenericSelfClosing(tagName);
            }

            return null;
        }
        private static HtmlControl TryCreateFromStateMachine(string tagName)
        {
            switch (tagName)
            {
            case "":
                return(new EmptyHtmlControl());

            case "a":
                using (var a = new CustomHtmlAnchor())
                {
                    a.Attributes["href"] = "";
                    return(a);
                }

            case "button":
            case "btn":
                return(new HtmlButton());

            case "input":
                using (CustomHtmlInput input = new CustomHtmlInput())
                {
                    input.Attributes["value"] = "";
                    input.Attributes["type"]  = "";
                    return(input);
                }

            case "img":
                using (var img = new CustomHtmlImage())
                {
                    img.Attributes["src"] = string.Empty;
                    img.Attributes["alt"] = string.Empty;
                    return(img);
                }

            case "source":
            case "src":
                return(new HtmlGenericSelfClosing("source"));

            case "meta":
                return(new CustomHtmlMeta());

            case "link":
                return(new CustomHtmlLink());

            case "abbr":
            case "acronym":
                using (HtmlGenericControl abbr = new HtmlGenericControl("acronym"))
                {
                    abbr.Attributes["title"] = string.Empty;
                    return(abbr);
                }

            case "area":
                using (BlockHtmlControl area = new BlockHtmlControl("area"))
                {
                    area.Attributes["shape"]  = string.Empty;
                    area.Attributes["coords"] = string.Empty;
                    area.Attributes["href"]   = string.Empty;
                    area.Attributes["alt"]    = string.Empty;
                    return(area);
                }

            case "iframe":
            case "ifr":
                using (HtmlGenericControl iframe = new HtmlGenericControl("iframe"))
                {
                    iframe.Attributes["src"]         = string.Empty;
                    iframe.Attributes["frameborder"] = "0";
                    return(iframe);
                }

            case "param":
                using (HtmlGenericSelfClosing param = new HtmlGenericSelfClosing("param"))
                {
                    param.Attributes["name"]  = string.Empty;
                    param.Attributes["value"] = string.Empty;
                    return(param);
                }

            case "section":
            case "sect":
                return(new BlockHtmlControl("section"));

            case "article":
            case "art":
                return(new BlockHtmlControl("article"));

            case "hgroup":
            case "hgr":
                return(new BlockHtmlControl("hgroup"));

            case "header":
            case "hdr":
                return(new BlockHtmlControl("header"));

            case "footer":
            case "ftr":
                return(new BlockHtmlControl("footer"));

            case "adr":
                return(new BlockHtmlControl("address"));

            case "dlg":
                return(new BlockHtmlControl("dialog"));

            case "bq":
                return(new HtmlGenericControl("blockquote"));

            case "acr":
                return(new HtmlGenericControl("acronym"));

            case "prog":
                return(new HtmlGenericControl("progress"));

            case "figure":
            case "fig":
                return(new BlockHtmlControl("figure"));

            case "emb":
                return(new HtmlGenericControl("embed"));

            case "object":
            case "obj":
                return(new BlockHtmlControl("object"));

            case "cap":
                return(new HtmlGenericControl("caption"));

            case "colg":
                return(new HtmlGenericControl("colgroup"));

            case "fset":
                return(new BlockHtmlControl("fieldset"));

            case "leg":
                return(new BlockHtmlControl("legend"));

            case "optg":
                return(new HtmlGenericControl("optgroup"));

            case "opt":
                return(new HtmlGenericControl("option"));

            case "datag":
                return(new HtmlGenericControl("datagrid"));

            case "datal":
                return(new HtmlGenericControl("datalist"));

            case "textarea":
            case "tarea":
                using (var textarea = new CustomHtmlTextArea())
                {
                    textarea.ID = string.Empty;
                    textarea.Attributes["cols"] = string.Empty;
                    textarea.Attributes["rows"] = string.Empty;
                    return(textarea);
                }

            case "kg":
                return(new HtmlGenericControl("keygen"));

            case "out":
                return(new HtmlGenericControl("output"));

            case "html":
            case "head":
            case "body":
            case "div":
            case "table":
            case "tr":
            case "p":
                return(new BlockHtmlControl(tagName));

            case "br":
            case "hr":
                return(new HtmlGenericSelfClosing(tagName));
            }

            return(null);
        }