/** * Copyright 2010 Bing Ran<bing_ran@hotmail.com> * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy * of the License at http://www.apache.org/licenses/LICENSE-2.0. * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package cn.bran.japid.compiler; import cn.bran.japid.classmeta.AbstractTemplateClassMetaData; import cn.bran.japid.classmeta.LayoutClassMetaData; import cn.bran.japid.compiler.Tag.TagSet; /** * Code partly from Play! Framework * * specifically for layouts * * supprt #{get xxx}, #{doLayout /} will allow param for doLayout later. * * */ public class JapidLayoutCompiler extends JapidAbstractCompiler { // StringBuilder mainRenderBodySource = new StringBuilder(); LayoutClassMetaData cmd = new LayoutClassMetaData(); @Override protected void startTag(Tag tag) { if ("get".equals(tag.tagName)) { if (tag.hasBody) { throw new JapidCompilationException(template, parser.getLineNumber(), "get tag cannot have a body. "); } String var = tag.args; var = var.replace("'", ""); var = var.replace("\"", ""); this.cmd.get(var); print(var + "();"); } else if (DO_LAYOUT.equals(tag.tagName)) { print("doLayout();"); } else if (tag.tagName.equals("def")) { def(tag); } else { regularTagInvoke(tag); } pushToStack(tag); markLine(parser.getLineNumber()); println(); skipLineBreak = true; } @Override protected AbstractTemplateClassMetaData getTemplateClassMetaData() { return cmd; } @Override protected void scriptline(String token) { String line = token; //.trim(); no trim. some tags are space sensitive if (JapidAbstractCompiler.startsWithIgnoreSpace(line.trim(), DO_LAYOUT) || line.trim().equals(DO_LAYOUT)) { printLine("doLayout();"); skipLineBreak = true; } else { super.scriptline(token); } } @Override void endSet(TagSet tag) { // should allow set in layout? } }