rqrcode 0.10.1 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. checksums.yaml +5 -5
  2. data/.github/workflows/ruby.yml +28 -0
  3. data/.gitignore +13 -0
  4. data/.rspec +2 -0
  5. data/CHANGELOG.md +79 -0
  6. data/Gemfile +4 -0
  7. data/Gemfile.lock +72 -0
  8. data/LICENSE.txt +21 -0
  9. data/README.md +223 -135
  10. data/Rakefile +10 -0
  11. data/_config.yml +1 -0
  12. data/bin/console +14 -0
  13. data/images/ansi-screen-shot.png +0 -0
  14. data/images/github-qrcode.png +0 -0
  15. data/images/github-qrcode.svg +32 -0
  16. data/lib/rqrcode/export/ansi.rb +22 -25
  17. data/lib/rqrcode/export/html.rb +8 -10
  18. data/lib/rqrcode/export/png.rb +62 -46
  19. data/lib/rqrcode/export/svg.rb +180 -24
  20. data/lib/rqrcode/export.rb +6 -0
  21. data/lib/rqrcode/qrcode/qrcode.rb +17 -0
  22. data/lib/rqrcode/qrcode.rb +3 -4
  23. data/lib/rqrcode/version.rb +3 -1
  24. data/lib/rqrcode.rb +8 -19
  25. data/rqrcode.gemspec +39 -0
  26. metadata +90 -60
  27. data/CHANGELOG +0 -97
  28. data/LICENSE +0 -19
  29. data/lib/rqrcode/core_ext/array/behavior.rb +0 -12
  30. data/lib/rqrcode/core_ext/array.rb +0 -5
  31. data/lib/rqrcode/core_ext/integer/bitwise.rb +0 -13
  32. data/lib/rqrcode/core_ext/integer.rb +0 -5
  33. data/lib/rqrcode/core_ext.rb +0 -5
  34. data/lib/rqrcode/qrcode/qr_8bit_byte.rb +0 -36
  35. data/lib/rqrcode/qrcode/qr_alphanumeric.rb +0 -47
  36. data/lib/rqrcode/qrcode/qr_bit_buffer.rb +0 -99
  37. data/lib/rqrcode/qrcode/qr_code.rb +0 -585
  38. data/lib/rqrcode/qrcode/qr_math.rb +0 -63
  39. data/lib/rqrcode/qrcode/qr_numeric.rb +0 -57
  40. data/lib/rqrcode/qrcode/qr_polynomial.rb +0 -78
  41. data/lib/rqrcode/qrcode/qr_rs_block.rb +0 -314
  42. data/lib/rqrcode/qrcode/qr_util.rb +0 -272
  43. data/test/data.rb +0 -25
  44. data/test/test_helper.rb +0 -5
  45. data/test/test_regresions.rb +0 -10
  46. data/test/test_rqrcode.rb +0 -155
  47. data/test/test_rqrcode_export.rb +0 -27
@@ -1,54 +1,51 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RQRCode
2
4
  module Export
3
5
  module ANSI
4
- ##
6
+ #
5
7
  # Returns a string of the QR code as
6
8
  # characters writen with ANSI background set.
7
- #
8
- # Options:
9
+ #
10
+ # Options:
9
11
  # light: Foreground ("\033[47m")
10
- # dark: Background ANSI code. ("\033[47m")
12
+ # dark: Background ANSI code. ("\033[40m")
11
13
  # fill_character: The written character. (' ')
12
14
  # quiet_zone_size: (4)
13
15
  #
14
- def as_ansi(options={})
16
+ def as_ansi(options = {})
15
17
  options = {
16
18
  light: "\033[47m",
17
19
  dark: "\033[40m",
18
- fill_character: ' ',
20
+ fill_character: " ",
19
21
  quiet_zone_size: 4
20
22
  }.merge(options)
21
23
 
22
- normal = "\033[m"
24
+ normal = "\033[m\n"
23
25
  light = options.fetch(:light)
24
26
  dark = options.fetch(:dark)
25
27
  fill_character = options.fetch(:fill_character)
26
28
  quiet_zone_size = options.fetch(:quiet_zone_size)
29
+ output = []
27
30
 
28
- output = ''
29
-
30
- @modules.each_index do |c|
31
-
31
+ @qrcode.modules.each_index do |c|
32
32
  # start row with quiet zone
33
33
  row = light + fill_character * quiet_zone_size
34
34
  previous_dark = false
35
35
 
36
- @modules.each_index do |r|
37
- if is_dark(c, r)
38
- # dark
36
+ @qrcode.modules.each_index do |r|
37
+ if @qrcode.checked?(c, r)
39
38
  if previous_dark != true
40
39
  row << dark
41
40
  previous_dark = true
42
41
  end
43
- row << fill_character
44
- else
42
+ elsif previous_dark != false
45
43
  # light
46
- if previous_dark != false
47
- row << light
48
- previous_dark = false
49
- end
50
- row << fill_character
44
+ row << light
45
+ previous_dark = false
51
46
  end
47
+
48
+ row << fill_character
52
49
  end
53
50
 
54
51
  # add quiet zone
@@ -58,18 +55,18 @@ module RQRCode
58
55
  row << fill_character * quiet_zone_size
59
56
 
60
57
  # always end with reset and newline
61
- row << normal + "\n"
58
+ row << normal
62
59
 
63
60
  output << row
64
61
  end
65
62
 
66
63
  # count the row width so we can add quiet zone rows
67
- width = output.each_line.first.scan(fill_character).length
64
+ width = output.first.scan(fill_character).length
68
65
 
69
- quiet_row = light + fill_character * width + normal + "\n"
66
+ quiet_row = light + fill_character * width + normal
70
67
  quiet_rows = quiet_row * quiet_zone_size
71
68
 
72
- return quiet_rows + output + quiet_rows
69
+ quiet_rows + output.join + quiet_rows
73
70
  end
74
71
  end
75
72
  end
@@ -1,16 +1,18 @@
1
- # Use this module to HTML-ify the QR code if you just want the default HTML
1
+ # frozen_string_literal: true
2
+
2
3
  module RQRCode
3
4
  module Export
4
5
  module HTML
5
-
6
+ #
7
+ # Use this module to HTML-ify the QR code if you just want the default HTML
6
8
  def as_html
7
- ['<table>', rows.as_html, '</table>'].join
9
+ ["<table>", rows.as_html, "</table>"].join
8
10
  end
9
11
 
10
12
  private
11
13
 
12
14
  def rows
13
- Rows.new(self)
15
+ Rows.new(@qrcode)
14
16
  end
15
17
 
16
18
  class Rows < Struct.new(:qr)
@@ -25,7 +27,7 @@ module RQRCode
25
27
 
26
28
  class Row < Struct.new(:qr, :qr_module, :row_index)
27
29
  def as_html
28
- ['<tr>', cells.map(&:as_html).join, '</tr>'].join
30
+ ["<tr>", cells.map(&:as_html).join, "</tr>"].join
29
31
  end
30
32
 
31
33
  def cells
@@ -39,11 +41,7 @@ module RQRCode
39
41
  end
40
42
 
41
43
  def html_class
42
- dark? ? 'black' : 'white'
43
- end
44
-
45
- def dark?
46
- qr.dark?(row_index, col_index)
44
+ qr.checked?(row_index, col_index) ? "black" : "white"
47
45
  end
48
46
  end
49
47
  end
@@ -1,69 +1,80 @@
1
- require 'chunky_png'
1
+ # frozen_string_literal: true
2
+
3
+ require "chunky_png"
2
4
 
3
5
  # This class creates PNG files.
4
- # Code from: https://github.com/DCarper/rqrcode
5
6
  module RQRCode
6
7
  module Export
7
8
  module PNG
8
-
9
- # Render the PNG from the Qrcode.
9
+ # Render the PNG from the QR Code.
10
+ #
11
+ # Options:
12
+ # fill - Background ChunkyPNG::Color, defaults to 'white'.
13
+ # color - Foreground ChunkyPNG::Color, defaults to 'black'.
14
+ #
15
+ # When option :file is supplied you can use the following ChunkyPNG constraints
16
+ # color_mode - The color mode to use. Use one of the ChunkyPNG::COLOR_* constants.
17
+ # (defaults to 'ChunkyPNG::COLOR_GRAYSCALE')
18
+ # bit_depth - The bit depth to use. This option is only used for indexed images.
19
+ # (defaults to 1 bit)
20
+ # interlace - Whether to use interlacing (true or false).
21
+ # (defaults to ChunkyPNG default)
22
+ # compression - The compression level for Zlib. This can be a value between 0 and 9, or a
23
+ # Zlib constant like Zlib::BEST_COMPRESSION
24
+ # (defaults to ChunkyPNG default)
10
25
  #
11
- # There are two sizing algoritams.
26
+ # There are two sizing algorithms.
12
27
  #
13
28
  # - Original that can result in blurry and hard to scan images
14
29
  # - Google's Chart API inspired sizing that resizes the module size to fit within the given image size.
15
- #
16
- # The Googleis one will be used when no options are given or when the new size option is used.
17
30
  #
18
- # Options:
19
- # fill - Background ChunkyPNG::Color, defaults to 'white'
20
- # color - Foreground ChunkyPNG::Color, defaults to 'black'
31
+ # The Googleis one will be used when no options are given or when the new size option is used.
21
32
  #
22
- # *Googleis*
23
- # size - Total size of PNG in pixels. The module size is calculated so it fits. (defaults to 90)
24
- # border_modules - Width of white border around in modules. (defaults to 4).
33
+ # *Google*
34
+ # size - Total size of PNG in pixels. The module size is calculated so it fits.
35
+ # (defaults to 120)
36
+ # border_modules - Width of white border around in modules.
37
+ # (defaults to 4).
25
38
  #
26
39
  # -- DONT USE border_modules OPTION UNLESS YOU KNOW ABOUT THE QUIET ZONE NEEDS OF QR CODES --
27
40
  #
28
41
  # *Original*
29
42
  # module_px_size - Image size, in pixels.
30
- # border - Border thickness, in pixels
43
+ # border - Border thickness, in pixels
31
44
  #
32
45
  # It first creates an image where 1px = 1 module, then resizes.
33
- # Defaults to 90x90 pixels, customizable by option.
46
+ # Defaults to 120x120 pixels, customizable by option.
34
47
  #
35
48
  def as_png(options = {})
36
-
37
49
  default_img_options = {
38
- :resize_gte_to => false,
39
- :resize_exactly_to => false,
40
- :fill => 'white',
41
- :color => 'black',
42
- :size => 120,
43
- :border_modules => 4,
44
- :file => false,
45
- :module_px_size => 6
50
+ bit_depth: 1,
51
+ border_modules: 4,
52
+ color_mode: ChunkyPNG::COLOR_GRAYSCALE,
53
+ color: "black",
54
+ file: false,
55
+ fill: "white",
56
+ module_px_size: 6,
57
+ resize_exactly_to: false,
58
+ resize_gte_to: false,
59
+ size: 120
46
60
  }
47
-
48
- googleis = options.length == 0 || (options[:size] != nil)
49
-
50
- options = default_img_options.merge(options) # reverse_merge
51
61
 
52
- fill = ChunkyPNG::Color(options[:fill])
53
- color = ChunkyPNG::Color(options[:color])
62
+ googleis = options.length == 0 || !options[:size].nil?
63
+ options = default_img_options.merge(options) # reverse_merge
64
+ fill = ChunkyPNG::Color(*(options[:fill].is_a?(Array) ? options[:fill] : [options[:fill]]))
65
+ color = ChunkyPNG::Color(*(options[:color].is_a?(Array) ? options[:color] : [options[:color]]))
54
66
  output_file = options[:file]
55
-
56
67
  module_px_size = nil
57
68
  border_px = nil
58
69
  png = nil
59
-
70
+
60
71
  if googleis
61
72
  total_image_size = options[:size]
62
73
  border_modules = options[:border_modules]
63
74
 
64
- module_px_size = (total_image_size.to_f / (self.module_count + 2 * border_modules).to_f).floor.to_i
75
+ module_px_size = (total_image_size.to_f / (@qrcode.module_count + 2 * border_modules).to_f).floor.to_i
65
76
 
66
- img_size = module_px_size * self.module_count
77
+ img_size = module_px_size * @qrcode.module_count
67
78
 
68
79
  remaining = total_image_size - img_size
69
80
  border_px = (remaining / 2.0).floor.to_i
@@ -73,43 +84,48 @@ module RQRCode
73
84
  border = options[:border_modules]
74
85
  total_border = border * 2
75
86
  module_px_size = if options[:resize_gte_to]
76
- (options[:resize_gte_to].to_f / (self.module_count + total_border).to_f).ceil.to_i
87
+ (options[:resize_gte_to].to_f / (@qrcode.module_count + total_border).to_f).ceil.to_i
77
88
  else
78
89
  options[:module_px_size]
79
90
  end
80
- border_px = border * module_px_size
91
+ border_px = border * module_px_size
81
92
  total_border_px = border_px * 2
82
93
  resize_to = options[:resize_exactly_to]
83
94
 
84
- img_size = module_px_size * self.module_count
95
+ img_size = module_px_size * @qrcode.module_count
85
96
  total_img_size = img_size + total_border_px
86
97
 
87
98
  png = ChunkyPNG::Image.new(total_img_size, total_img_size, fill)
88
99
  end
89
100
 
90
- self.modules.each_index do |x|
91
- self.modules.each_index do |y|
92
- if self.dark?(x, y)
101
+ @qrcode.modules.each_index do |x|
102
+ @qrcode.modules.each_index do |y|
103
+ if @qrcode.checked?(x, y)
93
104
  (0...module_px_size).each do |i|
94
105
  (0...module_px_size).each do |j|
95
- png[(y * module_px_size) + border_px + j , (x * module_px_size) + border_px + i] = color
106
+ png[(y * module_px_size) + border_px + j, (x * module_px_size) + border_px + i] = color
96
107
  end
97
108
  end
98
109
  end
99
110
  end
100
111
  end
101
-
112
+
102
113
  if !googleis && resize_to
103
- png = png.resize(resize_to, resize_to)
114
+ png = png.resize(resize_to, resize_to)
104
115
  end
105
116
 
106
-
107
117
  if output_file
108
- png.save(output_file,{ :color_mode => ChunkyPNG::COLOR_GRAYSCALE, :bit_depth =>1})
118
+ constraints = {
119
+ color_mode: options[:color_mode],
120
+ bit_depth: options[:bit_depth]
121
+ }
122
+ constraints[:interlace] = options[:interlace] if options.has_key?(:interlace)
123
+ constraints[:compression] = options[:compression] if options.has_key?(:compression)
124
+ png.save(output_file, constraints)
109
125
  end
126
+
110
127
  png
111
128
  end
112
-
113
129
  end
114
130
  end
115
131
  end
@@ -1,50 +1,206 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # This class creates a SVG files.
2
- # Code from: https://github.com/samvincent/rqrcode-rails3
4
+ # Initial code from: https://github.com/samvincent/rqrcode-rails3
3
5
  module RQRCode
4
6
  module Export
5
-
6
7
  module SVG
8
+ class BaseOutputSVG
9
+ attr_reader :result
10
+
11
+ def initialize(qrcode)
12
+ @qrcode = qrcode
13
+ @result = []
14
+ end
15
+ end
16
+
17
+ class Path < BaseOutputSVG
18
+ def build(module_size, offset, color)
19
+ modules_array = @qrcode.modules
20
+ matrix_width = matrix_height = modules_array.length + 1
21
+ empty_row = [Array.new(matrix_width - 1, false)]
22
+ edge_matrix = Array.new(matrix_height) { Array.new(matrix_width) }
23
+
24
+ (empty_row + modules_array + empty_row).each_cons(2).with_index do |row_pair, row_index|
25
+ first_row, second_row = row_pair
26
+
27
+ # horizontal edges
28
+ first_row.zip(second_row).each_with_index do |cell_pair, column_index|
29
+ edge = case cell_pair
30
+ when [true, false] then Edge.new column_index + 1, row_index, :left
31
+ when [false, true] then Edge.new column_index, row_index, :right
32
+ end
33
+
34
+ (edge_matrix[edge.start_y][edge.start_x] ||= []) << edge if edge
35
+ end
36
+
37
+ # vertical edges
38
+ ([false] + second_row + [false]).each_cons(2).each_with_index do |cell_pair, column_index|
39
+ edge = case cell_pair
40
+ when [true, false] then Edge.new column_index, row_index, :down
41
+ when [false, true] then Edge.new column_index, row_index + 1, :up
42
+ end
43
+
44
+ (edge_matrix[edge.start_y][edge.start_x] ||= []) << edge if edge
45
+ end
46
+ end
47
+
48
+ edge_count = edge_matrix.flatten.compact.count
49
+ path = []
50
+
51
+ while edge_count > 0
52
+ edge_loop = []
53
+ next_matrix_cell = edge_matrix.find(&:any?).find { |cell| cell&.any? }
54
+ edge = next_matrix_cell.first
55
+
56
+ while edge
57
+ edge_loop << edge
58
+ matrix_cell = edge_matrix[edge.start_y][edge.start_x]
59
+ matrix_cell.delete edge
60
+ edge_matrix[edge.start_y][edge.start_x] = nil if matrix_cell.empty?
61
+ edge_count -= 1
62
+
63
+ # try to find an edge continuing the current edge
64
+ edge = edge_matrix[edge.end_y][edge.end_x]&.first
65
+ end
66
+
67
+ first_edge = edge_loop.first
68
+ edge_loop_string = SVG_PATH_COMMANDS[:move]
69
+ edge_loop_string += "#{first_edge.start_x} #{first_edge.start_y}"
7
70
 
71
+ edge_loop.chunk(&:direction).to_a[0...-1].each do |direction, edges|
72
+ edge_loop_string << "#{SVG_PATH_COMMANDS[direction]}#{edges.length}"
73
+ end
74
+ edge_loop_string << SVG_PATH_COMMANDS[:close]
75
+
76
+ path << edge_loop_string
77
+ end
78
+
79
+ # Prefix hexadecimal colors unless using a named color (symbol)
80
+ color = "##{color}" unless color.is_a?(Symbol)
81
+
82
+ @result << %{<path d="#{path.join}" fill="#{color}" transform="translate(#{offset},#{offset}) scale(#{module_size})"/>}
83
+ end
84
+ end
85
+
86
+ class Rect < BaseOutputSVG
87
+ def build(module_size, offset, color)
88
+ # Prefix hexadecimal colors unless using a named color (symbol)
89
+ color = "##{color}" unless color.is_a?(Symbol)
90
+
91
+ @qrcode.modules.each_index do |c|
92
+ tmp = []
93
+ @qrcode.modules.each_index do |r|
94
+ y = c * module_size + offset
95
+ x = r * module_size + offset
96
+
97
+ next unless @qrcode.checked?(c, r)
98
+ tmp << %(<rect width="#{module_size}" height="#{module_size}" x="#{x}" y="#{y}" fill="#{color}"/>)
99
+ end
100
+
101
+ @result << tmp.join
102
+ end
103
+ end
104
+ end
105
+
106
+ class Edge < Struct.new(:start_x, :start_y, :direction)
107
+ def end_x
108
+ case direction
109
+ when :right then start_x + 1
110
+ when :left then start_x - 1
111
+ else start_x
112
+ end
113
+ end
114
+
115
+ def end_y
116
+ case direction
117
+ when :down then start_y + 1
118
+ when :up then start_y - 1
119
+ else start_y
120
+ end
121
+ end
122
+ end
123
+
124
+ DEFAULT_SVG_ATTRIBUTES = [
125
+ %(version="1.1"),
126
+ %(xmlns="http://www.w3.org/2000/svg"),
127
+ %(xmlns:xlink="http://www.w3.org/1999/xlink"),
128
+ %(xmlns:ev="http://www.w3.org/2001/xml-events")
129
+ ]
130
+
131
+ SVG_PATH_COMMANDS = {
132
+ move: "M",
133
+ up: "v-",
134
+ down: "v",
135
+ left: "h-",
136
+ right: "h",
137
+ close: "z"
138
+ }
139
+
140
+ #
8
141
  # Render the SVG from the Qrcode.
9
142
  #
10
143
  # Options:
11
- # offset - Padding around the QR Code (e.g. 10)
12
- # fill - Background color (e.g "ffffff" or :white)
13
- # color - Foreground color for the code (e.g. "000000" or :black)
14
- # module_size - The Pixel size of each module (e.g. 11)
15
- # shape_rendering - Defaults to crispEdges
144
+ # offset - Padding around the QR Code in pixels
145
+ # (default 0)
146
+ # fill - Background color e.g "ffffff"
147
+ # (default none)
148
+ # color - Foreground color e.g "000"
149
+ # (default "000")
150
+ # module_size - The Pixel size of each module
151
+ # (defaults 11)
152
+ # shape_rendering - SVG Attribute: auto | optimizeSpeed | crispEdges | geometricPrecision
153
+ # (defaults crispEdges)
154
+ # standalone - Whether to make this a full SVG file, or only an svg to embed in other svg
155
+ # (default true)
156
+ # use_path - Use <path> to render SVG rather than <rect> to significantly reduce size
157
+ # and quality. This will become the default in future versions.
158
+ # (default false)
159
+ # viewbox - replace `width` and `height` in <svg> with a viewBox, allows CSS scaling
160
+ # (default false)
161
+ # svg_attributes - A optional hash of custom <svg> attributes. Existing attributes will remain.
162
+ # (default {})
16
163
  #
17
- def as_svg(options={})
164
+ def as_svg(options = {})
165
+ fill = options[:fill]
166
+ use_path = options[:use_path]
18
167
  offset = options[:offset].to_i || 0
19
168
  color = options[:color] || "000"
20
169
  shape_rendering = options[:shape_rendering] || "crispEdges"
21
170
  module_size = options[:module_size] || 11
171
+ standalone = options[:standalone].nil? ? true : options[:standalone]
172
+ viewbox = options[:viewbox].nil? ? false : options[:viewbox]
173
+ svg_attributes = options[:svg_attributes] || {}
22
174
 
23
175
  # height and width dependent on offset and QR complexity
24
- dimension = (self.module_count*module_size) + (2*offset)
176
+ dimension = (@qrcode.module_count * module_size) + (2 * offset)
177
+ # use dimensions differently if we are using a viewBox
178
+ dimensions_attr = viewbox ? %(viewBox="0 0 #{dimension} #{dimension}") : %(width="#{dimension}" height="#{dimension}")
25
179
 
26
- xml_tag = %{<?xml version="1.0" standalone="yes"?>}
27
- open_tag = %{<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" width="#{dimension}" height="#{dimension}" shape-rendering="#{shape_rendering}">}
180
+ svg_tag_attributes = (DEFAULT_SVG_ATTRIBUTES + [
181
+ dimensions_attr,
182
+ %(shape-rendering="#{shape_rendering}")
183
+ ] + svg_attributes.map { |k, v| %(#{k}="#{v}") }).join(" ")
184
+
185
+ xml_tag = %(<?xml version="1.0" standalone="yes"?>)
186
+ open_tag = %(<svg #{svg_tag_attributes}>)
28
187
  close_tag = "</svg>"
29
188
 
30
- result = []
31
- self.modules.each_index do |c|
32
- tmp = []
33
- self.modules.each_index do |r|
34
- y = c*module_size + offset
35
- x = r*module_size + offset
189
+ output_tag = (use_path ? Path : Rect).new(@qrcode)
190
+ output_tag.build(module_size, offset, color)
36
191
 
37
- next unless self.is_dark(c, r)
38
- tmp << %{<rect width="#{module_size}" height="#{module_size}" x="#{x}" y="#{y}" style="fill:##{color}"/>}
39
- end
40
- result << tmp.join
192
+ if fill
193
+ # Prefix hexadecimal colors unless using a named color (symbol)
194
+ fill = "##{fill}" unless fill.is_a?(Symbol)
195
+ output_tag.result.unshift %(<rect width="#{dimension}" height="#{dimension}" x="0" y="0" fill="#{fill}"/>)
41
196
  end
42
197
 
43
- if options[:fill]
44
- result.unshift %{<rect width="#{dimension}" height="#{dimension}" x="0" y="0" style="fill:##{options[:fill]}"/>}
198
+ if standalone
199
+ output_tag.result.unshift(xml_tag, open_tag)
200
+ output_tag.result << close_tag
45
201
  end
46
202
 
47
- [xml_tag, open_tag, result, close_tag].flatten.join("\n")
203
+ output_tag.result.join
48
204
  end
49
205
  end
50
206
  end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rqrcode/export/ansi"
4
+ require "rqrcode/export/html"
5
+ require "rqrcode/export/png"
6
+ require "rqrcode/export/svg"
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "forwardable"
4
+
5
+ module RQRCode # :nodoc:
6
+ class QRCode
7
+ extend Forwardable
8
+ def_delegators :@qrcode, :to_s
9
+ def_delegators :@qrcode, :modules # deprecated
10
+
11
+ attr_reader :qrcode
12
+
13
+ def initialize(string, *args)
14
+ @qrcode = RQRCodeCore::QRCode.new(string, *args)
15
+ end
16
+ end
17
+ end
@@ -1,4 +1,3 @@
1
- Dir[File.dirname(__FILE__) + "/qrcode/*.rb"].sort.each do |path|
2
- filename = File.basename(path)
3
- require "rqrcode/qrcode/#{filename}"
4
- end
1
+ # frozen_string_literal: true
2
+
3
+ require "rqrcode/qrcode/qrcode"
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RQRCode
2
- VERSION = "0.10.1"
4
+ VERSION = "2.2.0"
3
5
  end
data/lib/rqrcode.rb CHANGED
@@ -1,19 +1,8 @@
1
- #!/usr/bin/env ruby
2
-
3
- #--
4
- # Copyright 2008 by Duncan Robertson (duncan@whomwah.com).
5
- # All rights reserved.
6
-
7
- # Permission is granted for use, copying, modification, distribution,
8
- # and distribution of modified versions of this work as long as the
9
- # above copyright notice is included.
10
- #++
11
-
12
- $LOAD_PATH.unshift(File.dirname(__FILE__))
13
-
14
- require "rqrcode/core_ext"
15
- require "rqrcode/qrcode"
16
- require 'rqrcode/export/png'
17
- require 'rqrcode/export/svg'
18
- require 'rqrcode/export/html'
19
- require 'rqrcode/export/ansi'
1
+ # frozen_string_literal: true
2
+
3
+ module RQRCode
4
+ require "rqrcode_core"
5
+ require "rqrcode/qrcode"
6
+ require "rqrcode/export"
7
+ require "rqrcode/version"
8
+ end
data/rqrcode.gemspec ADDED
@@ -0,0 +1,39 @@
1
+ lib = File.expand_path("../lib", __FILE__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require "rqrcode/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "rqrcode"
7
+ spec.version = RQRCode::VERSION
8
+ spec.platform = Gem::Platform::RUBY
9
+ spec.authors = ["Duncan Robertson"]
10
+ spec.email = ["duncan@whomwah.com"]
11
+
12
+ spec.summary = "A library to encode QR Codes"
13
+ spec.description = <<~EOF
14
+ rqrcode is a library for encoding QR Codes. The simple
15
+ interface allows you to create QR Code data structures
16
+ and then render them in the way you choose.
17
+ EOF
18
+ spec.homepage = "https://github.com/whomwah/rqrcode"
19
+ spec.license = "MIT"
20
+ spec.metadata = {
21
+ "bug_tracker_uri" => "https://github.com/whomwah/rqrcode/issues",
22
+ "changelog_uri" => "https://github.com/whomwah/rqrcode/blob/master/CHANGELOG.md"
23
+ }
24
+
25
+ spec.files = Dir.chdir(File.expand_path("..", __FILE__)) do
26
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
27
+ end
28
+ spec.bindir = "exe"
29
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
30
+ spec.require_paths = ["lib"]
31
+
32
+ spec.required_ruby_version = ">= 2.6"
33
+ spec.add_dependency "rqrcode_core", "~> 1.0"
34
+ spec.add_dependency "chunky_png", "~> 1.0"
35
+ spec.add_development_dependency "bundler", "~> 2.0"
36
+ spec.add_development_dependency "rake", "~> 13.0"
37
+ spec.add_development_dependency "rspec", "~> 3.5"
38
+ spec.add_development_dependency "standardrb", "~> 1.0"
39
+ end