Upload
others
View
2
Download
0
Embed Size (px)
Citation preview
LIQUID MARKUPA story by Dane Harrigan
Friday, March 11, 2011
I’m Dane Harrigan
Friday, March 11, 2011
@daneharrigan
Friday, March 11, 2011
Friday, March 11, 2011
What is Liquid
Friday, March 11, 2011
What is Liquid
When Should I use Liquid
Friday, March 11, 2011
What is Liquid
When Should I use Liquid
How do I use Liquid
Friday, March 11, 2011
What is Liquid
When Should I use Liquid
How do I use Liquid
Liquify: Liquid Simplified
Friday, March 11, 2011
What is Liquid
Friday, March 11, 2011
What is Liquid
•Template Language
Friday, March 11, 2011
What is Liquid
•Template Language
•Written in Ruby
Friday, March 11, 2011
What is Liquid
•Template Language
•Written in Ruby
•Similar to ERb
Friday, March 11, 2011
What is Liquid
<%= %>
ERb Liquid
{{ }}
Friday, March 11, 2011
What is Liquid
<%= %>
ERb Liquid
{{ }}
<% %> {% %}
Friday, March 11, 2011
What is Liquid
<%= %>
ERb Liquid
{{ }}
<% %> {% %}
<%= helper(val) %> {{ val | helper }}
Friday, March 11, 2011
What is Liquid
•Secure
Friday, March 11, 2011
What is Liquid
•Secure
•Does Not Evaluate Ruby
Friday, March 11, 2011
What is Liquid
•Secure
•Does Not Evaluate Ruby
•Is a Pain in The Ass to Use
Friday, March 11, 2011
“Ok, so why would I use it?”
Friday, March 11, 2011
When Should I use Liquid
When to use Liquid
When NOT to use Liquid
Friday, March 11, 2011
1%99%
Friday, March 11, 2011
“1%? Now I’m interested!”
Friday, March 11, 2011
When Should I use Liquid
Friday, March 11, 2011
When Should I use Liquid
When you’re sharing your view code
Friday, March 11, 2011
When Should I use Liquid
When you’re sharing your view code
•Shopping Carts (Shopify)
Friday, March 11, 2011
When Should I use Liquid
When you’re sharing your view code
•Shopping Carts (Shopify)
•Newsletter Services (MailChimp)
Friday, March 11, 2011
When Should I use Liquid
When you’re sharing your view code
•Shopping Carts (Shopify)
•Newsletter Services (MailChimp)
•CMS (Magnetism, Mephisto, Jekyll)
Friday, March 11, 2011
When Should I use Liquid
Friday, March 11, 2011
When Should I use Liquid
When you need a limited feature set
Friday, March 11, 2011
When Should I use Liquid
When you need a limited feature set
•Only allow access to specific objects
Friday, March 11, 2011
When Should I use Liquid
When you need a limited feature set
•Only allow access to specific objects
•Specify which methods of an object can be executed
Friday, March 11, 2011
When Should I use Liquid
When you need a limited feature set
•Only allow access to specific objects
•Specify which methods of an object can be executed
•Allow usage of predefined helper methods
Friday, March 11, 2011
“Huh?”
Friday, March 11, 2011
How do I use Liquid
Friday, March 11, 2011
How do I use Liquid
•Drops (Classes, Models)
Friday, March 11, 2011
How do I use Liquid
•Drops (Classes, Models)
•Filters (View Helpers)
Friday, March 11, 2011
How do I use Liquid
•Drops (Classes, Models)
•Filters (View Helpers)
•Tags (Single Purpose Classes)
Friday, March 11, 2011
“Show me some code already!”
Friday, March 11, 2011
# person_drop.rbclass PersonDrop < Liquid::Drop def first_name "Dane" end def last_name "Harrigan" endend
Friday, March 11, 2011
# app/models/person.rbclass Person < ActiveRecord::Baseliquid_methods :first_name, :last_name
end
Friday, March 11, 2011
# rendering a liquid templatetemplate = Liquid::Template.parse(tmpl_code)template.render(:person => PersonDrop.new)
Friday, March 11, 2011
# rendering a liquid templatetemplate = Liquid::Template.parse(tmpl_code)template.render(:person => PersonDrop.new)
Friday, March 11, 2011
<body> <h1>{{ person.first_name }} {{ person.last_name }}</h1></body>
Friday, March 11, 2011
“Ok, what about filters?”
Friday, March 11, 2011
# my_filters.rbmodule MyFilters def greet(name) "Hello #{name}!" end def goodbye(name) "Goodbye #{name}!" endend
Friday, March 11, 2011
# rendering a liquid templateLiquid::Template.register_filter MyFilters
template = Liquid::Template.parse(tmpl_code)template.render(:person => PersonDrop.new)
Friday, March 11, 2011
# rendering a liquid templateLiquid::Template.register_filter MyFilters
template = Liquid::Template.parse(tmpl_code)template.render(:person => PersonDrop.new)
Friday, March 11, 2011
<body> <h1>{{ person.first_name | greet }}</h1></body>
Friday, March 11, 2011
“Way easy. Tags please.”
Friday, March 11, 2011
<body> {% foo "bar", "cux" %} <h1>{{ person.first_name | greet }}</h1></body>
Friday, March 11, 2011
<body> {% foo "bar", "cux" %} <h1>{{ person.first_name | greet }}</h1></body>
Friday, March 11, 2011
# rendering a liquid templateLiquid::Template.register_tag 'foo', FooTag
template = Liquid::Template.parse(tmpl_code)template.render(:person => PersonDrop.new)
Friday, March 11, 2011
# rendering a liquid templateLiquid::Template.register_tag 'foo', FooTag
template = Liquid::Template.parse(tmpl_code)template.render(:person => PersonDrop.new)
Friday, March 11, 2011
# foo_tag.rbclass FooTag < Liquid::Tag def render(context) @markup # => '"bar", "cux"' context # => {'person' => PersonDrop.new}
# logic for your foo tag endend
Friday, March 11, 2011
# foo_tag.rbclass FooTag < Liquid::Tag def render(context) @markup # => '"bar", "cux"' context # => {'person' => PersonDrop.new}
# logic for your foo tag endend
Friday, March 11, 2011
“Ok, real example please?”
Friday, March 11, 2011
<!DOCTYPE HTML><html> <body> {% snippet 'header' %} <h1>{{ person.first_name | greet }}</h1> {% snippet 'footer' %} </body></html>
Friday, March 11, 2011
<!DOCTYPE HTML><html> <body> {% snippet 'header' %} <h1>{{ person.first_name | greet }}</h1> {% snippet 'footer' %} </body></html>
Friday, March 11, 2011
# rendering a liquid templateLiquid::Template.register_tag 'snippet', SnippetTag
template = Liquid::Template.parse(tmpl_code)template.render(:person => PersonDrop.new)
Friday, March 11, 2011
# snippet_tag.rbclass SnippetTag < Liquid::Tag def render(context) name = @markup.gsub(/("|')/,'').strip
tmpl = Template.snippets.first_by_name(name) content = tmpl.content
template = Liquid::Template.parse(content) template.render(:person => PersonDrop.new) endend
Friday, March 11, 2011
# snippet_tag.rbclass SnippetTag < Liquid::Tag def render(context) name = @markup.gsub(/("|')/,'').strip
tmpl = Template.snippets.first_by_name(name) content = tmpl.content
template = Liquid::Template.parse(content) template.render(:person => PersonDrop.new) endend
Friday, March 11, 2011
# snippet_tag.rbclass SnippetTag < Liquid::Tag def render(context) name = @markup.gsub(/("|')/,'').strip
tmpl = Template.snippets.first_by_name(name) content = tmpl.content
template = Liquid::Template.parse(content) template.render(:person => PersonDrop.new) endend
Friday, March 11, 2011
# snippet_tag.rbclass SnippetTag < Liquid::Tag def render(context) name = @markup.gsub(/("|')/,'').strip
tmpl = Template.snippets.first_by_name(name) content = tmpl.content
template = Liquid::Template.parse(content) template.render(:person => PersonDrop.new) endend
Friday, March 11, 2011
# snippet_tag.rbclass SnippetTag < Liquid::Tag def render(context) name = @markup.gsub(/("|')/,'').strip
tmpl = Template.snippets.first_by_name(name) content = tmpl.content
template = Liquid::Template.parse(content) template.render(:person => PersonDrop.new) endend
Friday, March 11, 2011
# snippet_tag.rbclass SnippetTag < Liquid::Tag def render(context) name = @markup.gsub(/("|')/,'').strip
tmpl = Template.snippets.first_by_name(name) content = tmpl.content
template = Liquid::Template.parse(content) template.render(:person => PersonDrop.new) endend
Friday, March 11, 2011
“Can this actually get easier?”
Friday, March 11, 2011
Liquify: Liquid Simplified
Friday, March 11, 2011
•Register Drops, Filters and Tags in one Place
Liquify: Liquid Simplified
Friday, March 11, 2011
•Register Drops, Filters and Tags in one Place
•Improvements to liquid_methods
Liquify: Liquid Simplified
Friday, March 11, 2011
•Register Drops, Filters and Tags in one Place
•Improvements to liquid_methods
•Auto-parsed Parameters
Liquify: Liquid Simplified
Friday, March 11, 2011
# register tagLiquid::Template.register_tag 'foo', FooTag
# register filtersLiquid::Template.register_filter BarFilters
# register droptmpl = Liquid::Template.parse(template_code)tmpl.render(:person => PersonDrop.new)
Friday, March 11, 2011
# register tagLiquid::Template.register_tag 'foo', FooTag
# register filtersLiquid::Template.register_filter BarFilters
# register droptmpl = Liquid::Template.parse(template_code)tmpl.render(:person => PersonDrop.new)
Friday, March 11, 2011
# register tagLiquid::Template.register_tag 'foo', FooTag
# register filtersLiquid::Template.register_filter BarFilters
# register droptmpl = Liquid::Template.parse(template_code)tmpl.render(:person => PersonDrop.new)
Friday, March 11, 2011
# register tagLiquid::Template.register_tag 'foo', FooTag
# register filtersLiquid::Template.register_filter BarFilters
# register droptmpl = Liquid::Template.parse(template_code)tmpl.render(:person => PersonDrop.new)
Friday, March 11, 2011
“I’m dying to see Liquify!”
Friday, March 11, 2011
Liquify.setup do |config| config.register_tag :foo, FooTag config.register_filter BarFilters config.register_drop :person, PersonDrop
# need access to stuff later? config.register_drop :person, lambda { PersonDrop.first }end
Friday, March 11, 2011
Liquify.setup do |config| config.register_tag :foo, FooTag config.register_filter BarFilters config.register_drop :person, PersonDrop
# need access to stuff later? config.register_drop :person, lambda { PersonDrop.first }end
Friday, March 11, 2011
Liquify.setup do |config| config.register_tag :foo, FooTag config.register_filter BarFilters config.register_drop :person, PersonDrop
# need access to stuff later? config.register_drop :person, lambda { PersonDrop.first }end
Friday, March 11, 2011
Liquify.setup do |config| config.register_tag :foo, FooTag config.register_filter BarFilters config.register_drop :person, PersonDrop
# need access to stuff later? config.register_drop :person, lambda { PersonDrop.first }end
Friday, March 11, 2011
Liquify.setup do |config| config.register_tag :foo, FooTag config.register_filter BarFilters config.register_drop :person, PersonDrop
# need access to stuff later? config.register_drop :person, lambda { PersonDrop.first }end
Friday, March 11, 2011
Liquify.invoke(template_code)
Friday, March 11, 2011
“Sweet!”
Friday, March 11, 2011
class Person < ActiveRecord::Base liquify_methods :first_name, :last_name, :full_name => lambda { |p| "#{p.first_name} #{p.last_name}" }end
Friday, March 11, 2011
“I approve.”
Friday, March 11, 2011
<body> <h1>{{ person.first_name | greet }}</h1> {% snippet 'profile', item: person, class: 'active' %}</body>
Friday, March 11, 2011
<body> <h1>{{ person.first_name | greet }}</h1> {% snippet 'profile', item: person, class: 'active' %}</body>
Friday, March 11, 2011
class SnippetTag < Liquify::Tag def invoke(params) params # => ['profile', { # 'item' => PersonDrop.new, # 'class' => 'active'} # ] endend
Friday, March 11, 2011
class SnippetTag < Liquify::Tag def invoke # don't need params? endend
Friday, March 11, 2011
“You’ve changed my life.”
Friday, March 11, 2011
I’m Dane Harrigan
Friday, March 11, 2011
Thanks
Friday, March 11, 2011
Twitter: @daneharrigan
Github: daneharrigan
gem install liquify
Friday, March 11, 2011