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)
if segment_type == 'organization':
rendered.append(
f'
'
f'

'
f'
Cyber Risk Assessment Report
'
f'
Comprehensive Evaluation and Strategic Recommendations for Enhanced Cybersecurity Posture
'
f'
'
f'
Prepared for
')
for item in content:
name = Template(item.get('name', '')).render(context)
date = Template(item.get('date', '')).render(context)
if name:
rendered.append(f'
{name}
')
rendered.append(f'
Prepared by
'
f'
Risklet
'
f'
')
if date:
rendered.append(f'
{date}
')
rendered.append(f'
')
return '\n'.join(rendered)
elif segment_type == 'disclaimer':
rendered.append(
f''
f'

'
)
for item in content:
subtitle = Template(item.get('subtitle', '')).render(context)
description = Template(item.get('description', '')).render(context)
if subtitle:
rendered.append(f'
{subtitle}
')
if description:
processed_desc = []
for line in description.split('\n'):
line = line.strip()
if line:
processed_desc.append(f'
{line}
')
rendered.append('\n'.join(processed_desc))
rendered.append(f'
')
return '\n'.join(rendered)
else:
rendered.append(f'')
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 = True
processed_desc.append(f'- {line[2:].strip()}
')
else:
if 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'| {Template(header).render(context)} | ')
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'| {cell_content} | ')
table_html.append('
')
table_html.append('
')
rendered.append('\n'.join(table_html))
if 'html' in item:
html_template = Template(item['html'])
rendered_html = html_template.render(context)
rendered.append(rendered_html)
if 'image' in item:
image_url = Template(item['image']).render(context)
rendered.append(f'

')
if 'warning' in item:
warning_text = Template(item['warning']).render(context)
rendered.append(f'
{warning_text}
')
if 'note' in item:
note_text = Template(item['note']).render(context)
rendered.append(f'
{note_text}
')
if 'html' in segment:
html_template = Template(segment['html'])
rendered_html = html_template.render(context)
rendered.append(rendered_html)
rendered.append('
')
return '\n'.join(rendered)
def render_template(template_segments, context_data):
final_output = []
container_segments = []
disclaimer_segment = None
for segment in template_segments:
segment_type = segment.get('segment_type', 'unknown')
if segment_type == 'organization':
final_output.append(render_universal_segment(segment, context_data))
elif segment_type == 'disclaimer':
disclaimer_segment = segment
else:
container_segments.append(segment)
if container_segments:
container_html = ['']
for segment in container_segments:
container_html.append(render_universal_segment(segment, context_data))
container_html.append('
')
final_output.append('\n'.join(container_html))
if disclaimer_segment:
final_output.append(render_universal_segment(disclaimer_segment, context_data))
return '\n'.join(final_output)