aboutsummaryrefslogblamecommitdiffstats
path: root/ramaskrik-program.rb
blob: 5dfe5d5bf59c732a6580ec79d924d65824d41f75 (plain) (tree)
1
2

                   















                                                                       

                                                        
              
                  
             


                            

                  
                        
             
 



                                                                             

                                          
                       







                                           
 





                                              
   
 



























































                                                                                      
 

                                                                 
#!/usr/bin/env ruby

# Ramaskrik Program Schedule plotter.
# Copyright (C) 2018  Harald Eilertsen <haraldei@anduin.net>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

$LOAD_PATH << File.join(File.dirname( __FILE__ ), "lib")

require 'date'
require 'delegate'
require 'erb'
require 'events'
require 'json'
require 'scrapers/ramaskrik'
require 'nokogiri'
require 'open-uri'
#require 'room-schedule'
require 'uri'

def generate_graphs(events)
  days = events.group_by { |event| event.start_time.strftime("%A %d.%m.%Y") }
  days.map do |day, events|
    rooms = events.group_by { |e| e.venue }

    graph = SVG::Graph::RoomSchedule.new({
      graph_title: day,
      show_graph_title: true,
      show_x_guidelines: true,
      width: 1280,
      height: rooms.keys.length * 100 + 25,
      key: false,
      x_label_format: "%H:%M",
      timescale_divisions: "30 minutes",
    })

    rooms.each do |title, data|
      graph.add_data(title: title, data: data)
    end

    yield graph
  end
end

class EventDecorator < SimpleDelegator
  attr_reader :offset
  attr_reader :height

  def calc_offsets(time_offset)
    @offset = (start_time - time_offset).to_i / 50
    @height = duration / 50;
    start_time + duration
  end
end

class SortedEventList
  attr_reader :venues
  attr_reader :events
  attr_reader :start_time
  attr_reader :end_time

  def initialize(events)
    @venues = events.map{ |e| e.venue }.uniq

    @events = events
      .sort{ |a,b| a.start_time - b.start_time }
      .map{ |e| EventDecorator.new(e) }

    @start_time = @events.first.start_time - (@events.first.start_time.min * 60)

    @events.group_by{|e| e.venue}.each do |venue, events|
      time_offset = start_time
      time_end = start_time
      events.each do |event|
        time_end = event.calc_offsets(time_offset)
      end

      @end_time = time_end if @end_time.nil? || @end_time < time_end
    end
  end
end

def import_events_from_json(input)
  JSON
    .parse(input)
    .map{ |obj| Events::Event.new(obj) }
    .group_by{ |e| e.date }
end

def make_sorted_event_lists_by_date(events_by_date)
  new_list = {}
  events_by_date.each do |date, events|
    new_list[date] = SortedEventList.new(events)
  end

  new_list
end

title = "Ramaskrik 2023 - Program"

eventlist = make_sorted_event_lists_by_date(import_events_from_json(IO.read(ARGV[0])))

t_html = ERB.new(IO.read("index.html.erb"), trim_mode: '>')
IO.write("index.html", t_html.result(binding))

t_ics = ERB.new(IO.read("program.ics.erb"), trim_mode: '<>')
IO.write("program.ics", t_ics.result(binding).gsub(/\n/, "\r\n"))