# Provides a numbering object that will produce numbers. Accepts three # parameters for numbering that will control how the numbers are presented # when given as #[](index). # # :offset:: The number to add to the index in order to produce # the proper index. This is because #tag_text indexes # from 0, not 1. This defaults to 1. Any value less # than 1 will be set to 1 (because Romans did not know # about zero or negative numbers). # :lower:: Renders the Roman numerals in lowercase if +true+. # Defaults to +false+. # :postfix:: The value that will be appended to the number # presented by #[]. Defaults to +nil+. # :prefix:: The value that will be prepended to the number # presented by #[]. Defaults to +nil+. # # r1 = Text::Format::Roman.new(:postfix => ".") # puts r1[0] # => "I." # puts r1[8] # => "IX. # # r2 = Text::Format::Roman.new(:prefix => "M.") # puts r2[0] # => "M.I" # puts r2[8] # => "M.IX" # # r3 = Text::Format::Roman.new(:offset => 3) # puts r3[0] # => "III" # puts r3[9] # => "XII" # # r4 = Text::Format::Roman.new(:offset => 0) # puts r4[0] # => "I" # puts r4[8] # => "IX" # # r5 = Text::Format::Roman.new(:lower => true) # puts r5[0] # => "i" # puts r5[8] # => "ix" class Text::Format::Roman def [](index) roman = "" index += @offset # Do 1,000s roman << "M" * (index / 1000) index %= 1000 # Do 900s roman << "CM" * (index / 900) index %= 900 # Do 500s roman << "D" * (index / 500) index %= 500 # Do 400s roman << "CD" * (index / 400) index %= 400 # Do 100s roman << "C" * (index / 100) index %= 100 # Do 90s roman << "XC" * (index / 90) index %= 90 # Do 50s roman << "L" * (index / 50) index %= 50 # Do 40s roman << "XL" * (index / 40) index %= 40 # Do 10s roman << "X" * (index / 10) index %= 10 # Do 9s roman << "IX" * (index / 9) index %= 9 # Do 5s roman << "V" * (index / 5) index %= 5 # Do 4s roman << "IV" * (index / 4) index %= 4 # Do 1s roman << "I" * index roman.downcase! if @lower "#{@prefix}#{roman}#{@postfix}" end def initialize(options = {}) @offset = options[:offset].to_i || 1 @lower = options[:lower] || false @postfix = options[:postfix] || nil @prefix = options[:prefix] || nil @offset = 1 if @offset < 1 end end