diff --git a/lib/liquid.rb b/lib/liquid.rb index 2bc0b4a7..09cafe94 100644 --- a/lib/liquid.rb +++ b/lib/liquid.rb @@ -40,7 +40,6 @@ module Liquid QuotedString = /"[^"]*"|'[^']*'/ QuotedFragment = /#{QuotedString}|(?:[^\s,\|'"]|#{QuotedString})+/o TagAttributes = /(\w[\w-]*)\s*\:\s*(#{QuotedFragment})/o - ContextInheritance = /\.\.\./ AnyStartingTag = /#{TagStart}|#{VariableStart}/o PartialTemplateParser = /#{TagStart}.*?#{TagEnd}|#{VariableStart}.*?#{VariableIncompleteEnd}/om TemplateParser = /(#{PartialTemplateParser}|#{AnyStartingTag})/om diff --git a/lib/liquid/locales/en.yml b/lib/liquid/locales/en.yml index b2196686..6cff46a7 100644 --- a/lib/liquid/locales/en.yml +++ b/lib/liquid/locales/en.yml @@ -5,7 +5,7 @@ block_tag_unexpected_args: "Syntax Error in '%{tag}' - Valid syntax: {% %{tag} %}{% end%{tag} %}" assign: "Syntax Error in 'assign' - Valid syntax: assign [var] = [source]" capture: "Syntax Error in 'capture' - Valid syntax: capture [var]" - snippet: "Syntax Error in 'snippet' - Valid syntax: snippet [quoted string]" + snippet: "Syntax Error in 'snippet' - Valid syntax: snippet [var]" case: "Syntax Error in 'case' - Valid syntax: case [condition]" case_invalid_when: "Syntax Error in tag 'case' - Valid when condition: {% when [condition] [or condition2...] %}" case_invalid_else: "Syntax Error in tag 'case' - Valid else condition: {% else %} (no parameters) " diff --git a/lib/liquid/tags/render.rb b/lib/liquid/tags/render.rb index dd1a7a18..3e9237f7 100644 --- a/lib/liquid/tags/render.rb +++ b/lib/liquid/tags/render.rb @@ -128,12 +128,9 @@ module Liquid end def rigid_template_name(p) - if p.look(:string) - p.consume(:string) - # inline snippets use variable identifiers - elsif p.look(:id) - p.consume(:id) - end + return p.consume(:string) if p.look(:string) + + p.consume(:id) if p.look(:id) end def strict_parse(markup) @@ -153,7 +150,7 @@ module Liquid @is_for_loop = (with_or_for == FOR) @attributes = {} - markup.scan(/(#{ContextInheritance})|#{TagAttributes.source}/) do |context_marker, key, value| + markup.scan(/(\.\.\.)(?=\s|,|$)|#{TagAttributes.source}/) do |context_marker, key, value| if context_marker @attributes.delete("...") @attributes["..."] = true diff --git a/lib/liquid/tags/snippet.rb b/lib/liquid/tags/snippet.rb index aede69b7..cf6ef756 100644 --- a/lib/liquid/tags/snippet.rb +++ b/lib/liquid/tags/snippet.rb @@ -2,7 +2,7 @@ module Liquid # @liquid_type tag - # @liquid_category theme + # @liquid_category variable # @liquid_name snippet # @liquid_summary # Creates a new inline snippet. @@ -14,8 +14,6 @@ module Liquid # {% endsnippet %} class Snippet < Block - SYNTAX = /(#{VariableSignature}+)/o - def initialize(tag_name, markup, options) super p = @parse_context.new_parser(markup) @@ -29,6 +27,10 @@ module Liquid def render_to_output_buffer(context, output) snippet_drop = SnippetDrop.new(@body) context.scopes.last[@to] = snippet_drop + + snippet_size = @body.nodelist.sum { |node| node.to_s.bytesize } + context.resource_limits.increment_assign_score(snippet_size) + output end diff --git a/test/integration/tags/snippet_test.rb b/test/integration/tags/snippet_test.rb index 38fe599a..4906437d 100644 --- a/test/integration/tags/snippet_test.rb +++ b/test/integration/tags/snippet_test.rb @@ -1238,4 +1238,12 @@ class SnippetTest < Minitest::Test assert_template_result(expected, template, error_mode: :rigid) end end + + class ResourceLimits < SnippetTest + def test_increment_assign_score_by_bytes_not_characters + t = Template.parse("{% snippet foo %}すごい{% endsnippet %}") + t.render! + assert_equal(9, t.resource_limits.assign_score) + end + end end