Pythonista-Issues
Pythonista-Issues copied to clipboard
Broken syntax highlighting after triple quotes
trafficstars

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'
}
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.)