LIQUID MARKUP - Meetupfiles.meetup.com/1397868/Liquid-Markup.pdf · When Should I use Liquid When...

Post on 09-Jul-2020

2 views 0 download

Transcript of LIQUID MARKUP - Meetupfiles.meetup.com/1397868/Liquid-Markup.pdf · When Should I use Liquid When...

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