paggio
A Ruby DSL to generate HTML and CSS.
HTML
Inspired by markaby with some specialized additions for certain kinds of elements.
“by require ‘paggio/now’
html! avoids outputting the doctype and Maruku could not parse this XML/HTML:
<html> tags
Maruku could not parse this XML/HTML:
<html> tags
html! do div.content! do p «-EOS I like trains EOS end end
“
This will output:
“ml
I like trains.
“
CSS
Inspired by SCSS with some nice CSS unit handling monkey-patching.
“by require ‘paggio/now’
css do rule ‘.content’ do background :black color :white
rule '&:hover' do
background :white
color :black
end
rule '.stuff' do
font size: 50.px
end
end end
“
This will output:
“s .content { background: black; color: white; }
.content .stuff { font-size: 50px; }
.content:hover { background: white; color: black; }
“
With Sinatra
Because why not.
“by require ‘sinatra’ require ‘paggio’
get ‘/’ do Paggio.html do head do title “Yo, I’m on Sinatra”
style do
rule 'html', 'body' do
width 100.%
height 100.%
# reset some stuff
margin 0
padding 0
position :absolute
top 0
background :black
color :white
end
rule '#content' do
width 50.%
height 100.%
margin 0, :auto
border left: [3.px, :solid, :white],
right: [3.px, :solid, :white]
text align: :center
font size: 23.px
rule '& > div' do
padding 20.px
end
end
end
end
body do
div.content! do
div 'Hello world!'
end
end
end end
“
With Markdown
You’ll need the kramdown
gem.
“by require ‘paggio/now’ require ‘paggio/markdown’
html do markdown «-MD Here comes a bunch of shitty markdown. MD end
“
Since paggio does internal heredoc indentation pruning, you don’t have to worry about that.
With Opal
You’ll need the --pre sourcify
gem and the opal
gem.
“by require ‘paggio/now’ require ‘paggio/script’
html do head do script src: ‘js/opal.js’ script src: ‘js/browser.js’
script do
alert 'Yo dawg'
end
end end
“
Calling local methods inside the DSLs
Don’t you just love instance_eval
? Well, I do, but sometimes it’s not the best tool for the job, in fact you cannot call local methods or access instance variables inside the DSLs since they’re evaluated in another context.
Well, fear not, doing that is as easy as adding a parameter to the DSL block.
“by class Page def initialize(title, content) @title = title @content = content end
def to_html Paggio.html do |_| .html do.head do title @title end
_.body do
@content
end
end
end
end end
puts Page.new(“foo”, “bar”).to_html
“
Why?
Because HAML, SCSS and CoffeeScript are too mainstream.
On a serious note, why have templating systems and syntax sugar when you can just write Ruby?