生成 hash 用的归一化文本:去 markdown 标记、压空白。 pipe-1:旧版会 `[:64]` 截断——导致超过 64 字边界的关键数字 / 论断被编辑时 归一化文本不变、hash6 与锚点都不变,`k.py list-broken-refs` 这条安全网兜不住 stale 引用。现改为对**完整**归一化内容做 hash,任意位置的实质编辑都会改变 hash6。
(s: str)
| 56 | |
| 57 | |
| 58 | def _normalize_for_hash(s: str) -> str: |
| 59 | """生成 hash 用的归一化文本:去 markdown 标记、压空白。 |
| 60 | |
| 61 | pipe-1:旧版会 `[:64]` 截断——导致超过 64 字边界的关键数字 / 论断被编辑时 |
| 62 | 归一化文本不变、hash6 与锚点都不变,`k.py list-broken-refs` 这条安全网兜不住 |
| 63 | stale 引用。现改为对**完整**归一化内容做 hash,任意位置的实质编辑都会改变 hash6。""" |
| 64 | s = re.sub(r"`+", "", s) |
| 65 | s = re.sub(r"\*+", "", s) |
| 66 | s = re.sub(r"_+", "", s) |
| 67 | s = re.sub(r"~+", "", s) |
| 68 | s = re.sub(r"#+", "", s) |
| 69 | s = re.sub(r">+", "", s) |
| 70 | s = re.sub(r"!\[([^\]]*)\]\([^\)]*\)", r"\1", s) |
| 71 | s = re.sub(r"\[([^\]]+)\]\([^\)]*\)", r"\1", s) |
| 72 | s = re.sub(r"[\[\]\(\)\|]", "", s) |
| 73 | s = re.sub(r"\s+", " ", s).strip().lower() |
| 74 | return s |
| 75 | |
| 76 | |
| 77 | def _md5_6(s: str) -> str: |