From cfe4b58e38ab44f71b7c2f7e2fda15a424b8aae8 Mon Sep 17 00:00:00 2001 From: Matthias Bisping Date: Wed, 18 Jan 2023 17:18:46 +0100 Subject: [PATCH] Add option to put specific text into text block --- test/fixtures/page_generation/page.py | 37 ++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/test/fixtures/page_generation/page.py b/test/fixtures/page_generation/page.py index 2c8befb..e9e4e23 100644 --- a/test/fixtures/page_generation/page.py +++ b/test/fixtures/page_generation/page.py @@ -461,12 +461,12 @@ class RandomContentRectangle(ContentRectangle): class Size(Enum): SMALL = sqrt(100**2) - MEDIUM = sqrt((100*5)**2) - LARGE = sqrt((100*10)**2) + MEDIUM = sqrt((100 * 5) ** 2) + LARGE = sqrt((100 * 10) ** 2) def get_size_class(rectangle: Rectangle): - size = get_size(area(rectangle)) + size = get_size(rectangle) if size < Size.SMALL.value: return Size.SMALL elif size < Size.LARGE.value: @@ -516,6 +516,7 @@ class RecursiveRandomTable(RandomContentRectangle): elif choice == "plot": return generate_random_plot(cell) else: + cell = generate_text_block(cell, f"{choice} {size:.0f} {get_size_class(cell).name}") return cell elif size <= Size.LARGE.value: @@ -527,7 +528,9 @@ class RecursiveRandomTable(RandomContentRectangle): return cell else: return generate_recursive_random_table(cell, border_width=0) - return cell + else: + cell = generate_text_block(cell, f"{choice} {size:.0f} {get_size_class(cell).name}") + return cell cell.content = inner(cell).content @@ -836,12 +839,19 @@ def maybe(): def generate_random_text_block(rectangle: Rectangle, n_sentences=3000) -> ContentRectangle: - block = RandomTextBlock(*rectangle.coords) + block = TextBlock(*rectangle.coords) block.content = rectangle.content if isinstance(rectangle, ContentRectangle) else None # TODO: Refactor block.generate_random_text(rectangle, n_sentences) return block +def generate_text_block(rectangle: Rectangle, text) -> ContentRectangle: + block = TextBlock(*rectangle.coords) + block.content = rectangle.content if isinstance(rectangle, ContentRectangle) else None # TODO: Refactor + block.put_text(text, rectangle) + return block + + def write_lines_to_image(lines: List[str], rectangle: Rectangle, font=None) -> Image.Image: def write_line(line, line_number): draw.text((0, line_number * text_size), line, font=font, fill=(0, 0, 0, 255)) @@ -858,7 +868,7 @@ def write_lines_to_image(lines: List[str], rectangle: Rectangle, font=None) -> I return image -class RandomTextBlock(ContentRectangle): +class TextBlock(ContentRectangle): def __init__(self, x1, y1, x2, y2): super().__init__(x1, y1, x2, y2) self.blank_line_percentage = random.uniform(0, 0.5) @@ -870,6 +880,21 @@ class RandomTextBlock(ContentRectangle): def generate_random_text(self, rectangle: Rectangle, n_sentences=3000): lines = generate_random_text_lines(rectangle, self.format_lines, n_sentences) image = write_lines_to_image(lines, rectangle, self.font) + return self.__put_content(image) + + def put_text(self, text: str, rectangle: Rectangle): + + text_width, text_height = self.font.getsize(text) + + assert text_width <= rectangle.width + assert text_height <= rectangle.height + + image = Image.new("RGBA", (text_width, text_height), (0, 255, 255, 0)) + draw = ImageDraw.Draw(image) + draw.text((0, 0), text, font=self.font, fill=(0, 0, 0, 255)) + return self.__put_content(image) + + def __put_content(self, image: Image.Image): self.content = image if not self.content else superimpose_texture_with_transparency(self.content, image) assert self.content.mode == "RGBA" return self