Hensel
Hensel makes it easy to build the breadcrumbs.
Especially, want to recommend for use in Sinatra and Padrino.
Installation
Add this line to your application's Gemfile:
gem 'hensel'
And then execute:
$ bundle
Or install it yourself as:
$ gem install hensel
Requirements
- MRI 2.0+
Overview
Hensel can be used easily in your web applications, and it has powerful flexibility. You can use it as helper and builder. In the next section, will explain in detail how to use them.
Usage
Configuration
require 'hensel'
Hensel.configure do |config|
# Default values
config.bootstrap = false
config.escape_html = true
config.indentation = true
config.last_item_link = false
config.richsnippet = :microdata
config.attr_wrapper = "'"
config.whitespace = " "
config.parent_element = :ul
config.before_load = nil
config.default_item_options = {}
config.parent_attributes = {}
endIf bootstrap is set to true, the parent element of breadcrumbs will contain breadcrumb as class attrbiute, and the last item will contain active as class attrbiute as well.
It will be something like below.
<ul class='breadcrumb'>
<li>
<a href='/'>
index
</a>
</li>
<li class='active'>
current
</li>
</ul>If escape_html is set to true, the text of item and all value of attributes will be escaped.
If indentation is set to true, the breadcrumbs will be indented.
If richsnippet is set to correct symbol, the breadcrumbs will follow the rules of the rich snippets that have been specified.
There is a :microdata and :rdfa, please specify nil if not required type.
It will be something like below.
<!-- microdata -->
<ul>
<li itemscope itemtype='http://data-vocabulary.org/Breadcrumb'>
<a href='/' itemprop='url'>
<span itemprop='title'>
index
</span>
</a>
</li>
<li itemscope itemtype='http://data-vocabulary.org/Breadcrumb'>
<span itemprop='title'>
current
</span>
</li>
</ul>
<!-- RDFa -->
<ul xmlns:v='http://rdf.data-vocabulary.org/#'>
<li typeof='v:Breadcrumb'>
<a href='/' rel='v:url' property="v:title">
index
</a>
</li>
<li typeof='v:Breadcrumb'>
<span property="v:title">
current
</span>
</li>
</ul>If don't have special reason, you should enable the option. Microdata and RDFa are supported by google.
If last_item_link is set to true, the link of the last item will contain a element as with other elements.
It will be something below.
<!-- If `last_item_link` is set to `true` -->
<ul class="breadcrumb">
<li>
<a href="/">
index
</a>
</li>
<li>
<a href="/foo">
foo
</a>
</li>
</ul>
<!-- If `last_item_link` is set to `false` -->
<ul class="breadcrumb">
<li>
<a href="/">
index
</a>
</li>
<li>
<span>
foo
</span>
</li>
</ul>If attr_wrapper is set to a wrapper string, all attributes will be used it as the attribute wrapper.
It will be somthing below.
<!-- If `attr_wrapper` is set to `'"'` -->
<ul class="breadcrumb">
<li>
<a href="/">
index
</a>
</li>
</ul>
<!-- If `attr_wrapper` is set to `nil` -->
<ul class=breadcrumb>
<li>
<a href=/>
index
</a>
</li>
</ul>If whitespace is set to a whitespace string, all indentation will be used it as the indentation space.
It will be somthing below.
<!-- If `whitespace` is set to `" "` -->
<ul>
<li>
<a href="/">
index
</a>
</li>
</ul>
<!-- If `attr_wrapper` is set to `" "` -->
<ul>
<li>
<a href="/">
index
</a>
</li>
</ul>If parent_element is set to a name string, it will be used as a name of the parent element.
If before_load is set to Proc, it will be evaluated within the context of Hensel::Builder.
It will be something below.
Hensel.configuration.before_load = proc { add("Home", "/") }
builder = Hensel::Builder.new
home = builder.items.first
home.text #=> "Home"
home.url #=> "/"**If Hash is set to default_item_options, all items will use it as options.
Hensel.configuration.default_item_options = { class: "tested" }
builder = Hensel::Builder.new
builder.add("Home", "/")
builder.items.first.render #=> "<li class='tested'><a href='/'>Home</a></li>"**If Hash is set to parent_attributes, the parent element will include it as attributes.
Hensel.configuration.parent_attributes = { class: "parent-tested" }
builder = Hensel::Builder.new
builder.render #=> "<ul class='parent-tested'></ul>"Builder
add(text, url, **options) -> Hensel::Builder::Item
Adds a new item to items, and returns a fresh instance of Hensel::Builder::Item built by the builder.
builder = Hensel::Builder.new
item = builder.add("home", "/")
item.text #=> "home"
item.url #=> "/"add(**parameters) -> Hensel::Builder::Item
builder = Hensel::Builder.new
item = builder.add(text: "home", url: "/")
item.text #=> "home"
item.url #=> "/"remove(text)
Removes the item from items.
builder = Hensel::Builder.new
builder.add(text: "home", url: "/")
builder.items.empty? #=> false
builder.remove("home")
builder.items.empty? #=> trueremove{|item| ... }
builder = Hensel::Builder.new
builder.add(text: "home", url: "/")
builder.items.empty? #=> false
builder.remove{|item| item.text == "home" }
builder.items.empty? #=> truerender -> String
Renders the breadcrumbs, and returns the html of breadcrumbs rendered by this method.
builder = Hensel::Builder.new
builder.add(text: "home", url: "/")
builder.render #=> "<ul> ... </ul>"render{ ... } -> String
This method is for customize breadcrumbs.
If this method has a parameter, it will be an instance of Hensel::Builder::Item.
If this method does not have parameter, the block will be evaluated as an instance of Hensel::Builder::Item.
However, if you use render with block, a few configuration(richsnippets, last_item_link) will be ignored.
builder = Hensel::Builder.new
builder.add(text: "home", url: "/")
builder.render {|item| "<li>#{item.text}</li>" } #=> "<ul><li>home</li></ul>"
builder.render do
if last?
node(:li) do
node(:span){ item.text }
end
else
node(:li) do
node(:a, href: item.url) do
node(:span){ item.text }
end
end
end
endHelpers
The helper can be used in your web application.
Basic
include Hensel::Helperswith Sinatra
class Sample < Sinatra::Base
helpers Hensel::Helpers
configure do
Hensel.configure do |config|
config.attr_wrapper = '"'
config.whitespace = ' '
end
end
get "/" do
breadcrumbs.add("home", "/")
breadcrumbs.render
end
endwith Padrino
# config/boot.rb
Padrino.before_load do
Hensel.configure do |config|
config.attr_wrapper = '"'
config.whitespace = ' '
end
endclass Sample < Padrino::Application
helpers Hensel::Helpers
get :index do
breadcrumbs.add("home", ?/)
breadcrumbs.render
end
endSinatra/Padrino Helpers
If you want to customize more, you should use SinatraHelpers. It can be used both in Sinatra and in Padrino.
class Sample < Sinatra::Base
helpers Hensel::Helpers::SinatraHelpers
set :hensel, builder_options: { class: "this-is-parent-class-name" },
renderer: proc { node(:custom_element_name){ item.text }}
configure do
Hensel.configure do |config|
config.attr_wrapper = '"'
config.whitespace = ' '
end
end
get "/" do
breadcrumbs.add("home", "/")
breadcrumbs.render
end
endTODO
- Support Rails
- New syntax for Sinatra and Padrino
Contributing
- Fork it ( https://github.com/namusyaka/hensel/fork )
- Create your feature branch (
git checkout -b my-new-feature) - Commit your changes (
git commit -am 'Add some feature') - Push to the branch (
git push origin my-new-feature) - Create a new Pull Request