mirror of
https://github.com/Shopify/liquid.git
synced 2026-09-12 23:40:45 -07:00
Refactor to create tags with a parse class method instead of new.
By moving parse out of the initializer, we can call super at the start of the initializers for subclasses, and avoid the nasty allocate hack.
This commit is contained in:
+1
-1
@@ -31,7 +31,7 @@ module Liquid
|
||||
|
||||
# fetch the tag from registered blocks
|
||||
if tag = Template.tags[$1]
|
||||
new_tag = tag.new_with_options($1, $2, tokens, @options || {})
|
||||
new_tag = tag.parse($1, $2, tokens, @options)
|
||||
@blank &&= new_tag.blank?
|
||||
@nodelist << new_tag
|
||||
@children << new_tag
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
module Liquid
|
||||
class Document < Block
|
||||
# we don't need markup to open this block
|
||||
def initialize(tokens, options = {})
|
||||
@options = options
|
||||
parse(tokens)
|
||||
def self.parse(tokens, options={})
|
||||
# we don't need markup to open this block
|
||||
super(nil, nil, tokens, options)
|
||||
end
|
||||
|
||||
# There isn't a real delimiter
|
||||
|
||||
+10
-10
@@ -3,20 +3,20 @@ module Liquid
|
||||
attr_accessor :options
|
||||
attr_reader :nodelist, :warnings
|
||||
|
||||
def self.new_with_options(tag_name, markup, tokens, options)
|
||||
# Forgive me Matz for I have sinned. I know this code is weird
|
||||
# but it was necessary to maintain API compatibility.
|
||||
new_tag = self.allocate
|
||||
new_tag.options = options
|
||||
new_tag.send(:initialize, tag_name, markup, tokens)
|
||||
new_tag
|
||||
class << self
|
||||
def parse(tag_name, markup, tokens, options)
|
||||
tag = new(tag_name, markup, options)
|
||||
tag.parse(tokens)
|
||||
tag
|
||||
end
|
||||
|
||||
private :new
|
||||
end
|
||||
|
||||
def initialize(tag_name, markup, tokens)
|
||||
def initialize(tag_name, markup, options)
|
||||
@tag_name = tag_name
|
||||
@markup = markup
|
||||
@options ||= {} # needs || because might be set before initialize
|
||||
parse(tokens)
|
||||
@options = options
|
||||
end
|
||||
|
||||
def parse(tokens)
|
||||
|
||||
@@ -11,15 +11,14 @@ module Liquid
|
||||
class Assign < Tag
|
||||
Syntax = /(#{VariableSignature}+)\s*=\s*(.*)\s*/o
|
||||
|
||||
def initialize(tag_name, markup, tokens)
|
||||
def initialize(tag_name, markup, options)
|
||||
super
|
||||
if markup =~ Syntax
|
||||
@to = $1
|
||||
@from = Variable.new($2)
|
||||
else
|
||||
raise SyntaxError.new options[:locale].t("errors.syntax.assign")
|
||||
end
|
||||
|
||||
super
|
||||
end
|
||||
|
||||
def render(context)
|
||||
|
||||
@@ -14,14 +14,13 @@ module Liquid
|
||||
class Capture < Block
|
||||
Syntax = /(\w+)/
|
||||
|
||||
def initialize(tag_name, markup, tokens)
|
||||
def initialize(tag_name, markup, options)
|
||||
super
|
||||
if markup =~ Syntax
|
||||
@to = $1
|
||||
else
|
||||
raise SyntaxError.new(options[:locale].t("errors.syntax.capture"))
|
||||
end
|
||||
|
||||
super
|
||||
end
|
||||
|
||||
def render(context)
|
||||
|
||||
@@ -3,7 +3,8 @@ module Liquid
|
||||
Syntax = /(#{QuotedFragment})/o
|
||||
WhenSyntax = /(#{QuotedFragment})(?:(?:\s+or\s+|\s*\,\s*)(#{QuotedFragment}.*))?/o
|
||||
|
||||
def initialize(tag_name, markup, tokens)
|
||||
def initialize(tag_name, markup, options)
|
||||
super
|
||||
@blocks = []
|
||||
|
||||
if markup =~ Syntax
|
||||
@@ -11,8 +12,6 @@ module Liquid
|
||||
else
|
||||
raise SyntaxError.new(options[:locale].t("errors.syntax.case"))
|
||||
end
|
||||
|
||||
super
|
||||
end
|
||||
|
||||
def nodelist
|
||||
|
||||
@@ -15,7 +15,8 @@ module Liquid
|
||||
SimpleSyntax = /\A#{QuotedFragment}+/o
|
||||
NamedSyntax = /\A(#{QuotedFragment})\s*\:\s*(.*)/o
|
||||
|
||||
def initialize(tag_name, markup, tokens)
|
||||
def initialize(tag_name, markup, options)
|
||||
super
|
||||
case markup
|
||||
when NamedSyntax
|
||||
@variables = variables_from_string($2)
|
||||
@@ -26,7 +27,6 @@ module Liquid
|
||||
else
|
||||
raise SyntaxError.new(options[:locale].t("errors.syntax.cycle"))
|
||||
end
|
||||
super
|
||||
end
|
||||
|
||||
def render(context)
|
||||
|
||||
@@ -19,10 +19,9 @@ module Liquid
|
||||
# Hello: -3
|
||||
#
|
||||
class Decrement < Tag
|
||||
def initialize(tag_name, markup, tokens)
|
||||
@variable = markup.strip
|
||||
|
||||
def initialize(tag_name, markup, options)
|
||||
super
|
||||
@variable = markup.strip
|
||||
end
|
||||
|
||||
def render(context)
|
||||
|
||||
@@ -46,10 +46,10 @@ module Liquid
|
||||
class For < Block
|
||||
Syntax = /\A(#{VariableSegment}+)\s+in\s+(#{QuotedFragment}+)\s*(reversed)?/o
|
||||
|
||||
def initialize(tag_name, markup, tokens)
|
||||
def initialize(tag_name, markup, options)
|
||||
super
|
||||
parse_with_selected_parser(markup)
|
||||
@nodelist = @for_block = []
|
||||
super
|
||||
end
|
||||
|
||||
def nodelist
|
||||
|
||||
@@ -14,10 +14,10 @@ module Liquid
|
||||
ExpressionsAndOperators = /(?:\b(?:\s?and\s?|\s?or\s?)\b|(?:\s*(?!\b(?:\s?and\s?|\s?or\s?)\b)(?:#{QuotedFragment}|\S+)\s*)+)/o
|
||||
BOOLEAN_OPERATORS = %w(and or)
|
||||
|
||||
def initialize(tag_name, markup, tokens)
|
||||
def initialize(tag_name, markup, options)
|
||||
super
|
||||
@blocks = []
|
||||
push_block('if', markup)
|
||||
super
|
||||
end
|
||||
|
||||
def nodelist
|
||||
|
||||
@@ -17,7 +17,9 @@ module Liquid
|
||||
class Include < Tag
|
||||
Syntax = /(#{QuotedFragment}+)(\s+(?:with|for)\s+(#{QuotedFragment}+))?/o
|
||||
|
||||
def initialize(tag_name, markup, tokens)
|
||||
def initialize(tag_name, markup, options)
|
||||
super
|
||||
|
||||
if markup =~ Syntax
|
||||
|
||||
@template_name = $1
|
||||
@@ -31,8 +33,6 @@ module Liquid
|
||||
else
|
||||
raise SyntaxError.new(options[:locale].t("errors.syntax.include"))
|
||||
end
|
||||
|
||||
super
|
||||
end
|
||||
|
||||
def parse(tokens)
|
||||
|
||||
@@ -15,9 +15,9 @@ module Liquid
|
||||
# Hello: 2
|
||||
#
|
||||
class Increment < Tag
|
||||
def initialize(tag_name, markup, tokens)
|
||||
@variable = markup.strip
|
||||
def initialize(tag_name, markup, options)
|
||||
super
|
||||
@variable = markup.strip
|
||||
end
|
||||
|
||||
def render(context)
|
||||
|
||||
@@ -2,7 +2,8 @@ module Liquid
|
||||
class TableRow < Block
|
||||
Syntax = /(\w+)\s+in\s+(#{QuotedFragment}+)/o
|
||||
|
||||
def initialize(tag_name, markup, tokens)
|
||||
def initialize(tag_name, markup, options)
|
||||
super
|
||||
if markup =~ Syntax
|
||||
@variable_name = $1
|
||||
@collection_name = $2
|
||||
@@ -13,8 +14,6 @@ module Liquid
|
||||
else
|
||||
raise SyntaxError.new(options[:locale].t("errors.syntax.table_row"))
|
||||
end
|
||||
|
||||
super
|
||||
end
|
||||
|
||||
def render(context)
|
||||
|
||||
@@ -72,7 +72,7 @@ module Liquid
|
||||
# Parse source code.
|
||||
# Returns self for easy chaining
|
||||
def parse(source, options = {})
|
||||
@root = Document.new(tokenize(source), DEFAULT_OPTIONS.merge(options))
|
||||
@root = Document.parse(tokenize(source), DEFAULT_OPTIONS.merge(options))
|
||||
@warnings = nil
|
||||
self
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user