使用pandoc和pandoc-citeproc与Jupyter笔记本

时间:2017-03-29 19:51:18

标签: python html jupyter-notebook nbconvert pypandoc

我正在开发一个基础架构,开发人员可以使用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.HTMLExporterpypandoc.convert_text()的结果,以便我主要使用内联引文和参考部分从后者添加?

1 个答案:

答案 0 :(得分:1)

我不知道这必然算作"直截了当"但我能够想出一个解决方案。它涉及编写一个继承自nbconvert.preprocessors.Preprocessor的类并实现preprocess(self, nb, resources)方法。以下是preprocess()的作用:

  1. 循环播放笔记本中的每个单元格并存储set个引文键(其格式为[@bibtex_key]
  2. 创建一个简短的文本正文,其中仅包含这些引文键,每个引号键由'\n\n'
  3. 分隔
  4. 使用上面的pandoc转换从此短文本生成HTML文本。如果num_cite是引用次数,则生成文本的第一行num_cite行将是引文的内嵌版本(例如'(作者,年份)');其余的行将是参考部分的内容。
  5. 返回每个单元格,并将每个引文的内联文本替换为其键。
  6. 使用## References
  7. 将单元格添加到笔记本中
  8. 使用引用部分
  9. 的内容向笔记本添加单元格

    现在,当HTMLExporter使用此Preprocessor转换笔记本时,结果将包含内嵌引文,参考部分以及您期望从HTMLExporter获得的所有格式