in src/main/java/org/apache/sling/scripting/sightly/impl/plugin/ElementPlugin.java [69:146]
public PluginInvoke invoke(
final Expression expression, final PluginCallInfo callInfo, final CompilerContext compilerContext) {
return new DefaultPluginInvoke() {
private final ExpressionNode node =
adjustContext(compilerContext, expression).getRoot();
private final String tagVar = compilerContext.generateVariable("tagVar");
private final String tagAllowed = compilerContext.generateVariable("tagAllowed");
private final String voidElements = compilerContext.generateGlobalVariable("elementPluginVoidElements");
private final String selfClosingTag = compilerContext.generateVariable("selfClosingTag");
@Override
public void beforeElement(PushStream stream, String tagName) {
stream.write(
new VariableBinding.Global(voidElements, new ArrayLiteral(new ArrayList<>(VOID_ELEMENTS))));
stream.write(new VariableBinding.Start(tagVar, node));
stream.write(new VariableBinding.Start(
tagAllowed,
new UnaryOperation(
UnaryOperator.NOT, new UnaryOperation(UnaryOperator.NOT, new Identifier(tagVar)))));
}
@Override
public void beforeTagOpen(PushStream stream) {
stream.write(new Conditional.Start(tagAllowed, true));
stream.write(new OutText("<"));
stream.write(new OutputVariable(tagVar));
stream.write(Conditional.END);
stream.write(new Conditional.Start(tagAllowed, false));
}
@Override
public void beforeAttributes(PushStream stream) {
stream.write(Conditional.END);
}
@Override
public void afterAttributes(PushStream stream) {
stream.write(new Conditional.Start(tagAllowed, true));
stream.write(new OutText(">"));
stream.write(Conditional.END);
stream.write(new Conditional.Start(tagAllowed, false));
}
@Override
public void afterTagOpen(PushStream stream) {
stream.write(Conditional.END);
}
@Override
public void beforeTagClose(PushStream stream, boolean isSelfClosing) {
stream.write(new Conditional.Start(tagAllowed, true));
stream.write(new VariableBinding.Start(
selfClosingTag,
new BinaryOperation(BinaryOperator.IN, new Identifier(tagVar), new Identifier(voidElements))));
stream.write(new Conditional.Start(selfClosingTag, false));
stream.write(new OutText("</"));
stream.write(new OutputVariable(tagVar));
stream.write(new OutText(">"));
stream.write(Conditional.END);
stream.write(VariableBinding.END);
stream.write(Conditional.END);
stream.write(new Conditional.Start(tagAllowed, false));
}
@Override
public void afterTagClose(PushStream stream, boolean isSelfClosing) {
stream.write(Conditional.END);
}
@Override
public void afterElement(PushStream stream) {
stream.write(VariableBinding.END);
stream.write(VariableBinding.END);
}
};
}