Пример #1
0
  def _extend_region_to_paragraph(self, region: Region):
    """Extends region dimensions based on paragraph extent"""
    if not self._has_same_origin_as_region(region):
      raise ValueError("Paragraph origin does not match with region.")

    region_extent = region.get_style(StyleProperties.Extent)

    paragraph_extent = self._paragraph.get_extent()

    # Convert extent cells to percentages
    paragraph_extent_pct = convert_cells_to_percentages(paragraph_extent, self._doc.get_cell_resolution())

    if paragraph_extent_pct.width.value > region_extent.width.value:
      # Resets the region width on the paragraph line width (up to the right of the safe area)
      # The region height always remains the same (depending on the region origin)
      region_origin: PositionType = region.get_style(StyleProperties.Origin)

      # Convert right cells coordinate to percentages
      right_pct = self._right * 100 / self._doc.get_cell_resolution().columns
      available_width_pct = right_pct - region_origin.x.value

      if int(paragraph_extent_pct.width.value) > available_width_pct:
        LOGGER.warning("The paragraph width overflows from the safe area (at %s)", self._paragraph.get_begin())

      max_width_pct = round(min(paragraph_extent_pct.width.value, available_width_pct))

      region_extent_pct = get_extent_from_dimensions(max_width_pct, region_extent.height.value, LengthType.Units.pct)
      region.set_style(StyleProperties.Extent, region_extent_pct)
Пример #2
0
  def _create_matching_region(self) -> Region:
    """Creates a new region based on paragraph needs"""
    doc_regions = list(self._doc.iter_regions())

    paragraph_origin = self._paragraph.get_origin()
    region = Region(self._get_region_prefix() + str(len(doc_regions) + 1), self._doc)

    # Convert origin cells to percentages
    if self._paragraph.get_caption_style() is SccCaptionStyle.RollUp:
      # The region origin x offset
      region_origin = get_position_from_offsets(paragraph_origin.x.value, self._top)
      region_origin_pct = convert_cells_to_percentages(region_origin, self._doc.get_cell_resolution())
    else:
      # The region origin matches with paragraph origin
      region_origin_pct = convert_cells_to_percentages(paragraph_origin, self._doc.get_cell_resolution())

    region.set_style(StyleProperties.Origin, region_origin_pct)

    # The region width is initialized with he paragraph width (up to the right of the safe area)
    paragraph_extent = self._paragraph.get_extent()

    available_width = self._right - int(paragraph_origin.x.value)
    region_width = min(paragraph_extent.width.value, available_width)

    if self._paragraph.get_caption_style() is SccCaptionStyle.RollUp:
      # The region height extends from the top row to the bottom row of the safe area
      region_height = self._bottom - (self._top + 1)
      region.set_style(StyleProperties.DisplayAlign, DisplayAlignType.after)
    else:
      # The region height extends from its origin to the bottom of the safe area
      region_height = self._bottom - int(paragraph_origin.y.value)
      region.set_style(StyleProperties.DisplayAlign, DisplayAlignType.before)

    region_extent = get_extent_from_dimensions(region_width, region_height)

    # Convert extent cells to percentages
    region_extent_pct = convert_cells_to_percentages(region_extent, self._doc.get_cell_resolution())
    region.set_style(StyleProperties.Extent, region_extent_pct)

    self._doc.put_region(region)

    return region
Пример #3
0
  def _has_same_origin_as_region(self, region: Region) -> bool:
    """Checks whether the region origin is the same as the paragraph origin"""
    region_origin: Optional[PositionType] = region.get_style(StyleProperties.Origin)

    # Convert paragraph origin units into percentages
    paragraph_origin = convert_cells_to_percentages(self._paragraph.get_origin(), self._doc.get_cell_resolution())

    if self._paragraph.get_caption_style() in (SccCaptionStyle.RollUp, SccCaptionStyle.PaintOn):
      return region_origin \
             and region_origin.x.units is paragraph_origin.x.units \
             and region_origin.y.units is paragraph_origin.y.units \
             and math.isclose(region_origin.x.value, paragraph_origin.x.value, abs_tol=0.001) \
             and region_origin.y.value <= paragraph_origin.y.value

    return region_origin \
       and region_origin.x.units is paragraph_origin.x.units \
       and region_origin.y.units is paragraph_origin.y.units \
       and math.isclose(region_origin.x.value, paragraph_origin.x.value, abs_tol=0.001) \
       and math.isclose(region_origin.y.value, paragraph_origin.y.value, abs_tol=0.001)
Пример #4
0
    def test_srt_writer(self):
        doc = ContentDocument()

        r1 = Region("r1", doc)
        doc.put_region(r1)

        r2 = Region("r2", doc)
        r2.set_begin(Fraction(2))
        r2.set_end(Fraction(4))
        doc.put_region(r2)

        body = Body(doc)
        doc.set_body(body)

        div = Div(doc)
        body.push_child(div)

        p = P(doc)
        p.set_region(r1)
        p.set_end(Fraction(2))
        div.push_child(p)

        span = Span(doc)
        span.push_child(Text(doc, "Lorem ipsum dolor sit amet,"))
        p.push_child(span)

        p = P(doc)
        p.set_region(r2)
        div.push_child(p)

        span = Span(doc)
        span.push_child(Text(doc, "consectetur adipiscing elit."))
        p.push_child(span)

        p = P(doc)
        p.set_region(r1)
        p.set_begin(Fraction(4))
        p.set_end(Fraction(6))
        div.push_child(p)

        span = Span(doc)
        span.push_child(
            Text(doc, "Pellentesque interdum lacinia sollicitudin."))
        p.push_child(span)

        expected_srt = """1
00:00:00,000 --> 00:00:02,000
Lorem ipsum dolor sit amet,

2
00:00:02,000 --> 00:00:04,000
consectetur adipiscing elit.

3
00:00:04,000 --> 00:00:06,000
Pellentesque interdum lacinia sollicitudin.
"""

        srt_from_model = srt_writer.from_model(doc)

        self.assertEqual(expected_srt, srt_from_model)
Пример #5
0
    def test_process_isd(self):
        supported_style_properties = SupportedStylePropertiesFilter({
            StyleProperties.BackgroundColor: [NamedColors.red.value],
            StyleProperties.Extent: []
        })

        doc = ContentDocument()

        r1 = Region("r1", doc)
        r1.set_style(StyleProperties.BackgroundColor, NamedColors.red.value)
        r1.set_style(StyleProperties.LuminanceGain, 2.0)
        doc.put_region(r1)

        b = Body(doc)
        b.set_begin(Fraction(1))
        b.set_end(Fraction(10))
        doc.set_body(b)

        div1 = Div(doc)
        div1.set_region(r1)
        b.push_child(div1)

        p1 = P(doc)
        p1.set_style(StyleProperties.BackgroundColor, NamedColors.white.value)
        p1.set_style(StyleProperties.Direction, DirectionType.rtl)
        div1.push_child(p1)

        span1 = Span(doc)
        span1.set_style(StyleProperties.BackgroundColor, NamedColors.red.value)
        span1.set_style(StyleProperties.FontStyle, FontStyleType.italic)
        span1.set_style(StyleProperties.Direction, DirectionType.ltr)
        p1.push_child(span1)

        t1 = Text(doc, "hello")
        span1.push_child(t1)

        significant_times = sorted(ISD.significant_times(doc))
        self.assertEqual(3, len(significant_times))

        isd = ISD.from_model(doc, significant_times[1])

        r1 = isd.get_region("r1")

        self.assertEqual(len(Region._applicableStyles), len(r1._styles))
        self.assertEqual(NamedColors.red.value,
                         r1.get_style(StyleProperties.BackgroundColor))
        self.assertEqual(2.0, r1.get_style(StyleProperties.LuminanceGain))

        body1 = list(r1)[0]
        div1 = list(body1)[0]
        p1 = list(div1)[0]
        span1 = list(p1)[0]

        self.assertEqual(len(P._applicableStyles), len(p1._styles))
        self.assertEqual(NamedColors.white.value,
                         p1.get_style(StyleProperties.BackgroundColor))
        self.assertEqual(DirectionType.rtl,
                         p1.get_style(StyleProperties.Direction))

        self.assertEqual(len(Span._applicableStyles), len(span1._styles))
        self.assertEqual(NamedColors.red.value,
                         span1.get_style(StyleProperties.BackgroundColor))
        self.assertEqual(FontStyleType.italic,
                         span1.get_style(StyleProperties.FontStyle))
        self.assertEqual(DirectionType.ltr,
                         span1.get_style(StyleProperties.Direction))

        supported_style_properties.process(isd)

        self.assertEqual(2, len(r1._styles))
        self.assertEqual(NamedColors.red.value,
                         r1.get_style(StyleProperties.BackgroundColor))
        self.assertEqual(
            ExtentType(height=LengthType(value=0.0, units=LengthType.Units.rh),
                       width=LengthType(value=0.0, units=LengthType.Units.rw)),
            r1.get_style(StyleProperties.Extent))

        self.assertEqual(0, len(p1._styles))
        self.assertIsNone(p1.get_style(StyleProperties.BackgroundColor))
        self.assertIsNone(p1.get_style(StyleProperties.Direction))

        self.assertEqual(1, len(span1._styles))
        self.assertEqual(NamedColors.red.value,
                         span1.get_style(StyleProperties.BackgroundColor))
        self.assertIsNone(span1.get_style(StyleProperties.FontStyle))
        self.assertIsNone(span1.get_style(StyleProperties.Direction))
Пример #6
0
    def test_process_isd(self):
        default_style_value_filter = DefaultStylePropertyValuesFilter({
            StyleProperties.BackgroundColor:
            NamedColors.red.value,
            StyleProperties.Direction:
            DirectionType.ltr
        })

        doc = ContentDocument()

        r1 = Region("r1", doc)
        r1.set_style(StyleProperties.BackgroundColor, NamedColors.red.value)
        r1.set_style(StyleProperties.LuminanceGain, 2.0)
        doc.put_region(r1)

        b = Body(doc)
        b.set_begin(Fraction(1))
        b.set_end(Fraction(10))
        doc.set_body(b)

        div1 = Div(doc)
        div1.set_region(r1)
        b.push_child(div1)

        p1 = P(doc)
        p1.set_style(StyleProperties.BackgroundColor, NamedColors.white.value)
        p1.set_style(StyleProperties.Direction, DirectionType.rtl)
        div1.push_child(p1)

        span1 = Span(doc)
        span1.set_style(StyleProperties.BackgroundColor, NamedColors.red.value)
        span1.set_style(StyleProperties.FontStyle, FontStyleType.italic)
        span1.set_style(StyleProperties.Direction, DirectionType.ltr)
        p1.push_child(span1)

        t1 = Text(doc, "hello")
        span1.push_child(t1)

        significant_times = sorted(ISD.significant_times(doc))
        self.assertEqual(3, len(significant_times))

        isd = ISD.from_model(doc, significant_times[1])

        r1 = isd.get_region("r1")

        self.assertEqual(len(Region._applicableStyles), len(r1._styles))
        self.assertEqual(NamedColors.red.value,
                         r1.get_style(StyleProperties.BackgroundColor))
        self.assertEqual(2.0, r1.get_style(StyleProperties.LuminanceGain))

        body1 = list(r1)[0]
        div1 = list(body1)[0]
        p1 = list(div1)[0]
        span1 = list(p1)[0]

        self.assertEqual(len(P._applicableStyles), len(p1._styles))
        self.assertEqual(NamedColors.white.value,
                         p1.get_style(StyleProperties.BackgroundColor))
        self.assertEqual(DirectionType.rtl,
                         p1.get_style(StyleProperties.Direction))

        self.assertEqual(len(Span._applicableStyles), len(span1._styles))
        self.assertEqual(NamedColors.red.value,
                         span1.get_style(StyleProperties.BackgroundColor))
        self.assertEqual(FontStyleType.italic,
                         span1.get_style(StyleProperties.FontStyle))
        self.assertEqual(DirectionType.ltr,
                         span1.get_style(StyleProperties.Direction))

        default_style_value_filter.process(isd)

        self.assertEqual(len(Region._applicableStyles) - 1, len(r1._styles))
        self.assertIsNone(r1.get_style(StyleProperties.BackgroundColor))

        self.assertEqual(len(P._applicableStyles), len(p1._styles))
        self.assertEqual(NamedColors.white.value,
                         p1.get_style(StyleProperties.BackgroundColor))
        self.assertEqual(DirectionType.rtl,
                         p1.get_style(StyleProperties.Direction))

        self.assertEqual(len(Span._applicableStyles) - 1, len(span1._styles))
        self.assertIsNone(span1.get_style(StyleProperties.BackgroundColor))
        self.assertEqual(FontStyleType.italic,
                         span1.get_style(StyleProperties.FontStyle))
        self.assertEqual(DirectionType.ltr,
                         span1.get_style(StyleProperties.Direction))