Add a format command to e-texteditor

1. Add a new command "format" under ruby bundle
2. Set the input to "Selected text" or "Document"
3. fill scope selector with source.ruby
4. fill this script into the center text area:

#!/usr/bin/env ruby

# Ruby beautifier, version 2.1, 09/11/2006
# Copyright (c) 2006, P. Lutus
# Released under the GPL

# Modificated to work as a Textmate command

$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 * tab end def addLine(line,tab) line.strip! line = makeTab(tab)+line if line.length > 0
return line + "\n"
end

def beautifyRuby
commentBlock = false
programEnd = false
multiLineArray = Array.new
multiLineStr = ""
tab = 0
source = STDIN.read
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
STDOUT.write(dest)
# uncomment this to complain about mismatched blocks
# if(tab != 0)
# STDERR.puts "#{path}: Indentation error: #{tab}"
# end
end

beautifyRuby

Leave a comment