#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# fix_render_filter.py — 在 render_main_page 之前过滤 rows（只排标题）
import ast, os, re, shutil
D = '/root/gov_crawler/'
p = D + 'search_app.py'
src = open(p, encoding='utf-8').read()
lines = src.split('\n')
# 1) 移除之前插在中间变量后、无效的过滤块
if '# QC20261008 排除词过滤（路由级，只排标题）' in src:
    out, skip = [], False
    for l in lines:
        if '# QC20261008 排除词过滤（路由级，只排标题）' in l:
            skip = True
            continue
        if skip:
            if re.match(r'^\s*(try:|_ei, _ee|if _ee and results|_bk = len\(results\)|def _ttl|return \(_r|return ""|results = \[_r|if len\(results\) != _bk|total = max\(0|except Exception:|pass\s*$)', l):
                continue
            skip = False
        out.append(l)
    src = '\n'.join(out)
    lines = src.split('\n')
    print('已移除中间变量上的旧过滤块')

NEW = [
    '# QC20261008 排除词过滤（渲染前，只排标题）',
    'try:',
    '    _ei, _ee = parse_google_query(q or "")',
    '    if _ee and rows:',
    '        _bk = len(rows)',
    '        def _ttl(_r):',
    '            try:',
    '                return (_r.get("title") if isinstance(_r, dict) else _r["title"]) or ""',
    '            except Exception:',
    '                return ""',
    '        rows = [_r for _r in rows if not any(_t in _ttl(_r) for _t in _ee)]',
    '        if len(rows) != _bk:',
    '            try:',
    '                total = max(0, int(total or 0) - (_bk - len(rows)))',
    '            except Exception:',
    '                pass',
    'except Exception:',
    '    pass',
]
# 找所有 render_main_page 调用点
pat = re.compile(r'^(\s*)(html_page|html)\s*=\s*self\.render_main_page\(')
idx = [i for i, l in enumerate(lines) if pat.match(l)]
print('render_main_page 调用点:', [(i + 1) for i in idx])
if not idx:
    for i, l in enumerate(lines, 1):
        if 'render_main_page(' in l:
            print('  L%d: %s' % (i, l.strip()[:110]))
    raise SystemExit(0)
new, prev, cnt = [], 0, 0
for i in idx:
    ind = pat.match(lines[i]).group(1)
    new.extend(lines[prev:i])
    new.extend([(ind + x) if x.strip() else x for x in NEW])
    new.append(lines[i])
    prev = i + 1
    cnt += 1
new.extend(lines[prev:])
src2 = '\n'.join(new)
try:
    ast.parse(src2)
except SyntaxError as e:
    print('语法错，未落盘:', e)
    raise SystemExit(1)
b = D + 'Archive/search_app.py.bak_20261008_renderfilter'
if not os.path.exists(b):
    shutil.copy2(p, b)
open(p, 'w', encoding='utf-8').write(src2)
print('OK 已在 %d 处 render_main_page 之前插入过滤（备份 search_app.py.bak_20261008_renderfilter）' % cnt)
