Sha256: 812962dd9829180adce0c20cfef512207d6a336bcaa3c939168112b05d230ab6

Contents?: true

Size: 1.41 KB

Versions: 1

Compression:

Stored size: 1.41 KB

Contents

require 'rhr/core_ext/object'

module RHR
  class Server
    def initialize
      @files = Dir["**/*"] - ['Gemfile','Gemfile.lock','Rakefile']
      @files -= @files.grep(/(^|\/)_/)
    end

    def call(env)
      path = env['PATH_INFO']
      if template = find_template(path)
        if renderer = Tilt[template]
          request = Rack::Request.new(env)
          params = request.GET.merge(request.POST)

          body = renderer.new(template).render(nil, :request => request, :params => params)

          if layout = find_layout
            body = renderer.new(layout).render(nil, :request => request, :params => params) { body }
          end

          [200, {}, [body]]
        else
          Rack::File.new('.').call(env.merge('PATH_INFO' => template))
        end
      else
        [404, {}, ['404 File not found']]
      end
    end

  private

    def find_layout
      Dir['*'].grep(/^_layout(\.|$)/).first
    end
    memoize :find_layout

    def find_template(path)
      file = path.dup
      file.sub!('/','')
      file.sub!(/\/$/,'')
      is_root = (file == '')

      return if not is_root and not @files.index(file)

      if is_root or File.directory?(file)
        # folder -> find an index file
        file << '/' unless is_root
        @files.grep(/^#{Regexp.escape file}index\.[^\/]+$/).first
      else
        # just another normal template
        file
      end
    end
    memoize :find_template
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
rhr-0.1.3 lib/rhr/server.rb