Mercurial > hg > forks > UniversalIndentGUI
diff indenters/rbeautify.rb @ 777:f55b7f34a3e1
Updated Ruby Script Beautifier to version 2.9.
git-svn-id: svn://svn.code.sf.net/p/universalindent/code/trunk@1054 59b1889a-e5ac-428c-b0c7-476e01d41282
author | thomas_-_s <thomas_-_s@59b1889a-e5ac-428c-b0c7-476e01d41282> |
---|---|
date | Tue, 27 Dec 2011 13:28:58 +0000 |
parents | 99383b949316 |
children |
line wrap: on
line diff
--- a/indenters/rbeautify.rb Tue Dec 27 10:48:25 2011 +0000 +++ b/indenters/rbeautify.rb Tue Dec 27 13:28:58 2011 +0000 @@ -1,186 +1,222 @@ -#!/usr/bin/ruby -w - -# NEED_SYMLINK - -=begin -/*************************************************************************** - * Copyright (C) 2006, Paul Lutus * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - ***************************************************************************/ -=end - -PVERSION = "Version 2.2, 10/29/2007" - -$tabSize = 3 -$tabStr = " " - -# indent regexp tests - -$indentExp = [ - /^module\b/, - /^if\b/, - /(=\s*|^)until\b/, - /(=\s*|^)for\b/, - /^unless\b/, - /(=\s*|^)while\b/, - /(=\s*|^)begin\b/, - /(^| )case\b/, - /\bthen\b/, - /^class\b/, - /^rescue\b/, - /^def\b/, - /\bdo\b/, - /^else\b/, - /^elsif\b/, - /^ensure\b/, - /\bwhen\b/, - /\{[^\}]*$/, - /\[[^\]]*$/ -] - -# outdent regexp tests - -$outdentExp = [ - /^rescue\b/, - /^ensure\b/, - /^elsif\b/, - /^end\b/, - /^else\b/, - /\bwhen\b/, - /^[^\{]*\}/, - /^[^\[]*\]/ -] - -def makeTab(tab) - return (tab < 0)?"":$tabStr * $tabSize * tab -end - -def addLine(line,tab) - line.strip! - line = makeTab(tab)+line if line.length > 0 - return line + "\n" -end - -def beautifyRuby(path) - commentBlock = false - programEnd = false - multiLineArray = Array.new - multiLineStr = "" - tab = 0 - source = File.read(path) - dest = "" - source.split("\n").each do |line| - if(!programEnd) - # detect program end mark - if(line =~ /^__END__$/) - programEnd = true - else - # combine continuing lines - if(!(line =~ /^\s*#/) && line =~ /[^\\]\\\s*$/) - multiLineArray.push line - multiLineStr += line.sub(/^(.*)\\\s*$/,"\\1") - next - end - - # add final line - if(multiLineStr.length > 0) - multiLineArray.push line - multiLineStr += line.sub(/^(.*)\\\s*$/,"\\1") - end - - tline = ((multiLineStr.length > 0)?multiLineStr:line).strip - if(tline =~ /^=begin/) - commentBlock = true - end - end - end - if(commentBlock || programEnd) - # add the line unchanged - dest += line + "\n" - else - commentLine = (tline =~ /^#/) - if(!commentLine) - # throw out sequences that will - # only sow confusion - while tline.gsub!(/\{[^\{]*?\}/,"") - end - while tline.gsub!(/\[[^\[]*?\]/,"") - end - while tline.gsub!(/'.*?'/,"") - end - while tline.gsub!(/".*?"/,"") - end - while tline.gsub!(/\`.*?\`/,"") - end - while tline.gsub!(/\([^\(]*?\)/,"") - end - while tline.gsub!(/\/.*?\//,"") - end - while tline.gsub!(/%r(.).*?\1/,"") - end - # delete end-of-line comments - tline.sub!(/#[^\"]+$/,"") - # convert quotes - tline.gsub!(/\\\"/,"'") - $outdentExp.each do |re| - if(tline =~ re) - tab -= 1 - break - end - end - end - if (multiLineArray.length > 0) - multiLineArray.each do |ml| - dest += addLine(ml,tab) - end - multiLineArray.clear - multiLineStr = "" - else - dest += addLine(line,tab) - end - if(!commentLine) - $indentExp.each do |re| - if(tline =~ re && !(tline =~ /\s+end\s*$/)) - tab += 1 - break - end - end - end - end - if(tline =~ /^=end/) - commentBlock = false - end - end - if(source != dest) - # make a backup copy - File.open(path + "~","w") { |f| f.write(source) } - # overwrite the original - File.open(path,"w") { |f| f.write(dest) } - end - if(tab != 0) - STDERR.puts "#{path}: Indentation error: #{tab}" - end -end - -if(!ARGV[0]) - STDERR.puts "usage: Ruby filenames to beautify." - exit 0 -end - -ARGV.each do |path| - beautifyRuby(path) +#!/usr/bin/ruby -w + + +=begin +/*************************************************************************** + * Copyright (C) 2008, Paul Lutus * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +=end + +PVERSION = "Version 2.9, 10/24/2008" + +module RBeautify + + # user-customizable values + + RBeautify::TabStr = " " + RBeautify::TabSize = 3 + + # indent regexp tests + + IndentExp = [ + /^module\b/, + /^class\b/, + /^if\b/, + /(=\s*|^)until\b/, + /(=\s*|^)for\b/, + /^unless\b/, + /(=\s*|^)while\b/, + /(=\s*|^)begin\b/, + /(^| )case\b/, + /\bthen\b/, + /^rescue\b/, + /^def\b/, + /\bdo\b/, + /^else\b/, + /^elsif\b/, + /^ensure\b/, + /\bwhen\b/, + /\{[^\}]*$/, + /\[[^\]]*$/ + ] + + # outdent regexp tests + + OutdentExp = [ + /^rescue\b/, + /^ensure\b/, + /^elsif\b/, + /^end\b/, + /^else\b/, + /\bwhen\b/, + /^[^\{]*\}/, + /^[^\[]*\]/ + ] + + def RBeautify.rb_make_tab(tab) + return (tab < 0)?"":TabStr * TabSize * tab + end + + def RBeautify.rb_add_line(line,tab) + line.strip! + line = rb_make_tab(tab) + line if line.length > 0 + return line + end + + def RBeautify.beautify_string(source, path = "") + comment_block = false + in_here_doc = false + here_doc_term = "" + program_end = false + multiLine_array = [] + multiLine_str = "" + tab = 0 + output = [] + source.each do |line| + line.chomp! + if(!program_end) + # detect program end mark + if(line =~ /^__END__$/) + program_end = true + else + # combine continuing lines + if(!(line =~ /^\s*#/) && line =~ /[^\\]\\\s*$/) + multiLine_array.push line + multiLine_str += line.sub(/^(.*)\\\s*$/,"\\1") + next + end + + # add final line + if(multiLine_str.length > 0) + multiLine_array.push line + multiLine_str += line.sub(/^(.*)\\\s*$/,"\\1") + end + + tline = ((multiLine_str.length > 0)?multiLine_str:line).strip + if(tline =~ /^=begin/) + comment_block = true + end + if(in_here_doc) + in_here_doc = false if tline =~ %r{\s*#{here_doc_term}\s*} + else # not in here_doc + if tline =~ %r{=\s*<<} + here_doc_term = tline.sub(%r{.*=\s*<<-?\s*([_|\w]+).*},"\\1") + in_here_doc = here_doc_term.size > 0 + end + end + end + end + if(comment_block || program_end || in_here_doc) + # add the line unchanged + output << line + else + comment_line = (tline =~ /^#/) + if(!comment_line) + # throw out sequences that will + # only sow confusion + while tline.gsub!(/\{[^\{]*?\}/,"") + end + while tline.gsub!(/\[[^\[]*?\]/,"") + end + while tline.gsub!(/'.*?'/,"") + end + while tline.gsub!(/".*?"/,"") + end + while tline.gsub!(/\`.*?\`/,"") + end + while tline.gsub!(/\([^\(]*?\)/,"") + end + while tline.gsub!(/\/.*?\//,"") + end + while tline.gsub!(/%r(.).*?\1/,"") + end + # delete end-of-line comments + tline.sub!(/#[^\"]+$/,"") + # convert quotes + tline.gsub!(/\\\"/,"'") + OutdentExp.each do |re| + if(tline =~ re) + tab -= 1 + break + end + end + end + if (multiLine_array.length > 0) + multiLine_array.each do |ml| + output << rb_add_line(ml,tab) + end + multiLine_array.clear + multiLine_str = "" + else + output << rb_add_line(line,tab) + end + if(!comment_line) + IndentExp.each do |re| + if(tline =~ re && !(tline =~ /\s+end\s*$/)) + tab += 1 + break + end + end + end + end + if(tline =~ /^=end/) + comment_block = false + end + end + error = (tab != 0) + STDERR.puts "Error: indent/outdent mismatch: #{tab}." if error + return output.join("\n") + "\n",error + end # beautify_string + + def RBeautify.beautify_file(path) + error = false + if(path == '-') # stdin source + source = STDIN.read + dest,error = beautify_string(source,"stdin") + print dest + else # named file source + source = File.read(path) + dest,error = beautify_string(source,path) + if(source != dest) + # make a backup copy + File.open(path + "~","w") { |f| f.write(source) } + # overwrite the original + File.open(path,"w") { |f| f.write(dest) } + end + end + return error + end # beautify_file + + def RBeautify.main + error = false + if(!ARGV[0]) + STDERR.puts "usage: Ruby filenames or \"-\" for stdin." + exit 0 + end + ARGV.each do |path| + error = (beautify_file(path))?true:error + end + error = (error)?1:0 + exit error + end # main +end # module RBeautify + +# if launched as a standalone program, not loaded as a module +if __FILE__ == $0 + RBeautify.main end \ No newline at end of file