private Node parseMixinInject() { Token token = expect(MixinInject.class); MixinInject mixinInjectToken = (MixinInject) token; MixinInjectNode node = new MixinInjectNode(); node.setName(mixinInjectToken.getValue()); node.setLineNumber(mixinInjectToken.getLineNumber()); node.setFileName(filename); if (StringUtils.isNotBlank(mixinInjectToken.getArguments())) { node.setArguments(mixinInjectToken.getArguments()); } while (true) { Token incomingToken = peek(); if (incomingToken instanceof CssId) { Token tok = nextToken(); node.addAttribute("id", tok.getValue()); } else if (incomingToken instanceof CssClass) { Token tok = nextToken(); node.addAttribute("class", tok.getValue()); } else if (incomingToken instanceof Attribute) { Attribute tok = (Attribute) nextToken(); node.addAttributes(tok.getAttributes()); } else { break; } } if (peek() instanceof Text) { node.setBlock(parseText()); } else if (peek() instanceof Indent) { node.setBlock(block()); } return node; }
private Node parseASTFilter() { Token token = expect(Filter.class); Filter filterToken = (Filter) token; Attribute attr = (Attribute) accept(Attribute.class); token = expect(Colon.class); FilterNode node = new FilterNode(); node.setValue(filterToken.getValue()); node.setBlock(block()); node.setLineNumber(line()); node.setFileName(filename); node.setAttributes(attr.getAttributes()); return node; }
private Node parseFilter() { Token token = expect(Filter.class); Filter filterToken = (Filter) token; Attribute attr = (Attribute) accept(Attribute.class); lexer.setPipeless(true); Node tNode = parseTextBlock(); lexer.setPipeless(false); FilterNode node = new FilterNode(); node.setValue(filterToken.getValue()); node.setLineNumber(line()); node.setFileName(filename); node.setTextBlock(tNode); if (attr != null) { node.setAttributes(attr.getAttributes()); } return node; }
private Node parseTag() { // ast-filter look-ahead int i = 2; if (lookahead(i) instanceof Attribute) { i++; } if (lookahead(i) instanceof Colon) { i++; if (lookahead(i) instanceof Indent) { return this.parseASTFilter(); } } Token token = nextToken(); String name = token.getValue(); TagNode tagNode = new TagNode(); tagNode.setLineNumber(lexer.getLineno()); tagNode.setFileName(filename); tagNode.setName(name); tagNode.setValue(name); while (true) { Token incomingToken = peek(); if (incomingToken instanceof CssId) { Token tok = nextToken(); tagNode.addAttribute("id", tok.getValue()); continue; } else if (incomingToken instanceof CssClass) { Token tok = nextToken(); tagNode.addAttribute("class", tok.getValue()); continue; } else if (incomingToken instanceof Attribute) { Attribute tok = (Attribute) nextToken(); tagNode.addAttributes(tok.getAttributes()); continue; } else { break; } } // check immediate '.' boolean dot = false; if (peek() instanceof Dot) { dot = true; tagNode.setTextOnly(true); nextToken(); } // (text | code | ':')? if (peek() instanceof Text) { tagNode.setTextNode(parseText()); } else if (peek() instanceof Expression) { tagNode.setCodeNode(parseCode()); } else if (peek() instanceof Colon) { Token next = nextToken(); BlockNode block = new BlockNode(); block.setLineNumber(next.getLineNumber()); block.setFileName(filename); tagNode.setBlock(block); block.push(parseExpr()); } // newline* while (peek() instanceof Newline) { nextToken(); } if (!tagNode.isTextOnly()) { if (Arrays.asList(textOnlyTags).contains(tagNode.getName())) { tagNode.setTextOnly(true); } } // script special-case if ("script".equals(tagNode.getName())) { String type = tagNode.getAttribute("type"); if (!dot && StringUtils.isNotBlank(type)) { String cleanType = type.replaceAll("^['\"]|['\"]$", ""); if (!"text/javascript".equals(cleanType)) { tagNode.setTextOnly(false); } } } if (peek() instanceof Indent) { if (tagNode.isTextOnly()) { lexer.setPipeless(true); tagNode.setTextNode(parseTextBlock()); lexer.setPipeless(false); } else { Node blockNode = block(); if (tagNode.hasBlock()) { tagNode.getBlock().getNodes().addAll(blockNode.getNodes()); } else { tagNode.setBlock(blockNode); } } } return tagNode; }