[~/sinatra/sinatra-documentation(master)]$ jekyll --help NAME: jekyll DESCRIPTION: Jekyll is a blog-aware, static site generator in Ruby COMMANDS: build Build your site default docs Launch local server with docs for Jekyll v1.1.2 doctor Search site and print specific deprecation warnings help Display global or [command] help documentation. import Import your old blog to Jekyll new Creates a new Jekyll site scaffold in PATH serve Serve your site locally ALIASES: hyde doctor server serve GLOBAL OPTIONS: -s, --source [DIR] Source directory (defaults to ./) -d, --destination [DIR] Destination directory (defaults to ./_site) --safe
Liquid is a ruby library for rendering safe templates which cannot affect the security of the server they are rendered on. Liquid does NOT allow ruby code inside the markup.
[1] pry(main)> require 'liquid' => true [2] pry(main)> @template = Liquid::Template.parse("hi {{name}}") => #<Liquid::Template:0x007f820f8206e8 @root= #<Liquid::Document:0x007f820f8205a8 @nodelist= ["hi ", #<Liquid::Variable:0x007f820f8203a0 @filters=[], @markup="name", @name="name">]>> [3] pry(main)> @template.render('name' => 'tobi') => "hi tobi"
Filters can be applied on output tags:
[~/rubytesting/liquid]$ cat filters.rb require 'liquid' template = <<-'EOT' Hello {{ 'tobi' | upcase }} Hello 'tobi' has {{ 'tobi' | size }} letters! Today is {{ 'now' | date: "%A %dth of %B %Y" }} EOT @template = Liquid::Template.parse(template)
puts @template.render() [~/rubytesting/liquid]$ ruby filters.rb Hello TOBI Hello 'tobi' has 4 letters! Today is Saturday 11th of January 2014
You can’t give access to objects of arbitrary classes to end users. Due security concerns, only String, Numeric, Hash, Array, Proc, Boolean
or Liquid::Drop
are allowed by default.
The final value rendered in the template is the result of sending to_liquid
message to the resolved object.
Liquid
extends some of the ruby standard classes with that method.
[~/rubytesting/liquid]$ cat if.rb require 'liquid' User = Struct.new(:name) user = User.new('Juana') def user.to_liquid { 'name' => self.name, 'age' => 9 } end template = <<-'EOT' {% if user %} Hello {{ user.name}} is {{user.age}} years old {% endif %} EOT @template = Liquid::Template.parse(template) puts @template.render("user" => user)
[~/rubytesting/liquid]$ ruby if.rb Hello Juana is 9 years old
Creating filters is very easy. Basically, they are just methods which
take one parameter and return a modified string. You can use your own
filters by passing an array of modules to the render call like this:
@template.render(assigns, [MyTextFilters, MyDateFilters])
.
Alternatively, you can register your filters globally:
[~/rubytesting/liquid]$ cat create_filter.rb require 'liquid' require 'redcloth' module TextFilter def textilize input RedCloth.new(input).to_html end end Liquid::Template.register_filter(TextFilter) t = <<"EOI" {{ 'Do not *ever* pull this _lever_.' | textilize}} EOI template = Liquid::Template.parse t puts template.render()
[~/rubytesting/liquid]$ ruby create_filter.rb <p>Do not <strong>ever</strong> pull this <em>lever</em>.</p> [~/rubytesting/liquid]$