# encoding: UTF-8 require 'sinatra/base' module Spontaneous module Rack module Front include Spontaneous::Rack::Middleware def self.make_controller(controller_class, site) controller_class end def self.front_app(site) ::Rack::Builder.app do use Scope::Front, site use Reloader, site if Spontaneous.development? run Server.new end end def self.application(site = ::Spontaneous.instance) app = ::Rack::Builder.new do use Spontaneous::Rack::Static, root: Spontaneous.revision_dir / "public", urls: %w[/], try: ['.html', 'index.html', '/index.html'] Spontaneous.instance.front.middleware.each do |args, block| use *args, &block end Spontaneous.instance.front_controllers.each do |namespace, controller_class| map namespace do run controller_class end end # Make all the files available under plugin_name/public/** # available under the URL /plugin_name/** # Only used in preview mode site.plugins.each do |plugin| map "/#{plugin.name}" do run ::Rack::File.new(plugin.paths.expanded(:public)) end end map "/rev" do run Spontaneous::Rack::CacheableFile.new(Spontaneous.revision_dir / "rev") end map "/assets" do run Spontaneous::Rack::CacheableFile.new(Spontaneous.revision_dir / "assets") end map "/media" do run Spontaneous::Rack::CacheableFile.new(Spontaneous.media_dir) end map "/" do run Spontaneous::Rack::Front.front_app(site) end end end class Server < Sinatra::Base include Spontaneous::Rack::Public def call!(env) @env = env @response = ::Sinatra::Response.new @request = ::Sinatra::Request.new(env) @params = indifferent_params(@request.params) render_path(@request.path_info) end def site @site ||= env[Spontaneous::Rack::SITE] end end end end end