forked from jonlabelle/Trimmer
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathTrimmer.py
193 lines (142 loc) · 6.04 KB
/
Trimmer.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
# -*- coding: utf-8 -*-
import sublime
import sublime_plugin
import re
class TrimmerCommand(sublime_plugin.TextCommand):
def run(self, edit):
view = self.view
has_matches = False
matched_regions = view.find_all("[\t ]+$")
matched_regions.reverse()
for r in matched_regions:
view.erase(edit, r)
has_matches = True
if has_matches:
sublime.status_message("Trimmer: trailing whitespace removed.")
else:
sublime.status_message("Trimmer: no trailing whitespace found.")
class DeleteEmptyLinesCommand(sublime_plugin.TextCommand):
def run(self, edit):
view = self.view
reobj = re.compile("^[ \t]*$\r?\n", re.MULTILINE)
for region in self.selections(view):
str_buffer = view.substr(region)
trimmed = reobj.sub("", str_buffer)
if str_buffer == trimmed:
sublime.status_message("Trimmer: no empty lines to delete.")
else:
view.replace(edit, region, trimmed)
sublime.status_message("Trimmer: empty lines deleted.")
def selections(self, view, default_to_all=True):
regions = [r for r in view.sel() if not r.empty()]
if not regions and default_to_all:
regions = [sublime.Region(0, view.size())]
return regions
class RemoveBlankSpaces(sublime_plugin.TextCommand):
def run(self, edit):
view = self.view
reobj = re.compile(r"[ \t\r\n\v\f]")
for region in self.selections(view):
trimmed = reobj.sub("", view.substr(region))
view.replace(edit, region, trimmed)
sublime.status_message("Trimmer: blanks spaces removed.")
def selections(self, view, default_to_all=True):
regions = [r for r in view.sel() if not r.empty()]
if not regions and default_to_all:
regions = [sublime.Region(0, view.size())]
return regions
class TrimLeadingWhitespaceCommand(sublime_plugin.TextCommand):
def run(self, edit):
view = self.view
reobj = re.compile("^[ \t]+", re.MULTILINE)
for region in self.selections(view):
trimmed = reobj.sub("", view.substr(region))
view.replace(edit, region, trimmed)
sublime.status_message("Trimmer: leading whitespace removed.")
def selections(self, view, default_to_all=True):
regions = [r for r in view.sel() if not r.empty()]
if not regions and default_to_all:
regions = [sublime.Region(0, view.size())]
return regions
class TrimLeadingTrailingWhitespace(sublime_plugin.TextCommand):
def run(self, edit):
view = self.view
reobj = re.compile("^[ \t]+|[\t ]+$", re.MULTILINE)
for region in self.selections(view):
trimmed = reobj.sub("", view.substr(region))
view.replace(edit, region, trimmed)
sublime.status_message(
"Trimmer: leading and trailing whitespace removed.")
def selections(self, view, default_to_all=True):
regions = [r for r in view.sel() if not r.empty()]
if not regions and default_to_all:
regions = [sublime.Region(0, view.size())]
return regions
class CollapseLines(sublime_plugin.TextCommand):
def run(self, edit):
view = self.view
reobj = re.compile(r"(?:\s{0,})(\r?\n)(?:\s{0,})(?:\r?\n+)")
for region in self.selections(view):
str_buffer = view.substr(region)
trimmed = reobj.sub(r"\1\1", str_buffer)
if str_buffer == trimmed:
sublime.status_message("Trimmer: no lines to collapse.")
else:
view.replace(edit, region, trimmed)
sublime.status_message("Trimmer: lines collapsed.")
def selections(self, view, default_to_all=True):
regions = [r for r in view.sel() if not r.empty()]
if not regions and default_to_all:
regions = [sublime.Region(0, view.size())]
return regions
class CollapseSpaces(sublime_plugin.TextCommand):
def run(self, edit):
view = self.view
reobj = re.compile("([ ]{1})[ ]{1,}")
for region in self.selections(view):
str_buffer = view.substr(region)
trimmed = reobj.sub(r"\1", str_buffer)
if str_buffer == trimmed:
sublime.status_message("Trimmer: no spaces to collapse.")
else:
view.replace(edit, region, trimmed)
sublime.status_message("Trimmer: spaces collapsed.")
def selections(self, view, default_to_all=True):
regions = [r for r in view.sel() if not r.empty()]
if not regions and default_to_all:
regions = [sublime.Region(0, view.size())]
return regions
class TrimEdges(sublime_plugin.TextCommand):
def run(self, edit):
view = self.view
reobj = re.compile(r"(\A\s+|\s+\Z)")
if view.size() > 0:
region = sublime.Region(0, view.size())
trimmed = reobj.sub("", view.substr(region))
view.replace(edit, region, trimmed)
sublime.status_message("Trimmer: file edges trimmed.")
class ReplaceSmartCharactersCommand(sublime_plugin.TextCommand):
def run(self, edit):
view = self.view
has_matches = False
""" credit Daryl Tucker
https://github.com/daryltucker/MagiclessQuotes"""
replacements = [
[u'[’‘]{1}', u'\''],
[u'[“”]{1}', u'"'],
[u'[…]{1}', u'...'],
[u'[—]{1}', u'---'],
[u'[–]{1}', u'--'],
[u'[•]{1}', u'*'],
[u'[·]{1}', u'-'],
[u'[ ]{1}', u' ']
]
for replacement in replacements:
x = view.find_all(replacement[0])
for position in x:
view.replace(edit, position, replacement[1])
has_matches = True
if has_matches:
sublime.status_message("Trimmer: smart characters replaced.")
else:
sublime.status_message("Trimmer: no smart characters to replace.")