71 lines
4.0 KiB
Python
71 lines
4.0 KiB
Python
#!/usr/bin/env python3
|
|
from pathlib import Path
|
|
import gzip
|
|
|
|
ASSETS = Path('/app/themes/2024/assets')
|
|
|
|
|
|
def rewrite(path: Path, text: str) -> None:
|
|
path.write_text(text, encoding='utf-8')
|
|
gz_path = path.with_suffix(path.suffix + '.gz')
|
|
if gz_path.exists():
|
|
with gzip.open(gz_path, 'wb', compresslevel=9) as gz:
|
|
gz.write(text.encode('utf-8'))
|
|
|
|
|
|
def patch_file_manage(path: Path) -> bool:
|
|
text = path.read_text(encoding='utf-8')
|
|
old = text
|
|
if 'detailTimeline:It(s.timeline||[])' in text and 'fcbxTimelineCollapsed' not in text:
|
|
text = text.replace(
|
|
'detailTimeline:It(s.timeline||[])}},nt=t=>',
|
|
'detailTimeline:It(s.timeline||[]),fcbxTimelineCollapsed:!0}},nt=t=>',
|
|
1,
|
|
)
|
|
render_old = 'N(e(b).detailTimeline,(n,K)=>(p(),f("div",{key:`${n.key}-${K}`,class:"grid grid-cols-[auto_minmax(0,1fr)] gap-3"}'
|
|
render_new = 'N((e(b).fcbxTimelineCollapsed&&e(b).detailTimeline.filter(ga=>ga.key==="retrieved_event").length>3)?e(b).detailTimeline.filter((ga,Qa)=>ga.key!=="retrieved_event"||e(b).detailTimeline.filter(Ja=>Ja.key==="retrieved_event").indexOf(ga)<3):e(b).detailTimeline,(n,K)=>(p(),f("div",{key:`${n.key}-${K}`,class:"grid grid-cols-[auto_minmax(0,1fr)] gap-3"}'
|
|
if render_old in text and 'ga.key==="retrieved_event"' not in text:
|
|
text = text.replace(render_old, render_new, 1)
|
|
close_old = ']))),128))],2)])):j("",!0),l("section",kn,'
|
|
close_new = ']))),128)),e(b).detailTimeline.filter(n=>n.key==="retrieved_event").length>3?(p(),f("button",{key:0,type:"button",class:o(["mt-3 rounded-lg border px-3 py-2 text-sm font-medium transition",[e(u)?"border-gray-600 text-gray-200 hover:bg-gray-700":"border-gray-200 text-gray-700 hover:bg-gray-50"]]),onClick:m[99]||(m[99]=n=>e(b).fcbxTimelineCollapsed=!e(b).fcbxTimelineCollapsed)},r(e(b).fcbxTimelineCollapsed?`展开全部取件记录(共 ${e(b).detailTimeline.filter(n=>n.key==="retrieved_event").length} 次)":"收起取件记录"),3)):j("",!0)],2)])):j("",!0),l("section",kn,'
|
|
if close_old in text and '展开全部取件记录' not in text:
|
|
text = text.replace(close_old, close_new, 1)
|
|
if text != old:
|
|
rewrite(path, text)
|
|
return True
|
|
return False
|
|
|
|
|
|
def patch_clipboard(path: Path) -> bool:
|
|
text = path.read_text(encoding='utf-8')
|
|
old = text
|
|
marker = 'const y=async(a,e={})=>{'
|
|
if marker not in text or 'fcbx-copy-fallback' in text:
|
|
return False
|
|
start = text.index(marker)
|
|
end_marker = '},T=async(a,e={})=>{'
|
|
end = text.index(end_marker, start) + 1
|
|
replacement = '''const y=async(a,e={})=>{const{successMsg:t="复制成功",errorMsg:n="复制失败,请手动复制",showMsg:s=!0,notify:c}=e,l=(r,d)=>{s&&c?.(r,d)},q=()=>{try{window.prompt("复制下面内容",a)}catch{}};try{if(navigator.clipboard&&window.isSecureContext)try{await navigator.clipboard.writeText(a);return l(t,"success"),!0}catch{}const r=document.createElement("textarea");r.value=a,r.setAttribute("readonly","");r.className="fcbx-copy-fallback";r.style.cssText="position:fixed;left:0;top:0;width:1px;height:1px;opacity:0;z-index:-1";document.body.appendChild(r);r.focus();r.select();r.setSelectionRange(0,r.value.length);let d=!1;try{d=document.execCommand("copy")}finally{document.body.removeChild(r)}if(d)return l(t,"success"),!0;q();l("已打开手动复制窗口","warning");return!1}catch(r){return console.error("复制失败:",r),q(),l(n,"error"),!1}}'''
|
|
text = text[:start] + replacement + text[end:]
|
|
if text != old:
|
|
rewrite(path, text)
|
|
return True
|
|
return False
|
|
|
|
|
|
def main() -> None:
|
|
changed = []
|
|
for path in ASSETS.glob('FileManageView-*.js'):
|
|
if patch_file_manage(path):
|
|
changed.append(path.name)
|
|
for path in ASSETS.glob('clipboard-*.js'):
|
|
if patch_clipboard(path):
|
|
changed.append(path.name)
|
|
if not changed:
|
|
raise SystemExit('admin timeline/clipboard patch markers not found or already patched')
|
|
print('patched admin assets:', ', '.join(changed))
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|