为你的书籍页面添加元数据#

元数据是关于书籍或其内容的信息。 它通常用于控制Jupyter Book及其功能的行为。 这是一份简短的指南,介绍如何在Jupyter Book中为各种类型的内容添加元数据。

为笔记本添加元数据#

你可以通过在单元格的元数据中添加自定义标签来控制Jupyter Book的行为。这允许你执行诸如 自动隐藏代码单元格 以及 为单元格添加交互式小部件 等操作。

使用笔记本界面添加标签#

有两种直接的方式为单元格添加元数据:

  1. 使用Jupyter Notebook单元格标签编辑器。Jupyter Notebook默认附带了一个单元格标签编辑器。这使你可以快速为每个单元格添加标签。

    要启用单元格标签编辑器,点击 View -> Cell Toolbar -> Tags。这将启用标签用户界面。以下是菜单的外观。

    ../_images/tags_notebook.png

    Fig. 8 在Jupyter Notebook界面中为单元格添加标签。#

  2. 使用JupyterLab单元格标签插件。JupyterLab是一个类似于IDE的Jupyter环境,运行在你的浏览器中。它内置了一个“单元格标签”插件,提供了一个用户界面,使你可以快速插入单元格标签。

    在右上角的齿轮图标()下的“属性检查器”菜单中编辑标签。以下是JupyterLab中标签用户界面的外观。

    ../_images/tags_jupyterlab.jpg

    Fig. 9 在Jupyter Lab界面中为单元格添加标签。#

标签实际上只是单元格级别元数据的一个特殊部分。 元数据有三个级别:

  • 对于笔记本级别:在Jupyter Notebook工具栏中进入 Edit -> Edit Notebook Metadata

  • 对于单元格级别:在Jupyter Notebook工具栏中进入 View -> Cell Toolbar -> Edit Metadata,每个单元格上方将出现一个按钮。

  • 对于输出级别:使用例如 IPython.display.display(obj,metadata={"tags": []),你可以为特定输出设置元数据(但Jupyter Book目前尚未利用这一点)。

../_images/metadata_edit.png

Fig. 10 在Jupyter Notebook界面中切换单元格元数据用户界面。#

使用MyST Markdown笔记本添加标签#

如果你使用MyST Markdown编写笔记本,那么你可以在编写 {code-cell} 块时为每个代码单元格添加标签。例如,下面我们将:

```{code-cell}
:tags: [tag1,tag2,tag3]
print("some code")
```

将创建一个带有这三个标签的代码单元格。有关MyST Markdown笔记本的更多信息,请参阅 完全用 Markdown 编写的笔记本

使用Python代码添加标签#

有时你希望快速浏览笔记本的单元格,以便根据单元格的内容添加标签。例如,你可能希望使用 remove-input 标签隐藏任何包含导入语句的单元格。

以下是一个简短的Python代码片段,用于实现类似的功能。首先将目录更改为你的书籍文件夹的根目录,然后以Python脚本或Jupyter Notebook的形式运行以下脚本(根据你的需求进行修改)。最后,检查将要进行的更改并将其提交到你的仓库。

import nbformat as nbf
from glob import glob

# 收集内容文件夹中所有笔记本的列表
notebooks = glob("./content/**/*.ipynb", recursive=True)

# 在添加标签时查找的文本
text_search_dict = {
    "# HIDDEN": "remove-cell",  # 删除整个单元格
    "# NO CODE": "remove-input",  # 仅删除输入
    "# HIDE CODE": "hide-input"  # 隐藏输入,并显示按钮以显示
}

# 浏览每个笔记本并查找文本,必要时添加标签
for ipath in notebooks:
    ntbk = nbf.read(ipath, nbf.NO_CONVERT)

    for cell in ntbk.cells:
        cell_tags = cell.get('metadata', {}).get('tags', [])
        for key, val in text_search_dict.items():
            if key in cell['source']:
                if val not in cell_tags:
                    cell_tags.append(val)
        if len(cell_tags) > 0:
            cell['metadata']['tags'] = cell_tags

    nbf.write(ntbk, ipath)