merb-assets

Provides extra functionality related to assets:

# Assets bundling. # Assets hosts. # Helpers to add asset links to views. # Deployment-time assets processing (for instance, with YUI Compressor).

Quick overview of the API

# asset_path generates path for asset taking type and name.

# UniqueAssetPath class handles generation of paths using subdomains. # AbstractAssetBundler is the base asset bundlers class.

# auto_link generates conventional asset tags based on controller/action. # link_to creates anchor tag (a tag). # image_tag creates img tag. # escape_js escapes JavaScript. # js method translates object into JSON. # require_js is smart(-er) way to do includes just once per page no matter how many times partial use it. # require_css is like require_js but for JavaScript. # js_include_tag is used when you need to include script tag with bundling. # css_include_tag works like js_include_tag but for stylesheets. # include_required_js generates script tags for previously included files. # include_required_css generates link tags for previously included files.

# uniq_js_path generates a script tag for path with asset subdomain. # uniq_css_path generates a link tag for path with asset subdomain.

Examples

auto_link to include asset tags using convention:

We want all possible matches in the FileSys up to the action name
   Given:  controller_name = "namespace/controller"
           action_name     = "action"
If all files are present should generate link/script tags for:
   namespace.(css|js)
   namespace/controller.(css|js)
   namespace/controller/action.(css|js)

link_to and image_tag to make anchor and image tags:

image_tag('foo.gif') 
# => <img src='/images/foo.gif' />

image_tag('foo.gif', :class => 'bar') 
# => <img src='/images/foo.gif' class='bar' />

image_tag('foo.gif', :path => '/files/') 
# => <img src='/files/foo.gif' />

image_tag('http://test.com/foo.gif')
# => <img src="http://test.com/foo.gif">

image_tag('charts', :path => '/dynamic/')
or 
image_tag('/dynamic/charts')
# => <img src="/dynamic/charts">

link_to("The Merb home page", "http://www.merbivore.com/")
  # => <a href="http://www.merbivore.com/">The Merb home page</a>

link_to("The Ruby home page", "http://www.ruby-lang.org", {'class' => 'special', 'target' => 'blank'})
  # => <a href="http://www.ruby-lang.org" class="special" target="blank">The Ruby home page</a>

link_to p.title, "/blog/show/#{p.id}"
  # => <a href="/blog/show/13">The Entry Title</a>

uniq_css_tag and uniq_js_tag for paths with asset subdomains:

uniq_css_tag("my")
#=> <link href="http://assets2.my-awesome-domain.com/stylesheets/my.css" type="text/css" />

uniq_js_tag("my")
#=> <script type="text/javascript" src="http://assets2.my-awesome-domain.com/javascripts/my.js"></script>

uniq_js_path("my")
#=> "http://assets2.my-awesome-domain.com/javascripts/my.js"

uniq_js_path(["admin/secrets","home/signup"])
#=> ["http://assets2.my-awesome-domain.com/javascripts/admin/secrets.js", 
       "http://assets1.my-awesome-domain.com/javascripts/home/signup.js"]

re_js and require_css, include_required_js and include_requried_css quire assets in parts/partials just once:

In your application layout:

  js_include_tag :prototype, :lowpro, :bundle => :base

In your controller layout:

  require_js :bundle => :posts

The require_js method can be used to require any JavaScript file anywhere
in your templates. Regardless of how many times a single script is
included with require_js, Merb will only include it once in the header.

  # File: app/views/layouts/application.html.erb

  <html>
    <head>
      <%= include_required_js %>
      <%= include_required_css %>
    </head>
    <body>
      <%= catch_content :layout %>
    </body>
  </html>

  # File: app/views/whatever/_part1.herb

  <% require_js  'this' -%>
  <% require_css 'that', 'another_one' -%>

  # File: app/views/whatever/_part2.herb

  <% require_js 'this', 'something_else' -%>
  <% require_css 'that' -%>

  # File: app/views/whatever/index.herb

  <%= partial(:part1) %>
  <%= partial(:part2) %>

  # Will generate the following in the final page...
  <html>
    <head>
      <script src="/javascripts/this.js" type="text/javascript"></script>
      <script src="/javascripts/something_else.js" type="text/javascript"></script>
      <link href="/stylesheets/that.css" media="all" rel="Stylesheet" type="text/css"/>
      <link href="/stylesheets/another_one.css" media="all" rel="Stylesheet" type="text/css"/>
    </head>
    .
    .
    .
  </html>		

  # my_action.herb has a call to require_css 'style'
  # File: layout/application.html.erb
  include_required_css
  # => <link href="/stylesheets/style.css" media="all" rel="Stylesheet" type="text/css"/>

  # my_action.herb has a call to require_css 'style', 'ie-specific'
  # File: layout/application.html.erb
  include_required_css
  # => <link href="/stylesheets/style.css" media="all" rel="Stylesheet" type="text/css"/>
  #    <link href="/stylesheets/ie-specific.css" media="all" rel="Stylesheet" type="text/css"/>

  # my_action.herb has a call to require_js 'jquery'
  # File: layout/application.html.erb
  include_required_js
  # => <script src="/javascripts/jquery.js" type="text/javascript"></script>

  # my_action.herb has a call to require_js 'jquery', 'effects', 'validation'
  # File: layout/application.html.erb
  include_required_js
  # => <script src="/javascripts/jquery.js" type="text/javascript"></script>
  #    <script src="/javascripts/effects.js" type="text/javascript"></script>
  #    <script src="/javascripts/validation.js" type="text/javascript"></script>

  <% require_css('style') %>
  # A subsequent call to include_required_css will render...
  # => <link href="/stylesheets/style.css" media="all" rel="Stylesheet" type="text/css"/>

  <% require_css('style', 'ie-specific') %>
  # A subsequent call to include_required_css will render...
  # => <link href="/stylesheets/style.css" media="all" rel="Stylesheet" type="text/css"/>
  #    <link href="/stylesheets/ie-specific.css" media="all" rel="Stylesheet" type="text/css"/>

  <% require_js 'jquery' %>
  # A subsequent call to include_required_js will render...
  # => <script src="/javascripts/jquery.js" type="text/javascript"></script>

  <% require_js 'jquery', 'effects' %>
  # A subsequent call to include_required_js will render...
  # => <script src="/javascripts/jquery.js" type="text/javascript"></script>
  #    <script src="/javascripts/effects.js" type="text/javascript"></script>

css_include_tag and js_include_tag that do not use asset subdomains:

 css_include_tag 'style'
 # => <link href="/stylesheets/style.css" media="all" rel="Stylesheet" type="text/css" charset="utf-8" />

 css_include_tag 'style.css', 'layout'
 # => <link href="/stylesheets/style.css" media="all" rel="Stylesheet" type="text/css" charset="utf-8" />
 #    <link href="/stylesheets/layout.css" media="all" rel="Stylesheet" type="text/css" charset="utf-8" />

 css_include_tag :menu
 # => <link href="/stylesheets/menu.css" media="all" rel="Stylesheet" type="text/css" charset="utf-8" />

 css_include_tag :style, :screen
 # => <link href="/stylesheets/style.css" media="all" rel="Stylesheet" type="text/css" charset="utf-8" />
 #    <link href="/stylesheets/screen.css" media="all" rel="Stylesheet" type="text/css" charset="utf-8" />

css_include_tag :style, :media => :print
# => <link href="/stylesheets/style.css" media="print" rel="Stylesheet" type="text/css" charset="utf-8" />

css_include_tag :style, :charset => 'iso-8859-1'
# => <link href="/stylesheets/style.css" media="print" rel="Stylesheet" type="text/css" charset="iso-8859-1" />

 js_include_tag 'jquery'
 # => <script src="/javascripts/jquery.js" type="text/javascript"></script>

 js_include_tag 'moofx.js', 'upload'
 # => <script src="/javascripts/moofx.js" type="text/javascript"></script>
 #    <script src="/javascripts/upload.js" type="text/javascript"></script>

 js_include_tag :effects
 # => <script src="/javascripts/effects.js" type="text/javascript"></script>

 js_include_tag :jquery, :validation
 # => <script src="/javascripts/jquery.js" type="text/javascript"></script>
 #    <script src="/javascripts/validation.js" type="text/javascript"></script>

Utility methods examples

uniq_css_path("my")
#=> "http://assets2.my-awesome-domain.com/stylesheets/my.css"

uniq_css_path(["admin/secrets","home/signup"])
#=> ["http://assets2.my-awesome-domain.com/stylesheets/admin/secrets.css", 
       "http://assets1.my-awesome-domain.com/stylesheets/home/signup.css"]

uniq_path("/javascripts/my.js","/javascripts/my.css")
#=> ["http://assets2.my-awesome-domain.com/javascripts/my.js", "http://assets1.my-awesome-domain.com/javascripts/my.css"]

uniq_path(["/javascripts/my.js","/stylesheets/my.css"])
#=> ["http://assets2.my-awesome-domain.com/javascripts/my.js", "http://assets1.my-awesome-domain.com/stylesheets/my.css"]

uniq_path(%w(/javascripts/my.js /stylesheets/my.css))
#=> ["http://assets2.my-awesome-domain.com/javascripts/my.js", "http://assets1.my-awesome-domain.com/stylesheets/my.css"]

uniq_path('/stylesheets/somearbitrary.css')
#=> "http://assets3.my-awesome-domain.com/stylesheets/somearbitrary.css"

uniq_path('/images/hostsexypicture.jpg')
#=>"http://assets1.my-awesome-domain.com/images/hostsexypicture.jpg"