创空间新闻发布台 · MD 写作规范
这个平台只吃两种 Markdown,放在两个互不相通的目录里:
| 目录 | 内容 | 一个文件 | 多份时 |
|---|---|---|---|
| ms-studio-news\news\ | 新闻稿件 | = 一条新闻 | 全部展示,按时间倒序 |
| ms-studio-news\link\ | 上传入口链接配置 | = 一份配置 | 最新的那份生效 |
本文只讲怎么写和写到哪。上传、部署、刷新不在此范围。
1. 写之前:先认位置
项目根目录(绝对路径)
C:\Users\2300G\Downloads\ms-studio-news
两个 MD 各自该写进哪个文件夹(绝对路径)
| 写什么 | 放到哪 | 完整示例 |
|---|---|---|
| 新闻稿件 | C:\Users\2300G\Downloads\ms-studio-news\news\ | C:\Users\2300G\Downloads\ms-studio-news\news\2026-09-30-十月第4周.md |
| 上传入口链接 | C:\Users\2300G\Downloads\ms-studio-news\link\ | C:\Users\2300G\Downloads\ms-studio-news\link\2026-10-08-入口.md |
新建文件时直接用上面的绝对路径,不要依赖当前工作目录。
项目根目录长这样(news/ 和 link/ 之外的都不用碰):
C:\Users\2300G\Downloads\ms-studio-news\
├─ news\ ← 新闻稿件写这里
│ ├─ .gitkeep
│ └─ 2026-09-30-十月第4周.md
├─ link\ ← 链接配置写这里
│ └─ 入口.md
├─ app.py
├─ news_store.py
├─ git_sync.py
├─ selftest.py
├─ requirements.txt ← 留空,只有注释
├─ ms_deploy.json
├─ README.md
├─ .gitignore
└─ .opencode\skills\ms-studio-news\SKILL.md ← 本文件
- 两个目录不能放对方的文件。
link/里的稿子不会变成新闻,news/里的也不会变成横幅。 - 文件放错目录不会被自动纠正,只会静默不生效。
- 两个目录的初始占位文件
news/.gitkeep和link/入口.md别删。 - 应用运行时会写
.runtime/和__pycache__/,那是它自己的,别往里塞稿件。
2. 新闻稿件 · news/*.md
2.1 一个文件就是一条新闻
不支持在一个文件里写多期。 写了 ## 第一期 ## 第二期,只产出一条新闻,
标题取 front matter 的 title,所有分节内容堆进同一条正文。
要发多期就写多个文件。
2.2 文件名必须带期号
✅ 2026-09-30-十月第4周.md
✅ 2026-09-30-十月第4周-终稿.md
❌ 简报.md ← 极易撞上旧稿
撞名的后果平台来处理,程序拦不住——同名会被覆盖或改名。所以期号是唯一可靠的防撞手段。
2026-09-30-十月第4周.md 这种「日期-期号」格式同时还提供了时间排序的兜底。
2.3 模板
---
title: 十月第 4 周技术简报
summary: 一句话摘要,显示在滚动台上。
source: 内部
published: 2026-09-30T14:30:00+08:00
---
## 正文
支持 **粗体**、`行内代码`、列表、引用、代码块、表格、链接。
- 列表项
- 列表项
> 引用行
```bash
some-command --flag value
### 2.4 front matter 字段
| 字段 | 建议 | 缺省行为 |
|---|---|---|
| `title` | **必填** | 取正文首个 Markdown 标题(`## xxx`),再不行取正文首行 |
| `summary` | 建议填 | 取正文首个非标题段落,截到 110 字 |
| `source` | 否 | 不显示 |
| `published` | **见 2.5** | 见 2.5 |
**解析不出标题的文件会被整条丢弃**——标题是硬要求,不要只靠正文里的标题兜底。
值里含 `:` 或以 `-` `#` `|` 开头时,用英文双引号包起来。
### 2.5 时间标签:什么时候必须写 `published`
取值优先级:
1. front matter 的 `published` / `date`
2. 该文件**最后一次 git 提交时间**
3. 文件 mtime(仅非 git 环境兜底)
**规则一:单篇补发可以不写。** 只发一篇时,git 提交时间就是你写完拖进去的时间,准确。
**规则二:一次补发多篇,必须每篇都写 `published`。**
原因是一次上传 = 一个 commit = **多篇共享同一个提交时间**。全部留空的话,
时间标签会一模一样,排序退化成按文件名(拼音序),显示顺序不是你想要的期号倒序。
```markdown
# 补发三期,时间按实际发布时刻依次往后写
2026-09-30-十月第4周.md published: 2026-09-30T14:30:00+08:00
2026-09-30-十月第3周.md published: 2026-09-30T11:00:00+08:00
2026-09-30-十月第2周.md published: 2026-09-30T09:00:00+08:00
为什么不用文件 mtime:git 检出时会把 mtime 重置成拉取时刻, 用 mtime 的话所有稿件的时间标签会齐刷刷变成「拉取的那一刻」。
一旦写了 published 就不再变。 重复写同一份稿子不会改动它原有的时间。
2.6 正文渲染能力
支持:##–###### 标题、**粗体**、*斜体*、`行内代码`、代码块、
列表(- * +)、> 引用、--- 分隔线、表格、链接(自动加 rel="noopener")。
正文里的标题会自动降 2 级(### 渲染成 <h5>),因为条目标题已经单独显示了,
不降级会重复。
所有文本先转义再渲染,只放行上面这些标签——不会把稿子里的 <script> 当 HTML 执行。
2.7 会被整条丢弃的情况
| 情况 | 原因 | |---|---| | 非 UTF-8 二进制、PNG 等 | 严格解码失败 | | 含 NUL 或控制字符 | 判定为非文本 | | 解析不出标题 | 见 2.4 |
2.8 显示位置
按 published 倒序后,前 NEWS_LATEST_N 条(默认 8)进「最新一期」自动滚动,
其余全部进「历史存档」。每篇都保留,不会被后来的覆盖或顶掉。
3. 上传入口链接 · link/*.md
3.1 模板
---
label: 上传新一期新闻
url: https://modelscope.cn/studios/<用户名>/<空间名>/files
note: 把 .md 拖进 news/ 目录
---
3.2 字段
| 字段 | 必填 | 说明 |
|---|---|---|
| url | ✅ | 跳转地址。留空则整条横幅失效 |
| label | 否 | 主标题,默认「前往上传新新闻」,最长 40 字 |
| note | 否 | 副标题,最长 80 字 |
| published | 否 | 不写就用 git 提交时间 |
url 也允许直接写在正文第一行(不带 front matter 时)。
3.3 协议白名单
只有 http:// 和 https:// 通过。javascript:、data:、file: 一律拒掉。
写错协议不会静默生效,日志里会记下是哪个文件被拒、为什么。
3.4 多份配置:最新的生效
link/ 下可以有任意多个 .md,挑 published 最大的那份(时间相同按文件名),
其余原样保留当历史,不会被删。
换链接就新建一份,不必改旧的。文件名带日期更清楚:
link/2026-09-30-入口.md
link/2026-10-08-入口.md ← 这份生效
3.5 清空
url 留空即可。没有有效 url 时横幅变成灰条 + 鹈鹕去饱和,明确不可点,
不会指向任何地方。
4. 识别创空间文档地址
给 url 填地址时用。三种拿法:
① 从浏览器地址栏读(最可靠)
打开创空间 → 点顶部「文件」标签页 → 复制地址栏完整 URL。
以你浏览器里看到的为准。 不同版本平台的路径不一样,不要照抄本文档里的示例。
② 空间主页与 host 直达的区别
| 形态 | 示例 | 能否作跳转目标 |
|---|---|---|
| Studio 路径 | https://modelscope.cn/studios/<用户名>/<空间名> | ❌ 社区页是 iframe 套壳 |
| host 直达 | https://<用户名>-<空间名>.ms.show | ✅ 应用本体 |
owner/name 拼成 owner-name 得到 host 地址,大写会转小写。
③ 从 git remote 推导
容器里 git remote get-url origin 的值:
https://www.modelscope.cn/studios/<用户名>/<空间名>.git
去掉结尾 .git 得空间主页。
程序不会自动把这个地址填进横幅(默认留空,不猜),它只作为你手填时的参考。
挑地址的原则
横幅的用途是「一键跳去上传」,所以直接指向文件页(方法 ①)最省事。 带查询参数或 hash 就原样照抄,不要自己拼路径。
5. 两条硬约束
新闻只增不减。 应用从不改写 news/ 里的任何文件;提交前会检查暂存区,
发现任何删除或重命名就放弃提交。所以历史稿件不会被覆盖、不会被清理。
标题撞车要靠文件名避免。 页脚会检测标题重复并红字告警,但那是事后提醒。 真正的预防手段是 2.2 的期号命名。
微信扫一扫