port sqlcollection to the new schema.
[amarok.git] / supplementary_scripts / rbeautify.rb
blob41749bc0f34cc82f3cba2ec30cb3800ffcdd0f7d
1 #!/usr/bin/ruby -w
3 # Ruby beautifier, version 2.1, 09/11/2006
4 # Copyright (c) 2006, P. Lutus
5 # Released under the GPL
7 $tabSize = 2
8 $tabStr = " "
10 # indent regexp tests
12 $indentExp = [
13    /^module\b/,
14    /^if\b/,
15    /(=\s*|^)until\b/,
16    /(=\s*|^)for\b/,
17    /^unless\b/,
18    /(=\s*|^)while\b/,
19    /(=\s*|^)begin\b/,
20    /(^| )case\b/,
21    /\bthen\b/,
22    /^class\b/,
23    /^rescue\b/,
24    /^def\b/,
25    /\bdo\b/,
26    /^else\b/,
27    /^elsif\b/,
28    /^ensure\b/,
29    /\bwhen\b/,
30    /\{[^\}]*$/,
31    /\[[^\]]*$/
34 # outdent regexp tests
36 $outdentExp = [
37    /^rescue\b/,
38    /^ensure\b/,
39    /^elsif\b/,
40    /^end\b/,
41    /^else\b/,
42    /\bwhen\b/,
43    /^[^\{]*\}/,
44    /^[^\[]*\]/
47 def makeTab(tab)
48    return (tab < 0)?"":$tabStr * $tabSize * tab
49 end
51 def addLine(line,tab)
52    line.strip!
53    line = makeTab(tab)+line if line.length > 0
54    return line + "\n"
55 end
57 def beautifyRuby(path)
58    commentBlock = false
59    programEnd = false
60    multiLineArray = Array.new
61    multiLineStr = ""
62    tab = 0
63    source = File.read(path)
64    dest = ""
65    source.split("\n").each do |line|
66       if(!programEnd)
67          # detect program end mark
68          if(line =~ /^__END__$/)
69             programEnd = true
70          else
71             # combine continuing lines
72             if(!(line =~ /^\s*#/) && line =~ /[^\\]\\\s*$/)
73                multiLineArray.push line
74                multiLineStr += line.sub(/^(.*)\\\s*$/,"\\1")
75                next
76             end
78             # add final line
79             if(multiLineStr.length > 0)
80                multiLineArray.push line
81                multiLineStr += line.sub(/^(.*)\\\s*$/,"\\1")
82             end
84             tline = ((multiLineStr.length > 0)?multiLineStr:line).strip
85             if(tline =~ /^=begin/)
86                commentBlock = true
87             end
88          end
89       end
90       if(commentBlock || programEnd)
91          # add the line unchanged
92          dest += line + "\n"
93       else
94          commentLine = (tline =~ /^#/)
95          if(!commentLine)
96             # throw out sequences that will
97             # only sow confusion
98             while tline.gsub!(/'.*?'/,"")
99             end
100             while tline.gsub!(/".*?"/,"")
101             end
102             while tline.gsub!(/\`.*?\`/,"")
103             end
104             while tline.gsub!(/\{[^\{]*?\}/,"")
105             end
106             while tline.gsub!(/\([^\(]*?\)/,"")
107             end
108             while tline.gsub!(/\/.*?\//,"")
109             end
110             while tline.gsub!(/%r(.).*?\1/,"")
111             end
112             tline.gsub!(/\\\"/,"'")
113             $outdentExp.each do |re|
114                if(tline =~ re)
115                   tab -= 1
116                   break
117                end
118             end
119          end
120          if (multiLineArray.length > 0)
121             multiLineArray.each do |ml|
122                dest += addLine(ml,tab)
123             end
124             multiLineArray.clear
125             multiLineStr = ""
126          else
127             dest += addLine(line,tab)
128          end
129          if(!commentLine)
130             $indentExp.each do |re|
131                if(tline =~ re && !(tline =~ /\s+end\s*$/))
132                   tab += 1
133                   break
134                end
135             end
136          end
137       end
138       if(tline =~ /^=end/)
139          commentBlock = false
140       end
141    end
142    if(source != dest)
143       # make a backup copy
144       File.open(path + "~","w") { |f| f.write(source) }
145       # overwrite the original
146       File.open(path,"w") { |f| f.write(dest) }
147    end
148    if(tab != 0)
149       STDERR.puts "#{path}: Indentation error: #{tab}"
150    end
153 if(!ARGV[0])
154    STDERR.puts "usage: Ruby filenames to beautify."
155    exit 0
158 ARGV.each do |path|
159    beautifyRuby(path)