Ejemplo n.º 1
0
  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;
  }
Ejemplo n.º 2
0
  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;
  }
Ejemplo n.º 3
0
  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;
  }
Ejemplo n.º 4
0
  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;
  }