Module: Padrino::Helpers::AssetTagHelpers

Defined in:
lib/padrino-helpers/asset_tag_helpers.rb

Overview

Helpers related to producing assets (images, stylesheets, js, etc) within templates.

Constant Summary collapse

APPEND_ASSET_EXTENSIONS =
["js", "css"]
ABSOLUTE_URL_PATTERN =
%r{^(https?://)}
ASSET_FOLDERS =
{
  :js => 'javascripts',
  :css => 'stylesheets',
}

Instance Method Summary collapse

Instance Method Details

#asset_path(kind, source = nil) ⇒ String

Returns the path to the specified asset (css or javascript).

Examples:

# Generates: /javascripts/application.js?1269008689
asset_path :js, :application

# Generates: /stylesheets/application.css?1269008689
asset_path :css, :application

# Generates: /images/example.jpg?1269008689
asset_path :images, 'example.jpg'

# Generates: /uploads/file.ext?1269008689
asset_path 'uploads/file.ext'

Parameters:

  • kind (String)

    The kind of asset (i.e :images, :js, :css).

  • source (String) (defaults to: nil)

    The path to the asset (relative or absolute).

Returns:

  • (String)

    Path for the asset given the kind and source.



316
317
318
319
320
321
322
323
324
# File 'lib/padrino-helpers/asset_tag_helpers.rb', line 316

def asset_path(kind, source = nil)
  kind, source = source, kind if source.nil?
  source = asset_normalize_extension(kind, escape_link(source.to_s))
  return source if source =~ ABSOLUTE_URL_PATTERN || source =~ /^\//
  source = File.join(asset_folder_name(kind), source)
  timestamp = asset_timestamp(source)
  result_path = uri_root_path(source)
  "#{result_path}#{timestamp}"
end

#favicon_tag(source, options = {}) ⇒ String

Generates a favicon link. Looks inside images folder

Examples:

favicon_tag 'favicon.png'
favicon_tag 'icons/favicon.png'
# or override some options
favicon_tag 'favicon.png', :type => 'image/ico'

Parameters:

  • source (String)

    The source image path for the favicon link tag.

  • options (Hash) (defaults to: {})

    The html options for the favicon link tag.

Returns:

  • (String)

    The favicon link html tag with specified options.



191
192
193
194
195
# File 'lib/padrino-helpers/asset_tag_helpers.rb', line 191

def favicon_tag(source, options={})
  type = File.extname(source).sub('.','')
  options = { :href => image_path(source), :rel => 'icon', :type => "image/#{type}" }.update(options)
  tag(:link, options)
end

#feed_tag(mime, url, options = {}) ⇒ String

Creates a link tag that browsers and news readers can use to auto-detect an RSS or ATOM feed.

@param options

The options for the feed tag.

Examples:

feed_tag :atom, url(:blog, :posts, :format => :atom), :title => "ATOM"
# Generates: <link type="application/atom+xml" rel="alternate" href="/blog/posts.atom" title="ATOM" />
feed_tag :rss, url(:blog, :posts, :format => :rss)
# Generates: <link type="application/rss+xml" rel="alternate" href="/blog/posts.rss" title="rss" />

Parameters:

  • mime (Symbol)

    The mime type of the feed (i.e :atom or :rss).

  • url (String)

    The url for the feed tag to reference.

  • options (Hash) (defaults to: {})

    a customizable set of options

Options Hash (options):

  • :rel (String) — default: "alternate"

    Specify the relation of this link.

  • :type (String)

    Override the auto-generated mime type.

  • :title (String)

    Specify the title of the link, defaults to the type.

Returns:

  • (String)

    Feed link html tag with specified options.



117
118
119
120
# File 'lib/padrino-helpers/asset_tag_helpers.rb', line 117

def feed_tag(mime, url, options={})
  full_mime = (mime == :atom) ? 'application/atom+xml' : 'application/rss+xml'
  tag(:link, { :rel => 'alternate', :type => full_mime, :title => mime, :href => url }.update(options))
end

#flash_tag(*args) ⇒ String

Creates a div to display the flash of given type if it exists.

Examples:

flash_tag(:notice, :id => 'flash-notice')
# Generates: <div class="notice" id="flash-notice">flash-notice</div>
flash_tag(:error, :success)
# Generates: <div class="error">flash-error</div>
# <div class="success">flash-success</div>

Parameters:

  • kind (Symbol)

    The type of flash to display in the tag.

  • options (Hash)

    The html options for this section. use :bootstrap => true to support Twitter’s bootstrap dismiss alert button.

Returns:

  • (String)

    Flash tag html with specified options.



32
33
34
35
36
37
38
39
40
41
# File 'lib/padrino-helpers/asset_tag_helpers.rb', line 32

def flash_tag(*args)
  options = args.last.is_a?(Hash) ? args.pop : {}
  bootstrap = options.delete(:bootstrap) if options[:bootstrap]
  args.inject(SafeBuffer.new) do |html,kind|
    next html unless flash[kind]
    flash_text = SafeBuffer.new << flash[kind]
    flash_text << (:button, '&times;'.html_safe, {:type => :button, :class => :close, :'data-dismiss' => :alert}) if bootstrap
    html << (:div, flash_text, { :class => kind }.update(options))
  end
end

#image_alt(src) ⇒ String

Returns a string suitable for an alt attribute of img element.

Parameters:

  • src (String)

    The source path for the image tag.

Returns:

  • (String)

    The alt attribute value.



223
224
225
# File 'lib/padrino-helpers/asset_tag_helpers.rb', line 223

def image_alt(src)
  File.basename(src, '.*').sub(/-[[:xdigit:]]{32,64}\z/, '').tr('-_', ' ').capitalize
end

#image_path(src) ⇒ String

Returns the path to the image, either relative or absolute. We search it in your appname.public_folder like app/public/images for inclusion. You can provide also a full path.

Examples:

# Generates: /images/foo.jpg?1269008689
image_path("foo.jpg")

Parameters:

  • src (String)

    The path to the image file (relative or absolute).

Returns:

  • (String)

    Path to an image given the kind and source.



289
290
291
# File 'lib/padrino-helpers/asset_tag_helpers.rb', line 289

def image_path(src)
  asset_path(:images, src)
end

#image_tag(url, options = {}) ⇒ String

Creates an image element with given url and options.

Examples:

image_tag('icons/avatar.png')

Parameters:

  • url (String)

    The source path for the image tag.

  • options (Hash) (defaults to: {})

    The html options for the image tag.

Returns:

  • (String)

    Image html tag with url and specified options.



210
211
212
213
214
# File 'lib/padrino-helpers/asset_tag_helpers.rb', line 210

def image_tag(url, options={})
  options = { :src => image_path(url) }.update(options)
  options[:alt] ||= image_alt(url) unless url.to_s =~ /\A(?:cid|data):|\A\Z/
  tag(:img, options)
end

#javascript_include_tag(*sources, options = {}) ⇒ String

Returns a html script tag for each of the sources provided. You can pass in the filename without extension or a symbol and we search it in your appname.public_folder like app/public/javascript for inclusion. You can provide also a full path.

Examples:

javascript_include_tag 'application', :extjs

Parameters:

  • sources (Array<String>)

    Splat of js source paths

  • options (Hash) (defaults to: {})

    The html options for the script tag

Returns:

  • (String)

    Script tag for sources with specified options.



266
267
268
269
270
271
272
273
# File 'lib/padrino-helpers/asset_tag_helpers.rb', line 266

def javascript_include_tag(*sources)
  options = {
    :type => 'text/javascript'
  }.update(sources.last.is_a?(Hash) ? Utils.symbolize_keys(sources.pop) : {})
  sources.flatten.inject(SafeBuffer.new) do |all,source|
    all << (:script, nil, { :src => asset_path(:js, source) }.update(options))
  end
end

Creates a link element with given name, url and options.

Note that you can pass :if or :unless conditions, but if you provide :current as condition padrino return true/false if the request.path_info match the given url.

Examples:

link_to('click me', '/dashboard', :class => 'linky')
# Generates <a class="linky" href="/dashboard">click me</a>

link_to('click me', '/dashboard', :remote => true)
# Generates <a href="/dashboard" data-remote="true">click me</a>

link_to('click me', '/dashboard', :method => :delete)
# Generates <a href="/dashboard" data-method="delete" rel="nofollow">click me</a>

link_to('/dashboard', :class => 'blocky') { 'click me' }
# Generates <a class="blocky" href="/dashboard">click me</a>

Overloads:

  • #link_to(caption, url, options = {}) ⇒ String

    Parameters:

    • caption (String)

      The text caption.

    • url (String)

      The url href.

    • options (Hash) (defaults to: {})

      The html options.

  • #link_to(url, options = {}, &block) ⇒ String

    Parameters:

    • url (String)

      The url href.

    • options (Hash) (defaults to: {})

      The html options.

    • block (Proc)

      The link content.

Parameters:

  • options (Hash)

    a customizable set of options

Returns:

  • (String)

    Link tag html with specified options.



84
85
86
87
88
89
90
91
# File 'lib/padrino-helpers/asset_tag_helpers.rb', line 84

def link_to(*args, &block)
  options = args.last.is_a?(Hash) ? args.pop : {}
  name = block_given? ? '' : args.shift
  href = args.first
  options = { :href => href ? escape_link(href) : '#' }.update(options)
  return name unless parse_conditions(href, options)
  block_given? ? (:a, options, &block) : (:a, name, options)
end

#mail_to(email, caption = nil, mail_options = {}) ⇒ String

Creates a mail link element with given name and caption.

Examples:

mail_to "[email protected]"
# Generates: <a href="mailto:[email protected]">[email protected]</a>

mail_to "[email protected]", "My Email"
# Generates: <a href="mailto:[email protected]">My Email</a>

Parameters:

  • email (String)

    The email address for the link.

  • caption (String) (defaults to: nil)

    The caption for the link.

  • mail_options (Hash) (defaults to: {})

    The options for the mail link. Accepts html options.

Options Hash (mail_options):

  • cc (String)

    The cc recipients.

  • bcc (String)

    The bcc recipients.

  • subject (String)

    The subject line.

  • body (String)

    The email body.

Returns:

  • (String)

    Mail link html tag with specified options.



145
146
147
148
149
150
151
# File 'lib/padrino-helpers/asset_tag_helpers.rb', line 145

def mail_to(email, caption=nil, mail_options={})
  mail_options, html_options = mail_options.partition{ |key,_| [:cc, :bcc, :subject, :body].include?(key) }
  mail_query = Rack::Utils.build_query(Hash[mail_options]).gsub(/\+/, '%20').gsub('%40', '@')
  mail_href = "mailto:#{email}"
  mail_href << "?#{mail_query}" unless mail_query.empty?
  link_to((caption || email), mail_href, Hash[html_options])
end

#meta_tag(content, options = {}) ⇒ String

Creates a meta element with the content and given options.

Examples:

meta_tag "weblog,news", :name => "keywords"
# Generates: <meta name="keywords" content="weblog,news" />

meta_tag "text/html; charset=UTF-8", 'http-equiv' => "Content-Type"
# Generates: <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

Parameters:

  • content (String)

    The content for the meta tag.

  • options (Hash) (defaults to: {})

    The html options for the meta tag.

Returns:

  • (String)

    Meta html tag with specified options.



170
171
172
173
# File 'lib/padrino-helpers/asset_tag_helpers.rb', line 170

def meta_tag(content, options={})
  options = { "content" => content }.update(options)
  tag(:meta, options)
end

Returns a html link tag for each of the sources provided. You can pass in the filename without extension or a symbol and we search it in your appname.public_folder like app/public/stylesheets for inclusion. You can provide also a full path.

Examples:

stylesheet_link_tag 'style', 'application', 'layout'

Parameters:

  • sources (Array<String>)

    Splat of css source paths

  • options (Hash) (defaults to: {})

    The html options for the link tag

Returns:

  • (String)

    Stylesheet link html tag for sources with specified options.



242
243
244
245
246
247
248
249
250
# File 'lib/padrino-helpers/asset_tag_helpers.rb', line 242

def stylesheet_link_tag(*sources)
  options = {
    :rel => 'stylesheet',
    :type => 'text/css'
  }.update(sources.last.is_a?(Hash) ? Utils.symbolize_keys(sources.pop) : {})
  sources.flatten.inject(SafeBuffer.new) do |all,source|
    all << tag(:link, { :href => asset_path(:css, source) }.update(options))
  end
end