Mercurial > hg > forks > UniversalIndentGUI
view indenters/rbeautify.rb @ 487:99383b949316
Added support for two (rather simple) Ruby beautifiers.
git-svn-id: svn://svn.code.sf.net/p/universalindent/code/trunk@727 59b1889a-e5ac-428c-b0c7-476e01d41282
author | thomas_-_s <thomas_-_s@59b1889a-e5ac-428c-b0c7-476e01d41282> |
---|---|
date | Fri, 13 Jun 2008 12:05:39 +0000 |
parents | |
children | f55b7f34a3e1 |
line wrap: on
line source
#!/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) end