in src/main/java/org/apache/sling/scripting/sightly/impl/plugin/UnwrapPlugin.java [43:114]
public PluginInvoke invoke(final Expression expression, final PluginCallInfo callInfo, final CompilerContext compilerContext) {
return new DefaultPluginInvoke() {
private Command unwrapTest;
private boolean isSlyTag = false;
private String identifierName = decodeVariableName(callInfo);
private boolean globalBinding;
@Override
public void beforeElement(PushStream stream, String tagName) {
globalBinding = identifierName != null;
if (identifierName == null) {
identifierName = compilerContext.generateVariable("unwrapCondition");
}
if (globalBinding) {
stream.write(new VariableBinding.Global(identifierName, expression.getRoot()));
} else {
stream.write(new VariableBinding.Start(identifierName, testNode()));
}
isSlyTag = "sly".equals(tagName.toLowerCase());
unwrapTest = new Conditional.Start(identifierName, false);
}
@Override
public void beforeTagOpen(PushStream stream) {
if (isSlyTag) {
Patterns.endStreamIgnore(stream);
}
stream.write(unwrapTest);
}
@Override
public void afterTagOpen(PushStream stream) {
stream.write(Conditional.END);
if (isSlyTag) {
Patterns.beginStreamIgnore(stream);
}
}
@Override
public void beforeTagClose(PushStream stream, boolean isSelfClosing) {
if (isSlyTag) {
Patterns.endStreamIgnore(stream);
}
stream.write(unwrapTest);
}
@Override
public void afterTagClose(PushStream stream, boolean isSelfClosing) {
stream.write(Conditional.END);
if (isSlyTag) {
Patterns.beginStreamIgnore(stream);
}
}
@Override
public void afterElement(PushStream stream) {
if (!globalBinding) {
stream.write(VariableBinding.END);
}
}
private ExpressionNode testNode() {
return (isEmptyExpression(expression.getRoot())) ? BooleanConstant.TRUE : expression.getRoot();
}
private boolean isEmptyExpression(ExpressionNode node) {
return node instanceof StringConstant && ((StringConstant) node).getText().isEmpty();
}
};
}