Pythonista-Issues icon indicating copy to clipboard operation
Pythonista-Issues copied to clipboard

Broken syntax highlighting after triple quotes

Open jankais3r opened this issue 5 years ago • 1 comments
trafficstars

332BB872-5166-4220-822A-6499705A4D0A

Sample code:

def gather_used_tools(fieldname):
	code = compile('''
try:
	current = config['CURRENT'][\'''' + fieldname + '''\']
except:
	current = ''
if (current != ''):
	used_tools.append(\'''' + fieldname + '''\')
''', '<string>', 'exec')
	exec(code, globals(), globals())

def update_cli(fieldname, displayname, parsing):
	code = compile('''
try:
	current = config['CURRENT'][\'''' + fieldname + '''\']
except:
	current = ''
if (current != ''):
	try:
''' + parsing + '''
	except:
		version = 'Error'
	if ((current == version) or (version == 'Error')):
		table.append([\'''' + displayname + '''\', current, version, ''])
	else:
		table.append([\'''' + displayname + '''\', current, version, 'Update available!'])
	used_tools_counter += 1
''', '<string>', 'exec')
	exec(code, globals(), globals())

def crawl():
	ua_headers = {
		'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36'
	}

jankais3r avatar Mar 31 '20 09:03 jankais3r

For code like this I would recommend using double-quoted strings, so you don't need to escape the single quotes in the string:

def gather_used_tools(fieldname):
	code = compile("""
try:
	current = config['CURRENT']['""" + fieldname + """']
except:
	current = ''
if (current != ''):
	used_tools.append('""" + fieldname + """')
""", '<string>', 'exec')
	exec(code, globals(), globals())

def update_cli(fieldname, displayname, parsing):
	code = compile("""
try:
	current = config['CURRENT']['""" + fieldname + """']
except:
	current = ''
if (current != ''):
	try:
""" + parsing + """
	except:
		version = 'Error'
	if ((current == version) or (version == 'Error')):
		table.append(['""" + displayname + """', current, version, ''])
	else:
		table.append(['""" + displayname + """', current, version, 'Update available!'])
	used_tools_counter += 1
""", '<string>', 'exec')
	exec(code, globals(), globals())

Or you can use f-strings (requires Python 3.6 or newer, which the current Pythonista version supports):

def gather_used_tools(fieldname):
	code = compile("""
try:
	current = config['CURRENT'][{fieldname!r}]
except:
	current = ''
if (current != ''):
	used_tools.append({fieldname!r})
""", '<string>', 'exec')
	exec(code, globals(), globals())

def update_cli(fieldname, displayname, parsing):
	code = compile("""
try:
	current = config['CURRENT'][{fieldname!r}]
except:
	current = ''
if (current != ''):
	try:
{parsing}
	except:
		version = 'Error'
	if ((current == version) or (version == 'Error')):
		table.append([{displayname!r}, current, version, ''])
	else:
		table.append([{displayname!r}, current, version, 'Update available!'])
	used_tools_counter += 1
""", '<string>', 'exec')
	exec(code, globals(), globals())

Both of these variants should avoid this bug. (This is of course just a workaround and not a proper fix.)

dgelessus avatar Mar 31 '20 14:03 dgelessus