感谢你为 Websoft9 文档站 做出贡献!本文说明分支策略、PR 规范、i18n 要求和文档质量原则。
| 分支 | 用途 | 说明 |
|---|---|---|
dev |
开发分支 | 所有 PR 必须提交到此分支 |
main |
生产分支 | 仅由 Owner 合并,触发 Cloudflare Pages 部署 |
⚠️ Owner 不接受直接向main提交的 PR。
- Fork 本仓库(外部贡献者)或新建 feature 分支(内部成员)
- 在
dev分支基础上创建工作分支,命名建议:feat/appname-doc、fix/broken-link - 完成修改后向
dev分支提 PR - PR 会自动触发
check.yml(broken-links 检查)和build_doc.yml(构建验证) - 通过 CI 检查 + Owner Review 后 merge
本项目支持 中文(默认) 和 英文 两种语言:
| 内容类型 | 中文路径 | 英文路径 |
|---|---|---|
| 版本文档 | versioned_docs/version-2.0/ |
i18n/en/docusaurus-plugin-content-docs/version-2.0/ |
| 主题翻译 | — | i18n/en/docusaurus-theme-classic/ |
| 插件翻译 | — | i18n/en/code.json |
提交 App 或功能文档时,建议同步更新中英文两份文件。 若英文翻译暂时缺失,可先提交中文版,后续补充英文。
推荐翻译工具:DeepL + DeepL Write 校对。
好的文档应遵循以下 10 条原则:
- 可维护优先:文档进化的第一任务是可维护性,允许使用上存在"不直观"的情况
- 组件化设计:像编写程序一样设计文档的组件和接口
- 三层技术体系:文档满足入门、配置、运维三层结构
- 通用方案复用:通用方案参考 + 特殊要素清单 = 特殊解决方案(例:特殊 Nginx 配置只需列出配置文件模板,不重复步骤说明)
- 路由扁平化:路由层级不超过两层结构
- 内容与结构分离:
_include/片段由 CI 自动生成,不应手工维护 - 锚点语义化:标题锚点使用语义化英文(如
{#guide}、{#wizard}) - 截图规范:截图命名格式
{appname}-{feature}-websoft9.png,存放于assets/目录 - 链接健壮性:避免使用绝对路径外链,内部链接使用相对路径
- 中英文同步:重要内容变更后及时同步英文版本
./../administrator/firewall#security
../
./
Type: 'ignore' | 'log' | 'warn' | 'throw'
该 Action 根据 Contentful 产品数据自动在 apps/ 生成中英文文档。以下类型应用需排除:
- 非 Docker 应用(如 BT、明道)
- 环境类应用(如 Python、Ruby,未放在
apps/目录)
排除列表:template/meta/skip_file.json
若出现类似以下错误:
Broken link on source page path = /docs/apps:
-> linking to ./phpfpmapache (resolved as: /docs/phpfpmapache)
说明有 App 文档路由缺失。排除列表:template/meta/skip_applink.json
- 下载最新制品
media_latest.zip并解压 - 在
product_zh.json中找出"title": "产品"对应的appname - 确保该 App 的父 catalog 不是一级目录
- 重新更新 media 制品后重新触发 Action
如需更新 Algolia Docsearch 抓取配置,使用以下 scraper 配置:
{
"index_name": "websoft9",
"start_urls": ["https://support.websoft9.com/"],
"selectors": {
"lvl0": {
"selector": "(//ul[contains(@class,'menu__list')]//a[contains(@class,'menu__link menu__link--sublist menu__link--active')]/text() | //nav[contains(@class,'navbar')]//a[contains(@class,'navbar__link--active')]/text())[last()]",
"type": "xpath",
"global": true,
"default_value": "Documentation"
},
"lvl1": "header h1",
"lvl2": "article h2",
"lvl3": "article h3",
"lvl4": "article h4",
"lvl5": "article h5,article td:first-child",
"lvl6": "article h6",
"text": "article p, article li, article td:last-child"
},
"strip_chars": " .,;:#",
"custom_settings": {
"separatorsToIndex": "_",
"attributesForFaceting": ["language", "version", "type", "docusaurus_tag"],
"attributesToRetrieve": ["hierarchy", "content", "anchor", "url", "url_without_anchor", "type"]
},
"conversation_id": ["833762294"],
"nb_hits": 46250
}