RepeatRowProcessor.java
package pro.verron.officestamper.preset.processors.repeatrow;
import org.jspecify.annotations.Nullable;
import pro.verron.officestamper.api.CommentProcessor;
import pro.verron.officestamper.api.OfficeStamperException;
import pro.verron.officestamper.api.ProcessorContext;
import pro.verron.officestamper.preset.CommentProcessorFactory;
/// Repeats a table row for each element in a list.
///
/// @author Joseph Verron
/// @author Tom Hombergs
/// @version ${version}
/// @since 1.0.0
public class RepeatRowProcessor
extends CommentProcessor
implements CommentProcessorFactory.IRepeatRowProcessor {
/// Constructs a new RepeatRowProcessor with the given processor context.
///
/// @param processorContext the context in which this processor operates, containing information about the
/// document and processing environment
public RepeatRowProcessor(ProcessorContext processorContext) {
super(processorContext);
}
@Override
public void repeatTableRow(@Nullable Iterable<Object> items) {
if (items == null) return;
var contextHolder = context().contextHolder();
var row = context().paragraph()
.parentTableRow()
.orElseThrow(OfficeStamperException.throwing("This paragraph is not in a table row."));
row.removeComment(comment());
var table = row.table();
var index = table.indexOf(row);
for (Object item : items) {
var copy = row.copy();
var contextKey = contextHolder.addBranch(item);
copy.hooks()
.forEach(hook -> hook.setContextKey(contextKey));
table.add(index++, copy);
}
row.remove();
}
}