# require 'sinatra/synchrony'require"i18n"require"active_support"require"active_support/json"require"active_support/core_ext/class/attribute_accessors"moduleMiddleman::Baseclass<<selfdefregistered(app)# app.register ::Sinatra::Synchronyapp.extendClassMethodsapp.send:include,InstanceMethods# Basic Sinatra configapp.set:app_file,__FILE__app.set:root,Dir.pwdapp.set:sessions,falseapp.set:logging,falseapp.set:environment,(ENV['MM_ENV']&&ENV['MM_ENV'].to_sym)||:development# Middleman-specific optionsapp.set:index_file,"index.html"# What file responds to folder requests# Such as the homepage (/) or subfolders (/about/)# These directories are passed directly to Compassapp.set:js_dir,"javascripts"# Where to look for javascript filesapp.set:css_dir,"stylesheets"# Where to look for CSS filesapp.set:images_dir,"images"# Where to look for imagesapp.set:build_dir,"build"# Which folder are builds output toapp.set:http_prefix,nil# During build, add a prefix for absolute paths# Pass all request to Middleman, even "static" filesapp.set:static,falseapp.set:views,"source"# Add Builder Callbacksapp.registerMiddleman::CoreExtensions::Builder# Add Rack::Builder.map to Sinatraapp.registerMiddleman::CoreExtensions::RackMap# Activate custom featuresapp.registerMiddleman::CoreExtensions::Features# Activate Yaml Data packageapp.registerMiddleman::CoreExtensions::Data# Setup custom renderingapp.registerMiddleman::CoreExtensions::Rendering# Compass frameworkapp.registerMiddleman::CoreExtensions::Compass# Sprockets asset handlingapp.registerMiddleman::CoreExtensions::Sprockets# Setup asset path pipelineapp.registerMiddleman::CoreExtensions::Assets# Activate built-in helpersapp.registerMiddleman::CoreExtensions::DefaultHelpers# with_layout and page routingapp.registerMiddleman::CoreExtensions::Routing# Parse YAML from templatesapp.registerMiddleman::CoreExtensions::FrontMatterapp.set:default_features,[:lorem]# Default layout nameapp.set:layout,:layout# This will match all requests not overridden in the project's config.rbapp.not_founddoprocess_requestend# Custom 404 handler (to be styled)app.errorSinatra::NotFounddocontent_type'text/html'"<html><body><h1>File Not Found</h1><p>#{request.path_info}</p></body>"end# See if Tilt cannot handle this fileapp.before_processing(:base)do|result|request_path=request.path_info.gsub("%20"," ")should_be_ignored=!(request["is_proxy"])&&settings.excluded_paths.include?("/#{request_path}")ifresult&&!should_be_ignoredextensionless_path,template_engine=result# Return static filesif!::Tilt.mappings.has_key?(template_engine.to_s)matched_mime=mime_type(File.extname(request_path))matched_mime="application/octet-stream"ifmatched_mime.nil?content_typematched_mime,:charset=>'utf-8'status200send_fileFile.join(settings.views,request_path)falseelsetrueendelseif!%w(favicon.ico).include?(request_path)$stderr.puts"File not found: #{request_path}"endstatus404falseendendendalias:included:registeredendmoduleClassMethods# Override Sinatra's set to accept a block# Specifically for the asset_host featuredefset(option,value=self,&block)ifblock_given?value=Proc.new{block}endsuper(option,value,&nil)enddefbefore_processing(name=:unnamed,idx=-1,&block)@before_processes||=[]@before_processes.insert(idx,[name,block])enddefexecute_before_processing!(inst,resolved_template)@before_processes||=[]@before_processes.all?do|name,block|inst.instance_exec(resolved_template,&block)endend# Convenience method to check if we're in build modedefbuild?;environment==:build;endendmoduleInstanceMethods# Internal method to look for templates and evaluate them if founddefprocess_request(options={})if!settings.views.include?(settings.root)settings.set:views,File.join(settings.root,settings.views)end# Normalize the path and add index if we're looking at a directoryrequest.path_info=self.class.path_to_index(request.path)request_path=request.path_info.gsub("%20"," ")found_template=resolve_template(request_path,:raise_exceptions=>false)returnstatus(404)unlessfound_templatereturnunlesssettings.execute_before_processing!(self,found_template)options.merge!(request['custom_options']||{})old_layout=settings.layoutsettings.set:layout,options[:layout]if!options[:layout].nil?local_layout=ifsettings.layoutifoptions[:layout]==false||request.path_info=~/\.(css|js)$/falseelsesettings.fetch_layout_path(settings.layout).to_symendelsefalseendrender_options={:layout=>local_layout}render_options[:layout_engine]=options[:layout_engine]ifoptions.has_key?:layout_enginepath,engine=found_templatelocals=request['custom_locals']||{}beginresult=render(engine,path,render_options,locals)ifresultcontent_typemime_type(File.extname(request_path)),:charset=>'utf-8'status200bodyresultend# rescue# status(404)ensuresettings.set:layout,old_layoutendendendend