PlantUML 主题包:自制定义主题(CSS / !theme 编译 / 内部发布)
PlantUML 自带 20+ 主题,但公司的品牌色 / 暗色模式 / 印刷色没法覆盖——这一篇把”自制主题 + 内部发布”的流程打通。
主题的三种形态
PlantUML 主题支持 4 个层级:
| 层级 | 谁用 | 文件格式 |
|---|---|---|
| skinparam | 单图 / 单 .puml |
内联 |
| !theme 文件 | 单团队 / 多图 | .puml 文件 |
| 官方皮肤包 | PlantUML 自身 | 内置 |
| CSS / SVG transform | 后处理 | pipeline |
前三者 PlantUML 1.2018+ 支持。CSS 处理属于「render 后再处理」的 pipeline 法。
方案 1:内联 skinparam(最小改动)
直接在每张图顶部加皮肤参数:
1 | @startuml |
每张图都重复——繁琐,不适合「公司 30 个工程师」场景。
改良:写一个 skins/standard.puml 文件:
1 | !global |
每张图顶部加:
1 | !include skins/standard.puml |
比每个图重复一份要省事。但「include 路径」在不同 IDE 下各异(VS Code plantuml.includepaths / 命令行 -I),团队协作依旧痛。
方案 2:!theme 真正的主题包
PlantUUM 1.2018 后引入的 !theme 语法——区别在于「主题资源统一管理」。
结构
1 | themes/ |
puml-theme.css(CSS 变量)
1 | /* 品牌主色:紫罗兰 + 暖灰 */ |
puml-theme.puml(PlantUML 语法)
1 | !$brand_primary = "#6B5ACD" |
发布到内部 npm
1 | cd themes/company-brand |
或者更轻:发布到内部 git 仓库:
1 | git remote add internal git@git.internal.company.com:design/plantuml-theme-company.git |
团队用法
每张图加:
1 | @startuml |
VS Code PlantUML 插件读取 !theme:
- 用户装了
plantuml-theme-company-brandnpm 包 → 自动搜索 - 否则需要
!theme company-brand from <path>配路径
方案 3:render 后处理(CSS / SVG transform)
PlantUML 渲染完 SVG 后,再通过 SVG transform / CSS 重新染色——适合「plantuml 服务已经用着,但想加公司主题」。
用 sed 替换 SVG color 值
1 | plantuml -tsvg diagram.puml |
粗暴但有效——缺点:
- 不同 PlantUML 版本 SVG 输出的字段名不一致(”stroke” vs “Stroke”)
- 不同 diagram type 的 schema 不一样
Python transform(更可靠)
1 | import re |
放 CI pipeline:
1 | - name: Render PlantUML |
方案 4:PR 评审时强制主题一致
团队内部只在 .puml 文件里加 !theme company-brand——CI 验证:
1 | # 在 pre-commit / GitHub Action 里跑 |
不写主题 → CI 失败。需要写规范的图:
1 | @startuml |
暗模式 / 亮模式 自动切换
PlantUML 默认不会根据系统自动切换,但有几种实现:
方案 A:CSS prefers-color-scheme media query
1 | /* 在 wiki 主题的 CSS 里 */ |
build 时生成 2 套 SVG(亮 + 暗):
1 | plantuml -tdefault -tsvg diagram.puml # 亮 |
HTML 里:
1 | <img src="diagram.svg" class="diagram-light" /> |
方案 B:JavaScript 切换 class
1 | document.querySelectorAll('.plantuml-theme-toggle').forEach(el => { |
主题包提供:
1 | body.dark .diagram { filter: invert(1) hue-rotate(180deg); } |
粗暴但有效——SVG 整体反色后主题感 ok,色准丢失一点点。
主题版本管理
发布到 npm 的版本号遵循 semver:
1 | npm version patch # 修改皮肤参数微调 |
每张图 !theme company-brand 不锁版本——取最新。如果要锁:
1 | !theme company-brand@1.2.3 |
主题包的高级能力
自定义 !function
主题包可以让 PlantUML 提供新的关键字:
1 | !function $brand_node($name) |
然后团队图里直接:
1 | %brand_node("App1") |
自定义 !pragma
1 | !pragma company_layout |
主题文件里:
1 | !procedure company_layout |
集成 jsDelivr / CDN
发布到 jsDelivr 公开 CDN:
1 | # GitHub 仓库 |
PlantUML 命令行在线引用:
1 | plantuml -tpng -o /tmp -include "https://cdn.jsdelivr.net/..." diagram.puml |
落地建议
按团队规模选:
| 团队规模 | 推荐方案 | 理由 |
|---|---|---|
| 1-3 人 | 内联 skinparam | 简单直接 |
| 4-20 人 | !theme 文件 + 内部 git |
易维护,复用度高 |
| 20+ 人 | npm 包 + 版本锁 | 易分发,CI 验证一致 |
| 多产品多团队 | 多个主题包 | product/theme 隔离 |
小结
- PlantUML 的主题从「内联」到「包发布」4 层方案
- 皮肤参数可变就足以覆盖大多数企业需求——别一上来就做 npm 包
- CJK 字体始终加
skinparam defaultFontName - 团队一致 → CI 验证 → 不写主题就拒绝
下一步
- 标题: PlantUML 主题包:自制定义主题(CSS / !theme 编译 / 内部发布)
- 作者: puml.online
- 创建于 : 2026-07-30 11:08:00
- 更新于 : 2026-08-14 21:34:29
- 链接: https://puml.online/blog/plantuml-theme-pack/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。