/// <summary>
        ///
        /// </summary>
        /// <param name="style"></param>
        /// <returns></returns>
        public static HtmlStyleAttributeCollection Parse(string style)
        {
            HtmlStyleAttributeCollection result = new HtmlStyleAttributeCollection();

            if (style.IsNullOrEmpty())
            {
                return(result);
            }

            using (HtmlStyleParserContext context = new HtmlStyleParserContext())
            {
                HtmlStyleAttribute currentStyleAttr = new HtmlStyleAttribute();

                while (context.Index < style.Length)
                {
                    switch (context.Stage)
                    {
                    case HtmlStyleParsingStage.None:
                    {
                        if (SkipNotLetter(context, style))
                        {
                            context.Stage    = HtmlStyleParsingStage.KeyStage;
                            currentStyleAttr = new HtmlStyleAttribute();
                        }
                        break;
                    }

                    case HtmlStyleParsingStage.KeyStage:
                    {
                        if (style[context.Index] != ':')
                        {
                            context.Writer.Write(style[context.Index++]);
                        }
                        else
                        {
                            currentStyleAttr.Key = context.ChangeStage(HtmlStyleParsingStage.ValueStage);
                            context.Index++;
                        }

                        break;
                    }

                    case HtmlStyleParsingStage.ValueStage:
                    {
                        if (style[context.Index] != ';')
                        {
                            context.Writer.Write(style[context.Index++]);
                        }
                        else
                        {
                            currentStyleAttr.Value      = context.ChangeStage(HtmlStyleParsingStage.None);
                            currentStyleAttr.Expression = ParseValue(currentStyleAttr.Value);
                            result.AddNotExistsItem(currentStyleAttr);

                            currentStyleAttr = null;
                            context.Index++;
                        }

                        break;
                    }
                    }
                }

                currentStyleAttr = DoStylePostOperation(context, currentStyleAttr);

                if (currentStyleAttr != null)
                {
                    result.AddNotExistsItem(currentStyleAttr);
                }
            }

            return(result);
        }
        private static HtmlStyleAttribute DoStylePostOperation(HtmlStyleParserContext context, HtmlStyleAttribute currentStyleAttr)
        {
            if (currentStyleAttr != null)
            {
                switch (context.Stage)
                {
                case HtmlStyleParsingStage.KeyStage:
                    currentStyleAttr.Key        = context.ChangeStage(HtmlStyleParsingStage.ValueStage);
                    currentStyleAttr.Expression = ParseValue(currentStyleAttr.Value);
                    break;

                case HtmlStyleParsingStage.ValueStage:
                    currentStyleAttr.Value      = context.ChangeStage(HtmlStyleParsingStage.None);
                    currentStyleAttr.Expression = ParseValue(currentStyleAttr.Value);
                    break;
                }
            }

            return(currentStyleAttr);
        }