private void byAttribute() { TokenQueue cq = new TokenQueue(tq.ChompBalanced('[', ']')); // content queue string key = cq.ConsumeToAny("=", "!=", "^=", "$=", "*=", "~="); // eq, not, start, end, contain, match, (no val) if (key.Length == 0) throw Failure.EmptyString("key"); cq.ConsumeWhitespace(); if (cq.IsEmpty) { if (key.StartsWith("^", StringComparison.Ordinal)) evals.Add(new Evaluator.AttributeStarting(key.Substring(1))); else evals.Add(new Evaluator.Attribute(key)); } else { if (cq.MatchChomp("=")) evals.Add(new Evaluator.AttributeWithValue(key, cq.Remainder())); else if (cq.MatchChomp("!=")) evals.Add(new Evaluator.AttributeWithValueNot(key, cq.Remainder())); else if (cq.MatchChomp("^=")) evals.Add(new Evaluator.AttributeWithValueStarting(key, cq.Remainder())); else if (cq.MatchChomp("$=")) evals.Add(new Evaluator.AttributeWithValueEnding(key, cq.Remainder())); else if (cq.MatchChomp("*=")) evals.Add(new Evaluator.AttributeWithValueContaining(key, cq.Remainder())); else if (cq.MatchChomp("~=")) evals.Add(new Evaluator.AttributeWithValueMatching(key, new Regex(cq.Remainder()))); else throw DomFailure.CannotParseAttributeQuery(query, cq.Remainder()); } }