PowerpointRun.java

package pro.verron.officestamper.experimental;

import org.docx4j.dml.CTRegularTextRun;

/**
 * Represents a run within a PowerPoint slide.
 */
public record PowerpointRun(
        int startIndex,
        int endIndex,
        int indexInParent,
        CTRegularTextRun run
) {
    /**
     * Checks if the given range of indices touches the start or end index of the run.
     *
     * @param globalStartIndex the start index of the global range.
     * @param globalEndIndex   the end index of the global range.
     *
     * @return {@code true} if the range touches the start or end index of the run, {@code false} otherwise.
     */
    public boolean isTouchedByRange(int globalStartIndex, int globalEndIndex) {
        return ((startIndex >= globalStartIndex) && (startIndex <= globalEndIndex))
                || ((endIndex >= globalStartIndex) && (endIndex <= globalEndIndex))
                || ((startIndex <= globalStartIndex) && (endIndex >= globalEndIndex));
    }

    /**
     * Replaces a substring within the run's text.
     *
     * @param globalStartIndex the start index of the substring to be replaced.
     * @param globalEndIndex   the end index of the substring to be replaced.
     * @param replacement      the replacement string.
     */
    public void replace(
            int globalStartIndex,
            int globalEndIndex,
            String replacement
    ) {
        int localStartIndex = globalIndexToLocalIndex(globalStartIndex);
        int localEndIndex = globalIndexToLocalIndex(globalEndIndex);
        var source = run.getT();
        var target = source.substring(0, localStartIndex)
                + replacement
                + source.substring(localEndIndex + 1);
        run.setT(target);
    }

    private int globalIndexToLocalIndex(int globalIndex) {
        if (globalIndex < startIndex) return 0;
        else if (globalIndex > endIndex) return lastIndex();
        else return globalIndex - startIndex;
    }

    private int lastIndex() {
        return lastIndex(run.getT());
    }

    private int lastIndex(String string) {
        return string.length() - 1;
    }
}