# We're riding on Sinatra, so let's include it.require"sinatra/base"# Use the padrino project's helpersrequire"padrino-core/application/rendering"require"padrino-helpers"moduleMiddlemanclassServer<Sinatra::Base# Basic Sinatra configset:app_file,__FILE__set:root,ENV["MM_DIR"]||Dir.pwdset:reload,falseset:sessions,falseset:logging,falseset:environment,(ENV['MM_ENV']&&ENV['MM_ENV'].to_sym)||:development# Middleman-specific optionsset:index_file,"index.html"# What file responds to folder requests# Such as the homepage (/) or subfolders (/about/)# These directories are passed directly to Compassset:js_dir,"javascripts"# Where to look for javascript filesset:css_dir,"stylesheets"# Where to look for CSS filesset:images_dir,"images"# Where to look for imagesset:fonts_dir,"fonts"# Where to look for fontsset:build_dir,"build"# Which folder are builds output toset:http_prefix,nil# During build, add a prefix for absolute pathsset:static,falseset:views,"source"# Disable Padrino cache buster until explicitly enabledset:asset_stamp,false# Use Padrino HelpersregisterPadrino::Helpers# Activate custom featuresregisterMiddleman::Features# Activate built-in helpersregisterMiddleman::Features::DefaultHelpers# Activate Yaml Data packageregisterMiddleman::Features::Data# Activate Webservices Proxy package# register Middleman::Features::ProxyregisterMiddleman::Features::FrontMatter# Activate Lorem helpersregisterMiddleman::Features::Lorem# Tilt-aware rendererregisterPadrino::Rendering# Override Sinatra's set to accept a blockdefself.set(option,value=self,&block)ifblock_given?value=Proc.new{block}endsuper(option,value,&nil)end# An array of callback procs to run after all features have been setup@@run_after_features=[]# Add a block/proc to be run after features have been setupdefself.after_feature_init(&block)@@run_after_features<<blockend# Activate custom renderersregisterMiddleman::Renderers::SlimregisterMiddleman::Renderers::HamlregisterMiddleman::Renderers::Sass# Rack helper for adding mime-types during local previewdefself.mime(ext,type)ext=".#{ext}"unlessext.to_s[0]==?.::Rack::Mime::MIME_TYPES[ext.to_s]=typeend# Default layout namelayout:layoutdefself.current_layout@layoutend# Takes a block which allows many pages to have the same layout# with_layout :admin do# page "/admin/"# page "/admin/login.html"# enddefself.with_layout(layout_name,&block)old_layout=current_layoutlayout(layout_name)class_eval(&block)ifblock_given?ensurelayout(old_layout)end# The page method allows the layout to be set on a specific path# page "/about.html", :layout => false# page "/", :layout => :homepage_layoutdefself.page(url,options={},&block)url=url.gsub(%r{#{settings.index_file}$},"")url=url.gsub(%r{(\/)$},"")ifurl.length>1paths=[url]paths<<"#{url}/"ifurl.length>1&&url.split("/").last.split('.').length<=1paths<<"/#{path_to_index(url)}"options[:layout]=current_layoutifoptions[:layout].nil?paths.eachdo|p|get(p)doreturnyieldifblock_given?process_request(options)endendend# This will match all requests not overridden in the project's config.rbnot_founddoprocess_requestendprivatedefself.path_to_index(path)parts=path?path.split('/'):[]ifparts.last.nil?||parts.last.split('.').length==1path=File.join(path,settings.index_file)endpath.gsub(%r{^/},'')end# Internal method to look for templates and evaluate them if founddefprocess_request(options={})# Normalize the path and add index if we're looking at a directorypath=self.class.path_to_index(request.path)extensionless_path,template_engine=resolve_template(path)if!::Tilt.mappings.has_key?(template_engine.to_s)content_typemime_type(File.extname(path)),:charset=>'utf-8'status200send_fileFile.join(Middleman::Server.views,path)returnendfull_file_path="#{extensionless_path}.#{template_engine}"system_path=File.join(settings.views,full_file_path)data,content=self.class.parse_front_matter(File.read(system_path))%w(layout layout_engine).eachdo|opt|ifdata.has_key?(opt)options[opt.to_sym]=data.delete(opt)endend# Forward remaining data to helpersself.class.data_content("page",data)old_layout=settings.current_layoutsettings.layout(options[:layout])if!options[:layout].nil?layout=settings.fetch_layout_path.to_symlayout=falseifoptions[:layout]==falseorpath=~/\.(css|js)$/render_options={:layout=>layout}render_options[:layout_engine]=options[:layout_engine]ifoptions.has_key?:layout_engineresult=render(path,render_options)settings.layout(old_layout)ifresultcontent_typemime_type(File.extname(path)),:charset=>'utf-8'status200returnresultendstatus404rescuePadrino::Rendering::TemplateNotFound$stderr.puts"File not found: #{request.path}"status404endendendrequire"middleman/assets"# The Rack AppclassMiddleman::Serverdefself.new(*args,&block)# Check for and evaluate local configurationlocal_config=File.join(self.root,"config.rb")ifFile.exists?local_config$stderr.puts"== Reading: Local config"iflogging?Middleman::Server.class_evalFile.read(local_config)set:app_file,File.expand_path(local_config)end@@run_after_features.each{|block|class_eval(&block)}superendend