#!/usr/bin/env python3
"""生成技能点描述风格的能力考察项表格"""

def row(单项, rowspan, 考察项, 描述):
    if rowspan > 1:
        td1 = f'      <lark-td rowspan="{rowspan}">\n        **{单项}**\n      </lark-td>'
    else:
        td1 = f'    <lark-td>\n      **{单项}**\n    </lark-td>'
    return f'''  <lark-tr>
{td1}
    <lark-td>
      **{考察项}**
    </lark-td>
    <lark-td>
      {描述}
    </lark-td>
  </lark-tr>'''

def build_table(items_by_skill, skill_order):
    rows_md = []
    total = 1
    for sk in skill_order:
        items = items_by_skill.get(sk, [])
        if not items:
            items = [("无", "无")]
        n = len(items)
        total += n
        for i, (item, desc) in enumerate(items):
            rs = n if i == 0 else 0
            rows_md.append(row(sk, rs, item, desc))
    header = f'''<lark-table rows="{total}" cols="3" column-widths="100,164,560">

  <lark-tr>
    <lark-td>
      **单项**
    </lark-td>
    <lark-td>
      **考察项**
    </lark-td>
    <lark-td>
      **考察项描述**
    </lark-td>
  </lark-tr>'''
    return header + '\n\n' + '\n'.join(rows_md) + '\n</lark-table>'

# ============== L1 ==============

L1_S1 = build_table({
    "听力": [
        ("基础词汇的语音识别", "听到单词发音后，在图片中找到对应的物品、人物或动物，建立声音与词义的直接连接。"),
        ("指令理解与动作执行", "听懂含方位介词和颜色词的单步指令，在场景中准确执行与指令匹配的操作。"),
    ],
    "口语": [
        ("基础个人信息的口语表达", "听懂姓名、年龄、物品名称等基础提问，用单词或简短词组主动做出恰当应答。"),
    ],
    "阅读": [
        ("图文对应的初步理解", "观察图片并阅读简短英文问句，理解句义后用单词或短语做出回答，建立图与文的对应关系。"),
    ],
    "写作": [
        ("基础词汇的书面拼写", "观察图片和英文提示，在提示下用单词或短语写出书面回答，完成从看到写的基本闭环。"),
    ],
}, ["听力", "口语", "阅读", "写作"])

L1_S2 = build_table({
    "听力": [
        ("完整单句的信息提取", "听懂一个完整英文句子，从多幅图片选项中准确选出与听到内容匹配的选项。"),
        ("场景语境下的元素匹配", "听到场景描述后，将对应人物或物品与场景位置精准匹配并执行操作。"),
        ("短对话的关键信息抓取", "听一段简短英文对话，根据提问从选项中找到对应的正确答案。"),
    ],
    "口语": [
        ("日常话题的短语级应答", "根据动作、物品、个人信息等日常提问，用完整短句做出语法正确的恰当应答。"),
        ("简单话题的观点组织", "就一个熟悉话题，用多个句子表达个人观点，进行简短的理由说明和内容扩展。"),
    ],
    "阅读": [
        ("短文本的关键信息扫读", "阅读多个简短英文文本，快速定位文本中的核心信息并与对应选项精准匹配。"),
    ],
    "写作": [
        ("图片信息的书面转述", "观察图片和英文提示，用单词或短语将图片中的信息转化为书面文字表达。"),
        ("简短信函的框架性回复", "阅读一封简短英文邮件，根据写作要求独立组织语句完成一封格式完整的回复。"),
    ],
}, ["听力", "口语", "阅读", "写作"])

L1_S3 = build_table({
    "听力": [
        ("短对话中的细节辨析", "听日常场景的简短对话，在多个近似选项中准确分辨并选出与内容一致的答案。"),
        ("结构化信息的听记同步", "听到对话或独白后，同步提取数字、时间、地点等关键信息并填入表格对应位置。"),
    ],
    "口语": [
        ("个人经历的连贯叙述", "就个人经历、活动、偏好等话题，用多句连贯的口语表达做出完整自然的应答。"),
        ("话题观点的理由支撑", "就一个话题用多句表达个人观点，给出简短理由回应追问并做适当扩展。"),
    ],
    "阅读": [
        ("多文本的信息分类匹配", "在多个简短文本中快速扫读，将提取的关键信息与对应选项进行准确的分类匹配。"),
        ("段落主旨的提炼概括", "将短文段落与其对应的主题或标题进行匹配，辨识段落核心思想的概括能力。"),
    ],
    "写作": [
        ("书信场景的语句组织", "阅读一封英文邮件，根据多个写作提示独立组织语句，完成一封要点完整的邮件回复。"),
    ],
}, ["听力", "口语", "阅读", "写作"])

L1_S4 = build_table({
    "听力": [
        ("对话意图与目的判断", "听日常场景的简短对话，推断说话人的目的、偏好或行为意图并选出正确答案。"),
        ("多维度信息的协同提取", "听对话或独白后，同步定位并记录多个不同维度的关键信息到表格对应字段。"),
        ("多人对话的信息归属", "听一段包含多个说话人的对话，将不同人物的信息、观点与行为正确归属匹配。"),
    ],
    "口语": [
        ("个人经历的连贯叙述", "就个人经历与偏好等话题，用连贯的多句做出完整流畅的回答并回应追问。"),
        ("话题讨论中的观点展开", "就一个话题用多个句子展开讨论，表达明确观点并给出两个以上的理由支撑。"),
    ],
    "阅读": [
        ("多文本间的信息定位", "在多个短文本中快速扫读并定位关键信息，完成与对应选项的精准匹配。"),
        ("较长文本的理解判断", "阅读一篇完整英文短文，根据对内容的理解和推理从选项中选择正确的答案。"),
        ("语境中的词汇选择", "阅读一篇有语篇空缺的短文，根据语法和语义从选项中选择正确的单词填入空白。"),
        ("语境中的词汇拼写", "阅读一篇含空白的短文，根据上下文和语法规则直接写出正确单词完成语篇补全。"),
    ],
    "写作": [
        ("书信场景的完整语句组织", "根据邮件中的写作提示，独立组织语句完成一封内容完整、格式规范的邮件回复。"),
    ],
}, ["听力", "口语", "阅读", "写作"])

L1_S5 = build_table({
    "听力": [
        ("多轮对话的信息筛选", "听涉及多话题的短对话，在多条相关信息中准确筛选出正确答案对应的目标信息。"),
        ("结构化信息的听记同步", "听独白或对话材料，同步定位并记录多个维度的关键信息到表格中。"),
        ("说话人观点与信息的匹配", "听一段多说话人对话，将不同说话人的观点、偏好和关键信息准确归属匹配。"),
    ],
    "口语": [
        ("日常生活话题的流畅应答", "就日常生活、学习和活动话题，用连贯完整句自然地做出流畅得体的应答。"),
        ("话题讨论中的深入展开", "就一个话题展开深入讨论，清晰表达观点并用充分的理由和例证支撑。"),
    ],
    "阅读": [
        ("多文本的快速扫读定位", "在多篇短文本中快速扫读并精准定位关键信息。"),
        ("段落大意的提炼匹配", "将短文段落与对应的标题或主题进行匹配，辨识段落核心思想。"),
        ("较长文本的推理判断", "阅读一篇完整英文文章，根据深层内容的理解和推理选择出正确答案。"),
        ("语篇中的词汇选择与运用", "根据语法规则和语义逻辑从选项中选择正确单词填入短文空缺处。"),
    ],
    "写作": [
        ("书信场景的完整语句组织", "独立完成一封语句连贯、内容完整、格式规范的邮件回复。"),
        ("系列图片的叙事组织", "根据三幅连续图片提示，用连贯多句叙述一个逻辑完整的事件过程。"),
    ],
}, ["听力", "口语", "阅读", "写作"])

L1_S6 = build_table({
    "听力": [
        ("态度与意图的推理判断", "听涉及推理和态度表达的短对话，根据深层语用含义选出正确答案。"),
        ("多层次信息的协同提取", "听独白或长对话，同步提取并准确记录多个结构化字段的细节信息。"),
        ("说话人观点与态度的匹配", "听多段对话或多位说话人，将不同人的观点、态度和信息准确归属匹配。"),
    ],
    "口语": [
        ("话题讨论的深入展开与论证", "就一个话题展开深入讨论，用清晰连贯的语句进行多轮表达并给出有说服力的论证。"),
        ("图片信息的口头分析与表达", "观察图片场景，听懂提问后用完整句描述图中信息、比较差异并表达个人看法。"),
    ],
    "阅读": [
        ("多文本的信息精准定位", "在多个文本中快速扫读并精准定位关键信息完成对应匹配。"),
        ("较长文本的主旨概括与推理", "阅读长篇英文文章，根据主旨概括、深层推理和态度判断选择正确答案。"),
        ("语篇中的词义选择与语法运用", "在短文空缺处根据语法规则和语义逻辑选出正确单词。"),
        ("语篇中的词汇拼写与语法运用", "根据上下文语境和语法规则直接写出正确的单词完成语篇补全。"),
        ("句图信息的一致性判断", "阅读英文句子并观察对应图片，判断文字描述与图片内容是否一致。"),
    ],
    "写作": [
        ("书信场景的高质量完整产出", "完成一封语句流畅、内容要点完整、格式规范的高质量邮件回复。"),
        ("系列图片的完整故事叙事", "根据系列图片提示，用连贯多句叙述一个结构完整、逻辑清晰的故事。"),
    ],
}, ["听力", "口语", "阅读", "写作"])

# ============== L2 ==============

L2_S1 = build_table({
    "听力": [
        ("词汇的语音与语义连接", "听到单词和短句发音后，在图片选项中准确匹配对应的物品、人物或场景。"),
        ("场景描述的听辨与匹配", "听到场景描述后，将对应人物、物品或元素精准匹配并完成操作。"),
    ],
    "口语": [
        ("日常话题的完整句应答", "根据个人信息、喜好、经历等日常提问，用完整句做出语法准确的自然应答。"),
        ("图片信息的口头识别与命名", "观察图片中的物品、人物或动物，听懂提问后口头准确说出对应的名称和特征。"),
    ],
    "阅读": [
        ("短句与图片的一致性判断", "阅读简短英文句子并观察对应图片，判断文字描述与图中内容是否一致。"),
    ],
    "写作": [
        ("图片场景的简短书面描述", "观察图片和英文提示，用单词或短句将图中信息和场景转化为书面表达。"),
    ],
}, ["听力", "口语", "阅读", "写作"])

L2_S2 = build_table({
    "听力": [
        ("多人场景的信息匹配", "听到多人描述后，将不同人物、物品与其对应信息和位置准确匹配。"),
        ("对话中的信息筛选与判断", "听一段简短对话，从多个图片或文字选项中准确选出与内容匹配的答案。"),
    ],
    "口语": [
        ("人物与场景的口头描述", "观察图片中的人物、动作和场景，用多句完整口语进行连贯的描述表达。"),
        ("个人喜好与原因的表达", "就个人喜好和经历话题用连贯语句做出完整应答，清晰表达好恶并给出理由。"),
    ],
    "阅读": [
        ("短文本的定义与词义匹配", "阅读简短英文定义或描述，在选项中找到与之对应的正确词汇或短语。"),
        ("多文本的信息分类与对应", "在多个简短文本中扫读关键信息，完成不同来源信息的分类与对应匹配。"),
    ],
    "写作": [
        ("简短信函的自主语句组织", "阅读一封简短英文邮件，根据写作要求独立组织语句完成格式完整的回信。"),
    ],
}, ["听力", "口语", "阅读", "写作"])

L2_S3 = build_table({
    "听力": [
        ("话语意图与态度的推理", "听涉及推理判断和偏好表达的英文句子或对话，从选项中选出与内容匹配的答案。"),
    ],
    "口语": [
        ("个人经历与观点的连贯表达", "就个人信息、经历和观点等话题，用连贯自然的多句做出完整流畅的应答。"),
        ("图片场景的分析性描述", "观察图片场景中的细节，听懂提问后用完整句描述关键信息并进行简要分析。"),
    ],
    "阅读": [
        ("句图信息的一致性判断", "阅读英文句子并观察对应图片，判断文字描述与图片内容是否一致。"),
    ],
    "写作": [
        ("简短信函的独立写作", "阅读一封英文邮件，根据写作提示独立组织多句连贯语句完成一封完整的回复。"),
    ],
}, ["听力", "口语", "阅读", "写作"])

L2_S4 = build_table({
    "听力": [
        ("长对话的信息理解与选择", "听一段多轮英文对话，根据对内容和说话人意图的理解从选项中选择正确答案。"),
        ("独白信息的结构化记录", "听独白类材料，在连贯叙述中准确定位并记录多个关键信息字段到表格中。"),
    ],
    "口语": [
        ("日常话题的多维应答", "就日常话题做出多句连贯的完整应答，表达清晰的观点并用理由支撑。"),
        ("给定话题的观点组织与表达", "就一个给定话题，用多句表达个人看法并用充分的理由和例证做扩展讨论。"),
    ],
    "阅读": [
        ("多文本的信息分类与匹配", "在多个短文本中快速扫读定位关键信息，完成信息的分类与对应匹配。"),
        ("句图信息的一致性判断", "阅读英文句子并观察对应图片，判断文字描述与图片内容是否一致。"),
    ],
    "写作": [
        ("书信场景的完整独立写作", "根据邮件内容提示，独立完成一封语句连贯、内容完整、格式规范的邮件。"),
    ],
}, ["听力", "口语", "阅读", "写作"])

L2_S5 = build_table({
    "听力": [
        ("长对话的态度与情绪辨识", "听涉及态度和情绪的多轮英文对话，根据对话者的语气和用词辨识其情感倾向。"),
        ("独白中的多维度信息提取", "听独白材料，在连贯叙述中同步定位并准确记录多个维度的结构化信息。"),
    ],
    "口语": [
        ("话题讨论的论证与扩展", "就一个话题展开深入讨论，表达清晰的观点并用充分的理由和例证进行论证。"),
        ("图片信息的描述与观点表达", "观察图片提示，听懂提问后用连贯语句描述场景、分析信息并表达个人看法。"),
    ],
    "阅读": [
        ("多文本的信息扫读与匹配", "在多个文本中快速扫读并精准定位关键信息完成匹配。"),
        ("较长文本的理解与推理", "阅读一篇英文文章，根据对内容的理解和推理从选项中选择正确答案。"),
        ("语篇中的词义选择与语法运用", "根据语法规则和语义逻辑从选项中选择正确单词填入短文空缺处。"),
    ],
    "写作": [
        ("书信的完整独立产出", "根据邮件内容提示，独立完成一封语句流畅、内容完整、格式规范的邮件。"),
    ],
}, ["听力", "口语", "阅读", "写作"])

L2_S6 = build_table({
    "听力": [
        ("长对话的深层含义理解", "听涉及推理判断和态度识别的长对话，根据深层语义理解选出正确答案。"),
        ("听力材料的多维结构化记录", "听独白材料，同步提取并准确记录多个维度的结构化信息到表格中。"),
        ("多说话人的观点与态度匹配", "听多段含多位说话人的对话，将不同人的观点、态度和信息准确归属匹配。"),
    ],
    "口语": [
        ("话题讨论的深入论证", "就一个话题展开深入讨论，用清晰连贯的语句表达观点并做出有说服力的论证。"),
        ("图片场景的综合口头表达", "观察图片场景，听懂提问后用完整连贯语句描述、比较、分析和表达个人见解。"),
    ],
    "阅读": [
        ("多文本的信息精准定位与匹配", "扫读多个文本，快速精准定位关键信息并完成对应匹配。"),
        ("长文本的主旨概括与推理判断", "阅读长篇英文文章，根据深层理解、主旨概括和推理判断选择正确答案。"),
        ("语篇中的词义与语法综合运用", "在短文空缺处根据语法规则和语义逻辑选出正确单词。"),
        ("语篇中的词汇拼写与语法综合运用", "根据上下文语境和语法规则，直接写出正确单词完成语篇补全。"),
    ],
    "写作": [
        ("书信的高质量完整写作", "独立完成一封语句流畅、要点完整、格式规范的高质量邮件回复。"),
        ("系列图片的完整故事写作", "根据系列图片提示，用连贯多句叙述一个结构完整、逻辑清晰的故事。"),
    ],
}, ["听力", "口语", "阅读", "写作"])

L2_S7 = build_table({
    "听力": [
        ("KET听力全题型的综合运用", "在短对话选图、长对话选择和信息匹配等不同听力题型间自如切换，速度和精度同步提升。"),
        ("多来源信息的结构化提取", "在多种听力材料中提取并准确记录多个结构化信息字段。"),
        ("多段对话的观点与信息综合", "听多段不同类型对话，综合判断并将信息与对应选项完成准确匹配。"),
    ],
    "口语": [
        ("话题讨论的深度论证与互动", "就一个话题展开深入讨论，用清晰、连贯、得体的语句进行流畅的多轮表达。"),
        ("图片场景的多维度口头表达", "观察图片并回答提问，用完整语句描述场景、比较异同、分析信息并表达观点。"),
    ],
    "阅读": [
        ("多文本的精准扫读与匹配", "在多个文本中快速扫读并精准定位关键信息完成对应匹配。"),
        ("长文本的综合理解与判断", "阅读长篇文章，根据深层理解、推理判断和主旨概括选择正确答案。"),
        ("语篇中的词汇与语法综合运用", "在长文体裁中，根据语法规则、语义逻辑和篇章结构选出正确单词填入。"),
        ("语篇中的自主拼写与语法运用", "根据上下文语境和语法规则，直接写出正确单词完成语篇补全。"),
        ("句图一致性的综合判断", "阅读英文句子并对照图片，判断句义与图中的内容是否匹配。"),
    ],
    "写作": [
        ("高质量书信的独立产出", "独立完成一封语句流畅、格式规范、内容全面的高质量邮件回复。"),
        ("系列图片的完整叙事写作", "根据系列图片提示，用连贯多句叙述一个结构完整、逻辑清晰的故事。"),
    ],
}, ["听力", "口语", "阅读", "写作"])

L2_S8 = build_table({
    "听力": [
        ("KET听力全题型冲刺", "KET听力全部题型的综合冲刺训练，覆盖短对话选图、长对话理解和信息匹配。"),
        ("独白信息的精准化提取", "独白填表题的冲刺训练，确保信息提取的准确性、完整性和速度同步达标。"),
        ("多来源对话的信息综合", "多段短对话和长对话信息的综合匹配与归属冲刺训练。"),
    ],
    "口语": [
        ("KET口语全场景模拟冲刺", "KET口语两大核心任务冲刺——个人信息问答的精准流畅和协作任务讨论的准确得体。"),
        ("真实考试场景的综合口语输出", "在真实考试场景中用清晰、连贯、得体的口语完成全部任务并达到考试标准。"),
    ],
    "阅读": [
        ("KET五大阅读题型的全量覆盖", "标识理解、信息匹配、长文选择、完形填空和开放填空五大题型的综合冲刺。"),
        ("长文本的深度理解与推理", "长文阅读的冲刺训练，覆盖细节理解、推理判断、主旨概括和态度分析。"),
        ("语篇完形的全面复盘", "完形填空的全面复盘与冲刺，语法规则和语义判断能力的综合提升。"),
        ("开放填空的精准拼写", "开放填空的冲刺训练，词汇拼写和语法规则的全面巩固与精准化。"),
        ("句图一致性的稳定输出", "句图一致性判断的持续练习，巩固阅读理解的基础技能。"),
    ],
    "写作": [
        ("短消息写作的全量复盘", "短消息写作的全面复盘，含格式规范、内容衔接连贯和语法准确度的综合巩固。"),
        ("看图写故事的完整叙事冲刺", "看图写故事的冲刺训练，含叙事组织逻辑、词汇丰富度和时态一致性的全面达标。"),
    ],
}, ["听力", "口语", "阅读", "写作"])

# ========= Build output =========

stages = [
    ("L1", "阶段1（U1-U8 · Starters入门）", L1_S1),
    ("L1", "阶段2（U9-U16 · Starters基础）", L1_S2),
    ("L1", "阶段3（U17-U24 · Starters达标）", L1_S3),
    ("L1", "阶段4（U25-U32 · Movers入门）", L1_S4),
    ("L1", "阶段5（U33-U40 · Movers基础）", L1_S5),
    ("L1", "阶段6（U41-U48 · Movers达标）", L1_S6),
    ("L2", "阶段1（U1-U6 · Flyers入门）", L2_S1),
    ("L2", "阶段2（U7-U12 · Flyers基础）", L2_S2),
    ("L2", "阶段3（U13-U18 · Flyers达标）", L2_S3),
    ("L2", "阶段4（U19-U24 · KET入门）", L2_S4),
    ("L2", "阶段5（U25-U30 · KET基础）", L2_S5),
    ("L2", "阶段6（U31-U36 · KET强化）", L2_S6),
    ("L2", "阶段7（U37-U42 · KET高位）", L2_S7),
    ("L2", "阶段8（U43-U48 · KET达标）", L2_S8),
]

out = []
current_level = None
for level, stage_name, table in stages:
    if level != current_level:
        current_level = level
        out.append(f'\n## {level} 级别\n')
    out.append(f'### {stage_name}\n')
    out.append(table)

print('\n'.join(out))
