DirectSurface UIDirectSurface UI
开始使用
文档/示例项目

示例:Markdown 文档中心

LIVE CANVAS可运行组件示例
ON-DEMAND RUNTIME交互式示例将在进入视区时启动避免文档首屏同时初始化多个 Canvas Runtime

本示例展示如何用 MarkdownViewer 组合一个业务文档阅读器。它是页面组合方案,不是框架内置的单一组件;框架提供 MarkdownViewer、TreeView、CollapsiblePanelGroup、DockPanel、SearchBox 等基础能力,业务项目可以按自己的文档目录和权限体系重新组合。

页面结构

DockPanel
  left:
    CollapsiblePanelGroup
      文档树
      本文目录
      搜索结果
  fill:
    文档路径
    当前位置
    搜索框 + 上一处 + 下一处
    MarkdownViewer

左侧使用折叠分区是为了让正式文档、本文目录、全文搜索结果共享同一侧栏宽度。右侧由标题区、搜索区和 MarkdownViewer 组成,MarkdownViewer 负责解析和绘制 Markdown 内容,页面负责文档路由、搜索、目录同步和历史导航。

数据来源

业务项目可以把源文档和运行时静态资源分开,例如:

content/docs/**
public/docs/**
public/docs/manifest.json

构建脚本负责把源文档复制到静态资源目录,并生成包含标题、分组、顺序和相对路径的 manifest.json。文档中心运行时只读取静态资源,不要求服务器访问项目源码,也不在页面代码中手写完整文档清单。

关键能力

  • 文档树按 manifest 组织,manifest 由正式文档目录生成。
  • 点击文档异步加载 Markdown。
  • 文档加载后构建本文目录。
  • 正文滚动时同步当前 heading。
  • 搜索结果以树展示。
  • Enter 连续搜索跳到下一处。
  • 跨文档链接可以打开对应文档。
  • 图片相对路径按当前文档目录解析。
  • 浏览历史支持后退和前进。

加载流程

点击文档树节点
  -> 根据 manifest doc key 找到文档相对路径
  -> 转换为 /docs 静态资源路径
  -> 拉取 Markdown 字符串
  -> 设置到 MarkdownViewer
  -> 根据解析结果重建本文目录
  -> 默认滚动到顶部
  -> 如果链接带 anchor,再滚动到对应标题

文档中心主动调用 scrollToTop() 是页面策略,不是 MarkdownViewer 的默认行为。MarkdownViewer 更新 Markdown 字符串后会保留滚动位置,业务如果希望打开新文档回到顶部,需要自己调用对应 API。

链接解析

MarkdownViewer 会把正文中的链接点击事件抛给页面。页面先处理站内文档链接,再把外部链接交给浏览器或业务自己的打开逻辑。

文档中心支持以下内部链接写法:

写法 含义 示例
#标题 当前文档内跳转 [API 总览](#api-总览)
./同目录.md 当前文档同目录 [总览](./overview.md)
../相邻目录/文档.md 从当前文档目录向上再进入其他目录 [Text](../components/basic/text.md)
../相邻目录/子目录/文档.md 从当前文档目录解析到更深层级 [Toolbar](../components/command/toolbar.md)
/docs/... 从 public 文档根路径解析 [Button](/docs/components/button.md)
文档.md#标题 打开文档后跳到标题 [列配置](../components/data/grid-view.md#列配置)
文档.md?cache=1 查询参数不参与文档匹配 [Button](/docs/components/button.md?cache=1)

解析规则按当前文档路径归一化 ...,再和文档中心登记的文档路径匹配。无法匹配的站内链接不会改变当前文档;外部协议链接不按站内文档处理。

业务文档建议优先使用相对路径,减少目录迁移时的歧义。/docs/... 适合路由、测试或明确需要从静态资源根定位的场景。

图片路径

图片路径由页面根据当前文档路径解析:

  • http://https://data: 等外部资源保持原样。
  • /docs/... 从 public 根路径加载。
  • ./images/a.png../assets/a.png 等相对路径按当前 Markdown 文件所在目录解析。

文档中的图片资源应放在可随文档一起构建和部署的目录下,避免引用临时目录或本机绝对路径。

搜索行为

搜索区同时支持文档名搜索和内容搜索:

  • 文档名搜索用于快速定位左侧文档树节点。
  • 内容搜索会扫描已登记的正式文档,结果展示在左侧搜索结果分区。
  • SearchBox 按 Enter 触发下一处匹配,不主动让输入框失焦。
  • 当前匹配项使用独立颜色,和普通匹配项区分。
  • 如果目标匹配项已经在可视区域内,跳转时不强制把它滚动到顶部。

目录同步

MarkdownViewer 解析标题后,页面生成本文目录树。正文滚动时,页面根据可视区域内的标题位置更新当前目录项;点击目录项时,页面调用 MarkdownViewer 的标题定位能力。

历史导航

文档中心维护页面级历史栈:

  • 打开新文档或跳转到不同 anchor 时写入历史。
  • 后退和前进只恢复文档路径、anchor 和滚动目标。
  • MarkdownViewer 不负责业务历史栈,它只提供内容渲染和定位能力。

接入边界

  • MarkdownViewer 只接受 Markdown 字符串并渲染,不负责从哪里加载文档。
  • 文档树、搜索结果、历史栈、权限过滤和远程加载都属于页面或业务应用职责。
  • 示例页面里的文档列表和 mock 数据不是框架 API,业务项目应该替换为自己的数据源。
  • 代码示例只能引用 ds-ui 包入口导出的框架 API,不要依赖示例页面类。

注意事项

  • 打开新文档后显式调用 scrollToTop()
  • manifest 只登记允许当前用户访问的业务文档。
  • 增加、移动或删除文档后,应在构建阶段重新生成 manifest,并校验其中的路径都能访问。
  • 文档链接失效时,优先检查路径是否相对于当前文档目录,而不是相对于仓库根目录。
  • 需要展示结构图时使用 text 代码块,不要把不可运行的伪代码标记为 TypeScript。

相关文档