# -*- coding: utf-8 -*- r'''渲染修好的管理页,检查 JS 语法。 这是"按钮全是死的"那个 bug 的**最快复现方式**: 不连中转、不起服务器,直接调 render_admin() 拿 HTML, 把 ", html, re.S) inline = [s for s in scripts if s.strip()] check("有内嵌脚本", bool(inline), "一个都没有") for i, js in enumerate(inline, 1): with tempfile.NamedTemporaryFile("w", suffix=".js", delete=False, encoding="utf-8") as fh: fh.write(js) path = fh.name try: proc = subprocess.run(["node", "--check", path], capture_output=True, text=True, encoding="utf-8", errors="replace", timeout=30) ok = proc.returncode == 0 detail = "" if not ok: # 把报错那一行附近打出来,方便定位 err = (proc.stderr or "") m = re.search(r":(\d+)\n", err) if m: ln = int(m.group(1)) lines = js.splitlines() lo = max(0, ln - 3) hi = min(len(lines), ln + 2) detail = "第 %d 行:\n" % ln + "\n".join( " %3d| %s" % (k + 1, lines[k]) for k in range(lo, hi)) else: detail = err[:300] check("第 %d 段内嵌 JS 语法合法" % i, ok, detail) except FileNotFoundError: print(" [SKIP] 没装 node") finally: Path(path).unlink(missing_ok=True) # 再检查一遍:注释行里有没有被 Python 吃掉转义的痕迹 for i, js in enumerate(inline, 1): lines = js.splitlines() bad = [] for k, line in enumerate(lines): s = line.strip() if s.startswith("//"): # 注释行里出现裸控制字符 for ch in line: if ord(ch) < 32 and ch != "\t": bad.append(k + 1) break check("第 %d 段没有裸控制字符" % i, not bad, "行号 %s" % bad) print() print("=" * 58) print(" 通过 %d 项,失败 %d 项" % (passed, failed)) return 0 if failed == 0 else 1 if __name__ == "__main__": sys.exit(main())