Skip to content

Commit 107d328

Browse files
committed
merge: 解决冲突(危机资源与 Tulpa 括号格式统一为全角)
2 parents 5d1ccc3 + 0b6f11e commit 107d328

File tree

4 files changed

+138
-7
lines changed

4 files changed

+138
-7
lines changed

docs/changelog.md

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,47 @@
11
# 更新日志
22

3+
## [v3.16.0](https://github.com/mps-team-cn/Multiple_personality_system_wiki/releases/tag/v3.16.0) - 危机资源上线与量表体验升级 (2025-10-19)
4+
5+
### ✨ 新增词条
6+
7+
- **危机与支援资源(Crisis & Support)(PR #341)**
8+
- [危机与支援资源](entries/Crisis-And-Support-Resources.md):24 小时求助热线、城市支援资源、在线自助平台
9+
- 提供可复制的「自助安全计划」模板与使用指引
10+
- 导航与导览入口已接入首页、QuickStart、实践与创伤导览
11+
12+
### 📚 词条完善
13+
14+
- **临床与导览**
15+
- 翻修 [定向障碍(Disorientation)](entries/Disorientation.md),对齐 DID 相关临床标准(PR #340
16+
- 扩充 OSDD 词条并优化搜索配置(PR #330
17+
- 调整 Tulpa 等相关条目内部链接与一致性
18+
19+
### 🧪 量表与前端体验
20+
21+
- **DES‑II 在线量表与交互优化**
22+
- 新增 [DES‑II 在线量表](entries/Dissociative-Experiences-Scale-DES-II.md),支持实时计分与三子量表进度条
23+
- 统一中文题干与阈值,对齐 NovoPsych(PR #335
24+
- 限制 DES‑II/MID‑60 滑块为仅拖拽,禁用滚轮/键盘并屏蔽轨道点击跳值,避免误操作
25+
26+
- **MID‑60 可访问性与导出**
27+
- 新增移动端导出图片(含水印)(PR #336
28+
- 改进结果导出与可访问性(PR #339
29+
30+
- **界面细节**
31+
- 开启“编辑此页”图标,提升文档协作体验
32+
33+
### 🔧 工具与基础设施
34+
35+
- 新增基于 Frontmatter 的用户词典生成工具,增强中文搜索(PR #329
36+
- 清理无用的报表 PDF 导出项与若干格式修复
37+
38+
### 📊 影响范围
39+
40+
- 新增 1 个核心资源词条;大幅改善量表与交互体验
41+
- 涉及首页与导览入口同步接入;多处文档结构与链接规范优化
42+
43+
---
44+
345
## [v3.15.0](https://github.com/mps-team-cn/Multiple_personality_system_wiki/releases/tag/v3.15.0) - 角色体系扩充与内容格式标准化 (2025-10-18)
446

547
### ✨ 新增词条

docs/entries/Tulpa.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ Tulpa 的创造通常遵循以下系统化路径:
134134

135135
以下表格对比 Tulpa、DID、儿童期想象同伴与内部自助者的核心差异:
136136

137-
| 维度 | **Tulpa**(图帕) | **DID**([解离性身份障碍](DID.md)) | **想象朋友**([Imaginary Friend](Imaginary-Companion.md)) | **ISH**([内部自助者](Internal-Self-Helper-ISH.md)) |
137+
| 维度 | **Tulpa**(图帕) | **DID**([解离性身份障碍](DID.md)) | **想象朋友**[Imaginary Friend](Imaginary-Companion.md) | **ISH**([内部自助者](Internal-Self-Helper-ISH.md)) |
138138
|---|---|---|---|---|
139139
| **形成路径** | 自愿、可控的系统化练习 | 非自愿、创伤驱动的防御性分化 | 儿童期自发产生 | 系统内自发出现或分化 |
140140
| **创伤前提** | 通常无创伤史要求 | 通常与早期复杂创伤高度相关 | 无创伤关联 | 多在创伤背景下形成 |

docs/index.md

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -238,9 +238,7 @@ hide:
238238

239239
## 📋 最近更新
240240

241-
- [v3.15.0(2025-10-18):角色体系扩充与内容格式标准化](changelog.md#v3150---角色体系扩充与内容格式标准化-2025-10-18)
242-
- [v3.14.0(2025-10-17):Tulpa 实践体系完善与主题索引优化](changelog.md#v3140---tulpa-实践体系完善与主题索引优化-2025-10-17)
243-
- [v3.13.0(2025-10-16):DSM-5-TR 诊断体系完善与 Favicon 支持](changelog.md#v3130---dsm-5-tr-诊断体系完善与-favicon-支持-2025-10-16)
241+
<!-- RECENT_RELEASES -->
244242

245243
查看完整 [更新日志](changelog.md) | [下载 PDF 版本](https://github.com/mps-team-cn/Multiple_personality_system_wiki/releases/download/v3.15.0/Multiple_Personality_System_wiki_v3.15.pdf)
246244

tools/mkdocs_hooks.py

Lines changed: 94 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,25 @@
1-
"""MkDocs 构建钩子:清理搜索索引中的零宽空格,避免中文搜索失效;将 Frontmatter 中的 synonyms 注入搜索索引;生成基于 Frontmatter updated 字段的最近更新列表。"""
1+
"""MkDocs 构建钩子:
2+
3+
- 清理搜索索引中的零宽空格,避免中文搜索失效;
4+
- 将 Frontmatter 中的 synonyms 注入搜索索引;
5+
- 生成基于 Frontmatter updated 字段的最近更新列表;
6+
- 从 changelog.md 解析最近发布版本并在首页注入“最近更新”。
7+
"""
28

39
from __future__ import annotations
410

511
import json
612
import re
713
from datetime import datetime
14+
from dataclasses import dataclass
815
from pathlib import Path
916
from typing import Any, Dict
1017

1118
import yaml
1219

1320
ZERO_WIDTH_SPACE = "\u200b"
1421
RECENTLY_UPDATED_PLACEHOLDER = "<!-- RECENTLY_UPDATED_DOCS -->"
22+
RECENT_RELEASES_PLACEHOLDER = "<!-- RECENT_RELEASES -->"
1523

1624

1725
def _strip_zero_width(value: str) -> str:
@@ -136,11 +144,24 @@ def _generate_recently_updated_html(docs_dir: Path, limit: int = 100) -> str:
136144

137145

138146
def on_page_markdown(markdown: str, page: Any, config: Dict[str, Any], files: Any) -> str:
139-
"""在页面 Markdown 处理前替换最近更新占位符。"""
147+
"""在页面 Markdown 处理前替换占位符。"""
148+
docs_dir = Path(config.get("docs_dir", "docs"))
149+
150+
# 1) 最近更新(基于 Frontmatter.updated)
140151
if RECENTLY_UPDATED_PLACEHOLDER in markdown:
141-
docs_dir = Path(config.get("docs_dir", "docs"))
142152
recently_updated_html = _generate_recently_updated_html(docs_dir, limit=100)
143153
markdown = markdown.replace(RECENTLY_UPDATED_PLACEHOLDER, recently_updated_html)
154+
155+
# 2) 最近发布版本(基于 docs/changelog.md)
156+
if RECENT_RELEASES_PLACEHOLDER in markdown:
157+
try:
158+
releases = _parse_recent_releases(docs_dir / "changelog.md", limit=3)
159+
recent_md = _render_recent_releases_md(releases)
160+
markdown = markdown.replace(RECENT_RELEASES_PLACEHOLDER, recent_md)
161+
except Exception:
162+
# 解析失败时保持原占位符,避免构建中断
163+
pass
164+
144165
return markdown
145166

146167

@@ -193,3 +214,73 @@ def on_post_build(config: Dict[str, Any]) -> None:
193214
json.dumps(data, ensure_ascii=False, separators=(",", ":")),
194215
encoding="utf-8",
195216
)
217+
218+
219+
# ===== 最近发布版本:从 changelog.md 解析并渲染到首页 =====
220+
221+
@dataclass
222+
class Release:
223+
tag: str # 例如 v3.15.0
224+
title: str # 例如 角色体系扩充与内容格式标准化
225+
date: str # 例如 2025-10-18
226+
anchor: str # 例如 v3150---角色体系扩充与内容格式标准化-2025-10-18
227+
228+
229+
def _slugify_heading(text: str) -> str:
230+
"""使用与站点一致的规则生成锚点 slug。
231+
232+
mkdocs.yml 中配置了 toc.slugify=pymdownx.slugs.slugify(case=lower-ascii),
233+
这里对同样的纯文本进行 slug 化,确保首页锚点与 changelog 一致。
234+
"""
235+
try:
236+
from pymdownx.slugs import slugify as _slugify_factory # type: ignore
237+
238+
slugify_fn = _slugify_factory(case="lower-ascii")
239+
return slugify_fn(text, "-")
240+
except Exception:
241+
# 回退:保守处理,仅做最基本的替换
242+
s = re.sub(r"\s+", "-", text.strip())
243+
s = s.replace("/", "-")
244+
return s
245+
246+
247+
def _parse_recent_releases(changelog_path: Path, limit: int = 3) -> list[Release]:
248+
"""从 docs/changelog.md 解析最近的发布版本信息。"""
249+
if not changelog_path.exists():
250+
return []
251+
252+
releases: list[Release] = []
253+
pattern = re.compile(
254+
r"^##\s*\[(v\d+\.\d+\.\d+)\](?:\([^)]+\))?\s*-\s*(.+?)\s*\((\d{4}-\d{2}-\d{2})\)\s*$"
255+
)
256+
257+
for line in changelog_path.read_text(encoding="utf-8").splitlines():
258+
m = pattern.match(line)
259+
if not m:
260+
continue
261+
262+
tag, title, date = m.group(1), m.group(2), m.group(3)
263+
264+
# 构造用于 slugify 的纯文本标题(与渲染后的可见文本一致)
265+
heading_text = f"{tag} - {title} ({date})"
266+
anchor = _slugify_heading(heading_text)
267+
releases.append(Release(tag=tag, title=title, date=date, anchor=anchor))
268+
269+
if len(releases) >= limit:
270+
break
271+
272+
return releases
273+
274+
275+
def _render_recent_releases_md(releases: list[Release]) -> str:
276+
"""渲染最近发布版本为首页使用的 Markdown 列表。"""
277+
if not releases:
278+
return "- 暂无发布版本"
279+
280+
lines = []
281+
for r in releases:
282+
# 使用 changelog.md 的锚点链接
283+
lines.append(
284+
f"- [{r.tag}{r.date}):{r.title}](changelog.md#{r.anchor})"
285+
)
286+
return "\n".join(lines)

0 commit comments

Comments
 (0)