Skip to content

Commit

Permalink
Handle arbitrary number of backslashes during string normalization (#110
Browse files Browse the repository at this point in the history
)
  • Loading branch information
zsol authored and ambv committed Apr 5, 2018
1 parent 30d921f commit 2e0bb0f
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 4 deletions.
10 changes: 6 additions & 4 deletions black.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
from multiprocessing import Manager
import os
from pathlib import Path
import re
import tokenize
import signal
import sys
Expand Down Expand Up @@ -1922,18 +1923,19 @@ def normalize_string_quotes(leaf: Leaf) -> None:

prefix = leaf.value[:first_quote_pos]
body = leaf.value[first_quote_pos + len(orig_quote):-len(orig_quote)]
unescaped_new_quote = re.compile(r"(([^\\]|^)(\\\\)*)" + new_quote)
escaped_orig_quote = re.compile(r"\\(\\\\)*" + orig_quote)
if "r" in prefix.casefold():
if body.count(new_quote) != body.count(f"\\{new_quote}"):
if unescaped_new_quote.search(body):
# There's at least one unescaped new_quote in this raw string
# so converting is impossible
return

# Do not introduce or remove backslashes in raw strings
new_body = body
else:
new_body = body.replace(f"\\{orig_quote}", orig_quote).replace(
new_quote, f"\\{new_quote}"
)
new_body = escaped_orig_quote.sub(f"\\1{orig_quote}", body)
new_body = unescaped_new_quote.sub(f"\\1\\\\{new_quote}", new_body)
if new_quote == '"""' and new_body[-1] == '"':
# edge case:
new_body = new_body[:-1] + '\\"'
Expand Down
22 changes: 22 additions & 0 deletions tests/string_quotes.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
'\''
'"'
"'"
"\""
"Hello"
"Don't do that"
'Here is a "'
Expand All @@ -18,9 +22,20 @@
r'Date d\'expiration:(.*)'
r'Tricky "quote'
r'Not-so-tricky \"quote'
'\n\
The \"quick\"\n\
brown fox\n\
jumps over\n\
the \'lazy\' dog.\n\
'
re.compile(r'[\\"]')

# output

"'"
'"'
"'"
'"'
"Hello"
"Don't do that"
'Here is a "'
Expand All @@ -41,3 +56,10 @@
r"Date d\'expiration:(.*)"
r'Tricky "quote'
r"Not-so-tricky \"quote"
"\n\
The \"quick\"\n\
brown fox\n\
jumps over\n\
the 'lazy' dog.\n\
"
re.compile(r'[\\"]')

0 comments on commit 2e0bb0f

Please sign in to comment.