]> git.madduck.net Git - etc/vim.git/commitdiff

madduck's git repository

Every one of the projects in this repository is available at the canonical URL git://git.madduck.net/madduck/pub/<projectpath> — see each project's metadata for the exact URL.

All patches and comments are welcome. Please squash your changes to logical commits before using git-format-patch and git-send-email to patches@git.madduck.net. If you'd read over the Git project's submission guidelines and adhered to them, I'd be especially grateful.

SSH access, as well as push access can be individually arranged.

If you use my repositories frequently, consider adding the following snippet to ~/.gitconfig and using the third clone URL listed for each project:

[url "git://git.madduck.net/madduck/"]
  insteadOf = madduck:

Handle backslashes in raw strings while normalizing (#105)
authorZsolt Dollenstein <zsol.zsol@gmail.com>
Wed, 4 Apr 2018 20:20:46 +0000 (21:20 +0100)
committerŁukasz Langa <lukasz@langa.pl>
Wed, 4 Apr 2018 20:20:46 +0000 (13:20 -0700)
In raw strings, a single backslash means a literal backslash. It is also used to escape quotes if it precedes them. This means it is impossible to change the quote type for strings that contain an unescaped version of the other quote type.
Fixes #100

black.py
tests/string_quotes.py

index 01390b3236d30f1a9ad5416f40d7322297f16032..4995b53d51b0b4b4cc4270b9595a22abd94ead17 100644 (file)
--- a/black.py
+++ b/black.py
@@ -1917,10 +1917,20 @@ def normalize_string_quotes(leaf: Leaf) -> None:
     if first_quote_pos == -1:
         return  # There's an internal error
 
     if first_quote_pos == -1:
         return  # There's an internal error
 
+    prefix = leaf.value[:first_quote_pos]
     body = leaf.value[first_quote_pos + len(orig_quote):-len(orig_quote)]
     body = leaf.value[first_quote_pos + len(orig_quote):-len(orig_quote)]
-    new_body = body.replace(f"\\{orig_quote}", orig_quote).replace(
-        new_quote, f"\\{new_quote}"
-    )
+    if "r" in prefix.casefold():
+        if body.count(new_quote) != body.count(f"\\{new_quote}"):
+            # 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}"
+        )
     if new_quote == '"""' and new_body[-1] == '"':
         # edge case:
         new_body = new_body[:-1] + '\\"'
     if new_quote == '"""' and new_body[-1] == '"':
         # edge case:
         new_body = new_body[:-1] + '\\"'
@@ -1932,7 +1942,6 @@ def normalize_string_quotes(leaf: Leaf) -> None:
     if new_escape_count == orig_escape_count and orig_quote == '"':
         return  # Prefer double quotes
 
     if new_escape_count == orig_escape_count and orig_quote == '"':
         return  # Prefer double quotes
 
-    prefix = leaf.value[:first_quote_pos]
     leaf.value = f"{prefix}{new_quote}{new_body}{new_quote}"
 
 
     leaf.value = f"{prefix}{new_quote}{new_body}{new_quote}"
 
 
index 1080aaf46dc38d5595cb5a14b9caa16c1e96696d..f2d720bbdc6520bd889d92c47aed3a7f2d3a0975 100644 (file)
@@ -15,6 +15,9 @@ f'''This is a triple-quoted {f}-string'''
 f'MOAR {" ".join([])}'
 f"MOAR {' '.join([])}"
 r"raw string ftw"
 f'MOAR {" ".join([])}'
 f"MOAR {' '.join([])}"
 r"raw string ftw"
+r'Date d\'expiration:(.*)'
+r'Tricky "quote'
+r'Not-so-tricky \"quote'
 
 # output
 
 
 # output
 
@@ -35,3 +38,6 @@ f"""This is a triple-quoted {f}-string"""
 f'MOAR {" ".join([])}'
 f"MOAR {' '.join([])}"
 r"raw string ftw"
 f'MOAR {" ".join([])}'
 f"MOAR {' '.join([])}"
 r"raw string ftw"
+r"Date d\'expiration:(.*)"
+r'Tricky "quote'
+r"Not-so-tricky \"quote"