From e113c891ec081f46fdc4a5605a4135f24c0a6289 Mon Sep 17 00:00:00 2001 From: Florian Weingarten Date: Wed, 6 Jan 2016 21:12:42 +0000 Subject: [PATCH] Convert forloop hash to drop --- lib/liquid.rb | 1 + lib/liquid/forloop_drop.rb | 42 ++++++++++++++++++++++++++++++++++++++ lib/liquid/tags/for.rb | 15 ++------------ 3 files changed, 45 insertions(+), 13 deletions(-) create mode 100644 lib/liquid/forloop_drop.rb diff --git a/lib/liquid.rb b/lib/liquid.rb index f4c6fea2..e8b35386 100644 --- a/lib/liquid.rb +++ b/lib/liquid.rb @@ -48,6 +48,7 @@ require 'liquid/lexer' require 'liquid/parser' require 'liquid/i18n' require 'liquid/drop' +require 'liquid/forloop_drop' require 'liquid/extensions' require 'liquid/errors' require 'liquid/interrupts' diff --git a/lib/liquid/forloop_drop.rb b/lib/liquid/forloop_drop.rb new file mode 100644 index 00000000..81b2d1a2 --- /dev/null +++ b/lib/liquid/forloop_drop.rb @@ -0,0 +1,42 @@ +module Liquid + class ForloopDrop < Drop + def initialize(name, length, parentloop) + @name = name + @length = length + @parentloop = parentloop + @index = 0 + end + + attr_reader :name, :length, :parentloop + + def index + @index + 1 + end + + def index0 + @index + end + + def rindex + @length - @index + end + + def rindex0 + @length - @index - 1 + end + + def first + @index == 0 + end + + def last + @index == @length - 1 + end + + protected + + def increment! + @index += 1 + end + end +end diff --git a/lib/liquid/tags/for.rb b/lib/liquid/tags/for.rb index e11586b7..fa82bc1d 100644 --- a/lib/liquid/tags/for.rb +++ b/lib/liquid/tags/for.rb @@ -144,11 +144,7 @@ module Liquid result = '' context.stack do - loop_vars = { - 'name'.freeze => @name, - 'length'.freeze => length, - 'parentloop'.freeze => for_stack[-1] - } + loop_vars = Liquid::ForloopDrop.new(@name, length, for_stack[-1]) for_stack.push(loop_vars) @@ -157,15 +153,8 @@ module Liquid segment.each_with_index do |item, index| context[@variable_name] = item - - loop_vars['index'.freeze] = index + 1 - loop_vars['index0'.freeze] = index - loop_vars['rindex'.freeze] = length - index - loop_vars['rindex0'.freeze] = length - index - 1 - loop_vars['first'.freeze] = (index == 0) - loop_vars['last'.freeze] = (index == length - 1) - result << @for_block.render(context) + loop_vars.send(:increment!) # Handle any interrupts if they exist. if context.interrupt?