2017-02-15 126 views
1

我有多個彼此鏈接的Jupyter筆記本,以便Notebook1.ipydb包含鏈接到Notebook2.ipydb與降價[Notebook2](Notebook2.ipynb),反之亦然。如何導出和保存鏈接的Jupyter筆記本?

當通過nbconvert將所有筆記本導出爲HTML時,將保留到Notebook2.ipynb的鏈接。我想將鏈接更改爲導出的Notebook2.html,以便鏈接的HTML文件充當靜態網站。

我試圖檢測我是否正在使用get_ipython().__class__.__name__在iPython中運行,但它在轉換爲HTML之前執行此代碼

有沒有辦法檢測一個靜態文件來有條件地渲染正確的降價?有另一種方法來保存鏈接的筆記本電腦嗎?

回答

3

只有兩種選擇。一種是首先鏈接到Notebook2.html,另一種是爲nbconvert創建自定義預處理器。

from nbconvert.preprocessors import Preprocessor 
import re 


class CustomPreprocessor(Preprocessor): 

    def preprocess_cell(self, cell, resources, index): 

     if 'source' in cell and cell.cell_type == "markdown": 
      cell.source = re.sub(r"\[(.*)\]\(\1\.ipynb\)",r"[\1](\1.html)",cell.source) 

     return cell, resources 

保存這一個文件,然後添加到您的nbconvert配置文件(位於~/.jupyter/jupyter_nbconvert_config.py或者可以使用命令jupyter nbconvert --generate-config生成)行:

c.HTMLExporter.preprocessors = ['CustomPreprocessor.CustomPreprocessor']

這假設定製預處理器文件被命名爲CustomPreprocessor,並且與您要轉換的文件位於相同的目錄中。您也可以將其作爲模塊正確安裝。

+0

不錯的解決方案。對於正則表達式和'r'[\ 1](\ 2.html),我使用了'r'\ [([^]] *)\(([^)] *)\。ipynb \)「 「'替換文字。這樣鏈接文本不必與文件名的第一部分相匹配。 –

+0

@TheodoreNorvell正則表達式確實更好,因爲它更一般。很高興你喜歡我的回答:) –

+0

很酷的東西,也爲我工作。我已經有了一個'nbconvert.HTMLExporter'實例,我附加了預處理器來使用[register_preprocessor](https://ipython.org/ipython-doc/3/api/generated/IPython.nbconvert.exporters.exporter.html# IPython.nbconvert.exporters.exporter.Exporter.register_preprocessor)。這樣我不需要觸摸配置。 – Jeronimo