コード例 #1
0
ファイル: base.py プロジェクト: yxlaoban118/panel
    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}
コード例 #2
0
ファイル: base.py プロジェクト: rmorshea/panel
 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
コード例 #3
0
ファイル: notebook.py プロジェクト: rmorshea/panel
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})
コード例 #4
0
 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)
コード例 #5
0
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
コード例 #6
0
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
コード例 #7
0
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
コード例 #8
0
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
コード例 #9
0
    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)
コード例 #10
0
ファイル: base.py プロジェクト: rmorshea/panel
    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
        }
コード例 #11
0
ファイル: base.py プロジェクト: JackDapid/panel
    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
        }