]> git.madduck.net Git - etc/vim.git/blobdiff - black.py

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 arbitrary number of backslashes during string normalization (#110)
[etc/vim.git] / black.py
index 2ee7634c80b151e0e832a883ba7b55fa5c5b0643..9b144edb579d923d7479bdae8565f5df7507fd81 100644 (file)
--- a/black.py
+++ b/black.py
@@ -10,6 +10,7 @@ import logging
 from multiprocessing import Manager
 import os
 from pathlib import Path
+import re
 import tokenize
 import signal
 import sys
@@ -1922,8 +1923,10 @@ 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
@@ -1931,9 +1934,8 @@ def normalize_string_quotes(leaf: Leaf) -> None:
         # 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] + '\\"'