diff --git a/holoviews/plotting/bokeh/renderer.py b/holoviews/plotting/bokeh/renderer.py
index b581f37785..80d8ef6c47 100644
--- a/holoviews/plotting/bokeh/renderer.py
+++ b/holoviews/plotting/bokeh/renderer.py
@@ -37,9 +37,7 @@ class BokehRenderer(Renderer):
widgets = {'scrubber': BokehScrubberWidget,
'widgets': BokehSelectionWidget}
- js_dependencies = Renderer.js_dependencies + CDN.js_files
-
- css_dependencies = Renderer.css_dependencies + CDN.css_files
+ backend_dependencies = {'js': CDN.js_files, 'css': CDN.css_files}
_loaded = False
diff --git a/holoviews/plotting/renderer.py b/holoviews/plotting/renderer.py
index a4c16dd5ed..40879c6f8a 100644
--- a/holoviews/plotting/renderer.py
+++ b/holoviews/plotting/renderer.py
@@ -123,10 +123,15 @@ class Renderer(Exporter):
# Define appropriate widget classes
widgets = {'scrubber': ScrubberWidget, 'widgets': SelectionWidget}
- js_dependencies = ['https://code.jquery.com/jquery-2.1.4.min.js',
- 'https://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.20/require.min.js']
+ core_dependencies = {'jQueryUI': {'js': ['https://code.jquery.com/ui/1.10.4/jquery-ui.min.js'],
+ 'css': ['https://code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css']}}
- css_dependencies = ['https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css']
+ extra_dependencies = {'jQuery': {'js': ['https://code.jquery.com/jquery-2.1.4.min.js']},
+ 'underscore': {'js': ['https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js']},
+ 'bootstrap': {'css': ['https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css']}}
+
+ # Any additional JS and CSS dependencies required by a specific backend
+ backend_dependencies = {}
def __init__(self, **params):
super(Renderer, self).__init__(**params)
@@ -239,17 +244,9 @@ def static_html(self, obj, fmt=None, template=None):
with fields to interpolate 'js', 'css' and the main 'html'.
"""
css_html, js_html = '', ''
- js, css = self.embed_assets()
- for url in self.js_dependencies:
- js_html += '' % url
- js_html += '' % js
-
- for url in self.css_dependencies:
- css_html += '
' % url
- css_html += '' % css
-
+ js, css = self.embed_assets(jQuery=True)
if template is None: template = static_template
-
+ js_html, css_html = self.embed_assets()
html = self.html(obj, fmt)
return template.format(js=js_html, css=css_html, html=html)
@@ -340,10 +337,13 @@ class needed to render it with the current renderer.
@classmethod
- def embed_assets(cls):
+ def embed_assets(cls, core=True, extras=True, jQuery=False, backends=None):
"""
Returns JS and CSS and for embedding of widgets.
"""
+ if backends is None:
+ backends = [cls.backend] if cls.backend else []
+
# Get all the widgets and find the set of required js widget files
widgets = [wdgt for r in Renderer.__subclasses__()
for wdgt in r.widgets.values()]
@@ -358,7 +358,28 @@ def embed_assets(cls):
if f is not None )
widgetcss = '\n'.join(open(find_file(path, f), 'r').read()
for f in css if f is not None)
- return widgetjs, widgetcss
+
+ dependencies = {}
+ if core:
+ dependencies.update(cls.core_dependencies)
+ if extras:
+ dependencies.update(cls.extra_dependencies)
+ if not jQuery:
+ dependencies.pop('jQuery', None)
+ for backend in backends:
+ dependencies['backend'] = Store.renderers[backend].backend_dependencies
+
+ js_html, css_html = '', ''
+ for _, dep in sorted(dependencies.items(), key=lambda x: x[0]):
+ for js in dep.get('js', []):
+ js_html += '\n' % js
+ for css in dep.get('css', []):
+ css_html += '\n
' % css
+
+ js_html += '\n' % widgetjs
+ css_html += '\n' % widgetcss
+
+ return js_html, css_html
@classmethod
From 94dd0c497098e6267cc24992ecbb801a9b327c65 Mon Sep 17 00:00:00 2001
From: Philipp Rudiger
Date: Thu, 28 Jan 2016 17:11:20 +0000
Subject: [PATCH 3/9] Renamed Renderer.embed_assets to Renderer.html_assets
---
holoviews/ipython/__init__.py | 2 +-
holoviews/plotting/renderer.py | 6 ++----
2 files changed, 3 insertions(+), 5 deletions(-)
diff --git a/holoviews/ipython/__init__.py b/holoviews/ipython/__init__.py
index d30df3680d..a92c21af74 100644
--- a/holoviews/ipython/__init__.py
+++ b/holoviews/ipython/__init__.py
@@ -81,7 +81,7 @@ def load_hvjs(logo=False, JS=True, message='HoloViewsJS successfully loaded.'):
"""
# Evaluate load_notebook.html template with widgetjs code
if JS:
- widgetjs, widgetcss = Renderer.embed_assets(extras=False, backends=[])
+ widgetjs, widgetcss = Renderer.html_assets(extras=False, backends=[])
else:
widgetjs, widgetcss = '', ''
templateLoader = jinja2.FileSystemLoader(os.path.dirname(os.path.abspath(__file__)))
diff --git a/holoviews/plotting/renderer.py b/holoviews/plotting/renderer.py
index 40879c6f8a..c8d1e1b2d5 100644
--- a/holoviews/plotting/renderer.py
+++ b/holoviews/plotting/renderer.py
@@ -243,10 +243,8 @@ def static_html(self, obj, fmt=None, template=None):
supplied format. Allows supplying a template formatting string
with fields to interpolate 'js', 'css' and the main 'html'.
"""
- css_html, js_html = '', ''
- js, css = self.embed_assets(jQuery=True)
+ js_html, css_html = self.html_assets(jQuery=True)
if template is None: template = static_template
- js_html, css_html = self.embed_assets()
html = self.html(obj, fmt)
return template.format(js=js_html, css=css_html, html=html)
@@ -337,7 +335,7 @@ class needed to render it with the current renderer.
@classmethod
- def embed_assets(cls, core=True, extras=True, jQuery=False, backends=None):
+ def html_assets(cls, core=True, extras=True, jQuery=False, backends=None):
"""
Returns JS and CSS and for embedding of widgets.
"""
From 9616d44cd5e4aa13d5b9804bf057b88d14f17ab6 Mon Sep 17 00:00:00 2001
From: Philipp Rudiger
Date: Mon, 1 Feb 2016 14:08:58 +0000
Subject: [PATCH 4/9] Readded require.js config for slider widget
---
holoviews/plotting/widgets/jsslider.jinja | 52 ++++++++++++++++++++++-
1 file changed, 50 insertions(+), 2 deletions(-)
diff --git a/holoviews/plotting/widgets/jsslider.jinja b/holoviews/plotting/widgets/jsslider.jinja
index 902977a4dc..bf5a894278 100644
--- a/holoviews/plotting/widgets/jsslider.jinja
+++ b/holoviews/plotting/widgets/jsslider.jinja
@@ -24,7 +24,53 @@