Pebbel是java 模板引擎,给我的感觉就是简单,强大,模板也很简洁,还有相当强大的继承功能
pebble的标签和html的标签不一样,pebble的标签以 {% 开头,以 %}结束,具体请见 https://pebbletemplates.io/wiki/ ,要想实现一个标签很简单,只需要实现 TokenParser
接口,TokenParser
负责解析,返回一个RenderableNode
负责渲染,RenderableNode
默认会被缓存,请务必保证线程安全
TokenParser
的解析有点奇怪,例如 {% if expression%} 那么这里的expression就不是一个属性,而是一个表达式,{% set header="I'm header"%} 这里就有一个header的属性,如果希望支持多个属性,可以参考SetTokenParser
依葫芦画瓢这样做:
abstract class MultiAttributesTag implements TokenParser {
@Override
public RenderableNode parse(Token token, Parser parser) {
TokenStream stream = parser.getStream();
int lineNumber = token.getLineNumber();
// skip the tag name token
stream.next();
Map<String, Expression<?>> attributes = new HashMap<>();
while (!stream.current().test(Token.Type.EXECUTE_END)) {
String name = parser.getExpressionParser().parseNewVariableName();
stream.expect(Token.Type.PUNCTUATION, "=");
Expression<?> value = parser.getExpressionParser().parseExpression();
attributes.put(name, value);
}
stream.expect(Token.Type.EXECUTE_END);
return getRenderableNode(lineNumber,attributes,token,parser);
}
protected abstract RenderableNode getRenderableNode(int lineNumber,Map<String,Expression<?>> attributes,Token token,Parser parser);
}