Lately I've gotten used to using Ruby to generate particularly mind-numbing chunks of C# code. For example, if I had to write the following:
// Red Flag flagRed.Name = "Red"; flagRed.Text = "Red"; flagRed.OnSelected += new FlagSelectionHandler(flagRed).Handler; flagRed.Image = "flagRed.jpg"; flags.Add(flagRed); // Blue Flag flagBlue.Name = "Blue"; flagBlue.Text = "Blue"; flagBlue.OnSelected += new FlagSelectionHandler(flagBlue).Handler; flagBlue.Image = "flagBlue.jpg"; flags.Add(flagBlue); // ...and so on for green, yellow, orange, purple...
I can just fire up irb and type the following:
template = <<TEMPLATE // @ Flag flag@.Name = "@"; flag@.Text = "@"; flag@.OnSelected += new FlagSelectionHandler(flag@).Handler; flag@.Image = "flag@.jpg"; flags.Add(flag@); TEMPLATE ['Red', 'Blue', 'Green', 'Yellow', 'Orange', 'Purple'].each do |color| puts template.gsub(/\@/, color) end
and cut and paste the result to Visual Studio. So easy.
I also wanted to share this little bit of Ruby that parses Unicode script data and writes C# code with the result:
require 'net/http'
# get latest script from web
h = Net::HTTP.new('www.unicode.org', 80)
resp, data = h.get('/Public/UNIDATA/Scripts.txt', nil)
if resp.code !~ /^200/
raise "Error code: #{resp.code}"
end
list = []
scripts = []
# the full text is in 'data' var
data.each_with_index do |line, i|
# skip comments and all-whitespace lines
next if line !~ /[^\s]/ or line =~ /^#/
# parse single-point
if line =~ /^([0-9A-F]{4,})\s*;\s*(\w*)/
range = [$1, $1]
script = $2
# parse range
elsif line =~ /^([0-9A-F]{4,})\.\.([0-9A-F]{4,})\s*;\s*(\w*)/
range = [$1, $2]
script = $3
else
raise "Parse error on line #{i + 1}: #{line}"
end
list << [range, script]
scripts << script
end
scripts.uniq! # remove duplicates
# now print C#
list.each do |x|
(low, high), script = x
if (low == high)
puts "scripts.Add(0x#{low}, Script.#{script});"
else
puts "scripts.Add(0x#{low}, 0x#{high}, Script.#{script});"
end
end
puts
puts scripts.join(",\n")
This is the kind of thing at which Ruby really excels: banging out one-off text processing apps.