rbeautify.rb

来自「Amarok是一款在LINUX或其他类UNIX操作系统中运行的音频播放器软件。 」· RB 代码 · 共 161 行

RB
161
字号
#!/usr/bin/ruby -w# Ruby beautifier, version 2.1, 09/11/2006# Copyright (c) 2006, P. Lutus# Released under the GPL$tabSize = 2$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 * tabenddef addLine(line,tab)   line.strip!   line = makeTab(tab)+line if line.length > 0   return line + "\n"enddef 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!(/%r(.).*?\1/,"")            end            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}"   endendif(!ARGV[0])   STDERR.puts "usage: Ruby filenames to beautify."   exit 0endARGV.each do |path|   beautifyRuby(path)end

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?