Source code for bokeh.embed.notebook
#-----------------------------------------------------------------------------
# Copyright (c) 2012 - 2017, Anaconda, Inc. All rights reserved.
#
# Powered by the Bokeh Development Team.
#
# The full license is in the file LICENSE.txt, distributed with this software.
#-----------------------------------------------------------------------------
'''
'''
#-----------------------------------------------------------------------------
# Boilerplate
#-----------------------------------------------------------------------------
from __future__ import absolute_import, division, print_function, unicode_literals
import logging
log = logging.getLogger(__name__)
from bokeh.util.api import public, internal ; public, internal
#-----------------------------------------------------------------------------
# Imports
#-----------------------------------------------------------------------------
# Standard library imports
from contextlib import contextmanager
# External imports
# Bokeh imports
from ..core.templates import DOC_JS
from ..core.json_encoder import serialize_json
from ..settings import settings
from ..util.string import encode_utf8
from .util import FromCurdoc
from .util import check_one_model_or_doc, div_for_render_item, find_existing_docs, standalone_docs_json_and_render_items
#-----------------------------------------------------------------------------
# Globals and constants
#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
# Public API
#-----------------------------------------------------------------------------
@public((1,0,0))
[docs]def notebook_content(model, notebook_comms_target=None, theme=FromCurdoc):
''' Return script and div that will display a Bokeh plot in a Jupyter
Notebook.
The data for the plot is stored directly in the returned HTML.
Args:
model (Model) : Bokeh object to render
notebook_comms_target (str, optional) :
A target name for a Jupyter Comms object that can update
the document that is rendered to this notebook div
theme (Theme, optional) :
Defaults to the ``Theme`` instance in the current document.
Setting this to ``None`` uses the default theme or the theme
already specified in the document. Any other value must be an
instance of the ``Theme`` class.
Returns:
script, div, Document
.. note::
Assumes :func:`~bokeh.io.notebook.load_notebook` or the equivalent
has already been executed.
'''
model = check_one_model_or_doc(model)
# Comms handling relies on the fact that the new_doc returned here
# has models with the same IDs as they were started with
with _ModelInEmptyDocument(model, apply_theme=theme) as new_doc:
(docs_json, render_items) = standalone_docs_json_and_render_items([model])
item = render_items[0]
if notebook_comms_target:
item['notebook_comms_target'] = notebook_comms_target
else:
notebook_comms_target = ''
script = DOC_JS.render(
docs_json=serialize_json(docs_json),
render_items=serialize_json(render_items)
)
div = div_for_render_item(item)
return encode_utf8(script), encode_utf8(div), new_doc
#-----------------------------------------------------------------------------
# Internal API
#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
# Private API
#-----------------------------------------------------------------------------
@contextmanager
def _ModelInEmptyDocument(model, apply_theme=None):
# Note: Comms handling relies on the fact that the new_doc returned
# has models with the same IDs as they were started with
from ..document import Document
doc = find_existing_docs([model])
if apply_theme is FromCurdoc:
from ..io import curdoc; curdoc
doc.theme = curdoc().theme
elif apply_theme is not None:
doc.theme = apply_theme
model._document = None
for ref in model.references():
ref._document = None
new_doc = Document()
new_doc.add_root(model)
if settings.perform_document_validation():
new_doc.validate()
yield new_doc
model._document = doc
for ref in model.references():
ref._document = doc
#-----------------------------------------------------------------------------
# Code
#-----------------------------------------------------------------------------