middleman 0.14.1 → 0.99.0.pre

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. data/Rakefile +14 -18
  2. data/VERSION +1 -1
  3. data/features/automatic_image_sizes.feature +7 -7
  4. data/features/cache_buster.feature +10 -10
  5. data/features/minify_css.feature +10 -10
  6. data/features/minify_javascript.feature +6 -6
  7. data/features/step_definitions/asset_host_steps.rb +1 -0
  8. data/features/step_definitions/middleman_steps.rb +1 -1
  9. data/lib/middleman.rb +1 -18
  10. data/lib/middleman/assets.rb +33 -0
  11. data/lib/middleman/base.rb +25 -66
  12. data/lib/middleman/builder.rb +8 -4
  13. data/lib/middleman/features.rb +39 -0
  14. data/lib/middleman/features/asset_host.rb +16 -19
  15. data/lib/middleman/features/automatic_image_sizes.rb +24 -24
  16. data/lib/middleman/{fastimage.rb → features/automatic_image_sizes/fastimage.rb} +0 -0
  17. data/lib/middleman/features/cache_buster.rb +31 -38
  18. data/lib/middleman/{helpers.rb → features/default_helpers.rb} +8 -11
  19. data/lib/middleman/features/livereload.rb +19 -0
  20. data/lib/middleman/features/minify_css.rb +9 -0
  21. data/lib/middleman/features/minify_javascript.rb +15 -17
  22. data/lib/middleman/features/minify_javascript/rack.rb +31 -0
  23. data/lib/middleman/features/relative_assets.rb +29 -40
  24. data/lib/middleman/features/slickmap.rb +69 -70
  25. data/lib/middleman/features/smush_pngs.rb +8 -6
  26. data/lib/middleman/features/ugly_haml.rb +7 -0
  27. data/lib/middleman/renderers.rb +26 -0
  28. data/lib/middleman/renderers/coffee.rb +28 -0
  29. data/lib/middleman/renderers/haml.rb +2 -25
  30. data/lib/middleman/renderers/sass.rb +40 -87
  31. data/lib/middleman/template/init.rbt +30 -7
  32. data/middleman.gemspec +58 -69
  33. data/spec/builder_spec.rb +10 -4
  34. data/spec/fixtures/sample/views/stylesheets/site_scss.css.scss +1 -0
  35. data/spec/fixtures/sample/views/stylesheets/test_less.css.less +5 -0
  36. metadata +125 -113
  37. data/lib/middleman/rack/minify_css.rb +0 -25
  38. data/lib/middleman/rack/minify_javascript.rb +0 -25
  39. data/lib/middleman/rack/sprockets.rb +0 -61
  40. data/lib/middleman/renderers/builder.rb +0 -23
  41. data/lib/middleman/renderers/erb.rb +0 -24
  42. data/lib/middleman/renderers/less.rb +0 -23
  43. data/spec/fixtures/sample/public/javascripts/to-be-included.js +0 -1
  44. data/spec/fixtures/sample/views/javascripts/empty-with-include.js +0 -1
@@ -1,24 +1,21 @@
1
- class Middleman::Base
2
- after_feature_init do
3
- ::Compass.configuration do |config|
4
- config.asset_host(&self.asset_host)
1
+ class Middleman::Features::AssetHost
2
+ def initialize(app)
3
+ Middleman::Base.after_feature_init do
4
+ if Middleman::Base.asset_host.is_a?(Proc)
5
+ ::Compass.configuration.asset_host(&Middleman::Base.asset_host)
6
+ end
5
7
  end
6
- end if self.enabled?(:asset_host) && self.asset_host && self.asset_host.is_a?(Proc)
7
- end
8
-
9
- class << Middleman::Base
10
- alias_method :pre_asset_host_asset_url, :asset_url
11
- def asset_url(path, prefix="", request=nil)
12
- original_output = pre_asset_host_asset_url(path, prefix, request)
13
-
14
- valid_extensions = %w(.png .gif .jpg .jpeg .js .css)
15
8
 
16
- if !self.enabled?(:asset_host) || path.include?("://") || !valid_extensions.include?(File.extname(path)) || !self.asset_host || !self.asset_host.is_a?(Proc) || !self.asset_host.respond_to?(:call)
17
- return original_output
18
- end
9
+ Middleman::Assets.register :asset_host do |path, prefix, request|
10
+ original_output = Middleman::Assets.before(:asset_host, path, prefix, request)
19
11
 
20
- asset_prefix = self.asset_host.call(original_output)
21
-
22
- return File.join(asset_prefix, original_output)
12
+ valid_extensions = %w(.png .gif .jpg .jpeg .js .css)
13
+
14
+ asset_prefix = Middleman::Base.asset_host.call(original_output)
15
+
16
+ File.join(asset_prefix, original_output)
17
+ end
23
18
  end
24
19
  end
20
+
21
+ Middleman::Features.register :asset_host, Middleman::Features::AssetHost
@@ -1,31 +1,31 @@
1
- require "middleman/fastimage"
1
+ class Middleman::Features::AutomaticImageSizes
2
+ def initialize(app)
3
+ require "middleman/features/automatic_image_sizes/fastimage"
2
4
 
3
- class Middleman::Base
4
- alias_method :pre_automatic_image_tag, :image_tag
5
- helpers do
6
- def image_tag(path, params={})
7
- if !self.enabled?(:automatic_image_sizes)
8
- return pre_automatic_image_tag(path, params)
9
- end
10
-
11
- if (!params[:width] || !params[:height]) && !path.include?("://")
12
- params[:alt] ||= ""
13
- http_prefix = settings.http_images_path rescue settings.images_dir
5
+ Middleman::Base.send :alias_method, :pre_automatic_image_tag, :image_tag
6
+ Middleman::Base.helpers do
7
+ def image_tag(path, params={})
8
+ if (!params[:width] || !params[:height]) && !path.include?("://")
9
+ params[:alt] ||= ""
10
+ http_prefix = settings.http_images_path rescue settings.images_dir
14
11
 
15
- begin
16
- real_path = File.join(settings.public, settings.images_dir, path)
17
- if File.exists? real_path
18
- dimensions = Middleman::FastImage.size(real_path, :raise_on_failure => true)
19
- params[:width] ||= dimensions[0]
20
- params[:height] ||= dimensions[1]
12
+ begin
13
+ real_path = File.join(settings.public, settings.images_dir, path)
14
+ if File.exists? real_path
15
+ dimensions = Middleman::FastImage.size(real_path, :raise_on_failure => true)
16
+ params[:width] ||= dimensions[0]
17
+ params[:height] ||= dimensions[1]
18
+ end
19
+ rescue
21
20
  end
22
- rescue
23
- end
24
21
 
25
- capture_haml { haml_tag(:img, params.merge(:src => asset_url(path, http_prefix))) }
26
- else
27
- pre_automatic_image_tag(path, params)
22
+ capture_haml { haml_tag(:img, params.merge(:src => asset_url(path, http_prefix))) }
23
+ else
24
+ pre_automatic_image_tag(path, params)
25
+ end
28
26
  end
29
27
  end
30
28
  end
31
- end
29
+ end
30
+
31
+ Middleman::Features.register :automatic_image_sizes, Middleman::Features::AutomaticImageSizes
@@ -1,50 +1,43 @@
1
- class Middleman::Base
2
- after_feature_init do
3
- ::Compass.configuration do |config|
4
- if self.enabled?(:cache_buster)
1
+ class Middleman::Features::CacheBuster
2
+ def initialize(app)
3
+ Middleman::Assets.register :cache_buster do |path, prefix, request|
4
+ http_path = Middleman::Assets.before(:cache_buster, path, prefix, request)
5
+
6
+ if http_path.include?("://") || !%w(.css .png .jpg .js .gif).include?(File.extname(http_path))
7
+ http_path
8
+ else
9
+ begin
10
+ prefix = Middleman::Base.images_dir if prefix == Middleman::Base.http_images_path
11
+ rescue
12
+ end
13
+
14
+ real_path_static = File.join(Middleman::Base.public, prefix, path)
15
+
16
+ if File.readable?(real_path_static)
17
+ http_path << "?" + File.mtime(real_path_static).strftime("%s")
18
+ elsif Middleman::Base.environment == "build"
19
+ real_path_dynamic = File.join(Middleman::Base.root, Middleman::Base.build_dir, prefix, path)
20
+ http_path << "?" + File.mtime(real_path_dynamic).strftime("%s") if File.readable?(real_path_dynamic)
21
+ end
22
+
23
+ http_path
24
+ end
25
+ end
26
+
27
+ Middleman::Base.after_feature_init do
28
+ ::Compass.configuration do |config|
5
29
  config.asset_cache_buster do |path, real_path|
6
30
  real_path = real_path.path if real_path.is_a? File
7
- real_path = real_path.gsub(File.join(self.root, self.build_dir), self.public)
31
+ real_path = real_path.gsub(File.join(Middleman::Base.root, Middleman::Base.build_dir), Middleman::Base.public)
8
32
  if File.readable?(real_path)
9
33
  File.mtime(real_path).strftime("%s")
10
34
  else
11
35
  $stderr.puts "WARNING: '#{File.basename(path)}' was not found (or cannot be read) in #{File.dirname(real_path)}"
12
36
  end
13
37
  end
14
- else
15
- config.asset_cache_buster { false }
16
38
  end
17
39
  end
18
-
19
- ::Compass.configure_sass_plugin!
20
40
  end
21
41
  end
22
-
23
- class << Middleman::Base
24
- alias_method :pre_cache_buster_asset_url, :asset_url
25
- def asset_url(path, prefix="", request=nil)
26
- http_path = pre_cache_buster_asset_url(path, prefix, request)
27
-
28
- return http_path unless self.enabled?(:cache_buster)
29
-
30
- if http_path.include?("://") || !%w(.css .png .jpg .js .gif).include?(File.extname(http_path))
31
- http_path
32
- else
33
- begin
34
- prefix = self.images_dir if prefix == self.http_images_path
35
- rescue
36
- end
37
-
38
- real_path_static = File.join(self.public, prefix, path)
39
-
40
- if File.readable?(real_path_static)
41
- http_path << "?" + File.mtime(real_path_static).strftime("%s")
42
- elsif Middleman::Base.environment == "build"
43
- real_path_dynamic = File.join(self.root, self.build_dir, prefix, path)
44
- http_path << "?" + File.mtime(real_path_dynamic).strftime("%s") if File.readable?(real_path_dynamic)
45
- end
46
-
47
- http_path
48
- end
49
- end
50
- end
42
+
43
+ Middleman::Features.register :cache_buster, Middleman::Features::CacheBuster
@@ -1,15 +1,9 @@
1
- module Middleman
2
- class Base
3
- def self.asset_url(path, prefix="", request=nil)
4
- path.include?("://") ? path : File.join(self.http_prefix || "/", prefix, path)
5
- end
1
+ class Middleman::Features::DefaultHelpers
2
+ def initialize(app)
3
+ Middleman::Base.helpers Helpers
6
4
  end
7
5
 
8
6
  module Helpers
9
- def haml_partial(name, options = {})
10
- haml name.to_sym, options.merge(:layout => false)
11
- end
12
-
13
7
  def auto_stylesheet_link_tag(separator="/")
14
8
  path = request.path_info.dup
15
9
  path << self.class.index_file if path.match(%r{/$})
@@ -19,8 +13,9 @@ module Middleman
19
13
 
20
14
  css_file = File.join(self.class.public, self.class.css_dir, "#{path}.css")
21
15
  sass_file = File.join(self.class.views, self.class.css_dir, "#{path}.css.sass")
16
+ scss_file = File.join(self.class.views, self.class.css_dir, "#{path}.css.scss")
22
17
 
23
- if File.exists?(css_file) || File.exists?(sass_file)
18
+ if File.exists?(css_file) || File.exists?(sass_file) || File.exists?(scss_file)
24
19
  stylesheet_link_tag "#{path}.css"
25
20
  end
26
21
  end
@@ -38,7 +33,7 @@ module Middleman
38
33
  end
39
34
 
40
35
  def asset_url(path, prefix="")
41
- self.class.asset_url(path, prefix, request)
36
+ Middleman::Assets.get_url(path, prefix, request)
42
37
  end
43
38
 
44
39
  def link_to(title, url="#", params={})
@@ -69,3 +64,5 @@ module Middleman
69
64
  end
70
65
  end
71
66
  end
67
+
68
+ Middleman::Features.register :default_helpers, Middleman::Features::DefaultHelpers, { :auto_enable => true }
@@ -0,0 +1,19 @@
1
+ class Middleman::Features::LiveReload
2
+ def initialize(app)
3
+ return unless Middleman::Base.environment == :development
4
+
5
+ begin
6
+ require 'livereload'
7
+ rescue LoadError
8
+ puts "Livereload not available. Install it with: gem install livereload"
9
+ end
10
+
11
+ new_config = ::LiveReload::Config.new do |config|
12
+ config.exts = %w(haml sass scss coffee less builder)
13
+ end
14
+
15
+ ::LiveReload.run [Middleman::Base.public, Middleman::Base.views], new_config
16
+ end
17
+ end
18
+
19
+ Middleman::Features.register :livereload, Middleman::Features::LiveReload
@@ -0,0 +1,9 @@
1
+ class Middleman::Features::MinifyCSS
2
+ def initialize(app)
3
+ Middleman::Base.after_feature_init do
4
+ ::Compass.configuration.output_style = :compressed
5
+ end
6
+ end
7
+ end
8
+
9
+ Middleman::Features.register :minify_css, Middleman::Features::MinifyCSS
@@ -1,22 +1,20 @@
1
- module Middleman
2
- module Minified
1
+ class Middleman::Features::MinifyJavascript
2
+ def initialize(app)
3
+ Haml::Javascript.send :include, ::Haml::Filters::Base
4
+
5
+ require "middleman/features/minify_javascript/rack"
6
+ app.use Middleman::Rack::MinifyJavascript
7
+ end
8
+
9
+ module Haml
3
10
  module Javascript
4
- include ::Haml::Filters::Base
5
11
  def render_with_options(text, options)
6
- if Middleman::Base.respond_to?(:minify_javascript?) && Middleman::Base.minify_javascript?
7
- compressor = ::YUI::JavaScriptCompressor.new(:munge => true)
8
- data = compressor.compress(text)
9
- %Q{<script type=#{options[:attr_wrapper]}text/javascript#{options[:attr_wrapper]}>#{data.chomp}</script>}
10
- else
11
- <<END
12
- <script type=#{options[:attr_wrapper]}text/javascript#{options[:attr_wrapper]}>
13
- //<![CDATA[
14
- #{text.rstrip.gsub("\n", "\n ")}
15
- //]]>
16
- </script>
17
- END
18
- end
12
+ compressor = ::YUI::JavaScriptCompressor.new(:munge => true)
13
+ data = compressor.compress(text)
14
+ %Q{<script type=#{options[:attr_wrapper]}text/javascript#{options[:attr_wrapper]}>#{data.chomp}</script>}
19
15
  end
20
16
  end
21
17
  end
22
- end
18
+ end
19
+
20
+ Middleman::Features.register :minify_javascript, Middleman::Features::MinifyJavascript
@@ -0,0 +1,31 @@
1
+ begin
2
+ require "yui/compressor"
3
+ rescue LoadError
4
+ puts "YUI-Compressor not available. Install it with: gem install yui-compressor"
5
+ end
6
+
7
+ module Middleman
8
+ module Rack
9
+
10
+ class MinifyJavascript
11
+ def initialize(app, options={})
12
+ @app = app
13
+ end
14
+
15
+ def call(env)
16
+ status, headers, response = @app.call(env)
17
+
18
+ if env["PATH_INFO"].match(/\.js$/)
19
+ compressor = ::YUI::JavaScriptCompressor.new(:munge => true)
20
+
21
+ uncompressed_source = response.is_a?(::Rack::File) ? File.read(response.path) : response
22
+ response = compressor.compress(uncompressed_source)
23
+ headers["Content-Length"] = ::Rack::Utils.bytesize(response).to_s
24
+ end
25
+
26
+ [status, headers, response]
27
+ end
28
+ end
29
+
30
+ end
31
+ end
@@ -1,46 +1,35 @@
1
- class Middleman::Base
2
- after_feature_init do
3
- ::Compass.configuration do |config|
4
- config.relative_assets = Proc.new do
5
- Middleman::Base.enabled?(:relative_assets)
1
+ class Middleman::Features::RelativeAssets
2
+ def initialize(app)
3
+ ::Compass.configuration.relative_assets = true
4
+
5
+ Middleman::Assets.register :relative_assets do |path, prefix, request|
6
+ begin
7
+ prefix = Middleman::Base.images_dir if prefix == Middleman::Base.http_images_path
8
+ rescue
6
9
  end
7
- end
8
-
9
- ::Compass.configure_sass_plugin!
10
- end
11
- end
12
-
13
- class << Middleman::Base
14
- alias_method :pre_relative_asset_url, :asset_url
15
- def asset_url(path, prefix="", request=nil)
16
- if !self.enabled?(:relative_assets)
17
- return pre_relative_asset_url(path, prefix, request)
18
- end
19
-
20
- begin
21
- prefix = self.images_dir if prefix == self.http_images_path
22
- rescue
23
- end
24
10
 
25
- if path.include?("://")
26
- pre_relative_asset_url(path, prefix, request)
27
- elsif path[0,1] == "/"
28
- path
29
- else
30
- path = File.join(prefix, path) if prefix.length > 0
31
- request_path = request.path_info.dup
32
- request_path << self.index_file if path.match(%r{/$})
33
- request_path.gsub!(%r{^/}, '')
34
- parts = request_path.split('/')
35
-
36
- if parts.length > 1
37
- arry = []
38
- (parts.length - 1).times { arry << ".." }
39
- arry << path
40
- File.join(*arry)
41
- else
11
+ if path.include?("://")
12
+ Middleman::Assets.before(:relative_assets, path, prefix, request)
13
+ elsif path[0,1] == "/"
42
14
  path
15
+ else
16
+ path = File.join(prefix, path) if prefix.length > 0
17
+ request_path = request.path_info.dup
18
+ request_path << Middleman::Base.index_file if path.match(%r{/$})
19
+ request_path.gsub!(%r{^/}, '')
20
+ parts = request_path.split('/')
21
+
22
+ if parts.length > 1
23
+ arry = []
24
+ (parts.length - 1).times { arry << ".." }
25
+ arry << path
26
+ File.join(*arry)
27
+ else
28
+ path
29
+ end
43
30
  end
44
31
  end
45
32
  end
46
- end
33
+ end
34
+
35
+ Middleman::Features.register :relative_assets, Middleman::Features::RelativeAssets
@@ -1,92 +1,91 @@
1
- begin
2
- require 'slickmap'
3
- ::Compass.configure_sass_plugin!
4
- rescue LoadError
5
- puts "Slickmap not available. Install it with: gem install compass-slickmap"
6
- end
1
+ Entry = Struct.new(:dir, :children)
7
2
 
8
- if Middleman::Base.environment == "build"
9
- Middleman::Builder.template :slickmap, "sitemap.html", "sitemap.html"
10
- end
3
+ class Middleman::Features::Slickmap
4
+ def initialize(app)
5
+ require 'slickmap'
11
6
 
12
- Entry = Struct.new(:dir, :children)
7
+ if Middleman::Base.environment == "build"
8
+ Middleman::Builder.template :slickmap, "sitemap.html", "sitemap.html"
9
+ end
13
10
 
14
- class Middleman::Base
15
- def build_sitemap(&block)
16
- @@utility = []
17
- [recurse_sitemap(Middleman::Base.views, &block), @@utility]
18
- end
19
-
20
- def recurse_sitemap(path, &block)
21
- bad_ext = path.split('.html')[1]
22
- path = path.gsub(bad_ext, '') if bad_ext
23
- entry = Entry.new(path, [])
11
+ def build_sitemap(&block)
12
+ @@utility = []
13
+ [recurse_sitemap(Middleman::Base.views, &block), @@utility]
14
+ end
24
15
 
25
- #no "." or ".." dirs
26
- Dir[File.join(path, "*")].each do |e|
27
- next if !File.directory?(e) && !e.include?(".html")
28
- if File.directory?(e)
29
- entry.children << recurse_sitemap(e, &block)
30
- elsif block_given?
31
- how_to_handle = block.call(e)
32
- if how_to_handle == :valid
16
+ def recurse_sitemap(path, &block)
17
+ bad_ext = path.split('.html')[1]
18
+ path = path.gsub(bad_ext, '') if bad_ext
19
+ entry = Entry.new(path, [])
20
+
21
+ #no "." or ".." dirs
22
+ Dir[File.join(path, "*")].each do |e|
23
+ next if !File.directory?(e) && !e.include?(".html")
24
+ if File.directory?(e)
33
25
  entry.children << recurse_sitemap(e, &block)
34
- elsif how_to_handle == :utility
35
- bad_ext = e.split('.html')[1]
36
- e = e.gsub(bad_ext, '') if bad_ext
37
- @@utility << e.gsub(Middleman::Base.views + "/", '')
26
+ elsif block_given?
27
+ how_to_handle = block.call(e)
28
+ if how_to_handle == :valid
29
+ entry.children << recurse_sitemap(e, &block)
30
+ elsif how_to_handle == :utility
31
+ bad_ext = e.split('.html')[1]
32
+ e = e.gsub(bad_ext, '') if bad_ext
33
+ @@utility << e.gsub(Middleman::Base.views + "/", '')
34
+ end
38
35
  end
39
36
  end
40
- end
41
37
 
42
- entry
43
- end
44
-
45
- helpers do
46
- def sitemap_node(n, first=false)
47
- if n.children.length < 1
48
- if !first && File.extname(n.dir).length > 0
49
- haml_tag :li do
50
- path = n.dir.gsub(self.class.views, '')
51
- haml_concat link_to(File.basename(path), path)
52
- end
53
- end
54
- else
55
- haml_tag(:li, :id => first ? "home" : nil) do
56
- if first
57
- haml_concat link_to("Homepage", "/" + self.class.index_file)
58
- else
59
- # we are a dir
60
- index = n.children.find { |c| c.dir.include?(self.class.index_file) }
61
- haml_concat link_to(index.dir.gsub(self.class.views + "/", '').gsub("/" + File.basename(index.dir), '').capitalize, index.dir.gsub(self.class.views, ''))
38
+ entry
39
+ end
40
+
41
+ Middleman::Base.helpers do
42
+ def sitemap_node(n, first=false)
43
+ if n.children.length < 1
44
+ if !first && File.extname(n.dir).length > 0
45
+ haml_tag :li do
46
+ path = n.dir.gsub(self.class.views, '')
47
+ haml_concat link_to(File.basename(path), path)
48
+ end
62
49
  end
63
-
64
- other_children = n.children.select { |c| !c.dir.include?(self.class.index_file) }
65
- if other_children.length > 0
50
+ else
51
+ haml_tag(:li, :id => first ? "home" : nil) do
66
52
  if first
67
- other_children.each { |i| sitemap_node(i) }
53
+ haml_concat link_to("Homepage", "/" + self.class.index_file)
68
54
  else
69
- haml_tag :ul do
55
+ # we are a dir
56
+ index = n.children.find { |c| c.dir.include?(self.class.index_file) }
57
+ haml_concat link_to(index.dir.gsub(self.class.views + "/", '').gsub("/" + File.basename(index.dir), '').capitalize, index.dir.gsub(self.class.views, ''))
58
+ end
59
+
60
+ other_children = n.children.select { |c| !c.dir.include?(self.class.index_file) }
61
+ if other_children.length > 0
62
+ if first
70
63
  other_children.each { |i| sitemap_node(i) }
64
+ else
65
+ haml_tag :ul do
66
+ other_children.each { |i| sitemap_node(i) }
67
+ end
71
68
  end
72
69
  end
73
- end
74
- end
70
+ end
71
+ end
75
72
  end
76
73
  end
77
- end
78
-
79
- get '/sitemap.html' do
80
- # Return :utility to put it util top menu. False to ignore
81
- @tree, @utility = build_sitemap do |file_name|
82
- :valid
74
+
75
+ Middleman::Base.get '/sitemap.html' do
76
+ # Return :utility to put it util top menu. False to ignore
77
+ @tree, @utility = build_sitemap do |file_name|
78
+ :valid
79
+ end
80
+ haml :sitemap, :layout => false
83
81
  end
84
- haml :sitemap, :layout => false
85
- end
86
82
 
87
- use_in_file_templates!
83
+ Middleman::Base.use_in_file_templates!
84
+ end
88
85
  end
89
86
 
87
+ Middleman::Features.register :slickmap, Middleman::Features::Slickmap
88
+
90
89
  __END__
91
90
 
92
91
  @@ sitemap
@@ -97,7 +96,7 @@ __END__
97
96
  %title Sitemap
98
97
  %style{ :type => "text/css" }
99
98
  :sass
100
- @import slickmap.sass
99
+ @import "slickmap"
101
100
  +slickmap
102
101
  :javascript
103
102
  window.onload = function() {