class Deck::RackApp

Public Class Methods

app_root() click to toggle source
# File lib/deck/rack_app.rb, line 8
def self.app_root
  here = File.dirname(__FILE__)
  app_root = File.expand_path "#{here}/../.."
end
build(slide_files, options = {}) click to toggle source
# File lib/deck/rack_app.rb, line 17
def self.build slide_files, options = {}
  enable_thin_logging()

  Rack::Builder.app do
    use Rack::ShowExceptions
    use Rack::ShowStatus
    use Rack::Codehighlighter, :coderay,
      :element => "pre>code",
      :markdown => true,
      :pattern => /\A[:@]{3}\s?(\w+)\s*(\n|
)/i
    run ::Deck::RackApp.new(slide_files, options)
  end
end
enable_thin_logging() click to toggle source
# File lib/deck/rack_app.rb, line 31
def self.enable_thin_logging
  if const_defined?(:Thin)
    if require "thin/logging"
      Thin::Logging.debug = true
    end
  end
end
new(slide_files, options = {}) click to toggle source
# File lib/deck/rack_app.rb, line 39
def initialize slide_files, options = {}
  @options = options
  @slide_files = [slide_files].flatten.map do |slide_file|
    case slide_file
    when /\/?showoff(.*)\.json$/
      parse_showoff_json(slide_file)
    else
      File.new(slide_file)
    end
  end.flatten

  @file_servers =
    [::Deck::RackApp.public_file_server] +
    @slide_files.map do |slide_file|
      File.expand_path File.dirname(slide_file.path) if slide_file.is_a? File
    end.compact.uniq.map do |slide_file_dir|
      Rack::File.new(slide_file_dir)
    end
end
public_file_server() click to toggle source
# File lib/deck/rack_app.rb, line 13
def self.public_file_server
  Rack::File.new("#{app_root}/public")
end

Public Instance Methods

call(env) click to toggle source
# File lib/deck/rack_app.rb, line 86
def call env
  request = Rack::Request.new(env)
  if request.path == "/"
    [200, {'Content-Type' => 'text/html'}, [deck.to_pretty]]
  else
    result = [404, {}, []]
    @file_servers.each do |file_server|
      result = file_server.call(env)
      return result if result.first < 400
    end
    result
  end
end
deck() click to toggle source
# File lib/deck/rack_app.rb, line 100
def deck
  SlideDeck.new({:slides => slides}.merge(@options))
end
extract_options(config) click to toggle source
# File lib/deck/rack_app.rb, line 78
def extract_options(config)
  ["style", "transition"].each do |key|
    if config[key] and !@options[key.to_sym]
      @options[key.to_sym] = config[key]
    end
  end
end
extract_slides(config, json_file_dir) click to toggle source
# File lib/deck/rack_app.rb, line 67
def extract_slides(config, json_file_dir)
  config['sections'].map do |markdown_file|
    if markdown_file =~ /^# / # you can use literal markdown instead of a file name
      s = Slide.split(markdown_file)
      s
    else
      File.new(json_file_dir + '/' + markdown_file)
    end
  end
end
parse_showoff_json(slide_file) click to toggle source
# File lib/deck/rack_app.rb, line 59
def parse_showoff_json(slide_file)
  json_file_dir = File.expand_path(File.dirname(slide_file))
  json_file = slide_file
  config = JSON.parse(File.read(json_file))
  extract_options(config)
  extract_slides(config, json_file_dir)
end
slides() click to toggle source
# File lib/deck/rack_app.rb, line 104
def slides
  out = []
  @slide_files.each do |file|
    out += if file.is_a? Slide
      [file]
    else
      Slide.from_file file
    end
  end
  out
end