STL syntax highlighting
给你
.md里的 STL(Semantic Tension Language,语义张力语言)代码块做 6 色 token 高亮——让 STL 知识图谱语句在 markdown 里像代码一样可读,而不是一团乱码。
这是什么 / 谁会用
STL 是一个把"语义关系"写成可读字符串的小语言:
[Source] -> [Target] ::mod(key=value, key=value)
它最初是 STG (Semantic Tension Graph) 项目的输入格式——但任何人想把"知识图谱片段、引用关系、断言、思维节点"嵌进 markdown 里,都可以用它。
你需要这个能力如果:
- ✅ 你在写研究笔记,需要表达节点之间的关系("A 蕴含 B"、"X 反驳 Y")
- ✅ 你做知识管理,希望文档里直接写知识图谱片段
- ✅ 你写复杂主题的结构化笔记(理论之间的关系、概念依赖、决策链)
- ✅ 你想给 AI agents 喂结构化语义(LLM 容易学 STL)
- ❌ 你只写普通文章——这能力你大概率用不到,可以跳过本篇
Basic syntax
把 STL 语句包在 ```stl 代码块里:
```stl
[REST_API] -> [HTTP_Layer] ::mod(rule="definitional", confidence=1.0, description="REST 建立在 HTTP 语义之上")
```
渲染:6 色 token 着色,让 anchor / arrow / key / value / 关键字 / 注释一目了然。
Token 着色
Rho 内置的 STL grammar 把 STL 切成 6 类 token,每类一种颜色:
| Token | 例子 | 颜色(典型 dark theme) |
|---|---|---|
| Anchor | [User_Profile]、[Module:Auth] |
青绿 (cyan) |
| Arrow | ->、→ |
黄 (yellow) |
| Modifier key | rule=、confidence=、action= |
紫 (purple) |
| Modifier value (string) | "depends_on" |
绿 (green) |
| Modifier value (number) | 0.99、100 |
橙 (orange) |
| Comment | # 这是注释 |
灰 (gray) |
具体颜色随主题(light / dark / 自定义)变化,但6 类语义角色固定。
跟 Annotate 是两回事:annotate 是手工标注任意文本,stl 是自动按 STL grammar 高亮 STL 代码。一个手动一个自动。
Examples
Example 1:最简边
```stl
[A] -> [B] ::mod(rule="causal", strength=0.8)
```
渲染:[A] 和 [B] 青绿,-> 黄,rule= 和 strength= 紫,"causal" 绿,0.8 橙。一行能看清"这是 A 因果引发 B 强度 0.8"。
Example 2:研究笔记里嵌入语义网络
气候变化的因果链概览:
```stl
[Climate_Change] -> [Greenhouse_Gas_Emissions] ::mod(rule="causal", confidence=0.97, strength=0.92, description="主因果驱动")
[Greenhouse_Gas_Emissions] -> [CO2] ::mod(action="dominated_by", confidence=0.95)
[CO2] -> [Fossil_Fuel_Burning] ::mod(action="primarily_from", confidence=0.95)
[CO2] -> [Deforestation] ::mod(action="also_from", confidence=0.85)
[Climate_Change] -> [Sea_Level_Rise] ::mod(action="leads_to", confidence=0.90)
```
注意 confidence 从 0.97 (强证据) 递减到 0.85 (二级因素仍在量化)。
渲染:5 行 STL 整齐高亮,confidence 数字(橙色)跟正文叙述形成视觉呼应。
Example 3:含注释 + 多 modifier
```stl
# 数据库选型决策记录 (2026-05-14)
[Database_Choice] -> [PostgreSQL] ::mod(
rule="empirical",
confidence=0.95,
action="selected_over",
alternatives="MySQL, MongoDB, DynamoDB",
occurred_time="2026-05-14",
lesson="JSONB 支持 + 成熟生态 + ACID 完整 + 团队熟悉"
)
```
渲染:注释行灰色,多行 modifier 缩进;每个 key/value 对色编。比单行更易读,跨行的语义结构清晰。
Example 4:跟普通代码块对比同写法
普通 ` ```text ` 代码块(无高亮):
\```text
[A] -> [B] ::mod(rule="causal")
\```
Rho 的 ` ```stl ` 代码块(有高亮):
```stl
[A] -> [B] ::mod(rule="causal")
```
渲染:两块字符内容完全相同,但下方 stl 块每个 token 着色,语义结构一眼可见。差别就是 fenced block 的 lang 标签。
Plain-text fallback behavior
stl lang 是标准 markdown fenced code block lang 标签。在不支持 STL grammar 的 reader 里:
```stl
[A] -> [B] ::mod(rule="causal")
```
→ 显示为普通代码块(等宽字体、灰底)——内容完全可读,只是失去 6 色 token 编码。
具体各 reader:
| Reader | 渲染效果 |
|---|---|
| Rho | 完整 6 色高亮 |
| GitHub web | 普通代码块(无 STL 高亮,但内容清晰) |
| Obsidian | 同上(除非装了 STL highlight 插件) |
| VS Code 默认预览 | 同上 |
| 任何 markdown reader | 至少识别为 code block,等宽字体 |
Rho 用 highlight.js / lowlight 系统注册 STL grammar,所以任何接入 hljs / lowlight 的 reader 都能集成同一份 STL grammar。Rho 提供导出函数:
import hljs from 'highlight.js'; import { stlLanguage } from '@rho/md'; hljs.registerLanguage('stl', stlLanguage);
Common pitfalls
1. 把 STL 写成 markdown 链接语法
[A] -> [B]
→ 这看起来像 markdown 链接 [A] 但没有 (url),markdown 解析器会保留原文。没问题——不会被错误解析为链接。但要注意:
[A](http://...) -> [B] ← ❌ 这会变成真链接,破坏 STL 解析
STL 中的 [X] 不应跟 (...) 紧接。
2. anchor 名含空格
[User Profile] -> [...] ← ⚠️ 部分 reader 解析未定义
[User_Profile] -> [...] ← ✅ 推荐:用 `_` 替代空格
STL spec 推荐 anchor 名使用 [A-Za-z0-9_:-] 字符,不含空格。需要"看着是空格"时用 _、-、:。
3. value 含双引号
[A] -> [B] ::mod(description="he said "hello"") ← ❌ 嵌套引号 broken
→ 嵌套未转义的 ASCII 双引号会提前 close 字符串,整段 STL 解析报废。 解决:
- 用中文/全角
「」/"" - 或转义
\"(部分解析器支持) - 或用单引号包外层(如果支持)
4. modifier 之间忘记逗号
[A] -> [B] ::mod(rule="causal" confidence=0.8) ← ❌ 缺逗号
[A] -> [B] ::mod(rule="causal", confidence=0.8) ← ✅
5. 用 stl 高亮非 STL 内容
function foo() { return 1; } ← ❌ 这不是 STL,高亮会乱
→ STL grammar 只识别 STL 语法 token,喂给它 JS / Python / 其他东西会乱标色或完全不标。只在真正是 STL 的代码块上用 ```stl lang label。
6. 想要做"普通文本里强调 STL 风格的字符串"
正文里随手写 [A] -> [B] 这样的伪 STL 想要高亮 ← ❌ 不工作
→ STL 高亮只在 fenced code block 里生效。正文里的 [A] -> [B] 字符串只会被 markdown 当成"破链接 + 文本 + 文本"。如果要在正文中强调 STL 表达式,包成 inline code: `[A] -> [B] ::mod(rule="causal")` —— 不会高亮,但至少视觉上像代码。
See also
- Annotate — 手工标注任意文本(vs STL 是自动按语法高亮)
- Callout — 把"这段 STL 重要" 用 callout 包起来
- Layout — 多段 STL 对比时用 cards
- STL 完整规范 — 外部 repo
- STG 知识图谱引擎 — 把 .md 里的 STL 块抽出来构建知识图谱(Rho graph 未来 feature 的基础)