# 逻辑的色块:Maplen 的段落属性标记与心智索引 > 揭秘基于 Remark 插件实现的段落类型标记系统,如何用六色方块标识主题、描述、例子、类比与验证,重塑长文的论证结构 - Site: https://maplen.top/ - Page: https://maplen.top/nodes/paragraph-markers-showcase/ - LLM: https://maplen.top/nodes/paragraph-markers-showcase/llms.txt - Author: 红枫 (Maple) - Audience: AI agents / LLM tools - Section: Nodes / 实践 - Published: 2026.11.09 - Tags: 功能展示 - Markdown: https://maplen.top/nodes/paragraph-markers-showcase.md - Column: Maplen ## Content [主题] 在我长期的技术写作与思维沉淀中,我常常遇到一个两难的困惑:长篇文章需要详实的论据与严密的推理,但一泻千里的文字高墙,极易让读者在快速通读时迷失重点与论述结构。 [描述] 为了在不破坏纸面沉浸感的前提下重塑长文的视觉节律,我参考了 [渐构](/wiki/modevol.md)(由科普 UP 主 Yjango 创办的学习网站)在内容呈现上的段落属性标注方式,并在 [Maplen](/wiki/maplen.md) 中将其工程化实现为一套「段落属性标记系统」。这套机制允许我在 Markdown 编写期,通过在段落开头放置一个极简的中括号语义标记,自动在构建流水线中完成语法树解析与修剪,最终在正文左侧渲染出内敛精致的六色指示块,并在文章头部动态聚合出全篇的逻辑骨架统计。 --- ## 一、六维心智模型:色块与语义的映射 [主题] 一篇优秀的工程手记或思辨文章,其段落通常承担着截然不同的修辞与论证功能。我将这种认知结构提炼为六种基础属性,并为它们赋予了与纸张风格契合的低饱和色调。 [描述] 这六种属性在全站正文中均具有严格的样式映射,读者只需稍微留意段首左侧边栏的小方块,即可对该段的认知预期了然于胸: ### 1. 主题(Theme · 墨绿) [主题] `[主题]` 用于揭示章节的核心立论、终极研究目标或统领全局的思考方向。它是全文的罗盘,引导读者抓住最本质的分野。 ### 2. 描述(Description · 灰蓝) [描述] `[描述]` 用于中立、客观地陈述技术细节、背景事实、协议规约或系统状态机流向。它不带有强烈的情感色彩,重在精准与详尽。 ### 3. 例子(Example · 赭红) [例子] `[例子]` 用于给出真实的代码切片、配置片段、生活案例或具象反例。例如当我探讨跨平台布局抖动时,列举一段具体的 CSS 样式配置,便属于典型的例子范畴。 ### 4. 类比(Analogy · 秋黄) [类比] `[类比]` 用于将枯燥深奥的底层架构或数学抽象,映射到读者日常熟知的物理现实与直观经验。类比就像地图上的等高线,它不是真实的山脉本身,却能让人一眼看懂地势的陡缓。 ### 5. 验证(Verification · 紫藤) [验证] `[验证]` 用于向读者提出针对性的关键思考问题,检验读者能否准确、透彻地理解前文阐述的真正含义。它引导读者暂时跳出单向的信息灌输,通过自我提问与心智复述,验证自己是否已建立起清晰、正确的认知模型。 ### 6. 其他(Other · 暖灰) [其他] `[其他]` 用于承载旁逸斜出的技术背景、历史溯源、设计权衡的花絮或补充注脚。它们不处于论证的主干线上,却为文章增添了温度与历史厚度。 --- ## 二、架构设计:从 AST 拦截到无感注入 [主题] 作为一个静态优先的站点,我拒绝任何需要在浏览器端运行时用正则遍历 DOM 的粗暴方案,所有段落标记的识别与转换必须在构建期(Build-time)彻底完成。 ``` Markdown 源码 Remark AST 语法树 最终 HTML 结构 [主题] 这是一段核心立论。 ───> Paragraph Node ───>
├─ Text: "这是一段核心立论。" 这是一段核心立论。 └─ data: { 'data-para': '主题' }
``` [描述] 整个技术链路分为三个清晰的层次:语法树拦截、CSS 变量映射、以及元数据聚合统计。 ### 1. Remark 插件的语法树遍历 在构建阶段,Astro 通过加载我编写的 `src/plugins/remark-paragraph-types.mjs` 插件对 Markdown AST 进行深度遍历。 [描述] 插件的核心逻辑非常纯粹:通过正则表达式 `^\[(主题|描述|例子|类比|验证|其他)\]\s*` 匹配段落第一个文本节点的头部。一旦命中,立即安全切除标记符号本身,避免在浏览器上暴露原始方括号,同时将匹配到的类型无缝注入到该段落的 `hProperties['data-para']` 中: ```javascript // src/plugins/remark-paragraph-types.mjs const MARKER_RE = /^\[(主题|描述|例子|类比|验证|其他)\]\s*/; function walk(node) { if (node.type === 'paragraph') { const first = node.children[0]; if (first?.type === 'text') { const match = first.value.match(MARKER_RE); if (match) { // 切除标记文字,避免正文泄露 first.value = first.value.slice(match[0].length); if (!first.value) node.children.shift(); // 挂载 data-para 属性 node.data = { ...(node.data ?? {}), hProperties: { ...(node.data?.hProperties ?? {}), 'data-para': match[1], }, }; } } } } ``` ### 2. 左侧边栏的纯 CSS 伪元素渲染 [描述] 在渲染层,完全由 `src/styles/prose.css` 接管,无需一行运行时脚本。正文容器通过为带属性段落分配左侧留白(`padding-left: 1.15rem`),并利用 `::before` 伪元素定位绘制一个小方块: ```css /* src/styles/prose.css */ [data-para="主题"] { --para-color: #5e7754; } [data-para="描述"] { --para-color: #6f849b; } [data-para="例子"] { --para-color: #b56b6b; } [data-para="类比"] { --para-color: #a67c2e; } [data-para="验证"] { --para-color: #75618f; } [data-para="其他"] { --para-color: #8a7b6d; } .prose p[data-para] { position: relative; padding-left: 1.15rem; } .prose p[data-para]::before { content: ""; position: absolute; top: 0.55em; left: 0; width: 0.5rem; height: 0.5rem; border-radius: 1px; background: var(--para-color); } ``` [其他] 为了保证深色模式下的阅读舒适感,我还对六种色值在暗黑背景下分别调配了适度的增亮与防眩光色彩映射,确保无论昼夜,色块都能自然融入页面底色。 ### 3. 文章头部的动态心智索引 [描述] 当一篇文章中至少存在一个标记段落时,`src/utils/paragraphs.ts` 会在文章载入时统计全篇各属性的分布数量,并通过 `src/layouts/PostLayout.astro` 在文章标题下方自动激活「段落属性」横向指示栏: ```astro {paragraphStats.totalAttributes > 0 && (