#!/usr/bin/env python3 """badge_migrate.py — 把 badges 2.x 用法迁移到 3.x。 - animationType: BadgeAnimationType.X -> animation: BadgeAnimation.X() - Badge(... badgeColor: C, padding: P ...) -> Badge(... badgeStyle: BadgeStyle(badgeColor: C, padding: P) ...) """ import re, glob def find_calls(text, name): calls=[] for m in re.finditer(r'\b'+name+r'\s*\(', text): if m.start()>0 and (text[m.start()-1].isalnum() or text[m.start()-1]=='_'): continue # 跳过 BadgeStyle/BadgeAnimation 等同名前缀 i=m.end()-1; depth=0; j=i while j animation: BadgeAnimation.X() t=re.sub(r'animationType:\s*BadgeAnimationType\.(\w+)', r'animation: BadgeAnimation.\1()', t) # 2) 合并 badgeColor + padding -> badgeStyle(从后往前处理避免偏移) while True: calls=find_calls(t, 'Badge') did=False for s,e,inner in reversed(calls): bc,_,_=extract_param(inner,'badgeColor') pd,_,_=extract_param(inner,'padding') if not (bc or pd): continue new_inner=inner parts=[] if bc: v,vs,ve=extract_param(new_inner,'badgeColor') # 删除该参数(含尾随逗号) seg=new_inner[vs:ve] after=new_inner[ve:] if after.lstrip().startswith(','): after=after.lstrip()[1:] new_inner=new_inner[:vs]+after parts.append('badgeColor: '+bc) if pd: v,vs,ve=extract_param(new_inner,'padding') seg=new_inner[vs:ve] after=new_inner[ve:] if after.lstrip().startswith(','): after=after.lstrip()[1:] new_inner=new_inner[:vs]+after parts.append('padding: '+pd) badge_style='\n badgeStyle: BadgeStyle('+', '.join(parts)+'),' new_inner=badge_style+new_inner t=t[:s]+'Badge('+new_inner+')'+t[e+1:] did=True; break if not did: break if t!=orig: open(path,'w').write(t); changed_files+=1; print('migrated', path) print('done, files:', changed_files)