public PluginInvoke invoke()

in src/main/java/org/apache/sling/scripting/sightly/impl/plugin/ElementPlugin.java [61:136]


    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);
            }
        };

    }