rqrcode 0.4.0 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,7 @@
1
+ *0.4.1* (Aug 16th, 2011)
2
+
3
+ * Compute common patterns only once (5% to 10% speedup) [https://github.com/gioele]
4
+
1
5
  *0.4.0* (Aug 13th, 2011)
2
6
 
3
7
  * Code optimization: 30% speedup [https://github.com/gioele]
@@ -0,0 +1,119 @@
1
+ # rQRCode, Encode QRCodes
2
+
3
+ ## Overview
4
+
5
+ rQRCode is a library for encoding QR Codes in Ruby. It has a simple interface with all the standard qrcode options. It was adapted from the Javascript library by Kazuhiko Arase.
6
+
7
+ Let's clear up some rQRCode stuff.
8
+
9
+ * rQRCode is a __standalone library__ It requires no other libraries. Just Ruby!
10
+ * It is an encoding library. You can't decode QR codes with it.
11
+ * The interface is simple and assumes you just want to encode a string into a QR code
12
+ * QR code is trademarked by Denso Wave inc
13
+
14
+ ## Resources
15
+
16
+ * wikipedia:: http://en.wikipedia.org/wiki/QR_Code
17
+ * Denso-Wave website:: http://www.denso-wave.com/qrcode/index-e.html
18
+ * kaywa:: http://qrcode.kaywa.com
19
+
20
+ ## Installing
21
+
22
+ You may get the latest stable version from Rubygems.
23
+
24
+ gem install rqrcode
25
+
26
+ You can also get the latest source from http://github.com/whomwah/rqrcode
27
+
28
+ git clone git://github.com/whomwah/rqrcode.git
29
+
30
+ ## Tests
31
+
32
+ To run the tests:
33
+
34
+ $ rake
35
+
36
+ ## Loading rQRCode Itself
37
+
38
+ You have installed the gem already, yeah?
39
+
40
+ require 'rubygems'
41
+ require 'rqrcode'
42
+
43
+ ## Simple QRCode generation to screen
44
+
45
+ ```ruby
46
+ qr = RQRCode::QRCode.new( 'my string to generate', :size => 4, :level => :h )
47
+ puts qr.to_s
48
+ #
49
+ # Prints:
50
+ # xxxxxxx x x x x x xx xxxxxxx
51
+ # x x xxx xxxxxx xxx x x
52
+ # x xxx x xxxxx x xx x xxx x
53
+ # ... etc
54
+ ```
55
+
56
+ ## Simple QRCode generation to template (RubyOnRails)
57
+
58
+ ```erb
59
+ # Controller
60
+ @qr = RQRCode::QRCode.new( 'my string to generate', :size => 4, :level => :h )
61
+
62
+ # View: (minimal styling added)
63
+ <style type="text/css">
64
+ table {
65
+ border-width: 0;
66
+ border-style: none;
67
+ border-color: #0000ff;
68
+ border-collapse: collapse;
69
+ }
70
+ td {
71
+ border-width: 0;
72
+ border-style: none;
73
+ border-color: #0000ff;
74
+ border-collapse: collapse;
75
+ padding: 0;
76
+ margin: 0;
77
+ width: 10px;
78
+ height: 10px;
79
+ }
80
+ td.black { background-color: #000; }
81
+ td.white { background-color: #fff; }
82
+ </style>
83
+
84
+ <table>
85
+ <% @qr.modules.each_index do |x| %>
86
+ <tr>
87
+ <% @qr.modules.each_index do |y| %>
88
+ <% if @qr.dark?(x,y) %>
89
+ <td class="black"/>
90
+ <% else %>
91
+ <td class="white"/>
92
+ <% end %>
93
+ <% end %>
94
+ </tr>
95
+ <% end %>
96
+ </table>
97
+ ```
98
+
99
+ ## Authors
100
+
101
+ Original author: Duncan Robertson
102
+
103
+ Special thanks to the following people for submitting patches:
104
+
105
+ * [Gioele Barabucci](https://github.com/gioele)
106
+ * [Rob la Lau](https://github.com/ohreally)
107
+ * [Chris Mowforth](http://blog.99th.st)
108
+ * [Tore Darell](http://tore.darell.no)
109
+ * [Daniel Schierbeck](https://github.com/dasch)
110
+ * Vladislav Gorodetskiy
111
+
112
+ ## Contributing
113
+ * Fork the project
114
+ * Send a pull request
115
+ * Don't touch the .gemspec, I'll do that when I release a new version
116
+
117
+ ## Copyright
118
+
119
+ MIT Licence (http://www.opensource.org/licenses/mit-license.html)
@@ -47,6 +47,9 @@ module RQRCode #:nodoc:
47
47
  Proc.new { |i,j| ((i * j) % 3 + (i + j) % 2) % 2 == 0 },
48
48
  ]
49
49
 
50
+ QRPOSITIONPATTERNLENGTH = (7 + 1) * 2 + 1
51
+ QRFORMATINFOLENGTH = 15
52
+
50
53
  # StandardErrors
51
54
 
52
55
  class QRCodeArgumentError < ArgumentError; end
@@ -95,8 +98,8 @@ module RQRCode #:nodoc:
95
98
 
96
99
  @data = string
97
100
  @error_correct_level = QRERRORCORRECTLEVEL[level]
98
- @type_number = size
99
- @module_count = @type_number * 4 + 17
101
+ @version = size
102
+ @module_count = @version * 4 + QRPOSITIONPATTERNLENGTH
100
103
  @modules = Array.new( @module_count )
101
104
  @data_list = QR8bitByte.new( @data )
102
105
  @data_cache = nil
@@ -113,7 +116,7 @@ module RQRCode #:nodoc:
113
116
  #
114
117
 
115
118
  def is_dark( row, col )
116
- if row < 0 || @module_count <= row || col < 0 || @module_count <= col
119
+ if !row.between?(0, @module_count - 1) || !col.between?(0, @module_count - 1)
117
120
  raise QRCodeRunTimeError, "Invalid row/column pair: #{row}, #{col}"
118
121
  end
119
122
  @modules[row][col]
@@ -163,29 +166,33 @@ module RQRCode #:nodoc:
163
166
  protected
164
167
 
165
168
  def make #:nodoc:
169
+ prepare_common_patterns
166
170
  make_impl( false, get_best_mask_pattern )
167
171
  end
168
172
 
169
173
  private
170
174
 
175
+ def prepare_common_patterns
176
+ @modules.map! { |row| Array.new(@module_count) }
171
177
 
172
- def make_impl( test, mask_pattern ) #:nodoc:
178
+ place_position_probe_pattern(0, 0)
179
+ place_position_probe_pattern(@module_count - 7, 0)
180
+ place_position_probe_pattern(0, @module_count - 7)
181
+ place_position_adjust_pattern
182
+ place_timing_pattern
173
183
 
174
- ( 0...@module_count ).each do |row|
175
- @modules[row] = Array.new( @module_count )
176
- end
184
+ @common_patterns = @modules.map(&:clone)
185
+ end
177
186
 
178
- setup_position_probe_pattern( 0, 0 )
179
- setup_position_probe_pattern( @module_count - 7, 0 )
180
- setup_position_probe_pattern( 0, @module_count - 7 )
181
- setup_position_adjust_pattern
182
- setup_timing_pattern
183
- setup_type_info( test, mask_pattern )
184
- setup_type_number( test ) if @type_number >= 7
187
+ def make_impl( test, mask_pattern ) #:nodoc:
188
+ @modules = @common_patterns.map(&:clone)
189
+
190
+ place_format_info(test, mask_pattern)
191
+ place_version_info(test) if @version >= 7
185
192
 
186
193
  if @data_cache.nil?
187
194
  @data_cache = QRCode.create_data(
188
- @type_number, @error_correct_level, @data_list
195
+ @version, @error_correct_level, @data_list
189
196
  )
190
197
  end
191
198
 
@@ -193,16 +200,19 @@ module RQRCode #:nodoc:
193
200
  end
194
201
 
195
202
 
196
- def setup_position_probe_pattern( row, col ) #:nodoc:
197
- ( -1..7 ).each do |r|
198
- next if ( row + r ) <= -1 || @module_count <= ( row + r )
199
- ( -1..7 ).each do |c|
200
- next if ( col + c ) <= -1 || @module_count <= ( col + c )
201
- if 0 <= r && r <= 6 && ( c == 0 || c == 6 ) || 0 <= c && c <= 6 && ( r == 0 || r == 6 ) || 2 <= r && r <= 4 && 2 <= c && c <= 4
202
- @modules[row + r][col + c] = true;
203
- else
204
- @modules[row + r][col + c] = false;
205
- end
203
+ def place_position_probe_pattern( row, col ) #:nodoc:
204
+ (-1..7).each do |r|
205
+ next if !(row + r).between?(0, @module_count - 1)
206
+
207
+ (-1..7).each do |c|
208
+ next if !(col + c).between?(0, @module_count - 1)
209
+
210
+ is_vert_line = (r.between?(0, 6) && (c == 0 || c == 6))
211
+ is_horiz_line = (c.between?(0, 6) && (r == 0 || r == 6))
212
+ is_square = r.between?(2,4) && c.between?(2, 4)
213
+
214
+ is_part_of_probe = is_vert_line || is_horiz_line || is_square
215
+ @modules[row + r][col + c] = is_part_of_probe
206
216
  end
207
217
  end
208
218
  end
@@ -225,30 +235,24 @@ module RQRCode #:nodoc:
225
235
  end
226
236
 
227
237
 
228
- def setup_timing_pattern #:nodoc:
238
+ def place_timing_pattern #:nodoc:
229
239
  ( 8...@module_count - 8 ).each do |i|
230
240
  @modules[i][6] = @modules[6][i] = i % 2 == 0
231
241
  end
232
242
  end
233
243
 
234
244
 
235
- def setup_position_adjust_pattern #:nodoc:
236
- pos = QRUtil.get_pattern_position(@type_number)
237
-
238
- ( 0...pos.size ).each do |i|
239
- ( 0...pos.size ).each do |j|
240
- row = pos[i]
241
- col = pos[j]
245
+ def place_position_adjust_pattern #:nodoc:
246
+ positions = QRUtil.get_pattern_positions(@version)
242
247
 
248
+ positions.each do |row|
249
+ positions.each do |col|
243
250
  next unless @modules[row][col].nil?
244
251
 
245
252
  ( -2..2 ).each do |r|
246
253
  ( -2..2 ).each do |c|
247
- if r == -2 || r == 2 || c == -2 || c == 2 || ( r == 0 && c == 0 )
248
- @modules[row + r][col + c] = true
249
- else
250
- @modules[row + r][col + c] = false
251
- end
254
+ is_part_of_pattern = (r.abs == 2 || c.abs == 2 || ( r == 0 && c == 0 ))
255
+ @modules[row + r][col + c] = is_part_of_pattern
252
256
  end
253
257
  end
254
258
  end
@@ -256,8 +260,8 @@ module RQRCode #:nodoc:
256
260
  end
257
261
 
258
262
 
259
- def setup_type_number( test ) #:nodoc:
260
- bits = QRUtil.get_bch_type_number( @type_number )
263
+ def place_version_info(test) #:nodoc:
264
+ bits = QRUtil.get_bch_version(@version)
261
265
 
262
266
  ( 0...18 ).each do |i|
263
267
  mod = ( !test && ( (bits >> i) & 1) == 1 )
@@ -267,30 +271,32 @@ module RQRCode #:nodoc:
267
271
  end
268
272
 
269
273
 
270
- def setup_type_info( test, mask_pattern ) #:nodoc:
274
+ def place_format_info(test, mask_pattern) #:nodoc:
271
275
  data = (@error_correct_level << 3 | mask_pattern)
272
- bits = QRUtil.get_bch_type_info( data )
276
+ bits = QRUtil.get_bch_format_info(data)
273
277
 
274
- ( 0...15 ).each do |i|
278
+ QRFORMATINFOLENGTH.times do |i|
275
279
  mod = (!test && ( (bits >> i) & 1) == 1)
276
280
 
277
281
  # vertical
278
282
  if i < 6
279
- @modules[i][8] = mod
283
+ row = i
280
284
  elsif i < 8
281
- @modules[ i + 1 ][8] = mod
285
+ row = i + 1
282
286
  else
283
- @modules[ @module_count - 15 + i ][8] = mod
287
+ row = @module_count - 15 + i
284
288
  end
289
+ @modules[row][8] = mod
285
290
 
286
291
  # horizontal
287
292
  if i < 8
288
- @modules[8][ @module_count - i - 1 ] = mod
293
+ col = @module_count - i - 1
289
294
  elsif i < 9
290
- @modules[8][ 15 - i - 1 + 1 ] = mod
295
+ col = 15 - i - 1 + 1
291
296
  else
292
- @modules[8][ 15 - i - 1 ] = mod
297
+ col = 15 - i - 1
293
298
  end
299
+ @modules[8][col] = mod
294
300
  end
295
301
 
296
302
  # fixed module
@@ -346,14 +352,14 @@ module RQRCode #:nodoc:
346
352
  return max_data_bytes * 8
347
353
  end
348
354
 
349
- def QRCode.create_data( type_number, error_correct_level, data_list ) #:nodoc:
350
- rs_blocks = QRRSBlock.get_rs_blocks( type_number, error_correct_level )
355
+ def QRCode.create_data(version, error_correct_level, data_list) #:nodoc:
356
+ rs_blocks = QRRSBlock.get_rs_blocks(version, error_correct_level)
351
357
  buffer = QRBitBuffer.new
352
358
 
353
359
  data = data_list
354
360
  buffer.put( data.mode, 4 )
355
361
  buffer.put(
356
- data.get_length, QRUtil.get_length_in_bits( data.mode, type_number )
362
+ data.get_length, QRUtil.get_length_in_bits(data.mode, version)
357
363
  )
358
364
  data.write( buffer )
359
365
 
@@ -268,12 +268,12 @@ RQRCode::QRRSBlock::RS_BLOCK_TABLE = [
268
268
 
269
269
  ]
270
270
 
271
- def QRRSBlock.get_rs_blocks( type_no, error_correct_level )
272
- rs_block = QRRSBlock.get_rs_block_table( type_no, error_correct_level )
271
+ def QRRSBlock.get_rs_blocks(version, error_correct_level)
272
+ rs_block = QRRSBlock.get_rs_block_table(version, error_correct_level)
273
273
 
274
274
  if rs_block.nil?
275
275
  raise QRCodeRunTimeError,
276
- "bad rsblock @ typeno: #{type_no}/error_correct_level:#{error_correct_level}"
276
+ "bad rsblock @ version: #{version}/error_correct_level:#{error_correct_level}"
277
277
  end
278
278
 
279
279
  length = rs_block.size / 3
@@ -293,16 +293,16 @@ RQRCode::QRRSBlock::RS_BLOCK_TABLE = [
293
293
  end
294
294
 
295
295
 
296
- def QRRSBlock.get_rs_block_table( type_number, error_correct_level )
296
+ def QRRSBlock.get_rs_block_table(version, error_correct_level)
297
297
  case error_correct_level
298
298
  when QRERRORCORRECTLEVEL[:l]
299
- QRRSBlock::RS_BLOCK_TABLE[(type_number - 1) * 4 + 0]
299
+ QRRSBlock::RS_BLOCK_TABLE[(version - 1) * 4 + 0]
300
300
  when QRERRORCORRECTLEVEL[:m]
301
- QRRSBlock::RS_BLOCK_TABLE[(type_number - 1) * 4 + 1]
301
+ QRRSBlock::RS_BLOCK_TABLE[(version - 1) * 4 + 1]
302
302
  when QRERRORCORRECTLEVEL[:q]
303
- QRRSBlock::RS_BLOCK_TABLE[(type_number - 1) * 4 + 2]
303
+ QRRSBlock::RS_BLOCK_TABLE[(version - 1) * 4 + 2]
304
304
  when QRERRORCORRECTLEVEL[:h]
305
- QRRSBlock::RS_BLOCK_TABLE[(type_number - 1) * 4 + 3]
305
+ QRRSBlock::RS_BLOCK_TABLE[(version - 1) * 4 + 3]
306
306
  else
307
307
  nil
308
308
  end
@@ -73,7 +73,7 @@ module RQRCode #:nodoc:
73
73
  QRMODE[:mode_kanji] => [8, 10, 12],
74
74
  }
75
75
 
76
- def QRUtil.get_bch_type_info( data )
76
+ def QRUtil.get_bch_format_info( data )
77
77
  d = data << 10
78
78
  while QRUtil.get_bch_digit(d) - QRUtil.get_bch_digit(G15) >= 0
79
79
  d ^= (G15 << (QRUtil.get_bch_digit(d) - QRUtil.get_bch_digit(G15)))
@@ -82,7 +82,7 @@ module RQRCode #:nodoc:
82
82
  end
83
83
 
84
84
 
85
- def QRUtil.get_bch_type_number( data )
85
+ def QRUtil.get_bch_version(data)
86
86
  d = data << 12
87
87
  while QRUtil.get_bch_digit(d) - QRUtil.get_bch_digit(G18) >= 0
88
88
  d ^= (G18 << (QRUtil.get_bch_digit(d) - QRUtil.get_bch_digit(G18)))
@@ -103,8 +103,8 @@ module RQRCode #:nodoc:
103
103
  end
104
104
 
105
105
 
106
- def QRUtil.get_pattern_position( type_number )
107
- PATTERN_POSITION_TABLE[ type_number - 1 ]
106
+ def QRUtil.get_pattern_positions(version)
107
+ PATTERN_POSITION_TABLE[version - 1]
108
108
  end
109
109
 
110
110
 
@@ -128,27 +128,27 @@ module RQRCode #:nodoc:
128
128
  end
129
129
 
130
130
 
131
- def QRUtil.get_length_in_bits(mode, type)
131
+ def QRUtil.get_length_in_bits(mode, version)
132
132
  if !QRMODE.value?(mode)
133
133
  raise QRCodeRunTimeError, "Unknown mode: #{mode}"
134
134
  end
135
135
 
136
- if type > 40
137
- raise QRCodeRunTimeError, "Unknown type: #{type}"
136
+ if version > 40
137
+ raise QRCodeRunTimeError, "Unknown version: #{version}"
138
138
  end
139
139
 
140
- if 1 <= type && type <= 9
140
+ if version.between?(1, 9)
141
141
  # 1 - 9
142
- macro_type = 0
143
- elsif type <= 26
142
+ macro_version = 0
143
+ elsif version <= 26
144
144
  # 10 - 26
145
- macro_type = 1
146
- elsif type <= 40
145
+ macro_version = 1
146
+ elsif version <= 40
147
147
  # 27 - 40
148
- macro_type = 2
148
+ macro_version = 2
149
149
  end
150
150
 
151
- return BITS_FOR_MODE[mode][macro_type]
151
+ return BITS_FOR_MODE[mode][macro_version]
152
152
  end
153
153
 
154
154
  def QRUtil.get_lost_points(modules)
@@ -1,3 +1,3 @@
1
1
  module RQRCode
2
- VERSION = "0.4.0"
2
+ VERSION = "0.4.1"
3
3
  end
@@ -22,7 +22,7 @@ EOF
22
22
  s.add_development_dependency("bundler", ">= 1.0.0")
23
23
 
24
24
  s.has_rdoc = true
25
- s.extra_rdoc_files = ["README.org", "CHANGELOG", "LICENSE"]
25
+ s.extra_rdoc_files = ["README.md", "CHANGELOG", "LICENSE"]
26
26
  s.files = `git ls-files`.split("\n")
27
27
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
28
28
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
@@ -71,10 +71,10 @@ class QRCodeTest < Test::Unit::TestCase
71
71
 
72
72
  def test_to_s
73
73
  qr = RQRCode::QRCode.new( 'duncan', :size => 1 )
74
- assert_equal qr.to_s[0..21], "xxxxxxx xx x xxxxxxx\n"
75
- assert_equal qr.to_s( :true => 'q', :false => 'n' )[0..21],
76
- "qqqqqqqnqqnqnnqqqqqqq\n"
77
- assert_equal qr.to_s( :true => '@' )[0..21], "@@@@@@@ @@ @ @@@@@@@\n"
74
+ assert_equal "xxxxxxx xx x xxxxxxx\n", qr.to_s[0..21]
75
+ assert_equal "qqqqqqqnqqnqnnqqqqqqq\n",
76
+ qr.to_s( :true => 'q', :false => 'n' )[0..21]
77
+ assert_equal "@@@@@@@ @@ @ @@@@@@@\n", qr.to_s( :true => '@' )[0..21]
78
78
  end
79
79
 
80
80
  def test_rszf_error_not_thrown
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rqrcode
3
3
  version: !ruby/object:Gem::Version
4
- hash: 15
4
+ hash: 13
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 4
9
- - 0
10
- version: 0.4.0
9
+ - 1
10
+ version: 0.4.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - Duncan Robertson
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-08-14 00:00:00 +01:00
18
+ date: 2011-08-16 00:00:00 +01:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -60,7 +60,7 @@ executables: []
60
60
  extensions: []
61
61
 
62
62
  extra_rdoc_files:
63
- - README.org
63
+ - README.md
64
64
  - CHANGELOG
65
65
  - LICENSE
66
66
  files:
@@ -68,7 +68,7 @@ files:
68
68
  - CHANGELOG
69
69
  - Gemfile
70
70
  - LICENSE
71
- - README.org
71
+ - README.md
72
72
  - Rakefile
73
73
  - lib/rqrcode.rb
74
74
  - lib/rqrcode/core_ext.rb
data/README.org DELETED
@@ -1,108 +0,0 @@
1
- * rQRCode, Encode QRCodes
2
-
3
- ** Overview
4
-
5
- rQRCode is a library for encoding QR Codes in Ruby. It has a simple interface with all the standard qrcode options. It was adapted from the Javascript library by Kazuhiko Arase.
6
-
7
- Let's clear up some rQRCode stuff.
8
-
9
- - rQRCode is a *standalone library*. It requires no other libraries. Just Ruby!
10
- - It is an encoding library. You can't decode QR codes with it.
11
- - The interface is simple and assumes you just want to encode a string into a QR code
12
- - QR code is trademarked by Denso Wave inc
13
-
14
- ** Resources
15
-
16
- - wikipedia:: http://en.wikipedia.org/wiki/QR_Code
17
- - Denso-Wave website:: http://www.denso-wave.com/qrcode/index-e.html
18
- - kaywa:: http://qrcode.kaywa.com
19
-
20
- ** Installing
21
-
22
- You may get the latest stable version from Rubygems.
23
-
24
- : $ gem install rqrcode
25
-
26
- You can also get the source from http://github.com/whomwah/rqrcode
27
-
28
- : $ git clone git://github.com/whomwah/rqrcode.git
29
-
30
- ** Loading rQRCode Itself
31
-
32
- You have installed the gem already, yeah?
33
-
34
- : require 'rubygems'
35
- : require 'rqrcode'
36
-
37
- ** Simple QRCode generation to screen
38
-
39
- : qr = RQRCode::QRCode.new( 'my string to generate', :size => 4, :level => :h )
40
- : puts qr.to_s
41
- : #
42
- : # Prints:
43
- : # xxxxxxx x x x x x xx xxxxxxx
44
- : # x x xxx xxxxxx xxx x x
45
- : # x xxx x xxxxx x xx x xxx x
46
- : # ... etc
47
-
48
- ** Simple QRCode generation to template (RubyOnRails)
49
-
50
- : # Controller
51
- : @qr = RQRCode::QRCode.new( 'my string to generate', :size => 4, :level => :h )
52
- :
53
- : # View: (minimal styling added)
54
- : <style type="text/css">
55
- : table {
56
- : border-width: 0;
57
- : border-style: none;
58
- : border-color: #0000ff;
59
- : border-collapse: collapse;
60
- : }
61
- : td {
62
- : border-width: 0;
63
- : border-style: none;
64
- : border-color: #0000ff;
65
- : border-collapse: collapse;
66
- : padding: 0;
67
- : margin: 0;
68
- : width: 10px;
69
- : height: 10px;
70
- : }
71
- : td.black { background-color: #000; }
72
- : td.white { background-color: #fff; }
73
- : </style>
74
- :
75
- : <table>
76
- : <% @qr.modules.each_index do |x| %>
77
- : <tr>
78
- : <% @qr.modules.each_index do |y| %>
79
- : <% if @qr.dark?(x,y) %>
80
- : <td class="black"/>
81
- : <% else %>
82
- : <td class="white"/>
83
- : <% end %>
84
- : <% end %>
85
- : </tr>
86
- : <% end %>
87
- : </table>
88
-
89
- ** Authors
90
-
91
- Original author: Duncan Robertson
92
-
93
- Special thanks to the following people for submitting patches:
94
-
95
- - Gioele Barabucci
96
- - Rob la Lau
97
- - Chris Mowforth
98
- - Tore Darell
99
- - Vladislav Gorodetskiy
100
-
101
- ** Contributing
102
- - Fork the project
103
- - Send a pull request
104
- - Don't touch the .gemspec, I'll do that when I release a new version
105
-
106
- ** Copyright
107
-
108
- MIT Licence (http://www.opensource.org/licenses/mit-license.html)