#!/usr/bin/env python3
"""
Tab2内容生成器 - L3单元解构
包含:单元列表,每个单元包含单元编号、时间范围、单元核心概括、完整文案、实质
"""
import html as html_module
from typing import Dict, Any, List
def render_unit_card(unit: Dict[str, Any], idx: int) -> str:
"""渲染单元卡片"""
unit_num = unit.get("单元编号", idx)
time_range = unit.get("时间范围", "")
core_summary = unit.get("单元核心概括", "")
full_text = unit.get("完整文案", "")
substance = unit.get("实质", {})
card_id = f'unit-{unit_num}'
html = f'
\n'
html += f'\n'
html += f'
\n'
# 完整文案
if full_text:
html += '
\n'
html += '
完整文案:\n'
html += f'
{html_module.escape(full_text)}
\n'
html += '
\n'
# 实质内容
if substance:
# 具体元素
concrete_elements = substance.get("具体元素", {})
if concrete_elements:
html += '
\n'
html += '
具体元素:\n'
keywords = concrete_elements.get("关键词", [])
if keywords:
html += '
\n'
html += '
关键词:\n'
html += '
\n'
for keyword in keywords:
html += f'{html_module.escape(str(keyword))}\n'
html += '
\n'
html += '
\n'
forms = concrete_elements.get("对应形式", {})
if forms:
html += '
\n'
html += '
对应形式:\n'
if forms.get("文案形式"):
html += f'
文案形式:{html_module.escape(forms["文案形式"])}
\n'
if forms.get("画面形式"):
html += f'
画面形式:{html_module.escape(forms["画面形式"])}
\n'
if forms.get("声音形式"):
html += f'
声音形式:{html_module.escape(forms["声音形式"])}
\n'
html += '
\n'
html += '
\n'
# 具象概念
concrete_concepts = substance.get("具象概念", {})
if concrete_concepts:
html += '
\n'
html += '
具象概念:\n'
keywords = concrete_concepts.get("关键词", [])
if keywords:
html += '
\n'
html += '
关键词:\n'
html += '
\n'
for keyword in keywords:
html += f'{html_module.escape(str(keyword))}\n'
html += '
\n'
html += '
\n'
forms = concrete_concepts.get("对应形式", {})
if forms:
html += '
\n'
html += '
对应形式:\n'
if forms.get("文案形式"):
html += f'
文案形式:{html_module.escape(forms["文案形式"])}
\n'
if forms.get("画面形式"):
html += f'
画面形式:{html_module.escape(forms["画面形式"])}
\n'
if forms.get("声音形式"):
html += f'
声音形式:{html_module.escape(forms["声音形式"])}
\n'
html += '
\n'
html += '
\n'
# 抽象概念
abstract_concepts = substance.get("抽象概念", {})
if abstract_concepts:
html += '
\n'
html += '
抽象概念:\n'
keywords = abstract_concepts.get("关键词", [])
if keywords:
html += '
\n'
html += '
关键词:\n'
html += '
\n'
for keyword in keywords:
html += f'{html_module.escape(str(keyword))}\n'
html += '
\n'
html += '
\n'
forms = abstract_concepts.get("对应形式", {})
if forms:
html += '
\n'
html += '
对应形式:\n'
if forms.get("文案形式"):
html += f'
文案形式:{html_module.escape(forms["文案形式"])}
\n'
if forms.get("画面形式"):
html += f'
画面形式:{html_module.escape(forms["画面形式"])}
\n'
if forms.get("声音形式"):
html += f'
声音形式:{html_module.escape(forms["声音形式"])}
\n'
html += '
\n'
html += '
\n'
html += '
\n'
html += '
\n'
return html
def generate_tab2_content(data: Dict[str, Any]) -> str:
"""生成Tab2内容:L3单元解构"""
html = '\n'
html += '
\n'
html += '
L3单元解构
\n'
l3_deconstruction = data.get("L3单元解构", {})
unit_list = l3_deconstruction.get("单元列表", [])
if not unit_list:
html += '
暂无数据
\n'
else:
html += f'
共 {len(unit_list)} 个单元
\n'
for idx, unit in enumerate(unit_list, start=1):
html += render_unit_card(unit, idx)
html += '
\n'
html += '
\n'
return html