122 lines
3.9 KiB
Ruby
122 lines
3.9 KiB
Ruby
usage 'create-flyer eventnode outputdir'
|
|
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
|
|
puts command.help
|
|
exit 1
|
|
end
|
|
# Get node, check type
|
|
self.load_site
|
|
nodename = sanitize_path(arguments[0])
|
|
event = self.site.items[nodename]
|
|
if !event
|
|
puts "Node #{nodename} not found"
|
|
exit 1
|
|
end
|
|
if !event[:kind]=='event'
|
|
puts "Node #{nodename} is not an event"
|
|
exit 1
|
|
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]
|
|
speakers = event[:speakers].map { |s| if s[:affiliation] then "#{s[:name]} (#{s[:affiliation]})" else s[:name] end }
|
|
text = Nokogiri::HTML(event.compiled_content)
|
|
text = text.content.gsub(/\n+/,"\n")
|
|
location_name = [event[:location][:name]]
|
|
if (event[:location][:details])
|
|
location_name << event[:location][:details]
|
|
end
|
|
location_address = []
|
|
if (event[:location][:strasse])
|
|
location_address << event[:location][:strasse]
|
|
end
|
|
if (event[:location][:ort])
|
|
if (event[:location][:plz])
|
|
location_address << "#{event[:location][:plz]} #{event[:location][:ort]}"
|
|
else
|
|
location_address << event[:location][:ort]
|
|
end
|
|
end
|
|
location_geo = if (event[:location][:lon])
|
|
"N #{event[:location][:lon]} E #{event[:location][:lat]}"
|
|
else
|
|
""
|
|
end
|
|
calendar_items = self.site.items.select do |i|
|
|
(i[:kind]=='event') && (i[:startdate].to_datetime>event[:startdate].to_datetime) && !i.identifier.start_with?('/_data/stammtisch/')
|
|
end.sort { |a,b| a[:startdate].to_datetime <=> b[:startdate].to_datetime }
|
|
calendar = calendar_items[0..5].map do |i|
|
|
if i[:startdate].instance_of?(Date)
|
|
"#{i[:startdate].strftime("%d.%m.%Y")}: #{i[:title]}"
|
|
else
|
|
"#{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
|
|
file.close()
|
|
# Replace in template
|
|
template.gsub!('${title}', title)
|
|
template.gsub!('${date}', date.strftime("%d.%m.%Y, %H:%M"))
|
|
template.gsub!('${speakers}', speakers.join(', '))
|
|
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
|
|
# Output
|
|
File.open("#{arguments[1]}/aushang.svg", 'w:UTF-8') {|f| f.write(template) }
|
|
end
|
|
end
|
|
|
|
runner CreateFlyer
|
|
|