middleman-core 4.1.0.rc.1 → 4.1.0.rc.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Rakefile +1 -1
- data/features/asset_hash.feature +44 -6
- data/features/asset_host.feature +1 -0
- data/features/automatic_image_sizes.feature +18 -5
- data/fixtures/asset-hash-host-app/source/index.html.erb +1 -1
- data/fixtures/asset-host-app/config.rb +1 -0
- data/fixtures/asset-host-app/source/asset_host.html.erb +9 -0
- data/fixtures/automatic-image-size-app/source/markdown-sizes.html.markdown +1 -0
- data/lib/middleman-core/application.rb +68 -58
- data/lib/middleman-core/builder.rb +24 -18
- data/lib/middleman-core/callback_manager.rb +8 -1
- data/lib/middleman-core/contracts.rb +13 -102
- data/lib/middleman-core/core_extensions.rb +6 -0
- data/lib/middleman-core/core_extensions/collections/lazy_step.rb +1 -1
- data/lib/middleman-core/core_extensions/data.rb +3 -2
- data/lib/middleman-core/core_extensions/default_helpers.rb +5 -5
- data/lib/middleman-core/core_extensions/external_helpers.rb +6 -11
- data/lib/middleman-core/core_extensions/file_watcher.rb +1 -1
- data/lib/middleman-core/core_extensions/front_matter.rb +1 -0
- data/lib/middleman-core/core_extensions/i18n.rb +4 -4
- data/lib/middleman-core/core_extensions/inline_url_rewriter.rb +150 -0
- data/lib/middleman-core/core_extensions/routing.rb +22 -28
- data/lib/middleman-core/core_extensions/show_exceptions.rb +1 -7
- data/lib/middleman-core/extension.rb +19 -2
- data/lib/middleman-core/extension_manager.rb +2 -0
- data/lib/middleman-core/extensions.rb +12 -0
- data/lib/middleman-core/extensions/asset_hash.rb +21 -20
- data/lib/middleman-core/extensions/asset_host.rb +9 -10
- data/lib/middleman-core/extensions/automatic_image_sizes.rb +1 -1
- data/lib/middleman-core/extensions/cache_buster.rb +6 -12
- data/lib/middleman-core/extensions/gzip.rb +2 -2
- data/lib/middleman-core/extensions/lorem.rb +1 -1
- data/lib/middleman-core/extensions/minify_css.rb +2 -2
- data/lib/middleman-core/extensions/minify_javascript.rb +2 -2
- data/lib/middleman-core/extensions/relative_assets.rb +6 -12
- data/lib/middleman-core/preview_server.rb +11 -9
- data/lib/middleman-core/preview_server/server_hostname.rb +2 -2
- data/lib/middleman-core/rack.rb +1 -1
- data/lib/middleman-core/renderers/kramdown.rb +1 -1
- data/lib/middleman-core/renderers/less.rb +3 -4
- data/lib/middleman-core/renderers/markdown.rb +2 -8
- data/lib/middleman-core/renderers/redcarpet.rb +1 -1
- data/lib/middleman-core/renderers/sass.rb +8 -11
- data/lib/middleman-core/renderers/stylus.rb +1 -5
- data/lib/middleman-core/sitemap/extensions/ignores.rb +5 -4
- data/lib/middleman-core/sitemap/extensions/import.rb +12 -15
- data/lib/middleman-core/sitemap/extensions/move_file.rb +3 -3
- data/lib/middleman-core/sitemap/extensions/proxies.rb +4 -4
- data/lib/middleman-core/sitemap/extensions/redirects.rb +16 -28
- data/lib/middleman-core/sitemap/extensions/request_endpoints.rb +17 -35
- data/lib/middleman-core/sitemap/extensions/traversal.rb +5 -5
- data/lib/middleman-core/sitemap/resource.rb +16 -16
- data/lib/middleman-core/sitemap/store.rb +42 -31
- data/lib/middleman-core/sources.rb +9 -9
- data/lib/middleman-core/sources/source_watcher.rb +14 -10
- data/lib/middleman-core/step_definitions/server_steps.rb +12 -4
- data/lib/middleman-core/template_context.rb +1 -1
- data/lib/middleman-core/template_renderer.rb +74 -75
- data/lib/middleman-core/util.rb +19 -16
- data/lib/middleman-core/util/data.rb +86 -82
- data/lib/middleman-core/version.rb +1 -1
- data/middleman-core.gemspec +1 -0
- metadata +19 -39
- data/features/cli/preview_server-hook.feature +0 -17
- data/features/cli/preview_server.feature +0 -536
- data/features/cli_extension.feature +0 -14
- data/features/cli_init.feature +0 -89
- data/fixtures/asset-hash-host-app/config.rb +0 -4
- data/fixtures/preview-server-app/bin/dns_server.rb +0 -33
- data/fixtures/preview-server-app/config.rb +0 -0
- data/fixtures/preview-server-app/source/index.html.erb +0 -1
- data/fixtures/preview-server-app/source/layout.erb +0 -9
- data/fixtures/preview-server-app/source/layouts/custom.erb +0 -8
- data/fixtures/preview-server-app/source/real.html +0 -1
- data/fixtures/preview-server-app/source/real/index.html.erb +0 -5
- data/fixtures/preview-server-app/source/should_be_ignored.html +0 -1
- data/fixtures/preview-server-app/source/should_be_ignored2.html +0 -1
- data/fixtures/preview-server-app/source/should_be_ignored3.html +0 -1
- data/fixtures/preview-server-app/source/static.html +0 -1
- data/fixtures/preview-server-hook-app/config.rb +0 -19
- data/fixtures/preview-server-hook-app/source/index.html.erb +0 -9
- data/lib/middleman-core/middleware/inline_url_rewriter.rb +0 -109
@@ -3,46 +3,48 @@ require 'active_support/core_ext/hash/deep_merge'
|
|
3
3
|
require 'monitor'
|
4
4
|
require 'hamster'
|
5
5
|
|
6
|
+
require 'middleman-core/extensions'
|
7
|
+
|
6
8
|
# Files on Disk
|
7
|
-
Middleman::Extensions.register :sitemap_ondisk, auto_activate: :before_configuration do
|
9
|
+
::Middleman::Extensions.register :sitemap_ondisk, auto_activate: :before_configuration do
|
8
10
|
require 'middleman-core/sitemap/extensions/on_disk'
|
9
|
-
Middleman::Sitemap::Extensions::OnDisk
|
11
|
+
::Middleman::Sitemap::Extensions::OnDisk
|
10
12
|
end
|
11
13
|
|
12
14
|
# Files on Disk (outside the project root)
|
13
|
-
Middleman::Extensions.register :sitemap_import, auto_activate: :before_configuration do
|
15
|
+
::Middleman::Extensions.register :sitemap_import, auto_activate: :before_configuration do
|
14
16
|
require 'middleman-core/sitemap/extensions/import'
|
15
|
-
Middleman::Sitemap::Extensions::Import
|
17
|
+
::Middleman::Sitemap::Extensions::Import
|
16
18
|
end
|
17
19
|
|
18
20
|
# Endpoints
|
19
|
-
Middleman::Extensions.register :sitemap_endpoint, auto_activate: :before_configuration do
|
21
|
+
::Middleman::Extensions.register :sitemap_endpoint, auto_activate: :before_configuration do
|
20
22
|
require 'middleman-core/sitemap/extensions/request_endpoints'
|
21
|
-
Middleman::Sitemap::Extensions::RequestEndpoints
|
23
|
+
::Middleman::Sitemap::Extensions::RequestEndpoints
|
22
24
|
end
|
23
25
|
|
24
26
|
# Proxies
|
25
|
-
Middleman::Extensions.register :sitemap_proxies, auto_activate: :before_configuration do
|
27
|
+
::Middleman::Extensions.register :sitemap_proxies, auto_activate: :before_configuration do
|
26
28
|
require 'middleman-core/sitemap/extensions/proxies'
|
27
|
-
Middleman::Sitemap::Extensions::Proxies
|
29
|
+
::Middleman::Sitemap::Extensions::Proxies
|
28
30
|
end
|
29
31
|
|
30
32
|
# Redirects
|
31
|
-
Middleman::Extensions.register :sitemap_redirects, auto_activate: :before_configuration do
|
33
|
+
::Middleman::Extensions.register :sitemap_redirects, auto_activate: :before_configuration do
|
32
34
|
require 'middleman-core/sitemap/extensions/redirects'
|
33
|
-
Middleman::Sitemap::Extensions::Redirects
|
35
|
+
::Middleman::Sitemap::Extensions::Redirects
|
34
36
|
end
|
35
37
|
|
36
38
|
# Move Files
|
37
|
-
Middleman::Extensions.register :sitemap_move_files, auto_activate: :before_configuration do
|
39
|
+
::Middleman::Extensions.register :sitemap_move_files, auto_activate: :before_configuration do
|
38
40
|
require 'middleman-core/sitemap/extensions/move_file'
|
39
|
-
Middleman::Sitemap::Extensions::MoveFile
|
41
|
+
::Middleman::Sitemap::Extensions::MoveFile
|
40
42
|
end
|
41
43
|
|
42
44
|
# Ignores
|
43
|
-
Middleman::Extensions.register :sitemap_ignore, auto_activate: :before_configuration do
|
45
|
+
::Middleman::Extensions.register :sitemap_ignore, auto_activate: :before_configuration do
|
44
46
|
require 'middleman-core/sitemap/extensions/ignores'
|
45
|
-
Middleman::Sitemap::Extensions::Ignores
|
47
|
+
::Middleman::Sitemap::Extensions::Ignores
|
46
48
|
end
|
47
49
|
|
48
50
|
require 'middleman-core/contracts'
|
@@ -73,6 +75,7 @@ module Middleman
|
|
73
75
|
def initialize(app)
|
74
76
|
@app = app
|
75
77
|
@resources = []
|
78
|
+
@rebuild_reasons = [:first_run]
|
76
79
|
@update_count = 0
|
77
80
|
|
78
81
|
@resource_list_manipulators = ::Hamster::Vector.empty
|
@@ -113,9 +116,10 @@ module Middleman
|
|
113
116
|
|
114
117
|
# Rebuild the list of resources from scratch, using registed manipulators
|
115
118
|
# @return [void]
|
116
|
-
Contract
|
117
|
-
def rebuild_resource_list!(name
|
119
|
+
Contract Symbol => Any
|
120
|
+
def rebuild_resource_list!(name)
|
118
121
|
@lock.synchronize do
|
122
|
+
@rebuild_reasons << name
|
119
123
|
@app.logger.debug "== Requesting resource list rebuilding: #{name}"
|
120
124
|
@needs_sitemap_rebuild = true
|
121
125
|
end
|
@@ -196,29 +200,36 @@ module Middleman
|
|
196
200
|
def ensure_resource_list_updated!
|
197
201
|
@lock.synchronize do
|
198
202
|
return unless @needs_sitemap_rebuild
|
199
|
-
@needs_sitemap_rebuild = false
|
200
203
|
|
201
|
-
|
204
|
+
::Middleman::Util.instrument 'sitemap.update', reasons: @rebuild_reasons.uniq do
|
205
|
+
@needs_sitemap_rebuild = false
|
206
|
+
|
207
|
+
@app.logger.debug '== Rebuilding resource list'
|
208
|
+
|
209
|
+
@resources = []
|
202
210
|
|
203
|
-
|
211
|
+
@resource_list_manipulators.each do |m|
|
212
|
+
::Middleman::Util.instrument 'sitemap.manipulator', name: m[:name] do
|
213
|
+
@app.logger.debug "== Running manipulator: #{m[:name]}"
|
214
|
+
@resources = m[:manipulator].send(m[:custom_name] || :manipulate_resource_list, @resources)
|
204
215
|
|
205
|
-
|
206
|
-
|
207
|
-
@resources = m[:manipulator].send(m[:custom_name] || :manipulate_resource_list, @resources)
|
216
|
+
# Reset lookup cache
|
217
|
+
reset_lookup_cache!
|
208
218
|
|
209
|
-
|
210
|
-
|
219
|
+
# Rebuild cache
|
220
|
+
@resources.each do |resource|
|
221
|
+
@_lookup_by_path[resource.path] = resource
|
222
|
+
@_lookup_by_destination_path[resource.destination_path] = resource
|
223
|
+
end
|
211
224
|
|
212
|
-
|
213
|
-
|
214
|
-
@_lookup_by_path[resource.path] = resource
|
215
|
-
@_lookup_by_destination_path[resource.destination_path] = resource
|
225
|
+
invalidate_resources_not_ignored_cache!
|
226
|
+
end
|
216
227
|
end
|
217
228
|
|
218
|
-
|
219
|
-
end
|
229
|
+
@update_count += 1
|
220
230
|
|
221
|
-
|
231
|
+
@rebuild_reasons = []
|
232
|
+
end
|
222
233
|
end
|
223
234
|
end
|
224
235
|
|
@@ -15,10 +15,10 @@ module Middleman
|
|
15
15
|
include Contracts
|
16
16
|
|
17
17
|
# Types which could cause output to change.
|
18
|
-
OUTPUT_TYPES = [:source, :locales, :data]
|
18
|
+
OUTPUT_TYPES = [:source, :locales, :data].freeze
|
19
19
|
|
20
20
|
# Types which require a reload to eval ruby
|
21
|
-
CODE_TYPES = [:reload]
|
21
|
+
CODE_TYPES = [:reload].freeze
|
22
22
|
|
23
23
|
Matcher = Or[Regexp, RespondTo[:call]]
|
24
24
|
|
@@ -213,12 +213,12 @@ module Middleman
|
|
213
213
|
# Manually poll all watchers for new content.
|
214
214
|
#
|
215
215
|
# @return [void]
|
216
|
-
Contract
|
216
|
+
Contract ArrayOf[Pathname]
|
217
217
|
def find_new_files!
|
218
|
-
return unless @update_count != @last_update_count
|
218
|
+
return [] unless @update_count != @last_update_count
|
219
219
|
|
220
220
|
@last_update_count = @update_count
|
221
|
-
watchers.
|
221
|
+
watchers.reduce([]) { |sum, w| sum + w.poll_once! }
|
222
222
|
end
|
223
223
|
|
224
224
|
# Start up all listeners.
|
@@ -257,11 +257,11 @@ module Middleman
|
|
257
257
|
#
|
258
258
|
# @param [nil,Regexp] matcher A Regexp to match the change path against
|
259
259
|
Contract Maybe[Matcher] => Any
|
260
|
-
def changed(matcher=nil, &
|
260
|
+
def changed(matcher=nil, &_block)
|
261
261
|
on_change OUTPUT_TYPES do |updated, _removed|
|
262
262
|
updated
|
263
263
|
.select { |f| matcher.nil? ? true : matches?(matcher, f) }
|
264
|
-
.each { |f|
|
264
|
+
.each { |f| yield f[:relative_path] }
|
265
265
|
end
|
266
266
|
end
|
267
267
|
|
@@ -269,11 +269,11 @@ module Middleman
|
|
269
269
|
#
|
270
270
|
# @param [nil,Regexp] matcher A Regexp to match the change path against
|
271
271
|
Contract Maybe[Matcher] => Any
|
272
|
-
def deleted(matcher=nil, &
|
272
|
+
def deleted(matcher=nil, &_block)
|
273
273
|
on_change OUTPUT_TYPES do |_updated, removed|
|
274
274
|
removed
|
275
275
|
.select { |f| matcher.nil? ? true : matches?(matcher, f) }
|
276
|
-
.each { |f|
|
276
|
+
.each { |f| yield f[:relative_path] }
|
277
277
|
end
|
278
278
|
end
|
279
279
|
|
@@ -91,7 +91,7 @@ module Middleman
|
|
91
91
|
|
92
92
|
stop_listener! if @listener
|
93
93
|
|
94
|
-
update([], @files.values)
|
94
|
+
update([], @files.values.map { |source_file| source_file[:full_path] })
|
95
95
|
|
96
96
|
poll_once!
|
97
97
|
|
@@ -180,17 +180,19 @@ module Middleman
|
|
180
180
|
# Manually trigger update events.
|
181
181
|
#
|
182
182
|
# @return [void]
|
183
|
-
Contract
|
183
|
+
Contract ArrayOf[Pathname]
|
184
184
|
def poll_once!
|
185
185
|
updated = ::Middleman::Util.all_files_under(@directory.to_s)
|
186
186
|
removed = @files.keys.reject { |p| updated.include?(p) }
|
187
187
|
|
188
188
|
update(updated, removed)
|
189
189
|
|
190
|
-
|
190
|
+
if @waiting_for_existence && @directory.exist?
|
191
|
+
@waiting_for_existence = false
|
192
|
+
listen!
|
193
|
+
end
|
191
194
|
|
192
|
-
|
193
|
-
listen!
|
195
|
+
updated + removed
|
194
196
|
end
|
195
197
|
|
196
198
|
# Work around this bug: http://bugs.ruby-lang.org/issues/4521
|
@@ -200,7 +202,7 @@ module Middleman
|
|
200
202
|
def to_s
|
201
203
|
"#<Middleman::SourceWatcher:0x#{object_id} type=#{@type.inspect} directory=#{@directory.inspect}>"
|
202
204
|
end
|
203
|
-
|
205
|
+
alias inspect to_s # Ruby 2.0 calls inspect for NoMethodError instead of to_s
|
204
206
|
|
205
207
|
protected
|
206
208
|
|
@@ -254,17 +256,19 @@ module Middleman
|
|
254
256
|
end
|
255
257
|
|
256
258
|
execute_callbacks(:on_change, [
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
259
|
+
valid_updates,
|
260
|
+
valid_removes,
|
261
|
+
self
|
262
|
+
]) unless valid_updates.empty? && valid_removes.empty?
|
261
263
|
end
|
262
264
|
|
265
|
+
Contract IsA['Middleman::SourceFile'] => Any
|
263
266
|
def add_file_to_cache(f)
|
264
267
|
@files[f[:full_path]] = f
|
265
268
|
@extensionless_files[strip_extensions(f[:full_path])] = f
|
266
269
|
end
|
267
270
|
|
271
|
+
Contract IsA['Middleman::SourceFile'] => Any
|
268
272
|
def remove_file_from_cache(f)
|
269
273
|
@files.delete(f[:full_path])
|
270
274
|
@extensionless_files.delete(strip_extensions(f[:full_path]))
|
@@ -4,22 +4,23 @@ require 'capybara/cucumber'
|
|
4
4
|
|
5
5
|
Given /^a clean server$/ do
|
6
6
|
@initialize_commands = []
|
7
|
+
@activation_commands = []
|
7
8
|
end
|
8
9
|
|
9
10
|
Given /^"([^\"]*)" feature is "([^\"]*)"$/ do |feature, state|
|
10
|
-
@
|
11
|
+
@activation_commands ||= []
|
11
12
|
|
12
13
|
if state == 'enabled'
|
13
|
-
@
|
14
|
+
@activation_commands << lambda { activate(feature.to_sym) }
|
14
15
|
end
|
15
16
|
end
|
16
17
|
|
17
18
|
Given /^"([^\"]*)" feature is "enabled" with "([^\"]*)"$/ do |feature, options_str|
|
18
|
-
@
|
19
|
+
@activation_commands ||= []
|
19
20
|
|
20
21
|
options = eval("{#{options_str}}")
|
21
22
|
|
22
|
-
@
|
23
|
+
@activation_commands << lambda { activate(feature.to_sym, options) }
|
23
24
|
end
|
24
25
|
|
25
26
|
Given /^"([^\"]*)" is set to "([^\"]*)"$/ do |variable, value|
|
@@ -41,6 +42,7 @@ Given /^the Server is running$/ do
|
|
41
42
|
ENV['MM_ROOT'] = root_dir
|
42
43
|
|
43
44
|
initialize_commands = @initialize_commands || []
|
45
|
+
activation_commands = @activation_commands || []
|
44
46
|
|
45
47
|
@server_inst = ::Middleman::Application.new do
|
46
48
|
config[:watcher_disable] = true
|
@@ -49,6 +51,12 @@ Given /^the Server is running$/ do
|
|
49
51
|
initialize_commands.each do |p|
|
50
52
|
instance_exec(&p)
|
51
53
|
end
|
54
|
+
|
55
|
+
app.after_configuration_eval do
|
56
|
+
activation_commands.each do |p|
|
57
|
+
config_context.instance_exec(&p)
|
58
|
+
end
|
59
|
+
end
|
52
60
|
end
|
53
61
|
|
54
62
|
Capybara.app = ::Middleman::Rack.new(@server_inst).to_app
|
@@ -28,6 +28,75 @@ module Middleman
|
|
28
28
|
@_cache ||= Cache.new
|
29
29
|
end
|
30
30
|
|
31
|
+
# Find a layout on-disk, optionally using a specific engine
|
32
|
+
# @param [String] name
|
33
|
+
# @param [Symbol] preferred_engine
|
34
|
+
# @return [String]
|
35
|
+
Contract IsA['Middleman::Application'], Or[String, Symbol], Symbol => Maybe[IsA['Middleman::SourceFile']]
|
36
|
+
def self.locate_layout(app, name, preferred_engine=nil)
|
37
|
+
resolve_opts = {}
|
38
|
+
resolve_opts[:preferred_engine] = preferred_engine unless preferred_engine.nil?
|
39
|
+
|
40
|
+
# Check layouts folder
|
41
|
+
layout_file = resolve_template(app, File.join(app.config[:layouts_dir], name.to_s), resolve_opts)
|
42
|
+
|
43
|
+
# If we didn't find it, check root
|
44
|
+
layout_file = resolve_template(app, name, resolve_opts) unless layout_file
|
45
|
+
|
46
|
+
# Return the path
|
47
|
+
layout_file
|
48
|
+
end
|
49
|
+
|
50
|
+
# Find a template on disk given a output path
|
51
|
+
# @param [String] request_path
|
52
|
+
# @option options [Boolean] :preferred_engine If set, try this engine first, then fall back to any engine.
|
53
|
+
# @return [String, Boolean] Either the path to the template, or false
|
54
|
+
Contract IsA['Middleman::Application'], Or[Symbol, String], Maybe[Hash] => Maybe[IsA['Middleman::SourceFile']]
|
55
|
+
def self.resolve_template(app, request_path, options={})
|
56
|
+
# Find the path by searching
|
57
|
+
relative_path = Util.strip_leading_slash(request_path.to_s)
|
58
|
+
|
59
|
+
# By default, any engine will do
|
60
|
+
preferred_engines = []
|
61
|
+
|
62
|
+
# If we're specifically looking for a preferred engine
|
63
|
+
if options.key?(:preferred_engine)
|
64
|
+
extension_class = ::Tilt[options[:preferred_engine]]
|
65
|
+
|
66
|
+
# Get a list of extensions for a preferred engine
|
67
|
+
preferred_engines += ::Tilt.mappings.select do |_, engines|
|
68
|
+
engines.include? extension_class
|
69
|
+
end.keys
|
70
|
+
end
|
71
|
+
|
72
|
+
preferred_engines << '*'
|
73
|
+
preferred_engines << nil if options[:try_static]
|
74
|
+
|
75
|
+
found_template = nil
|
76
|
+
|
77
|
+
preferred_engines.each do |preferred_engine|
|
78
|
+
path_with_ext = relative_path.dup
|
79
|
+
path_with_ext << ('.' + preferred_engine) unless preferred_engine.nil?
|
80
|
+
|
81
|
+
globbing = preferred_engine == '*'
|
82
|
+
|
83
|
+
# Cache lookups in build mode only
|
84
|
+
file = if app.build?
|
85
|
+
cache.fetch(path_with_ext, preferred_engine) do
|
86
|
+
app.files.find(:source, path_with_ext, globbing)
|
87
|
+
end
|
88
|
+
else
|
89
|
+
app.files.find(:source, path_with_ext, globbing)
|
90
|
+
end
|
91
|
+
|
92
|
+
found_template = file if file && (preferred_engine.nil? || ::Tilt[file[:full_path]])
|
93
|
+
break if found_template
|
94
|
+
end
|
95
|
+
|
96
|
+
# If we found one, return it
|
97
|
+
found_template
|
98
|
+
end
|
99
|
+
|
31
100
|
# Custom error class for handling
|
32
101
|
class TemplateNotFound < RuntimeError; end
|
33
102
|
|
@@ -132,14 +201,13 @@ module Middleman
|
|
132
201
|
# Look for :layout of any extension
|
133
202
|
# If found, use it. If not, continue
|
134
203
|
locate_layout(:layout, layout_engine)
|
135
|
-
|
204
|
+
elsif layout_file = locate_layout(local_layout, layout_engine)
|
136
205
|
# Look for specific layout
|
137
206
|
# If found, use it. If not, error.
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
end
|
207
|
+
|
208
|
+
layout_file
|
209
|
+
else
|
210
|
+
raise ::Middleman::TemplateRenderer::TemplateNotFound, "Could not locate layout: #{local_layout}"
|
143
211
|
end
|
144
212
|
end
|
145
213
|
|
@@ -152,25 +220,6 @@ module Middleman
|
|
152
220
|
self.class.locate_layout(@app, name, preferred_engine)
|
153
221
|
end
|
154
222
|
|
155
|
-
# Find a layout on-disk, optionally using a specific engine
|
156
|
-
# @param [String] name
|
157
|
-
# @param [Symbol] preferred_engine
|
158
|
-
# @return [String]
|
159
|
-
Contract IsA['Middleman::Application'], Or[String, Symbol], Symbol => Maybe[IsA['Middleman::SourceFile']]
|
160
|
-
def self.locate_layout(app, name, preferred_engine=nil)
|
161
|
-
resolve_opts = {}
|
162
|
-
resolve_opts[:preferred_engine] = preferred_engine unless preferred_engine.nil?
|
163
|
-
|
164
|
-
# Check layouts folder
|
165
|
-
layout_file = resolve_template(app, File.join(app.config[:layouts_dir], name.to_s), resolve_opts)
|
166
|
-
|
167
|
-
# If we didn't find it, check root
|
168
|
-
layout_file = resolve_template(app, name, resolve_opts) unless layout_file
|
169
|
-
|
170
|
-
# Return the path
|
171
|
-
layout_file
|
172
|
-
end
|
173
|
-
|
174
223
|
# Find a template on disk given a output path
|
175
224
|
# @param [String] request_path
|
176
225
|
# @param [Hash] options
|
@@ -179,55 +228,5 @@ module Middleman
|
|
179
228
|
def resolve_template(request_path, options={})
|
180
229
|
self.class.resolve_template(@app, request_path, options)
|
181
230
|
end
|
182
|
-
|
183
|
-
# Find a template on disk given a output path
|
184
|
-
# @param [String] request_path
|
185
|
-
# @option options [Boolean] :preferred_engine If set, try this engine first, then fall back to any engine.
|
186
|
-
# @return [String, Boolean] Either the path to the template, or false
|
187
|
-
Contract IsA['Middleman::Application'], Or[Symbol, String], Maybe[Hash] => Maybe[IsA['Middleman::SourceFile']]
|
188
|
-
def self.resolve_template(app, request_path, options={})
|
189
|
-
# Find the path by searching
|
190
|
-
relative_path = Util.strip_leading_slash(request_path.to_s)
|
191
|
-
|
192
|
-
# By default, any engine will do
|
193
|
-
preferred_engines = []
|
194
|
-
|
195
|
-
# If we're specifically looking for a preferred engine
|
196
|
-
if options.key?(:preferred_engine)
|
197
|
-
extension_class = ::Tilt[options[:preferred_engine]]
|
198
|
-
|
199
|
-
# Get a list of extensions for a preferred engine
|
200
|
-
preferred_engines += ::Tilt.mappings.select do |_, engines|
|
201
|
-
engines.include? extension_class
|
202
|
-
end.keys
|
203
|
-
end
|
204
|
-
|
205
|
-
preferred_engines << '*'
|
206
|
-
preferred_engines << nil if options[:try_static]
|
207
|
-
|
208
|
-
found_template = nil
|
209
|
-
|
210
|
-
preferred_engines.each do |preferred_engine|
|
211
|
-
path_with_ext = relative_path.dup
|
212
|
-
path_with_ext << ('.' + preferred_engine) unless preferred_engine.nil?
|
213
|
-
|
214
|
-
globbing = preferred_engine == '*'
|
215
|
-
|
216
|
-
# Cache lookups in build mode only
|
217
|
-
file = if app.build?
|
218
|
-
cache.fetch(path_with_ext, preferred_engine) do
|
219
|
-
app.files.find(:source, path_with_ext, globbing)
|
220
|
-
end
|
221
|
-
else
|
222
|
-
app.files.find(:source, path_with_ext, globbing)
|
223
|
-
end
|
224
|
-
|
225
|
-
found_template = file if file && (preferred_engine.nil? || ::Tilt[file[:full_path]])
|
226
|
-
break if found_template
|
227
|
-
end
|
228
|
-
|
229
|
-
# If we found one, return it
|
230
|
-
found_template
|
231
|
-
end
|
232
231
|
end
|
233
232
|
end
|