#!/usr/bin/ruby require 'rubygems' require 'cgi' require 'erb' require 'dbi' require 'json/add/rails' class LayoutTest def main init parse_opts connect_to_gallery read_blocks_info read_layout_info output_layout rescue => e fatals_to_browser e end protected def fatals_to_browser err erb('fatal',:err => err) exit end def init @cgi = CGI.new('html3') print @cgi.header end def parse_opts @block = @cgi['block'] @block = 'pcore' if @block.empty? @parent = @cgi['parent'] end def connect_to_gallery @dbi = DBI.connect('DBI:mysql:db_name:host', 'username','passwd') end def read_blocks_info @children = read_children_of(@block) end def read_children_of block query("select block from blocks_info " + "where `prop` = 'parent' and " + "`value` = '#{@block}'"). map { |row| row['block'] } end def read_layout_info @instance = {} @layout = {} instances = query("select * from layout_instance " + "where `cell` = '#{@block}'") instances.each do |inst| @instance[inst['instance']] = inst #puts "#{inst['instance']} = #{inst.inspect}" end chillins = @children.map{|c| "'#{c}'"}.join(',') layouts = query("select * from layout_info " + "where `cell` in ('#{@block}',#{chillins})") layouts.each do |lo| @layout[lo['cell']] = lo #puts "#{lo['cell']} = #{lo.inspect}" end end def output_layout erb('index') end def layout_block lo = @layout[@block] %Q{layout.block('#{@block}',#{lo.to_json});} end def layout_child child output = '' @instance.values.each do |inst| next unless inst['child'] == child lo = @layout[child].dup.merge(inst) output << %Q{layout.block('#{inst['instance']}',#{lo.to_json});} end output end def query sql rows = [] sth = @dbi.execute(sql) sth.fetch_hash do |row| rows << row.dup end sth.finish rows end def erb tname, vals={} v = vals template = IO.read("#{tname}.html.erb") print ERB.new(template).result(binding()) end end LayoutTest.new.main