Skip to content

Commit c30f144

Browse files
committed
v1.3.2 代码结构调整
1 parent e414641 commit c30f144

File tree

4 files changed

+47
-39
lines changed

4 files changed

+47
-39
lines changed

chartspy/base.py

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,8 @@ def df2tree(df: pd.DataFrame = None, category_cols=[], value_col="") -> list:
138138
@staticmethod
139139
def convert_js_to_dict(js_code: str, print_dict: bool = True) -> dict:
140140
"""
141-
true、false替换,字段名单引号,函数变Js函数包裹
141+
转换JavaScript Object 成 python dict
142+
基础类常量替换,去除注释,字段名加单引号,函数变Js函数包裹
142143
:param js_code:
143144
:param print_dict: 是否控制台打印
144145
:return: dict
@@ -193,6 +194,33 @@ def rep1(match_obj):
193194
dict_options = eval(dict_str)
194195
return dict_options
195196

197+
@staticmethod
198+
def convert_dict_to_js(options):
199+
"""
200+
转换 python dict 成 JavaScript Object
201+
先simplejson序列化,再特殊处理函数
202+
:return: JavaScript 对象的字符串表示
203+
"""
204+
json_str = simplejson.dumps(options, indent=2, default=json_type_convert, ignore_nan=True)
205+
segs = []
206+
function_start = 0
207+
# 找到所有函数声明的起止位置,处理双引号转移,再把包裹函数的特征串删除
208+
mask_length = len(FUNCTION_BOUNDARY_MARK)
209+
for i in range(mask_length, len(json_str)):
210+
if json_str[i - mask_length - 1:i] == '"' + FUNCTION_BOUNDARY_MARK:
211+
function_start = i - mask_length
212+
elif json_str[i - mask_length - 1:i] == FUNCTION_BOUNDARY_MARK + '"':
213+
segs.append([function_start, i])
214+
left_index = 0
215+
parts = []
216+
for seg in segs:
217+
parts.append(json_str[left_index:seg[0]])
218+
parts.append(json_str[seg[0]:(seg[1] + 1)].replace('\\"', '"'))
219+
left_index = seg[1] + 1
220+
parts.append(json_str[left_index:])
221+
dict_str = "".join(parts)
222+
return re.sub('"?' + FUNCTION_BOUNDARY_MARK + '"?', "", dict_str)
223+
196224

197225
json_encoder = simplejson.JSONEncoder()
198226

chartspy/echarts.py

Lines changed: 9 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -265,22 +265,22 @@ def print_options(self, drop_data=False):
265265
series_count = len(dict_options['series'])
266266
for i in range(0, series_count):
267267
dict_options['series'][i]['data'] = []
268-
Tools.convert_js_to_dict(self.convert_to_js_options(dict_options), print_dict=True)
268+
Tools.convert_js_to_dict(Tools.convert_dict_to_js(dict_options), print_dict=True)
269269

270270
def dump_options(self):
271271
"""
272272
导出 js option字符串表示
273273
:return:
274274
"""
275-
self.js_options = self.convert_to_js_options(self.options)
275+
self.js_options = Tools.convert_dict_to_js(self.options)
276276
return self.js_options
277277

278278
def render_notebook(self) -> Html:
279279
"""
280280
在jupyter notebook 环境输出
281281
:return:
282282
"""
283-
self.js_options = self.convert_to_js_options(self.options)
283+
self.js_options = Tools.convert_dict_to_js(self.options)
284284
html = GLOBAL_ENV.from_string(JUPYTER_NOTEBOOK_TEMPLATE).render(plot=self)
285285
return Html(html)
286286

@@ -289,7 +289,7 @@ def render_jupyterlab(self) -> Html:
289289
在jupyterlab 环境输出
290290
:return:
291291
"""
292-
self.js_options = self.convert_to_js_options(self.options)
292+
self.js_options = Tools.convert_dict_to_js(self.options)
293293
html = GLOBAL_ENV.from_string(JUPYTER_LAB_TEMPLATE).render(plot=self)
294294
return Html(html)
295295

@@ -299,40 +299,20 @@ def render_file(self, path: str = "plot.html") -> Html:
299299
:param path:
300300
:return: 文件路径
301301
"""
302-
self.js_options = self.convert_to_js_options(self.options)
302+
self.js_options = Tools.convert_dict_to_js(self.options)
303303
html = GLOBAL_ENV.from_string(HTML_TEMPLATE).render(plot=self)
304304
with open(path, "w+", encoding="utf-8") as html_file:
305305
html_file.write(html)
306306
abs_path = os.path.abspath(path)
307307
return Html("<p>{path}</p>".format(path=abs_path))
308-
309-
@staticmethod
310-
def convert_to_js_options(options):
311-
json_str = simplejson.dumps(options, indent=2, default=json_type_convert, ignore_nan=True)
312-
segs = []
313-
function_start = 0
314-
mask_length = len(FUNCTION_BOUNDARY_MARK)
315-
for i in range(mask_length, len(json_str)):
316-
if json_str[i - mask_length - 1:i] == '"' + FUNCTION_BOUNDARY_MARK:
317-
function_start = i - mask_length
318-
elif json_str[i - mask_length - 1:i] == FUNCTION_BOUNDARY_MARK + '"':
319-
segs.append([function_start, i])
320-
left_index = 0
321-
parts = []
322-
for seg in segs:
323-
parts.append(json_str[left_index:seg[0]])
324-
parts.append(json_str[seg[0]:(seg[1] + 1)].replace('\\"', '"'))
325-
left_index = seg[1] + 1
326-
parts.append(json_str[left_index:])
327-
dict_str = "".join(parts)
328-
return re.sub('"?' + FUNCTION_BOUNDARY_MARK + '"?', "", dict_str)
308+
329309

330310
def render_html(self) -> str:
331311
"""
332312
渲染html字符串,可以用于 streamlit
333313
:return:
334314
"""
335-
self.js_options = self.convert_to_js_options(self.options)
315+
self.js_options = Tools.convert_dict_to_js(self.options)
336316
html = GLOBAL_ENV.from_string(HTML_TEMPLATE).render(plot=self)
337317
return html
338318

@@ -341,7 +321,7 @@ def render_html_fragment(self):
341321
渲染html 片段,方便一个网页输出多个图表
342322
:return:
343323
"""
344-
self.js_options = self.convert_to_js_options(self.options)
324+
self.js_options = Tools.convert_dict_to_js(self.options)
345325
html = GLOBAL_ENV.from_string(HTML_FRAGMENT_TEMPLATE).render(plot=self)
346326
return html
347327

@@ -350,6 +330,6 @@ def _repr_html_(self):
350330
jupyter 环境,直接输出
351331
:return:
352332
"""
353-
self.js_options = self.convert_to_js_options(self.options)
333+
self.js_options = Tools.convert_dict_to_js(self.options)
354334
html = GLOBAL_ENV.from_string(JUPYTER_ALL_TEMPLATE).render(plot=self)
355335
return Html(html).data

chartspy/g2plot.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -187,22 +187,22 @@ def print_options(self, drop_data=False):
187187
series_count = len(dict_options['series'])
188188
for i in range(0, series_count):
189189
dict_options['series'][i]['data'] = []
190-
Tools.convert_js_to_dict(self.convert_to_js_options(dict_options), print_dict=True)
190+
Tools.convert_js_to_dict(Tools.convert_dict_to_js(dict_options), print_dict=True)
191191

192192
def dump_options(self):
193193
"""
194194
导出 js option字符串表示
195195
:return:
196196
"""
197-
self.js_options = self.convert_to_js_options(self.options)
197+
self.js_options = Tools.convert_dict_to_js(self.options)
198198
return self.js_options
199199

200200
def render_notebook(self) -> Html:
201201
"""
202202
在jupyter notebook 环境输出
203203
:return:
204204
"""
205-
self.js_options = self.convert_to_js_options(self.options)
205+
self.js_options = Tools.convert_dict_to_js(self.options)
206206
html = GLOBAL_ENV.from_string(JUPYTER_NOTEBOOK_TEMPLATE).render(plot=self)
207207
return Html(html)
208208

@@ -211,7 +211,7 @@ def render_jupyterlab(self) -> Html:
211211
在jupyterlab 环境输出
212212
:return:
213213
"""
214-
self.js_options = self.convert_to_js_options(self.options)
214+
self.js_options = Tools.convert_dict_to_js(self.options)
215215
html = GLOBAL_ENV.from_string(JUPYTER_LAB_TEMPLATE).render(plot=self)
216216
return Html(html)
217217

@@ -221,7 +221,7 @@ def render_file(self, path: str = "plot.html") -> Html:
221221
:param path:
222222
:return: 文件路径
223223
"""
224-
self.js_options = self.convert_to_js_options(self.options)
224+
self.js_options = Tools.convert_dict_to_js(self.options)
225225
html = GLOBAL_ENV.from_string(HTML_TEMPLATE).render(plot=self)
226226
with open(path, "w+", encoding="utf-8") as html_file:
227227
html_file.write(html)
@@ -254,7 +254,7 @@ def render_html(self) -> str:
254254
渲染html字符串,可以用于 streamlit
255255
:return:
256256
"""
257-
self.js_options = self.convert_to_js_options(self.options)
257+
self.js_options = Tools.convert_dict_to_js(self.options)
258258
html = GLOBAL_ENV.from_string(HTML_TEMPLATE).render(plot=self)
259259
return html
260260

@@ -263,7 +263,7 @@ def render_html_fragment(self):
263263
渲染html 片段,方便一个网页输出多个图表
264264
:return:
265265
"""
266-
self.js_options = self.convert_to_js_options(self.options)
266+
self.js_options = Tools.convert_dict_to_js(self.options)
267267
html = GLOBAL_ENV.from_string(HTML_FRAGMENT_TEMPLATE).render(plot=self)
268268
return html
269269

@@ -272,6 +272,6 @@ def _repr_html_(self):
272272
jupyter 环境,直接输出
273273
:return:
274274
"""
275-
self.js_options = self.convert_to_js_options(self.options)
275+
self.js_options = Tools.convert_dict_to_js(self.options)
276276
html = GLOBAL_ENV.from_string(JUPYTER_ALL_TEMPLATE).render(plot=self)
277277
return Html(html).data

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ def get_install_requires():
2323

2424
setup(
2525
name="chartspy",
26-
version="1.3.1",
26+
version="1.3.2",
2727
url="https://chartspy.icopy.site/",
2828
description="echarts&g2plot python wrapper",
2929
keywords='echarts g2plot python ',

0 commit comments

Comments
 (0)