def _template_resources(self): name = type(self).__name__.lower() resources = _settings.resources(default="server") base_url = state.base_url[1:] if state.base_url.startswith( '/') else state.base_url if resources == 'server': dist_path = urljoin(base_url, LOCAL_DIST) else: dist_path = CDN_DIST # External resources css_files = dict(self._resources['css']) for cssname, css in css_files.items(): css_path = url_path(css) css_files[cssname] = dist_path + f'bundled/{name}/{css_path}' js_files = dict(self._resources['js']) for jsname, js in js_files.items(): js_path = url_path(js) js_files[jsname] = dist_path + f'bundled/{name}/{js_path}' # CSS files base_css = os.path.basename(self._css) css_files['base'] = dist_path + f'bundled/{name}/{base_css}' if self.theme: theme = self.theme.find_theme(type(self)) if theme and theme.css: basename = os.path.basename(theme.css) css_files['theme'] = dist_path + f'bundled/{name}/{basename}' return {'css': css_files, 'js': js_files}
def _update_vars(self, *args): self._render_variables['app_title'] = self.title self._render_variables['meta_name'] = self.title self._render_variables['site_title'] = self.site self._render_variables['meta_description'] = self.meta_description self._render_variables['meta_keywords'] = self.meta_keywords self._render_variables['meta_author'] = self.meta_author self._render_variables['meta_refresh'] = self.meta_refresh self._render_variables['meta_viewport'] = self.meta_viewport self._render_variables['base_url'] = self.base_url self._render_variables['base_target'] = self.base_target if os.path.isfile(self.logo): img = _panel(self.logo) if not isinstance(img, ImageBase): raise ValueError("Could not determine file type of logo: {self.logo}.") logo = img._b64() else: logo = self.logo if os.path.isfile(self.favicon): img = _panel(self.favicon) if not isinstance(img, ImageBase): raise ValueError("Could not determine file type of favicon: {self.favicon}.") favicon = img._b64() else: if _settings.resources(default='server') == 'cdn' and self.favicon == FAVICON_URL: favicon = CDN_DIST+"icons/favicon.ico" else: favicon = self.favicon self._render_variables['template_resources'] = self._template_resources() self._render_variables['app_logo'] = logo self._render_variables['app_favicon'] = favicon self._render_variables['app_favicon_type'] = self._get_favicon_type(self.favicon) self._render_variables['header_background'] = self.header_background self._render_variables['header_color'] = self.header_color self._render_variables['main_max_width'] = self.main_max_width
def load_notebook(inline=True, load_timeout=5000): from IPython.display import publish_display_data resources = INLINE if inline else CDN prev_resources = settings.resources(default="server") user_resources = settings.resources._user_value is not _Unset resources = Resources.from_bokeh(resources) try: bundle = bundle_resources(resources) bundle = Bundle.from_bokeh(bundle) configs, requirements, exports, skip_imports = require_components() ipywidget = 'ipywidgets_bokeh' in sys.modules bokeh_js = _autoload_js(bundle, configs, requirements, exports, skip_imports, ipywidget, load_timeout) finally: if user_resources: settings.resources = prev_resources else: settings.resources.unset_value() publish_display_data({ 'application/javascript': bokeh_js, LOAD_MIME: bokeh_js, }) bokeh.io.notebook.curstate().output_notebook() # Publish comm manager JS = '\n'.join([PYVIZ_PROXY, _JupyterCommManager.js_manager, nb_mime_js]) publish_display_data(data={LOAD_MIME: JS, 'application/javascript': JS})
def resources(self, absolute_url: Optional[str] = None) -> Resources: mode = settings.resources(default="server") if mode == "server": root_url = urljoin(absolute_url, self._prefix) if absolute_url else self._prefix return Resources(mode="server", root_url=root_url, path_versioner=StaticHandler.append_version) return Resources(mode=mode)
def bundled_files(model, file_type='javascript'): bdir = os.path.join(PANEL_DIR, 'dist', 'bundled', model.__name__.lower()) name = model.__name__.lower() resources = settings.resources(default='server') files = [] for url in getattr(model, f"__{file_type}_raw__", []): filepath = url_path(url) test_filepath = filepath.split('?')[0] if resources == 'server' and os.path.isfile(os.path.join(bdir, test_filepath)): files.append(f'static/extensions/panel/bundled/{name}/{filepath}') else: files.append(url) return files
def css_files(self): from ..config import config files = super(Resources, self).css_files for cssf in config.css_files: if os.path.isfile(cssf) or cssf in files: continue files.append(cssf) resources = settings.resources(default='server') dist_dir = LOCAL_DIST if resources == 'server' else CDN_DIST for cssf in glob.glob(str(DIST_DIR / 'css' / '*.css')): if resources == 'inline': break files.append(dist_dir + f'css/{os.path.basename(cssf)}') return files
def js_files(self): from ..config import config files = super(Resources, self).js_files js_files = files + list(config.js_files.values()) # Load requirejs last to avoid interfering with other libraries require_index = [i for i, jsf in enumerate(js_files) if 'require' in jsf] resources = settings.resources(default='server') dist_dir = LOCAL_DIST if resources == 'server' else CDN_DIST if require_index: requirejs = js_files.pop(require_index[0]) if any('ace' in jsf for jsf in js_files): js_files.append(dist_dir + 'pre_require.js') js_files.append(requirejs) if any('ace' in jsf for jsf in js_files): js_files.append(dist_dir + 'post_require.js') return js_files
def css_raw(self): from ..config import config raw = super(Resources, self).css_raw for cssf in config.css_files: if not os.path.isfile(cssf): continue with open(cssf) as f: css_txt = f.read() if css_txt not in raw: raw.append(css_txt) resources = settings.resources(default='server') for cssf in glob.glob(str(DIST_DIR / 'css' / '*.css')): if resources != 'inline': break with open(cssf) as f: css_txt = f.read() if css_txt not in raw: raw.append(css_txt) return raw + config.raw_css
async def get(self, *args, **kwargs): session = await self.get_session() mode = settings.resources(default="server") css_files = session.document.template_variables.get('template_css_files') resource_opts = dict(mode=mode, extra_css_files=css_files) if mode == "server": resource_opts.update({ 'root_url': self.application._prefix, 'path_versioner': StaticHandler.append_version }) resources = PanelResources(**resource_opts) page = server_html_page_for_session( session, resources=resources, title=session.document.title, template=session.document.template, template_variables=session.document.template_variables ) self.set_header("Content-Type", 'text/html') self.write(page)
def _template_resources(self): name = type(self).__name__.lower() resources = _settings.resources(default="server") if resources == 'server': base_url = state.base_url[1:] if state.base_url.startswith('/') else state.base_url dist_path = '/' + urljoin(base_url, LOCAL_DIST) else: dist_path = CDN_DIST # External resources css_files = dict(self._resources.get('css', {})) for cssname, css in css_files.items(): css_path = url_path(css) css_files[cssname] = dist_path + f'bundled/css/{css_path}' js_files = dict(self._resources.get('js', {})) for jsname, js in js_files.items(): js_path = url_path(js) js_files[jsname] = dist_path + f'bundled/js/{js_path}' js_modules = dict(self._resources.get('js_modules', {})) for jsname, js in js_modules.items(): js_path = url_path(js) if jsname in self._resources.get('tarball', {}): js_path += '/index.mjs' else: js_path += '.mjs' if os.path.isfile(DIST_DIR / 'bundled' / 'js' / js_path.replace('/', os.path.sep)): js_modules[jsname] = dist_path + f'bundled/js/{js_path}' js_files.update(self.config.js_files) js_modules.update(self.config.js_modules) extra_css = list(self.config.css_files) raw_css = list(self.config.raw_css) # CSS files base_css = self._css if not isinstance(base_css, list): base_css = [base_css] if base_css else [] for css in base_css: tmpl_name = name for cls in type(self).__mro__[1:-5]: tmpl_css = cls._css if isinstance(cls._css, list) else [cls._css] if css in tmpl_css: tmpl_name = cls.__name__.lower() css = os.path.basename(css) css_files[f'base_{css}'] = dist_path + f'bundled/{tmpl_name}/{css}' # JS files base_js = self._js if not isinstance(base_js, list): base_js = [base_js] if base_js else [] for js in base_js: tmpl_name = name for cls in type(self).__mro__[1:-5]: tmpl_js = cls._js if isinstance(cls._js, list) else [cls._js] if js in tmpl_js: tmpl_name = cls.__name__.lower() js = os.path.basename(js) js_files[f'base_{js}'] = dist_path + f'bundled/{tmpl_name}/{js}' if self.theme: theme = self.theme.find_theme(type(self)) if theme: if theme.base_css: basename = os.path.basename(theme.base_css) owner = theme.param.base_css.owner.__name__.lower() css_files['theme_base'] = dist_path + f'bundled/{owner}/{basename}' if theme.css: basename = os.path.basename(theme.css) css_files['theme'] = dist_path + f'bundled/{name}/{basename}' return { 'css': css_files, 'extra_css': extra_css, 'raw_css': raw_css, 'js': js_files, 'js_modules': js_modules }
def _template_resources(self): name = type(self).__name__.lower() resources = _settings.resources(default="server") if resources == 'server': if state.rel_path: dist_path = f'{state.rel_path}/{self._LOCAL}' else: dist_path = self._LOCAL else: dist_path = self._CDN # External resources css_files = dict(self._resources.get('css', {})) for cssname, css in css_files.items(): css_path = url_path(css) if (BUNDLE_DIR / 'css' / css_path.replace('/', os.path.sep)).is_file(): css_files[cssname] = dist_path + f'bundled/css/{css_path}' js_files = dict(self._resources.get('js', {})) for jsname, js in js_files.items(): js_path = url_path(js) if (BUNDLE_DIR / 'js' / js_path.replace('/', os.path.sep)).is_file(): js_files[jsname] = dist_path + f'bundled/js/{js_path}' js_modules = dict(self._resources.get('js_modules', {})) for jsname, js in js_modules.items(): js_path = url_path(js) if jsname in self._resources.get('tarball', {}): js_path += '/index.mjs' else: js_path += '.mjs' if os.path.isfile(BUNDLE_DIR / js_path.replace('/', os.path.sep)): js_modules[jsname] = dist_path + f'bundled/js/{js_path}' for name, js in self.config.js_files.items(): if not '//' in js and state.rel_path: js = f'{state.rel_path}/{js}' js_files[name] = js for name, js in self.config.js_modules.items(): if not '//' in js and state.rel_path: js = f'{state.rel_path}/{js}' js_modules[name] = js extra_css = [] for css in list(self.config.css_files): if not '//' in css and state.rel_path: css = f'{state.rel_path}/{css}' extra_css.append(css) raw_css = list(self.config.raw_css) # CSS files base_css = self._css if not isinstance(base_css, list): base_css = [base_css] if base_css else [] for css in base_css: tmpl_name = name for cls in type(self).__mro__[1:-5]: tmpl_css = cls._css if isinstance(cls._css, list) else [cls._css] if css in tmpl_css: tmpl_name = cls.__name__.lower() css_file = os.path.basename(css) if (BUNDLE_DIR / tmpl_name / css_file).is_file(): css_files[ f'base_{css_file}'] = dist_path + f'bundled/{tmpl_name}/{css_file}' else: with open(css, encoding='utf-8') as f: raw_css.append(f.read()) # JS files base_js = self._js if not isinstance(base_js, list): base_js = [base_js] if base_js else [] for js in base_js: tmpl_name = name for cls in type(self).__mro__[1:-5]: tmpl_js = cls._js if isinstance(cls._js, list) else [cls._js] if js in tmpl_js: tmpl_name = cls.__name__.lower() js = os.path.basename(js) if (BUNDLE_DIR / tmpl_name / js).is_file(): js_files[ f'base_{js}'] = dist_path + f'bundled/{tmpl_name}/{js}' if self.theme: theme = self.theme.find_theme(type(self)) if theme: if theme.base_css: basename = os.path.basename(theme.base_css) owner = theme.param.base_css.owner.__name__.lower() if (BUNDLE_DIR / owner / basename).is_file(): css_files[ 'theme_base'] = dist_path + f'bundled/{owner}/{basename}' else: with open(theme.base_css, encoding='utf-8') as f: raw_css.append(f.read()) if theme.css: basename = os.path.basename(theme.css) if (BUNDLE_DIR / name / basename).is_file(): css_files[ 'theme'] = dist_path + f'bundled/{name}/{basename}' else: with open(theme.base_css, encoding='utf-8') as f: raw_css.append(f.read()) return { 'css': css_files, 'extra_css': extra_css, 'raw_css': raw_css, 'js': js_files, 'js_modules': js_modules }