#!/usr/bin/env python3
# wenfeng.py — 中文文风 linter。零依赖，只用标准库。
# 用法: python3 wenfeng.py 我的文章.txt 范文_王小波.txt 范文_汪曾祺.txt
# 心法: 不看绝对阈值，只看你和范文的差距。差距最大的 2-3 项才是本季度要改的。

import re, sys, statistics as st

# --- 翻译腔标记 (余光中《怎样改进英式中文》为主要来源) ---
_V = '进行|作出|做出|给予|加以|予以|实现|完成|开展|从事'
_N = '分析|研究|讨论|说明|改进|优化|处理|管理|评估|考虑'
NOMINAL = r'(' + _V + r')[一了]?[^，。；！？]{0,3}(' + _N + r')'
TRANS = [
    (r'对于[^，。]{0,12}来说', '对于…来说'),
    (r'在[^，。]{0,12}(的情况下|的前提下|方面)', '在…的情况下'),
    (r'[^一]之一(?![个])', '…之一'),
    (r'一个[^，。；！？]{2,10}的', '一个…的'),
    (r'不[可得]以?被', '不可被'),
    (r'(通过|经由|借由)[^，。]{2,15}(使|让)得?', '通过…使得'),
    (r'[\u4e00-\u9fa5]{2,4}性的?(?=[\u4e00-\u9fa5])', '…性'),
    (r'[\u4e00-\u9fa5]{2,3}化的?(?=[\u4e00-\u9fa5])', '…化'),
    (r'(?<![人他她我你])们(?=[的，。、])', '滥用的「们」'),
]
JARGON = ('赋能 抓手 闭环 颗粒度 对齐 拉通 心智 生态位 护城河 降本增效 '
          '底层逻辑 方法论 组合拳 价值感知 链路 沉淀 聚焦 打法 势能 '
          '占位 卡位 破圈 壁垒 范式 终局 长期主义').split()

def sentences(t):
    t = re.sub(r'\s+', '', t)
    parts = re.split(r'[。！？…]+', t)
    return [p for p in parts if len(p) >= 2]

def clauses(t):
    t = re.sub(r'\s+', '', t)
    parts = re.split(r'[。！？…，；：]+', t)
    return [p for p in parts if len(p) >= 2]

def report(name, text):
    han = len(re.findall(r'[\u4e00-\u9fa5]', text))
    k = han / 1000 or 1
    ss = sentences(text)
    cs = clauses(text)
    L = [len(s) for s in ss]
    CL = [len(c) for c in cs]
    de = len(re.findall('的', text))
    de_chain = sum(1 for c in cs if c.count('的') >= 2)
    nom = len(re.findall(NOMINAL, text))
    bei = len(re.findall(r'被(?![迫动])', text))
    jarg = sum(text.count(w) for w in JARGON)
    tr = sum(len(re.findall(p, text)) for p, _ in TRANS)
    long_ratio = sum(1 for x in L if x > 45) / (len(L) or 1)

    return {
        '样本': name,
        '汉字数': han,
        '句长中位数': round(st.median(L), 1) if L else 0,
        '句长标准差': round(st.pstdev(L), 1) if len(L) > 1 else 0,
        '长句占比45+': f'{long_ratio*100:.1f}%',
        '分句长中位数': round(st.median(CL), 1) if CL else 0,
        '的/千字': round(de / k, 1),
        '多的分句占比': f'{de_chain/(len(cs) or 1)*100:.1f}%',
        '名词化/千字': round(nom / k, 2),
        '被字/千字': round(bei / k, 2),
        '黑话/千字': round(jarg / k, 2),
        '翻译腔/千字': round(tr / k, 2),
    }

def detail(text):
    out = []
    for p, label in TRANS:
        hits = re.findall(p, text)
        if hits:
            out.append((label, len(hits)))
    return sorted(out, key=lambda x: -x[1])

if __name__ == '__main__':
    rows = []
    for path in sys.argv[1:]:
        with open(path, encoding='utf-8') as f:
            txt = f.read()
        rows.append(report(path.split('/')[-1], txt))

    if not rows:
        print('用法: python3 wenfeng.py 我的.txt 范文1.txt 范文2.txt')
        sys.exit(0)

    keys = list(rows[0].keys())
    w = max(len(k) for k in keys) + 2
    for k in keys:
        print(k.ljust(w) + ''.join(str(r[k]).ljust(15) for r in rows))

    print('\n--- 第一个样本的翻译腔明细 ---')
    with open(sys.argv[1], encoding='utf-8') as f:
        for label, n in detail(f.read()):
            print(f'  {label:<16} {n}')
