middleman 2.0.0.beta6 → 2.0.0.rc1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +2 -0
- data/features/data.feature +7 -0
- data/features/front-matter.feature +7 -0
- data/features/helpers_page_classes.feature +6 -6
- data/fixtures/test-app/config.rb +23 -36
- data/fixtures/test-app/data/test.yml +4 -0
- data/fixtures/test-app/source/auto-css/auto-css.html.haml +1 -0
- data/fixtures/test-app/source/auto-css/index.html.haml +1 -0
- data/fixtures/test-app/source/auto-css/sub/auto-css.html.haml +1 -0
- data/fixtures/test-app/source/auto-js/auto-js.html.haml +1 -0
- data/fixtures/test-app/source/auto-js/index.html.haml +1 -0
- data/fixtures/test-app/source/auto-js/sub/auto-js.html.haml +1 -0
- data/fixtures/test-app/source/data.html.erb +1 -0
- data/fixtures/test-app/source/front-matter.html.slim +6 -0
- data/fixtures/test-app/source/sub1/page-classes.html.haml +1 -0
- data/fixtures/test-app/source/sub1/sub2/page-classes.html.haml +1 -0
- data/lib/middleman.rb +72 -2
- data/lib/middleman/core_extensions/assets.rb +57 -0
- data/lib/middleman/{features → core_extensions}/data.rb +7 -6
- data/lib/middleman/{features → core_extensions}/default_helpers.rb +8 -6
- data/lib/middleman/core_extensions/features.rb +96 -0
- data/lib/middleman/core_extensions/front_matter.rb +83 -0
- data/lib/middleman/core_extensions/rendering.rb +18 -0
- data/lib/middleman/core_extensions/routing.rb +62 -0
- data/lib/middleman/features/asset_host.rb +5 -5
- data/lib/middleman/features/blog.rb +43 -56
- data/lib/middleman/features/cache_buster.rb +7 -7
- data/lib/middleman/features/relative_assets.rb +4 -4
- data/lib/middleman/features/tiny_src.rb +2 -2
- data/lib/middleman/server.rb +44 -142
- data/lib/middleman/version.rb +1 -1
- metadata +35 -9
- data/fixtures/test-app/source/front-matter.html.erb +0 -7
- data/lib/middleman/assets.rb +0 -33
- data/lib/middleman/features.rb +0 -126
- data/lib/middleman/features/front_matter.rb +0 -60
@@ -0,0 +1,83 @@
|
|
1
|
+
require "yaml"
|
2
|
+
require "tilt"
|
3
|
+
|
4
|
+
module Middleman::CoreExtensions::FrontMatter
|
5
|
+
class << self
|
6
|
+
def registered(app)
|
7
|
+
app.extend ClassMethods
|
8
|
+
|
9
|
+
::Tilt::register RDiscountTemplate, 'markdown', 'mkd', 'md'
|
10
|
+
::Tilt::register RedClothTemplate, 'textile'
|
11
|
+
::Tilt::register ERBTemplate, 'erb', 'rhtml'
|
12
|
+
::Tilt::register SlimTemplate, 'slim'
|
13
|
+
::Tilt::register HamlTemplate, 'haml'
|
14
|
+
|
15
|
+
app.before do
|
16
|
+
result = resolve_template(request.path_info, :raise_exceptions => false)
|
17
|
+
|
18
|
+
if result && Tilt.mappings.has_key?(result[1].to_s)
|
19
|
+
extensionless_path, template_engine = result
|
20
|
+
full_file_path = "#{extensionless_path}.#{template_engine}"
|
21
|
+
system_path = File.join(settings.views, full_file_path)
|
22
|
+
data, content = app.parse_front_matter(File.read(system_path))
|
23
|
+
|
24
|
+
request['custom_options'] = {}
|
25
|
+
%w(layout layout_engine).each do |opt|
|
26
|
+
if data.has_key?(opt)
|
27
|
+
request['custom_options'][opt.to_sym] = data.delete(opt)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
# Forward remaining data to helpers
|
32
|
+
app.data_content("page", data)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
alias :included :registered
|
37
|
+
end
|
38
|
+
|
39
|
+
module ClassMethods
|
40
|
+
def parse_front_matter(content)
|
41
|
+
yaml_regex = /^(---\s*\n.*?\n?)^(---\s*$\n?)/m
|
42
|
+
if content =~ yaml_regex
|
43
|
+
begin
|
44
|
+
data = YAML.load($1)
|
45
|
+
rescue => e
|
46
|
+
puts "YAML Exception: #{e.message}"
|
47
|
+
end
|
48
|
+
|
49
|
+
content = content.split(yaml_regex).last
|
50
|
+
end
|
51
|
+
|
52
|
+
data ||= {}
|
53
|
+
[data, content]
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
module YamlAware
|
58
|
+
def prepare
|
59
|
+
options, @data = Middleman::Server.parse_front_matter(@data)
|
60
|
+
super
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
class RDiscountTemplate < ::Tilt::RDiscountTemplate
|
65
|
+
include Middleman::CoreExtensions::FrontMatter::YamlAware
|
66
|
+
end
|
67
|
+
|
68
|
+
class RedClothTemplate < ::Tilt::RedClothTemplate
|
69
|
+
include Middleman::CoreExtensions::FrontMatter::YamlAware
|
70
|
+
end
|
71
|
+
|
72
|
+
class ERBTemplate < ::Tilt::ERBTemplate
|
73
|
+
include Middleman::CoreExtensions::FrontMatter::YamlAware
|
74
|
+
end
|
75
|
+
|
76
|
+
class HamlTemplate < ::Tilt::HamlTemplate
|
77
|
+
include Middleman::CoreExtensions::FrontMatter::YamlAware
|
78
|
+
end
|
79
|
+
|
80
|
+
class SlimTemplate < ::Slim::Template
|
81
|
+
include Middleman::CoreExtensions::FrontMatter::YamlAware
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require "padrino-core/application/rendering"
|
2
|
+
|
3
|
+
module Middleman::CoreExtensions::Rendering
|
4
|
+
class << self
|
5
|
+
def registered(app)
|
6
|
+
# Tilt-aware renderer
|
7
|
+
app.register Padrino::Rendering
|
8
|
+
|
9
|
+
# Activate custom renderers
|
10
|
+
app.register Middleman::Renderers::Slim
|
11
|
+
app.register Middleman::Renderers::Haml
|
12
|
+
app.register Middleman::Renderers::Sass
|
13
|
+
app.register Middleman::Renderers::Markdown
|
14
|
+
app.register Middleman::Renderers::CoffeeScript
|
15
|
+
end
|
16
|
+
alias :included :registered
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
module Middleman::CoreExtensions::Routing
|
2
|
+
class << self
|
3
|
+
def registered(app)
|
4
|
+
app.extend ClassMethods
|
5
|
+
|
6
|
+
# Normalize the path and add index if we're looking at a directory
|
7
|
+
app.before do
|
8
|
+
request.path_info = self.class.path_to_index(request.path)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
alias :included :registered
|
12
|
+
end
|
13
|
+
|
14
|
+
module ClassMethods
|
15
|
+
def current_layout
|
16
|
+
@layout
|
17
|
+
end
|
18
|
+
|
19
|
+
def path_to_index(path)
|
20
|
+
parts = path ? path.split('/') : []
|
21
|
+
if parts.last.nil? || parts.last.split('.').length == 1
|
22
|
+
path = File.join(path, settings.index_file)
|
23
|
+
end
|
24
|
+
path.gsub(%r{^/}, '')
|
25
|
+
end
|
26
|
+
|
27
|
+
# Takes a block which allows many pages to have the same layout
|
28
|
+
# with_layout :admin do
|
29
|
+
# page "/admin/"
|
30
|
+
# page "/admin/login.html"
|
31
|
+
# end
|
32
|
+
def with_layout(layout_name, &block)
|
33
|
+
old_layout = current_layout
|
34
|
+
|
35
|
+
layout(layout_name)
|
36
|
+
class_eval(&block) if block_given?
|
37
|
+
ensure
|
38
|
+
layout(old_layout)
|
39
|
+
end
|
40
|
+
|
41
|
+
# The page method allows the layout to be set on a specific path
|
42
|
+
# page "/about.html", :layout => false
|
43
|
+
# page "/", :layout => :homepage_layout
|
44
|
+
def page(url, options={}, &block)
|
45
|
+
url = url.gsub(%r{#{settings.index_file}$}, "")
|
46
|
+
url = url.gsub(%r{(\/)$}, "") if url.length > 1
|
47
|
+
|
48
|
+
paths = [url]
|
49
|
+
paths << "#{url}/" if url.length > 1 && url.split("/").last.split('.').length <= 1
|
50
|
+
paths << "#{path_to_index(url)}"
|
51
|
+
|
52
|
+
options[:layout] = current_layout if options[:layout].nil?
|
53
|
+
|
54
|
+
paths.each do |p|
|
55
|
+
get(p) do
|
56
|
+
return yield if block_given?
|
57
|
+
process_request(options)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -2,17 +2,17 @@ module Middleman::Features::AssetHost
|
|
2
2
|
class << self
|
3
3
|
def registered(app)
|
4
4
|
app.after_feature_init do
|
5
|
-
if
|
6
|
-
::Compass.configuration.asset_host(&
|
5
|
+
if app.asset_host.is_a?(Proc)
|
6
|
+
::Compass.configuration.asset_host(&app.asset_host)
|
7
7
|
end
|
8
8
|
end
|
9
9
|
|
10
|
-
|
11
|
-
original_output =
|
10
|
+
app.register_asset_handler :asset_host do |path, prefix, request|
|
11
|
+
original_output = app.before_asset_handler(:asset_host, path, prefix, request)
|
12
12
|
|
13
13
|
valid_extensions = %w(.png .gif .jpg .jpeg .js .css)
|
14
14
|
|
15
|
-
asset_prefix =
|
15
|
+
asset_prefix = app.asset_host.call(original_output)
|
16
16
|
|
17
17
|
File.join(asset_prefix, original_output)
|
18
18
|
end
|
@@ -10,11 +10,11 @@ module Middleman
|
|
10
10
|
|
11
11
|
app.after_feature_init do
|
12
12
|
if !app.settings.respond_to? :blog_permalink
|
13
|
-
app.set :blog_permalink, "
|
13
|
+
app.set :blog_permalink, ":year/:month/:day/:title.html"
|
14
14
|
end
|
15
15
|
|
16
16
|
if !app.settings.respond_to? :blog_taglink
|
17
|
-
app.set :blog_taglink, "
|
17
|
+
app.set :blog_taglink, "tags/:tag.html"
|
18
18
|
end
|
19
19
|
|
20
20
|
if !app.settings.respond_to? :blog_layout
|
@@ -43,71 +43,58 @@ module Middleman
|
|
43
43
|
|
44
44
|
$stderr.puts "== Blog: #{app.settings.blog_permalink}"
|
45
45
|
|
46
|
-
|
46
|
+
app.before do
|
47
|
+
articles_glob = File.join(app.views, app.settings.blog_permalink.gsub(/(:\w+)/, "*") + ".*")
|
47
48
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
49
|
+
articles = Dir[articles_glob].map do |article|
|
50
|
+
template_content = File.read(article)
|
51
|
+
data, content = app.parse_front_matter(template_content)
|
52
|
+
data["date"] = Date.parse(data["date"])
|
52
53
|
|
53
|
-
|
54
|
-
|
55
|
-
data["url"] = article.gsub(app.views, "").split(".html").first + ".html"
|
54
|
+
data["raw"] = content
|
55
|
+
data["url"] = article.gsub(app.views, "").split(".html").first + ".html"
|
56
56
|
|
57
|
-
|
58
|
-
|
57
|
+
all_content = Tilt.new(article).render
|
58
|
+
data["body"] = all_content.gsub!(app.settings.blog_summary_separator, "")
|
59
59
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
60
|
+
sum = if data["raw"] =~ app.settings.blog_summary_separator
|
61
|
+
data["raw"].split(app.settings.blog_summary_separator).first
|
62
|
+
else
|
63
|
+
data["raw"].match(/(.{1,#{app.settings.blog_summary_length}}.*?)(\n|\Z)/m).to_s
|
64
|
+
end
|
65
65
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
66
|
+
engine = RDiscount.new(sum)
|
67
|
+
data["summary"] = engine.to_html
|
68
|
+
data
|
69
|
+
end.sort { |a, b| b["date"] <=> a["date"] }
|
70
|
+
|
71
|
+
tags = {}
|
72
|
+
articles.each do |article|
|
73
|
+
article["tags"] ||= ""
|
74
|
+
if !article["tags"].empty?
|
75
|
+
tags_array = article["tags"].split(',').map{|t| t.strip}
|
76
|
+
tags_array.each do |tag_title|
|
77
|
+
tag_key = tag_title.parameterize
|
78
|
+
tag_path = blog_taglink.gsub(/(:\w+)/, tag_key)
|
79
|
+
(tags[tag_path] ||= {})["title"] = tag_title
|
80
|
+
tags[tag_path]["ident"] = tag_key
|
81
|
+
(tags[tag_path]["pages"] ||= {})[article["title"]] = article["url"]
|
82
|
+
end
|
82
83
|
end
|
83
84
|
end
|
84
|
-
end
|
85
|
-
|
86
|
-
app.data_content("blog", { :articles => articles, :tags => tags })
|
87
85
|
|
86
|
+
app.data_content("blog", { :articles => articles, :tags => tags })
|
87
|
+
end
|
88
|
+
|
88
89
|
app.get(app.settings.blog_permalink) do
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
full_file_path = "#{extensionless_path}.#{template_engine}"
|
96
|
-
system_path = File.join(settings.views, full_file_path)
|
97
|
-
data, content = self.class.parse_front_matter(File.read(system_path))
|
98
|
-
|
99
|
-
# Forward remaining data to helpers
|
100
|
-
self.class.data_content("page", data)
|
101
|
-
|
102
|
-
output = render(request.path, options)
|
103
|
-
|
90
|
+
process_request({
|
91
|
+
:layout => settings.blog_layout,
|
92
|
+
:layout_engine => settings.blog_layout_engine
|
93
|
+
})
|
94
|
+
|
104
95
|
# No need for separator on permalink page
|
105
|
-
|
106
|
-
|
107
|
-
status 200
|
108
|
-
output
|
96
|
+
body body.gsub!(settings.blog_summary_separator, "")
|
109
97
|
end
|
110
|
-
|
111
98
|
end
|
112
99
|
end
|
113
100
|
alias :included :registered
|
@@ -1,23 +1,23 @@
|
|
1
1
|
module Middleman::Features::CacheBuster
|
2
2
|
class << self
|
3
3
|
def registered(app)
|
4
|
-
|
5
|
-
http_path =
|
4
|
+
app.register_asset_handler :cache_buster do |path, prefix, request|
|
5
|
+
http_path = app.before_asset_handler(:cache_buster, path, prefix, request)
|
6
6
|
|
7
7
|
if http_path.include?("://") || !%w(.css .png .jpg .js .gif).include?(File.extname(http_path))
|
8
8
|
http_path
|
9
9
|
else
|
10
10
|
begin
|
11
|
-
prefix =
|
11
|
+
prefix = app.images_dir if prefix == app.http_images_path
|
12
12
|
rescue
|
13
13
|
end
|
14
14
|
|
15
|
-
real_path_static = File.join(
|
15
|
+
real_path_static = File.join(app.views, prefix, path)
|
16
16
|
|
17
17
|
if File.readable?(real_path_static)
|
18
18
|
http_path << "?" + File.mtime(real_path_static).strftime("%s")
|
19
|
-
elsif
|
20
|
-
real_path_dynamic = File.join(
|
19
|
+
elsif app.environment == :build
|
20
|
+
real_path_dynamic = File.join(app.root, app.build_dir, prefix, path)
|
21
21
|
http_path << "?" + File.mtime(real_path_dynamic).strftime("%s") if File.readable?(real_path_dynamic)
|
22
22
|
end
|
23
23
|
|
@@ -29,7 +29,7 @@ module Middleman::Features::CacheBuster
|
|
29
29
|
::Compass.configuration do |config|
|
30
30
|
config.asset_cache_buster do |path, real_path|
|
31
31
|
real_path = real_path.path if real_path.is_a? File
|
32
|
-
real_path = real_path.gsub(File.join(
|
32
|
+
real_path = real_path.gsub(File.join(app.root, app.build_dir), app.views)
|
33
33
|
if File.readable?(real_path)
|
34
34
|
File.mtime(real_path).strftime("%s")
|
35
35
|
else
|
@@ -3,20 +3,20 @@ module Middleman::Features::RelativeAssets
|
|
3
3
|
def registered(app)
|
4
4
|
::Compass.configuration.relative_assets = true
|
5
5
|
|
6
|
-
|
6
|
+
app.register_asset_handler :relative_assets do |path, prefix, request|
|
7
7
|
begin
|
8
|
-
prefix =
|
8
|
+
prefix = app.images_dir if prefix == app.http_images_path
|
9
9
|
rescue
|
10
10
|
end
|
11
11
|
|
12
12
|
if path.include?("://")
|
13
|
-
|
13
|
+
app.before_asset_handler(:relative_assets, path, prefix, request)
|
14
14
|
elsif path[0,1] == "/"
|
15
15
|
path
|
16
16
|
else
|
17
17
|
path = File.join(prefix, path) if prefix.length > 0
|
18
18
|
request_path = request.path_info.dup
|
19
|
-
request_path <<
|
19
|
+
request_path << app.index_file if path.match(%r{/$})
|
20
20
|
request_path.gsub!(%r{^/}, '')
|
21
21
|
parts = request_path.split('/')
|
22
22
|
|
@@ -1,8 +1,8 @@
|
|
1
1
|
module Middleman::Features::TinySrc
|
2
2
|
class << self
|
3
3
|
def registered(app)
|
4
|
-
|
5
|
-
original_output =
|
4
|
+
app.register_asset_handler :tiny_src do |path, prefix, request|
|
5
|
+
original_output = app.before_asset_handler(:tiny_src, path, prefix, request)
|
6
6
|
"http://i.tinysrc.mobi/#{original_output}"
|
7
7
|
end
|
8
8
|
end
|
data/lib/middleman/server.rb
CHANGED
@@ -1,16 +1,11 @@
|
|
1
1
|
# We're riding on Sinatra, so let's include it.
|
2
2
|
require "sinatra/base"
|
3
3
|
|
4
|
-
# Use the padrino project's helpers
|
5
|
-
require "padrino-core/application/rendering"
|
6
|
-
require "padrino-helpers"
|
7
|
-
|
8
4
|
module Middleman
|
9
5
|
class Server < Sinatra::Base
|
10
6
|
# Basic Sinatra config
|
11
7
|
set :app_file, __FILE__
|
12
8
|
set :root, ENV["MM_DIR"] || Dir.pwd
|
13
|
-
set :reload, false
|
14
9
|
set :sessions, false
|
15
10
|
set :logging, false
|
16
11
|
set :environment, (ENV['MM_ENV'] && ENV['MM_ENV'].to_sym) || :development
|
@@ -28,36 +23,38 @@ module Middleman
|
|
28
23
|
set :build_dir, "build" # Which folder are builds output to
|
29
24
|
set :http_prefix, nil # During build, add a prefix for absolute paths
|
30
25
|
|
26
|
+
# Pass all request to Middleman, even "static" files
|
31
27
|
set :static, false
|
28
|
+
|
32
29
|
set :views, "source"
|
33
30
|
|
34
|
-
#
|
35
|
-
|
31
|
+
# Activate custom features
|
32
|
+
register Middleman::CoreExtensions::Features
|
36
33
|
|
37
|
-
#
|
38
|
-
register
|
34
|
+
# Setup custom rendering
|
35
|
+
register Middleman::CoreExtensions::Rendering
|
39
36
|
|
40
|
-
#
|
41
|
-
register Middleman::
|
37
|
+
# Setup asset path pipeline
|
38
|
+
register Middleman::CoreExtensions::Assets
|
42
39
|
|
43
40
|
# Activate built-in helpers
|
44
|
-
register Middleman::
|
41
|
+
register Middleman::CoreExtensions::DefaultHelpers
|
45
42
|
|
46
43
|
# Activate Yaml Data package
|
47
|
-
register Middleman::
|
48
|
-
|
49
|
-
# Activate Webservices Proxy package
|
50
|
-
# register Middleman::Features::Proxy
|
44
|
+
register Middleman::CoreExtensions::Data
|
51
45
|
|
52
|
-
|
46
|
+
# with_layout and page routing
|
47
|
+
register Middleman::CoreExtensions::Routing
|
53
48
|
|
54
|
-
#
|
55
|
-
register Middleman::
|
49
|
+
# Parse YAML from templates
|
50
|
+
register Middleman::CoreExtensions::FrontMatter
|
56
51
|
|
57
|
-
|
58
|
-
|
52
|
+
set :default_extensions, [
|
53
|
+
:lorem
|
54
|
+
]
|
59
55
|
|
60
56
|
# Override Sinatra's set to accept a block
|
57
|
+
# Specifically for the asset_host feature
|
61
58
|
def self.set(option, value=self, &block)
|
62
59
|
if block_given?
|
63
60
|
value = Proc.new { block }
|
@@ -66,153 +63,58 @@ module Middleman
|
|
66
63
|
super(option, value, &nil)
|
67
64
|
end
|
68
65
|
|
69
|
-
# An array of callback procs to run after all features have been setup
|
70
|
-
@@run_after_features = []
|
71
|
-
|
72
|
-
# Add a block/proc to be run after features have been setup
|
73
|
-
def self.after_feature_init(&block)
|
74
|
-
@@run_after_features << block
|
75
|
-
end
|
76
|
-
|
77
|
-
# Activate custom renderers
|
78
|
-
register Middleman::Renderers::Slim
|
79
|
-
register Middleman::Renderers::Haml
|
80
|
-
register Middleman::Renderers::Sass
|
81
|
-
register Middleman::Renderers::Markdown
|
82
|
-
register Middleman::Renderers::CoffeeScript
|
83
|
-
|
84
|
-
# Rack helper for adding mime-types during local preview
|
85
|
-
def self.mime(ext, type)
|
86
|
-
ext = ".#{ext}" unless ext.to_s[0] == ?.
|
87
|
-
::Rack::Mime::MIME_TYPES[ext.to_s] = type
|
88
|
-
end
|
89
|
-
|
90
66
|
# Default layout name
|
91
67
|
layout :layout
|
92
|
-
|
93
|
-
def self.current_layout
|
94
|
-
@layout
|
95
|
-
end
|
96
|
-
|
97
|
-
# Takes a block which allows many pages to have the same layout
|
98
|
-
# with_layout :admin do
|
99
|
-
# page "/admin/"
|
100
|
-
# page "/admin/login.html"
|
101
|
-
# end
|
102
|
-
def self.with_layout(layout_name, &block)
|
103
|
-
old_layout = current_layout
|
104
|
-
|
105
|
-
layout(layout_name)
|
106
|
-
class_eval(&block) if block_given?
|
107
|
-
ensure
|
108
|
-
layout(old_layout)
|
109
|
-
end
|
110
|
-
|
111
|
-
# The page method allows the layout to be set on a specific path
|
112
|
-
# page "/about.html", :layout => false
|
113
|
-
# page "/", :layout => :homepage_layout
|
114
|
-
def self.page(url, options={}, &block)
|
115
|
-
url = url.gsub(%r{#{settings.index_file}$}, "")
|
116
|
-
url = url.gsub(%r{(\/)$}, "") if url.length > 1
|
117
|
-
|
118
|
-
paths = [url]
|
119
|
-
paths << "#{url}/" if url.length > 1 && url.split("/").last.split('.').length <= 1
|
120
|
-
paths << "/#{path_to_index(url)}"
|
121
|
-
|
122
|
-
options[:layout] = current_layout if options[:layout].nil?
|
123
|
-
|
124
|
-
paths.each do |p|
|
125
|
-
get(p) do
|
126
|
-
return yield if block_given?
|
127
|
-
process_request(options)
|
128
|
-
end
|
129
|
-
end
|
130
|
-
end
|
131
68
|
|
132
69
|
# This will match all requests not overridden in the project's config.rb
|
133
70
|
not_found do
|
134
71
|
process_request
|
135
72
|
end
|
136
73
|
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
if
|
141
|
-
|
74
|
+
# See if Tilt cannot handle this file
|
75
|
+
before do
|
76
|
+
result = resolve_template(request.path_info, :raise_exceptions => false)
|
77
|
+
if result
|
78
|
+
extensionless_path, template_engine = result
|
79
|
+
|
80
|
+
# Return static files
|
81
|
+
if !::Tilt.mappings.has_key?(template_engine.to_s)
|
82
|
+
content_type mime_type(File.extname(request.path_info)), :charset => 'utf-8'
|
83
|
+
status 200
|
84
|
+
send_file File.join(Middleman::Server.views, request.path_info)
|
85
|
+
request["already_sent"] = true
|
86
|
+
end
|
87
|
+
else
|
88
|
+
$stderr.puts "File not found: #{request.path_info}"
|
89
|
+
status 404
|
90
|
+
request["already_sent"] = true
|
142
91
|
end
|
143
|
-
path.gsub(%r{^/}, '')
|
144
92
|
end
|
145
|
-
|
93
|
+
|
94
|
+
private
|
146
95
|
# Internal method to look for templates and evaluate them if found
|
147
96
|
def process_request(options={})
|
148
|
-
|
149
|
-
path = self.class.path_to_index(request.path)
|
150
|
-
|
151
|
-
extensionless_path, template_engine = resolve_template(path)
|
152
|
-
|
153
|
-
if !::Tilt.mappings.has_key?(template_engine.to_s)
|
154
|
-
content_type mime_type(File.extname(path)), :charset => 'utf-8'
|
155
|
-
status 200
|
156
|
-
send_file File.join(Middleman::Server.views, path)
|
157
|
-
return
|
158
|
-
end
|
159
|
-
|
160
|
-
full_file_path = "#{extensionless_path}.#{template_engine}"
|
161
|
-
system_path = File.join(settings.views, full_file_path)
|
162
|
-
data, content = self.class.parse_front_matter(File.read(system_path))
|
97
|
+
return if request["already_sent"]
|
163
98
|
|
164
|
-
|
165
|
-
if data.has_key?(opt)
|
166
|
-
options[opt.to_sym] = data.delete(opt)
|
167
|
-
end
|
168
|
-
end
|
169
|
-
|
170
|
-
# Forward remaining data to helpers
|
171
|
-
self.class.data_content("page", data)
|
99
|
+
options.merge!(request['custom_options'] || {})
|
172
100
|
|
173
101
|
old_layout = settings.current_layout
|
174
102
|
settings.layout(options[:layout]) if !options[:layout].nil?
|
175
103
|
layout = settings.fetch_layout_path.to_sym
|
176
|
-
layout = false if options[:layout] == false or
|
104
|
+
layout = false if options[:layout] == false or request.path_info =~ /\.(css|js)$/
|
177
105
|
|
178
106
|
render_options = { :layout => layout }
|
179
107
|
render_options[:layout_engine] = options[:layout_engine] if options.has_key? :layout_engine
|
180
|
-
result = render(
|
108
|
+
result = render(request.path_info, render_options)
|
181
109
|
settings.layout(old_layout)
|
182
110
|
|
183
111
|
if result
|
184
|
-
content_type mime_type(File.extname(
|
112
|
+
content_type mime_type(File.extname(request.path_info)), :charset => 'utf-8'
|
185
113
|
status 200
|
186
|
-
|
187
|
-
end
|
188
|
-
|
189
|
-
status 404
|
190
|
-
rescue Padrino::Rendering::TemplateNotFound
|
191
|
-
if settings.environment == :development
|
192
|
-
raise $!
|
114
|
+
body result
|
193
115
|
else
|
194
|
-
$stderr.puts "File not found: #{request.path}"
|
195
116
|
status 404
|
196
117
|
end
|
197
118
|
end
|
198
119
|
end
|
199
|
-
end
|
200
|
-
|
201
|
-
require "middleman/assets"
|
202
|
-
|
203
|
-
# The Rack App
|
204
|
-
class Middleman::Server
|
205
|
-
def self.new(*args, &block)
|
206
|
-
# Check for and evaluate local configuration
|
207
|
-
local_config = File.join(self.root, "config.rb")
|
208
|
-
if File.exists? local_config
|
209
|
-
$stderr.puts "== Reading: Local config" if logging?
|
210
|
-
Middleman::Server.class_eval File.read(local_config)
|
211
|
-
set :app_file, File.expand_path(local_config)
|
212
|
-
end
|
213
|
-
|
214
|
-
@@run_after_features.each { |block| class_eval(&block) }
|
215
|
-
|
216
|
-
super
|
217
|
-
end
|
218
|
-
end
|
120
|
+
end
|