public PluginInvoke invoke()

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