middleman-more 3.0.0.beta.2 → 3.0.0.beta.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (33) hide show
  1. data/features/asset_hash.feature +24 -24
  2. data/features/ignore_already_minified.feature +39 -4
  3. data/features/markdown.feature +3 -12
  4. data/features/markdown_redcarpet.feature +37 -0
  5. data/features/minify_css.feature +72 -10
  6. data/features/minify_javascript.feature +108 -10
  7. data/features/slim.feature +15 -1
  8. data/fixtures/markdown-app/config.rb +0 -9
  9. data/lib/middleman-more.rb +1 -74
  10. data/lib/middleman-more/core_extensions/compass.rb +49 -48
  11. data/lib/middleman-more/core_extensions/sprockets.rb +10 -2
  12. data/lib/middleman-more/extensions/asset_hash.rb +9 -23
  13. data/lib/middleman-more/extensions/cache_buster.rb +51 -53
  14. data/lib/middleman-more/extensions/gzip.rb +14 -0
  15. data/lib/middleman-more/extensions/minify_css.rb +60 -70
  16. data/lib/middleman-more/extensions/minify_javascript.rb +70 -77
  17. data/lib/middleman-more/extensions/relative_assets.rb +47 -47
  18. data/lib/middleman-more/register_extensions.rb +82 -0
  19. data/lib/middleman-more/renderers/coffee_script.rb +22 -0
  20. data/lib/middleman-more/renderers/haml.rb +24 -19
  21. data/lib/middleman-more/renderers/liquid.rb +28 -23
  22. data/lib/middleman-more/renderers/markdown.rb +50 -42
  23. data/lib/middleman-more/renderers/sass.rb +70 -63
  24. data/lib/middleman-more/renderers/slim.rb +27 -19
  25. data/middleman-more.gemspec +6 -7
  26. metadata +34 -43
  27. data/fixtures/already-minified-app/config.rb +0 -2
  28. data/fixtures/already-minified-app/source/javascripts/test.min.js +0 -10
  29. data/fixtures/already-minified-app/source/stylesheets/test.min.css +0 -10
  30. data/fixtures/minify-css-app/config.rb +0 -0
  31. data/fixtures/passthrough-app/config.rb +0 -17
  32. data/fixtures/slim-app/config.rb +0 -1
  33. data/fixtures/slim-app/source/slim.html.slim +0 -7
@@ -1,92 +1,82 @@
1
1
  # Extensions namespace
2
- module Middleman::Extensions
2
+ module Middleman
3
+ module Extensions
3
4
 
4
- # Minify CSS Extension
5
- module MinifyCss
5
+ # Minify CSS Extension
6
+ module MinifyCss
6
7
 
7
- # Setup extension
8
- class << self
8
+ # Setup extension
9
+ class << self
9
10
 
10
- # Once registered
11
- def registered(app)
12
- app.set :css_compressor, false
11
+ # Once registered
12
+ def registered(app, options={})
13
+ app.set :css_compressor, false
13
14
 
14
- app.after_configuration do
15
- unless respond_to?(:css_compressor) && css_compressor
16
- require "middleman-more/extensions/minify_css/rainpress"
17
- set :css_compressor, ::Rainpress
18
- end
15
+ ignore = Array(options[:ignore]) << /\.min\./
16
+ inline = options[:inline] || false
17
+
18
+ app.after_configuration do
19
+ chosen_compressor = css_compressor || options[:compressor] || begin
20
+ require "middleman-more/extensions/minify_css/rainpress"
21
+ ::Rainpress
22
+ end
19
23
 
20
- # Setup Rack to watch for inline JS
21
- use InlineCSSRack, :compressor => css_compressor
24
+ # Setup Rack middleware to minify CSS
25
+ use Rack, :compressor => chosen_compressor,
26
+ :ignore => ignore,
27
+ :inline => inline
28
+ end
22
29
  end
30
+ alias :included :registered
23
31
  end
24
- alias :included :registered
25
- end
26
- end
27
-
28
- # Rack middleware to look for JS in HTML and compress it
29
- class InlineCSSRack
30
-
31
- # Init
32
- # @param [Class] app
33
- # @param [Hash] options
34
- def initialize(app, options={})
35
- @app = app
36
- @compressor = options[:compressor]
37
- end
38
-
39
- # Rack interface
40
- # @param [Rack::Environmemt] env
41
- # @return [Array]
42
- def call(env)
43
- status, headers, response = @app.call(env)
32
+
33
+ # Rack middleware to look for CSS and compress it
34
+ class Rack
44
35
 
45
- path = env["PATH_INFO"]
36
+ # Init
37
+ # @param [Class] app
38
+ # @param [Hash] options
39
+ def initialize(app, options={})
40
+ @app = app
41
+ @compressor = options[:compressor]
42
+ @ignore = options[:ignore]
43
+ @inline = options[:inline]
44
+ end
46
45
 
47
- if path.end_with?('.html') || path.end_with?('.php')
48
- uncompressed_source = extract_response_text(response)
46
+ # Rack interface
47
+ # @param [Rack::Environmemt] env
48
+ # @return [Array]
49
+ def call(env)
50
+ status, headers, response = @app.call(env)
49
51
 
50
- minified = uncompressed_source.gsub(/(<style[^>]*>\s*(?:\/\*<!\[CDATA\[\*\/\n)?)(.*?)((?:(?:\n\s*)?\/\*\]\]>\*\/)?\s*<\/style>)/m) do |match|
51
- first = $1
52
- css = $2
53
- last = $3
52
+ path = env["PATH_INFO"]
54
53
 
55
- minified_css = @compressor.compress(css)
54
+ if (path.end_with?('.html') || path.end_with?('.php')) && @inline
55
+ uncompressed_source = ::Middleman::Util.extract_response_text(response)
56
56
 
57
- first << minified_css << last
58
- end
57
+ minified = uncompressed_source.gsub(/(<style[^>]*>\s*(?:\/\*<!\[CDATA\[\*\/\n)?)(.*?)((?:(?:\n\s*)?\/\*\]\]>\*\/)?\s*<\/style>)/m) do |match|
58
+ first = $1
59
+ css = $2
60
+ last = $3
59
61
 
60
- headers["Content-Length"] = ::Rack::Utils.bytesize(minified).to_s
61
- response = [minified]
62
- elsif path.end_with?('.css') && path !~ /\.min\./
63
- uncompressed_source = extract_response_text(response)
64
- minified_css = @compressor.compress(uncompressed_source)
62
+ minified_css = @compressor.compress(css)
65
63
 
66
- headers["Content-Length"] = ::Rack::Utils.bytesize(minified_css).to_s
67
- response = [minified_css]
68
- end
64
+ first << minified_css << last
65
+ end
69
66
 
70
- [status, headers, response]
71
- end
67
+ headers["Content-Length"] = ::Rack::Utils.bytesize(minified).to_s
68
+ response = [minified]
69
+ elsif path.end_with?('.css') && @ignore.none? {|ignore| path =~ ignore }
70
+ uncompressed_source = ::Middleman::Util.extract_response_text(response)
71
+ minified_css = @compressor.compress(uncompressed_source)
72
72
 
73
- private
73
+ headers["Content-Length"] = ::Rack::Utils.bytesize(minified_css).to_s
74
+ response = [minified_css]
75
+ end
74
76
 
75
- def extract_response_text(response)
76
- case(response)
77
- when String
78
- response
79
- when Array
80
- response.join
81
- when Rack::Response
82
- response.body.join
83
- when Rack::File
84
- File.read(response.path)
85
- else
86
- response.to_s
77
+ [status, headers, response]
78
+ end
87
79
  end
88
80
  end
89
81
  end
90
- # Register extension
91
- # register :minify_css, MinifyCss
92
82
  end
@@ -1,101 +1,94 @@
1
1
  # Extension namespace
2
- module Middleman::Extensions
2
+ module Middleman
3
+ module Extensions
3
4
 
4
- # Minify Javascript Extension
5
- module MinifyJavascript
5
+ # Minify Javascript Extension
6
+ module MinifyJavascript
6
7
 
7
- # Setup extension
8
- class << self
8
+ # Setup extension
9
+ class << self
9
10
 
10
- # Once registered
11
- def registered(app)
12
- app.set :js_compressor, false
11
+ # Once registered
12
+ def registered(app, options={})
13
+ app.set :js_compressor, false
13
14
 
14
- # Once config is parsed
15
- app.after_configuration do
16
- unless respond_to?(:js_compressor) && js_compressor
17
- require 'uglifier'
18
- set :js_compressor, ::Uglifier.new
19
- end
15
+ ignore = Array(options[:ignore]) << /\.min\./
16
+ inline = options[:inline] || false
17
+
18
+ # Once config is parsed
19
+ app.after_configuration do
20
+ chosen_compressor = js_compressor || options[:compressor] || begin
21
+ require 'uglifier'
22
+ ::Uglifier.new
23
+ end
20
24
 
21
- # Setup Rack to watch for inline JS
22
- use InlineJavascriptRack, :compressor => js_compressor
25
+ # Setup Rack middlware to minify JS
26
+ use Rack, :compressor => chosen_compressor,
27
+ :ignore => ignore,
28
+ :inline => inline
29
+ end
23
30
  end
31
+ alias :included :registered
24
32
  end
25
- alias :included :registered
26
- end
27
33
 
28
- # Rack middleware to look for JS in HTML and compress it
29
- class InlineJavascriptRack
34
+ # Rack middleware to look for JS and compress it
35
+ class Rack
30
36
 
31
- # Init
32
- # @param [Class] app
33
- # @param [Hash] options
34
- def initialize(app, options={})
35
- @app = app
36
- @compressor = options[:compressor]
37
- end
38
-
39
- # Rack interface
40
- # @param [Rack::Environmemt] env
41
- # @return [Array]
42
- def call(env)
43
- status, headers, response = @app.call(env)
44
-
45
- path = env["PATH_INFO"]
37
+ # Init
38
+ # @param [Class] app
39
+ # @param [Hash] options
40
+ def initialize(app, options={})
41
+ @app = app
42
+ @compressor = options[:compressor]
43
+ @ignore = options[:ignore]
44
+ @inline = options[:inline]
45
+ end
46
46
 
47
- if path.end_with?('.html') || path.end_with?('.php')
48
- uncompressed_source = extract_response_text(response)
47
+ # Rack interface
48
+ # @param [Rack::Environmemt] env
49
+ # @return [Array]
50
+ def call(env)
51
+ status, headers, response = @app.call(env)
49
52
 
50
- minified = uncompressed_source.gsub(/(<script[^>]*>\s*(?:\/\/(?:(?:<!--)|(?:<!\[CDATA\[))\n)?)(.*?)((?:(?:\n\s*)?\/\/(?:(?:-->)|(?:\]\]>)))?\s*<\/script>)/m) do |match|
51
- first = $1
52
- javascript = $2
53
- last = $3
53
+ path = env["PATH_INFO"]
54
54
 
55
- # Only compress script tags that contain JavaScript (as opposed
56
- # to something like jQuery templates, identified with a "text/html"
57
- # type.
58
- if first =~ /<script>/ || first.include?('text/javascript')
59
- minified_js = @compressor.compress(javascript)
55
+ begin
56
+ if (path.end_with?('.html') || path.end_with?('.php')) && @inline
57
+ uncompressed_source = ::Middleman::Util.extract_response_text(response)
60
58
 
61
- first << minified_js << last
62
- else
63
- match
64
- end
65
- end
59
+ minified = uncompressed_source.gsub(/(<script[^>]*>\s*(?:\/\/(?:(?:<!--)|(?:<!\[CDATA\[))\n)?)(.*?)((?:(?:\n\s*)?\/\/(?:(?:-->)|(?:\]\]>)))?\s*<\/script>)/m) do |match|
60
+ first = $1
61
+ javascript = $2
62
+ last = $3
66
63
 
67
- headers["Content-Length"] = ::Rack::Utils.bytesize(minified).to_s
68
- response = [minified]
69
- elsif path.end_with?('.js') && path !~ /\.min\./
70
- uncompressed_source = extract_response_text(response)
71
- minified_js = @compressor.compress(uncompressed_source)
64
+ # Only compress script tags that contain JavaScript (as opposed
65
+ # to something like jQuery templates, identified with a "text/html"
66
+ # type.
67
+ if first =~ /<script>/ || first.include?('text/javascript')
68
+ minified_js = @compressor.compress(javascript)
72
69
 
73
- headers["Content-Length"] = ::Rack::Utils.bytesize(minified_js).to_s
74
- response = [minified_js]
75
- end
70
+ first << minified_js << last
71
+ else
72
+ match
73
+ end
74
+ end
76
75
 
77
- [status, headers, response]
78
- end
76
+ headers["Content-Length"] = ::Rack::Utils.bytesize(minified).to_s
77
+ response = [minified]
78
+ elsif path.end_with?('.js') && @ignore.none? {|ignore| path =~ ignore }
79
+ uncompressed_source = ::Middleman::Util.extract_response_text(response)
80
+ minified_js = @compressor.compress(uncompressed_source)
79
81
 
80
- private
82
+ headers["Content-Length"] = ::Rack::Utils.bytesize(minified_js).to_s
83
+ response = [minified_js]
84
+ end
85
+ rescue ExecJS::ProgramError => e
86
+ warn "WARNING: Couldn't compress JavaScript in #{path}: #{e.message}"
87
+ end
81
88
 
82
- def extract_response_text(response)
83
- case(response)
84
- when String
85
- response
86
- when Array
87
- response.join
88
- when Rack::Response
89
- response.body.join
90
- when Rack::File
91
- File.read(response.path)
92
- else
93
- response.to_s
89
+ [status, headers, response]
94
90
  end
95
91
  end
96
92
  end
97
93
  end
98
-
99
- # Register extension
100
- # register :minify_javascript, MinifyJavascript
101
94
  end
@@ -1,63 +1,63 @@
1
1
  # Extension namespace
2
- module Middleman::Extensions
2
+ module Middleman
3
+ module Extensions
3
4
 
4
- # Relative Assets extension
5
- module RelativeAssets
5
+ # Relative Assets extension
6
+ module RelativeAssets
6
7
 
7
- # Setup extension
8
- class << self
8
+ # Setup extension
9
+ class << self
9
10
 
10
- # Once registered
11
- def registered(app)
12
- # Tell compass to use relative assets
13
- app.compass_config do |config|
14
- config.relative_assets = true
11
+ # Once registered
12
+ def registered(app)
13
+ # Tell compass to use relative assets
14
+ app.compass_config do |config|
15
+ config.relative_assets = true
16
+ end
17
+
18
+ # Include instance methods
19
+ app.send :include, InstanceMethods
15
20
  end
16
21
 
17
- # Include instance methods
18
- app.send :include, InstanceMethods
22
+ alias :included :registered
19
23
  end
20
-
21
- alias :included :registered
22
- end
23
24
 
24
- # Relative Assets instance method
25
- module InstanceMethods
25
+ # Relative Assets instance method
26
+ module InstanceMethods
26
27
 
27
- # asset_url override for relative assets
28
- # @param [String] path
29
- # @param [String] prefix
30
- # @return [String]
31
- def asset_url(path, prefix="")
32
- begin
33
- prefix = images_dir if prefix == http_images_path
34
- rescue
35
- end
36
-
37
- if path.include?("://")
38
- super(path, prefix)
39
- elsif path[0,1] == "/"
40
- path
41
- else
42
- path = File.join(prefix, path) if prefix.length > 0
43
- request_path = @request_path.dup
44
- request_path << index_file if path.match(%r{/$})
45
- request_path.gsub!(%r{^/}, '')
46
- parts = request_path.split('/')
28
+ # asset_url override for relative assets
29
+ # @param [String] path
30
+ # @param [String] prefix
31
+ # @return [String]
32
+ def asset_url(path, prefix="")
33
+ begin
34
+ prefix = images_dir if prefix == http_images_path
35
+ rescue
36
+ end
47
37
 
48
- if parts.length > 1
49
- arry = []
50
- (parts.length - 1).times { arry << ".." }
51
- arry << path
52
- File.join(*arry)
53
- else
38
+ if path.include?("://")
39
+ super(path, prefix)
40
+ elsif path[0,1] == "/"
54
41
  path
42
+ else
43
+ path = File.join(prefix, path) if prefix.length > 0
44
+
45
+ request_path = current_path.dup
46
+ request_path << index_file if path.match(%r{/$})
47
+
48
+ parts = request_path.gsub(%r{^/}, '').split('/')
49
+
50
+ if parts.length > 1
51
+ arry = []
52
+ (parts.length - 1).times { arry << ".." }
53
+ arry << path
54
+ File.join(*arry)
55
+ else
56
+ path
57
+ end
55
58
  end
56
59
  end
57
60
  end
58
61
  end
59
62
  end
60
-
61
- # Register extension
62
- # register :relative_assets, RelativeAssets
63
- end
63
+ end
@@ -0,0 +1,82 @@
1
+ ###
2
+ # Setup renderers
3
+ ###
4
+
5
+ # CoffeeScript Support
6
+ require "middleman-more/renderers/coffee_script"
7
+ Middleman::Application.register Middleman::Renderers::CoffeeScript
8
+
9
+ # Haml Support
10
+ require "middleman-more/renderers/haml"
11
+ Middleman::Application.register Middleman::Renderers::Haml
12
+
13
+ # Sass Support
14
+ require "middleman-more/renderers/sass"
15
+ Middleman::Application.register Middleman::Renderers::Sass
16
+
17
+ # Markdown Support
18
+ require "middleman-more/renderers/markdown"
19
+ Middleman::Application.register Middleman::Renderers::Markdown
20
+
21
+ # Liquid Support
22
+ require "middleman-more/renderers/liquid"
23
+ Middleman::Application.register Middleman::Renderers::Liquid
24
+
25
+ # Slim Support
26
+ require "middleman-more/renderers/slim"
27
+ Middleman::Application.register Middleman::Renderers::Slim
28
+
29
+ ###
30
+ # Setup Core Extensions
31
+ ###
32
+
33
+ # Compass framework
34
+ require "middleman-more/core_extensions/compass"
35
+ Middleman::Application.register Middleman::CoreExtensions::Compass
36
+
37
+ # Sprockets asset handling
38
+ require "middleman-more/core_extensions/sprockets"
39
+ Middleman::Application.register Middleman::CoreExtensions::Sprockets
40
+
41
+ ###
42
+ # Setup Optional Extensions
43
+ ###
44
+
45
+ # CacheBuster adds a query string to assets in dynamic templates to avoid
46
+ # browser caches failing to update to your new content.
47
+ Middleman::Extensions.register(:cache_buster) do
48
+ require "middleman-more/extensions/cache_buster"
49
+ Middleman::Extensions::CacheBuster
50
+ end
51
+
52
+ # MinifyCss compresses CSS
53
+ Middleman::Extensions.register(:minify_css) do
54
+ require "middleman-more/extensions/minify_css"
55
+ Middleman::Extensions::MinifyCss
56
+ end
57
+
58
+ # MinifyJavascript compresses JS
59
+ Middleman::Extensions.register(:minify_javascript) do
60
+ require "middleman-more/extensions/minify_javascript"
61
+ Middleman::Extensions::MinifyJavascript
62
+ end
63
+
64
+ # RelativeAssets allow any asset path in dynamic templates to be either
65
+ # relative to the root of the project or use an absolute URL.
66
+ Middleman::Extensions.register(:relative_assets) do
67
+ require "middleman-more/extensions/relative_assets"
68
+ Middleman::Extensions::RelativeAssets
69
+ end
70
+
71
+ # GZIP assets and pages during build
72
+ Middleman::Extensions.register(:gzip) do
73
+ require "middleman-more/extensions/gzip"
74
+ Middleman::Extensions::Gzip
75
+ end
76
+
77
+ # AssetHash appends a hash of the file contents to the assets filename
78
+ # to avoid browser caches failing to update to your new content.
79
+ Middleman::Extensions.register(:asset_hash) do
80
+ require "middleman-more/extensions/asset_hash"
81
+ Middleman::Extensions::AssetHash
82
+ end