RailsでQRコードを生成する

せっかくなので、SVGで出力するクラスを作った。
空白と"■"で出力してみても、携帯はちゃんと読んでくれた…(最後の puts SVG_QRcode.new.to_text('testdata') )
http://www.kurinton.net/~snca/blogfiles/qrcon.jpg

require 'qrcode'

class SVG_QRcode < Qrcode
	attr_accessor :true_color, :false_color, :size, :x, :y, :quiet_zone

	def initialize ()
		super
		@true_color = 'black'
		@false_color = 'white'
		@size = 5
		@x, @y = 20, 20
		@quiet_zone = true
	end

	def to_a (text)
		self.make_qrcode(text).split.map {|it| it.scan(/./).map {|it| it == '1' }	}
	end

	def to_svg (text)
		result = ''
		cells = self.to_a(text)
		cells.each_with_index do
			|cols, y|
			cols.each_with_index do
				|v, x|
				result << %Q[<rect x="#{self.x + x * size}" y="#{self.y + y * size}" width="#{size}" height="#{size}" fill="#{color(v)}" />\n]
			end
		end
		result
	end

	def to_text (text)
		t, f = '', ' '
		body = self.make_qrcode(text).gsub(/1/, t).gsub(/0/, f).gsub(/^.+$/) {|s| f * 4 + s + f * 4 }
		quiet = (f * (body.split(/\n/)[0].size / 2) + "\n") * 4
		quiet + body + quiet
	end

	def color (v)
		v ? @true_color : @false_color
	end

	def x
		@quiet_zone ? [@x, @size * 4].min : @x
	end

	def y
		@quiet_zone ? [@y, @size * 4].min : @y
	end
end


if __FILE__ == $0
 	#テキストで出力
	#puts SVG_QRcode.new.to_text('testdata')

 	#SVGで出力
	puts '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">'
	file.puts SVG_QRcode.new.to_svg('testdata')
	file.puts '</svg>'

end