@@ -441,16 +441,54 @@ def get_and_assert_figure_root(obj: Element) -> Figure:
441441class 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+
454492def 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 )):
0 commit comments