module Erector
module Convenience
# Render (like to_html) but adding newlines and indentation.
# You may just want to call to_html(:prettyprint => true)
# so you can pass in other rendering options as well.
def to_pretty(options = {})
emit(options.merge(:prettyprint => true))
end
# Render (like to_html) but stripping all tags and inserting some
# appropriate formatting. Currently we format p, br, ol, ul, and li
# tags.
def to_text(options = {})
# TODO: make text output a first class rendering strategy, like HTML is now,
# so we can do things like nested lists and numbered lists
html = to_html(options.merge(:prettyprint => false))
html.gsub!(/^
]*>/m, '')
html.gsub!(/(<(ul|ol)>)?
/, "\n* ")
html.gsub!(/<(\/?(ul|ol|p|br))[^>]*( \/)?>/, "\n")
CGI.unescapeHTML(html.gsub(/<[^>]*>/, ''))
end
# Emits the result of joining the elements in array with the separator.
# The array elements and separator can be Erector::Widget objects,
# which are rendered, or strings, which are html-escaped and output.
def join(array, separator)
first = true
array.each do |item|
if !first
if separator.is_a? Widget
widget separator
else
text separator
end
end
first = false
if item.is_a? Widget
widget item
else
text item
end
end
end
# Convenience method to emit a css file link, which looks like this:
#
# The parameter is the full contents of the href attribute, including any ".css" extension.
#
# If you want to emit raw CSS inline, use the #style method instead.
def css(href, options = {})
link({:rel => 'stylesheet', :type => 'text/css', :href => href}.merge(options))
end
# Convenience method to emit an anchor tag whose href and text are the same,
# e.g. http://example.com
def url(href, options = {})
a href, ({:href => href}.merge(options))
end
# Emits a javascript block inside a +script+ tag, wrapped in CDATA
# doohickeys like all the cool JS kids do.
def javascript(value = nil, attributes = {})
if value.is_a?(Hash)
attributes = value
value = nil
elsif block_given? && value
raise ArgumentError, "You can't pass both a block and a value to javascript -- please choose one."
end
script(attributes.merge(:type => "text/javascript")) do
# Shouldn't this be a "cdata" HtmlPart?
# (maybe, but the syntax is specific to javascript; it isn't
# really a generic XML CDATA section. Specifically,
# ]]> within value is not treated as ending the
# CDATA section by Firefox2 when parsing text/html,
# although I guess we could refuse to generate ]]>
# there, for the benefit of XML/XHTML parsers).
output << raw("\n// ")
output.append_newline # this forces a newline even if we're not in pretty mode
end
output << raw("\n")
end
# makes a unique id based on the widget's class name and object id
# that you can use as the HTML id of an emitted element
def dom_id
"#{self.class.name.gsub(/:+/,"_")}_#{self.object_id}"
end
end
end