#!/usr/bin/env python3 # -*- coding: utf-8 -*- """建庫校驗:任何一項不合格即列入報告,不得默默略過。""" import json, re, sys from pathlib import Path def main(root): root = Path(root) idx = json.load(open(root / '_pipeline' / '索引.json', encoding='utf-8')) prob = [] ok = {'釋字': 0, '憲判': 0} # 1) 釋字 1-813 齊全、無跳號 nums = sorted(int(re.search(r'第(\d+)號', r['字號']).group(1)) for r in idx if r['key'].startswith('釋字')) missing = sorted(set(range(1, 814)) - set(nums)) if missing: prob.append(f"釋字缺號 {len(missing)} 則:{missing[:30]}{' …' if len(missing) > 30 else ''}") dup = [n for n in set(nums) if nums.count(n) > 1] if dup: prob.append(f"釋字重複:{dup}") ok['釋字'] = len(nums) ok['憲判'] = sum(1 for r in idx if r['key'].startswith('憲判')) if ok['憲判'] != 57: prob.append(f"憲判數量為 {ok['憲判']},與官網列表 57 則不符") # 2) 每則主要區塊非空 + 3) 網址 id 規則 for r in idx: p = root / r['file'] if not p.exists(): prob.append(f"{r['字號']} 檔案不存在") continue txt = p.read_text(encoding='utf-8') need = ['## 解釋文'] if r['key'].startswith('釋字') else ['## 主文'] for sec in need: if sec not in txt: prob.append(f"{r['字號']} 缺少區塊 {sec}") if r['key'].startswith('釋字'): n = int(re.search(r'第(\d+)號', r['字號']).group(1)) m = re.search(r'id=(\d+)', r['原始出處']) if not m or int(m.group(1)) != 310181 + n: prob.append(f"{r['字號']} 原始出處 id 不符規則(應為 {310181 + n})") if '白話解說' in txt and '不得引用本區塊' not in txt: prob.append(f"{r['字號']} 白話解說缺少警語") rep = ['# 校驗報告', '', f"- 釋字筆數:{ok['釋字']} / 813", f"- 憲判筆數:{ok['憲判']} / 57", ''] if prob: rep += [f'## 不合格項目({len(prob)})', ''] + [f'- {x}' for x in prob] else: rep += ['## 全部通過', '', '- 編號齊全、區塊非空、原始出處 id 規則相符、AI 區塊警語齊備'] (root / '00_索引' / '校驗報告.md').write_text('\n'.join(rep) + '\n', encoding='utf-8') print('\n'.join(rep[:8])) print('problems=', len(prob)) if __name__ == '__main__': main(sys.argv[1])