# -*- coding: utf-8 -*-
from docx import Document
from docx.shared import Pt, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.oxml.ns import qn
from docx.oxml import OxmlElement

FONT = "Tahoma"       # 泰文/拉丁
CN_FONT = "宋体"      # 中文
L_TH = "th-TH"
L_CN = "zh-CN"

doc = Document()

style = doc.styles["Normal"]
style.font.name = FONT
style.font.size = Pt(12)
rpr = style.element.get_or_add_rPr()
rf = rpr.find(qn("w:rFonts"))
if rf is None:
    rf = OxmlElement("w:rFonts")
    rpr.append(rf)
rf.set(qn("w:ascii"), FONT)
rf.set(qn("w:hAnsi"), FONT)
rf.set(qn("w:eastAsia"), CN_FONT)
rf.set(qn("w:cs"), FONT)


def set_fonts(run):
    r = run._element.get_or_add_rPr()
    f = r.find(qn("w:rFonts"))
    if f is None:
        f = OxmlElement("w:rFonts")
        r.append(f)
    f.set(qn("w:ascii"), FONT)
    f.set(qn("w:hAnsi"), FONT)
    f.set(qn("w:eastAsia"), CN_FONT)
    f.set(qn("w:cs"), FONT)


def set_lang(run, lang):
    r = run._element.get_or_add_rPr()
    l = r.find(qn("w:lang"))
    if l is None:
        l = OxmlElement("w:lang")
        r.append(l)
    l.set(qn("w:val"), lang)
    l.set(qn("w:eastAsia"), lang)
    l.set(qn("w:cs"), lang)


def para(segments, size=12, bold=False, indent=0, space_after=6, space_before=0, align=None):
    p = doc.add_paragraph()
    for text, lang in segments:
        run = p.add_run(text)
        run.bold = bold
        run.font.size = Pt(size)
        set_fonts(run)
        set_lang(run, lang)
    if indent:
        p.paragraph_format.left_indent = Pt(indent)
    p.paragraph_format.space_after = Pt(space_after)
    p.paragraph_format.space_before = Pt(space_before)
    if align:
        p.alignment = align
    return p


def cn(t):
    return (t, L_CN)


def th(t):
    return (t, L_TH)


def heading(text, level=1):
    if level == 1:
        p = para([cn(text)], size=15, bold=True, space_before=14, space_after=6)
    else:
        p = para([cn(text)], size=13, bold=True, space_before=10, space_after=4)
    return p


# ============ 标题 ============
para([cn("《การใช้ภาษาไทยในวงราชการ》读书笔记")], size=18, bold=True,
     align=WD_ALIGN_PARAGRAPH.CENTER, space_after=2)
para([cn("—— บทที่ ๓ การรับสารด้วยการฟัง 要点归纳与关键句型 / 例句（附注释与参考译文）")], size=12, bold=False,
     align=WD_ALIGN_PARAGRAPH.CENTER, space_after=14)

# ============ 一、要点归纳 ============
heading("一、要点归纳", 1)

heading("（一）การฟัง มีประโยชน์อย่างไร —— 聆听的益处（6 条）", 2)
para([cn("1. "), th("体现聆听礼仪"), cn("（"), th("มารยาทในการฟัง"), cn("）：无论小组发言、交谈还是公众发言，专心听他人讲话，是懂得聆听礼仪的表现。")], indent=18)
para([cn("2. "), th("听懂、切题作答"), cn("（"), th("ตรงประเด็น"), cn("）：专心聆听、不走神（"), th("ไม่ใจลอย"), cn("），才能理解内容、切中要害地回答提问，进而增强自信（"), th("มั่นใจในตนเอง"), cn("）、敢于表达（"), th("กล้าแสดงออก"), cn("）。")], indent=18)
para([cn("3. "), th("增长知识与经验"), cn("：尤其是语言运用方面的经验，可看到他人用语的优点与不足，学到新词汇新说法（"), th("คำศัพท์ สำนวนใหม่ ๆ"), cn("）。")], indent=18)
para([cn("4. "), th("积累知识的好方法"), cn("（"), th("สะสมความรู้"), cn("）：除了直接经验（"), th("ทางตรง"), cn("：观察、探究、试验、亲历），间接经验（"), th("ทางอ้อม"), cn("）也能快速、大量地增长知识。")], indent=18)
para([cn("5. "), th("缓解紧张压力"), cn("（"), th("ผ่อนคลายความตึงเครียด"), cn("）：听音乐、广播剧可放松身心，听新闻又能紧跟时事。")], indent=18)
para([cn("6. "), th("做完美的交谈对象"), cn("（"), th("คู่สนทนาที่สมบูรณ์แบบ"), cn("）：懂得聆听、把握插话时机的人更受欢迎，也有助于社交中的形象（"), th("บุคลิกภาพ"), cn("）。")], indent=18)

heading("（二）หลักการฟัง —— 聆听的原则（3 条）", 2)
para([cn("1. "), th("专心聆听、善于忍耐"), cn("（"), th("ตั้งใจฟังและอดทน"), cn("）：兴趣是基础；即便不想听也不得不听（如听上司命令、参加简报/会议）；不中途插话（"), th("พูดสอดขึ้นกลางคัน"), cn("、"), th("พูดกลางปล้อง"), cn("），提问须等对方允许或把话说完；排除自身与环境干扰（头痛、闷热、座椅不适等），选择能听清、看清的座位。")], indent=18)
para([cn("2. "), th("从所听内容中获益"), cn("（"), th("หาประโยชน์จากสิ่งที่ได้ฟัง"), cn("）：要区分事实（"), th("ข้อเท็จจริง"), cn("）与观点（"), th("ข้อคิดเห็น"), cn("）；评估观点要心持中立（"), th("ใจเป็นกลาง"), cn("），不以个人好恶或对方身份（上司、师长、熟人）下定论，而以是否合理、是否合乎事实、是否利他为准。")], indent=18)
para([cn("3. "), th("抓要点并总结"), cn("（"), th("จับประเด็นสำคัญแล้วสรุป"), cn("）：好的演讲者条理清晰，差的演讲者东拉西扯（"), th("วกวน"), cn("）；听者要努力抓住核心要点，整理并归纳，最好做记录（"), th("จดบันทึก"), cn("）以防遗忘。")], indent=18)

# ============ 二、关键句型与例句 ============
heading("二、关键句型与例句（附注释与参考译文）", 1)

# 例1
heading("例1 · 句型 ไม่ว่า...ก็ตาม —— 无论……（都）", 2)
para([th("ในขณะที่มีการพูด ไม่ว่าจะเป็นการพูดในกลุ่มย่อย การสนทนา หรือการพูดในที่สาธารณชนก็ตาม การตั้งใจฟังผู้อื่นพูดแสดงถึงความเป็นผู้มีมารยาทในการฟัง")], indent=18)
para([cn("参考译文：在说话的时候，无论小组发言、交谈还是在公众场合发言，专心听他人讲话都体现了懂得聆听的礼仪。")], indent=18)
para([cn("注释："), th("ไม่ว่า + 列举（หรือ...） + ก็ตาม"), cn(" 表示让步，义为“无论……（都）”，后接主句。")], indent=18)

# 例2
heading("例2 · 句型 ทั้ง...และ... —— 既……又……", 2)
para([th("...ใช้วิธีลาแบบต่าง ๆ สลับกันไป ทั้งลาป่วย ลากิจ และลาพักผ่อน")], indent=18)
para([cn("参考译文：……轮流使用各种请假方式，既有病假、事假，也有休假。")], indent=18)
para([cn("注释："), th("ทั้ง A และ B"), cn(" 义为“既 A 又 B”，用于列举两个及以上并列成分。")], indent=18)

# 例3
heading("例3 · 句型 นอกจากนี้...ด้วย —— 此外还……", 2)
para([th("นอกจากนี้การฟังข่าวสารย่อมทำให้ทันกับเหตุการณ์ต่าง ๆ ที่เกิดขึ้นในโลกด้วย")], indent=18)
para([cn("参考译文：此外，聆听新闻还会让你跟得上世界上发生的各种事件。")], indent=18)
para([cn("注释："), th("นอกจากนี้...ด้วย"), cn(" 义为“此外还……”；"), th("นอกจาก A แล้ว ยัง B"), cn(" 义为“除了 A 之外还 B”。")], indent=18)

# 例4
heading("例4 · 副词 ย่อม —— 必然、自然、当然", 2)
para([th("ผู้พูดที่ดีย่อมจะต้องจัดสาระเรื่องราวที่พูดอย่างมีระเบียบและให้เป็นไปตามจุดประสงค์ของตน")], indent=18)
para([cn("参考译文：好的演讲者必然会条理清晰地组织所讲内容，并围绕自己的目的进行。")], indent=18)
para([cn("注释："), th("ย่อม"), cn(" 为书面语副词，置于动词前，表示“理所当然会……”。")], indent=18)

# 例5
heading("例5 · 句型 ในกรณีที่... —— 在……的情况下", 2)
para([th("ในกรณีที่ไม่ได้มีความต้องการที่จะฟังแต่จำเป็นต้องฟัง เช่น ต้องฟังคำสั่งหัวหน้า หรือต้องเข้าฟังการบรรยายสรุปหรือการประชุม")], indent=18)
para([cn("参考译文：在并不想听却又不得不听的情况下，例如必须听上司的命令，或必须参加简报、会议。")], indent=18)
para([cn("注释："), th("ในกรณีที่ + 从句"), cn(" 义为“在……的情况下”，书面语中引出条件或情形。")], indent=18)

# 例6
heading("例6 · 近义表达 พูดสอดขึ้นกลางคัน / พูดกลางปล้อง —— 中途插话", 2)
para([th("สิ่งที่ผู้ฟังควรปฏิบัติในขณะฟังคือ ไม่ควรพูดสอดขึ้นกลางคัน บางคนมีนิสัย “พูดกลางปล้อง” คือไม่สามารถเก็บความคิดความรู้สึกไว้ได้ ต้องพูดสอดขึ้นมาทันที")], indent=18)
para([cn("参考译文：聆听时听者应做到：不应中途插话。有些人有“半途插话”的习惯，就是藏不住自己的想法感受，非立刻插嘴不可。")], indent=18)
para([cn("注释："), th("พูดสอด / พูดสอดขึ้นกลางคัน / พูดกลางปล้อง"), cn(" 都表“插话、打断”；"), th("สอด"), cn("＝插入，"), th("กลางคัน"), cn("＝中途，"), th("กลางปล้อง"), cn("＝半截。插话被视为缺乏聆听礼仪（"), th("ขาดมารยาทในการฟัง"), cn("）。")], indent=18)

# 例7
heading("例7 · 词汇辨析 ข้อเท็จจริง / ข้อคิดเห็น —— 事实 / 观点", 2)
para([th("ตามปกติแล้วการพูดเรื่องต่าง ๆ ไม่ว่าจะเป็นการสนทนา การปรึกษาหารือในระหว่างปฏิบัติราชการ หรือการบรรยายก็ตาม ผู้พูดย่อมจะส่งสารทั้ง ๒ ประเภทปะปนกันมามากบ้างน้อยบ้าง")], indent=18)
para([cn("参考译文：通常来说，谈论各种事情——无论是交谈、公务中的商议，还是讲座——说话者总会把事实与观点这两类信息多多少少混在一起传达。")], indent=18)
para([cn("注释："), th("ข้อเท็จจริง"), cn("＝事实（客观），"), th("ข้อคิดเห็น"), cn("＝观点、看法（主观）；聆听时要能把二者区分开（"), th("แยกข้อเท็จจริงและข้อคิดเห็นออกจากกัน"), cn("）。")], indent=18)

# 例8
heading("例8 · 句型 ต้อง...เสียก่อน —— 必须先……", 2)
para([th("ถ้าหากจะถามต้องคอยให้ผู้พูดอนุญาตให้ถาม หรือคอยให้ผู้พูดพูดจนจบความเสียก่อน")], indent=18)
para([cn("参考译文：如果要提问，必须等演讲者允许提问，或等演讲者把话说完再说。")], indent=18)
para([cn("注释："), th("ต้อง + 动词 + เสียก่อน"), cn(" 义为“必须先……（再……）”；"), th("เสียก่อน"), cn(" 置于句末，表“先、事先”。")], indent=18)

out = "/home/mi/.openclaw/workspace/tha_ocr/读书笔记_บทที่3_การรับสารด้วยการฟัง.docx"
doc.save(out)
print("SAVED:", out)
