]> 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 arbitrary number of backslashes during string normalization (#110)
authorZsolt Dollenstein <zsol.zsol@gmail.com>
Thu, 5 Apr 2018 09:28:46 +0000 (10:28 +0100)
committerŁukasz Langa <lukasz@langa.pl>
Thu, 5 Apr 2018 09:28:46 +0000 (02:28 -0700)
black.py
tests/string_quotes.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
 from multiprocessing import Manager
 import os
 from pathlib import Path
+import re
 import tokenize
 import signal
 import sys
 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)]
 
     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 "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
             # 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:
         # 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] + '\\"'
     if new_quote == '"""' and new_body[-1] == '"':
         # edge case:
         new_body = new_body[:-1] + '\\"'
index f2d720bbdc6520bd889d92c47aed3a7f2d3a0975..c66b6ee8fbd17bdf08b608f21b1d6718832abfd9 100644 (file)
@@ -1,3 +1,7 @@
+'\''
+'"'
+"'"
+"\""
 "Hello"
 "Don't do that"
 'Here is a "'
 "Hello"
 "Don't do that"
 'Here is a "'
@@ -18,9 +22,20 @@ r"raw string ftw"
 r'Date d\'expiration:(.*)'
 r'Tricky "quote'
 r'Not-so-tricky \"quote'
 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
 
 
 # output
 
+"'"
+'"'
+"'"
+'"'
 "Hello"
 "Don't do that"
 'Here is a "'
 "Hello"
 "Don't do that"
 'Here is a "'
@@ -41,3 +56,10 @@ r"raw string ftw"
 r"Date d\'expiration:(.*)"
 r'Tricky "quote'
 r"Not-so-tricky \"quote"
 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'[\\"]')