hanami-papercraft
Use Papercraft templates with Hanami
Note: this project is still in an experimental stage.
The hanami-papercraft gem lets you create Hanami views using Papercraft
templates. Papercraft is an innovaive new gem for generating HTML using plain
Ruby. For more information on Papercraft please visit the Papercraft website:
papercraft.noteflakes.com.
This gem introduces a new view class called Hanami::PapercraftView, which you
can use instead of Hanami::View as the base class of your app's views.
Usage
For the sake of simplicity, we'll base the following instructions on the Hanami
getting started
guide.
Please keep in mind that hanami-papercraft is still in a very early stage of
development, so things might not work as you expect, especially if you use the
more advanced features of Hanami.
1. Add hanami-papercraft
In your Gemfile, add the following line:
gem "hanami-papercraft"Then run bundle install to update your dependencies.
2. Set your app's basic view class
In app/view.rb, change the View classes superclass to Hanami::PapercraftView:
# app/view.rb
module Bookshelf
class View < Hanami::PapercraftView
end
end3. Use a Papercraft layout template
Replace the app's layout template stored in app/templates/layouts/app.html.erb
with a file named app/templates/layouts/app.papercraft.rb:
# app/templates/layouts/app.papercraft.rb
->(config:, context:, **props) {
html(lang: "en") {
head {
meta charset: "UTF-8"
meta name: "viewport", content: "width=device-width, initial-scale=1.0"
title "Bookshelf"
favicon_tag
stylesheet_tag(context, "app")
}
body {
render_children(config:, context:, **props)
javascript_tag(context, "app")
}
}
}4. Use Papercraft view templates
You can now start writing your view templates with Papercraft, e.g.:
# app/templates/books/index.papercraft.rb
->(context:, books:, **props) {
h1 "Books"
ul {
books.each do |book|
Kernel.p book
li book[:title]
end
}
}Passing Template Parameters
While theoretically you have access to the view class in your templates (through
self), you should use explicit arguments in your templates, as shown in the
examples above. The PapercraftView class always passes template parameters as
keyword arguments to the layout and the view templates.
In the view template above, the books keyword argument is defined because the
view class exposes such a parameter:
# app/views/books/index.rb
module Bookshelf
module Views
module Books
class Index < Bookshelf::View
expose :books do
[
{title: "Test Driven Development"},
{title: "Practical Object-Oriented Design in Ruby"}
]
end
end
end
end
endContributing
Please feel free to contribute issues and PR's...