throw new Selector.SelectorParseException("Unknown combinator: " + combinator);
evaluator = new Evaluator.AttributeWithValueMatching(key, Pattern.compile(XTokenQueue.trimQuotes(chompEqualValue(cq)))); else throw new Selector.SelectorParseException("Could not parse attribute query '%s': unexpected token at '%s'", query, chompEqualValue(cq));
evaluator = byFunction(predicatesQueue); } else { throw new Selector.SelectorParseException("Could not parse query '%s': unexpected token at '%s'", query, predicatesQueue.remainder());
evaluator = new Evaluator.AttributeWithValueMatching(key, Pattern.compile(XTokenQueue.trimQuotes(chompEqualValue(cq)))); else throw new Selector.SelectorParseException("Could not parse attribute query '%s': unexpected token at '%s'", query, chompEqualValue(cq));
evaluator = byFunction(predicatesQueue); } else { throw new Selector.SelectorParseException("Could not parse query '%s': unexpected token at '%s'", query, predicatesQueue.remainder());
private void findElements() { if (tq.matches("@")) { consumeAttribute(); } else if (tq.matches("*")) { allElements(); } else if (tq.matchesRegex("\\w+\\(.*\\).*")) { consumeOperatorFunction(); } else if (tq.matchesWord()) { byTag(); } else if (tq.matchesRegex("\\[\\d+\\]")) { byNth(); } else if (tq.matches("[")) { evals.add(consumePredicates(tq.chompBalanced('[', ']'))); } else { // unhandled throw new Selector.SelectorParseException("Could not parse query '%s': unexpected token at '%s'", query, tq.remainder()); } }
private void functionRegex(String remainder) { Validate.isTrue(remainder.endsWith(")"), "Unclosed bracket for function! " + remainder); List<String> params = XTokenQueue.trimQuotes(XTokenQueue.parseFuncionParams(remainder.substring("regex(".length(), remainder.length() - 1))); if (params.size() == 1) { elementOperator = new ElementOperator.Regex(params.get(0)); } else if (params.size() == 2) { if (params.get(0).startsWith("@")) { elementOperator = new ElementOperator.Regex(params.get(1), params.get(0).substring(1)); } else { elementOperator = new ElementOperator.Regex(params.get(0), null, Integer.parseInt(params.get(1))); } } else if (params.size() == 3) { elementOperator = new ElementOperator.Regex(params.get(1), params.get(0).substring(1), Integer.parseInt(params.get(2))); } else { throw new Selector.SelectorParseException("Unknown usage for regex()" + remainder); } }
private void findElements() { if (tq.matches("@")) { consumeAttribute(); } else if (tq.matches("*")) { allElements(); } else if (tq.matchesRegex("\\w+\\(.*\\).*")) { consumeOperatorFunction(); } else if (tq.matchesWord()) { byTag(); } else if (tq.matchesRegex("\\[\\d+\\]")) { byNth(); } else if (tq.matches("[")) { evals.add(consumePredicates(tq.chompBalanced('[', ']'))); } else { // unhandled throw new Selector.SelectorParseException("Could not parse query '%s': unexpected token at '%s'", query, tq.remainder()); } }
private Evaluator byFunction(XTokenQueue predicatesQueue) { for (Map.Entry<String, FunctionEvaluator> entry : FUNCTION_MAPPING.entrySet()) { if (predicatesQueue.matchChomp(entry.getKey())) { String paramString = predicatesQueue.chompBalanced('(', ')'); List<String> params = XTokenQueue.trimQuotes(XTokenQueue.parseFuncionParams(paramString)); if (params.get(0).startsWith("@")) { params.set(0, params.get(0).substring(1)); return entry.getValue().call(params.toArray(new String[0])); } else { return null; } } } throw new Selector.SelectorParseException("Could not parse query '%s': unexpected token at '%s'", query, predicatesQueue.remainder()); }
private Evaluator byFunction(XTokenQueue predicatesQueue) { for (Map.Entry<String, FunctionEvaluator> entry : FUNCTION_MAPPING.entrySet()) { if (predicatesQueue.matchChomp(entry.getKey())) { String paramString = predicatesQueue.chompBalanced('(', ')'); List<String> params = XTokenQueue.trimQuotes(XTokenQueue.parseFuncionParams(paramString)); if (params.get(0).startsWith("@")) { params.set(0, params.get(0).substring(1)); return entry.getValue().call(params.toArray(new String[0])); } else { return null; } } } throw new Selector.SelectorParseException("Could not parse query '%s': unexpected token at '%s'", query, predicatesQueue.remainder()); }
private void functionRegex(String remainder) { Validate.isTrue(remainder.endsWith(")"), "Unclosed bracket for function! " + remainder); List<String> params = XTokenQueue.trimQuotes(XTokenQueue.parseFuncionParams(remainder.substring("regex(".length(), remainder.length() - 1))); if (params.size() == 1) { elementOperator = new ElementOperator.Regex(params.get(0)); } else if (params.size() == 2) { if (params.get(0).startsWith("@")) { elementOperator = new ElementOperator.Regex(params.get(1), params.get(0).substring(1)); } else { elementOperator = new ElementOperator.Regex(params.get(0), null, Integer.parseInt(params.get(1))); } } else if (params.size() == 3) { elementOperator = new ElementOperator.Regex(params.get(1), params.get(0).substring(1), Integer.parseInt(params.get(2))); } else { throw new Selector.SelectorParseException("Unknown usage for regex()" + remainder); } }
evals.add(new Evaluator.MatchText()); else // unhandled throw new Selector.SelectorParseException("Could not parse query '%s': unexpected token at '%s'", query, tq.remainder());
b = Integer.parseInt(mB.group().replaceFirst("^\\+", "")); } else { throw new Selector.SelectorParseException("Could not parse nth-index '%s': unexpected format", argS);
private void byAttribute() { TokenQueue cq = new TokenQueue(tq.chompBalanced('[', ']')); // content queue String key = cq.consumeToAny(AttributeEvals); // eq, not, start, end, contain, match, (no val) Validate.notEmpty(key); cq.consumeWhitespace(); if (cq.isEmpty()) { if (key.startsWith("^")) 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, Pattern.compile(cq.remainder()))); else throw new Selector.SelectorParseException("Could not parse attribute query '%s': unexpected token at '%s'", query, cq.remainder()); } }
/** * Parse a CSS query into an Evaluator. * @param query CSS query * @return Evaluator */ public static Evaluator parse(String query) { try { QueryParser p = new QueryParser(query); return p.parse(); } catch (IllegalArgumentException e) { throw new Selector.SelectorParseException(e.getMessage()); } }