class TagSearchPage < Page
attr_accessor :requested_tag
#### Tags ####
desc %{ The namespace for all tagsearch tags.}
tag 'tagsearch' do |tag|
tag.expand
end
desc %{ to show a index page, if the page was not able to find a tag, it is considered to be a index page}
tag 'tagsearch:if_index' do |tag|
if requested_tag.nil? || (requested_tag && requested_tag.blank?)
tag.expand
end
end
desc %{ resultpage, if the page got a tag, it is considered to be a result page}
tag 'tagsearch:unless_index' do |tag|
if requested_tag && ! requested_tag.blank?
tag.expand
end
end
desc %{ The namespace for all search tags.}
tag 'search' do |tag|
tag.expand
end
desc %{ Renders the passed query.}
tag 'search:query' do |tag|
CGI.escapeHTML(requested_tag)
end
desc %{ Renders the contained block if no results were returned.}
tag 'search:empty' do |tag|
if found_tags.blank?
tag.expand
end
end
desc %{ Renders the contained block if results were returned.}
tag 'search:results' do |tag|
unless found_tags.blank?
tag.expand
end
end
desc %{
Renders the contained block for each result page. The context
inside the tag refers to the found page. The optional sort_by and order attributes
specify how the results are sorted}
tag 'search:results:each' do |tag|
# Ordering in Ruby because we already fetched our resultset before
tags = found_tags
tags = tags.sort_by(&tag.attr['sort_by'].to_sym) if tag.attr['sort_by']
tags = tags.reverse if tag.attr['order'].to_s =~ /desc/i
returning String.new do |content|
tags.each do |page|
tag.locals.page = page
content << tag.expand
end
end
end
desc %{
Truncates and strips all HTML tags from the content of the contained block.
Useful for displaying a snippet of a found page. The optional `length' attribute
specifies how many characters to truncate to.}
tag 'truncate_and_strip' do |tag|
tag.attr['length'] ||= 100
length = tag.attr['length'].to_i
helper = ActionView::Base.new
helper.truncate(helper.strip_tags(tag.expand).gsub(/\s+/," "), length)
end
#### "Behavior" methods ####
def cache?
true
end
def found_tags
return @found_tags if @found_tags
return [] if requested_tag.blank?
@found_tags = Page.tagged_with(requested_tag).delete_if { |p| !p.published? }
end
def render
self.requested_tag = @request.parameters[:tag] if @request.parameters[:tag]
self.title = "#{self.title} #{requested_tag}" if requested_tag
super
end
def find_by_url(url, live = true, clean = false)
url = clean_url(url).chop # chop off trailing slash added by clean_url
if url =~ /^#{self.url}([a-zA-Z0-9,\_\-\s\/()'.&]*)\/?$/
self.requested_tag = $1
self
else
super
end
end
end