middleman/middleman-core/lib/middleman-core/meta_pages.rb

113 lines
3.4 KiB
Ruby
Raw Normal View History

2012-10-13 22:12:47 +02:00
require 'rack/builder'
require 'rack/static'
require 'tilt'
require 'middleman-core/meta_pages/sitemap_tree'
2013-04-14 02:10:00 +02:00
require 'middleman-core/meta_pages/config_setting'
2012-10-13 22:12:47 +02:00
module Middleman
2012-10-13 23:02:38 +02:00
module MetaPages
# Metadata pages to be served in preview, in order to present information about the Middleman
# application and its configuration. Analogous to Firefox/Chrome's "about:" pages.
#
# Built using a ghetto little Rack web framework cobbled together because I didn't want to depend
# on Sinatra or figure out how to host Middleman inside Middleman.
class Application
def initialize(middleman)
# Hold a reference to the middleman application
@middleman = middleman
meta_pages = self
@rack_app = ::Rack::Builder.new do
2012-10-13 23:02:38 +02:00
# Serve assets from metadata/assets
use ::Rack::Static, urls: ['/assets'], root: File.join(File.dirname(__FILE__), 'meta_pages')
2012-10-13 23:02:38 +02:00
map '/' do
run meta_pages.method(:index)
end
2012-10-13 22:12:47 +02:00
2012-10-13 23:02:38 +02:00
map '/sitemap' do
run meta_pages.method(:sitemap)
end
map '/config' do
run meta_pages.method(:config)
end
2012-10-13 22:12:47 +02:00
end
end
2012-10-13 23:02:38 +02:00
def call(*args)
@rack_app.call(*args)
end
2012-10-13 23:02:38 +02:00
# The index page
2014-04-29 01:02:18 +02:00
def index(_)
2012-10-13 23:02:38 +02:00
template('index.html.erb')
end
2012-10-13 22:12:47 +02:00
2012-10-13 23:02:38 +02:00
# Inspect the sitemap
2014-04-29 01:02:18 +02:00
def sitemap(_)
resources = @middleman.sitemap.resources(true)
2012-10-13 22:12:47 +02:00
sitemap_tree = SitemapTree.new
2012-10-13 23:02:38 +02:00
resources.each do |resource|
sitemap_tree.add_resource resource
2012-10-13 23:02:38 +02:00
end
2012-10-13 22:12:47 +02:00
2014-04-29 19:44:24 +02:00
template('sitemap.html.erb', sitemap_tree: sitemap_tree)
2012-10-13 23:02:38 +02:00
end
# Inspect configuration
2014-04-29 01:02:18 +02:00
def config(_)
global_config = @middleman.config.all_settings.map { |c| ConfigSetting.new(c) }
extension_config = {}
2015-08-05 22:37:03 +02:00
auto_activated_config = {}
@middleman.extensions.each do |ext_name, extension|
2015-08-05 22:37:03 +02:00
if ::Middleman::Extensions.auto_activated.include? ext_name
auto_activated_config[ext_name] = extension_options(extension)
next
end
if extension.is_a?(Hash)
# Multiple instance extension
if extension.size == 1
extension_config[ext_name] = extension_options(extension.values.first)
else
extension.each do |inst, ext|
extension_config["#{ext_name} (#{inst})"] = extension_options(ext)
end
end
else
extension_config[ext_name] = extension_options(extension)
end
end
template('config.html.erb',
2014-04-29 19:44:24 +02:00
global_config: global_config,
extension_config: extension_config,
2015-08-05 22:37:03 +02:00
auto_activated_config: auto_activated_config,
2014-04-29 19:44:24 +02:00
registered_extensions: Middleman::Extensions.registered.dup)
end
2012-10-13 23:02:38 +02:00
private
# Render a template with the given name and locals
def template(template_name, locals={})
template_path = File.join(File.dirname(__FILE__), 'meta_pages', 'templates', template_name)
2015-05-07 18:01:04 +02:00
content = Tilt.new(template_path).render(::Object.new, locals)
2012-10-13 23:02:38 +02:00
response(content)
end
2012-10-13 22:12:47 +02:00
2012-10-13 23:02:38 +02:00
# Respond to an HTML request
def response(content)
2014-04-29 01:02:18 +02:00
[200, { 'Content-Type' => 'text/html' }, Array(content)]
2012-10-13 23:02:38 +02:00
end
def extension_options(extension)
2014-04-29 01:02:18 +02:00
extension.options.all_settings.map { |c| ConfigSetting.new(c) }
end
2012-10-13 22:12:47 +02:00
end
end
end