我正在开发一个基础设施,开发人员可以使用 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()
的结果,以便我得到的大部分是前者,以及内联引用和从后者添加的引用部分?
最佳答案
我不知道这是否一定算“直接”,但我能够想出一个解决方案。它涉及编写一个继承于 nbconvert.preprocessors.Preprocessor 的类并实现 preprocess(self, nb, resources) 方法。这是 preprocess()
的作用:
- 循环笔记本中的每个单元格并存储一组
引文键
(其格式为[@bibtex_key]
- 创建仅包含这些引文键的简短文本正文,每个引文键均以
'\n\n'
分隔 - 使用上面的
pandoc
转换从这段简短的文本中生成 HTML 文本。如果num_cite
是引用次数,则生成文本的前num_cite
行将是引用的内联版本(例如“(Author, Year)”);其余行将是引用文献部分的内容。 - 返回每个单元格,并将每个引文的内嵌文本替换为其关键字。
- 使用
## References
将单元格添加到笔记本 - 向笔记本添加一个包含引用部分内容的单元格
现在,当 HTMLExporter
使用此预处理器
转换笔记本时,结果将包含内联引用、引用部分以及您期望的所有格式HTMLExporter
。
关于python - 将 pandoc 和 pandoc-citeproc 与 Jupyter Notebook 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43102881/