From b84e25ddcb54614b661f4e547f8e9d83a2e08642 Mon Sep 17 00:00:00 2001 From: Kai Moritz Date: Sun, 10 Jan 2016 18:48:10 +0100 Subject: [PATCH] Implemented juplo:active, that replaces active -tags by the tag --- .../thymeleaf/ActiveElementProcessor.java | 77 +++++++++++++++++++ .../java/de/juplo/thymeleaf/JuploDialect.java | 35 +++++++++ 2 files changed, 112 insertions(+) create mode 100644 src/main/java/de/juplo/thymeleaf/ActiveElementProcessor.java create mode 100644 src/main/java/de/juplo/thymeleaf/JuploDialect.java diff --git a/src/main/java/de/juplo/thymeleaf/ActiveElementProcessor.java b/src/main/java/de/juplo/thymeleaf/ActiveElementProcessor.java new file mode 100644 index 0000000..9f714a0 --- /dev/null +++ b/src/main/java/de/juplo/thymeleaf/ActiveElementProcessor.java @@ -0,0 +1,77 @@ +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 <strong>, if it is + * marked as active. + * @author Kai Moritz + */ +public class ActiveElementProcessor extends AbstractProcessor +{ + private final AttributeNameProcessorMatcher matcher = + new AttributeNameProcessorMatcher("active"); + + + @Override + public IProcessorMatcher 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, "strong", 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; + } +} diff --git a/src/main/java/de/juplo/thymeleaf/JuploDialect.java b/src/main/java/de/juplo/thymeleaf/JuploDialect.java new file mode 100644 index 0000000..40f2bb1 --- /dev/null +++ b/src/main/java/de/juplo/thymeleaf/JuploDialect.java @@ -0,0 +1,35 @@ +package de.juplo.thymeleaf; + + +import java.util.HashSet; +import java.util.Set; +import org.thymeleaf.dialect.AbstractDialect; +import org.thymeleaf.processor.IProcessor; + + +/** + * A collection of usefull tools. + * @author Kai Moritz + */ +public class JuploDialect extends AbstractDialect +{ + public JuploDialect() + { + super(); + } + + + @Override + public String getPrefix() + { + return "juplo"; + } + + @Override + public Set getProcessors() + { + final Set processors = new HashSet<>(); + processors.add(new ActiveElementProcessor()); + return processors; + } +} -- 2.20.1