package net.asfun.jangod.lib.macro; import net.asfun.jangod.lib.Macro; import net.asfun.jangod.parse.ParseException; import net.asfun.jangod.tree.Node; import net.asfun.jangod.tree.TreeRebuilder; import net.asfun.jangod.util.HelperStringTokenizer; public class BlockMacro implements Macro { final String MACRONAME = "block"; final String ENDMACRONAME = "endblock"; final String BLK_NAME_PREFIX = "'BLK\"NAME:"; @Override public String getEndMacroName() { return ENDMACRONAME; } @Override public void refactor(Node current, String helpers, TreeRebuilder rebuilder) throws ParseException { String[] helper = new HelperStringTokenizer(helpers).allTokens(); if (helper.length != 1) { throw new ParseException("Macro 'block' expects 1 helper >>> " + helper.length); } String blockName = rebuilder.resolveString(helper[0]); // if is parent if (rebuilder.parent == null) { rebuilder.assignNode(BLK_NAME_PREFIX + blockName, current); } else { Node parentBlock = rebuilder.fetchNode(BLK_NAME_PREFIX + blockName); if (parentBlock == null) { throw new ParseException( "Dosen't define block in extends parent with name >>> " + blockName); } // current.replaceWithChildren(parentBlock); rebuilder.nodeReplace(parentBlock, current.children()); } } @Override public String getName() { return MACRONAME; } }