jupyter nbconvert:转换为降价 and/or html 排除标记为“跳过”的幻灯片

jupyter nbconvert: convert to markdown and/or html excluding slides marked as `skip`

背景

我有一个笔记本,我可以使用以下方法导出到 reveal.js 个幻灯片:

jupyter nbconvert "${executed_nb_path}" \
    --to slides \
    --SlidesExporter.reveal_scroll=True \
    --TemplateExporter.exclude_input=True \
    --no-prompt

排除 个具有单元格元数据的单元格:

{
  "slideshow": {
    "slide_type": "skip"
  }
}

问题

如何导出为其他输出格式,例如 htmlmd,并且对单元格元数据应用相同的预处理?如果可能的话,我希望能够在命令行上执行此操作(例如,通过为预处理设置命令行参数),而不是创建 python 脚本。

我试过的

  1. 试图计算出要添加的正确“traitlet”参数:docs here

    • 没有骰子 --TagRemovePreprocessor.remove_cell_tags='slideshow.slide_type="skip"'
  2. 查看源代码了解预处理是如何完成的:

TagRemoveProprocessor 需要 tags 单元格元数据才能工作

您可以通过转到“查看”->“单元格”工具栏->“标签”来添加标签。

如果您添加了 skip 标签,其后的单元格元数据将如下所示:

"metadata": {
 "tags": [
  "skip"
 ]
},

例如:如果你想将其转换为 markdown 那么你可以将 markdown 作为值传递给 --to flag

jupyter nbconvert sample.ipynb \
    --to markdown \
    --no-prompt \
    --TagRemovePreprocessor.remove_cell_tags={\"skip\"} \
    --TemplateExporter.exclude_input=True

对于最新的 nbconvert 命令可以重写为:

jupyter nbconvert sample.ipynb \
    --to markdown \
    --no-prompt \
    --TagRemovePreprocessor.remove_cell_tags "skip" \
    --TemplateExporter.exclude_input=True

nbconvert 支持 html, markdown 作为输出,对于其他支持的输出检查 这里

解决方案

您可以使用这些命令中的任何一个将跳过标签添加到包含幻灯片键的元数据,然后将其与 TagRemoveProprocessor 一起使用以删除单元格

JQ

cat sample.ipynb | jq '.cells[].metadata |= if .slideshow.slide_type == "skip" then (.+ {tags: ["skip"]}) else . end' > new_sample.ipynb

SED -(mac 需要更改)

sed '/"slideshow": {/N;/.*"slide_type":\ "skip"/i\ \ \ \ "tags":["skip"],' sample.ipynb > new_sample.ipynb

然后你可以使用上面的jupyter命令删除单元格。

备注:

  • TemplateExporter.exclude_input=True 删除所有输入单元格对输出单元格没有任何作用
  • TagRemovePreprocessor.remove_cell_tags 删除包含指定标签的输入输出单元格
  • TagRemovePreprocessor.remove_input_tags 删除包含指定标签的输入单元格对输出单元格没有任何作用
  • TagRemovePreprocessor.remove_all_outputs_tags 删除所有包含指定标签的输出单元格 不删除相关的输入标签
  • 这两个命令可以加在一起创建一行。
  • 正如@JamesOwers 所指出的-如果您在 mac 上使用 SED 命令,您需要使用可以使用 brew 安装的 gnu-sed - brew install gnu-sed 然后只需将 sed 更改为 gsed.