private static CssMarkupNode?GetNextNode(String css,
                                                 ref Int32 i,
                                                 StringBuilder sb)
        {
            for (; i < css.Length; i++)
            {
                var currentChar = css[i];

                switch (currentChar)
                {
                case '/':
                    if (css[i + 1] == '*')
                    {
                        // comment

                        i++;
                        while (i < css.Length)
                        {
                            currentChar = css[++i];
                            if (currentChar == '*' && css[i + 1] == '/')
                            {
                                i++;
                                break;
                            }
                        }
                    }
                    break;


                case '{':
                    var currentNode = new CssMarkupNode(sb.ToString().Trim(), null);
                    sb.Clear();
                    i++;
                    AddAttributes(css, ref i, sb, currentNode);
                    return(currentNode);


                case '}':
                    break;

                default:
                    sb.Append(currentChar);
                    break;
                }
            }

            return(null);
        }
        private static void AddAttributes(String css,
                                          ref Int32 i,
                                          StringBuilder sb,
                                          CssMarkupNode currentNode)
        {
            for (; i < css.Length; i++)
            {
                var currentChar = css[i];

                switch (currentChar)
                {
                case ':':
                    var key = sb.ToString();

                    sb.Clear();
                    i++;

                    var value = GetAttributeValue(css, ref i, sb);
                    if (value != null)
                    {
                        currentNode.AddAttribute(key, value);
                    }
                    break;

                case '}':
                    return;

                case ';':
                    throw new NotImplementedException();

                case '\r':
                case '\n':
                case '\t':
                case ' ':
                    break;

                default:
                    sb.Append(currentChar);
                    break;
                }
            }
        }