class Code
== Creation
QRCode objects expect only one required constructor parameter and an optional hash of any other. Here's a few examples:
qr = QRCode::Encoder::Code.new('hello world') qr = QRCode::Encoder::Code.new('hello world', size: 1, level: :m, mode: :alphanumeric)
Nested
Definitions
alias size module_count
Alias for module_count - the width/height of the QR code square
def self.build(data, level: :h, mode: :auto, size: nil, max_size: nil)
Factory method to build QR code from data
Signature
-
parameter
data
String, Array
The data to encode
-
parameter
level
Symbol
Error correction level (:l, :m, :q, :h)
-
parameter
mode
Symbol
Encoding mode (:auto, :number, :alphanumeric, :byte_8bit)
-
parameter
size
Integer
QR code version (auto-detected if not specified)
-
parameter
max_size
Integer
Maximum allowed version
Implementation
def self.build(data, level: :h, mode: :auto, size: nil, max_size: nil)
segments = Segment.build(data, mode: mode)
new(segments, level: level, size: size, max_size: max_size)
end
def initialize(segments, level: :h, size: nil, max_size: nil)
Simple constructor that takes an array of segments
Signature
-
parameter
segments
Array<Segment>
Array of segments to encode
-
parameter
level
Symbol
Error correction level (:l, :m, :q, :h)
-
parameter
size
Integer
QR code version (auto-detected if not specified)
-
parameter
max_size
Integer
Maximum allowed version
Implementation
def initialize(segments, level: :h, size: nil, max_size: nil)
@segments = Array(segments)
@error_correction_level = ERROR_CORRECTION_LEVEL[level]
unless @error_correction_level
raise ArgumentError, "Unknown error correction level `#{level.inspect}`"
end
max_size ||= Encoder::Util.max_size
calculated_size = size || minimum_version(limit: max_size)
if calculated_size > max_size
raise ArgumentError, "Given size greater than maximum possible size of #{max_size}"
end
@version = calculated_size
@module_count = @version * 4 + POSITION_PATTERN_LENGTH
@modules = Array.new(@module_count)
@data_cache = nil
make
end
def checked?(row, col)
checked? is called with a +col+ and +row+ parameter. This will return true or false based on whether that coordinate exists in the matrix returned. It would normally be called while iterating through modules. A simple example would be:
instance.checked?( 10, 10 ) => true
Implementation
def checked?(row, col)
if !row.between?(0, @module_count - 1) || !col.between?(0, @module_count - 1)
raise RuntimeError, "Invalid row/column pair: #{row}, #{col}"
end
@modules[row][col]
end
def to_s(*args)
This is a public method that returns the QR Code you have generated as a string. It will not be able to be read in this format by a QR Code reader, but will give you an idea if the final outout. It takes two optional args +:dark+ and +:light+ which are there for you to choose how the output looks. Here's an example of it's use:
instance.to_s => xxxxxxx x x x x x xx xxxxxxx x x xxx xxxxxx xxx x x x xxx x xxxxx x xx x xxx x
instance.to_s( dark: 'E', light: 'Q' ) => EEEEEEEQEQQEQEQQQEQEQQEEQQEEEEEEE EQQQQQEQQEEEQQEEEEEEQEEEQQEQQQQQE EQEEEQEQQEEEEEQEQQQQQQQEEQEQEEEQE
Implementation
def to_s(*args)
options = extract_options!(args)
dark = options[:dark] || "x"
light = options[:light] || " "
quiet_zone_size = options[:quiet_zone_size] || 0
rows = []
@modules.each do |row|
cols = light * quiet_zone_size
row.each do |col|
cols += (col ? dark : light)
end
rows << cols
end
quiet_zone_size.times do
rows.unshift(light * (rows.first.length / light.size))
rows << light * (rows.first.length / light.size)
end
rows.join("\n")
end
def inspect
Public overide as default inspect is very verbose
QRCode::Encoder::Code.new('my string to generate', size: 4, level: :h) => QRCodeCore: @data='my string to generate', @error_correction_level=2, @version=4, @module_count=33
Implementation
def inspect
"QRCodeCore: @segments=#{@segments.size} segments, @error_correction_level=#{@error_correction_level}, @version=#{@version}, @module_count=#{@module_count}"
end
def error_correction_level
Return a symbol for current error connection level
Implementation
def error_correction_level
ERROR_CORRECTION_LEVEL.invert[@error_correction_level]
end
def multi_segment?
Return true if this QR Code includes multiple encoded segments
Implementation
def multi_segment?
@segments.size > 1
end
def mode
Return the primary mode used (first segment's mode)
Implementation
def mode
@segments.first&.mode || :mode_8bit_byte
end