Class: Deck::RackApp

Inherits:
Object
  • Object
show all
Defined in:
lib/deck/rack_app.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(slide_files, options = {}) ⇒ RackApp

Returns a new instance of RackApp.



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# 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

Class Method Details

.app_rootObject



8
9
10
11
# 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 = {}) ⇒ Object



17
18
19
20
21
22
23
24
25
26
27
28
29
# 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_loggingObject



31
32
33
34
35
36
37
# 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

.public_file_serverObject



13
14
15
# File 'lib/deck/rack_app.rb', line 13

def self.public_file_server
  Rack::File.new("#{app_root}/public")
end

Instance Method Details

#call(env) ⇒ Object



86
87
88
89
90
91
92
93
94
95
96
97
98
# 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

#deckObject



100
101
102
# File 'lib/deck/rack_app.rb', line 100

def deck
  SlideDeck.new({:slides => slides}.merge(@options))
end

#extract_options(config) ⇒ Object



78
79
80
81
82
83
84
# 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) ⇒ Object



67
68
69
70
71
72
73
74
75
76
# 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) ⇒ Object



59
60
61
62
63
64
65
# 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

#slidesObject



104
105
106
107
108
109
110
111
112
113
114
# 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