ZaynZhu
Clean version without large assets
7c08dc3
import re
import json
def sanitize_for_var(name):
# Convert any character that is not alphanumeric or underscore into underscore.
return re.sub(r'[^0-9a-zA-Z_]+', '_', name)
def initialize_poster_code(width, height, slide_object_name, presentation_object_name, utils_functions):
code = utils_functions
code += fr'''
# Poster: {presentation_object_name}
{presentation_object_name} = create_poster(width_inch={width}, height_inch={height})
# Slide: {slide_object_name}
{slide_object_name} = add_blank_slide({presentation_object_name})
'''
return code
def save_poster_code(output_file, utils_functions, presentation_object_name):
code = utils_functions
code = fr'''
# Save the presentation
save_presentation({presentation_object_name}, file_name="{output_file}")
'''
return code
def generate_panel_code(panel_dict, utils_functions, slide_object_name, visible=False, theme=None):
code = utils_functions
raw_name = panel_dict["panel_name"]
var_name = 'var_' + sanitize_for_var(raw_name)
code += fr'''
# Panel: {raw_name}
{var_name} = add_textbox(
{slide_object_name},
'{var_name}',
{panel_dict['x']},
{panel_dict['y']},
{panel_dict['width']},
{panel_dict['height']},
text="",
word_wrap=True,
font_size=40,
bold=False,
italic=False,
alignment="left",
fill_color=None,
font_name="Arial"
)
'''
if visible:
if theme is None:
code += fr'''
# Make border visible
style_shape_border({var_name}, color=(0, 0, 0), thickness=5, line_style="solid")
'''
else:
code += fr'''
# Make border visible
style_shape_border({var_name}, color={theme['color']}, thickness={theme['thickness']}, line_style="{theme['line_style']}")
'''
return code
def generate_textbox_code(
text_dict,
utils_functions,
slide_object_name,
visible=False,
content=None,
theme=None,
tmp_dir='tmp',
is_title=False,
):
code = utils_functions
raw_name = text_dict["textbox_name"]
var_name = sanitize_for_var(raw_name)
code += fr'''
# Textbox: {raw_name}
{var_name} = add_textbox(
{slide_object_name},
'{var_name}',
{text_dict['x']},
{text_dict['y']},
{text_dict['width']},
{text_dict['height']},
text="",
word_wrap=True,
font_size=40,
bold=False,
italic=False,
alignment="left",
fill_color=None,
font_name="Arial"
)
'''
if visible:
# Extract textbox_theme from full theme if needed
textbox_border_theme = None
if theme is not None and isinstance(theme, dict):
textbox_border_theme = theme.get('textbox_theme')
if textbox_border_theme is None:
code += fr'''
# Make border visible
style_shape_border({var_name}, color=(255, 0, 0), thickness=5, line_style="solid")
'''
else:
code += fr'''
# Make border visible
style_shape_border({var_name}, color={textbox_border_theme['color']}, thickness={textbox_border_theme['thickness']}, line_style="{textbox_border_theme['line_style']}")
'''
if content is not None:
tmp_name = f'{tmp_dir}/{var_name}_content.json'
json.dump(content, open(tmp_name, 'w'), indent=4)
# Determine vertical alignment
vertical_anchor = None
if is_title and theme is not None and 'section_title_vertical_align' in theme:
vertical_anchor = theme['section_title_vertical_align']
if vertical_anchor:
code += fr'''
fill_textframe({var_name}, json.load(open('{tmp_name}', 'r')), vertical_anchor="{vertical_anchor}")
'''
else:
code += fr'''
fill_textframe({var_name}, json.load(open('{tmp_name}', 'r')))
'''
return code
def generate_figure_code(figure_dict, utils_functions, slide_object_name, img_path, visible=False, theme=None):
code = utils_functions
raw_name = figure_dict["figure_name"]
var_name = sanitize_for_var(raw_name)
code += fr'''
# Figure: {raw_name}
{var_name} = add_image(
{slide_object_name},
'{var_name}',
{figure_dict['x']},
{figure_dict['y']},
{figure_dict['width']},
{figure_dict['height']},
image_path="{img_path}"
)
'''
if visible:
if theme is None:
code += fr'''
# Make border visible
style_shape_border({var_name}, color=(0, 0, 255), thickness=5, line_style="long_dash_dot")
'''
else:
code += fr'''
# Make border visible
style_shape_border({var_name}, color={theme['color']}, thickness={theme['thickness']}, line_style="{theme['line_style']}")
'''
return code
def generate_poster_code(
panel_arrangement_list,
text_arrangement_list,
figure_arrangement_list,
presentation_object_name,
slide_object_name,
utils_functions,
slide_width,
slide_height,
img_path,
save_path,
visible=False,
content=None,
check_overflow=False,
theme=None,
tmp_dir='tmp',
):
code = ''
code += initialize_poster_code(slide_width, slide_height, slide_object_name, presentation_object_name, utils_functions)
if theme is None:
panel_visible = visible
textbox_visible = visible
figure_visible = visible
panel_theme, textbox_theme, figure_theme = None, None, None
else:
panel_visible = theme['panel_visible']
textbox_visible = theme['textbox_visible']
figure_visible = theme['figure_visible']
panel_theme = theme['panel_theme']
textbox_theme = theme['textbox_theme']
figure_theme = theme['figure_theme']
for p in panel_arrangement_list:
code += generate_panel_code(p, '', slide_object_name, panel_visible, panel_theme)
if check_overflow:
t = text_arrangement_list[0]
# Pass full theme for consistency
code += generate_textbox_code(t, '', slide_object_name, textbox_visible, content, theme, tmp_dir, is_title=False)
else:
all_content = []
title_indices = set() # Track which indices are section titles
if content is not None:
idx = 0
for section_content in content:
if 'title' in section_content:
all_content.append(section_content['title'])
title_indices.add(idx) # Mark this index as a title
idx += 1
if len(section_content) == 2:
all_content.append(section_content['textbox1'])
idx += 1
elif len(section_content) == 3:
all_content.append(section_content['textbox1'])
all_content.append(section_content['textbox2'])
idx += 2
else:
raise ValueError(f"Unexpected content length: {len(section_content)}")
for i in range(len(text_arrangement_list)):
t = text_arrangement_list[i]
if content is not None:
textbox_content = all_content[i]
is_title = i in title_indices
else:
textbox_content = None
is_title = False
# Pass full theme (not textbox_theme) so vertical alignment config is available
code += generate_textbox_code(t, '', slide_object_name, textbox_visible, textbox_content, theme, tmp_dir, is_title=is_title)
for f in figure_arrangement_list:
if img_path is None:
code += generate_figure_code(f, '', slide_object_name, f['figure_path'], figure_visible, figure_theme)
else:
code += generate_figure_code(f, '', slide_object_name, img_path, figure_visible, figure_theme)
code += save_poster_code(save_path, '', presentation_object_name)
return code