--- /dev/null
+package de.juplo.thymeleaf;
+
+
+import org.thymeleaf.Arguments;
+import org.thymeleaf.Configuration;
+import org.thymeleaf.dom.Element;
+import org.thymeleaf.dom.Node;
+import org.thymeleaf.processor.AbstractProcessor;
+import org.thymeleaf.processor.IProcessorMatcher;
+import org.thymeleaf.processor.ProcessorMatchingContext;
+import org.thymeleaf.processor.ProcessorResult;
+import org.thymeleaf.processor.AttributeNameProcessorMatcher;
+import org.thymeleaf.standard.expression.IStandardExpression;
+import org.thymeleaf.standard.expression.IStandardExpressionParser;
+import org.thymeleaf.standard.expression.StandardExpressions;
+
+
+/**
+ * Replaces the element by the tag <code><span></code>, if it is
+ * marked as inactive.
+ * @author Kai Moritz
+ */
+public class InactiveElementProcessor extends AbstractProcessor
+{
+ private final AttributeNameProcessorMatcher matcher =
+ new AttributeNameProcessorMatcher("inactive");
+
+
+ @Override
+ public IProcessorMatcher<? extends Node> getMatcher()
+ {
+ return matcher;
+ }
+
+ @Override
+ protected ProcessorResult doProcess(
+ Arguments arguments,
+ ProcessorMatchingContext context,
+ Node node
+ )
+ {
+ // Because of the type of applicability being used, casts to Element here will not fail
+ final Element element = (Element) node;
+ final String[] names = this.matcher.getAttributeNames(context);
+
+ for (final String name : names)
+ {
+ if (element.hasNormalizedAttribute(name))
+ {
+ Configuration configuration = arguments.getConfiguration();
+ IStandardExpressionParser parser =
+ StandardExpressions.getExpressionParser(configuration);
+ String value = element.getAttributeValue(name);
+ IStandardExpression expression =
+ parser.parseExpression(configuration, arguments, value);
+ element.removeAttribute(name);
+ if ((Boolean)expression.execute(configuration, arguments))
+ {
+ Element strong =
+ element.cloneElementNodeWithNewName(element, "span", true);
+ element.clearChildren();
+ element.addChild(strong);
+ element.getParent().extractChild(element);
+ }
+ break;
+ }
+ }
+ return ProcessorResult.OK;
+ }
+
+ @Override
+ public int getPrecedence()
+ {
+ // Be sure to be executed first
+ return 0;
+ }
+}