47 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			47 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import bh_plugin
 | |
| import sublime
 | |
| 
 | |
| 
 | |
| class SwapQuotes(bh_plugin.BracketPluginCommand):
 | |
|     def escaped(self, idx):
 | |
|         view = self.view
 | |
|         escaped = False
 | |
|         while idx >= 0 and view.substr(idx) == '\\':
 | |
|             escaped = ~escaped
 | |
|             idx -= 1
 | |
|         return escaped
 | |
| 
 | |
|     def run(self, edit, name):
 | |
|         view = self.view
 | |
|         quote = view.substr(self.left.begin)
 | |
|         if quote != "'" and quote != '"':
 | |
|             return
 | |
|         new = "'" if (quote == '"') else '"'
 | |
|         old = quote
 | |
|         begin = self.left.end
 | |
|         end = self.right.begin
 | |
|         content_end = self.right.begin
 | |
| 
 | |
|         view.replace(edit, self.left.toregion(), view.substr(self.left.toregion()).replace(old, new))
 | |
|         view.replace(edit, self.right.toregion(), view.substr(self.right.toregion()).replace(old, new))
 | |
| 
 | |
|         offset = 0
 | |
|         while begin < end + offset:
 | |
|             char = view.substr(begin)
 | |
|             if char == old and self.escaped(begin - 1):
 | |
|                 view.replace(edit, sublime.Region(begin - 1, begin), '')
 | |
|                 offset -= 1
 | |
|                 content_end -= 1
 | |
|             elif char == new and not self.escaped(begin - 1):
 | |
|                 view.insert(edit, begin, "\\")
 | |
|                 offset += 1
 | |
|                 content_end += 1
 | |
|             begin += 1
 | |
| 
 | |
|         self.right = self.right.move(content_end, end + offset)
 | |
|         self.selection = [sublime.Region(content_end)]
 | |
| 
 | |
| 
 | |
| def plugin():
 | |
|     return SwapQuotes
 |