mirror of
https://github.com/Shopify/liquid.git
synced 2026-09-15 08:50:45 -07:00
render_to_output_buffer
This commit is contained in:
+3
-2
@@ -13,8 +13,9 @@ module Liquid
|
||||
end
|
||||
end
|
||||
|
||||
def render(context, output = '')
|
||||
@body.render(context, output)
|
||||
# For backwards compatibility
|
||||
def render(context)
|
||||
@body.render(context)
|
||||
end
|
||||
|
||||
def blank?
|
||||
|
||||
@@ -66,14 +66,19 @@ module Liquid
|
||||
@blank
|
||||
end
|
||||
|
||||
def render(context, output = '')
|
||||
def render(context)
|
||||
render_to_output_buffer(context, '')
|
||||
end
|
||||
|
||||
def render_to_output_buffer(context, output)
|
||||
context.resource_limits.render_score += @nodelist.length
|
||||
|
||||
idx = 0
|
||||
while node = @nodelist[idx]
|
||||
previous_output_size = output.bytesize
|
||||
|
||||
case node
|
||||
when String
|
||||
check_resources(context, node)
|
||||
output << node
|
||||
when Variable
|
||||
render_node(context, output, node)
|
||||
@@ -91,6 +96,8 @@ module Liquid
|
||||
break if context.interrupt? # might have happened through an include
|
||||
end
|
||||
idx += 1
|
||||
|
||||
raise_if_resource_limits_reached(context, output.bytesize - previous_output_size)
|
||||
end
|
||||
|
||||
output
|
||||
@@ -99,10 +106,7 @@ module Liquid
|
||||
private
|
||||
|
||||
def render_node(context, output, node)
|
||||
node.render(context, output)
|
||||
check_resources(context, output)
|
||||
rescue MemoryError => e
|
||||
raise e
|
||||
node.render_to_output_buffer(context, output)
|
||||
rescue UndefinedVariable, UndefinedDropMethod, UndefinedFilter => e
|
||||
context.handle_error(e, node.line_number)
|
||||
rescue ::StandardError => e
|
||||
@@ -110,8 +114,8 @@ module Liquid
|
||||
output << context.handle_error(e, line_number)
|
||||
end
|
||||
|
||||
def check_resources(context, output)
|
||||
context.resource_limits.render_length = output.bytesize
|
||||
def raise_if_resource_limits_reached(context, length)
|
||||
context.resource_limits.render_length += length
|
||||
return unless context.resource_limits.reached?
|
||||
raise MemoryError.new("Memory limits exceeded".freeze)
|
||||
end
|
||||
|
||||
@@ -11,13 +11,13 @@ module Liquid
|
||||
end
|
||||
|
||||
class Include < Tag
|
||||
def render_with_profiling(context, output)
|
||||
def render_to_output_buffer_with_profiling(context, output)
|
||||
Profiler.profile_children(context.evaluate(@template_name_expr).to_s) do
|
||||
render_without_profiling(context, output)
|
||||
render_to_output_buffer_without_profiling(context, output)
|
||||
end
|
||||
end
|
||||
|
||||
alias_method :render_without_profiling, :render
|
||||
alias_method :render, :render_with_profiling
|
||||
alias_method :render_to_output_buffer_without_profiling, :render_to_output_buffer
|
||||
alias_method :render_to_output_buffer, :render_to_output_buffer_with_profiling
|
||||
end
|
||||
end
|
||||
|
||||
+9
-1
@@ -32,7 +32,15 @@ module Liquid
|
||||
self.class.name.downcase
|
||||
end
|
||||
|
||||
def render(_context, output = '')
|
||||
def render(_context)
|
||||
''.freeze
|
||||
end
|
||||
|
||||
# For backwards compatibility with custom tags. In a future release, the semantics
|
||||
# of the `render_to_output_buffer` method will become the default and the `render`
|
||||
# method will be removed.
|
||||
def render_to_output_buffer(context, output)
|
||||
output << render(context)
|
||||
output
|
||||
end
|
||||
|
||||
|
||||
@@ -22,8 +22,8 @@ module Liquid
|
||||
end
|
||||
end
|
||||
|
||||
def render(context, output = '')
|
||||
val = @from.render(context, nil)
|
||||
def render_to_output_buffer(context, output)
|
||||
val = @from.render(context)
|
||||
context.scopes.last[@to] = val
|
||||
context.resource_limits.assign_score += assign_score_of(val)
|
||||
output
|
||||
|
||||
@@ -22,10 +22,11 @@ module Liquid
|
||||
end
|
||||
end
|
||||
|
||||
def render(context, output = '')
|
||||
def render_to_output_buffer(context, output)
|
||||
previous_output_size = output.bytesize
|
||||
super
|
||||
context.scopes.last[@to] = output
|
||||
context.resource_limits.assign_score = output.bytesize
|
||||
context.resource_limits.assign_score += (output.bytesize - previous_output_size)
|
||||
output
|
||||
end
|
||||
|
||||
|
||||
@@ -38,16 +38,16 @@ module Liquid
|
||||
end
|
||||
end
|
||||
|
||||
def render(context, output = '')
|
||||
def render_to_output_buffer(context, output)
|
||||
context.stack do
|
||||
execute_else_block = true
|
||||
|
||||
@blocks.each do |block|
|
||||
if block.else?
|
||||
block.attachment.render(context, output) if execute_else_block
|
||||
block.attachment.render_to_output_buffer(context, output) if execute_else_block
|
||||
elsif block.evaluate(context)
|
||||
execute_else_block = false
|
||||
block.attachment.render(context, output)
|
||||
block.attachment.render_to_output_buffer(context, output)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
module Liquid
|
||||
class Comment < Block
|
||||
def render(_context, output = '')
|
||||
def render_to_output_buffer(_context, output)
|
||||
output
|
||||
end
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@ module Liquid
|
||||
end
|
||||
end
|
||||
|
||||
def render(context, output = '')
|
||||
def render_to_output_buffer(context, output)
|
||||
context.registers[:cycle] ||= {}
|
||||
|
||||
context.stack do
|
||||
|
||||
@@ -23,7 +23,7 @@ module Liquid
|
||||
@variable = markup.strip
|
||||
end
|
||||
|
||||
def render(context, output = '')
|
||||
def render_to_output_buffer(context, output)
|
||||
value = context.environments.first[@variable] ||= 0
|
||||
value -= 1
|
||||
context.environments.first[@variable] = value
|
||||
|
||||
@@ -70,7 +70,7 @@ module Liquid
|
||||
@else_block = BlockBody.new
|
||||
end
|
||||
|
||||
def render(context, output = '')
|
||||
def render_to_output_buffer(context, output)
|
||||
segment = collection_segment(context)
|
||||
|
||||
if segment.empty?
|
||||
@@ -78,6 +78,8 @@ module Liquid
|
||||
else
|
||||
render_segment(context, output, segment)
|
||||
end
|
||||
|
||||
output
|
||||
end
|
||||
|
||||
protected
|
||||
@@ -155,7 +157,7 @@ module Liquid
|
||||
|
||||
segment.each do |item|
|
||||
context[@variable_name] = item
|
||||
@for_block.render(context, output)
|
||||
@for_block.render_to_output_buffer(context, output)
|
||||
loop_vars.send(:increment!)
|
||||
|
||||
# Handle any interrupts if they exist.
|
||||
@@ -188,7 +190,7 @@ module Liquid
|
||||
|
||||
def render_else(context, output)
|
||||
if @else_block
|
||||
@else_block.render(context, output)
|
||||
@else_block.render_to_output_buffer(context, output)
|
||||
else
|
||||
output
|
||||
end
|
||||
|
||||
@@ -39,11 +39,11 @@ module Liquid
|
||||
end
|
||||
end
|
||||
|
||||
def render(context, output)
|
||||
def render_to_output_buffer(context, output)
|
||||
context.stack do
|
||||
@blocks.each do |block|
|
||||
if block.evaluate(context)
|
||||
return block.attachment.render(context, output)
|
||||
return block.attachment.render_to_output_buffer(context, output)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
module Liquid
|
||||
class Ifchanged < Block
|
||||
def render(context, output)
|
||||
def render_to_output_buffer(context, output)
|
||||
context.stack do
|
||||
block_output = super(context, '')
|
||||
block_output = ''
|
||||
super(context, block_output)
|
||||
|
||||
if block_output != context.registers[:ifchanged]
|
||||
context.registers[:ifchanged] = block_output
|
||||
|
||||
@@ -42,7 +42,7 @@ module Liquid
|
||||
def parse(_tokens)
|
||||
end
|
||||
|
||||
def render(context, output)
|
||||
def render_to_output_buffer(context, output)
|
||||
template_name = context.evaluate(@template_name_expr)
|
||||
raise ArgumentError.new(options[:locale].t("errors.argument.include")) unless template_name
|
||||
|
||||
@@ -68,11 +68,11 @@ module Liquid
|
||||
if variable.is_a?(Array)
|
||||
variable.each do |var|
|
||||
context[context_variable_name] = var
|
||||
partial.render(context, output: output)
|
||||
partial.render_to_output_buffer(context, output)
|
||||
end
|
||||
else
|
||||
context[context_variable_name] = variable
|
||||
partial.render(context, output: output)
|
||||
partial.render_to_output_buffer(context, output)
|
||||
end
|
||||
end
|
||||
ensure
|
||||
|
||||
@@ -20,7 +20,7 @@ module Liquid
|
||||
@variable = markup.strip
|
||||
end
|
||||
|
||||
def render(context, output = '')
|
||||
def render_to_output_buffer(context, output)
|
||||
value = context.environments.first[@variable] ||= 0
|
||||
context.environments.first[@variable] = value + 1
|
||||
output << value.to_s
|
||||
|
||||
@@ -22,7 +22,7 @@ module Liquid
|
||||
raise SyntaxError.new(parse_context.locale.t("errors.syntax.tag_never_closed".freeze, block_name: block_name))
|
||||
end
|
||||
|
||||
def render(_context, output = '')
|
||||
def render_to_output_buffer(_context, output)
|
||||
output << @body
|
||||
output
|
||||
end
|
||||
|
||||
@@ -18,7 +18,7 @@ module Liquid
|
||||
end
|
||||
end
|
||||
|
||||
def render(context, output = '')
|
||||
def render_to_output_buffer(context, output)
|
||||
collection = context.evaluate(@collection_name) or return ''.freeze
|
||||
|
||||
from = @attributes.key?('offset'.freeze) ? context.evaluate(@attributes['offset'.freeze]).to_i : 0
|
||||
|
||||
@@ -6,18 +6,18 @@ module Liquid
|
||||
# {% unless x < 0 %} x is greater than zero {% endunless %}
|
||||
#
|
||||
class Unless < If
|
||||
def render(context, output = '')
|
||||
def render_to_output_buffer(context, output)
|
||||
context.stack do
|
||||
# First condition is interpreted backwards ( if not )
|
||||
first_block = @blocks.first
|
||||
unless first_block.evaluate(context)
|
||||
return first_block.attachment.render(context, output)
|
||||
return first_block.attachment.render_to_output_buffer(context, output)
|
||||
end
|
||||
|
||||
# After the first condition unless works just like if
|
||||
@blocks[1..-1].each do |block|
|
||||
if block.evaluate(context)
|
||||
return block.attachment.render(context, output)
|
||||
return block.attachment.render_to_output_buffer(context, output)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -207,11 +207,9 @@ module Liquid
|
||||
begin
|
||||
# render the nodelist.
|
||||
# for performance reasons we get an array back here. join will make a string out of it.
|
||||
result = with_profiling(context) do
|
||||
output ||= self.class.output_buffer.clear
|
||||
@root.render(context, output)
|
||||
with_profiling(context) do
|
||||
@root.render_to_output_buffer(context, output || '')
|
||||
end
|
||||
result.respond_to?(:join) ? result.join : result
|
||||
rescue Liquid::MemoryError => e
|
||||
context.handle_error(e)
|
||||
ensure
|
||||
@@ -219,15 +217,15 @@ module Liquid
|
||||
end
|
||||
end
|
||||
|
||||
def self.output_buffer
|
||||
@output_buffer ||= String.new(capacity: 1024)
|
||||
end
|
||||
|
||||
def render!(*args)
|
||||
@rethrow_errors = true
|
||||
render(*args)
|
||||
end
|
||||
|
||||
def render_to_output_buffer(context, output)
|
||||
render(context, output: output)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def tokenize(source)
|
||||
|
||||
+11
-13
@@ -78,30 +78,28 @@ module Liquid
|
||||
filterargs
|
||||
end
|
||||
|
||||
def render(context, output = '')
|
||||
def render(context)
|
||||
obj = @filters.inject(context.evaluate(@name)) do |output, (filter_name, filter_args, filter_kwargs)|
|
||||
filter_args = evaluate_filter_expressions(context, filter_args, filter_kwargs)
|
||||
context.invoke(filter_name, output, *filter_args)
|
||||
end
|
||||
|
||||
obj = context.apply_global_filter(obj)
|
||||
|
||||
taint_check(context, obj)
|
||||
obj
|
||||
end
|
||||
|
||||
if output
|
||||
if obj.is_a?(Array)
|
||||
output << obj.join
|
||||
elsif obj.nil?
|
||||
elsif !obj.is_a?(String)
|
||||
output << obj.to_s
|
||||
else
|
||||
output << obj
|
||||
end
|
||||
def render_to_output_buffer(context, output)
|
||||
obj = render(context)
|
||||
|
||||
output
|
||||
if obj.is_a?(Array)
|
||||
output << obj.join
|
||||
elsif obj.nil?
|
||||
else
|
||||
obj
|
||||
output << obj.to_s
|
||||
end
|
||||
|
||||
output
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
Reference in New Issue
Block a user