gogcli 实战指南:使用 `gog slides create-from-markdown` 将 Markdown 一键转化为 Google Slides 演示文稿
2026/9/18 0:19:42 网站建设 项目流程

gogcli 实战指南:使用gog slides create-from-markdown将 Markdown 一键转化为 Google Slides 演示文稿

【免费下载链接】gogcliGoogle Workspace in your terminal.项目地址: https://gitcode.com/GitHub_Trending/gogcl/gogcli

导读

gog slides create-from-markdown是 gogcli(Google Workspace in your terminal)面向 Google Slides 的命令之一,它允许开发者用纯文本 Markdown 描述整份演示文稿的幻灯片结构、标题、正文、演讲者备注,甚至 Font Awesome 图标与 Mermaid 图表,再通过一次 CLI 调用在 Google 云端生成可编辑的 Slides 演示文稿。读完本文,你将掌握该命令的完整参数用法、slidey 风格 Markdown 语法规范,以及其背后的解析器与资源渲染管线实现原理。

命令概览

该命令的定位是"从 Markdown 创建 Google Slides 演示文稿"(Create a Google Slides presentation from markdown)。在命令树中它归属于gog slides(别名slide)子命令组,父命令说明见 gog slides。

基本用法:

gog slides (slide) create-from-markdown <title> [flags]
  • <title>:必填的位置参数,即新演示文稿的标题;
  • Markdown 正文通过--content(内联字符串)或--content-file(文件路径)二选一传入。

快速上手:第一次把 Markdown 变成幻灯片

方式一:内联内容

适合脚本与快速测试,把 Markdown 直接放在命令行里:

gog slides create-from-markdown "My Deck" \ --content "# Hello - first bullet - second bullet"

方式二:从文件读取

适合正式写作,把内容保存为deck.md

gog slides create-from-markdown "Q3 产品发布" \ --content-file ./deck.md \ --parent "1AbCdEfGhIjKlMnOpQrStUv"

--parent指定 Drive 目标文件夹 ID,不传则落到"我的云端硬盘"根目录。

命令成功后的标准输出(非 JSON 模式)形如:

Created presentation with 12 slides id 1AbCdEfGhIjKlMnOpQrStUvWxYz name Q3 产品发布 link https://docs.google.com/presentation/d/...

从源码看,该命令的入口定义在 internal/cmd/slides.go:SlidesCreateFromMarkdownCmd会先校验标题非空,再按--content-file/--content的优先级读取 Markdown,随后交给internal/slidesmarkdown包解析,最终调用CreatePresentationFromMarkdownV2完成建片与资源注入。若两者都未提供,会直接报错either --content or --content-file is required

完整 Flags 参考

下表为gog slides create-from-markdown支持的全部参数(继承自命令文档 gog-slides-create-from-markdown.md):

Flag类型默认值说明
--access-tokenstring直接使用给定的访问令牌(绕过已存储的 refresh token;令牌约 1 小时过期)
-a
--account
--acct
string认证账户的邮箱、别名或 auto(用于 Google API 命令)
--clientstringOAuth 客户端名称(选择已存凭据与令牌桶)
--colorstringauto输出着色:auto|always|never
--contentstring内联 Markdown 内容
--content-filestring从文件读取 Markdown 内容
--debugbool显示调试输出
--disable-commandsstring逗号分隔的禁用命令列表;支持点路径
-n
--dry-run
--dryrun
--noop
--preview
bool不实际改动,打印预期动作后成功退出
--enable-commandsstring逗号分隔的启用命令前缀列表;支持点路径(限制 CLI)
--enable-commands-exactstring逗号分隔的精确启用命令列表;点路径,父命令不自动启用子命令
--fa-stylestringsolid短代码无前缀时默认的 Font Awesome 样式
-y
--force
--assume-yes
--yes
bool跳过破坏性命令的确认
--gmail-no-sendboolfalse阻止 Gmail 发送操作(Agent 安全用)
-h
--help
kong.helpFlag显示上下文相关的帮助
--homestring覆盖 gogcli 的 config/data/state/cache 根目录(等价于 GOG_HOME)
-j
--json
--machine
boolfalse向 stdout 输出 JSON(适合脚本)
--keep-temp-imagesbool导入后不删除临时 Drive 上传文件
--mmdcstringmmdcmermaid CLI(mmdc)路径;传空字符串禁用图表渲染
--no-input
--non-interactive
--noninteractive
bool永不提示;否则失败(适合 CI)
--no-notesbool丢弃## Notes段落而不是插入为演讲者备注
--parentstring目标文件夹 ID
-p
--plain
--tsv
boolfalse向 stdout 输出稳定的、可解析的 TSV 文本(无颜色)
--quota-projectstring用于 API 计费的 Google Cloud 项目(作为 X-Goog-User-Project 发送;部分 API 与 --access-token 或 ADC 一起使用时需要)
--readonlyboolfalse运行时阻止变更类 API 请求;auth add 也会请求只读 OAuth scope
--results-onlyboolJSON 模式下仅输出主结果(丢弃 nextPageToken 等信封字段)
--select
--pick
--project
stringJSON 模式下选择逗号分隔的字段(尽力而为;支持点路径)。更推荐使用 --fields
--strictbool将跳过的 FA/图表资源视为致命错误
-v
--verbose
bool开启详细日志
--versionkong.VersionFlag打印版本并退出
--wrap-untrustedboolfalseJSON/raw 输出中,用外部不可信内容标记包裹抓取的文本字段

核心参数深度解读

以下参数与 markdown→Slides 的转换链路直接相关,值得逐个理解其行为。

--content--content-file:二选一的输入来源

两者都用于提供 Markdown 正文,--content-file优先级更高(源码中case c.ContentFile != ""先于case c.Content != "")。文件按字节读取后原样交给解析器,解析器内部会先把 CRLF 统一规范化为 LF,因此无论你在 Windows 还是 macOS/Linux 上撰写文档,结果一致。

--fa-style:Font Awesome 默认样式

默认solid。当 markdown 中的图标短代码不带前缀时使用该样式。取值与行为详见下文"Font Awesome 图标"一节。

--mmdc:Mermaid CLI 路径

默认mmdc,即依赖 PATH 中的可执行文件。传空字符串可彻底禁用图表渲染(相关代码块会被跳过)。mermaid 渲染命令实际执行:

mmdc -i in.mmd -o out.png -b transparent --scale 2

即透明背景、2 倍缩放输出 PNG,见 internal/cmd/slides_assets.go。

--strict:把资源缺失升级为错误

默认false。默认行为下,若某个 FA 图标因缺少本地 SVG 光栅化工具(rsvg-convert/ ImageMagick 的magick/convert)或某个 mermaid 图因缺少 mmdc 而被跳过,命令只是打印警告后继续;开启--strict后,任何被跳过的资源都会导致命令失败退出,适合 CI 场景保证成品完整性。

--keep-temp-images:控制临时资源留存

图标与图表在导入前会被上传到 Drive 作为临时文件(渲染成 PNG 后再以图片形式插入幻灯片)。默认结束后清理这些临时上传;开启本参数后保留,便于人工复核或复用。

--no-notes:演讲者备注的开关

默认情况下,markdown 中每个 slide 末尾的## Notes(或### Notes)小节会被解析为演讲者备注并写入幻灯片;开启后该小节直接被丢弃。

--debug:查看解析结果

开启后会在 stderr 打印parsed N slides,用于快速确认解析器把整份文档切成了几张幻灯片,是排查"为什么少了一张/多了一张"的第一抓手。

--dry-run:安全预览

所有 gogcli 命令都支持--dry-run。对 create-from-markdown 而言,它不会调用任何 Google API,而是打印预期动作,包括幻灯片数量、目标文件夹与batch_update预览(由buildSlideyDryRunBatchUpdate生成),并在打印后成功退出。这是把解析器接入 CI 校验的好方法:

gog slides create-from-markdown "Preview" \ --content-file ./deck.md --dry-run

--json输出

-j/--json模式下,命令会额外抓取Presentations.Get的完整结构并连同 Drive 文件元数据一起输出为 JSON:顶层含presentationfile两个字段,适合下游脚本与 LLM 消费。

slidey 风格 Markdown 语法规范

该命令同时接受"普通 Markdown"与带 gogcli 方言扩展的 "slidey-flavored" Markdown。完整语法说明参见 docs/slides-markdown.md,以下为关键约定。

幻灯片分隔

一个裸的---行就是幻灯片分隔符——除非它开启了一段连续的 YAML frontmatter(特征:紧跟的若干行都是key: value形式的键值行,且在出现空白行或正文行之前有收尾的---)。

对应实现见 internal/slidesmarkdown/frontmatter.go:解析器逐行扫描,---后面第一行若匹配 YAML 键正则^[A-Za-z_][A-Za-z0-9_-]*:\s才被当作 frontmatter 候选;若打开后遇到空白行或非键值行,则放弃候选,仍把该---当分隔符处理。代码块内部的---由围栏状态机保护,不会被误判为分隔符。

每页 frontmatter

每张幻灯片可以以 YAML frontmatter 开头,识别的键如下:

取值行为
layouttitleherostatementcenterdefaulttwo-colsthree-cols决定该页的视觉处理方式;未知取值回退到default
contentwidenarrow已解析但尚未生效(Slides 文本框宽度固定)

示例:

--- layout: hero --- # univrs Unfolding Nested Intent · Valid · Reliable · Safe

从 AST 定义(internal/slidesmarkdown/ast.go)可以看到,SlideFrontmatter还保留了Raw map[string]string用于向前兼容未知键。

layout不仅决定视觉处理,还影响标题提取行为:titleherostatement三种布局下,解析器不会把首个 H1 提升为幻灯片标题(layoutSkipsTitleHoist逻辑见 internal/slidesmarkdown/markdown.go);其余布局则会把第一个 H1(没有 H1 时回退到第一个 H2)提取为幻灯片标题,并从正文中移除。

演讲者备注

幻灯片末尾的## Notes### Notes小节会整体成为该页的演讲者备注,标题及其后的所有内容从正文中剥离;备注内的 FA 图标短代码会被剥离为纯文本(注意## Notes大小写敏感,且解析时会跳过代码围栏内的同名标题)。见 internal/slidesmarkdown/markdown.go。

## Topic body ## Notes - speaker hint one - speaker hint two

Font Awesome 图标

行内短代码:fa-name::fas-name::far-name::fab-name::fal-name::fad-name:会被解析为 FA Free 图标:先从cdn.jsdelivr.net拉取对应 SVG,再交给本地光栅化器(rsvg-convert或 ImageMagick)转成 PNG 后作为图片插入。若本地没有可用的 SVG 光栅化器,图标会被跳过并给出警告;--strict会让这种情况变成致命错误。图标放置在列表项开头时会渲染为项目符号左侧的小型内联图片;出现在段落中间时会被丢弃。

样式推导规则:

前缀解析结果样式
fa---fa-style(默认solid
fas-solid
far-regular
fab-brands
fal-fad-solid(FA Free 没有 light/duotone)

底层实现:SVG 下载地址形如https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6/svgs/{style}/{name}.svg(见 internal/cmd/slides_assets.go),光栅化时rsvg-convert使用-w 128 -h 128,ImageMagick 使用-resize 128x128 -background none(internal/cmd/slides_assets.go)。

Mermaid 图表

标记为mermaid的围栏代码块会通过本机mmdc二进制渲染为 PNG,并作为全宽图片插入。--mmdc可指定路径、空串可禁用;mmdc缺失时图表被跳过并警告,--strict使其致命。

![mermaid](https://web-api.gitcode.com/mermaid/svg/eNpLL0osyFAIceFSAALH6OCSxKKSWAVdXTsFp2qX1OTMlNRasJQTSKwmMrW4RsE52j0_FknQL79GwQWoM78gFgBivBYl)

若 mmdc 执行失败,错误信息会带上 stderr 输出(如 puppeteer 的 chromium 下载失败或 mermaid 语法错误),而不是只给一个退出码,便于直接定位原因(internal/cmd/slides_assets.go)。

多列布局

::cols:: left column markdown ::col2:: middle / right column markdown ::col3:: third column markdown ::/cols::
  • ::right::::col2::的同义写法(slidey 风格);
  • layout: two-colslayout: three-cols的幻灯片中,可以省略开头的::cols::,直接使用::col2::::col3::::right::,标题之后的内容自动成为第一列;
  • 该"简写列"能力由normalizeShorthandColumns实现:检测到布局与简写标记且无显式::cols::时,解析器会把标题后的内容包进列块(internal/slidesmarkdown/markdown.go)。

::boxes::::arrows::

::boxes:: :fa-rectangle-ad: Campaigns :fa-headset: Support Tickets ::/boxes:: ::arrows:: ### Step One ### Step Two ::/arrows::

两者都渲染为正文中的列表:boxes使用项目符号,arrows使用连接。

底层实现:从 Markdown 到演示文稿的流水线

整条链路可以拆成三个阶段,对应源码位置如下:

  1. 解析(Parsing)internal/slidesmarkdown包的Parse()先把整份文档按裸---切成slideBlock(每块 = frontmatter + body),再对每块做备注剥离、简写列归一化、块级/行内解析,产出[]SlideAST。Slide结构包含FrontmatterTitle(提升出的标题)、Body(有序顶层块)、Notes(已剥离 FA 短代码的备注文本),见 internal/slidesmarkdown/ast.go。AST 的块类型覆盖段落、有序/无序列表(含两级缩进)、代码块、标题、多列块、图标行块、mermaid 图块(internal/slidesmarkdown/ast.go)。
  2. 资源管线(Asset Pipeline)internal/cmd/slides_assets.go负责把 AST 中的IconRefDiagramBlock解析为实际图片:下载/渲染 → 上传 Drive → 得到ImageRef(DriveFileID + PublicURL),汇聚为AssetMap。默认 HTTP 客户端 30 秒超时,--strict--keep-temp-images--fa-style均在此注入(DefaultAssetPipelineConfig,internal/cmd/slides_assets.go)。
  3. 建片与写回CreatePresentationFromMarkdownV2创建 Drive 上的演示文稿,并通过 Slides API 的 batchUpdate 批量建片、写入文本、插入图片与备注。命令层会同时持有 Slides 与 Drive 两个服务(slidesService+driveService),见 internal/cmd/slides.go。

整个解析器都有配套单元测试(internal/slidesmarkdown 目录下的*_test.go覆盖分隔符、frontmatter、块解析、行内解析等),资源管线也有slides_assets_test.go佐证行为,可作为行为规范的参考。

一份完整的实战示例

把下面内容保存为pitch.md

--- layout: hero --- # univrs Unfolding Nested Intent · Valid · Reliable · Safe --- ## 市场机会 :fa-chart-line: 千亿级蓝海市场 :fa-users: 3 亿潜在用户 ## Notes - 强调市场规模增速 - 引用第三方行业报告 --- layout: two-cols --- ## 产品架构 ::col2:: :fa-server: 核心引擎 :fa-shield-halved: 企业级安全

运行:

gog slides create-from-markdown "univrs 融资路演" \ --content-file ./pitch.md \ --fa-style solid \ --strict \ --debug
  • --debug输出parsed 3 slides,与文档中 3 个---分隔出的 3 页一致;
  • --strict保证三个 FA 图标只要有一个无法渲染就整体失败,避免出现缺失图标的成品;
  • 若机器上安装了mmdc,可再加入 mermaid 代码块自动生成架构图。

常见问题与最佳实践

  1. "no slides found in markdown":解析结果为空即报此错。检查文档是否只有空白,或---是否全部被误判为 frontmatter(打开后没有键值行或没有闭合的---)。
  2. 图标被跳过:确认本地存在rsvg-convertmagickconvert三者之一,且能访问cdn.jsdelivr.net。CI 里建议先探测工具链并用--strict兜底。
  3. 图表没出来:确认mmdc在 PATH(或--mmdc指向绝对路径),并留意 mmdc 失败时带出的 stderr 提示(多为 puppeteer chromium 未安装或 mermaid 语法错误)。
  4. 多列布局不生效:简写列只对layout: two-cols/three-cols生效,且同页存在显式::cols::时简写被忽略;无标题页(如hero)不适合依赖标题后的自动分列。
  5. CI 集成建议:先跑--dry-run校验解析与资源状态,再执行真实创建;输出用-j --results-only获取干净的 JSON 结果。

相关命令与文档

  • 父命令:gog slides,同组命令包括gog slides create(空白建片)、gog slides create-from-template(模板文本替换建片)、gog slides export(导出 pdf/pptx)、gog slides list-slides(列出对象 ID)等;
  • Markdown 语法完整规范:docs/slides-markdown.md;
  • 命令索引:docs/commands/README.md;
  • 相关实现:internal/cmd/slides.go、internal/slidesmarkdown、internal/cmd/slides_assets.go。

借助该命令,一份结构化的 Markdown 文档即可成为版本可控、可评审、可复用模板的演示文稿生产链路,非常适合与文档仓库、CI 流程和 LLM 生成管线集成。

【免费下载链接】gogcliGoogle Workspace in your terminal.项目地址: https://gitcode.com/GitHub_Trending/gogcl/gogcli

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询