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
|