1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
|
# frozen_string_literal: true
module RQRCodeCore
NUMERIC = %w[0 1 2 3 4 5 6 7 8 9].freeze
class QRNumeric
def initialize(data)
raise QRCodeArgumentError, "Not a numeric string `#{data}`" unless QRNumeric.valid_data?(data)
@data = data
end
def self.valid_data?(data)
(data.chars - NUMERIC).empty?
end
def write(buffer)
buffer.numeric_encoding_start(@data.size)
@data.size.times do |i|
if i % 3 == 0
chars = @data[i, 3]
bit_length = get_bit_length(chars.length)
buffer.put(get_code(chars), bit_length)
end
end
end
private
NUMBER_LENGTH = {
3 => 10,
2 => 7,
1 => 4
}.freeze
def get_bit_length(length)
NUMBER_LENGTH[length]
end
def get_code(chars)
chars.to_i
end
end
end
|