private void matches(boolean own) { tq.consume(own ? ":matchesOwn" : ":matches"); String regex = tq.chompBalanced('(', ')'); // don't unescape, as regex bits will be escaped Validate.notEmpty(regex, ":matches(regex) query must not be empty"); if (own) evals.add(new Evaluator.MatchesOwn(Pattern.compile(regex))); else evals.add(new Evaluator.Matches(Pattern.compile(regex))); }
/** * Parse the query * @return Evaluator */ Evaluator parse() { tq.consumeWhitespace(); if (tq.matchesAny(combinators)) { // if starts with a combinator, use root as elements evals.add(new StructuralEvaluator.Root()); combinator(tq.consume()); } else { findElements(); } while (!tq.isEmpty()) { // hierarchy and extras boolean seenWhite = tq.consumeWhitespace(); if (tq.matchesAny(combinators)) { combinator(tq.consume()); } else if (seenWhite) { combinator(' '); } else { // E.class, E#id, E[attr] etc. AND findElements(); // take next el, #. etc off queue } } if (evals.size() == 1) return evals.get(0); return new CombiningEvaluator.And(evals); }
private void parseEndTag() { tq.consume("</"); String tagName = tq.consumeTagName(); tq.chompTo(">"); if (!Strings.empty(tagName)) { Tag tag = Tag.valueOf(tagName); popStackToClose(tag); } }
private String consumeSubQuery() { StringBuilder sq = new StringBuilder(); while (!tq.isEmpty()) { if (tq.matches("(")) sq.append("(").append(tq.chompBalanced('(', ')')).append(")"); else if (tq.matches("[")) sq.append("[").append(tq.chompBalanced('[', ']')).append("]"); else if (tq.matchesAny(combinators)) break; else sq.append(tq.consume()); } return sq.toString(); }
private void parseEndTag() { tq.consume("</"); String tagName = tq.consumeTagName(); tq.chompTo(">"); if (!Strings.empty(tagName)) { Tag tag = Tag.valueOf(tagName); popStackToClose(tag); } }
Character c = consume(); if (last == 0 || last != ESC) { if (c.equals('\'') && c != open && !inDoubleQuote)
private void parseEndTag() { tq.consume("</"); String tagName = tq.consumeTagName(); tq.chompTo(">"); if (!Strings.empty(tagName)) { Tag tag = Tag.valueOf(tagName); popStackToClose(tag); } }
private void not() { tq.consume(":not"); String subQuery = tq.chompBalanced('(', ')'); Validate.notEmpty(subQuery, ":not(selector) subselect must not be empty"); evals.add(new StructuralEvaluator.Not(parse(subQuery))); } }
private void has() { tq.consume(":has"); String subQuery = tq.chompBalanced('(', ')'); Validate.notEmpty(subQuery, ":has(el) subselect must not be empty"); evals.add(new StructuralEvaluator.Has(parse(subQuery))); }
private void contains(boolean own) { tq.consume(own ? ":containsOwn" : ":contains"); String searchText = TokenQueue.unescape(tq.chompBalanced('(', ')')); Validate.notEmpty(searchText, ":contains(text) query must not be empty"); if (own) evals.add(new Evaluator.ContainsOwnText(searchText)); else evals.add(new Evaluator.ContainsText(searchText)); }
private void containsData() { tq.consume(":containsData"); String searchText = TokenQueue.unescape(tq.chompBalanced('(', ')')); Validate.notEmpty(searchText, ":containsData(text) query must not be empty"); evals.add(new Evaluator.ContainsData(searchText)); }
private void parseXmlDecl() { tq.consume("<"); Character firstChar = tq.consume(); // <? or <!, from initial match. boolean procInstr = firstChar.toString().equals("!"); String data = tq.chompTo(">"); XmlDeclaration decl = new XmlDeclaration(data, baseUri, procInstr); annotate(decl); // TODO - should annotations even apply to declarations? lines(decl, data); add(decl); }
private void parseXmlDecl() { tq.consume("<"); Character firstChar = tq.consume(); // <? or <!, from initial match. boolean procInstr = firstChar.toString().equals("!"); String data = tq.chompTo(">"); XmlDeclaration decl = new XmlDeclaration(data, baseUri, procInstr); annotate(decl); // TODO - should annotations even apply to declarations? lines(decl, data); add(decl); }
private void parseXmlDecl() { tq.consume("<"); Character firstChar = tq.consume(); // <? or <!, from initial match. boolean procInstr = firstChar.toString().equals("!"); String data = tq.chompTo(">"); XmlDeclaration decl = new XmlDeclaration(data, baseUri, procInstr); annotate(decl); // TODO - should annotations even apply to declarations? lines(decl, data); add(decl); }
private void parseComment() { tq.consume("<!--"); String data = tq.chompTo("->"); if (data.endsWith("-")) // i.e. was --> data = data.substring(0, data.length() - 1); Comment comment = new Comment(data, baseUri); annotate(comment); // TODO - should annotations even apply to comments? lines(comment, data); add(comment); }
private void parseComment() { tq.consume("<!--"); String data = tq.chompTo("->"); if (data.endsWith("-")) // i.e. was --> data = data.substring(0, data.length() - 1); Comment comment = new Comment(data, baseUri); annotate(comment); // TODO - should annotations even apply to comments? lines(comment, data); add(comment); }
private void parseComment() { tq.consume("<!--"); String data = tq.chompTo("->"); if (data.endsWith("-")) // i.e. was --> data = data.substring(0, data.length() - 1); Comment comment = new Comment(data, baseUri); annotate(comment); // TODO - should annotations even apply to comments? lines(comment, data); add(comment); }
private void parseCdata() { tq.consume("<![CDATA["); String rawText = tq.chompTo("]]>"); TextNode textNode = new TextNode(rawText, baseUri); // constructor does not escape if (pendingAnnotation != null) pendingAnnotation.apply(textNode); lines(textNode, rawText); add(textNode); }
private void parseCdata() { tq.consume("<![CDATA["); String rawText = tq.chompTo("]]>"); TextNode textNode = new TextNode(rawText, baseUri); // constructor does not escape if (pendingAnnotation != null) pendingAnnotation.apply(textNode); lines(textNode, rawText); add(textNode); }
private void parseCdata() { tq.consume("<![CDATA["); String rawText = tq.chompTo("]]>"); TextNode textNode = new TextNode(rawText, baseUri); // constructor does not escape if (pendingAnnotation != null) pendingAnnotation.apply(textNode); lines(textNode, rawText); add(textNode); }