From 2a147d85f9561e10f1860620a9c8ce26e65ea230 Mon Sep 17 00:00:00 2001 From: Nando Vieira Date: Thu, 26 Aug 2010 09:53:11 -0300 Subject: [PATCH] Return safe html when String#html_safe is available. --- README.rdoc | 13 +++++++++++++ lib/breadcrumbs.rb | 10 ++++++---- test/breadcrumbs_test.rb | 7 +++++++ test/test_helper.rb | 2 ++ 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/README.rdoc b/README.rdoc index 1ba062e..8706cea 100644 --- a/README.rdoc +++ b/README.rdoc @@ -52,6 +52,19 @@ You can set your own separator: You are here: <%= breadcrumbs.render(:format => :inline, :separator => '|') %>

+You can also define your own formatter. Just create a class that implements a +render+ instance +method and you're good to go. + + class Breadcrumbs::Render::Dl + def render + # return breadcrumbs wrapped in a
tag + end + end + +To use your new format, just provide the :format option. + + breadcrumbs.render(:format => :dl) + === I18n Breadcrumbs is integrated with I18n. You can set translations like: diff --git a/lib/breadcrumbs.rb b/lib/breadcrumbs.rb index 20c435a..9a39928 100644 --- a/lib/breadcrumbs.rb +++ b/lib/breadcrumbs.rb @@ -25,6 +25,8 @@ def add(text, url = nil, options = {}) items << [text.to_s, url, options] end + alias :<< :add + # Render breadcrumbs using the specified format. # Use HTML lists by default, but can be plain links. # @@ -36,7 +38,7 @@ def add(text, url = nil, options = {}) # breadcrumbs.render(:id => "breadcrumbs") # breadcrumbs.render(:class => "breadcrumbs") # - # You can define your own formatter. Just create a class that implements a +render+ instance + # You can also define your own formatter. Just create a class that implements a +render+ instance # method and you're good to go. # # class Breadcrumbs::Render::Dl @@ -54,10 +56,10 @@ def render(options = {}) klass_name = options[:format].to_s.classify klass = Breadcrumbs::Render.const_get(klass_name) - klass.new(self, options).render - end + html = klass.new(self, options).render - alias :<< :add + html.respond_to?(:html_safe) ? html.html_safe : html + end def translate(scope) # :nodoc: text = I18n.t(scope, :scope => :breadcrumbs, :raise => true) rescue nil diff --git a/test/breadcrumbs_test.rb b/test/breadcrumbs_test.rb index 9893cb8..fb8941b 100644 --- a/test/breadcrumbs_test.rb +++ b/test/breadcrumbs_test.rb @@ -6,6 +6,13 @@ def setup @inline = Breadcrumbs::Render::Inline.new(@breadcrumbs) end + def test_return_safe_html + html_mock = mock + html_mock.expects(:html_safe).once + Breadcrumbs::Render::List.any_instance.stubs(:render).returns(html_mock) + @breadcrumbs.render(:format => :list) + end + def test_add_item @breadcrumbs.add "Home" assert_equal 1, @breadcrumbs.items.count diff --git a/test/test_helper.rb b/test/test_helper.rb index 3a68959..12758a5 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,8 +1,10 @@ require "rubygems" +gem "test-unit" require "test/unit" require "cgi" require "nokogiri" require "action_controller" +require "mocha" require "breadcrumbs"