From a43bf169a0f74626db61100ee6862853efbc9e57 Mon Sep 17 00:00:00 2001 From: Stefan Schlott Date: Thu, 5 Sep 2013 16:49:22 +0200 Subject: [PATCH] Generate qr code for flyers --- Gemfile | 1 + Gemfile.lock | 6 ++++++ commands/create-flyer.rb | 39 +++++++++++++++++++++++++++++++++++++++ content/_data/aushang.svg | 4 ++-- lib/eventhelpers.rb | 10 ++++++++-- 5 files changed, 56 insertions(+), 4 deletions(-) diff --git a/Gemfile b/Gemfile index a959447a..1a34c70d 100644 --- a/Gemfile +++ b/Gemfile @@ -12,4 +12,5 @@ gem 't' gem 'nokogiri' gem 'feedzirra' gem 'ri_cal' +gem 'rqrcode_png' diff --git a/Gemfile.lock b/Gemfile.lock index 0ecd68d1..ef9965c6 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -8,6 +8,7 @@ GEM adsf (1.0.1) rack (>= 1.0.0) builder (3.2.2) + chunky_png (1.2.8) coderay (1.0.9) colored (1.2) cookiejar (0.3.0) @@ -95,6 +96,10 @@ GEM json (~> 1.4) retryable (1.3.2) ri_cal (0.8.8) + rqrcode (0.4.2) + rqrcode_png (0.1.1) + chunky_png + rqrcode sass (3.2.10) sax-machine (0.1.0) nokogiri (> 0.0.0) @@ -137,6 +142,7 @@ DEPENDENCIES nokogiri rdiscount ri_cal + rqrcode_png sass systemu t diff --git a/commands/create-flyer.rb b/commands/create-flyer.rb index bcf4c9f5..ac2f7275 100644 --- a/commands/create-flyer.rb +++ b/commands/create-flyer.rb @@ -3,7 +3,34 @@ aliases :cf summary 'creates svg for flyer' description 'Create SVG file with content of given event' + class CreateFlyer < ::Nanoc::CLI::CommandRunner + require 'rqrcode_png' + + # Monkey-patch qr generator + module RQRCodePNG + class Sequence + def border_width() + # No boundary around image + 0 + end + end + end + + def getQR(data) + qr = nil + size = 7 + while (!qr) + begin + qr = RQRCode::QRCode.new(data, :size => size, :level => :l) + rescue RQRCode::QRCodeRunTimeError + qr = nil + size = size + 1 + end + end + qr + end + def run # Check arguments if arguments.length!=2 @@ -24,6 +51,7 @@ class CreateFlyer < ::Nanoc::CLI::CommandRunner end # Collect data merge_item_location_data(event[:location], self.site.items['/_data/locations/'].attributes) + calculate_to_date(event) self.site.compile title = event[:title] date = event[:startdate] @@ -60,6 +88,16 @@ class CreateFlyer < ::Nanoc::CLI::CommandRunner "#{i[:startdate].strftime("%d.%m.%Y, %H:%M")}h: #{i[:title]}" end end + vevent = [] + vevent << "BEGIN:VEVENT" + vevent << "SUMMARY:#{event[:title]}" + vevent << "DTSTART:#{event[:startdate].getutc.strftime("%Y%m%dT%H%M%SZ")}" + vevent << "DTEND:#{event[:enddate].getutc.strftime("%Y%m%dT%H%M%SZ")}" + vevent << "LOCATION:#{location_name.join(", ")}" + vevent << "DESCRIPTION:Weitere Infos: #{site.config[:base_url]}#{event.path()}" + vevent << "END:VEVENT" + # Generate qr code + qr_img = getQR(vevent.join("\n")).to_img # Read template file = File.open(self.site.items['/_data/aushang/'].raw_filename(), "r:UTF-8") template = file.read @@ -71,6 +109,7 @@ class CreateFlyer < ::Nanoc::CLI::CommandRunner template.gsub!('${location.name}', location_name.join(", ")) template.gsub!('${location.address}', location_address.join(", ")) template.gsub!('${location.geo}', location_geo) + template.gsub!('${qrcode}', "#{qr_img.to_data_url}") for i in 0..5 do template.gsub!("${calendar.#{i}}", calendar[i] || "") end diff --git a/content/_data/aushang.svg b/content/_data/aushang.svg index 566be59d..ca5dc3d9 100644 --- a/content/_data/aushang.svg +++ b/content/_data/aushang.svg @@ -326,7 +326,7 @@ clip-path="url(#SVGID_2_)">${calendar.4}${calendar.5} \ No newline at end of file + id="flowPara3137">${calendar.5} diff --git a/lib/eventhelpers.rb b/lib/eventhelpers.rb index 3f1530fe..505b14f6 100644 --- a/lib/eventhelpers.rb +++ b/lib/eventhelpers.rb @@ -26,8 +26,8 @@ def get_public_events() items.select { |i| (i[:kind]=='event') && i[:public] } end -def calculate_to_dates() - items.select { |i| (i[:kind]=='event') && i[:duration] }.each do |e| +def calculate_to_date(e) + if e[:duration] if e[:startdate].instance_of?(Date) if e[:duration] =~ /(\d+)d/ e[:enddate] = e[:startdate] + ($1.to_i - 1) @@ -43,6 +43,12 @@ def calculate_to_dates() end end +def calculate_to_dates() + items.select { |i| (i[:kind]=='event') && i[:duration] }.each do |e| + calculate_to_date(e) + end +end + def conv_tz(t) if (t.utc?) Time.local(t.year, t.month, t.day, t.hour, t.min, t.sec)