mirror of
https://github.com/Shopify/liquid.git
synced 2025-08-10 00:00:35 -04:00
70 lines
2.1 KiB
Ruby
70 lines
2.1 KiB
Ruby
module Liquid
|
|
class TableRow < Block
|
|
Syntax = /(\w+)\s+in\s+(#{QuotedFragment}+)/o
|
|
|
|
def initialize(tag_name, markup, options)
|
|
super
|
|
if markup =~ Syntax
|
|
@variable_name = $1
|
|
@collection_name = Expression.parse($2)
|
|
@attributes = {}
|
|
markup.scan(TagAttributes) do |key, value|
|
|
@attributes[key] = Expression.parse(value)
|
|
end
|
|
else
|
|
raise SyntaxError.new(options[:locale].t("errors.syntax.table_row".freeze))
|
|
end
|
|
end
|
|
|
|
def render(context)
|
|
collection = context.evaluate(@collection_name) or return ''.freeze
|
|
|
|
from = @attributes.key?('offset'.freeze) ? context.evaluate(@attributes['offset'.freeze]).to_i : 0
|
|
to = @attributes.key?('limit'.freeze) ? from + context.evaluate(@attributes['limit'.freeze]).to_i : nil
|
|
|
|
collection = Utils.slice_collection(collection, from, to)
|
|
|
|
length = collection.length
|
|
|
|
cols = context.evaluate(@attributes['cols'.freeze]).to_i
|
|
|
|
row = 1
|
|
col = 0
|
|
|
|
result = "<tr class=\"row1\">\n"
|
|
context.stack do
|
|
collection.each_with_index do |item, index|
|
|
context[@variable_name] = item
|
|
context['tablerowloop'.freeze] = {
|
|
'length'.freeze => length,
|
|
'index'.freeze => index + 1,
|
|
'index0'.freeze => index,
|
|
'col'.freeze => col + 1,
|
|
'col0'.freeze => col,
|
|
'rindex'.freeze => length - index,
|
|
'rindex0'.freeze => length - index - 1,
|
|
'first'.freeze => (index == 0),
|
|
'last'.freeze => (index == length - 1),
|
|
'col_first'.freeze => (col == 0),
|
|
'col_last'.freeze => (col == cols - 1)
|
|
}
|
|
|
|
col += 1
|
|
|
|
result << "<td class=\"col#{col}\">" << super << '</td>'
|
|
|
|
if col == cols && (index != length - 1)
|
|
col = 0
|
|
row += 1
|
|
result << "</tr>\n<tr class=\"row#{row}\">"
|
|
end
|
|
end
|
|
end
|
|
result << "</tr>\n"
|
|
result
|
|
end
|
|
end
|
|
|
|
Template.register_tag('tablerow'.freeze, TableRow)
|
|
end
|