middleman 2.0.0.beta6 → 2.0.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- 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
data/CHANGELOG
CHANGED
@@ -3,15 +3,15 @@ Feature: Built-in page_classes view helper
|
|
3
3
|
|
4
4
|
Scenario: Viewing the root path
|
5
5
|
Given the Server is running
|
6
|
-
When I go to "/page-
|
7
|
-
Then I should see "page-
|
6
|
+
When I go to "/page-classes.html"
|
7
|
+
Then I should see "page-classes"
|
8
8
|
|
9
9
|
Scenario: Viewing a tier-1 path
|
10
10
|
Given the Server is running
|
11
|
-
When I go to "/sub1/page-
|
12
|
-
Then I should see "sub1 sub1_page-
|
11
|
+
When I go to "/sub1/page-classes.html"
|
12
|
+
Then I should see "sub1 sub1_page-classes"
|
13
13
|
|
14
14
|
Scenario: Viewing a tier-2 path
|
15
15
|
Given the Server is running
|
16
|
-
When I go to "/sub1/sub2/page-
|
17
|
-
Then I should see "sub1 sub1_sub2 sub1_sub2_page-
|
16
|
+
When I go to "/sub1/sub2/page-classes.html"
|
17
|
+
Then I should see "sub1 sub1_sub2 sub1_sub2_page-classes"
|
data/fixtures/test-app/config.rb
CHANGED
@@ -3,41 +3,28 @@ with_layout false do
|
|
3
3
|
page "/inline-js.html"
|
4
4
|
page "/inline-coffeescript.html"
|
5
5
|
page "/slim.html"
|
6
|
-
|
6
|
+
page "/data.html"
|
7
|
+
page "/page-classes.html"
|
8
|
+
page "/sub1/page-classes.html"
|
9
|
+
page "/sub1/sub2/page-classes.html"
|
7
10
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
haml :"page-classes.html", :layout => false
|
18
|
-
end
|
19
|
-
|
20
|
-
%w{
|
21
|
-
/auto-css.html
|
22
|
-
/auto-css
|
23
|
-
/auto-css/
|
24
|
-
/auto-css/auto-css.html
|
25
|
-
/auto-css/sub/auto-css.html
|
26
|
-
}.each do |path|
|
27
|
-
get path do
|
28
|
-
haml :"auto-css.html", :layout => false
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
%w{
|
33
|
-
/auto-js.html
|
34
|
-
/auto-js
|
35
|
-
/auto-js/
|
36
|
-
/auto-js/auto-js.html
|
37
|
-
/auto-js/sub/auto-js.html
|
38
|
-
}.each do |path|
|
39
|
-
get path do
|
40
|
-
haml :"auto-js.html", :layout => false
|
41
|
-
end
|
42
|
-
end
|
11
|
+
%w{
|
12
|
+
/auto-css.html
|
13
|
+
/auto-css
|
14
|
+
/auto-css/
|
15
|
+
/auto-css/auto-css.html
|
16
|
+
/auto-css/sub/auto-css.html
|
17
|
+
}.each do |path|
|
18
|
+
page path
|
19
|
+
end
|
43
20
|
|
21
|
+
%w{
|
22
|
+
/auto-js.html
|
23
|
+
/auto-js
|
24
|
+
/auto-js/
|
25
|
+
/auto-js/auto-js.html
|
26
|
+
/auto-js/sub/auto-js.html
|
27
|
+
}.each do |path|
|
28
|
+
page path
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
= auto_stylesheet_link_tag
|
@@ -0,0 +1 @@
|
|
1
|
+
= auto_stylesheet_link_tag
|
@@ -0,0 +1 @@
|
|
1
|
+
= auto_stylesheet_link_tag
|
@@ -0,0 +1 @@
|
|
1
|
+
= auto_javascript_include_tag
|
@@ -0,0 +1 @@
|
|
1
|
+
= auto_javascript_include_tag
|
@@ -0,0 +1 @@
|
|
1
|
+
= auto_javascript_include_tag
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= data.test.map { |r| r.title }.join(":") %>
|
@@ -0,0 +1 @@
|
|
1
|
+
= page_classes
|
@@ -0,0 +1 @@
|
|
1
|
+
= page_classes
|
data/lib/middleman.rb
CHANGED
@@ -71,7 +71,77 @@ module Middleman
|
|
71
71
|
autoload :Markdown, "middleman/renderers/markdown"
|
72
72
|
autoload :CoffeeScript, "middleman/renderers/coffee_script"
|
73
73
|
end
|
74
|
+
|
75
|
+
module CoreExtensions
|
76
|
+
# Custom Feature API
|
77
|
+
autoload :Features, "middleman/core_extensions/features"
|
78
|
+
|
79
|
+
# Asset Path Pipeline
|
80
|
+
autoload :Assets, "middleman/core_extensions/assets"
|
81
|
+
|
82
|
+
# DefaultHelpers are the built-in dynamic template helpers.
|
83
|
+
autoload :DefaultHelpers, "middleman/core_extensions/default_helpers"
|
84
|
+
|
85
|
+
# Data looks at the data/ folder for YAML files and makes them available
|
86
|
+
# to dynamic requests.
|
87
|
+
autoload :Data, "middleman/core_extensions/data"
|
88
|
+
|
89
|
+
# Parse YAML from templates
|
90
|
+
autoload :FrontMatter, "middleman/core_extensions/front_matter"
|
91
|
+
|
92
|
+
# Extended version of Padrino's rendering
|
93
|
+
autoload :Rendering, "middleman/core_extensions/rendering"
|
94
|
+
|
95
|
+
# Pass custom options to views
|
96
|
+
autoload :Routing, "middleman/core_extensions/routing"
|
97
|
+
end
|
98
|
+
|
99
|
+
module Features
|
100
|
+
# RelativeAssets allow any asset path in dynamic templates to be either
|
101
|
+
# relative to the root of the project or use an absolute URL.
|
102
|
+
autoload :RelativeAssets, "middleman/features/relative_assets"
|
103
|
+
|
104
|
+
# AssetHost allows you to setup multiple domains to host your static assets.
|
105
|
+
# Calls to asset paths in dynamic templates will then rotate through each of
|
106
|
+
# the asset servers to better spread the load.
|
107
|
+
autoload :AssetHost, "middleman/features/asset_host"
|
108
|
+
|
109
|
+
# CacheBuster adds a query string to assets in dynamic templates to avoid
|
110
|
+
# browser caches failing to update to your new content.
|
111
|
+
autoload :CacheBuster, "middleman/features/cache_buster"
|
112
|
+
|
113
|
+
# AutomaticImageSizes inspects the images used in your dynamic templates and
|
114
|
+
# automatically adds width and height attributes to their HTML elements.
|
115
|
+
autoload :AutomaticImageSizes, "middleman/features/automatic_image_sizes"
|
74
116
|
|
75
|
-
|
76
|
-
|
117
|
+
# UglyHaml enables the non-indented output format from Haml templates. Useful
|
118
|
+
# for somewhat obfuscating the output and hiding the fact that you're using Haml.
|
119
|
+
autoload :UglyHaml, "middleman/features/ugly_haml"
|
120
|
+
|
121
|
+
# MinifyCss uses the YUI compressor to shrink CSS files
|
122
|
+
autoload :MinifyCss, "middleman/features/minify_css"
|
123
|
+
|
124
|
+
# MinifyJavascript uses the YUI compressor to shrink JS files
|
125
|
+
autoload :MinifyJavascript, "middleman/features/minify_javascript"
|
126
|
+
|
127
|
+
# CodeRay is a syntax highlighter.
|
128
|
+
autoload :CodeRay, "middleman/features/code_ray"
|
129
|
+
|
130
|
+
# Lorem provides a handful of helpful prototyping methods to generate words,
|
131
|
+
# paragraphs, fake images, names and email addresses.
|
132
|
+
autoload :Lorem, "middleman/features/lorem"
|
133
|
+
|
134
|
+
# Treat project as a blog
|
135
|
+
autoload :Blog, "middleman/features/blog"
|
136
|
+
|
137
|
+
# Proxy web services requests in dev mode only
|
138
|
+
autoload :Proxy, "middleman/features/proxy"
|
139
|
+
|
140
|
+
# Automatically resize images for mobile devises
|
141
|
+
# autoload :TinySrc, "middleman/features/tiny_src"
|
142
|
+
|
143
|
+
# LiveReload will auto-reload browsers with the live reload extension installed after changes
|
144
|
+
# Currently disabled and untested.
|
145
|
+
# autoload :LiveReload, "middleman/features/live_reload"
|
146
|
+
end
|
77
147
|
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
module Middleman::CoreExtensions::Assets
|
2
|
+
class << self
|
3
|
+
def registered(app)
|
4
|
+
# Disable Padrino cache buster until explicitly enabled
|
5
|
+
app.set :asset_stamp, false
|
6
|
+
|
7
|
+
app.extend ClassMethods
|
8
|
+
|
9
|
+
app.helpers Helpers
|
10
|
+
|
11
|
+
app.register_asset_handler :base do |path, prefix, request|
|
12
|
+
path.include?("://") ? path : File.join(app.http_prefix || "/", prefix, path)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
alias :included :registered
|
16
|
+
end
|
17
|
+
|
18
|
+
module ClassMethods
|
19
|
+
def register_asset_handler(handler_name, &block)
|
20
|
+
@asset_handler_map ||= []
|
21
|
+
@asset_handler_stack ||= []
|
22
|
+
|
23
|
+
if block_given?
|
24
|
+
@asset_handler_stack << block
|
25
|
+
@asset_handler_map << handler_name
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def asset_handler_get_url(path, prefix="", request=nil)
|
30
|
+
@asset_handler_map ||= []
|
31
|
+
@asset_handler_stack ||= []
|
32
|
+
|
33
|
+
@asset_handler_stack.last.call(path, prefix, request)
|
34
|
+
end
|
35
|
+
|
36
|
+
def before_asset_handler(position, *args)
|
37
|
+
@asset_handler_map ||= []
|
38
|
+
@asset_handler_stack ||= []
|
39
|
+
|
40
|
+
current_index = @asset_handler_map.index(position)
|
41
|
+
return nil unless current_index
|
42
|
+
|
43
|
+
previous = current_index - 1
|
44
|
+
if (previous >= 0) && (previous < @asset_handler_map.length)
|
45
|
+
@asset_handler_stack[previous].call(*args)
|
46
|
+
else
|
47
|
+
nil
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
module Helpers
|
53
|
+
def asset_url(path, prefix="")
|
54
|
+
self.class.asset_handler_get_url(path, prefix, request)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -2,18 +2,19 @@ require "yaml"
|
|
2
2
|
require "httparty"
|
3
3
|
require "thor"
|
4
4
|
|
5
|
-
module Middleman::
|
5
|
+
module Middleman::CoreExtensions::Data
|
6
6
|
class << self
|
7
7
|
def registered(app)
|
8
|
+
app.set :data_dir, "data"
|
8
9
|
app.extend ClassMethods
|
9
|
-
app.helpers
|
10
|
+
app.helpers Helpers
|
10
11
|
end
|
11
12
|
alias :included :registered
|
12
13
|
end
|
13
14
|
|
14
15
|
module Helpers
|
15
16
|
def data
|
16
|
-
@@data ||=
|
17
|
+
@@data ||= DataObject.new(self)
|
17
18
|
end
|
18
19
|
end
|
19
20
|
|
@@ -33,7 +34,7 @@ module Middleman::Features::Data
|
|
33
34
|
elsif @@remote_sources.has_key?(path.to_s)
|
34
35
|
response = HTTParty.get(@@remote_sources[path.to_s]).parsed_response
|
35
36
|
else
|
36
|
-
file_path = File.join(@app.class.root,
|
37
|
+
file_path = File.join(@app.class.root, @app.class.data_dir, "#{path}.yml")
|
37
38
|
if File.exists? file_path
|
38
39
|
response = YAML.load_file(file_path)
|
39
40
|
end
|
@@ -82,11 +83,11 @@ module Middleman::Features::Data
|
|
82
83
|
#
|
83
84
|
# data.my_json
|
84
85
|
def data_source(name, url)
|
85
|
-
|
86
|
+
DataObject.add_source(name, url)
|
86
87
|
end
|
87
88
|
|
88
89
|
def data_content(name, content)
|
89
|
-
|
90
|
+
DataObject.data_content(name, content)
|
90
91
|
end
|
91
92
|
end
|
92
93
|
end
|
@@ -1,7 +1,13 @@
|
|
1
|
-
|
1
|
+
require "padrino-helpers"
|
2
|
+
|
3
|
+
module Middleman::CoreExtensions::DefaultHelpers
|
2
4
|
class << self
|
3
5
|
def registered(app)
|
4
|
-
|
6
|
+
# Use Padrino Helpers
|
7
|
+
app.register Padrino::Helpers
|
8
|
+
|
9
|
+
# Middleman Helpers
|
10
|
+
app.helpers Helpers
|
5
11
|
end
|
6
12
|
alias :included :registered
|
7
13
|
end
|
@@ -50,10 +56,6 @@ module Middleman::Features::DefaultHelpers
|
|
50
56
|
classes.join(' ')
|
51
57
|
end
|
52
58
|
|
53
|
-
def asset_url(path, prefix="")
|
54
|
-
Middleman::Assets.get_url(path, prefix, request)
|
55
|
-
end
|
56
|
-
|
57
59
|
# Padrino's asset handling needs to pass through ours
|
58
60
|
def asset_path(kind, source)
|
59
61
|
return source if source =~ /^http/
|
@@ -0,0 +1,96 @@
|
|
1
|
+
# Middleman provides an extension API which allows you to hook into the
|
2
|
+
# lifecycle of a page request, or static build, and manipulate the output.
|
3
|
+
# Internal to Middleman, these extensions are called "features," but we use
|
4
|
+
# the exact same API as is made available to the public.
|
5
|
+
#
|
6
|
+
# A Middleman extension looks like this:
|
7
|
+
#
|
8
|
+
# module MyExtension
|
9
|
+
# class << self
|
10
|
+
# def registered(app)
|
11
|
+
# # My Code
|
12
|
+
# end
|
13
|
+
# end
|
14
|
+
# end
|
15
|
+
#
|
16
|
+
# In your `config.rb`, you must load your extension (if it is not defined in
|
17
|
+
# that file) and call `activate`.
|
18
|
+
#
|
19
|
+
# require "my_extension"
|
20
|
+
# activate MyExtension
|
21
|
+
#
|
22
|
+
# This will call the `registered` method in your extension and provide you
|
23
|
+
# with the `app` parameter which is a Middleman::Server context. From here
|
24
|
+
# you can choose to respond to requests for certain paths or simply attach
|
25
|
+
# Rack middleware to the stack.
|
26
|
+
#
|
27
|
+
# The built-in features cover a wide range of functions. Some provide helper
|
28
|
+
# methods to use in your views. Some modify the output on-the-fly. And some
|
29
|
+
# apply computationally-intensive changes to your final build files.
|
30
|
+
|
31
|
+
module Middleman::CoreExtensions::Features
|
32
|
+
|
33
|
+
# The Feature API is itself a Feature. Mind blowing!
|
34
|
+
class << self
|
35
|
+
def registered(app)
|
36
|
+
app.set :default_extensions, []
|
37
|
+
app.extend ClassMethods
|
38
|
+
end
|
39
|
+
alias :included :registered
|
40
|
+
end
|
41
|
+
|
42
|
+
module ClassMethods
|
43
|
+
# This method is available in the project's `config.rb`.
|
44
|
+
# It takes a underscore-separated symbol, finds the appropriate
|
45
|
+
# feature module and includes it.
|
46
|
+
#
|
47
|
+
# activate :lorem
|
48
|
+
#
|
49
|
+
# Alternatively, you can pass in a Middleman feature module directly.
|
50
|
+
#
|
51
|
+
# activate MyFeatureModule
|
52
|
+
def activate(feature)
|
53
|
+
feature = feature.to_s if feature.is_a? Symbol
|
54
|
+
|
55
|
+
if feature.is_a? String
|
56
|
+
feature = feature.camelize
|
57
|
+
feature = Middleman::Features.const_get(feature)
|
58
|
+
end
|
59
|
+
|
60
|
+
register feature
|
61
|
+
end
|
62
|
+
|
63
|
+
# Deprecated API. Please use `activate` instead.
|
64
|
+
def enable(feature_name)
|
65
|
+
$stderr.puts "Warning: Feature activation has been renamed from enable to activate"
|
66
|
+
activate(feature_name)
|
67
|
+
super(feature_name)
|
68
|
+
end
|
69
|
+
|
70
|
+
# Add a block/proc to be run after features have been setup
|
71
|
+
def after_feature_init(&block)
|
72
|
+
@run_after_features ||= []
|
73
|
+
@run_after_features << block
|
74
|
+
end
|
75
|
+
|
76
|
+
# Load features before starting server
|
77
|
+
def new
|
78
|
+
# Check for and evaluate local configuration
|
79
|
+
local_config = File.join(self.root, "config.rb")
|
80
|
+
if File.exists? local_config
|
81
|
+
$stderr.puts "== Reading: Local config" if logging?
|
82
|
+
class_eval File.read(local_config)
|
83
|
+
set :app_file, File.expand_path(local_config)
|
84
|
+
end
|
85
|
+
|
86
|
+
# Add in defaults
|
87
|
+
default_extensions.each do |ext|
|
88
|
+
activate ext
|
89
|
+
end
|
90
|
+
|
91
|
+
@run_after_features.each { |block| class_eval(&block) }
|
92
|
+
|
93
|
+
super
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|