Source code for bokeh.util.notebook

''' Functions useful for loading Bokeh code and data in Jupyter/Zeppelin notebooks.

'''
from __future__ import absolute_import
from bokeh.core.templates import NOTEBOOK_CELL_OBSERVER

_notebook_loaded = None

# TODO (bev) notebook_type and zeppelin bits should be removed after external zeppelin hook available
[docs]def load_notebook(resources=None, verbose=False, hide_banner=False, load_timeout=5000, notebook_type='jupyter'): ''' Prepare the IPython notebook for displaying Bokeh plots. Args: resources (Resource, optional) : how and where to load BokehJS from (default: CDN) verbose (bool, optional) : whether to report detailed settings (default: False) hide_banner (bool, optional): whether to hide the Bokeh banner (default: False) load_timeout (int, optional) : Timeout in milliseconds when plots assume load timed out (default: 5000) notebook_type (string): notebook_type (default: jupyter) .. warning:: Clearing the output cell containing the published BokehJS resources HTML code may cause Bokeh CSS styling to be removed. Returns: None ''' html, js = _load_notebook_html(resources, verbose, hide_banner, load_timeout) if notebook_type=='jupyter': publish_display_data({'text/html': html}) publish_display_data({'application/javascript': js}) else: _publish_zeppelin_data(html, js)
FINALIZE_JS = """ document.getElementById("%s").textContent = "BokehJS is loading..."; """ # TODO (bev) This will eventually go away def _publish_zeppelin_data(html, js): print('%html ' + html) print('%html ' + '<script type="text/javascript">' + js + "</script>") def _load_notebook_html(resources=None, verbose=False, hide_banner=False, load_timeout=5000): global _notebook_loaded from .. import __version__ from ..core.templates import AUTOLOAD_NB_JS, NOTEBOOK_LOAD from ..util.serialization import make_id from ..util.compiler import bundle_all_models from ..resources import CDN if resources is None: resources = CDN if resources.mode == 'inline': js_info = 'inline' css_info = 'inline' else: js_info = resources.js_files[0] if len(resources.js_files) == 1 else resources.js_files css_info = resources.css_files[0] if len(resources.css_files) == 1 else resources.css_files warnings = ["Warning: " + msg['text'] for msg in resources.messages if msg['type'] == 'warn'] if _notebook_loaded and verbose: warnings.append('Warning: BokehJS previously loaded') _notebook_loaded = resources element_id = make_id() html = NOTEBOOK_LOAD.render( element_id = element_id, verbose = verbose, js_info = js_info, css_info = css_info, bokeh_version = __version__, warnings = warnings, hide_banner = hide_banner, ) custom_models_js = bundle_all_models() js = AUTOLOAD_NB_JS.render( elementid = '' if hide_banner else element_id, js_urls = resources.js_files, css_urls = resources.css_files, js_raw = resources.js_raw + [custom_models_js] + ([] if hide_banner else [FINALIZE_JS % element_id]), css_raw = resources.css_raw_str, force = True, timeout = load_timeout ) return html, js
[docs]def publish_display_data(data, source='bokeh'): ''' Compatibility wrapper for Jupyter ``publish_display_data`` Later versions of Jupyter remove the ``source`` (first) argument. This function insulates Bokeh library code from this change. Args: source (str, optional) : the source arg for Jupyter (default: "bokeh") data (dict) : the data dict to pass to ``publish_display_data`` Typically has the form ``{'text/html': html}`` ''' import IPython.core.displaypub as displaypub try: displaypub.publish_display_data(source, data) except TypeError: displaypub.publish_display_data(data)
[docs]def get_comms(target_name): ''' Create a Jupyter comms object for a specific target, that can be used to update Bokeh documents in the Jupyter notebook. Args: target_name (str) : the target name the Comms object should connect to Returns Jupyter Comms ''' from ipykernel.comm import Comm return Comm(target_name=target_name, data={})
[docs]def watch_server_cells(inner_block): ''' Installs a MutationObserver that detects deletion of cells using io.server_cell to wrap the output. The inner_block is a Javascript block that is executed when a server cell is removed from the DOM. The id of the destroyed div is in scope as the variable destroyed_id. ''' js = NOTEBOOK_CELL_OBSERVER.render(inner_block=inner_block) script = "<script type='text/javascript'>{js}</script>".format(js=js) publish_display_data({'text/html': script}, source='bokeh')