lib/liquid/template.rb in liquid-2.0.0 vs lib/liquid/template.rb in liquid-2.1.0

- old
+ new

@@ -1,146 +1,149 @@ module Liquid - # Templates are central to liquid. - # Interpretating templates is a two step process. First you compile the - # source code you got. During compile time some extensive error checking is performed. - # your code should expect to get some SyntaxErrors. + # Templates are central to liquid. + # Interpretating templates is a two step process. First you compile the + # source code you got. During compile time some extensive error checking is performed. + # your code should expect to get some SyntaxErrors. # - # After you have a compiled template you can then <tt>render</tt> it. - # You can use a compiled template over and over again and keep it cached. + # After you have a compiled template you can then <tt>render</tt> it. + # You can use a compiled template over and over again and keep it cached. # - # Example: - # + # Example: + # # template = Liquid::Template.parse(source) # template.render('user_name' => 'bob') # class Template attr_accessor :root @@file_system = BlankFileSystem.new - - class <<self + + class << self def file_system @@file_system end - + def file_system=(obj) @@file_system = obj end - - def register_tag(name, klass) + + def register_tag(name, klass) tags[name.to_s] = klass - end - + end + def tags @tags ||= {} end - - # Pass a module with filter methods which should be available + + # Pass a module with filter methods which should be available # to all liquid views. Good for registering the standard library - def register_filter(mod) + def register_filter(mod) Strainer.global_filter(mod) - end - + end + # creates a new <tt>Template</tt> object from liquid source code def parse(source) template = Template.new template.parse(source) template - end + end end # creates a new <tt>Template</tt> from an array of tokens. Use <tt>Template.parse</tt> instead def initialize end - - # Parse source code. - # Returns self for easy chaining + + # Parse source code. + # Returns self for easy chaining def parse(source) @root = Document.new(tokenize(source)) self end - - def registers + + def registers @registers ||= {} end - + def assigns @assigns ||= {} end - + + def instance_assigns + @instance_assigns ||= {} + end + def errors @errors ||= [] end - + # Render takes a hash with local variables. # - # if you use the same filters over and over again consider registering them globally + # if you use the same filters over and over again consider registering them globally # with <tt>Template.register_filter</tt> - # + # # Following options can be passed: - # + # # * <tt>filters</tt> : array with local filters - # * <tt>registers</tt> : hash with register variables. Those can be accessed from - # filters and tags and might be useful to integrate liquid more with its host application + # * <tt>registers</tt> : hash with register variables. Those can be accessed from + # filters and tags and might be useful to integrate liquid more with its host application # def render(*args) - return '' if @root.nil? - + return '' if @root.nil? + context = case args.first when Liquid::Context args.shift when Hash - self.assigns.merge!(args.shift) - Context.new(assigns, registers, @rethrow_errors) + Context.new([args.shift, assigns], instance_assigns, registers, @rethrow_errors) when nil - Context.new(assigns, registers, @rethrow_errors) + Context.new(assigns, instance_assigns, registers, @rethrow_errors) else raise ArgumentError, "Expect Hash or Liquid::Context as parameter" end - + case args.last when Hash options = args.pop - + if options[:registers].is_a?(Hash) - self.registers.merge!(options[:registers]) + self.registers.merge!(options[:registers]) end if options[:filters] context.add_filters(options[:filters]) - end - + end + when Module - context.add_filters(args.pop) + context.add_filters(args.pop) when Array - context.add_filters(args.pop) + context.add_filters(args.pop) end - + begin # render the nodelist. # for performance reasons we get a array back here. join will make a string out of it @root.render(context).join ensure @errors = context.errors end end - + def render!(*args) @rethrow_errors = true; render(*args) end - + private - + # Uses the <tt>Liquid::TemplateParser</tt> regexp to tokenize the passed source def tokenize(source) - source = source.source if source.respond_to?(:source) + source = source.source if source.respond_to?(:source) return [] if source.to_s.empty? tokens = source.split(TemplateParser) # removes the rogue empty element at the beginning of the array - tokens.shift if tokens[0] and tokens[0].empty? + tokens.shift if tokens[0] and tokens[0].empty? tokens end - - end + + end end