diff --git a/lib/liquid/block_body.rb b/lib/liquid/block_body.rb index 45be8b8af..b9d6a0ce5 100644 --- a/lib/liquid/block_body.rb +++ b/lib/liquid/block_body.rb @@ -127,7 +127,7 @@ def render_to_output_buffer(context, output) case node when String - output << node + output.force_encoding('UTF-8') << node.force_encoding('UTF-8') when Variable render_node(context, output, node) when Block diff --git a/lib/liquid/tag.rb b/lib/liquid/tag.rb index ffd22868d..c080fb594 100644 --- a/lib/liquid/tag.rb +++ b/lib/liquid/tag.rb @@ -58,7 +58,12 @@ def disabled_error_message # 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) + rendered = render(context) + if output.nil? + output = rendered.to_s + else + output << rendered.to_s + end output end diff --git a/lib/liquid/variable.rb b/lib/liquid/variable.rb index 5b686e2d3..c367bfb64 100644 --- a/lib/liquid/variable.rb +++ b/lib/liquid/variable.rb @@ -94,14 +94,31 @@ def render(context) def render_to_output_buffer(context, output) obj = render(context) + if output.nil? + output = +'' + elsif output.frozen? + raise LiquidError, "Cannot mutate frozen output buffer" + end + if obj.is_a?(Array) output << obj.join + elsif obj.kind_of?(Hash) + output << obj.to_s elsif obj.nil? + # do nothing + elsif obj.kind_of?(String) + output << obj else - output << obj.to_s + output << obj.try(:to_s) || "" end output + rescue Encoding::CompatibilityError => e + if obj.kind_of?(String) + output.force_encoding('UTF-8') << obj + else + raise e + end end def disabled?(_context)