[WIP] random text segments
This commit is contained in:
parent
41fdda4955
commit
8d57d2043d
@ -69,3 +69,7 @@ def make_merger_sentinel():
|
||||
number_of_records_so_far = -1
|
||||
|
||||
return no_new_mergers
|
||||
|
||||
|
||||
def rconj(xs, x):
|
||||
return [*xs, x]
|
||||
|
||||
43
test/fixtures/page_generation/page.py
vendored
43
test/fixtures/page_generation/page.py
vendored
@ -1,6 +1,5 @@
|
||||
import random
|
||||
import textwrap
|
||||
from functools import lru_cache
|
||||
from typing import Tuple, Union, Iterable, List
|
||||
|
||||
import albumentations as A
|
||||
@ -11,7 +10,7 @@ from PIL import Image, ImageOps, ImageFont, ImageDraw
|
||||
from PIL.Image import Transpose
|
||||
from faker import Faker
|
||||
|
||||
from cv_analysis.utils import star
|
||||
from cv_analysis.utils import star, rconj
|
||||
|
||||
Image_t = Union[Image.Image, np.ndarray]
|
||||
#
|
||||
@ -70,7 +69,7 @@ Image_t = Union[Image.Image, np.ndarray]
|
||||
# ],
|
||||
# p=0.5,
|
||||
# )
|
||||
from funcy import juxt, compose, identity, lflatten, lmap, first, iterate, take, last, rest
|
||||
from funcy import juxt, compose, identity, lflatten, lmap, first, iterate, take, last, rest, rcompose
|
||||
|
||||
from cv_analysis.locations import TEST_PAGE_TEXTURES_DIR
|
||||
|
||||
@ -353,6 +352,8 @@ class RandomTextBlock(ContentRectangle):
|
||||
self.font = ImageFont.load_default()
|
||||
|
||||
def generate_random_text(self, rectangle: Rectangle):
|
||||
def write_line(line, line_number):
|
||||
draw.text((0, line_number * text_size), line, font=self.font, fill=(0, 0, 0, 200))
|
||||
|
||||
image = Image.new("RGBA", (rectangle.width, rectangle.height), (0, 255, 255, 0))
|
||||
draw = ImageDraw.Draw(image)
|
||||
@ -361,24 +362,30 @@ class RandomTextBlock(ContentRectangle):
|
||||
wrapped_text = textwrap.wrap(text, width=image.width, break_long_words=False)
|
||||
text_size = draw.textsize(first(wrapped_text), font=self.font)[1]
|
||||
|
||||
lines = last(take(len(wrapped_text), iterate(star(self.f), (True, wrapped_text))))[1]
|
||||
lines = last(take(len(wrapped_text), iterate(star(self.format_lines), (True, wrapped_text))))[1]
|
||||
|
||||
for i, line in enumerate(lines):
|
||||
draw.text((0, i * text_size), line, font=self.font, fill=(0, 0, 0, 200))
|
||||
for line_number, line in enumerate(lines):
|
||||
write_line(line, line_number)
|
||||
|
||||
self.content = image
|
||||
|
||||
def f(self, last_full, lines):
|
||||
@lru_cache(maxsize=None)
|
||||
def truncate():
|
||||
def format_lines(self, last_full, lines):
|
||||
def truncate_current_line():
|
||||
return random.random() < self.blank_line_percentage and last_full
|
||||
|
||||
line_processor = self.truncate_line if truncate() else identity
|
||||
append = star(rconj)
|
||||
|
||||
fn = compose(append, juxt(rest, compose(line_processor, first)))
|
||||
|
||||
return (False, fn(lines)) if truncate() else (True, fn(lines))
|
||||
# This is meant to be read from the bottom up.
|
||||
current_line_shall_not_be_a_full_line = truncate_current_line()
|
||||
line_processor = self.truncate_line if current_line_shall_not_be_a_full_line else identity
|
||||
process_current_line = compose(line_processor, first)
|
||||
move_current_line_to_back = star(rconj)
|
||||
split_first_line_from_lines_and_process_the_former = juxt(rest, process_current_line)
|
||||
split_off_current_line_then_process_it_then_move_it_to_the_back = rcompose(
|
||||
split_first_line_from_lines_and_process_the_former,
|
||||
move_current_line_to_back,
|
||||
)
|
||||
current_line_is_a_full_line = not current_line_shall_not_be_a_full_line
|
||||
# Start reading here and move up.
|
||||
return current_line_is_a_full_line, split_off_current_line_then_process_it_then_move_it_to_the_back(lines)
|
||||
|
||||
def format_line(self, line, full=True):
|
||||
line = self.truncate_line(line) if not full else line
|
||||
@ -391,10 +398,6 @@ class RandomTextBlock(ContentRectangle):
|
||||
return line
|
||||
|
||||
|
||||
def rconj(xs, x):
|
||||
return [*xs, x]
|
||||
|
||||
|
||||
def generate_random_text_block(rectangle: Rectangle) -> ContentRectangle:
|
||||
block = RandomTextBlock(*rectangle.coords)
|
||||
block.generate_random_text(rectangle)
|
||||
@ -402,10 +405,8 @@ def generate_random_text_block(rectangle: Rectangle) -> ContentRectangle:
|
||||
|
||||
|
||||
def paste_content(page, content_box: ContentRectangle):
|
||||
|
||||
assert page.mode == "RGB"
|
||||
assert content_box.content.mode == "RGBA"
|
||||
|
||||
page.paste(content_box.content, (content_box.x1, content_box.y1), content_box.content)
|
||||
return page
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user