# Provides a numbering object that will produce letters. Accepts four # options for numbering that will control how the letters are presented # when given as #[](index). This numbering object will only provide 26 # values ("a" .. "z") unless :wrap is +true+. # # :transform:: The symbol representing the method to be called on # the letter. This must be a method that does not # require any arguments. # :postfix:: The value that will be appended to the letter # presented by #[]. Defaults to +nil+. # :prefix:: The value that will be prepended to the letter # presented by #[]. Defaults to +nil+. # :wrap:: If +true+, then indexes will be wrapped from "z" # to "a". # # a1 = Text::Format::Alpha.new(:postfix => ".") # puts a1[0] # => "a." # puts a1[1] # => "b. # puts a1[27] # => "" # # a2 = Text::Format::Alpha.new(:prefix => "A.") # puts a2[0] # => "A.a" # puts a2[1] # => "A.b" # puts a2[27] # => "" # # a3 = Text::Format::Alpha.new(:transform => :upcase) # puts a3[0] # => "A" # puts a3[1] # => "B" # puts a3[27] # => "" # # a4 = Text::Format::Alpha.new(:wrap => true) # puts a4[0] # => "a" # puts a4[27] # => "b" class Text::Format::Alpha def [](index) if @wrap ltr = (?a + (index % 26)).chr elsif index.between?(0, 25) ltr = (?a + index).chr else ltr = nil end if ltr if @transform "#{@prefix}#{ltr.send(transform)}#{@postfix}" else "#{@prefix}#{ltr}#{@postfix}" end else "" end end def initialize(options = {}) #:yields self: @transform = options[:transform] || nil @wrap = options[:wrap] || false @postfix = options[:postfix] || nil @prefix = options[:prefix] || nil end end