Refactoring: Move
Move segment generation functions into their own module
This commit is contained in:
parent
c7b224a98a
commit
b77951d4fe
@ -0,0 +1,36 @@
|
||||
from cv_analysis.utils.rectangle import Rectangle
|
||||
from synthesis.segment.content_rectangle import ContentRectangle
|
||||
from synthesis.segment.plot import RandomPlot
|
||||
from synthesis.segment.text_block import TextBlock
|
||||
from synthesis.text.font import pick_random_font_available_on_system
|
||||
|
||||
|
||||
def generate_random_plot(rectangle: Rectangle) -> ContentRectangle:
|
||||
block = RandomPlot(*rectangle.coords)
|
||||
block.content = rectangle.content if isinstance(rectangle, ContentRectangle) else None # TODO: Refactor
|
||||
block.generate_random_plot(rectangle)
|
||||
return block
|
||||
|
||||
|
||||
def generate_recursive_random_table(rectangle: Rectangle, **kwargs) -> ContentRectangle:
|
||||
from synthesis.segment.table.table import RecursiveRandomTable
|
||||
|
||||
block = RecursiveRandomTable(*rectangle.coords, **kwargs)
|
||||
if isinstance(rectangle, RecursiveRandomTable):
|
||||
block.content = rectangle.content if rectangle.content else None # TODO: Refactor
|
||||
block.generate_random_table()
|
||||
return block
|
||||
|
||||
|
||||
def generate_text_block(rectangle: Rectangle, text) -> ContentRectangle:
|
||||
block = TextBlock(
|
||||
*rectangle.coords,
|
||||
font=pick_random_font_available_on_system(
|
||||
includes=("serif", "sans-serif", "bold"),
|
||||
excludes=("mono", "italic", "oblique", "cursive"),
|
||||
),
|
||||
font_size=30, # TODO: De-hardcode font size... Seems to have no effect on top of that
|
||||
)
|
||||
block.content = rectangle.content if isinstance(rectangle, ContentRectangle) else None # TODO: Refactor
|
||||
block.put_text(text, rectangle)
|
||||
return block
|
||||
@ -16,77 +16,13 @@ from cv_analysis.utils.rectangle import Rectangle
|
||||
from cv_analysis.utils.spacial import area
|
||||
from synthesis.random import rnd, possibly
|
||||
from synthesis.segment.content_rectangle import ContentRectangle
|
||||
from synthesis.segment.plot import RandomPlot, pick_colormap
|
||||
from synthesis.segment.plot import pick_colormap
|
||||
from synthesis.segment.random_content_rectangle import RandomContentRectangle
|
||||
from synthesis.segment.segments import generate_random_plot, generate_recursive_random_table, generate_text_block
|
||||
from synthesis.segment.table.cell import Cell
|
||||
from synthesis.segment.text_block import TextBlock
|
||||
from synthesis.text.font import pick_random_font_available_on_system
|
||||
from synthesis.text.text import generate_random_words, generate_random_number
|
||||
|
||||
|
||||
def generate_random_plot(rectangle: Rectangle) -> ContentRectangle:
|
||||
block = RandomPlot(*rectangle.coords)
|
||||
block.content = rectangle.content if isinstance(rectangle, ContentRectangle) else None # TODO: Refactor
|
||||
block.generate_random_plot(rectangle)
|
||||
return block
|
||||
|
||||
|
||||
def generate_recursive_random_table(rectangle: Rectangle, **kwargs) -> ContentRectangle:
|
||||
block = RecursiveRandomTable(*rectangle.coords, **kwargs)
|
||||
if isinstance(rectangle, RecursiveRandomTable):
|
||||
block.content = rectangle.content if rectangle.content else None # TODO: Refactor
|
||||
block.generate_random_table()
|
||||
return block
|
||||
|
||||
|
||||
class Size(Enum):
|
||||
SMALL = 120
|
||||
MEDIUM = 180
|
||||
LARGE = 300
|
||||
|
||||
|
||||
def get_size_class(rectangle: Rectangle):
|
||||
size = get_size(rectangle)
|
||||
if size < Size.SMALL.value:
|
||||
return Size.SMALL
|
||||
elif size < Size.LARGE.value:
|
||||
return Size.MEDIUM
|
||||
else:
|
||||
return Size.LARGE
|
||||
|
||||
|
||||
def get_size(rectangle: Rectangle):
|
||||
size = sqrt(area(rectangle))
|
||||
return size
|
||||
|
||||
|
||||
def get_random_color_complementing_color_map(colormap):
|
||||
def color_complement(r, g, b):
|
||||
"""Reference: https://stackoverflow.com/a/40234924"""
|
||||
|
||||
def hilo(a, b, c):
|
||||
if c < b:
|
||||
b, c = c, b
|
||||
if b < a:
|
||||
a, b = b, a
|
||||
if c < b:
|
||||
b, c = c, b
|
||||
return a + c
|
||||
|
||||
k = hilo(r, g, b)
|
||||
return tuple(k - u for u in (r, g, b))
|
||||
|
||||
color = colormap(0.2)[:3]
|
||||
color = [int(255 * v) for v in color]
|
||||
color = color_complement(*color)
|
||||
return color
|
||||
|
||||
|
||||
@lru_cache(maxsize=None)
|
||||
def get_random_background_color():
|
||||
return tuple([*get_random_color_complementing_color_map(pick_colormap()), rnd.randint(100, 210)])
|
||||
|
||||
|
||||
class RecursiveRandomTable(RandomContentRectangle):
|
||||
def __init__(self, x1, y1, x2, y2, border_width=1, layout: str = None, double_rule=False):
|
||||
"""A table with a random number of rows and columns, and random content in each cell.
|
||||
@ -283,18 +219,38 @@ class RecursiveRandomTable(RandomContentRectangle):
|
||||
return column_name
|
||||
|
||||
|
||||
def generate_text_block(rectangle: Rectangle, text) -> ContentRectangle:
|
||||
block = TextBlock(
|
||||
*rectangle.coords,
|
||||
font=pick_random_font_available_on_system(
|
||||
includes=("serif", "sans-serif", "bold"),
|
||||
excludes=("mono", "italic", "oblique", "cursive"),
|
||||
),
|
||||
font_size=30, # TODO: De-hardcode font size... Seems to have no effect on top of that
|
||||
)
|
||||
block.content = rectangle.content if isinstance(rectangle, ContentRectangle) else None # TODO: Refactor
|
||||
block.put_text(text, rectangle)
|
||||
return block
|
||||
@lru_cache(maxsize=None)
|
||||
def get_random_background_color():
|
||||
return tuple([*get_random_color_complementing_color_map(pick_colormap()), rnd.randint(100, 210)])
|
||||
|
||||
|
||||
def get_random_color_complementing_color_map(colormap):
|
||||
def color_complement(r, g, b):
|
||||
"""Reference: https://stackoverflow.com/a/40234924"""
|
||||
|
||||
def hilo(a, b, c):
|
||||
if c < b:
|
||||
b, c = c, b
|
||||
if b < a:
|
||||
a, b = b, a
|
||||
if c < b:
|
||||
b, c = c, b
|
||||
return a + c
|
||||
|
||||
k = hilo(r, g, b)
|
||||
return tuple(k - u for u in (r, g, b))
|
||||
|
||||
color = colormap(0.2)[:3]
|
||||
color = [int(255 * v) for v in color]
|
||||
color = color_complement(*color)
|
||||
return color
|
||||
|
||||
|
||||
def paste_contents(page, contents: Iterable[ContentRectangle]):
|
||||
page = deepcopy(page)
|
||||
for content in contents:
|
||||
paste_content(page, content)
|
||||
return page
|
||||
|
||||
|
||||
def paste_content(page, content_box: ContentRectangle):
|
||||
@ -303,8 +259,23 @@ def paste_content(page, content_box: ContentRectangle):
|
||||
return page
|
||||
|
||||
|
||||
def paste_contents(page, contents: Iterable[ContentRectangle]):
|
||||
page = deepcopy(page)
|
||||
for content in contents:
|
||||
paste_content(page, content)
|
||||
return page
|
||||
def get_size_class(rectangle: Rectangle):
|
||||
size = get_size(rectangle)
|
||||
if size < Size.SMALL.value:
|
||||
return Size.SMALL
|
||||
elif size < Size.LARGE.value:
|
||||
return Size.MEDIUM
|
||||
else:
|
||||
return Size.LARGE
|
||||
|
||||
|
||||
def get_size(rectangle: Rectangle):
|
||||
size = sqrt(area(rectangle))
|
||||
return size
|
||||
|
||||
|
||||
class Size(Enum):
|
||||
# FIXME: this has to scale with the DPI
|
||||
SMALL = 120
|
||||
MEDIUM = 180
|
||||
LARGE = 300
|
||||
|
||||
3
test/fixtures/page_generation/page.py
vendored
3
test/fixtures/page_generation/page.py
vendored
@ -17,7 +17,8 @@ from synthesis.partitioner.two_column import TwoColumnPagePartitioner
|
||||
from synthesis.random import rnd, probably
|
||||
from synthesis.segment.content_rectangle import ContentRectangle
|
||||
from cv_analysis.utils.geometric import is_square_like
|
||||
from synthesis.segment.table.table import generate_random_plot, generate_recursive_random_table, paste_contents
|
||||
from synthesis.segment.table.table import paste_contents
|
||||
from synthesis.segment.segments import generate_random_plot, generate_recursive_random_table
|
||||
from synthesis.segment.text_block import TextBlock
|
||||
from synthesis.text.text_block_generator.caption import CaptionGenerator
|
||||
from synthesis.text.font import pick_random_font_available_on_system
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user