Skip to content

Commit a10241a

Browse files
committed
Add parameters to JsCode
1 parent eda6118 commit a10241a

File tree

3 files changed

+50
-46
lines changed

3 files changed

+50
-46
lines changed

folium/template.py

+1-42
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,6 @@
1-
import json
2-
from typing import Union
3-
41
import jinja2
5-
from branca.element import Element
6-
7-
from folium.utilities import JsCode, TypeJsonValue, camelize
8-
9-
10-
def tojavascript(obj: Union[str, JsCode, dict, list, Element]) -> str:
11-
if isinstance(obj, JsCode):
12-
return obj.js_code
13-
elif isinstance(obj, Element):
14-
return obj.get_name()
15-
elif isinstance(obj, dict):
16-
out = ["{\n"]
17-
for key, value in obj.items():
18-
if isinstance(key, str):
19-
out.append(f' "{camelize(key)}": ')
20-
else:
21-
out.append(f" {key}: ")
22-
out.append(tojavascript(value))
23-
out.append(",\n")
24-
out.append("}")
25-
return "".join(out)
26-
elif isinstance(obj, list):
27-
out = ["[\n"]
28-
for value in obj:
29-
out.append(tojavascript(value))
30-
out.append(",\n")
31-
out.append("]")
32-
return "".join(out)
33-
else:
34-
return _to_escaped_json(obj)
35-
362

37-
def _to_escaped_json(obj: TypeJsonValue) -> str:
38-
return (
39-
json.dumps(obj)
40-
.replace("<", "\\u003c")
41-
.replace(">", "\\u003e")
42-
.replace("&", "\\u0026")
43-
.replace("'", "\\u0027")
44-
)
3+
from folium.utilities import tojavascript
454

465

476
class Environment(jinja2.Environment):

folium/utilities.py

+41-3
Original file line numberDiff line numberDiff line change
@@ -441,16 +441,54 @@ def get_and_assert_figure_root(obj: Element) -> Figure:
441441
class JsCode:
442442
"""Wrapper around Javascript code."""
443443

444-
def __init__(self, js_code: Union[str, "JsCode"]):
444+
def __init__(self, js_code: Union[str, "JsCode"], **kwargs):
445+
args = {k: tojavascript(v) for k, v in kwargs.items()}
445446
if isinstance(js_code, JsCode):
446-
self.js_code: str = js_code.js_code
447+
self.js_code: str = js_code.js_code % args
447448
else:
448-
self.js_code = js_code
449+
self.js_code = js_code % args
449450

450451
def __str__(self):
451452
return self.js_code
452453

453454

455+
def tojavascript(obj: Union[str, JsCode, dict, list, Element]) -> str:
456+
if isinstance(obj, JsCode):
457+
return obj.js_code
458+
elif isinstance(obj, Element):
459+
return obj.get_name()
460+
elif isinstance(obj, dict):
461+
out = ["{\n"]
462+
for key, value in obj.items():
463+
if isinstance(key, str):
464+
out.append(f' "{camelize(key)}": ')
465+
else:
466+
out.append(f" {key}: ")
467+
out.append(tojavascript(value))
468+
out.append(",\n")
469+
out.append("}")
470+
return "".join(out)
471+
elif isinstance(obj, list):
472+
out = ["[\n"]
473+
for value in obj:
474+
out.append(tojavascript(value))
475+
out.append(",\n")
476+
out.append("]")
477+
return "".join(out)
478+
else:
479+
return _to_escaped_json(obj)
480+
481+
482+
def _to_escaped_json(obj: TypeJsonValue) -> str:
483+
return (
484+
json.dumps(obj)
485+
.replace("<", "\\u003c")
486+
.replace(">", "\\u003e")
487+
.replace("&", "\\u0026")
488+
.replace("'", "\\u0027")
489+
)
490+
491+
454492
def parse_font_size(value: Union[str, int, float]) -> str:
455493
"""Parse a font size value, if number set as px"""
456494
if isinstance(value, (int, float)):

tests/test_template.py

+8-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
from branca.element import Element
22

33
from folium import JsCode
4-
from folium.template import Environment, Template, _to_escaped_json, tojavascript
4+
from folium.template import Environment, Template
5+
from folium.utilities import _to_escaped_json, tojavascript
56

67

78
def test_tojavascript_with_jscode():
@@ -72,3 +73,9 @@ def test_environment_filter():
7273

7374
def test_template_environment_class():
7475
assert Template.environment_class == Environment
76+
77+
78+
def test_jscode_with_parameters():
79+
element = Element()
80+
js_code = JsCode("var element = %(element)s", element=element)
81+
assert js_code.js_code == f"var element = {element.get_name()}"

0 commit comments

Comments
 (0)