optimize embedded javascript rendering.

This commit is contained in:
Singu 2023-03-31 13:33:33 +08:00
parent 0078c6ec3b
commit 9c79761091
8 changed files with 31 additions and 17 deletions

View File

@ -63,6 +63,7 @@ class Base(ChartMixin):
self._geo_json_name: Optional[str] = None
self._geo_json: Optional[dict] = None
self.render_options.update(embed_js=bool(_render_opts.get("embed_js")))
self._render_cache: dict = dict()
def get_chart_id(self) -> str:
@ -86,24 +87,18 @@ class Base(ChartMixin):
path: str = "render.html",
template_name: str = "simple_chart.html",
env: Optional[Environment] = None,
inner: bool = False,
**kwargs,
) -> str:
self._prepare_render()
if inner:
kwargs = {'_inner': inner, '_javascript': self.load_javascript().load_javascript_contents(), **kwargs}
return engine.render(self, path, template_name, env, **kwargs)
def render_embed(
self,
template_name: str = "simple_chart.html",
env: Optional[Environment] = None,
inner: bool = False,
**kwargs,
) -> str:
self._prepare_render()
if inner:
kwargs = {'_inner': inner, '_javascript': self.load_javascript().load_javascript_contents(), **kwargs}
return engine.render_embed(self, template_name, env, **kwargs)
def render_notebook(self):
@ -121,6 +116,12 @@ class Base(ChartMixin):
self.json_contents = self.dump_options()
self._use_theme()
self._render_cache.clear()
if self.render_options.get('embed_js'):
self._render_cache['javascript'] = (
self.load_javascript().load_javascript_contents()
)
def default(o):
if isinstance(o, (datetime.date, datetime.datetime)):

View File

@ -182,7 +182,7 @@ class InitOpts(BasicOpts):
class RenderOpts(BasicOpts):
def __init__(self, embed_js: bool = True):
def __init__(self, embed_js: bool = False):
self.opts: dict = {
"embed_js": embed_js,
}

View File

@ -80,18 +80,19 @@
</script>
{%- endmacro %}
{%- macro render_chart_dependencies(c, i, js) -%}
{% if i %}
{%- macro render_chart_dependencies(c) -%}
{% if 'embed_js' in c.render_options and 'javascript' in c._render_cache and c.render_options.embed_js -%}
{% set _javascript = c._render_cache.javascript %}
{% for dep in c.dependencies %}
<script type="text/javascript">
{{ js.javascript_contents[dep] }}
{{ _javascript.javascript_contents[dep] }}
</script>
{% endfor %}
{% else %}
{%- else -%}
{% for dep in c.dependencies %}
<script type="text/javascript" src="{{ dep }}"></script>
{% endfor %}
{% endif %}
{%- endif %}
{%- endmacro %}
{%- macro render_chart_css(c) -%}

View File

@ -4,7 +4,7 @@
<head>
<meta charset="UTF-8">
<title>{{ chart.page_title }}</title>
{{ macro.render_chart_dependencies(chart, _inner, _javascript) }}
{{ macro.render_chart_dependencies(chart) }}
</head>
<body {% if chart.fill_bg %}style="background-color: {{ chart.bg_color }}"{% endif %}>
{{ macro.render_chart_content(chart) }}

View File

@ -4,7 +4,7 @@
<head>
<meta charset="UTF-8">
<title>{{ chart.page_title }}</title>
{{ macro.render_chart_dependencies(chart, _inner, _javascript) }}
{{ macro.render_chart_dependencies(chart) }}
</head>
<body>
<div id="{{ chart.chart_id }}" style="width:{{ chart.width }}; height:{{ chart.height }};"></div>

View File

@ -4,7 +4,7 @@
<head>
<meta charset="UTF-8">
<title>{{ chart.page_title }}</title>
{{ macro.render_chart_dependencies(chart, _inner, _javascript) }}
{{ macro.render_chart_dependencies(chart) }}
{{ macro.render_chart_css(chart) }}
</head>
<body {% if chart.page_border_color != '' %}style="background-color: {{ chart.page_border_color }}"{% endif %}>

View File

@ -4,7 +4,7 @@
<head>
<meta charset="UTF-8">
<title>{{ chart.page_title }}</title>
{{ macro.render_chart_dependencies(chart, _inner, _javascript) }}
{{ macro.render_chart_dependencies(chart) }}
{{ macro.render_chart_css(chart) }}
</head>
<body {% if chart.bg_color != '' %}style="background-color: {{ chart.bg_color }}"{% endif %}>

View File

@ -1,7 +1,7 @@
from datetime import datetime
from unittest.mock import patch
from nose.tools import assert_equal, assert_not_in
from nose.tools import assert_equal, assert_in, assert_not_in
from pyecharts.charts import Bar
from pyecharts.commons import utils
@ -50,6 +50,18 @@ def test_render_js_host_none(fake_writer):
assert_equal(bar.js_host, CurrentConfig.ONLINE_HOST)
@patch("pyecharts.render.engine.write_utf8_html_file")
def test_render_embed_js(_):
c = Base(render_opts=RenderOpts(embed_js=True))
# Embedded JavaScript
content = c.render_embed()
assert_not_in(CurrentConfig.ONLINE_HOST, content, 'Embedding JavaScript fails')
# No embedded JavaScript
c.render_options.update(embed_js=False)
content = c.render_embed()
assert_in(CurrentConfig.ONLINE_HOST, content, 'Embedded JavaScript cannot be closed')
def test_base_render_options():
c0 = Base(render_opts=RenderOpts(embed_js=True))
assert_equal(c0.render_options.get('embed_js'), True)