_ _ _ _ _
_ (_) | _ (_) | | (_) _
_| |_ _| |_| |_ _____ _ _____ __| |_____ _ _| |_ _____
(_ _) | (_ _|_____) (____ |/ _ | ___ | (_ _) ___ |
| |_| | | | |_ | / ___ ( (_| | ____| | | |_| ____|
\__)_|\_) \__) _| \_____|\____|_____)_| \__)_____)
(__/
Tilt extension for Jadeite that adds support for rendering Jade templates from Sinatra with help from The Ruby Racer embedded V8 JavaScript interpreter.
get "/bacon" do
jade "p Everyone loves #{what[~~(Math.random()*(what.length-1))]} bacon!", :locals => {
:what => ['smoked', 'tasty', 'delicious', 'chunky']
}
end
=> <p>Everyone loves chunky bacon!</p>
### Sinatra example
#### mytemplate.jade
doctype 5
html(lang="en")
head
title= pageTitle
script(type='text/javascript')
if (foo) {
bar()
}
body
h1 Jade - node template engine
#container
if youAreUsingJade
p You are amazing
else
p Get on it!
#### app.rb
require "tilt-jadeite/sinatra"
class HelloWorld < Sinatra::Base
helpers Sinatra::Jade
get "/jade" do
jade :mytemplate, :locals => {:pageTitle => "Jade", :youAreUsingJade => true}
end
end
Accessing your app at /jade will now produce
<!DOCTYPE html>
<html lang="en">
<head>
<title>Jade</title>
<script type="text/javascript">
if (foo) {
bar()
}
</script>
</head>
<body>
<h1>Jade - node template engine</h1>
<div id="container">
<p>You are amazing</p>
</div>
</body>
</html>
## Rendering server side with Sinatra
The goal of this library is to be able to use the same templates for rendering on server and in browser. Thus, it makes
little sense to include support for using Sinatra helper methods in the templates. Therefore, only the locals
hash are
passed to the template engine. The keys of this hash will be the only variables/functions exposed to templates.
If you still wish to expose helper methods from the Sinatra class to your templates, you can do this by adding the desired keys to the locals hash, enclosing methods in anonymous procs/lambdas.
As this example illustrates:
get "/" do
jade :index, :locals => {
:stylesheet_path => proc {|_ignore, path| stylesheet_path(path) }
}
end
Now, the stylesheet_path
function is available in the template:
doctype 5
html
head
link(href=stylesheet_path('app'), rel="stylesheet", type="text/css")
link(href=stylesheet_path('mobile'), rel="stylesheet", type="text/css", media='screen and (min-width: 481px)')
// (...)
Remember that Jade is JavaScript, so the procs are converted to functions and thus require ()
after to be invoked.
You can even expose the haml
render method this way:
get "/crazy" do
jade "!= haml('%p Mad crazy!')", :locals => { :haml => proc {|_ignore, tmpl| haml(tmpl) } }
end
This will output:
<p>Mad crazy!</p>
Whether this is a good idea is another question! See performance considerations below.
## Performance
The Ruby Racer performs data conversion when passing Ruby objects to the V8 context. This does not come for free
and can quickly result in performance problems if not taken into consideration. The solution is to keep the
locals
hash as small and lightweight as possible. It is a good idea to calculate as much data as possible up front.
I.e. an improved version of the stylesheet_path
example above would determine the path to the needed stylesheets before
invoking the template engine:
jade :index, :locals => {
:stylesheets => {
:app => stylesheet_path('app'),
:mobile => stylesheet_path('mobile')
}
}
modifying the jade template to:
link(href=stylesheets.app, rel="stylesheet", type="text/css")
link(href=stylesheets.mobile, rel="stylesheet", type="text/css", media='screen and (min-width: 481px)')
// (...)
## Author
Bjørge Næss / github.com/bjoerge
## Credits
All kudos in the world goes to TJ Holowaychuk for creating the eminent template language Jade and to Charles Lowell for the amazing Ruby Racer.
## LICENSE
MIT