我如何(可以)在Jupyter笔记本下使用custom.js文件?

时间:2015-08-23 18:46:08

标签: ipython ipython-notebook jupyter-notebook jupyter

在IPython笔记本(例如v3.1)中,我可以添加~/.ipython/profile_default/static/custom/custom.js文件来执行一些自定义JavaScript。例如,我可以这样做:

require(['base/js/namespace', 'base/js/events'], function(IPython, events) {
    console.log("A");
    events.on('app_initialized.NotebookApp', function() {
        console.log("B");
    });
    console.log("C");
});

然后,在JS控制台中,我会看到A,然后是B,然后是C

现在,从版本4.0开始,他们已将其拆分为Jupyter笔记本。加载相同的文件(尽管它在~/.ipython下,而不是在~/.jupyter下),并且代码被执行。但是,我不再看到B行。我猜这个应用程序没有初始化。我仍然看到它在source code中被触发,但是后来会发生,还是只是不起作用?

我如何让事情再次发挥作用?我不需要等待app_initialized了吗?是否有任何记录?

修改

This page似乎建议现在这样做的方法是创建自定义扩展并将所有操作放在load_ipython_extension函数中。是对的吗?如果是这样,mathjax怎么样?和CodeMirror选项?

4 个答案:

答案 0 :(得分:10)

使用custom.js对我来说仍然有效,但它似乎有点移动。

目前(版本4.2.3)以及即将发布的5.0版本的文档,它位于~/.jupyter/custom/custom.js。请参阅http://jupyter-notebook.readthedocs.io/en/latest/examples/Notebook/JavaScript%20Notebook%20Extensions.html#custom.js

上的文档

您可以通过在笔记本中执行此代码段来显示custom.js的路径和内容:

from jupyter_core.paths import jupyter_config_dir
jupyter_dir = jupyter_config_dir()
import os.path
custom_js_path = os.path.join(jupyter_dir, 'custom', 'custom.js')
print("searching for custom.js in ", custom_js_path)
#  my custom js
if os.path.isfile(custom_js_path):
    with open(custom_js_path) as f:
        print(f.read())
else:
    print("You don't have a custom.js file")

答案 1 :(得分:6)

  

我如何让事情再次发挥作用?我不需要等待   app_initialized了吗?

我对推荐的方法没有深入的了解,但是使用Jupyter / IPython 4.0,等待“notebook_loaded.Notebook”而不是“app_initialized.NotebookApp”有效。即使用这一行:

    events.on("notebook_loaded.Notebook", function () {

答案 2 :(得分:5)

此问题已在Github问题跟踪器Issues with jupyter 4.0上出现 - 并且链接到最近的更新,似乎可以简化扩展程序的加载:code update

"手动编辑 notebook.json 。默认情况下,它位于〜/ .jupyter / nbconfig / notebook.json :"

{
    "load_extensions": {
      "notify": true,
      "theme_toggle": true
  }
}

添加"code_folding/main": true等内容似乎也有效。

所以我的理解是,这会取代使用custom.js来加载扩展程序吗?

答案 3 :(得分:3)

如果您查看笔记本static/notebook/js/main.js代码,app_initialized.NotebookApp事件仍会被触发。

但是您必须使用requireJS中的define()函数来监听此事件:

define([
  'base/js/namespace',
  'base/js/events'
], function(IPython, events) {
   events.on('app_initialized.NotebookApp', function() {
     // Your Code
   });
});

此处您的回调将被执行。

如果你输入custom.js

 require(['base/js/namespace', 'base/js/events'], function(IPython, events) {
     events.on('notebook_loaded.Notebook', function() {
        console.log('require & notebook_loaded.Notebook');
    });
     events.on('app_initialized.NotebookApp', function() {
        console.log('require & app_initialized.NotebookApp');
     });
 });

 define(['base/js/namespace', 'base/js/events'], function(IPython, events) {
     events.on('notebook_loaded.Notebook', function() {
        console.log('define & notebook_loaded.Notebook');
    });
     events.on('app_initialized.NotebookApp', function() {
         console.log('define & app_initialized.NotebookApp');
     });
 });

控制台中的结果将是:

define() & app_initialized.NotebookApp
define() & notebook_loaded.Notebook
require() & notebook_loaded.Notebook

我猜你用require()注册已经发生的事件......

require()正在等待所有依赖项和子模块初始化......对于app_initialized.NotebookApp事件来说可能为时已晚。