use of jetbrick.template.parser.grammer.JetTemplateParser.TemplateContext in project jetbrick-template-1x by subchen.
the class JetTemplateCodeVisitor method visitBlock.
@Override
public Code visitBlock(BlockContext ctx) {
int size = ctx.getChildCount();
BlockCode code = scopeCode.createBlockCode(size);
if (size == 0)
return code;
for (int i = 0; i < size; i++) {
ParseTree node = ctx.children.get(i);
Code c = node.accept(this);
if (node instanceof TextContext) {
// 文本节点
TextCode textCode = (TextCode) c;
if (trimDirectiveLine || trimDirectiveComments) {
ParseTree prev = (i > 0) ? ctx.children.get(i - 1) : null;
ParseTree next = (i < size - 1) ? ctx.children.get(i + 1) : null;
boolean trimLeft;
boolean keepLeftNewLine = false;
if (prev == null) {
trimLeft = !(ctx.getParent() instanceof TemplateContext);
} else {
trimLeft = prev instanceof DirectiveContext;
if (trimLeft) {
// inline directive, 对于一个内联的 #if, #for 指令,后面有要求保留一个 NewLine
// @see https://github.com/subchen/jetbrick-template/issues/25
ParserRuleContext directive = (ParserRuleContext) ((DirectiveContext) prev).getChild(0);
if (directive instanceof If_directiveContext || directive instanceof For_directiveContext) {
if (directive.getStart().getLine() == directive.getStop().getLine()) {
// 保留一个 NewLine
keepLeftNewLine = true;
}
}
}
}
boolean trimRight;
if (next == null) {
trimRight = !(ctx.getParent() instanceof TemplateContext);
} else {
trimRight = (next instanceof DirectiveContext);
}
// trim 指令两边的注释
if (trimDirectiveComments) {
textCode.trimComments(trimLeft, trimRight, commentsPrefix, commentsSuffix);
}
// trim 指令两边的空白内容
if (trimDirectiveLine) {
textCode.trimEmptyLine(trimLeft, trimRight, keepLeftNewLine);
}
// trim 掉 #tag 和 #macro 指令最后一个多余的 '\n'
if (next == null) {
if (ctx.getParent() instanceof Tag_directiveContext || ctx.getParent() instanceof Macro_directiveContext) {
textCode.trimLastNewLine();
}
}
}
if (!textCode.isEmpty()) {
// 如果有相同内容的Text,则从缓存中读取
TextCode old = textCache.get(textCode.getText());
if (old == null) {
old = textCode;
textCache.put(textCode.getText(), textCode);
// add text into field
tcc.addField(textCode.getId(), textCode.getText());
}
code.addLine(old.toString());
}
} else {
code.addChild(c);
}
}
return code;
}
use of jetbrick.template.parser.grammer.JetTemplateParser.TemplateContext in project jetbrick-template-1x by subchen.
the class JetTemplate method generateJavaSource.
private String generateJavaSource(Resource resource) {
char[] source = resource.getSource();
ANTLRInputStream is = new ANTLRInputStream(source, source.length);
// set source file name, it will be displayed in error report.
is.name = resource.getAbsolutePath();
JetTemplateLexer lexer = new JetTemplateLexer(is);
// remove ConsoleErrorListener
lexer.removeErrorListeners();
lexer.addErrorListener(JetTemplateErrorListener.getInstance());
JetTemplateParser parser = new JetTemplateParser(new CommonTokenStream(lexer));
// remove ConsoleErrorListener
parser.removeErrorListeners();
parser.addErrorListener(JetTemplateErrorListener.getInstance());
parser.setErrorHandler(new JetTemplateErrorStrategy());
TemplateContext templateParseTree = parser.template();
JetTemplateCodeVisitor visitor = new JetTemplateCodeVisitor(engine, engine.getVariableResolver(), engine.getSecurityManager(), parser, resource);
Code code = templateParseTree.accept(visitor);
return code.toString();
}
Aggregations