-
Notifications
You must be signed in to change notification settings - Fork 0
/
sublime-caser.py
156 lines (134 loc) · 5.7 KB
/
sublime-caser.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
import regex as re
import sublime
import sublime_plugin
EDGE_RE = re.compile(r"""
# ABBRCamelCase
\p{Lu}+(?=\p{Lu}\p{Ll})
# CamelCase
|\p{Lu}+[\p{Ll}\d]*
# Other cases
|[\p{Ll}\d]+
""", re.VERBOSE)
class Words(list):
@classmethod
def from_str(cls, src):
return cls(val.group() for val in EDGE_RE.finditer(src))
def lower(self): return self.map(lower)
def upper(self): return self.map(upper)
def title(self): return self.map(title)
def sentence(self): return self.lower().map_head(title)
def initials(self): return self.map(initial)
def spaced(self): return " ".join(self)
def snake(self): return "_".join(self)
def kebab(self): return "-".join(self)
def solid(self): return "".join(self)
def camel(self): return self.map_head(norm).map_tail(title).solid()
def camel_lower(self): return self.title().map_head(lower).solid()
def camel_title(self): return self.title().solid()
def map(self, fun):
for ind in range(len(self)):
self[ind] = fun(self[ind])
return self
def map_head(self, fun):
if len(self) > 0:
self[0] = fun(self[0])
return self
def map_tail(self, fun):
for ind in range(1, len(self)):
self[ind] = fun(self[ind])
return self
def lower(val): return val.lower()
def title(val): return val.title()
def upper(val): return val.upper()
def norm(val): return val[0] + val[1:].lower()
def to_spaced(val): return Words.from_str(val).spaced()
def to_spaced_lower(val): return Words.from_str(val).lower().spaced()
def to_spaced_title(val): return Words.from_str(val).title().spaced()
def to_spaced_upper(val): return Words.from_str(val).upper().spaced()
def to_camel(val): return Words.from_str(val).camel()
def to_camel_lower(val): return Words.from_str(val).camel_lower()
def to_camel_title(val): return Words.from_str(val).camel_title()
def to_snake(val): return Words.from_str(val).snake()
def to_snake_lower(val): return Words.from_str(val).lower().snake()
def to_snake_title(val): return Words.from_str(val).title().snake()
def to_snake_upper(val): return Words.from_str(val).upper().snake()
def to_kebab(val): return Words.from_str(val).kebab()
def to_kebab_lower(val): return Words.from_str(val).lower().kebab()
def to_kebab_title(val): return Words.from_str(val).title().kebab()
def to_kebab_upper(val): return Words.from_str(val).upper().kebab()
def to_initials(val): return Words.from_str(val).initials().solid()
def to_initials_lower(val): return Words.from_str(val).initials().lower().solid()
def to_initials_upper(val): return Words.from_str(val).initials().upper().solid()
def replace_by(view, edit, fun):
for region in view.sel():
if region.empty():
continue
view.replace(edit, region, fun(view.substr(region)))
def to_case(val, typ):
if typ == "sentence_lower":
return to_spaced_lower(val)
if typ == "sentence_title":
return to_spaced_title(val)
if typ == "sentence_upper":
return to_spaced_upper(val)
if typ == "camel_lower":
return to_camel_lower(val)
if typ == "camel_title":
return to_camel_title(val)
if typ == "snake_lower":
return to_snake_lower(val)
if typ == "snake_title":
return to_snake_title(val)
if typ == "snake_upper":
return to_snake_upper(val)
if typ == "kebab_lower":
return to_kebab_lower(val)
if typ == "kebab_title":
return to_kebab_title(val)
if typ == "kebab_upper":
return to_kebab_upper(val)
if typ == "initials_lower":
return to_initials_lower(val)
if typ == "initials_upper":
return to_initials_upper(val)
raise Exception("unknown case format {}".format(typ))
def cmd(name, fun):
class cmd(sublime_plugin.TextCommand):
def run(self, edit):
replace_by(self.view, edit, fun)
cmd.__name__ = name
return cmd
caser_spaced = cmd("caser_spaced", to_spaced)
caser_spaced_lower = cmd("caser_spaced_lower", to_spaced_lower)
caser_spaced_title = cmd("caser_spaced_title", to_spaced_title)
caser_spaced_upper = cmd("caser_spaced_upper", to_spaced_upper)
caser_camel = cmd("caser_camel", to_camel)
caser_camel_lower = cmd("caser_camel_lower", to_camel_lower)
caser_camel_title = cmd("caser_camel_title", to_camel_title)
caser_snake = cmd("caser_snake", to_snake)
caser_snake_lower = cmd("caser_snake_lower", to_snake_lower)
caser_snake_title = cmd("caser_snake_title", to_snake_title)
caser_snake_upper = cmd("caser_snake_upper", to_snake_upper)
caser_kebab = cmd("caser_kebab", to_kebab)
caser_kebab_lower = cmd("caser_kebab_lower", to_kebab_lower)
caser_kebab_title = cmd("caser_kebab_title", to_kebab_title)
caser_kebab_upper = cmd("caser_kebab_upper", to_kebab_upper)
caser_initials = cmd("caser_initials", to_initials)
caser_initials_lower = cmd("caser_initials_lower", to_initials_lower)
caser_initials_upper = cmd("caser_initials_upper", to_initials_upper)
class caser_go_tag(sublime_plugin.TextCommand):
def run(self, edit, tags):
view = self.view
for region in view.sel():
if region.empty():
continue
view.replace(edit, region, go_tags(view.substr(region), tags))
def go_tags(src, tags):
return " ".join(go_tag(src, **tag) for tag in tags)
def go_tag(src, tag, case, omitempty = False):
return tag + ":" + sublime.encode_value(go_tag_value(src, case, omitempty))
def go_tag_value(src, case, omitempty = False):
src = to_case(src, case)
if omitempty:
return src + ",omitempty"
return src