@chengzhao-dev/dsh-quarto-book 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +3 -3
- package/README.md +3 -3
- package/lib/tools/render-check.js +5 -2
- package/package.json +1 -1
- package/skills/designing-theme/SKILL.md +1 -0
- package/skills/designing-theme/assets/theme/css/landing.css +25 -2
- package/skills/writing-quarto/examples/01-language-scope.md +3 -3
- package/skills/writing-quarto/examples/02-structure-shape.md +5 -5
- package/skills/writing-quarto/examples/03-block-after.md +2 -2
- package/skills/writing-quarto/examples/03-excerpt-lead.md +6 -6
- package/skills/writing-quarto/examples/03-layout-list.md +15 -15
- package/skills/writing-quarto/examples/03-qmd-elements.md +4 -4
- package/skills/writing-quarto/examples/04-paragraph-cases.md +5 -5
- package/skills/writing-quarto/examples/04-paragraph-opening.md +3 -3
- package/skills/writing-quarto/examples/05-sentence-brevity.md +5 -5
- package/skills/writing-quarto/examples/05-sentence-frame.md +6 -6
- package/skills/writing-quarto/examples/05-sentence-reference.md +5 -5
- package/skills/writing-quarto/examples/06-wording-cases.md +8 -8
- package/skills/writing-quarto/examples/08-appendix.md +4 -4
- package/skills/writing-quarto/quarto/basics.md +24 -2
- package/skills/writing-quarto/quarto/comments.md +43 -0
- package/skills/writing-quarto/quarto/coords.md +4 -4
- package/skills/writing-quarto/quarto/encoding.md +35 -0
- package/skills/writing-quarto/quarto/mermaid.md +1 -1
- package/skills/writing-quarto/quarto/prose.md +86 -0
- package/skills/writing-quarto/quarto/render.md +15 -14
- package/skills/writing-quarto/quarto/terminal.md +3 -3
- package/skills/writing-quarto/scripts/checking-dom.py +6 -1
- package/skills/writing-quarto/scripts/verifying-content.py +12 -3
- package/skills/writing-quarto/steps/01-task.md +6 -6
- package/skills/writing-quarto/steps/02-structure.md +19 -19
- package/skills/writing-quarto/steps/03-blocks.md +40 -40
- package/skills/writing-quarto/steps/04-paragraphs.md +55 -55
- package/skills/writing-quarto/steps/05-sentences.md +42 -43
- package/skills/writing-quarto/steps/06-wording.md +9 -11
- package/skills/writing-quarto/steps/07-layout.md +21 -17
- package/skills/writing-quarto/steps/08-reread.md +9 -13
- package/templates/quarto-book-project/SKILL.md +1 -1
package/README.en.md
CHANGED
|
@@ -26,10 +26,10 @@ Both skills are discovered from the package's `skills/` directory and loaded on
|
|
|
26
26
|
## Install
|
|
27
27
|
|
|
28
28
|
```bash
|
|
29
|
-
dsh plugin --profile web add npm:@chengzhao-dev/dsh-quarto-book@0.
|
|
29
|
+
dsh plugin --profile web add npm:@chengzhao-dev/dsh-quarto-book@0.6.0
|
|
30
30
|
```
|
|
31
31
|
|
|
32
|
-
Replace `--profile` with the profile you actually run. The desktop app always runs the `desktop` profile, and that profile is owned by the app, so `dsh --profile desktop` is rejected; install or upgrade a plugin with `dsh plugin --profile desktop add <package>`, and use the app's Settings → Plugins → Add plugin with `npm:@chengzhao-dev/dsh-quarto-book@0.
|
|
32
|
+
Replace `--profile` with the profile you actually run. The desktop app always runs the `desktop` profile, and that profile is owned by the app, so `dsh --profile desktop` is rejected; install or upgrade a plugin with `dsh plugin --profile desktop add <package>`, and use the app's Settings → Plugins → Add plugin with `npm:@chengzhao-dev/dsh-quarto-book@0.6.0` only if the app refuses that write. To follow a GitHub tag instead, use `github:chengzhao-dev/dsh-quarto-book#v0.6.0`.
|
|
33
33
|
|
|
34
34
|
Upgrading from the old unscoped package `dsh-quarto-book` (removed from npm with 0.3.4, so this only affects profiles that installed it earlier): remove it from the same profile first with `dsh plugin --profile <profile> remove dsh-quarto-book`, then add the scoped package. Keeping both installed registers `writing-quarto` and `designing-theme` twice at the same rank 550.
|
|
35
35
|
|
|
@@ -43,7 +43,7 @@ Load `writing-quarto` or `designing-theme` inside a `type: book` repository and
|
|
|
43
43
|
|
|
44
44
|
A project supplies exactly one skill of its own: `<book>/.agents/skills/quarto-book-project/`, starting from `templates/quarto-book-project/`. When it exists, both general skills read `SKILL.md` and then the `writing/` files it points to; when it does not, they skip it and do not guess project conventions. **Do not embed same-name skills into a book repository**: DSH picks one skill per name per layer by rank, lowest wins, and `.agents/skills` (rank 200) outranks the packaged provider (rank 550); a copy of `writing-quarto` or `designing-theme` in the book disables the plugin's text.
|
|
45
45
|
|
|
46
|
-
Theme assets live in `skills/designing-theme/assets/theme/`. The package copy is authoritative; the book's `theme/` is the render copy. When a copy exists, `designing-theme` edits only that copy, and only when the user explicitly asks to install the plugin theme into the book and the target directory does not exist yet does the skill copy from the package and
|
|
46
|
+
Theme assets live in `skills/designing-theme/assets/theme/`. The package copy is authoritative; the book's `theme/` is the render copy. When a copy exists, `designing-theme` edits only that copy, and only when the user explicitly asks to install the plugin theme into the book and the target directory does not exist yet does the skill copy from the package and place `skills/writing-quarto/scripts/answering-disclosure.lua` at the book's `filters/answering-disclosure.lua`. `_quarto.yml` references only the book's copy, never an npm package or the plugin checkout.
|
|
47
47
|
|
|
48
48
|
Run the content and link checks from the `writing-quarto` skill directory:
|
|
49
49
|
|
package/README.md
CHANGED
|
@@ -26,10 +26,10 @@
|
|
|
26
26
|
## 安装
|
|
27
27
|
|
|
28
28
|
```bash
|
|
29
|
-
dsh plugin --profile web add npm:@chengzhao-dev/dsh-quarto-book@0.
|
|
29
|
+
dsh plugin --profile web add npm:@chengzhao-dev/dsh-quarto-book@0.6.0
|
|
30
30
|
```
|
|
31
31
|
|
|
32
|
-
`--profile` 换成你实际运行的那个 profile。桌面应用固定跑 `desktop` profile,且该 profile 由应用独占管理,`dsh --profile desktop` 直接启动会被拒绝;安装或升级插件可用 `dsh plugin --profile desktop add <包>`,如果应用拒绝写入,再走「设置 → 插件 → 添加插件」,地址填 `npm:@chengzhao-dev/dsh-quarto-book@0.
|
|
32
|
+
`--profile` 换成你实际运行的那个 profile。桌面应用固定跑 `desktop` profile,且该 profile 由应用独占管理,`dsh --profile desktop` 直接启动会被拒绝;安装或升级插件可用 `dsh plugin --profile desktop add <包>`,如果应用拒绝写入,再走「设置 → 插件 → 添加插件」,地址填 `npm:@chengzhao-dev/dsh-quarto-book@0.6.0`。想跟 GitHub 标签,也可以写 `github:chengzhao-dev/dsh-quarto-book#v0.6.0`。
|
|
33
33
|
|
|
34
34
|
从旧的无作用域包 `dsh-quarto-book` 升级时(该包已随 0.3.4 从 npm 删除,只影响之前装过它的 profile),先在同一个 profile 里 `dsh plugin --profile <profile> remove dsh-quarto-book` 再装新包。两个包同时留着会以相同的 rank 550 各注册一遍 `writing-quarto` 和 `designing-theme`。
|
|
35
35
|
|
|
@@ -43,7 +43,7 @@ dsh plugin --profile web add npm:@chengzhao-dev/dsh-quarto-book@0.5.0
|
|
|
43
43
|
|
|
44
44
|
项目只放一份自己的约定技能:`<book>/.agents/skills/quarto-book-project/`,模板见 `templates/quarto-book-project/`。存在时两个通用技能先读它的 `SKILL.md`,再按它指向的 `writing/` 文件读章节表;不存在就跳过,不猜项目约定。**不要把同名技能嵌进书仓库**:DSH 在同一技能层按 rank 取一个,`.agents/skills`(rank 200)优先于插件(rank 550),书里再放 `writing-quarto` 或 `designing-theme` 会让插件正文失效。
|
|
45
45
|
|
|
46
|
-
主题资产在 `skills/designing-theme/assets/theme/`,包内是权威来源,书内 `theme/` 是渲染副本;已有副本时 `designing-theme`
|
|
46
|
+
主题资产在 `skills/designing-theme/assets/theme/`,包内是权威来源,书内 `theme/` 是渲染副本;已有副本时 `designing-theme` 只改副本,只有用户明确要求「把插件主题装进这本书」且目标目录不存在时才从包复制,并把 `skills/writing-quarto/scripts/answering-disclosure.lua` 放到书内 `filters/answering-disclosure.lua`。`_quarto.yml` 只引用书内副本,不指向 npm 包或插件检出目录。
|
|
47
47
|
|
|
48
48
|
内容与链接检查在 `writing-quarto` 技能目录下运行:
|
|
49
49
|
|
|
@@ -12,7 +12,9 @@ const QUARTO_TIMEOUT_MS = 120_000;
|
|
|
12
12
|
const PYTHON_TIMEOUT_MS = 60_000;
|
|
13
13
|
const MAX_OUTPUT_FILES = 30;
|
|
14
14
|
const MAX_CAPTURED_OUTPUT = 12_000;
|
|
15
|
-
|
|
15
|
+
// 只收多字乱码序列。单字(如「璇」「浣」「熨」)在正常中文里也会出现,
|
|
16
|
+
// 拿它们当特征会把合法页面判成乱码。
|
|
17
|
+
const MOJIBAKE_MARKERS = ['锟斤拷', '烫烫烫', '屯屯屯', 'â€', 'ä', 'é', 'ï¼', '锘匡'];
|
|
16
18
|
export function stripQuotes(value) {
|
|
17
19
|
const trimmed = value.trim();
|
|
18
20
|
if (trimmed.length >= 2) {
|
|
@@ -333,7 +335,8 @@ export async function inspectHtml(input) {
|
|
|
333
335
|
else {
|
|
334
336
|
const domScript = path.join(SKILL_DIR, 'scripts', 'checking-dom.py');
|
|
335
337
|
const dom = await runPython(domScript, ['--root', input.root, '--book-dir', input.outputDir], input.root, input.python, spawnFn);
|
|
336
|
-
|
|
338
|
+
// C9 只在产物里出现 details.answer-disclosure 时判 fail,没有答案时记 N/A。
|
|
339
|
+
const selected = parseDomLines(dom.output).filter((item) => ['C1', 'C2', 'C3', 'C5', 'C6', 'C7', 'C8', 'C9'].includes(item.id));
|
|
337
340
|
const failed = selected.filter((item) => item.status === 'fail');
|
|
338
341
|
checks.push({
|
|
339
342
|
id: 'dom',
|
package/package.json
CHANGED
|
@@ -15,6 +15,7 @@ metadata:
|
|
|
15
15
|
- 新增 palette 或页面组件样式。
|
|
16
16
|
- **不适用**:`.qmd` 正文写法(转 `writing-quarto`);书里项目的业务领域内容(由项目自己的技能负责)。
|
|
17
17
|
- 项目带有 `.agents/skills/quarto-book-project/SKILL.md` 时,先读它的「主题与过滤器路径」,只改 `_quarto.yml` 实际引用的书内副本;没有就跳过。书内副本默认在 `theme/`,过滤器在 `filters/`。
|
|
18
|
+
- 编码与行尾跟 `writing-quarto` 的 `quarto/encoding.md`:UTF-8 无 BOM、样式文件用 LF;`.bat`/`.cmd` 才用 CRLF。
|
|
18
19
|
|
|
19
20
|
## 任务路由
|
|
20
21
|
|
|
@@ -94,15 +94,33 @@
|
|
|
94
94
|
color: var(--text-secondary);
|
|
95
95
|
opacity: 1;
|
|
96
96
|
}
|
|
97
|
+
/* 悬停只改顶线,不做位移或阴影:目录保持纸书版式,避免点击时整块跳动。 */
|
|
97
98
|
.landing-card:hover {
|
|
98
99
|
border-top-color: var(--accent);
|
|
99
100
|
background-color: transparent;
|
|
100
101
|
box-shadow: none;
|
|
101
102
|
}
|
|
102
|
-
|
|
103
|
+
/* 键盘焦点进入卡片时,顶线转成 accent 作整行提示。
|
|
104
|
+
焦点框只画在真正获得焦点的链接上,不再用 :focus-within 套住整张卡片;
|
|
105
|
+
鼠标点击不会命中 :focus-visible,因此不会弹出大框。 */
|
|
106
|
+
.landing-card:has(a:focus-visible) {
|
|
103
107
|
border-top-color: var(--accent);
|
|
108
|
+
}
|
|
109
|
+
#quarto-document-content .landing-card h3 a:focus-visible,
|
|
110
|
+
#quarto-document-content .landing-card a.cta:focus-visible {
|
|
104
111
|
outline: 2px solid var(--accent);
|
|
105
112
|
outline-offset: 3px;
|
|
113
|
+
border-radius: 2px;
|
|
114
|
+
}
|
|
115
|
+
#quarto-document-content .landing-card h3 a:focus-visible {
|
|
116
|
+
text-decoration: underline;
|
|
117
|
+
text-decoration-color: var(--accent);
|
|
118
|
+
text-underline-offset: 0.2em;
|
|
119
|
+
}
|
|
120
|
+
@media (prefers-reduced-motion: reduce) {
|
|
121
|
+
.landing-card {
|
|
122
|
+
transition: none;
|
|
123
|
+
}
|
|
106
124
|
}
|
|
107
125
|
#quarto-document-content .landing-card h3 {
|
|
108
126
|
grid-area: title;
|
|
@@ -118,7 +136,12 @@
|
|
|
118
136
|
}
|
|
119
137
|
.landing-card h3 a:hover {
|
|
120
138
|
color: var(--link-hover-color);
|
|
121
|
-
text-decoration:
|
|
139
|
+
text-decoration: underline;
|
|
140
|
+
text-decoration-color: var(--link-hover-color);
|
|
141
|
+
text-underline-offset: 0.2em;
|
|
142
|
+
}
|
|
143
|
+
.landing-card a:active {
|
|
144
|
+
opacity: 0.75;
|
|
122
145
|
}
|
|
123
146
|
#quarto-document-content .landing-card p {
|
|
124
147
|
grid-area: desc;
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
## 语言课旁白与工程旁白
|
|
6
6
|
|
|
7
|
-
`content/**` 正文禁止用旁白讲解 C++ 语言机制或风格指南条目(硬边界见 `writing-quarto` 技能 `steps/01-task.md
|
|
7
|
+
`content/**` 正文禁止用旁白讲解 C++ 语言机制或风格指南条目(硬边界见 `writing-quarto` 技能 `steps/01-task.md`「叙事范围(硬边界)」;三个工程问题与反例句式见 `steps/01-task.md`,判定口诀同在该条文)。以下对照收工程旁白的定稿形态:
|
|
8
8
|
|
|
9
9
|
对照一:常量与类型定义(示例章 state.h 节)。
|
|
10
10
|
|
|
@@ -46,7 +46,7 @@ Position 携带从 0 起算的行列坐标,越界由 IsInRange 判为非法:
|
|
|
46
46
|
正确(先动作 → 再点名成员 → 后边界):
|
|
47
47
|
终端程序把「行 列」变成一次操作动作后,只能调用 Game 的三个成员去改状态面板或查结果,
|
|
48
48
|
不能直接改私有数组 cells_。测试也调用同一组成员。
|
|
49
|
-
Game::
|
|
49
|
+
Game::ApplyMove 负责写入数据项;Game::ReadCellState 负责读某个数据项的状态;
|
|
50
50
|
Game::GetResult 负责报告流程结果。
|
|
51
51
|
```
|
|
52
52
|
|
|
@@ -67,7 +67,7 @@ Game 不调用终端程序,也不读键盘。
|
|
|
67
67
|
|
|
68
68
|
## 流程交流不绑定媒介与行为刚性表述
|
|
69
69
|
|
|
70
|
-
以
|
|
70
|
+
以 首章观察一次流程节改稿前为对照。把交流绑定到具体媒介、把行为写成刚性属性,都会在后续编号目录更换界面或引入协议时与前面冲突(禁用与替换见 `steps/06-wording.md`):
|
|
71
71
|
|
|
72
72
|
```text
|
|
73
73
|
不佳(媒介绝对化,「只发生在」把流程交流写死在终端):
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
|
|
23
23
|
## 定结构:标题只留对象名
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
条文见 `steps/02-structure.md`「标题字数」「形式规则」。两个旧标题都在旧字数上限内,仍是一句步骤说明:指示、过程动词和关系词把真正的对象挤到末尾;目录、侧栏和页内 TOC 需要的是对象名,不是把导语缩进标题。改写在定结构:先圈出目录里要扫到的对象,删掉指示、过程和数量,再检查同级句式是否一致。
|
|
26
26
|
|
|
27
27
|
**定结构(示例章「记下流程数据」下两个三级标题):**
|
|
28
28
|
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
|
|
41
41
|
## 小节标题抽象与首句无中心
|
|
42
42
|
|
|
43
|
-
|
|
43
|
+
小节标题用了读者没学过的术语怎么办,与一段压缩多个论断怎么改,是同一类病。示例章依赖节的两次改稿对照:第一轮标题读不出动作对象,首句堆齐名称后才在句尾给出结论;第二轮标题动作化了,但「使用方」仍是读者未建立的术语,正文一句压缩三个论断,读者无法逐条核对(规则见 `steps/03-blocks.md`「小节标题与正文对齐」):
|
|
44
44
|
|
|
45
45
|
```text
|
|
46
46
|
不佳(标题抽象 + 首句无中心):
|
|
@@ -83,7 +83,7 @@
|
|
|
83
83
|
|
|
84
84
|
## 树注释点名文件与问答式读法句
|
|
85
85
|
|
|
86
|
-
|
|
86
|
+
示例章改稿前的两个反例:树注释点名下层实现文件,与同棵树的职责注释不同层级;树后读法句用问答式并列把前半句再讲一遍,像写给工具的格式规格,不像给读者的解说(规则见 `steps/03-blocks.md` 与 `steps/01-task.md`):
|
|
87
87
|
|
|
88
88
|
```text
|
|
89
89
|
不佳(树注释列举实现文件名):
|
|
@@ -109,7 +109,7 @@
|
|
|
109
109
|
|
|
110
110
|
## 树后换对象收束句
|
|
111
111
|
|
|
112
|
-
目录树后能补一段工具配置的分工吗:不能换对象。示例章改稿对照:树后两句把主语换成 `.clang-format`、`.clang-tidy`、`.clangd` 三份工具配置,而本节标题和清单的对象是四个目录;第二句「三份配置只描述工具怎么检查代码,CMake 构建规则不依赖它们」还与仓库事实不符——`.clangd` 的 `CompileFlags.Add` 是未构建时的解析兜底,不是检查规则,CMake 会为 clangd 导出 `build/compile_commands.json
|
|
112
|
+
目录树后能补一段工具配置的分工吗:不能换对象。示例章改稿对照:树后两句把主语换成 `.clang-format`、`.clang-tidy`、`.clangd` 三份工具配置,而本节标题和清单的对象是四个目录;第二句「三份配置只描述工具怎么检查代码,CMake 构建规则不依赖它们」还与仓库事实不符——`.clangd` 的 `CompileFlags.Add` 是未构建时的解析兜底,不是检查规则,CMake 会为 clangd 导出 `build/compile_commands.json`(规则见 `steps/04-paragraphs.md`「段间:过渡句只在话题切换处」与 `steps/03-blocks.md`「小节标题与正文对齐」):
|
|
113
113
|
|
|
114
114
|
```text
|
|
115
115
|
不佳(树后收束句换成本节清单没有的对象):
|
|
@@ -154,7 +154,7 @@
|
|
|
154
154
|
|
|
155
155
|
## 自测问可观察结果
|
|
156
156
|
|
|
157
|
-
以 示例章自测第 1 题改稿前为对照。「为什么后手不能在开局直接落在中心」把「中心」当成读者已认识的概念,本章正文从未定义中心格;拒绝的原因也与格子无关——空状态面板上轮到甲方,O
|
|
157
|
+
以 示例章自测第 1 题改稿前为对照。「为什么后手不能在开局直接落在中心」把「中心」当成读者已认识的概念,本章正文从未定义中心格;拒绝的原因也与格子无关——空状态面板上轮到甲方,O 落在哪一格都会被拒绝。题面用本章没说全的情景提问,读者会以为中心格另有规则(步骤:定结构;规则见 `steps/02-structure.md`「六段块序列」):
|
|
158
158
|
|
|
159
159
|
```text
|
|
160
160
|
不佳(题面用了本章未定义的概念,情景没说全):
|
|
@@ -43,7 +43,7 @@ set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib")
|
|
|
43
43
|
|
|
44
44
|
## 块后悬空指代
|
|
45
45
|
|
|
46
|
-
块后第一次提到代码块里的常量怎么写:点名标识符,不用「这 N 个 X」。块后段落首次提及围栏里的实体时点名标识符;先行词只出现在代码围栏里、不在任何句中时,「这 N 个 X
|
|
46
|
+
块后第一次提到代码块里的常量怎么写:点名标识符,不用「这 N 个 X」。块后段落首次提及围栏里的实体时点名标识符;先行词只出现在代码围栏里、不在任何句中时,「这 N 个 X」「它们」式省称没有可依的先行词,计数指代还容易盖错范围。条文见 `steps/03-blocks.md`「内容块前后的闭环」。以 示例章定义坐标范围节改稿前为对照:
|
|
47
47
|
|
|
48
48
|
```text
|
|
49
49
|
不佳(「这三个常量」开场,先行词只在上方围栏里;三个常量里只有 kRows、kCols 约束行列取值,kCellCount 给的是总数):
|
|
@@ -59,7 +59,7 @@ set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib")
|
|
|
59
59
|
|
|
60
60
|
## 块后并列事实段拆引导词列表
|
|
61
61
|
|
|
62
|
-
以
|
|
62
|
+
以 首章查看终局输出节改稿前为对照。块后一段串起三个以上并列区域的事实(版式、显示规则、结果行),句句完整却仍是多中心段,各项对应输出的哪一部分全靠读者自补;三项以上优先成列表(规则见 `steps/07-layout.md`「列表选择」):
|
|
63
63
|
|
|
64
64
|
```text
|
|
65
65
|
不佳(块后一段四句各讲一个区域,顺序与对应关系全靠读者自补):
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
|
|
26
26
|
## 摘录导语只报出处
|
|
27
27
|
|
|
28
|
-
|
|
28
|
+
导语点名读者要在块内观察的代码标识符,再给出处;只报出处的句子让读者把「行列坐标」这类中文概念对不上围栏里的名字。条文见 `steps/03-blocks.md`「内容块前后的闭环」。以 示例章定义坐标范围节改稿前为对照:
|
|
29
29
|
|
|
30
30
|
```text
|
|
31
31
|
不佳(导语只报出处,句中没有任何块内标识符):
|
|
@@ -51,7 +51,7 @@
|
|
|
51
51
|
|
|
52
52
|
## 逐条释义代替动机
|
|
53
53
|
|
|
54
|
-
块后把成员逐个介绍一遍怎么改:删掉逐条释义,换成边界设计加动机。讲解性正文(摘录导语与块后项目解释)要给出设计动机,不是把成员清单散文化重写;`X` 做A、`Y` 做B
|
|
54
|
+
块后把成员逐个介绍一遍怎么改:删掉逐条释义,换成边界设计加动机。讲解性正文(摘录导语与块后项目解释)要给出设计动机,不是把成员清单散文化重写;`X` 做 A、`Y` 做 B 式的连续释义只回答「是什么」,删掉后读者照样不知道为什么这样设计。条文见 `steps/03-blocks.md`「内容块前后的闭环」。以 示例章检查坐标后读写节改稿前为对照:
|
|
55
55
|
|
|
56
56
|
```text
|
|
57
57
|
不佳(四个成员逐条释义,句子骨架只是行尾注释的排列):
|
|
@@ -138,11 +138,11 @@ constexpr bool IsInRange(Position position) {
|
|
|
138
138
|
```
|
|
139
139
|
````
|
|
140
140
|
|
|
141
|
-
|
|
141
|
+
判定信号:导语点名了后块才出现的符号,或同一常量的讲解被拆成块前半句加块后半句。类型定义与其使用函数分成两块不是违规;禁的是整份头文件或整条调用链贴进同一个围栏。拆块豁免清单见 `steps/03-blocks.md`「内容块前后的闭环」。
|
|
142
142
|
|
|
143
143
|
## 函数导语与成员列表的 示例章对照
|
|
144
144
|
|
|
145
|
-
以
|
|
145
|
+
以 示例章改稿前三句为对照,规则见 `steps/03-blocks.md`「内容块前后的闭环」、`steps/07-layout.md`「列表选择」、`scripts/verifying-content.py`「禁用与替换」(座位):
|
|
146
146
|
|
|
147
147
|
```text
|
|
148
148
|
不佳(「另一座位」用了座位术语,且第二句未沿用 PlayerToOpponent 注释的说法):
|
|
@@ -156,12 +156,12 @@ constexpr bool IsInRange(Position position) {
|
|
|
156
156
|
不佳(引导句先数个数再把类名连写两次,列表项不是「是什么 + 开局取值」两句):
|
|
157
157
|
`Game` 有四个数据成员,`Game()` 默认构造之后是下面这样:
|
|
158
158
|
- **状态面板**:`board_` 是空状态面板。
|
|
159
|
-
- **轮次**:`
|
|
159
|
+
- **轮次**:`current_owner_` 是当前轮到的用户,开局是先手,使用 X 元素。
|
|
160
160
|
|
|
161
161
|
改写(引导句不数个数;每项恰好两句,第一句是什么,第二句只写开局取值):
|
|
162
162
|
`Game()` 默认构造之后,状态面板、当前用户、流程结果和操作记录是下面这样:
|
|
163
163
|
- `board_` 是这一次的状态面板。开局是空状态面板。
|
|
164
|
-
- `
|
|
164
|
+
- `current_owner_` 是当前轮到的用户。开局轮到先手。
|
|
165
165
|
```
|
|
166
166
|
|
|
167
167
|
```text
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
## 定版式:构造后的成员并列成列表
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
条文见 `steps/07-layout.md`「列表选择」。四个数据成员的初始状态被写进同一句,读者要自己拆开「状态面板为空,轮到甲方,结果进行中,历史也为空」;改成引导词列表后,各项共享的访问规则留在列表后的一句,不拆进每一项。同一页教怎么写注释的 callout 一并删除:注释怎么写、行尾先写什么、`///` 与 `@` 标签怎么分工只留在 `.agents`(条文见 `steps/03-blocks.md`)。
|
|
8
8
|
|
|
9
9
|
**定版式(示例章 `Game()` 构造后的块后段与 callout):**
|
|
10
10
|
|
|
@@ -13,25 +13,25 @@
|
|
|
13
13
|
`Game()` 默认构造后,状态面板为空,轮到甲方 操作,流程结果为进行中,历史也为空。状态面板、轮次、结果和历史都收在对象内部,外界只能通过读取函数查看,改动只发生在尝试操作的函数里。历史按操作先后排列,查询历史就能回放一次流程。
|
|
14
14
|
|
|
15
15
|
::: {.callout-note title="成员注释先写保存的对象"}
|
|
16
|
-
行尾注释先写成员保存的对象,`
|
|
16
|
+
行尾注释先写成员保存的对象,`move_log_` 就写“本局操作记录”。至于按什么顺序排列,属于第二句信息,由正文交代,不要让只写顺序的说明代替对象名。
|
|
17
17
|
:::
|
|
18
18
|
|
|
19
19
|
改写(导语一句 + 列表四项 + 共享规则与历史顺序各留一句;callout 整段删除):
|
|
20
20
|
`Game()` 默认构造之后,四个数据成员是下面这样:
|
|
21
21
|
|
|
22
22
|
- **状态面板**:`board_` 是空状态面板。
|
|
23
|
-
- **轮次**:`
|
|
24
|
-
- **结果**:`
|
|
25
|
-
- **历史**:`
|
|
23
|
+
- **轮次**:`current_owner_` 为 `Player::kFirst`。
|
|
24
|
+
- **结果**:`outcome_` 为 `Result::kInProgress`。
|
|
25
|
+
- **历史**:`move_log_` 还没有操作。
|
|
26
26
|
|
|
27
|
-
四项都在对象内部,读取函数可以查看,只有尝试操作的函数会改它们。`
|
|
27
|
+
四项都在对象内部,读取函数可以查看,只有尝试操作的函数会改它们。`move_log_` 按操作先后排列,查询它就能回放这一次。
|
|
28
28
|
````
|
|
29
29
|
|
|
30
30
|
判定信号:一句里顿号、逗号并列三个以上数据成员且各项状态不同;callout 在教行尾先写什么、第二句交给谁,而不是告诉读者状态面板上发生了什么。
|
|
31
31
|
|
|
32
32
|
## 枚举成员释义列表
|
|
33
33
|
|
|
34
|
-
|
|
34
|
+
工程章正文禁止枚举成员释义表或释义段;成员含义由源码行尾注释承载(写法见 `steps/06-wording.md`「定用词:术语要稳」),正文只写谁调用、如何验收、与邻章关系。以 示例章终局与操作的状态码节改稿前为对照:
|
|
35
35
|
|
|
36
36
|
```text
|
|
37
37
|
不佳(枚举成员释义段,逐个成员复述源码注释):
|
|
@@ -54,11 +54,11 @@
|
|
|
54
54
|
三种强度都只改变选择的方式,棋规本身不变。
|
|
55
55
|
```
|
|
56
56
|
|
|
57
|
-
判定信号:列表项格式是 `` `类型::成员`:含义
|
|
57
|
+
判定信号:列表项格式是 `` `类型::成员`:含义 ``,且含义与枚举行尾注释或类型注释同义;正文删掉整个列表后,调用关系与验收路径仍完整。正文不复述注释的总规则见 `examples/03-block-after.md`「块后复述注释」。
|
|
58
58
|
|
|
59
59
|
## 列表字数带失衡
|
|
60
60
|
|
|
61
|
-
同列各项字数相差两倍以上或引导词相差 4
|
|
61
|
+
同列各项字数相差两倍以上或引导词相差 4 字以上时,扫读节奏断裂(计量口径见 `steps/07-layout.md`「列表选择」)。以 示例章失败策略列表改稿前为对照:
|
|
62
62
|
|
|
63
63
|
```text
|
|
64
64
|
不佳(引导词长度差 6 字,长项夹带流程频次旁白):
|
|
@@ -70,7 +70,7 @@
|
|
|
70
70
|
- **数据项被占用**:`PlacePiece` 返回 `false`,状态面板保持不变,调用方另选数据项就行。
|
|
71
71
|
```
|
|
72
72
|
|
|
73
|
-
判定信号:同一列表内最长项冒号后字数 ≥ 最短项 × 2,或引导词相差 ≥ 4
|
|
73
|
+
判定信号:同一列表内最长项冒号后字数 ≥ 最短项 × 2,或引导词相差 ≥ 4;长项的第二句删掉后主线仍闭合。章级定稿对照见 `examples/08-appendix.md`「列表项长度均衡定稿」。
|
|
74
74
|
|
|
75
75
|
## 公式与换算讲解段
|
|
76
76
|
|
|
@@ -106,19 +106,19 @@ $$
|
|
|
106
106
|
下面的图按行标出 `cells_` 的数组下标,加粗的是下标 5。
|
|
107
107
|
```
|
|
108
108
|
|
|
109
|
-
判定信号:`return` 行之外另排 `$$` 或行内数学模式;换算句没点名载体(「一个下标」「这个下标」「这次代入」互相指代,或导语用「这个下标」而全句未写出是 `cells_` 的数组下标);一句里同时出现跳过整行、列偏移、代入数字与得数;公式项列表;导语用反引号扛公式本体;代入段里列号与「第 N 列」混用(列号从 0 起算,「第 2 列」会让人从 1 数起);图已经标出的下标区间在图前再列一遍。「换算只发生在 `Board` 内部」这类局部实现事实本身合法(见 `language-scope.md`
|
|
109
|
+
判定信号:`return` 行之外另排 `$$` 或行内数学模式;换算句没点名载体(「一个下标」「这个下标」「这次代入」互相指代,或导语用「这个下标」而全句未写出是 `cells_` 的数组下标);一句里同时出现跳过整行、列偏移、代入数字与得数;公式项列表;导语用反引号扛公式本体;代入段里列号与「第 N 列」混用(列号从 0 起算,「第 2 列」会让人从 1 数起);图已经标出的下标区间在图前再列一遍。「换算只发生在 `Board` 内部」这类局部实现事实本身合法(见 `language-scope.md` 的「流程交流不绑定媒介与行为刚性表述」的判定信号),多处复述或混进图导览段才违规。换算句式规则见 `steps/07-layout.md`「列表选择」换算条。
|
|
110
110
|
|
|
111
111
|
## 未定义名字的调用链
|
|
112
112
|
|
|
113
|
-
以
|
|
113
|
+
以 示例章改稿前为对照。章引言用后文才定义的名字串起一条必须看懂的调用链,读者在第一个分句就遇到三个没讲过的名字(步骤:排列内容块;规则见 `steps/03-blocks.md`「内容块前后的闭环」):
|
|
114
114
|
|
|
115
115
|
```text
|
|
116
116
|
不佳(编号步骤用后文才定义的名字串起调用链):
|
|
117
117
|
从操作到查询结果的调用链如下:
|
|
118
118
|
|
|
119
|
-
1. `Game::
|
|
119
|
+
1. `Game::ApplyMove` 校验这次操作,通过后经 `Board::WriteCell` 把元素写入状态面板。
|
|
120
120
|
2. 元素写入后,`JudgeAfterPlace` 在新状态面板上判定 `Result`,其中 `HasPlayerLine` 检查是否三连。
|
|
121
|
-
3. 对外的 `GetResult` 读取成员 `
|
|
121
|
+
3. 对外的 `GetResult` 读取成员 `outcome_`,返回最近一次判定的流程结果。
|
|
122
122
|
|
|
123
123
|
改写(整段删除,不改写后留在原位;各名字在后面的小节按依赖顺序登场):
|
|
124
124
|
(删除三条编号步骤。讲述按「类型 → 数据 → 简单函数 → 判定 → 组装」排列,最后的小节只摘 Place,被调函数都已在前文出现。)
|
|
@@ -152,7 +152,7 @@ enable_testing() 开启 CTest……。add_test 用 NAME 和 COMMAND……。set_
|
|
|
152
152
|
|
|
153
153
|
## 凑三项拆列表
|
|
154
154
|
|
|
155
|
-
|
|
155
|
+
以一段启动说明改稿前为对照(规则见 `steps/07-layout.md`「列表选择」):
|
|
156
156
|
|
|
157
157
|
```text
|
|
158
158
|
不佳(同一件事拆成三项,第三项只为凑足数量):
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Quarto 元素写法正反对照
|
|
2
2
|
|
|
3
|
-
元素细则(filename 标注、闭环、盒子密度、Callout
|
|
3
|
+
元素细则(filename 标注、闭环、盒子密度、Callout)见 `steps/03-blocks.md`;本文件保存元素写法的正反对照,检索单元是「正确 + 不佳 + 改写」。
|
|
4
4
|
|
|
5
5
|
## 代码块导语元计数对照
|
|
6
6
|
|
|
@@ -76,7 +76,7 @@ constexpr bool IsInRange(Position position) { … }
|
|
|
76
76
|
终端程序打印的三行对应图中每个数据项的 CellState::kEmpty。
|
|
77
77
|
````
|
|
78
78
|
|
|
79
|
-
|
|
79
|
+
判定信号:图后句删掉任一分句中心仍成立;图注或桥接句已写明的信息在图后再讲一遍。图后正文只给图注讲不完的新结论,图后对照与句段侧的冒号分号堆叠见 `examples/04-paragraph-opening.md`「冒号后堆叠分号解释」。
|
|
80
80
|
|
|
81
81
|
## 块后解释先于图对照
|
|
82
82
|
|
|
@@ -116,7 +116,7 @@ struct Move { … };
|
|
|
116
116
|
|
|
117
117
|
## 摘录导语只报出处
|
|
118
118
|
|
|
119
|
-
|
|
119
|
+
代码块导语要点名块内的什么:点名读者要在块内观察的代码标识符,再给出处;只报出处的句子让读者把「行列坐标」这类中文概念对不上围栏里的名字。条文见 `steps/03-blocks.md`「内容块前后的闭环」。以 示例章定义坐标范围节改稿前为对照:
|
|
120
120
|
|
|
121
121
|
```text
|
|
122
122
|
不佳(导语只报出处,句中没有任何块内标识符):
|
|
@@ -131,7 +131,7 @@ struct Move { … };
|
|
|
131
131
|
|
|
132
132
|
## 递进片段拆围栏对照
|
|
133
133
|
|
|
134
|
-
|
|
134
|
+
同源围栏的合并已收窄:只有紧邻常量与其直接使用行才放在同一个围栏;类型定义和后一步使用它的函数是两步,分成两块,每块各配一句完整导语。判定与豁免见 `steps/03-blocks.md`「内容块前后的闭环」;句段对照见 `examples/03-excerpt-lead.md`「递进片段合并」。
|
|
135
135
|
|
|
136
136
|
````text
|
|
137
137
|
不佳(拆成三个同源围栏,各配半句导语,首句点名了后块符号):
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
## 自然段多中心未拆
|
|
6
6
|
|
|
7
|
-
以 示例章无标题引言改稿前为对照。一段同时承担承接上一章、交付物清单、源文件位置与摘录声明四件事,第二句还用顿号串四个交付物。章引言的形态契约(`steps/02-structure.md`)已改为「单段 ±
|
|
7
|
+
以 示例章无标题引言改稿前为对照。一段同时承担承接上一章、交付物清单、源文件位置与摘录声明四件事,第二句还用顿号串四个交付物。章引言的形态契约(`steps/02-structure.md`)已改为「单段 ± 列表」:多中心时并段或改列表,禁止拆成两个散文段(拆段触发表见 `steps/04-paragraphs.md`「段落规则」):
|
|
8
8
|
|
|
9
9
|
```text
|
|
10
10
|
不佳(一段四职责,顿号串四个交付物;拆成三个散文段同样违规):
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
|
|
19
19
|
## 段内同义堆叠
|
|
20
20
|
|
|
21
|
-
以
|
|
21
|
+
以 示例章「用数组存放九个数据项」的块后段改稿前为对照。中心句之后连续两句都在换说法解释同一个事实(长度在编译期确定),没有引入新机制,属于段内同义堆叠;相邻的同义合并规则管跨段落,这里管同一段内部(规则见 `steps/04-paragraphs.md`「段内同义堆叠禁令」):
|
|
22
22
|
|
|
23
23
|
```text
|
|
24
24
|
不佳(中心句后两句换说法复述「数量不变」,第三句又突然换主题):
|
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
|
|
55
55
|
## 散文伪标签冒号与多核混段
|
|
56
56
|
|
|
57
|
-
以
|
|
57
|
+
以 示例章数组存储节的块后段为对照。同一句里叠了两层问题:冒号前是「话题标签」,读感像词条;前半讲长度、后半讲容器,两个中心挤进一段(规则与拆核四步见 `steps/04-paragraphs.md`「散文伪标签冒号禁令」「拆核四步」):
|
|
58
58
|
|
|
59
59
|
```text
|
|
60
60
|
不佳(散文里「话题标签:解释」词条式冒号;长度与容器两个中心混在一段):
|
|
@@ -72,7 +72,7 @@
|
|
|
72
72
|
|
|
73
73
|
## 定段落:类型接线段整段删除
|
|
74
74
|
|
|
75
|
-
|
|
75
|
+
块后的类型接线句怎么判:块后没有新信息就整段删除。条文见 `steps/05-sentences.md`「一次对话」。这段在定段落判为不合格:块后没有新信息,整段删除,不走拉链的三条改写。对照保留 `Move` 的导语与围栏注释,轮到谁由后文 `Game::ApplyMove` 一节承担。
|
|
76
76
|
|
|
77
77
|
**定段落(示例章 `Move` 块后,类型接线与轮到谁叠进一段):**
|
|
78
78
|
|
|
@@ -80,7 +80,7 @@
|
|
|
80
80
|
不佳(前两个逗号分句各自是「成员叫法 + 使用 + 某一章的类型」,后句换讲轮次;「全部信息」又被下一句的「两个不同的问题」否定):
|
|
81
81
|
`Move` 的位置直接使用上一章的 `Position`,用户字段使用本节的 `Player`,一个结构体装下一次操作的全部信息。先手和后手交替操作,一次操作由当时轮到的用户提交。
|
|
82
82
|
|
|
83
|
-
改写(整段删除,不另写替身句:导语已写「一次操作要带上目标位置和操作的用户」,围栏注释已写 position 是操作的行列坐标、player 是执行操作的用户;交替操作留在 `Game::
|
|
83
|
+
改写(整段删除,不另写替身句:导语已写「一次操作要带上目标位置和操作的用户」,围栏注释已写 position 是操作的行列坐标、player 是执行操作的用户;交替操作留在 `Game::ApplyMove` 一节):
|
|
84
84
|
(删除)
|
|
85
85
|
```
|
|
86
86
|
|
|
@@ -8,8 +8,8 @@
|
|
|
8
8
|
|
|
9
9
|
````text
|
|
10
10
|
不佳(一块后把私有性、三个成员、const、[[nodiscard]] 串成一段):
|
|
11
|
-
成员 cells_ 保持私有,调用者能读写的只有 Game::
|
|
12
|
-
Game::GetResult 这三个成员。Game::
|
|
11
|
+
成员 cells_ 保持私有,调用者能读写的只有 Game::ReadCellState、Game::ApplyMove、
|
|
12
|
+
Game::GetResult 这三个成员。Game::ReadCellState 与 Game::GetResult 声明为 const,
|
|
13
13
|
读取动作不改变状态面板。三个接口都标注 [[nodiscard]]:查询结果与操作结果都不该被调用方无视。
|
|
14
14
|
|
|
15
15
|
改写(块前场景已点名与划界;代码展示声明;块后删除复述,语言属性不进旁白):
|
|
@@ -67,7 +67,7 @@ Game::GetResult 这三个成员。Game::GetCellState 与 Game::GetResult 声明
|
|
|
67
67
|
先看项目动态库目录 `example/`。数据项的定义在 `include/state.h`,实现放在 `src/state.cpp`。
|
|
68
68
|
```
|
|
69
69
|
|
|
70
|
-
判定信号:把问题和答案首句各缩成一个对象名词,两者不一致即错位;补细节不等于换对象;问答中的文件、路径与标识符指称挂了链接也命中(统一行内代码,`verifying-content.py` 对自测节链接记 WARN
|
|
70
|
+
判定信号:把问题和答案首句各缩成一个对象名词,两者不一致即错位;补细节不等于换对象;问答中的文件、路径与标识符指称挂了链接也命中(统一行内代码,`verifying-content.py` 对自测节链接记 WARN,规则见 `steps/02-structure.md`)。
|
|
71
71
|
|
|
72
72
|
## 冒号后堆叠分号解释
|
|
73
73
|
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
## 压缩黑话与过短句
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
读者正文写可观察对象与完整主谓句,不写压缩隐喻和缺成分的省略句;禁用词见 `steps/06-wording.md`,正向语气标准见 `steps/06-wording.md`。判定口诀:读者能从句子里指出磁盘上的文件、屏幕上的输出或可执行的动作,这句才合格。
|
|
8
8
|
|
|
9
9
|
```text
|
|
10
10
|
不佳(压缩隐喻当主语,读者对不上现实对象):
|
|
@@ -46,7 +46,7 @@ AI 才有稳定的地基。本章设计终端双人闭环与分层验收。
|
|
|
46
46
|
|
|
47
47
|
## 过简断裂段
|
|
48
48
|
|
|
49
|
-
以
|
|
49
|
+
以 示例章「查看流程接口」节导语改稿前为对照。与「罗列短句成段」的分工:那条打句号清单,本条打逗号切断与过简两句各丢一个事实——每截单看都合法,段却不成篇,读者要自己补「因为/所以/其中」(规则见 `steps/05-sentences.md`「过简断裂禁令」与「概念负荷」):
|
|
50
50
|
|
|
51
51
|
```text
|
|
52
52
|
不佳(四截并列:对象 → 文件位置 → 入口个数 → 私有存储,截截换新主语、新事实):
|
|
@@ -66,11 +66,11 @@ ai.h 不打印状态面板,也不读取键盘。`Ai::Choose` 读当前流程
|
|
|
66
66
|
|
|
67
67
|
判定信号:逗号、句号后的分句引入新主语或新的行内代码标识,且无回指词、无承接词;删掉该分句后上下文照样成立,说明它只是被并列甩出的另一截。改写时收敛主概念,用给定信息衔接次要展开;时序句「进入目录,执行入口」合法(后一分句接住前一分句的动作)。
|
|
68
68
|
|
|
69
|
-
ai.h 那组的改写只解决过简断裂;定稿进一步把「不打印、不读取」的否定边界让给常见错误节,正文只写「`ai.h` 声明操作的公共接口:`Ai::Choose` 读当前流程,返回当前用户的一次合法 `Move
|
|
69
|
+
ai.h 那组的改写只解决过简断裂;定稿进一步把「不打印、不读取」的否定边界让给常见错误节,正文只写「`ai.h` 声明操作的公共接口:`Ai::Choose` 读当前流程,返回当前用户的一次合法 `Move`。」(否定式预告见 `steps/05-sentences.md`「句子规则」)。
|
|
70
70
|
|
|
71
71
|
## 罗列短句成段
|
|
72
72
|
|
|
73
|
-
以
|
|
73
|
+
以 首章「观察一次流程」改稿前为对照。三个短句各自成立、句间无衔接,读起来像清单;分号还把显示状态面板与拒绝非法输入两件事串进一句(规则见 `steps/04-paragraphs.md`「罗列短句成段禁令」):
|
|
74
74
|
|
|
75
75
|
```text
|
|
76
76
|
不佳(三个独立短句堆成一段,句间无衔接;分号串两个中心):
|
|
@@ -84,7 +84,7 @@ ai.h 那组的改写只解决过简断裂;定稿进一步把「不打印、不
|
|
|
84
84
|
|
|
85
85
|
## 过简实现围栏
|
|
86
86
|
|
|
87
|
-
值得出围栏的是类型布局、多步或非显然控制流、与图核对的公式实现;单次比较或直接 `return`
|
|
87
|
+
值得出围栏的是类型布局、多步或非显然控制流、与图核对的公式实现;单次比较或直接 `return` 的平凡实现不出围栏(门槛见 `steps/03-blocks.md`)。以 示例章检查坐标后读写节改稿前为对照:
|
|
88
88
|
|
|
89
89
|
```text
|
|
90
90
|
不佳(为证明「源码有此函数」贴出一次比较的平凡实现):
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
|
|
14
14
|
## 句内骨架:先依据后选择
|
|
15
15
|
|
|
16
|
-
以 示例章「用数组存放九个数据项」的块后段为对照。旧改写只去掉词条式冒号和同义堆叠,分句骨架仍不合格:第一句先给代码决定,第二句才补依据;「是示例项目规则的一部分」只贴类别;「正好装下」把上一句再说一遍;「由 `ToFlatIndex`
|
|
16
|
+
以 示例章「用数组存放九个数据项」的块后段为对照。旧改写只去掉词条式冒号和同义堆叠,分句骨架仍不合格:第一句先给代码决定,第二句才补依据;「是示例项目规则的一部分」只贴类别;「正好装下」把上一句再说一遍;「由 `ToFlatIndex` 完成」提前交接下一小节专讲的对象(规则见 `steps/05-sentences.md`「句内骨架」):
|
|
17
17
|
|
|
18
18
|
```text
|
|
19
19
|
不佳(先决定后补依据,类别句不改下一步,复述句与交接句多余):
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
|
|
30
30
|
## 拉链句
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
一句话把两组对象两两配对,删掉任一配对、剩下的仍能单独成立,原句就是拉链句:读者要按顺序把左组一一配到右组,且两个配对共用同一个判据(判定与三条改写见 `steps/05-sentences.md`「拉链句」;步骤链、同物两处与回顾不按拉链判)。以 示例章章首改稿前与 示例章改稿前为对照:
|
|
33
33
|
|
|
34
34
|
```text
|
|
35
35
|
不佳(一句两组配对:「数据项在哪、上面是什么」分别交给两个类型;还提前点了后文才定义的类型名,并用「写进代码时」元叙述):
|
|
@@ -83,7 +83,7 @@
|
|
|
83
83
|
|
|
84
84
|
## 结构助词「的」
|
|
85
85
|
|
|
86
|
-
|
|
86
|
+
两条判定见 `steps/05-sentences.md`「结构助词「的」」;正反对照只收这一组。两个名词粘合后仍是一个叫法时去掉「的」;术语表已定名的按定名走:
|
|
87
87
|
|
|
88
88
|
```text
|
|
89
89
|
不佳(「状态面板的格子的总数」两个「的」,内层先粘合成「数据项」):
|
|
@@ -103,11 +103,11 @@
|
|
|
103
103
|
已经写入的状态面板
|
|
104
104
|
```
|
|
105
105
|
|
|
106
|
-
「的的」字面仍由 verifying-content.py
|
|
106
|
+
「的的」字面仍由 verifying-content.py 拦截,不新增 `A的B的C` 这类正则。
|
|
107
107
|
|
|
108
108
|
## 定句子:两次说话拆成一次对话
|
|
109
109
|
|
|
110
|
-
|
|
110
|
+
条文见 `steps/05-sentences.md`「一次对话」。总述叠了几件内容:有没有写进状态面板、整局走到哪、它们是两个问题、用两个枚举分开答,下一句又改口「接着看」「第一个枚举」。改写发生在定句子:每件内容一次对话,紧挨自己的围栏。
|
|
111
111
|
|
|
112
112
|
**定句子(示例章两个枚举的总述):**
|
|
113
113
|
|
|
@@ -129,7 +129,7 @@
|
|
|
129
129
|
|
|
130
130
|
## 假对比、起跑式铺垫与意义拔高
|
|
131
131
|
|
|
132
|
-
|
|
132
|
+
以一段常量位置说明改稿前为对照(规则见 `steps/05-sentences.md`「情况:假对比、起跑式铺垫与意义拔高」):
|
|
133
133
|
|
|
134
134
|
```text
|
|
135
135
|
不佳(起跑式铺垫、假对比、句尾拔高各一处):
|