VS Code的Notebook API指南先把笔记本描述为单元格及其输出构成的序列。单元格可以是Markdown或代码,由VS Code核心呈现;输出则有不同格式,一部分由核心呈现,另一部分交给扩展。这里并非一格只有一段同类文字:输入单元格的种类与输出的表示格式,在指南里分别定义。[1]
负责文件一侧的是NotebookSerializer。它将已经序列化的字节转换成NotebookData,其中含有Markdown和代码单元格;反方向则把NotebookData转换为可保存的字节。两个方向连起文件内容与编辑器中的单元格描述。控制器是否执行过代码,不在这一定义中取代序列化器的保存职责;渲染器把某份数据画出来,也不是文件字节已经随之更新的证据。[1]
紧随定义的简化Jupyter格式样例,具体展示了这个缺口。文档说,这个以.notebook为扩展名的例子可以打开文件,让用户查看纯文本和渲染后的Markdown,并编辑单元格;但输出不会持久保存到磁盘,因为还需要处理NotebookData中单元格输出的序列化与反序列化。能够显示、能够编辑与输出已经存盘,在这一个样例里确实分别成立或不成立。这个限制属于被说明的简化实现,不能反推所有Notebook都会丢失输出。[1]
代码执行由NotebookController承担。控制器取得一个代码单元格,执行其内容,产生一些输出,也可能不产生输出。它借notebookType与一种笔记本及其序列化器联系起来。于是,序列化器回答文件怎样对应单元格资料,控制器回答代码单元格怎样产生结果;二者虽然围绕同一种笔记本协作,却没有因为关联到一起就变成同一个职责。[1]
输出的数量也不必跟单元格数量一一相等。指南把输出分为Text、Error和Rich三类,并明确,一个单元格的一次执行可以提供多个输出,它们会以列表显示。Text是普通文字,Error以标准错误对象表达错误信息,Rich则允许更复杂的结果表示。一个单元格拥有一组结果条目,与其中某条结果用哪一类格式呈现,是两个不同层次。[1]
富输出还可以为同一个结果保留多种表示,分别以mimetype作为键。指南的GitHub Issue例子同时列出格式化的text/html、机器可读的text/x-json,以及供交互视图使用的application/github-issue。前两者由VS Code原生呈现;最后一种若没有注册相应NotebookRenderer,会显示错误。错误被限定在缺少对应渲染器的那种表示,并没有把同一结果已经提供的HTML和JSON一并取消。[1]
核心呈现也不是只有普通文字这一条路径。页面列出可直接显示的HTML、Markdown、图片等格式,另把text/x-json及其他text/x-LANGUAGE_ID交给内建编辑器作为代码显示。因此,机器可读数据在界面上作为代码出现,与专用渲染器提供交互视图,是两种呈现安排;同一个富输出可以提供的几种表示,仍分别留下自己的mimetype身份。[1]
NotebookRenderer的定义是取得特定mimetype的输出数据,为它提供渲染视图。指南说明,一个由多个输出单元格共享的渲染器,可以在这些单元格之间保留全局状态。其作用单位因而不必是彼此完全隔离的单格显示。指南所述视图也从静态HTML延伸到交互小程序,但这些视图形式并没有改变此前由序列化器负责文件保存、控制器负责产生输出的分工。[1]
本文只整理API指南的职责和数据关系,未安装扩展、运行单元格或查看示例图片;页面日期不作为首次发表日。
信息来源
本文基于上述公开资料整理,未使用来源页面的图片、视频或嵌入媒体。