Add option to put specific text into text block
This commit is contained in:
parent
fd57fe99b7
commit
cfe4b58e38
37
test/fixtures/page_generation/page.py
vendored
37
test/fixtures/page_generation/page.py
vendored
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user