forked from CraigWilliams/BeautifyRuby
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbeautify_ruby.py
More file actions
103 lines (89 loc) · 3.63 KB
/
Copy pathbeautify_ruby.py
File metadata and controls
103 lines (89 loc) · 3.63 KB
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
import os.path
import sublime, sublime_plugin, sys, re
import subprocess
class PerformEditCommand(sublime_plugin.TextCommand):
def run(self, edit, data):
edit = edit
size = self.view.size()
region = sublime.Region(0, size)
self.view.replace(edit, region, data)
def is_enabled(self):
return True
class BeautifyRubyOnSave(sublime_plugin.EventListener):
def on_pre_save(self, view):
self.settings = sublime.load_settings('BeautifyRuby.sublime-settings')
if self.settings.get('run_on_save'):
view.run_command("beautify_ruby", {"save": False, "error": False})
class BeautifyRubyCommand(sublime_plugin.TextCommand):
def run(self, edit, error=True, save=True):
self.settings = sublime.load_settings('BeautifyRuby.sublime-settings')
if self.is_ruby_file():
save = save and self.settings.get('save_on_beautify')
self.get_selection_position()
self.active_view = self.view.window().active_view()
self.buffer_region = sublime.Region(0, self.active_view.size())
self.view.run_command("perform_edit", { "data":self.beautify_buffer() } )
if save:
self.view.run_command('save')
self.reset_selection_position()
else:
if error:
sublime.error_message("This is not a Ruby file.")
def beautify_file(self):
save_document_if_dirty(self)
subprocess.Popen(self.cmd(self.filename))
def beautify_buffer(self):
working_dir = os.path.dirname(self.filename)
body = self.active_view.substr(self.buffer_region)
beautifier = subprocess.Popen(self.cmd(), shell=True, cwd=working_dir, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
out = beautifier.communicate(body.encode("utf-8"))[0].decode('utf8')
out_array = out.splitlines()
out_final = "\n".join(out_array)
if (out == "" and body != ""):
sublime.error_message("check your ruby interpreter settings")
return body
else:
return out_final
def reset_selection_position(self):
if sublime.version() < '3':
self.view.sel().clear()
self.view.sel().add(self.region)
self.view.show_at_center(self.region)
def get_selection_position(self):
sel = self.view.sel()[0].begin()
pos = self.view.rowcol(sel)
target = self.view.text_point(pos[0], 0)
self.region = sublime.Region(target)
def save_document_if_dirty(self):
if self.view.is_dirty():
self.view.run_command('save')
def cmd(self, path = "-"):
ruby_interpreter = self.settings.get('ruby') or "/usr/bin/env ruby"
if self.is_erb_file():
script_name = 'erbbeautify.rb'
else:
script_name = 'rbeautify.rb'
ruby_script = os.path.join(sublime.packages_path(), 'BeautifyRuby', 'lib', script_name)
args = ["'" + str(path) + "'"]
if self.settings.get('tab_or_space') != "space":
args.insert(0, '-t')
command = ruby_interpreter + " '" + ruby_script + "' " + ' '.join(args)
return command
def is_erb_file(self):
file_patterns = self.settings.get('html_erb_patterns') or ["\.html\.erb"]
patterns = re.compile(r'\b(?:%s)\b' % '|'.join(file_patterns))
if patterns.search(self.fname):
return True
else:
return False
def is_ruby_file(self):
self.filename = self.view.window().active_view().file_name()
self.fname = os.path.basename(self.filename)
file_patterns = self.settings.get('file_patterns') or ['.rb', '.rake']
if self.settings.get('html_erb_patterns'):
file_patterns = file_patterns + self.settings.get('html_erb_patterns')
patterns = re.compile(r'\b(?:%s)\b' % '|'.join(file_patterns))
if patterns.search(self.fname):
return True
else:
return False