Skip to content

Commit 19f1054

Browse files
hadisfrShivelight
authored andcommitted
use platform-independent path separator
fix kevinxucs/Sublime-Gitignore#8 (comment)
0 parents  commit 19f1054

1 file changed

Lines changed: 125 additions & 0 deletions

File tree

gitignore.py

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
import os
2+
import zipfile
3+
4+
import sublime
5+
import sublime_plugin
6+
7+
GITIGNORE_EXT = '.gitignore'
8+
loader = None
9+
10+
11+
def plugin_loaded():
12+
global loader
13+
loader = Loader()
14+
15+
16+
class Loader():
17+
_bp_list = []
18+
_bp_folder = 'boilerplates'
19+
_user_gitignore_folder = os.path.join('User', 'gitignores')
20+
_package_path = None
21+
_is_zipfile = False
22+
_address = {}
23+
_user_files = []
24+
25+
def __init__(self):
26+
self._find_package_path()
27+
self._is_zipfile = zipfile.is_zipfile(self._package_path)
28+
self._build_list()
29+
30+
def _find_package_path(self):
31+
paths = [os.path.join(sublime.installed_packages_path(), 'Gitignore.sublime-package'),
32+
os.path.join(sublime.packages_path(), 'Gitignore'),
33+
os.path.join(sublime.packages_path(), 'Sublime-Gitignore')]
34+
for path in paths:
35+
if os.path.exists(path):
36+
self._package_path = path
37+
break
38+
39+
def _list_dir(self, user_file=False):
40+
if not user_file and self._is_zipfile:
41+
# Dealing with .sublime-package file
42+
package = zipfile.ZipFile(self._package_path, 'r')
43+
path = self._bp_folder + os.sep
44+
return [file for file in package.namelist() if file.startswith(path) and file.endswith(GITIGNORE_EXT)]
45+
else:
46+
path = (os.path.join(sublime.packages_path(), self._user_gitignore_folder)
47+
if user_file
48+
else os.path.join(self._package_path, self._bp_folder))
49+
return [os.path.join(step[0][len(path) + 1:], file)
50+
for step in os.walk(path) for file in step[2] if file.endswith(GITIGNORE_EXT)]
51+
52+
def _load_file(self, path, is_user_file=False):
53+
file_path = (os.path.join(sublime.packages_path(), self._user_gitignore_folder, path)
54+
if is_user_file
55+
else os.path.join(self._package_path, self._bp_folder, path))
56+
if not is_user_file and self._is_zipfile:
57+
# Dealing with .sublime-package file
58+
package = zipfile.ZipFile(self._package_path, 'r')
59+
with package.open(path, 'r') as f:
60+
text = f.read().decode()
61+
else:
62+
with open(file_path, 'r') as f:
63+
text = f.read()
64+
return text
65+
66+
def _get_key(self, bp_file):
67+
return bp_file[bp_file.rfind(os.sep) + 1:].replace(GITIGNORE_EXT, '')
68+
69+
def _build_list(self):
70+
for bp_file in self._list_dir():
71+
self._address[self._get_key(bp_file)] = bp_file
72+
for bp_file in self._list_dir(True):
73+
self._address[self._get_key(bp_file)] = bp_file
74+
self._user_files.append(self._get_key(bp_file))
75+
self._bp_list = list(self._address.keys())
76+
self._bp_list.sort()
77+
78+
def get_list(self):
79+
return self._bp_list.copy()
80+
81+
def load_bp(self, bp):
82+
return self._load_file(self._address[bp], bp in self._user_files)
83+
84+
85+
class RunCommand(sublime_plugin.WindowCommand):
86+
def show_quick_panel(self, options, done):
87+
# Fix from http://www.sublimetext.com/forum/viewtopic.php?f=6&t=10999
88+
sublime.set_timeout(lambda: self.window.show_quick_panel(options, done), 10)
89+
90+
def run(self):
91+
self.chosen_array = []
92+
self.bp_list = loader.get_list()
93+
self.is_first = True
94+
self.show_quick_panel(self.bp_list, self.on_select)
95+
96+
def on_select(self, index):
97+
if not self.is_first and index == 0:
98+
self.write_file()
99+
elif index >= 0:
100+
self.chosen_array.append(self.bp_list[index])
101+
self.bp_list.remove(self.bp_list[index])
102+
if self.is_first:
103+
self.bp_list.insert(0, 'Done')
104+
self.is_first = False
105+
self.show_quick_panel(self.bp_list, self.on_select)
106+
107+
def write_file(self):
108+
final = ''
109+
110+
for bp in self.chosen_array:
111+
text = loader.load_bp(bp)
112+
final = final + '### ' + bp + ' ###\n\n' + text + '\n\n'
113+
114+
final = final.strip()
115+
final += '\n'
116+
view = sublime.active_window().new_file()
117+
view.run_command('write', {'bp': final})
118+
119+
120+
class WriteCommand(sublime_plugin.TextCommand):
121+
122+
def run(self, edit, **kwargs):
123+
self.view.insert(edit, 0, kwargs['bp'])
124+
self.view.set_name(GITIGNORE_EXT)
125+
self.view.set_syntax_file(os.path.join('Packages', 'Git Formats', 'Git Ignore.sublime-syntax'))

0 commit comments

Comments
 (0)