1

我正在开发一个基础设施,开发人员可以在其中使用 Jupyter 笔记本记录他们的验证测试。基础设施的一部分将是一个 python 脚本,它可以将他们的.ipynb文件转换为.html文件,以提供面向公众的测试文档。

使用该nbconvert模块可以完成我想要的大部分工作,但我希望在最终的 HTML 文件中允许引用和引用。我可以使用pypandoc生成 HTML 文本,将引用转换为正确的内联语法并添加参考部分:

from urllib import urlopen
import nbformat
import pypandoc
from nbconvert import MarkdownExporter

response = urlopen('SimpleExample.ipynb').read().decode()
notebook = nbformat.reads(response, as_version=4)
exporter = MarkdownExporter()
(body, resources) = exporter.from_notebook_node(notebook)

filters = ['pandoc-citeproc']
extra_args = ['--bibliography="ref.bib"',
              '--reference-links',
              '--csl=MWR.csl']
new_body = pypandoc.convert_text(body,
                                 'html',
                                 'md',
                                 filters=filters,
                                 extra_args=extra_args)

问题是这个生成的 HTML 失去了所有由nbconvert.HTMLExporter.

我的问题是,有没有一种直接的方法来合并和的结果,nbconvert.HTMLExporter这样pypandoc.convert_text()我得到的结果主要是前者,内联引用和从后者添加的参考部分?

4

1 回答 1

1

我不知道这一定算作“直截了当”,但我能够想出一个解决方案。它涉及编写一个继承nbconvert.preprocessors.Preprocessor并实现该preprocess(self, nb, resources)方法的类。这是做什么preprocess()的:

  1. 遍历笔记本中的每个单元格并存储一个set引用键(这些是形式[@bibtex_key]
  2. 创建仅包含这些引文关键字的短文本正文,每个关键字由'\n\n'
  3. 使用pandoc上面的转换从这段简短的文本中生成 HTML 文本。如果num_cite是引用数,num_cite则生成文本的第一行将是引用的内联版本(例如,'(Author, Year)');其余行将是参考部分的内容。
  4. 返回每个单元格,并用每个引文的内联文本替换其键。
  5. 将一个单元格添加到笔记本中## References
  6. 使用参考部分的内容向笔记本添加一个单元格

现在,当HTMLExporter使用 thisPreprocessor转换笔记本时,结果将包含内联引文、参考部分以及您期望从HTMLExporter.

于 2017-03-31T16:40:24.877 回答