TagHook.java
package pro.verron.officestamper.core;
import pro.verron.officestamper.api.DocxPart;
import pro.verron.officestamper.api.ProcessorContext;
import pro.verron.officestamper.utils.wml.WmlUtils;
/// Hook for processing tags.
public class TagHook
implements DocxHook {
private final Tag tag;
private final DocxPart part;
TagHook(DocxPart part, Tag tag) {
this.tag = tag;
this.part = part;
}
@Override
public boolean run(
EngineFactory engineFactory,
ContextRoot contextRoot,
OfficeStamperEvaluationContextFactory evaluationContextFactory
) {
var comment = tag.asComment();
var paragraph = tag.getParagraph();
var expression = tag.expression();
var contextKey = tag.getContextKey();
var contextStack = contextRoot.find(contextKey);
var processorContext = new ProcessorContext(part, paragraph, comment, expression, contextStack);
var evaluationContext = evaluationContextFactory.create(processorContext, contextStack);
var engine = engineFactory.create(processorContext);
var tagType = tag.type()
.orElse(null);
boolean processed = false;
if ("inlineProcessor".equals(tagType)) {
if (engine.process(evaluationContext)) processed = true;
tag.remove();
}
else if ("placeholder".equals(tagType)) {
var insert = engine.resolve(evaluationContext);
processed = true;
tag.replace(insert);
}
return processed;
}
@Override
public void setContextKey(String contextKey) {
WmlUtils.setTagAttribute(tag.tag(), "context", contextKey);
}
}