module Merb
module ViewContextMixin
def link_to(name, url='', opts={})
%{#{name}}
end
# escape text for javascript.
def escape_js(javascript)
(javascript || '').gsub('\\','\0\0').gsub(/\r\n|\n|\r/, "\\n").gsub(/["']/) { |m| "\\#{m}" }
end
# creates an tag with with an onclick containing
# a js function
# link_to_function('click me', "alert('hi!')")
def link_to_function(name, function)
%{#{name}}
end
# creates an tag
# defaults to a src path prefix of /images/
#
# image_tag('foo.gif') =>
# image_tag('foo.gif', :class => 'bar') =>
#
# you can override the default path by sending a :path parameter in the opts
#
# image_tag('foo.gif', :path => '/files/') =>
#
def image_tag(img, opts={})
opts[:path] ||= '/images/'
%{}
end
# calls .to_json on data.
# so it can be faster than escape_js
def js(data)
if data.respond_to? :to_json
data.to_json
else
data.inspect.to_json
end
end
# Helper method to cache a fragment.
#
Article list
#
# <% cache(:article_list) do %>
#
# <% @articles.each do |a| %>
#
<%= a.title %>
# <% end %>
#
# <% end %>
def cache(name, &block)
return block.call unless caching_enabled?
buffer = eval("_buf", block.binding)
if fragment = ::Merb::Caching::Fragment.get(name)
buffer.concat(fragment)
else
pos = buffer.length
block.call
::Merb::Caching::Fragment.put(name, buffer[pos..-1])
end
end
# Requiring javascripts and stylesheets:
# you can use require_js(:prototype) or require_css(:shinystyles)
# from any view or layout and the scripts will only be included once
# in the head of the final page. In the head of your layout you will
# need to add these two tags:
#
# <%= include_required_js %>
# <%= include_required_css %>
#
# --app/views/layouts/application.rhtml
#
#
#
# <%= include_required_js %>
# <%= include_required_css %>
#
#
# <%= catch_content :layout %>
#
#
#
# --app/views/whatever/index.rhtml
#
# <%= partial(:part1) %>
# <%= partial(:part2) %>
#
# --app/views/whatever/_part1.rhtml
#
# <% require_js 'this' -%>
# <% require_css 'that', 'another_one' -%>
#
# --app/views/whatever/_part2.rhtml
#
# <% require_js 'this', 'something_else' -%>
# <% require_css 'that' -%>
# require_js(:myjs) can be used to require any javascript
# file anywhere in your templates. It will only include the
# javascript tag once in the header
def require_js(*js)
@required_js ||= []
@required_js |= js
end
# require_css(:mystyles) can be used to require any javascript
# file anywhere in your templates. It will only include the
# javascript tag once in the header
def require_css(*css)
@required_css ||= []
@required_css |= css
end
# this goes in the head of your layout if you will be using
# require_js
def include_required_js
js_include_tag(*@required_js)
end
# this goes in the head of your layout if you will be using
# require_css
def include_required_css
css_link_tag(*@required_js)
end
# js_include_tag(:foo, :bar, :baz) will create a javascript
# include tag for each script in the arguments. It will append
# '.js' if it is left out of the call.
def js_include_tag(*scripts)
return nil if scripts.empty?
scripts.inject('') do |memo,script|
script = script.to_s
memo << %Q|\n|
end
end
# css_include_tag(:foo, :bar, :baz) will create a stylesheet
# link tag for each stylesheet in the arguments. It will append
# '.css' if it is left out of the call.
def css_include_tag(*scripts)
return nil if scripts.empty?
scripts.inject('') do |memo,script|
script = script.to_s
memo << %Q|\n|
end
end
end
end