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"