# -*- coding: utf-8 -*- r'''直接把 SITE_CSS 那段字符串抠出来,报出出错位置附近的内容。''' from __future__ import annotations import re import sys from pathlib import Path SRC = Path(__file__).resolve().parent.parent / "relay" / "landing.py" lines = SRC.read_text(encoding="utf-8").splitlines() # 找 SITE_CSS = """ 到对应的 """ start = None for i, line in enumerate(lines): if line.startswith("SITE_CSS = \"\"\""): start = i + 1 break if start is None: print(" 找不到 SITE_CSS") sys.exit(1) # 找结束的 """ end = None for i in range(start, len(lines)): if lines[i].startswith('""" %'): end = i break if end is None: print(" 找不到结束") sys.exit(1) css = "\n".join(lines[start:end]) print(" SITE_CSS 字面量: 第 %d~%d 行,共 %d 字符" % (start + 1, end, len(css))) # 试格式化 PLACE = {"BG": "#fff", "SURFACE": "#fafafa", "SURFACE2": "#f5f5f5", "BORDER": "#eee", "TEXT": "#111", "MUTED": "#666", "FAINT": "#999", "ACCENT": "#07e", "ACCENT_DARK": "#06d"} try: css % PLACE print(" ✓ 能格式化 —— 那问题在别处") except ValueError as exc: print(" ✗ %s" % exc) m = re.search(r"index (\d+)", str(exc)) if m: pos = int(m.group(1)) lo = max(0, pos - 120) seg = css[lo:pos + 40] print() print(" ════ 出错位置 %d 附近 ════" % pos) # 算出这是第几行 line_no = css[:pos].count("\n") + start + 1 print(" (大约在第 %d 行)" % line_no) print() for k, seg_line in enumerate(seg.split("\n")): mark = " <<<<" if k == seg.count("\n") - 1 or (lo + sum(len(x) + 1 for x in seg.split("\n")[:k]) <= pos < lo + sum(len(x) + 1 for x in seg.split("\n")[:k + 1])) else "" print(" %s%s" % (seg_line, mark)) # 另外全文列一遍「单 % 后跟非 % 非 ( 的地方」 print() print(" ════ CSS 里的单 % (排除 %(name)s 和 %% )════") found = 0 for i, line in enumerate(css.splitlines(), start + 1): tmp = re.sub(r"%\([a-zA-Z_]+\)[sd]", "", line) for m in re.finditer(r"%(.)", tmp): if m.group(1) != "%": print(" 第 %d 行: %s" % (i, line.strip()[:100])) found += 1 break if not found: print(" (没找到)")