-
Notifications
You must be signed in to change notification settings - Fork 3
/
ModuleAutoComplete.py
176 lines (145 loc) · 4.53 KB
/
ModuleAutoComplete.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
import sublime, sublime_plugin, os
import re
class DoobleIO():
@staticmethod
def is_admin(file_name):
lis = file_name.split("\\")
if 'admin' in file_name:
return True
return False
@staticmethod
def is_content(file_name):
lis = file_name.split("\\")
if 'content' in file_name:
return True
return False
@staticmethod
def is_module(file_name):
lis = file_name.split("\\")
if 'module' in file_name:
return True
return False
@staticmethod
def is_ui(sel):
return re.match(r'\[\[ui/?.+\]\]', sel, re.IGNORECASE)
@staticmethod
def cut_path(file_name):
lis = []
left_path = ""
right_path = ""
if 'sites' in file_name:
lis = file_name.split('sites')
left_path = lis[0]
print('sites' + lis[1])
right_path = 'sites' + lis[1]
elif 'site' in file_name:
lis = file_name.split('site')
left_path = lis[0]
right_path = 'site' + lis[1]
return(left_path, right_path)
@staticmethod
def check_file_type(file_n):
left_path, file_name = DoobleIO.cut_path(file_n)
# print("left path: " + left_path)
# print("file name of cut: " + file_name)
a_type = ""
if DoobleIO.is_module(file_name) or DoobleIO.is_content(file_name):
a_type = '\\Content\\Modules'
print("module file or content folder")
elif DoobleIO.is_admin(file_name):
a_type = '\\Admin'
print("admin file")
return a_type
class ModuleAutoCompleteCommand(sublime_plugin.EventListener):
SCOPE_NAME = 'text.html.pp.module';
def on_query_completions(self, view, prefix, locations):
# print(locations)
# print(view.scope_name(locations[0]))
if self.SCOPE_NAME in view.scope_name(locations[0]):
autocomplete_list = self.getDirs(view)
return autocomplete_list
def getDirs(self, view):
# get user selection
selection = self.user_selection(view)
# check if it's ui controls
is_ui = DoobleIO.is_ui(selection)
modulesList = []
folders = sublime.active_window().folders()
# print (folders[0].lower().endswith('sites'))
if folders[0].lower().endswith('sites'):
folders = self.get_immediate_subdirectories(folders[0])
# print(folders)
# check if it's module or admin or ui
file_name = sublime.active_window().active_view().file_name().lower()
# print("file name: " + file_name)
a_type = DoobleIO.check_file_type(file_name)
# get all sites folders
for x in folders:
if x.endswith('dev'):
continue
# print("folder: " + x)
# add module path to the sites
# fullPath = x+self.MODULES_ROOT
fullPath = x + a_type
# print("type: " + a_type)
# print("full path: " + fullPath)
# in case its ui
if is_ui:
# print(x + '\\uicontrols')
# get ui list
ui_list = self.get_ui_files(x + '\\uicontrols')
# remove duplicate from list
ui_list = self.remove_duplicates(modulesList, ui_list)
modulesList += ui_list
else:
# get ui list
ui_list = self.get_ui_files(x + '\\uicontrols')
# remove duplicate from list
ui_list = self.remove_duplicates(modulesList, ui_list)
# get module list
module_list = self.get_modules(fullPath)
# remove duplicate from module list
module_list = self.remove_duplicates(modulesList, module_list)
modulesList += module_list + ui_list
return modulesList
def get_immediate_subdirectories(self, a_dir):
return [a_dir+'\\'+name for name in os.listdir(a_dir)
if os.path.isdir(os.path.join(a_dir, name))]
def get_modules(self, fullPath):
modulesList = []
for dir in os.listdir(fullPath):
if '.' not in dir:
# \Sites\natanzon\Content\Modules\API
for fileName in os.listdir(fullPath+'\\'+dir):
# print("file name: " + fileName)
mPath = ""
# if fileName != '$.config' and '.config' not in fileName:
if '.html' in fileName or \
'.htm' in fileName or \
'.hpp' in fileName:
mPath = dir+'/'+os.path.splitext(fileName)[0]
if '.' not in mPath and mPath != "":
# print([mPath,mPath])
modulesList.append([mPath,mPath])
return modulesList
def user_selection(self, view):
# get the current cursor point
sel = view.sel()[0].begin()
# get the line with current cursor
get_line = view.line(sel)
# convert the line to string
sel = view.substr(get_line)
# print("user selection: " + sel)
return sel
def get_ui_files(self, folder):
modulesList = []
for fileName in os.listdir(folder):
mPath = 'ui/' + os.path.splitext(fileName)[0]
modulesList.append([mPath,mPath])
return modulesList
def remove_duplicates(self, modulesList, lis):
result = []
for item in lis:
if item not in modulesList:
result.append(item)
return result