module Innate
module Helper
module Link
def self.included(into)
into.extend(self)
end
# Provide the path to given Node and actions.
# Escapes GET parameters.
#
# Usage, mapping is Pages => '/', Users => '/users':
#
# Pages.r # => URI('/')
# Pages.r(:foo) # => URI('/foo')
# Pages.r(:foo, :bar) # => URI('/foo/bar')
# Pages.r(:foo, :a => :b) # => URI('/foo?a=b')
# Pages.r(:foo, :bar, :a => :b) # => URI('/foo/bar?a=b')
#
# Users.r # => URI('/users/')
# Users.r(:foo) # => URI('/users/foo')
# Users.r(:foo, :bar) # => URI('/users/foo/bar')
# Users.r(:foo, :a => :b) # => URI('/users/foo?a=b')
# Users.r(:foo, :bar, :a => :b) # => URI('/users/foo/bar?a=b')
#
# @return [URI] to the location
def route(name = '/', *args)
hash = {}
hashes, names = args.partition{|arg| arg.respond_to?(:merge!) }
hashes.each{|to_merge| hash.merge!(to_merge) }
name = name.to_s.gsub(/__/, '/')
location = route_location(self)
front = Array[location, name, *names.map{|element|
Rack::Utils.escape(element) }].join('/').squeeze('/')
return URI(front) if hash.empty?
query = Rack::Utils.build_query(hash)
URI("#{front}?#{query}")
end
alias r route
def route_location(klass)
prefix = Innate.options.prefix
location = Innate.to(klass) || Innate.to(klass.class)
[prefix, location].join('/')
end
# Create a route to the currently active Node.
#
# This method is mostly here in case you include this helper elsewhere
# and don't want (or can't) type SomeNode.r all the time.
#
# The usage is identical with {route}.
#
# @param [#to_s] name
# @return [URI] to the location
# @see Ramaze::Helper::Link#route
# @author manveru
def route_self(name = '/', *args)
Current.action.node.route(name, *args)
end
alias rs route_self
# Create a link tag
#
# Usage, given Wiki is mapped to `/wiki`:
#
# Wiki.a(:home) # => 'home'
# Wiki.a('home', :home) # => 'home'
# Wiki.a('home', :/) # => 'home'
# Wiki.a('foo', :/, :foo => :bar) # => 'foo'
# Wiki.a('example', 'http://example.com')
# # => 'example'
#
# @return [String]
def anchor(text, *args)
case first = (args.first || text)
when URI
href = first.to_s
when /^\w+:\/\//
uri = URI(first)
uri.query = Rack::Utils.escape_html(uri.query)
href = uri.to_s
else
href = args.empty? ? r(text) : r(*args)
end
text = Rack::Utils.escape_html(text)
%(#{text})
end
alias a anchor
end
end
end