module RQRCode::Export::SVG

Constants

DEFAULT_SVG_ATTRIBUTES
SVG_PATH_COMMANDS

Public Instance Methods

as_svg(options = {}) click to toggle source

Render the SVG from the Qrcode.

Options: offset - Padding around the QR Code in pixels

(default 0)

fill - Background color e.g “ffffff”

(default none)

color - Foreground color e.g “000”

(default "000")

module_size - The Pixel size of each module

(defaults 11)

shape_rendering - SVG Attribute: auto | optimizeSpeed | crispEdges | geometricPrecision

(defaults crispEdges)

standalone - Whether to make this a full SVG file, or only an svg to embed in other svg

(default true)

use_path - Use <path> to render SVG rather than <rect> to significantly reduce size

and quality. This will become the default in future versions.
(default false)

viewbox - replace `width` and `height` in <svg> with a viewBox, allows CSS scaling

(default false)

svg_attributes - A optional hash of custom <svg> attributes. Existing attributes will remain.

(default {})
# File lib/rqrcode/export/svg.rb, line 158
def as_svg(options = {})
  fill = options[:fill]
  use_path = options[:use_path]
  offset = options[:offset].to_i || 0
  color = options[:color] || "000"
  shape_rendering = options[:shape_rendering] || "crispEdges"
  module_size = options[:module_size] || 11
  standalone = options[:standalone].nil? ? true : options[:standalone]
  viewbox = options[:viewbox].nil? ? false : options[:viewbox]
  svg_attributes = options[:svg_attributes] || {}

  # height and width dependent on offset and QR complexity
  dimension = (@qrcode.module_count * module_size) + (2 * offset)
  # use dimensions differently if we are using a viewBox
  dimensions_attr = viewbox ? %(viewBox="0 0 #{dimension} #{dimension}") : %(width="#{dimension}" height="#{dimension}")

  svg_tag_attributes = (DEFAULT_SVG_ATTRIBUTES + [
    dimensions_attr,
    %(shape-rendering="#{shape_rendering}")
  ] + svg_attributes.map { |k, v| %(#{k}="#{v}") }).join(" ")

  xml_tag = %(<?xml version="1.0" standalone="yes"?>)
  open_tag = %(<svg #{svg_tag_attributes}>)
  close_tag = "</svg>"

  output_tag = (use_path ? Path : Rect).new(@qrcode)
  output_tag.build(module_size, offset, color)

  if fill
    output_tag.result.unshift %(<rect width="#{dimension}" height="#{dimension}" x="0" y="0" style="fill:##{fill}"/>)
  end

  if standalone
    output_tag.result.unshift(xml_tag, open_tag)
    output_tag.result << close_tag
  end

  output_tag.result.join
end