from django.template import Template, Context import re def render_universal_segment(segment, context_data): segment_type = segment.get('segment_type', 'unknown') raw_content = segment.get('content') if raw_content is None: content = [] elif isinstance(raw_content, dict): content = [raw_content] elif isinstance(raw_content, list): content = raw_content else: content = [raw_content] rendered = [] context = Context(context_data) for item in content: if not isinstance(item, dict): continue title = Template(item.get('title', '')).render(context) subtitle = Template(item.get('subtitle', '')).render(context) description = Template(item.get('description', '')).render(context) if title: rendered.append(f'

{title}

') if subtitle: rendered.append(f'

{subtitle}

') if description: processed_desc = [] in_list = False for line in description.split('\n'): line = line.strip() if re.match(r'^[-•*]\s', line): if not in_list: processed_desc.append('') in_list = False if line: processed_desc.append(f'

{line}

') if in_list: processed_desc.append('') rendered.append('\n'.join(processed_desc)) if 'headers' in item and 'rows' in item: table_html = [''] table_html.append('') for header in item['headers']: table_html.append(f'') table_html.append('') for row in item['rows']: table_html.append('') for cell in row: cell_content = Template(cell).render(context) if isinstance(cell, str) else ', '.join([Template(str(c)).render(context) for c in cell]) table_html.append(f'') table_html.append('') table_html.append('
{Template(header).render(context)}
{cell_content}
') rendered.append('\n'.join(table_html)) if 'image' in item: image_url = Template(item['image']).render(context) rendered.append(f'{title}') if 'html' in segment: html_template = Template(segment['html']) rendered_html = html_template.render(context) rendered.append(rendered_html) return '\n'.join(rendered) def render_template(template_segments, context_data): final_output = [] for segment in template_segments: segment_html = render_universal_segment(segment, context_data) final_output.append(f'
{segment_html}
') return '\n'.join(final_output)