middleman 0.5.5 → 0.9.0.pre
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/.document +1 -2
- data/.gitignore +3 -2
- data/LICENSE +0 -0
- data/README.rdoc +4 -0
- data/Rakefile +28 -36
- data/VERSION +1 -1
- data/bin/mm-build +7 -113
- data/bin/mm-init +11 -5
- data/bin/mm-server +56 -3
- data/features/asset_host.feature +12 -0
- data/features/automatic_image_sizes.feature +14 -0
- data/features/cache_buster.feature +22 -0
- data/features/generator.feature +8 -0
- data/features/minify_css.feature +22 -0
- data/features/minify_javascript.feature +12 -0
- data/features/page_alias_and_layouts.feature +12 -0
- data/features/relative_assets.feature +12 -0
- data/features/step_definitions/asset_host_steps.rb +7 -0
- data/features/step_definitions/env.rb +3 -0
- data/features/step_definitions/generator_steps.rb +24 -0
- data/features/step_definitions/middleman_steps.rb +28 -0
- data/features/step_definitions/page_layout_steps.rb +13 -0
- data/lib/middleman.rb +6 -132
- data/lib/middleman/assets.rb +33 -0
- data/lib/middleman/base.rb +147 -0
- data/lib/middleman/builder.rb +59 -0
- data/lib/middleman/config.ru +2 -0
- data/lib/middleman/features.rb +39 -0
- data/lib/middleman/features/asset_host.rb +21 -0
- data/lib/middleman/features/automatic_image_sizes.rb +31 -0
- data/lib/middleman/features/automatic_image_sizes/fastimage.rb +282 -0
- data/lib/middleman/features/cache_buster.rb +43 -0
- data/lib/middleman/features/default_helpers.rb +68 -0
- data/lib/middleman/features/livereload.rb +19 -0
- data/lib/middleman/features/minify_css.rb +9 -0
- data/lib/middleman/features/minify_javascript.rb +20 -0
- data/lib/middleman/features/minify_javascript/rack.rb +31 -0
- data/lib/middleman/features/relative_assets.rb +35 -0
- data/lib/middleman/features/slickmap.rb +118 -0
- data/lib/middleman/features/smush_pngs.rb +38 -0
- data/lib/middleman/features/ugly_haml.rb +7 -0
- data/lib/middleman/renderers.rb +26 -0
- data/lib/middleman/renderers/coffee.rb +28 -0
- data/lib/middleman/renderers/haml.rb +47 -0
- data/lib/middleman/renderers/sass.rb +67 -0
- data/lib/middleman/template/init.rbt +57 -0
- data/lib/middleman/template/views/index.html.haml +4 -0
- data/lib/middleman/template/views/layout.haml +11 -4
- data/lib/middleman/template/views/stylesheets/site.css.sass +27 -0
- data/lib/middleman/templater+dynamic_renderer.rb +26 -0
- data/middleman.gemspec +121 -107
- data/spec/builder_spec.rb +17 -16
- data/spec/fixtures/sample/init.rb +28 -2
- data/spec/fixtures/sample/public/images/blank.gif +0 -0
- data/spec/fixtures/sample/public/static.html +0 -0
- data/{vendor/sinatra-maruku/examples/public/javascripts/application.js → spec/fixtures/sample/public/stylesheets/auto-css.css} +0 -0
- data/spec/fixtures/sample/public/stylesheets/static.css +0 -0
- data/{vendor/sinatra-maruku/examples/public/stylesheets/print.css → spec/fixtures/sample/public/stylesheets/sub1/auto-css.css} +0 -0
- data/spec/fixtures/sample/public/stylesheets/sub1/sub2/auto-css.css +0 -0
- data/spec/fixtures/sample/views/_partial.haml +0 -0
- data/spec/fixtures/sample/views/asset_host.html.haml +1 -0
- data/spec/fixtures/sample/views/auto-css.html.haml +1 -0
- data/spec/fixtures/sample/views/auto-image-sizes.html.haml +1 -0
- data/spec/fixtures/sample/views/cache-buster.html.haml +2 -0
- data/spec/fixtures/sample/views/{index.haml → custom-layout.html.haml} +0 -0
- data/spec/fixtures/sample/views/custom.haml +5 -0
- data/spec/fixtures/sample/views/index.html.haml +1 -0
- data/spec/fixtures/sample/views/inline-css.html.haml +4 -0
- data/spec/fixtures/sample/views/{inline-js.haml → inline-js.html.haml} +0 -0
- data/spec/fixtures/sample/views/layout.haml +1 -1
- data/spec/fixtures/sample/views/{maruku.maruku → maruku.html.maruku} +0 -0
- data/spec/fixtures/sample/views/page-classes.html.haml +1 -0
- data/spec/fixtures/sample/views/services/{index.haml → index.html.haml} +0 -0
- data/spec/fixtures/sample/views/stylesheets/asset_host.css.sass +3 -0
- data/spec/fixtures/sample/views/stylesheets/relative_assets.css.sass +3 -0
- data/spec/fixtures/sample/views/stylesheets/site.css.sass +1 -0
- data/spec/fixtures/sample/views/stylesheets/site_scss.css.scss +1 -0
- data/spec/fixtures/sample/views/stylesheets/test_less.css.less +5 -0
- data/spec/helpers_spec.rb +43 -0
- data/spec/spec_helper.rb +3 -5
- metadata +298 -127
- data/lib/middleman/helpers.rb +0 -131
- data/lib/middleman/markaby.rb +0 -4
- data/lib/middleman/maruku.rb +0 -4
- data/lib/middleman/sprockets_ext.rb +0 -29
- data/lib/middleman/template/init.rb +0 -22
- data/lib/middleman/template/views/index.haml +0 -1
- data/lib/middleman/template/views/stylesheets/site.sass +0 -1
- data/spec/fixtures/sample/views/markaby.mab +0 -5
- data/spec/fixtures/sample/views/stylesheets/site.sass +0 -1
- data/spec/generator_spec.rb +0 -34
- data/vendor/rack-test/History.txt +0 -64
- data/vendor/rack-test/MIT-LICENSE.txt +0 -19
- data/vendor/rack-test/README.rdoc +0 -57
- data/vendor/rack-test/Rakefile +0 -62
- data/vendor/rack-test/lib/rack/mock_session.rb +0 -57
- data/vendor/rack-test/lib/rack/test.rb +0 -246
- data/vendor/rack-test/lib/rack/test/cookie_jar.rb +0 -169
- data/vendor/rack-test/lib/rack/test/methods.rb +0 -73
- data/vendor/rack-test/lib/rack/test/mock_digest_request.rb +0 -27
- data/vendor/rack-test/lib/rack/test/uploaded_file.rb +0 -36
- data/vendor/rack-test/lib/rack/test/utils.rb +0 -75
- data/vendor/rack-test/spec/fixtures/config.ru +0 -3
- data/vendor/rack-test/spec/fixtures/fake_app.rb +0 -109
- data/vendor/rack-test/spec/fixtures/foo.txt +0 -1
- data/vendor/rack-test/spec/rack/test/cookie_spec.rb +0 -176
- data/vendor/rack-test/spec/rack/test/digest_auth_spec.rb +0 -48
- data/vendor/rack-test/spec/rack/test/multipart_spec.rb +0 -85
- data/vendor/rack-test/spec/rack/test/utils_spec.rb +0 -44
- data/vendor/rack-test/spec/rack/test_spec.rb +0 -363
- data/vendor/rack-test/spec/rcov.opts +0 -1
- data/vendor/rack-test/spec/spec.opts +0 -1
- data/vendor/rack-test/spec/spec_helper.rb +0 -48
- data/vendor/sinatra-content-for/LICENSE +0 -22
- data/vendor/sinatra-content-for/README.rdoc +0 -49
- data/vendor/sinatra-content-for/Rakefile +0 -33
- data/vendor/sinatra-content-for/lib/sinatra/content_for.rb +0 -58
- data/vendor/sinatra-content-for/sinatra-content-for.gemspec +0 -34
- data/vendor/sinatra-content-for/test/content_for_test.rb +0 -156
- data/vendor/sinatra-markaby/CHANGES +0 -7
- data/vendor/sinatra-markaby/LICENSE +0 -20
- data/vendor/sinatra-markaby/README.rdoc +0 -33
- data/vendor/sinatra-markaby/Rakefile +0 -45
- data/vendor/sinatra-markaby/TODO +0 -3
- data/vendor/sinatra-markaby/VERSION.yml +0 -4
- data/vendor/sinatra-markaby/lib/sinatra/markaby.rb +0 -31
- data/vendor/sinatra-markaby/sinatra-markaby.gemspec +0 -49
- data/vendor/sinatra-markaby/test/sinatra_markaby_test.rb +0 -72
- data/vendor/sinatra-markaby/test/test_helper.rb +0 -19
- data/vendor/sinatra-markaby/test/views/hello.mab +0 -1
- data/vendor/sinatra-markaby/test/views/html.mab +0 -4
- data/vendor/sinatra-maruku/LICENSE +0 -22
- data/vendor/sinatra-maruku/README.markdown +0 -85
- data/vendor/sinatra-maruku/Rakefile +0 -34
- data/vendor/sinatra-maruku/VERSION.yml +0 -4
- data/vendor/sinatra-maruku/examples/app.rb +0 -8
- data/vendor/sinatra-maruku/examples/config.ru +0 -4
- data/vendor/sinatra-maruku/examples/mapp.rb +0 -15
- data/vendor/sinatra-maruku/examples/public/stylesheets/application.css +0 -23
- data/vendor/sinatra-maruku/examples/views/index.maruku +0 -32
- data/vendor/sinatra-maruku/examples/views/layout.maruku +0 -9
- data/vendor/sinatra-maruku/lib/sinatra/maruku.rb +0 -25
- data/vendor/sinatra-maruku/sinatra-maruku.gemspec +0 -70
- data/vendor/sinatra-maruku/test/sinatra_maruku_test.rb +0 -91
- data/vendor/sinatra-maruku/test/test_helper.rb +0 -21
- data/vendor/sinatra-maruku/test/views/hello.maruku +0 -1
- data/vendor/sinatra-maruku/test/views/layout2.maruku +0 -2
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
Feature: Custom layouts
|
|
2
|
+
In order easily switch between relative and absolute paths
|
|
3
|
+
|
|
4
|
+
Scenario: Using custom :layout attribute
|
|
5
|
+
Given page "/custom-layout.html" has layout "custom"
|
|
6
|
+
When I go to "/custom-layout.html"
|
|
7
|
+
Then I should see "Custom Layout"
|
|
8
|
+
|
|
9
|
+
Scenario: Using with_layout block
|
|
10
|
+
Given "/custom-layout.html" with_layout block has layout "custom"
|
|
11
|
+
When I go to "/custom-layout.html"
|
|
12
|
+
Then I should see "Custom Layout"
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
Feature: Relative Assets
|
|
2
|
+
In order easily switch between relative and absolute paths
|
|
3
|
+
|
|
4
|
+
Scenario: Rendering css with the feature disabled
|
|
5
|
+
Given "relative_assets" feature is "disabled"
|
|
6
|
+
When I go to "/stylesheets/relative_assets.css"
|
|
7
|
+
Then I should not see "url('../"
|
|
8
|
+
|
|
9
|
+
Scenario: Rendering css with the feature enabled
|
|
10
|
+
Given "relative_assets" feature is "enabled"
|
|
11
|
+
When I go to "/stylesheets/relative_assets.css"
|
|
12
|
+
Then I should see "url('../"
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
require 'fileutils'
|
|
2
|
+
|
|
3
|
+
Then /^template files should exist at "([^\"]*)"$/ do |dirname|
|
|
4
|
+
target = File.join(File.dirname(File.dirname(File.dirname(__FILE__))), "spec", "fixtures", dirname)
|
|
5
|
+
template_glob = File.join(File.dirname(File.dirname(File.dirname(__FILE__))), "lib", "middleman", "template", "*/**/*")
|
|
6
|
+
|
|
7
|
+
Dir[template_glob].each do |f|
|
|
8
|
+
next if File.directory?(f)
|
|
9
|
+
File.exists?("#{target}/#{f.split('template/')[1]}").should be_true
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
Then /^empty directories should exist at "([^\"]*)"$/ do |dirname|
|
|
14
|
+
target = File.join(File.dirname(File.dirname(File.dirname(__FILE__))), "spec", "fixtures", dirname)
|
|
15
|
+
|
|
16
|
+
%w(views/stylesheets public/stylesheets public/javascripts public/images).each do |d|
|
|
17
|
+
File.exists?("#{target}/#{d}").should be_true
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
Then /^cleanup at "([^\"]*)"$/ do |dirname|
|
|
22
|
+
target = File.join(File.dirname(File.dirname(File.dirname(__FILE__))), "spec", "fixtures", dirname)
|
|
23
|
+
FileUtils.rm_rf(target)
|
|
24
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
Given /^"([^\"]*)" feature is "([^\"]*)"$/ do |feature, state|
|
|
2
|
+
enable_or_disable = (state == "enabled") ? :enable : :disable
|
|
3
|
+
Middleman::Base.send(enable_or_disable, feature.to_sym)
|
|
4
|
+
@browser = Rack::Test::Session.new(Rack::MockSession.new(Middleman::Base.new))
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
Given /^generated directory at "([^\"]*)"$/ do |dirname|
|
|
8
|
+
target = File.join(File.dirname(File.dirname(File.dirname(__FILE__))), "spec", "fixtures", dirname)
|
|
9
|
+
init_cmd = File.expand_path(File.join(File.dirname(File.dirname(File.dirname(__FILE__))), "bin", "mm-init"))
|
|
10
|
+
`cd #{File.dirname(target)} && #{init_cmd} #{File.basename(target)}`
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
When /^I go to "([^\"]*)"$/ do |url|
|
|
14
|
+
@browser.get(url)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
Then /^I should see "([^\"]*)"$/ do |expected|
|
|
18
|
+
@browser.last_response.body.should include(expected)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
Then /^I should not see "([^\"]*)"$/ do |expected|
|
|
22
|
+
@browser.last_response.body.should_not include(expected)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
Then /^I should see "([^\"]*)" lines$/ do |lines|
|
|
26
|
+
$stderr.puts @browser.last_response.body
|
|
27
|
+
@browser.last_response.body.chomp.split($/).length.should == lines.to_i
|
|
28
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
Given /^page "([^\"]*)" has layout "([^\"]*)"$/ do |url, layout|
|
|
2
|
+
Middleman::Base.set :root, File.join(File.dirname(File.dirname(File.dirname(__FILE__))), "spec", "fixtures", "sample")
|
|
3
|
+
Middleman::Base.page(url, :layout => layout.to_sym)
|
|
4
|
+
@browser = Rack::Test::Session.new(Rack::MockSession.new(Middleman::Base.new))
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
Given /^"([^\"]*)" with_layout block has layout "([^\"]*)"$/ do |url, layout|
|
|
8
|
+
Middleman::Base.set :root, File.join(File.dirname(File.dirname(File.dirname(__FILE__))), "spec", "fixtures", "sample")
|
|
9
|
+
Middleman::Base.with_layout(:layout => layout.to_sym) do
|
|
10
|
+
page(url)
|
|
11
|
+
end
|
|
12
|
+
@browser = Rack::Test::Session.new(Rack::MockSession.new(Middleman::Base.new))
|
|
13
|
+
end
|
data/lib/middleman.rb
CHANGED
|
@@ -1,134 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
require 'sinatra/base'
|
|
1
|
+
libdir = File.dirname(__FILE__)
|
|
2
|
+
$LOAD_PATH.unshift(libdir) unless $LOAD_PATH.include?(libdir)
|
|
4
3
|
|
|
5
|
-
|
|
6
|
-
require 'sprockets'
|
|
7
|
-
require File.join(File.dirname(__FILE__), 'middleman', 'sprockets_ext')
|
|
4
|
+
require 'rubygems'
|
|
8
5
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
require File.join(File.dirname(__FILE__), '..', 'vendor', 'sinatra-content-for', 'lib', 'sinatra', 'content_for')
|
|
13
|
-
|
|
14
|
-
class Middleman < Sinatra::Base
|
|
15
|
-
set :app_file, __FILE__
|
|
16
|
-
set :static, true
|
|
17
|
-
set :root, Dir.pwd
|
|
18
|
-
set :environment, defined?(MIDDLEMAN_BUILDER) ? :build : :development
|
|
19
|
-
set :default_ext, 'html'
|
|
20
|
-
set :supported_formats, %w(haml erb builder)
|
|
21
|
-
|
|
22
|
-
helpers Sinatra::ContentFor
|
|
23
|
-
|
|
24
|
-
def self.run!(options={}, &block)
|
|
25
|
-
set options
|
|
26
|
-
handler = detect_rack_handler
|
|
27
|
-
handler_name = handler.name.gsub(/.*::/, '')
|
|
28
|
-
puts "== The Middleman is standing watch on port #{port}"
|
|
29
|
-
handler.run self, :Host => host, :Port => port do |server|
|
|
30
|
-
trap(:INT) do
|
|
31
|
-
## Use thins' hard #stop! if available, otherwise just #stop
|
|
32
|
-
server.respond_to?(:stop!) ? server.stop! : server.stop
|
|
33
|
-
puts "\n== The Middleman has ended his patrol"
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
if block_given?
|
|
37
|
-
block.call
|
|
38
|
-
## Use thins' hard #stop! if available, otherwise just #stop
|
|
39
|
-
server.respond_to?(:stop!) ? server.stop! : server.stop
|
|
40
|
-
end
|
|
41
|
-
end
|
|
42
|
-
rescue Errno::EADDRINUSE => e
|
|
43
|
-
puts "== The Middleman is already standing watch on port #{port}!"
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
configure do
|
|
47
|
-
Compass.configuration do |config|
|
|
48
|
-
config.project_path = Dir.pwd
|
|
49
|
-
config.sass_dir = File.join(File.basename(self.views), "stylesheets")
|
|
50
|
-
config.output_style = :nested
|
|
51
|
-
config.css_dir = File.join(File.basename(self.public), "stylesheets")
|
|
52
|
-
config.images_dir = File.join(File.basename(self.public), "images")
|
|
53
|
-
config.http_images_path = "/images"
|
|
54
|
-
config.http_stylesheets_path = "/stylesheets"
|
|
55
|
-
config.add_import_path(config.sass_dir)
|
|
56
|
-
end
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
# include helpers
|
|
60
|
-
class_eval File.read(File.join(File.dirname(__FILE__), 'middleman', 'helpers.rb'))
|
|
61
|
-
|
|
62
|
-
# Check for local config
|
|
63
|
-
local_config = File.join(self.root, "init.rb")
|
|
64
|
-
if File.exists? local_config
|
|
65
|
-
puts "== Local config at: #{local_config}"
|
|
66
|
-
class_eval File.read(local_config)
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
configure do
|
|
70
|
-
Compass.configure_sass_plugin!
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
configure :build do
|
|
74
|
-
Compass.configuration do |config|
|
|
75
|
-
config.output_style = :compressed
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
module Minified
|
|
79
|
-
module Javascript
|
|
80
|
-
include ::Haml::Filters::Base
|
|
81
|
-
def render_with_options(text, options)
|
|
82
|
-
compressor = ::YUI::JavaScriptCompressor.new(:munge => true)
|
|
83
|
-
data = compressor.compress(text.rstrip.gsub("\n", "\n "))
|
|
84
|
-
%Q{<script type=#{options[:attr_wrapper]}text/javascript#{options[:attr_wrapper]}>#{data.chomp}</script>}
|
|
85
|
-
end
|
|
86
|
-
end
|
|
87
|
-
end
|
|
88
|
-
end
|
|
89
|
-
|
|
90
|
-
# CSS files
|
|
91
|
-
get %r{/(.*).css} do |path|
|
|
92
|
-
content_type 'text/css', :charset => 'utf-8'
|
|
93
|
-
begin
|
|
94
|
-
static_version = File.join(Dir.pwd, 'public') + request.path_info
|
|
95
|
-
send_file(static_version) if File.exists? static_version
|
|
96
|
-
|
|
97
|
-
location_of_sass_file = defined?(MIDDLEMAN_BUILDER) ? "build" : "views"
|
|
98
|
-
css_filename = File.join(Dir.pwd, location_of_sass_file) + request.path_info
|
|
99
|
-
sass(path.to_sym, Compass.sass_engine_options.merge({ :css_filename => css_filename }))
|
|
100
|
-
rescue Exception => e
|
|
101
|
-
sass_exception_string(e)
|
|
102
|
-
end
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
# All other files
|
|
106
|
-
get /(.*)/ do |path|
|
|
107
|
-
path << "index.#{options.default_ext}" if path.match(%r{/$})
|
|
108
|
-
path.gsub!(%r{^/}, '')
|
|
109
|
-
path_without_ext = path.gsub(File.extname(path), '')
|
|
110
|
-
|
|
111
|
-
result = nil
|
|
112
|
-
begin
|
|
113
|
-
options.supported_formats.detect do |renderer|
|
|
114
|
-
if File.exists?(File.join(options.views, "#{path}.#{renderer}"))
|
|
115
|
-
result = send(renderer.to_sym, path.to_sym)
|
|
116
|
-
elsif File.exists?(File.join(options.views, "#{path_without_ext}.#{renderer}"))
|
|
117
|
-
result = send(renderer.to_sym, path_without_ext.to_sym)
|
|
118
|
-
else
|
|
119
|
-
false
|
|
120
|
-
end
|
|
121
|
-
end
|
|
122
|
-
rescue Haml::Error => e
|
|
123
|
-
result = "Haml Error: #{e}"
|
|
124
|
-
result << "<pre>Backtrace: #{e.backtrace.join("\n")}</pre>"
|
|
125
|
-
end
|
|
126
|
-
|
|
127
|
-
result || pass
|
|
128
|
-
end
|
|
129
|
-
|
|
130
|
-
get %r{/(.*\.xml)} do |path|
|
|
131
|
-
content_type 'text/xml', :charset => 'utf-8'
|
|
132
|
-
haml(path.to_sym, :layout => false)
|
|
133
|
-
end
|
|
134
|
-
end
|
|
6
|
+
module Middleman
|
|
7
|
+
autoload :Base, "middleman/base"
|
|
8
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
module Middleman
|
|
2
|
+
module Assets
|
|
3
|
+
@@asset_handler_map = []
|
|
4
|
+
@@asset_handler_stack = []
|
|
5
|
+
|
|
6
|
+
def self.register(handler_name, &block)
|
|
7
|
+
if block_given?
|
|
8
|
+
@@asset_handler_stack << block
|
|
9
|
+
@@asset_handler_map << handler_name
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def self.get_url(path, prefix="", request=nil)
|
|
14
|
+
@@asset_handler_stack.last.call(path, prefix, request)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def self.before(position, *args)
|
|
18
|
+
current_index = @@asset_handler_map.index(position)
|
|
19
|
+
return nil unless current_index
|
|
20
|
+
|
|
21
|
+
previous = current_index - 1
|
|
22
|
+
if (previous >= 0) && (previous < @@asset_handler_map.length)
|
|
23
|
+
@@asset_handler_stack[previous].call(*args)
|
|
24
|
+
else
|
|
25
|
+
nil
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
Middleman::Assets.register :base do |path, prefix, request|
|
|
32
|
+
path.include?("://") ? path : File.join(Middleman::Base.http_prefix || "/", prefix, path)
|
|
33
|
+
end
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
# We're riding on Sinatra, so let's include it
|
|
2
|
+
require "sinatra/base"
|
|
3
|
+
require "sinatra/content_for"
|
|
4
|
+
|
|
5
|
+
class Sinatra::Request
|
|
6
|
+
attr_accessor :layout
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
module Middleman
|
|
10
|
+
class Base < Sinatra::Base
|
|
11
|
+
set :app_file, __FILE__
|
|
12
|
+
set :root, ENV["MM_DIR"] || Dir.pwd
|
|
13
|
+
set :reload, false
|
|
14
|
+
set :sessions, false
|
|
15
|
+
set :logging, false
|
|
16
|
+
set :environment, ENV['MM_ENV'] || :development
|
|
17
|
+
set :index_file, "index.html"
|
|
18
|
+
set :js_dir, "javascripts"
|
|
19
|
+
set :css_dir, "stylesheets"
|
|
20
|
+
set :images_dir, "images"
|
|
21
|
+
set :fonts_dir, "fonts"
|
|
22
|
+
set :build_dir, "build"
|
|
23
|
+
set :http_prefix, nil
|
|
24
|
+
|
|
25
|
+
helpers Sinatra::ContentFor
|
|
26
|
+
|
|
27
|
+
set :features, []
|
|
28
|
+
def self.enable(*opts)
|
|
29
|
+
set :features, (self.features << opts).flatten
|
|
30
|
+
super
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def self.disable(*opts)
|
|
34
|
+
current = self.features
|
|
35
|
+
current -= opts.flatten
|
|
36
|
+
set :features, current
|
|
37
|
+
super
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def self.set(option, value=self, &block)
|
|
41
|
+
if block_given?
|
|
42
|
+
value = Proc.new { block }
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
super(option, value, &nil)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
@@afters = []
|
|
49
|
+
def self.after_feature_init(&block)
|
|
50
|
+
@@afters << block
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Rack helper for adding mime-types during local preview
|
|
54
|
+
def self.mime(ext, type)
|
|
55
|
+
ext = ".#{ext}" unless ext.to_s[0] == ?.
|
|
56
|
+
::Rack::Mime::MIME_TYPES[ext.to_s] = type
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
@@layout = nil
|
|
60
|
+
def self.page(url, options={}, &block)
|
|
61
|
+
layout = @@layout
|
|
62
|
+
layout = options[:layout] if !options[:layout].nil?
|
|
63
|
+
|
|
64
|
+
get(url) do
|
|
65
|
+
return yield if block_given?
|
|
66
|
+
process_request(layout)
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def self.with_layout(layout, &block)
|
|
71
|
+
@@layout = layout
|
|
72
|
+
class_eval(&block) if block_given?
|
|
73
|
+
ensure
|
|
74
|
+
@@layout = nil
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def self.enabled?(name)
|
|
78
|
+
name = (name.to_s << "?").to_sym
|
|
79
|
+
self.respond_to?(name) && self.send(name)
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def enabled?(name)
|
|
83
|
+
self.class.enabled?(name)
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# This will match all requests not overridden in the project's init.rb
|
|
87
|
+
not_found do
|
|
88
|
+
process_request
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
private
|
|
92
|
+
def process_request(layout = :layout)
|
|
93
|
+
# Normalize the path and add index if we're looking at a directory
|
|
94
|
+
path = request.path
|
|
95
|
+
path << settings.index_file if path.match(%r{/$})
|
|
96
|
+
path.gsub!(%r{^/}, '')
|
|
97
|
+
|
|
98
|
+
template_path = locate_template_file(path)
|
|
99
|
+
if template_path
|
|
100
|
+
content_type mime_type(File.extname(path)), :charset => 'utf-8'
|
|
101
|
+
|
|
102
|
+
renderer = Middleman::Renderers.get_method(template_path)
|
|
103
|
+
if respond_to? renderer
|
|
104
|
+
status 200
|
|
105
|
+
return send(renderer, path.to_sym, { :layout => layout })
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
status 404
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def locate_template_file(path)
|
|
113
|
+
template_path = File.join(settings.views, "#{path}.*")
|
|
114
|
+
Dir.glob(template_path).first
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
require "middleman/assets"
|
|
120
|
+
require "middleman/renderers"
|
|
121
|
+
require "middleman/features"
|
|
122
|
+
|
|
123
|
+
# The Rack App
|
|
124
|
+
class Middleman::Base
|
|
125
|
+
def self.new(*args, &block)
|
|
126
|
+
# Check for and evaluate local configuration
|
|
127
|
+
local_config = File.join(self.root, "init.rb")
|
|
128
|
+
if File.exists? local_config
|
|
129
|
+
puts "== Reading: Local config" if logging?
|
|
130
|
+
Middleman::Base.class_eval File.read(local_config)
|
|
131
|
+
set :app_file, File.expand_path(local_config)
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
# loop over enabled feature
|
|
135
|
+
features.flatten.each do |feature_name|
|
|
136
|
+
next unless send(:"#{feature_name}?")
|
|
137
|
+
$stderr.puts "== Enabling: #{feature_name.to_s.capitalize}" if logging?
|
|
138
|
+
Middleman::Features.run(feature_name, self)
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
use ::Rack::ConditionalGet if environment == :development
|
|
142
|
+
|
|
143
|
+
@@afters.each { |block| class_eval(&block) }
|
|
144
|
+
|
|
145
|
+
super
|
|
146
|
+
end
|
|
147
|
+
end
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
require 'middleman/base'
|
|
2
|
+
require 'templater'
|
|
3
|
+
require 'middleman/templater+dynamic_renderer.rb'
|
|
4
|
+
|
|
5
|
+
# Placeholder for any methods the builder needs to abstract to allow feature integration
|
|
6
|
+
module Middleman
|
|
7
|
+
class Builder < ::Templater::Generator
|
|
8
|
+
|
|
9
|
+
@@template_extensions = ::Tilt.mappings.keys << "js"
|
|
10
|
+
|
|
11
|
+
# Define source and desintation
|
|
12
|
+
def self.source_root; Dir.pwd; end
|
|
13
|
+
def destination_root; File.join(Dir.pwd, Middleman::Base.build_dir); end
|
|
14
|
+
|
|
15
|
+
# Override template to ask middleman for the correct extension to output
|
|
16
|
+
def self.template(name, *args, &block)
|
|
17
|
+
return if args[0].include?('layout')
|
|
18
|
+
|
|
19
|
+
args.first.split('/').each do |part|
|
|
20
|
+
return if part[0,1] == '_'
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
if (args[0] === args[1])
|
|
24
|
+
args[1] = args[0].gsub("#{File.basename(Middleman::Base.views)}/", "").gsub("#{File.basename(Middleman::Base.public)}/", "")
|
|
25
|
+
if File.extname(args[1]) != ".js"
|
|
26
|
+
args[1] = args[1].gsub!(File.extname(args[1]), "") if File.basename(args[1]).split('.').length > 2
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
super(name, *args, &block)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def self.file(name, *args, &block)
|
|
34
|
+
file_ext = File.extname(args[0])
|
|
35
|
+
|
|
36
|
+
return unless ::Tilt[file_ext].nil?
|
|
37
|
+
|
|
38
|
+
if (args[0] === args[1])
|
|
39
|
+
args[1] = args[0].gsub("#{File.basename(Middleman::Base.views)}/", "").gsub("#{File.basename(Middleman::Base.public)}/", "")
|
|
40
|
+
end
|
|
41
|
+
super(name, *args, &block)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def self.init!
|
|
45
|
+
glob! File.basename(Middleman::Base.public), @@template_extensions
|
|
46
|
+
glob! File.basename(Middleman::Base.views), @@template_extensions
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def after_run
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
module Generators
|
|
54
|
+
extend ::Templater::Manifold
|
|
55
|
+
desc "Build a static site"
|
|
56
|
+
|
|
57
|
+
add :build, ::Middleman::Builder
|
|
58
|
+
end
|
|
59
|
+
end
|