Skip to content

Commit 98ba0c7

Browse files
committed
Added support for concatenation operator in JS literal strings when parsed by .from_js_literal(). Closes #185.
1 parent beebf42 commit 98ba0c7

File tree

2 files changed

+22
-1
lines changed

2 files changed

+22
-1
lines changed

highcharts_core/js_literal_functions.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -581,6 +581,25 @@ def convert_js_property_to_python(property_definition, original_str = None):
581581
elif property_definition.value.type == 'ClassExpression':
582582
return JavaScriptClass._convert_from_js_ast(property_definition.value,
583583
original_str)
584+
elif property_definition.value.type == 'BinaryExpression':
585+
property_value = property_definition.value
586+
operator = property_value.operator
587+
left, right = property_value.left, property_value.right
588+
left_type, right_type = left.type, right.type
589+
590+
if (left_type not in ['Literal']) or (right_type not in ['Literal']):
591+
raise errors.HighchartsParseError(f'unable to find two Literal values within'
592+
f'a Binary expression. Found: '
593+
f'{left_type, right_type}')
594+
595+
left_value, right_value = left.value, right.value
596+
if operator not in ['+', '-', '/']:
597+
raise errors.HighchartsParseError(f'operator "{operator}" not supported within '
598+
f'Binary expression parsing')
599+
left_value = validators.string(left_value, allow_empty = False)
600+
right_value = validators.string(right_value, allow_empty = False)
601+
602+
return left_value + right_value
584603
elif property_definition.value.type == 'CallExpression':
585604
expression = property_definition.value
586605
try:
@@ -650,6 +669,7 @@ def convert_js_to_python(javascript, original_str = None):
650669
'ObjectExpression',
651670
'ArrayExpression',
652671
'UnaryExpression',
672+
'BinaryExpression',
653673
'FunctionExpression'):
654674
raise errors.HighchartsParseError(f'javascript should contain a '
655675
f'Property, Literal, ObjectExpression, '

tests/test_js_literal_functions.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ def test_get_key_value_pairs(original_str, override, expected, error):
139139
("""const testObj = {item1:'test string'}""", None, 'test string', None),
140140
("""const testObj = {item1:undefined}""", None, None, None),
141141
("""const testObj = {item1:null}""", None, constants.EnforcedNull, None),
142-
142+
143143
('', 'not-a-literal', None, errors.HighchartsParseError),
144144
])
145145
def test_convert_js_literal_to_python(original_str, override, expected, error):
@@ -170,6 +170,7 @@ def test_convert_js_literal_to_python(original_str, override, expected, error):
170170
("""const testObj = {item1:null}""", None, constants.EnforcedNull, None),
171171
("""const testObj = {item1:[1,2]}""", None, [1,2], None),
172172
("""const testObj = {item1:{subitem:'test'}}""", None, {'subitem': 'test'}, None),
173+
("""const testObj = {item1:'abc' + 'def'}""", None, 'abcdef', None),
173174
174175
('', 'not-a-property', None, errors.HighchartsParseError),
175176
])

0 commit comments

Comments
 (0)