diff options
author | David Heinemeier Hansson <david@loudthinking.com> | 2008-10-13 19:52:37 +0200 |
---|---|---|
committer | David Heinemeier Hansson <david@loudthinking.com> | 2008-10-13 19:52:37 +0200 |
commit | 1abdc8752d7fbc0733da763e751a2671db42961a (patch) | |
tree | a5d14b25fde2500f79326579d82708e9224e20b8 | |
parent | 691aa20280456c332bfaaf69b58adc86fd86a2b8 (diff) | |
download | rails-1abdc8752d7fbc0733da763e751a2671db42961a.tar.gz rails-1abdc8752d7fbc0733da763e751a2671db42961a.tar.bz2 rails-1abdc8752d7fbc0733da763e751a2671db42961a.zip |
Added inline builder yield to atom_feed_helper tags where appropriate (Sam Ruby) [#8994 status:committed]
-rw-r--r-- | actionpack/CHANGELOG | 8 | ||||
-rw-r--r-- | actionpack/lib/action_view/helpers/atom_feed_helper.rb | 54 | ||||
-rw-r--r-- | actionpack/test/template/atom_feed_helper_test.rb | 30 |
3 files changed, 84 insertions, 8 deletions
diff --git a/actionpack/CHANGELOG b/actionpack/CHANGELOG index 4de93a10c4..c68bfc753c 100644 --- a/actionpack/CHANGELOG +++ b/actionpack/CHANGELOG @@ -1,5 +1,13 @@ *Edge* +* Added inline builder yield to atom_feed_helper tags where appropriate [Sam Ruby]. Example: + + entry.summary :type => 'xhtml' do |xhtml| + xhtml.p pluralize(order.line_items.count, "line item") + xhtml.p "Shipped to #{order.address}" + xhtml.p "Paid by #{order.pay_type}" + end + * Make PrototypeHelper#submit_to_remote a wrapper around PrototypeHelper#button_to_remote. [Tarmo Tänav] * Set HttpOnly for the cookie session store's cookie. #1046 diff --git a/actionpack/lib/action_view/helpers/atom_feed_helper.rb b/actionpack/lib/action_view/helpers/atom_feed_helper.rb index 8062d64924..ccb7df212a 100644 --- a/actionpack/lib/action_view/helpers/atom_feed_helper.rb +++ b/actionpack/lib/action_view/helpers/atom_feed_helper.rb @@ -75,8 +75,20 @@ module ActionView # end # end # + # The Atom spec defines five elements (content rights title subtitle + # summary) which may directly contain xhtml content if :type => 'xhtml' + # is specified as an attribute. If so, this helper will take care of + # the enclosing div and xhtml namespace declaration. Example usage: # - # atom_feed yields an AtomFeedBuilder instance. + # entry.summary :type => 'xhtml' do |xhtml| + # xhtml.p pluralize(order.line_items.count, "line item") + # xhtml.p "Shipped to #{order.address}" + # xhtml.p "Paid by #{order.pay_type}" + # end + # + # + # atom_feed yields an AtomFeedBuilder instance. Nested elements yield + # an AtomBuilder instance. def atom_feed(options = {}, &block) if options[:schema_date] options[:schema_date] = options[:schema_date].strftime("%Y-%m-%d") if options[:schema_date].respond_to?(:strftime) @@ -108,8 +120,38 @@ module ActionView end end + class AtomBuilder + def initialize(xml) + @xml = xml + end - class AtomFeedBuilder + private + # Delegate to xml builder, first wrapping the element in a xhtml + # namespaced div element if the method and arguments indicate + # that an xhtml_block? is desired. + def method_missing(method, *arguments, &block) + if xhtml_block?(method, arguments) + @xml.__send__(method, *arguments) do + @xml.div(:xmlns => 'http://www.w3.org/1999/xhtml') do |xhtml| + block.call(xhtml) + end + end + else + @xml.__send__(method, *arguments, &block) + end + end + + # True if the method name matches one of the five elements defined + # in the Atom spec as potentially containing XHTML content and + # if :type => 'xhtml' is, in fact, specified. + def xhtml_block?(method, arguments) + %w( content rights title subtitle summary ).include?(method.to_s) && + arguments.last.respond_to?(:[]) && + arguments.last[:type].to_s == 'xhtml' + end + end + + class AtomFeedBuilder < AtomBuilder def initialize(xml, view, feed_options = {}) @xml, @view, @feed_options = xml, view, feed_options end @@ -141,15 +183,11 @@ module ActionView @xml.link(:rel => 'alternate', :type => 'text/html', :href => options[:url] || @view.polymorphic_url(record)) - yield @xml + yield AtomBuilder.new(@xml) end end - - private - def method_missing(method, *arguments, &block) - @xml.__send__(method, *arguments, &block) - end end + end end end diff --git a/actionpack/test/template/atom_feed_helper_test.rb b/actionpack/test/template/atom_feed_helper_test.rb index 37632f8ed5..9247a42d33 100644 --- a/actionpack/test/template/atom_feed_helper_test.rb +++ b/actionpack/test/template/atom_feed_helper_test.rb @@ -128,6 +128,28 @@ class ScrollsController < ActionController::Base end end EOT + FEEDS["feed_with_xhtml_content"] = <<-'EOT' + atom_feed do |feed| + feed.title("My great blog!") + feed.updated((@scrolls.first.created_at)) + + for scroll in @scrolls + feed.entry(scroll) do |entry| + entry.title(scroll.title) + entry.summary(:type => 'xhtml') do |xhtml| + xhtml.p "before #{scroll.id}" + xhtml.p {xhtml << scroll.body} + xhtml.p "after #{scroll.id}" + end + entry.tag!('app:edited', Time.now) + + entry.author do |author| + author.name("DHH") + end + end + end + end + EOT def index @scrolls = [ Scroll.new(1, "1", "Hello One", "Something <i>COOL!</i>", Time.utc(2007, 12, 12, 15), Time.utc(2007, 12, 12, 15)), @@ -245,6 +267,14 @@ class AtomFeedTest < Test::Unit::TestCase end end + def test_feed_xhtml + with_restful_routing(:scrolls) do + get :index, :id => "feed_with_xhtml_content" + assert_match %r{xmlns="http://www.w3.org/1999/xhtml"}, @response.body + assert_select "summary div p", :text => "Something Boring" + assert_select "summary div p", :text => "after 2" + end + end private def with_restful_routing(resources) with_routing do |set| |