public void resolveParagraphTimeOverlaps() { new TtmlParagraphResolver(mergedItt).resolveTimeOverlaps(); }
private PEltype merge(Slice<PEltype> slice) { PEltype p = copy(slice.getContents().stream() .findFirst() .orElseThrow(() -> new ConvertException("At least one <p> must exist for content."))); p.setBegin(ConversionHelper.msToSmpteTimecode(slice.getBegin(), frameRate)); p.setEnd(ConversionHelper.msToSmpteTimecode(slice.getEnd(), frameRate)); p.getContent().clear(); p.getContent().addAll(mergeContent(slice.getContents())); return p; }
/** * Resolve time overlaps. * Method uses {@link SplitUtils} for split initial <p>s on slices. */ public void resolveTimeOverlaps() { DivEltype div = tt.getBody().getDiv().stream() .findFirst() .orElseThrow(() -> new ConvertException("At least one <div> must be defined.")); List<PEltype> sliced = split(pStream(div.getBlockClass())) .map(this::merge) .collect(Collectors.toList()); div.getBlockClass().clear(); div.getBlockClass().addAll(sliced); }
private PEltype copy(PEltype p) { List<Object> styles = new ArrayList<>(p.getStyle()); Object region = p.getRegion(); p.getStyle().clear(); p.setRegion(null); PEltype targetP = deepCopy(p, PEltype.class, TTML_PACKAGES); p.getStyle().addAll(styles); p.setRegion(region); targetP.getStyle().addAll(styles); targetP.setRegion(region); return targetP; }
@Test public void testParallelParagraphs() { PEltype p1 = TtmlTestUtils.createP("00:00:01:00", "00:00:04:00", "p1"); PEltype p2 = TtmlTestUtils.createP("00:00:01:00", "00:00:04:00", "p2"); TtEltype tt = TtmlTestUtils.wrapPs(p1, p2); new TtmlParagraphResolver(tt).resolveTimeOverlaps(); Iterator<Object> iterator; iterator = tt.getBody().getDiv().get(0).getBlockClass().iterator(); assertEquals("00:00:01:00", TtmlTestUtils.getPBegin(iterator.next())); assertFalse(iterator.hasNext()); iterator = tt.getBody().getDiv().get(0).getBlockClass().iterator(); assertEquals("00:00:04:00", TtmlTestUtils.getPEnd(iterator.next())); iterator = tt.getBody().getDiv().get(0).getBlockClass().iterator(); assertArrayEquals(new Serializable[]{"p1", "p2"}, TtmlTestUtils.getPContent(iterator.next())); }
@Test public void testGapBetweenParagraphs() { PEltype p1 = TtmlTestUtils.createP("00:00:01:00", "00:00:04:00", "p1"); PEltype p2 = TtmlTestUtils.createP("00:00:10:00", "00:00:14:00", "p2"); TtEltype tt = TtmlTestUtils.wrapPs(p1, p2); new TtmlParagraphResolver(tt).resolveTimeOverlaps(); Iterator<Object> iterator; iterator = tt.getBody().getDiv().get(0).getBlockClass().iterator(); assertEquals("00:00:01:00", TtmlTestUtils.getPBegin(iterator.next())); assertEquals("00:00:10:00", TtmlTestUtils.getPBegin(iterator.next())); assertFalse(iterator.hasNext()); iterator = tt.getBody().getDiv().get(0).getBlockClass().iterator(); assertEquals("00:00:04:00", TtmlTestUtils.getPEnd(iterator.next())); assertEquals("00:00:14:00", TtmlTestUtils.getPEnd(iterator.next())); iterator = tt.getBody().getDiv().get(0).getBlockClass().iterator(); assertArrayEquals(new Serializable[]{"p1"}, TtmlTestUtils.getPContent(iterator.next())); assertArrayEquals(new Serializable[]{"p2"}, TtmlTestUtils.getPContent(iterator.next())); }
@Test public void testStuckedParagraphs() { PEltype p1 = TtmlTestUtils.createP("00:00:01:00", "00:00:02:00", "p1"); PEltype p2 = TtmlTestUtils.createP("00:00:02:00", "00:00:03:00", "p2"); PEltype p3 = TtmlTestUtils.createP("00:00:03:00", "00:00:04:00", "p3"); TtEltype tt = TtmlTestUtils.wrapPs(p1, p2, p3); new TtmlParagraphResolver(tt).resolveTimeOverlaps(); Iterator<Object> iterator; iterator = tt.getBody().getDiv().get(0).getBlockClass().iterator(); assertEquals("00:00:01:00", TtmlTestUtils.getPBegin(iterator.next())); assertEquals("00:00:02:00", TtmlTestUtils.getPBegin(iterator.next())); assertEquals("00:00:03:00", TtmlTestUtils.getPBegin(iterator.next())); assertFalse(iterator.hasNext()); iterator = tt.getBody().getDiv().get(0).getBlockClass().iterator(); assertEquals("00:00:02:00", TtmlTestUtils.getPEnd(iterator.next())); assertEquals("00:00:03:00", TtmlTestUtils.getPEnd(iterator.next())); assertEquals("00:00:04:00", TtmlTestUtils.getPEnd(iterator.next())); iterator = tt.getBody().getDiv().get(0).getBlockClass().iterator(); assertArrayEquals(new Serializable[]{"p1"}, TtmlTestUtils.getPContent(iterator.next())); assertArrayEquals(new Serializable[]{"p2"}, TtmlTestUtils.getPContent(iterator.next())); assertArrayEquals(new Serializable[]{"p3"}, TtmlTestUtils.getPContent(iterator.next())); }
@Test public void testNestedParagraphs() { PEltype p1 = TtmlTestUtils.createP("00:00:01:00", "00:00:10:00", "p1"); PEltype p2 = TtmlTestUtils.createP("00:00:03:00", "00:00:08:00", "p2"); PEltype p3 = TtmlTestUtils.createP("00:00:05:00", "00:00:06:00", "p3"); TtEltype tt = TtmlTestUtils.wrapPs(p1, p2, p3); new TtmlParagraphResolver(tt).resolveTimeOverlaps(); Iterator<Object> iterator; iterator = tt.getBody().getDiv().get(0).getBlockClass().iterator(); assertEquals("00:00:01:00", TtmlTestUtils.getPBegin(iterator.next())); assertEquals("00:00:03:00", TtmlTestUtils.getPBegin(iterator.next())); assertEquals("00:00:05:00", TtmlTestUtils.getPBegin(iterator.next())); assertEquals("00:00:06:00", TtmlTestUtils.getPBegin(iterator.next())); assertEquals("00:00:08:00", TtmlTestUtils.getPBegin(iterator.next())); assertFalse(iterator.hasNext()); iterator = tt.getBody().getDiv().get(0).getBlockClass().iterator(); assertEquals("00:00:03:00", TtmlTestUtils.getPEnd(iterator.next())); assertEquals("00:00:05:00", TtmlTestUtils.getPEnd(iterator.next())); assertEquals("00:00:06:00", TtmlTestUtils.getPEnd(iterator.next())); assertEquals("00:00:08:00", TtmlTestUtils.getPEnd(iterator.next())); assertEquals("00:00:10:00", TtmlTestUtils.getPEnd(iterator.next())); iterator = tt.getBody().getDiv().get(0).getBlockClass().iterator(); assertArrayEquals(new Serializable[]{"p1"}, TtmlTestUtils.getPContent(iterator.next())); assertArrayEquals(new Serializable[]{"p1", "p2"}, TtmlTestUtils.getPContent(iterator.next())); assertArrayEquals(new Serializable[]{"p1", "p2", "p3"}, TtmlTestUtils.getPContent(iterator.next())); assertArrayEquals(new Serializable[]{"p1", "p2"}, TtmlTestUtils.getPContent(iterator.next())); assertArrayEquals(new Serializable[]{"p1"}, TtmlTestUtils.getPContent(iterator.next())); }
@Test public void testOverlappedParagraphs() { PEltype p1 = TtmlTestUtils.createP("00:00:01:00", "00:00:03:00", "p1"); PEltype p2 = TtmlTestUtils.createP("00:00:02:00", "00:00:04:00", "p2"); PEltype p3 = TtmlTestUtils.createP("00:00:03:00", "00:00:05:00", "p3"); TtEltype tt = TtmlTestUtils.wrapPs(p1, p2, p3); new TtmlParagraphResolver(tt).resolveTimeOverlaps(); Iterator<Object> iterator; iterator = tt.getBody().getDiv().get(0).getBlockClass().iterator(); assertEquals("00:00:01:00", TtmlTestUtils.getPBegin(iterator.next())); assertEquals("00:00:02:00", TtmlTestUtils.getPBegin(iterator.next())); assertEquals("00:00:03:00", TtmlTestUtils.getPBegin(iterator.next())); assertEquals("00:00:04:00", TtmlTestUtils.getPBegin(iterator.next())); assertFalse(iterator.hasNext()); iterator = tt.getBody().getDiv().get(0).getBlockClass().iterator(); assertEquals("00:00:02:00", TtmlTestUtils.getPEnd(iterator.next())); assertEquals("00:00:03:00", TtmlTestUtils.getPEnd(iterator.next())); assertEquals("00:00:04:00", TtmlTestUtils.getPEnd(iterator.next())); assertEquals("00:00:05:00", TtmlTestUtils.getPEnd(iterator.next())); iterator = tt.getBody().getDiv().get(0).getBlockClass().iterator(); assertArrayEquals(new Serializable[]{"p1"}, TtmlTestUtils.getPContent(iterator.next())); assertArrayEquals(new Serializable[]{"p1", "p2"}, TtmlTestUtils.getPContent(iterator.next())); assertArrayEquals(new Serializable[]{"p2", "p3"}, TtmlTestUtils.getPContent(iterator.next())); assertArrayEquals(new Serializable[]{"p3"}, TtmlTestUtils.getPContent(iterator.next())); }
TtEltype tt = TtmlTestUtils.wrapPs(p1, p2, p3); new TtmlParagraphResolver(tt).resolveTimeOverlaps();