public static new JSONString Parse(Token token)
 {
     StringBuilder builder = new StringBuilder();
     token.MoveToContent();
     if (!token.Peeks("\""))
     {
         return null;
     }
     token.MovePast("\"");
     while (!token.Peeks("\""))
     {
         if (token.Peeks("\\\""))
         {
             builder.Append("\"");
             token.Skip(2);
         }
         else
         {
             builder.Append(token.Current);
             token.Skip(1);
         }
     }
     token.MovePast("\"");
     return new JSONString(builder.ToString());
 }
 // Methods
 public static new JSONNull Parse(Token token)
 {
     token.MoveToContent();
     if (token.Peeks("null"))
     {
         token.Skip(4);
         return JSONValue.Null;
     }
     return null;
 }
 public static new JSONBoolean Parse(Token token)
 {
     token.MoveToContent();
     if (token.Peeks("true"))
     {
         token.Skip("true");
         return new JSONBoolean(true);
     }
     if (token.Peeks("false"))
     {
         token.Skip("false");
         return new JSONBoolean(false);
     }
     return null;
 }
 public static new JSONNumber Parse(Token token)
 {
     token.MoveToContent();
     if (_validChars.Contains<char>(token.Current))
     {
         var builder = new StringBuilder();
         while (_validChars.Contains<char>(token.Current))
         {
             builder.Append(token.Current);
             token.Next();
         }
         var value = builder.ToString();
         return new JSONNumber(value, value.Contains('.'));
     }
     return null;
 }
        public HtmlTag(Token token)
        {
            token.Next();
            Name = token.ReadUntil(' ', '/', '>');

            ReadAttributes(token);
            Attributes.Changed += OnAttributesChanged;

            _styles = new HtmlStyleCollection();
            _styles.Changed += OnStylesChanged;
            UpdateStyles();

            token.MoveToContent();

            Closed = token.Peeks('/');

            token.MovePast(">");
        }
 protected void ReadAttributes(Token token)
 {
     var done = false;
     while (!done)
     {
         token.MoveToContent();
         if (token.Peeks("/>") || token.Peeks(">") || token.IsDone)
             done = true;
         else
         {
             string attributeName = token.ReadUntil(' ', '=');
             token.MovePast("=");
             token.MoveToContent();
             string attributeValue;
             if (token.Current == '\'' || token.Current == '"')
             {
                 char delimiter = token.Current;
                 token.Next();
                 attributeValue = token.ReadUntil(delimiter);
                 token.Next();
             }
             else
                 attributeValue = token.ReadUntil(' ', '/', '>');
             _attributes[attributeName] = attributeValue;
         }
     }
 }