public boolean canInline (){ Node block = this.getBlock(); if(block==null) return true; LinkedList<Node> nodes = block.getNodes(); // Empty tag if (nodes.size()==0) return true; // Text-only or inline-only tag if (1 == nodes.size()) return isInline(nodes.get(0)); // Multi-line inline-only tag if (everyIsInline(nodes)) { for (int i = 1, len = nodes.size(); i < len; ++i) { if (nodes.get(i-1) instanceof TextNode && nodes.get(i) instanceof TextNode) return false; } return true; } // Mixed tag return false; }; @Override
private boolean isInline(Node node){ // Recurse if the node is a block if (node instanceof BlockNode) return everyIsInline(node.getNodes()); return node instanceof TextNode || (ArrayUtils.indexOf(inlineTags,node.getName()) > -1); } private boolean everyIsInline(LinkedList<Node> nodes){
private List<MixinBlockNode> getInjectionPoints(Node block) { List<MixinBlockNode> result = new ArrayList<MixinBlockNode>(); for (Node node : block.getNodes()) { if (node instanceof MixinBlockNode && !node.hasNodes()) { result.add((MixinBlockNode) node); } else if(node instanceof ConditionalNode){ for (IfConditionNode condition : ((ConditionalNode) node).getConditions()) { result.addAll(getInjectionPoints(condition.getBlock())); } // } else if(node instanceof CaseNode.When){ // for (CaseConditionNode condition : ((CaseNode) node).getCaseConditionNodes()) { // result.addAll(getInjectionPoints(condition.getBlock())); // } } else if (node.hasBlock()) { result.addAll(getInjectionPoints(node.getBlock())); } } return result; }
@Override public void execute(IndentWriter writer, JadeModel model, JadeTemplate template) throws JadeCompilerException { Filter filter = model.getFilter(getValue()); ArrayList<String> values = new ArrayList<String>(); LinkedList<Node> nodes = textBlock.getNodes(); for (Node node : nodes) { values.add(node.getValue()); } String result = StringUtils.join(values, "\n"); if (filter != null) { result = filter.convert(result, attributes, model); } try { result = Utils.interpolate(result, model, false,template.getExpressionHandler()); } catch (ExpressionException e) { throw new JadeCompilerException(this, template.getTemplateLoader(), e); } writer.append(result); }
public Node parse() { BlockNode block = new BlockNode(); block.setLineNumber(lexer.getLineno()); block.setFileName(filename); while (!(peek() instanceof Eos)) { if (peek() instanceof Newline) { advance(); } else { Node expr = parseExpr(); if (expr != null) { block.push(expr); } } } if (extending != null) { getContexts().push(extending); Node rootNode = extending.parse(); getContexts().pop(); // hoist mixins Set<String> keySet = this.mixins.keySet(); for (String name : keySet) { rootNode.getNodes().push(this.mixins.get(name)); } return rootNode; } return block; }
@Override public void execute(IndentWriter writer, JadeModel model, JadeTemplate template) throws JadeCompilerException { try { boolean skip = false; for (Node when : block.getNodes()) { if (skip || "default".equals(when.getValue()) || checkCondition(model, when,template.getExpressionHandler())) { skip = false; if(when.getBlock()!=null) { when.execute(writer, model, template); break; }else { skip = true; } } } } catch (ExpressionException e) { throw new JadeCompilerException(this, template.getTemplateLoader(), e); } }
private Node parseCall() { Token token = expect(Call.class); Call callToken = (Call) token; MixinNode mixin = new MixinNode(); mixin.setBlock(new BlockNode()); mixin.setName(callToken.getValue()); mixin.setLineNumber(callToken.getLineNumber()); mixin.setFileName(filename); mixin.setCall(true); if (StringUtils.isNotBlank(callToken.getArguments())) { mixin.setArguments(callToken.getArguments()); } this.tag(mixin); if(mixin.hasCodeNode()) { mixin.getBlock().push(mixin.getCodeNode()); mixin.setCodeNode(null); } if(mixin.hasBlock() && mixin.getBlock().getNodes().isEmpty()) mixin.setBlock(null); return mixin; }
public boolean canInline (){ Node block = this.getBlock(); if(block==null) return true; LinkedList<Node> nodes = block.getNodes(); // Empty tag if (nodes.size()==0) return true; // Text-only or inline-only tag if (1 == nodes.size()) return isInline(nodes.get(0)); // Multi-line inline-only tag if (everyIsInline(nodes)) { for (int i = 1, len = nodes.size(); i < len; ++i) { if (nodes.get(i-1) instanceof TextNode && nodes.get(i) instanceof TextNode) return false; } return true; } // Mixed tag return false; }; @Override
private boolean isInline(Node node){ // Recurse if the node is a block if (node instanceof BlockNode) return everyIsInline(node.getNodes()); return node instanceof TextNode || (ArrayUtils.indexOf(inlineTags,node.getName()) > -1); } private boolean everyIsInline(LinkedList<Node> nodes){
private List<MixinBlockNode> getInjectionPoints(Node block) { List<MixinBlockNode> result = new ArrayList<MixinBlockNode>(); for (Node node : block.getNodes()) { if (node instanceof MixinBlockNode && !node.hasNodes()) { result.add((MixinBlockNode) node); } else if(node instanceof ConditionalNode){ for (IfConditionNode condition : ((ConditionalNode) node).getConditions()) { result.addAll(getInjectionPoints(condition.getBlock())); } // } else if(node instanceof CaseNode.When){ // for (CaseConditionNode condition : ((CaseNode) node).getCaseConditionNodes()) { // result.addAll(getInjectionPoints(condition.getBlock())); // } } else if (node.hasBlock()) { result.addAll(getInjectionPoints(node.getBlock())); } } return result; }
@Override public void execute(IndentWriter writer, JadeModel model, JadeTemplate template) throws JadeCompilerException { Filter filter = model.getFilter(getValue()); ArrayList<String> values = new ArrayList<String>(); LinkedList<Node> nodes = textBlock.getNodes(); for (Node node : nodes) { values.add(node.getValue()); } String result = StringUtils.join(values, "\n"); if (filter != null) { result = filter.convert(result, attributes, model); } try { result = Utils.interpolate(result, model, false,template.getExpressionHandler()); } catch (ExpressionException e) { throw new JadeCompilerException(this, template.getTemplateLoader(), e); } writer.append(result); }
public Node parse() { BlockNode block = new BlockNode(); block.setLineNumber(lexer.getLineno()); block.setFileName(filename); while (!(peek() instanceof Eos)) { if (peek() instanceof Newline) { advance(); } else { Node expr = parseExpr(); if (expr != null) { block.push(expr); } } } if (extending != null) { getContexts().push(extending); Node rootNode = extending.parse(); getContexts().pop(); // hoist mixins Set<String> keySet = this.mixins.keySet(); for (String name : keySet) { rootNode.getNodes().push(this.mixins.get(name)); } return rootNode; } return block; }
@Override public void execute(IndentWriter writer, JadeModel model, JadeTemplate template) throws JadeCompilerException { try { boolean skip = false; for (Node when : block.getNodes()) { if (skip || "default".equals(when.getValue()) || checkCondition(model, when,template.getExpressionHandler())) { skip = false; if(when.getBlock()!=null) { when.execute(writer, model, template); break; }else { skip = true; } } } } catch (ExpressionException e) { throw new JadeCompilerException(this, template.getTemplateLoader(), e); } }
private Node parseCall() { Token token = expect(Call.class); Call callToken = (Call) token; MixinNode mixin = new MixinNode(); mixin.setBlock(new BlockNode()); mixin.setName(callToken.getValue()); mixin.setLineNumber(callToken.getLineNumber()); mixin.setFileName(filename); mixin.setCall(true); if (StringUtils.isNotBlank(callToken.getArguments())) { mixin.setArguments(callToken.getArguments()); } this.tag(mixin); if(mixin.hasCodeNode()) { mixin.getBlock().push(mixin.getCodeNode()); mixin.setCodeNode(null); } if(mixin.hasBlock() && mixin.getBlock().getNodes().isEmpty()) mixin.setBlock(null); return mixin; }