No release in over 3 years
Hanami-Papercraft: Papercraft views for Hanami
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
 Dependencies

Development

~> 5.25.5

Runtime

 Project Readme

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
end

3. 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
end

Contributing

Please feel free to contribute issues and PR's...