ruby-beautify 0.92.2 → 0.93.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +1 -0
- data/README.md +44 -13
- data/bin/rbeautify +164 -12
- data/lib/ruby-beautify.rb +0 -6
- data/lib/ruby-beautify/version.rb +1 -1
- data/ruby-beautify.gemspec +1 -1
- metadata +11 -40
- data/lib/beautifier.rb +0 -168
- data/lib/ruby-beautify/block_end.rb +0 -23
- data/lib/ruby-beautify/block_matcher.rb +0 -153
- data/lib/ruby-beautify/block_start.rb +0 -119
- data/lib/ruby-beautify/config/ruby.rb +0 -131
- data/lib/ruby-beautify/language.rb +0 -37
- data/lib/ruby-beautify/line.rb +0 -53
- data/spec/fixtures/ruby.yml +0 -408
- data/spec/rbeautify/block_matcher_spec.rb +0 -89
- data/spec/rbeautify/block_start_spec.rb +0 -51
- data/spec/rbeautify/config/ruby_spec.rb +0 -183
- data/spec/rbeautify/line_spec.rb +0 -73
- data/spec/rbeautify_spec.rb +0 -1
- data/spec/spec_helper.rb +0 -124
@@ -1,23 +0,0 @@
|
|
1
|
-
module RBeautify
|
2
|
-
|
3
|
-
class BlockEnd
|
4
|
-
|
5
|
-
attr_accessor :block_start, :offset, :match, :after_match
|
6
|
-
|
7
|
-
def initialize(block_start, offset, match, after_match)
|
8
|
-
self.block_start = block_start
|
9
|
-
self.offset = offset
|
10
|
-
self.match = match
|
11
|
-
self.after_match = after_match
|
12
|
-
end
|
13
|
-
|
14
|
-
def end_offset
|
15
|
-
offset + match.length
|
16
|
-
end
|
17
|
-
|
18
|
-
def end_can_also_be_start?
|
19
|
-
block_start.block_matcher.end_can_also_be_start?
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
end
|
@@ -1,153 +0,0 @@
|
|
1
|
-
module RBeautify
|
2
|
-
|
3
|
-
class BlockMatcher
|
4
|
-
|
5
|
-
attr_reader :language, :name, :starts, :ends, :options
|
6
|
-
|
7
|
-
def initialize(language, name, starts, ends, options = {})
|
8
|
-
@language = language
|
9
|
-
@name = name
|
10
|
-
@starts = starts
|
11
|
-
@ends = ends.nil? ? starts : ends
|
12
|
-
@options = options
|
13
|
-
end
|
14
|
-
|
15
|
-
class << self
|
16
|
-
def parse(language, original_block, line_number, string, current_offset)
|
17
|
-
block_end = original_block && original_block.parse_block_end(string, current_offset)
|
18
|
-
|
19
|
-
if (block_start = first_block_start(language,
|
20
|
-
original_block,
|
21
|
-
line_number,
|
22
|
-
string,
|
23
|
-
current_offset,
|
24
|
-
block_end.nil? ? nil : block_end.offset))
|
25
|
-
|
26
|
-
block_end = nil
|
27
|
-
end
|
28
|
-
|
29
|
-
if block_end
|
30
|
-
# Check whether the section of the line which is a block end is also a block start
|
31
|
-
if block_end.end_can_also_be_start? &&
|
32
|
-
(block_start_candidate = first_block_start(language, block_end.block_start.parent, line_number, string, current_offset)) &&
|
33
|
-
block_start_candidate.offset == block_end.offset
|
34
|
-
block_start = block_start_candidate
|
35
|
-
end
|
36
|
-
|
37
|
-
end
|
38
|
-
|
39
|
-
if block_start
|
40
|
-
if debug
|
41
|
-
puts "MATCH: '#{string.slice(0, string.length - block_start.match.length - block_start.after_match.length)}<START type=#{block_start.name}>#{block_start.match}</START>#{block_start.after_match}'"
|
42
|
-
end
|
43
|
-
parse(language, block_start, line_number, block_start.after_match, block_start.end_offset)
|
44
|
-
elsif block_end
|
45
|
-
if debug
|
46
|
-
puts "MATCH: '#{string.slice(0, string.length - block_end.match.length - block_end.after_match.length)}<END>#{block_end.match}</END>#{block_end.after_match}'"
|
47
|
-
end
|
48
|
-
parse(language, block_end.block_start.parent, line_number, block_end.after_match, block_end.end_offset)
|
49
|
-
else
|
50
|
-
original_block
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
def debug=(value)
|
55
|
-
@debug = value
|
56
|
-
end
|
57
|
-
|
58
|
-
def debug
|
59
|
-
@debug
|
60
|
-
end
|
61
|
-
|
62
|
-
private
|
63
|
-
def first_block_start(language, parent_block, line_number, string, offset, maximum_offset = nil)
|
64
|
-
first_block_start = nil
|
65
|
-
language.matchers.each do |matcher|
|
66
|
-
if matcher.can_nest?(parent_block)
|
67
|
-
if (block_start_candidate = matcher.parse_block_start(string, parent_block, offset, line_number)) &&
|
68
|
-
(maximum_offset.nil? || maximum_offset > block_start_candidate.offset)
|
69
|
-
first_block_start = block_start_candidate
|
70
|
-
maximum_offset = first_block_start.offset
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
74
|
-
first_block_start
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
def parse_block_start(string, parent_block, offset, line_number)
|
79
|
-
if !string.empty? && (match = starts.match(string))
|
80
|
-
RBeautify::BlockStart.new(self, parent_block, line_number, offset + match.begin(0), match[0], match.post_match)
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
def indent_end_line?(block)
|
85
|
-
evaluate_option_for_block(:indent_end_line, block)
|
86
|
-
end
|
87
|
-
|
88
|
-
def indent_size(block)
|
89
|
-
evaluate_option_for_block(:indent_size, block) || language.indent_size
|
90
|
-
end
|
91
|
-
|
92
|
-
# Look for blocks within the content of this one
|
93
|
-
def parse_content?
|
94
|
-
options[:parse_content] != false
|
95
|
-
end
|
96
|
-
|
97
|
-
# Indent the content of this block
|
98
|
-
def format_content?
|
99
|
-
options[:format_content] != false
|
100
|
-
end
|
101
|
-
|
102
|
-
def can_nest?(parent_block)
|
103
|
-
return false unless parent_block.nil? || parent_block.parse_content?
|
104
|
-
|
105
|
-
if options[:nest_only]
|
106
|
-
parent_block && options[:nest_only].include?(parent_block.name)
|
107
|
-
else
|
108
|
-
parent_block.nil? ||
|
109
|
-
options[:nest_except].nil? || !options[:nest_except].include?(parent_block.name)
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
|
-
def ends?
|
114
|
-
ends != false
|
115
|
-
end
|
116
|
-
|
117
|
-
def end_is_implicit?
|
118
|
-
options[:end] == :implicit
|
119
|
-
end
|
120
|
-
|
121
|
-
def end_can_also_be_start?
|
122
|
-
if ends == starts
|
123
|
-
options[:end_can_also_be_start] == true
|
124
|
-
else
|
125
|
-
options[:end_can_also_be_start] != false
|
126
|
-
end
|
127
|
-
end
|
128
|
-
|
129
|
-
def negate_ends_match?
|
130
|
-
options[:negate_ends_match]
|
131
|
-
end
|
132
|
-
|
133
|
-
# True if blocks can contain the escape character \ which needs to be
|
134
|
-
# checked for on end match
|
135
|
-
def escape_character?
|
136
|
-
options[:escape_character] == true
|
137
|
-
end
|
138
|
-
|
139
|
-
def inspect
|
140
|
-
name
|
141
|
-
end
|
142
|
-
|
143
|
-
private
|
144
|
-
def evaluate_option_for_block(key, block)
|
145
|
-
if options[key] && options[key].respond_to?(:call)
|
146
|
-
options[key].call(block)
|
147
|
-
else
|
148
|
-
options[key]
|
149
|
-
end
|
150
|
-
end
|
151
|
-
|
152
|
-
end
|
153
|
-
end
|
@@ -1,119 +0,0 @@
|
|
1
|
-
module RBeautify
|
2
|
-
|
3
|
-
class BlockStart
|
4
|
-
|
5
|
-
attr_reader :block_matcher, :parent, :offset, :match, :after_match, :line_number
|
6
|
-
|
7
|
-
class << self
|
8
|
-
def first_common_ancestor(first, second)
|
9
|
-
if first.nil? || second.nil?
|
10
|
-
nil
|
11
|
-
else
|
12
|
-
(first.ancestors & second.ancestors).last
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
def initialize(block_matcher, parent, line_number, offset, match, after_match)
|
18
|
-
@block_matcher = block_matcher
|
19
|
-
@parent = parent
|
20
|
-
@offset = offset
|
21
|
-
@match = match
|
22
|
-
@after_match = after_match
|
23
|
-
@line_number = line_number
|
24
|
-
end
|
25
|
-
|
26
|
-
def end_offset
|
27
|
-
offset + match.length
|
28
|
-
end
|
29
|
-
|
30
|
-
def parse_block_end(string, offset)
|
31
|
-
block_end = parse_explicit_block_end(string, offset)
|
32
|
-
|
33
|
-
# Handle case where end is implicit
|
34
|
-
if block_end.nil? && end_is_implicit? && parent
|
35
|
-
block_end = parent.parse_block_end(string, offset)
|
36
|
-
end
|
37
|
-
|
38
|
-
block_end
|
39
|
-
end
|
40
|
-
|
41
|
-
def format_content?
|
42
|
-
block_matcher.format_content?
|
43
|
-
end
|
44
|
-
|
45
|
-
def parse_content?
|
46
|
-
block_matcher.parse_content?
|
47
|
-
end
|
48
|
-
|
49
|
-
def indent_end_line?
|
50
|
-
block_matcher.indent_end_line?(self)
|
51
|
-
end
|
52
|
-
|
53
|
-
def total_indent_size
|
54
|
-
parent.nil? ? indent_size : parent.total_indent_size + indent_size
|
55
|
-
end
|
56
|
-
|
57
|
-
def indent_size
|
58
|
-
block_matcher.indent_size(self)
|
59
|
-
end
|
60
|
-
|
61
|
-
def end_is_implicit?
|
62
|
-
block_matcher.end_is_implicit?
|
63
|
-
end
|
64
|
-
|
65
|
-
def name
|
66
|
-
block_matcher.name
|
67
|
-
end
|
68
|
-
|
69
|
-
# Returns true if strict ancestor of
|
70
|
-
def strict_ancestor_of?(block_start)
|
71
|
-
block_start && block_start.parent && (self == block_start.parent || strict_ancestor_of?(block_start.parent))
|
72
|
-
end
|
73
|
-
|
74
|
-
def ancestors
|
75
|
-
if parent
|
76
|
-
parent.ancestors + [self]
|
77
|
-
else
|
78
|
-
[self]
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
private
|
83
|
-
def ends?
|
84
|
-
block_matcher.ends?
|
85
|
-
end
|
86
|
-
|
87
|
-
def negate_ends_match?
|
88
|
-
block_matcher.negate_ends_match?
|
89
|
-
end
|
90
|
-
|
91
|
-
def escape_character?
|
92
|
-
block_matcher.escape_character?
|
93
|
-
end
|
94
|
-
|
95
|
-
def parse_explicit_block_end(string, offset)
|
96
|
-
block_end = nil
|
97
|
-
|
98
|
-
if ends?
|
99
|
-
|
100
|
-
if match = block_matcher.ends.match(string)
|
101
|
-
unless negate_ends_match?
|
102
|
-
if escape_character? &&
|
103
|
-
((escape_chars = match.pre_match.match(/\\*$/)) && (escape_chars[0].size % 2 == 1))
|
104
|
-
# If there are an odd number of escape characters just before
|
105
|
-
# the match then this match should be skipped
|
106
|
-
return parse_explicit_block_end(match.post_match, offset + escape_chars[0].size + match[0].length)
|
107
|
-
else
|
108
|
-
return RBeautify::BlockEnd.new(self, offset + match.begin(0), match[0], match.post_match)
|
109
|
-
end
|
110
|
-
end
|
111
|
-
elsif negate_ends_match?
|
112
|
-
return RBeautify::BlockEnd.new(self, offset, '', string)
|
113
|
-
end
|
114
|
-
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
end
|
119
|
-
end
|
@@ -1,131 +0,0 @@
|
|
1
|
-
# define ruby language
|
2
|
-
|
3
|
-
unless RBeautify::Language.language(:ruby)
|
4
|
-
|
5
|
-
ruby = RBeautify::Language.add_language(:ruby)
|
6
|
-
|
7
|
-
pre_keyword_boundary = '(^|[^a-z0-9A-Z:._])' # like \b but with : , . _ all added to list of exceptions
|
8
|
-
start_statement_boundary = '(^|(;|=)\s*)'
|
9
|
-
continue_statement_boundary = '(^|;\s*)'
|
10
|
-
ruby.indent_size = 2
|
11
|
-
|
12
|
-
ruby.add_matcher(:program_end, /^__END__$/, false, :format_content => false, :parse_content => false)
|
13
|
-
|
14
|
-
ruby.add_matcher(:multiline_comment, /^=begin/, /^=end/, :format_content => false, :parse_content => false)
|
15
|
-
|
16
|
-
ruby.add_matcher(:double_quote,
|
17
|
-
/"/,
|
18
|
-
/"/,
|
19
|
-
:parse_content => true,
|
20
|
-
:format_content => false,
|
21
|
-
:escape_character => true,
|
22
|
-
:nest_except => [:double_quote, :single_quote, :regex, :back_tick])
|
23
|
-
|
24
|
-
# NEED TO MODIFY DOUBLE QUOTE TO BE FORMATTED to get this to work
|
25
|
-
ruby.add_matcher(:interpolation,
|
26
|
-
/#\{/,
|
27
|
-
/\}/,
|
28
|
-
:nest_only => [:double_quote, :regex, :backtick])
|
29
|
-
|
30
|
-
ruby.add_matcher(:single_quote,
|
31
|
-
/'/,
|
32
|
-
/'/,
|
33
|
-
:parse_content => false,
|
34
|
-
:format_content => false,
|
35
|
-
:escape_character => true,
|
36
|
-
:nest_except => [:double_quote, :single_quote, :regex, :back_tick])
|
37
|
-
|
38
|
-
ruby.add_matcher(:regex,
|
39
|
-
/(^|((,|=|~)\s*))\//, # Try to distinguish it from division sign
|
40
|
-
/\//,
|
41
|
-
:format_content => false,
|
42
|
-
:escape_character => true,
|
43
|
-
:end_can_also_be_start => false,
|
44
|
-
:nest_except => [:double_quote, :single_quote, :regex, :back_tick])
|
45
|
-
|
46
|
-
ruby.add_matcher(:back_tick,
|
47
|
-
/`/,
|
48
|
-
/`/,
|
49
|
-
:format_content => false,
|
50
|
-
:escape_character => true,
|
51
|
-
:nest_except => [:double_quote, :single_quote, :regex, :back_tick])
|
52
|
-
|
53
|
-
ruby.add_matcher(:standard,
|
54
|
-
/((#{start_statement_boundary}(module|class|def))|#{pre_keyword_boundary}do)\b/,
|
55
|
-
/(((^|;|\s)end)|#{continue_statement_boundary}(rescue|ensure))\b/,
|
56
|
-
:nest_except => [:double_quote, :regex, :backtick])
|
57
|
-
|
58
|
-
ruby.add_matcher(:more,
|
59
|
-
/#{start_statement_boundary}(until|for|while)\b/,
|
60
|
-
/(((^|;|\s)end)|#{continue_statement_boundary}(rescue|ensure))\b/,
|
61
|
-
:nest_except => [:double_quote, :regex, :backtick])
|
62
|
-
|
63
|
-
ruby.add_matcher(:begin,
|
64
|
-
/((#{start_statement_boundary}begin)|(#{continue_statement_boundary}(ensure|rescue)))\b/,
|
65
|
-
/(((^|;|\s)end)|#{continue_statement_boundary}(rescue|ensure|else))\b/,
|
66
|
-
:nest_except => [:double_quote, :regex, :backtick])
|
67
|
-
|
68
|
-
ruby.add_matcher(:if,
|
69
|
-
/((#{start_statement_boundary}(if|unless))|#{continue_statement_boundary}(then|elsif|else))\b/,
|
70
|
-
/(((^|;|\s)end)|(#{continue_statement_boundary}(then|elsif|else)))\b/,
|
71
|
-
:nest_except => [:case, :double_quote, :regex, :backtick])
|
72
|
-
|
73
|
-
ruby.add_matcher(:case,
|
74
|
-
/#{pre_keyword_boundary}case\b/,
|
75
|
-
/(^|;|\s)end\b/,
|
76
|
-
:nest_except => [:double_quote, :regex, :backtick],
|
77
|
-
:indent_size => 0)
|
78
|
-
|
79
|
-
ruby.add_matcher(:inner_case,
|
80
|
-
/#{continue_statement_boundary}(when|else|then)\b/,
|
81
|
-
/#{continue_statement_boundary}(when|else|then)\b/,
|
82
|
-
:nest_only => [:case],
|
83
|
-
:end => :implicit,
|
84
|
-
:end_can_also_be_start => true,
|
85
|
-
:nest_except => [:double_quote, :regex, :backtick])
|
86
|
-
|
87
|
-
# TODO: Improve the check that this is not a block with arguments. Will
|
88
|
-
# currently match any bracket followed by spaces and |.
|
89
|
-
bracket_indent_end_line_proc = Proc.new { |block| !block.after_match.empty? && !block.after_match.match(/^\|/) }
|
90
|
-
bracket_indent_size_proc = Proc.new do |block|
|
91
|
-
if bracket_indent_end_line_proc.call(block)
|
92
|
-
strict_ancestors_on_same_line = block.ancestors.select { |a| a != block && a.line_number == block.line_number }
|
93
|
-
block.end_offset - strict_ancestors_on_same_line.inject(0) { |sum, a| sum + a.indent_size }
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
ruby.add_matcher(:curly_bracket,
|
98
|
-
/\{\s*/,
|
99
|
-
/\}/,
|
100
|
-
:indent_end_line => bracket_indent_end_line_proc,
|
101
|
-
:indent_size => bracket_indent_size_proc,
|
102
|
-
:nest_except => [:double_quote, :regex, :backtick])
|
103
|
-
|
104
|
-
ruby.add_matcher(:round_bracket,
|
105
|
-
/\(\s*/,
|
106
|
-
/\)/,
|
107
|
-
:indent_end_line => bracket_indent_end_line_proc,
|
108
|
-
:indent_size => bracket_indent_size_proc,
|
109
|
-
:nest_except => [:double_quote, :regex, :backtick])
|
110
|
-
|
111
|
-
ruby.add_matcher(:square_bracket,
|
112
|
-
/\[\s*/,
|
113
|
-
/\]/,
|
114
|
-
:indent_end_line => bracket_indent_end_line_proc,
|
115
|
-
:indent_size => bracket_indent_size_proc,
|
116
|
-
:nest_except => [:double_quote, :regex, :backtick])
|
117
|
-
|
118
|
-
ruby.add_matcher(:comment, /(\s*)?#/,
|
119
|
-
/$/,
|
120
|
-
:parse_content => false,
|
121
|
-
:format_content => false,
|
122
|
-
:nest_except => [:double_quote, :single_quote, :regex, :back_tick])
|
123
|
-
|
124
|
-
ruby.add_matcher(:continuing_line,
|
125
|
-
/(,|\.|\+|-|=\>|=|&&|\|\||\\|==|\s\?|:|<<)(\s*)?(#.*)?$/,
|
126
|
-
/(^|(,|\.|\+|-|=\>|=|&&|\|\||\\|==|\s\?|:|<<)(\s*)?)(#.*)?$/,
|
127
|
-
:indent_end_line => true,
|
128
|
-
:negate_ends_match => true,
|
129
|
-
:nest_except => [:continuing_line, :curly_bracket, :round_bracket, :square_bracket, :double_quote, :single_quote, :regex, :back_tick])
|
130
|
-
|
131
|
-
end
|
@@ -1,37 +0,0 @@
|
|
1
|
-
module RBeautify
|
2
|
-
class Language
|
3
|
-
|
4
|
-
@@languages = {}
|
5
|
-
|
6
|
-
attr_reader :matchers
|
7
|
-
attr_accessor :indent_size
|
8
|
-
|
9
|
-
class << self
|
10
|
-
|
11
|
-
def language(name)
|
12
|
-
languages[name]
|
13
|
-
end
|
14
|
-
|
15
|
-
def languages
|
16
|
-
@@languages
|
17
|
-
end
|
18
|
-
|
19
|
-
def add_language(name)
|
20
|
-
languages[name] = new()
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
def initialize
|
25
|
-
@matchers = []
|
26
|
-
end
|
27
|
-
|
28
|
-
def add_matcher(name, starts, ends, options = {})
|
29
|
-
self.matchers << BlockMatcher.new(self, name, starts, ends, options)
|
30
|
-
end
|
31
|
-
|
32
|
-
def matcher(name)
|
33
|
-
self.matchers.detect { |matcher| matcher.name == name}
|
34
|
-
end
|
35
|
-
|
36
|
-
end
|
37
|
-
end
|