diff --git a/lib/jekyll/tags/include.rb b/lib/jekyll/tags/include.rb
index c4afac46..b5154d63 100644
--- a/lib/jekyll/tags/include.rb
+++ b/lib/jekyll/tags/include.rb
@@ -13,57 +13,37 @@ module Jekyll
end
end
+ MATCHER = /(?\w+)=(?:"(?[^"\\]*(?:\\.[^"\\]*)*)"|'(?[^'\\]*(?:\\.[^'\\]*)*)')/
+
def parse_params(markup)
- last_space = last_quote = pos = 0
- last_key = nil
- in_quotes = false
@params = {}
+ pos = 0
- if !(/^(\s*\b\S+="(?:\\"|.)*?")*\s*$/ =~ markup)
+ # ensure the entire markup string from start to end is valid syntax, and params are separated by spaces
+ full_matcher = Regexp.compile('\A\s*(?:(?<=\s|\A)' + MATCHER.to_s + '\s*)*\z')
+ if not markup =~ full_matcher
raise SyntaxError.new <<-eos
-Syntax error for 'include' while parsing the following markup:
+Invalid syntax for include tag:
- #{markup}
+ #{markup}
+
+Valid syntax:
+
+ {% include file.ext param='value' param2="value" %}
-Valid syntax: include param="value"
eos
end
- while pos = markup.index(/[=\"\s]/, pos)
- str = markup[pos, 1]
- if /\s/ =~ str
- last_space = pos
- elsif str == '='
- if !last_key.nil?
- raise SyntaxError.new <<-eos
-Syntax Error in tag 'include' (missing value) while parsing the following markup:
+ while match = MATCHER.match(markup, pos) do
+ pos = match.end(0)
- #{markup}
-
-Valid syntax: include param="value"
-eos
- end
- last_key = markup[last_space+1..pos-1]
- elsif str == '"' and markup[pos-1, 1] != '\\'
- in_quotes = !in_quotes
- if !in_quotes
- value = markup[last_quote+1..pos-1].gsub(/\\"/, '"')
- @params[last_key] = value
- last_key = nil
- end
- last_quote = pos
+ if match[:dvar]
+ value = match[:dvar].gsub(/\\"/, '"')
+ elsif match[:svar]
+ value = match[:svar].gsub(/\\'/, "'")
end
- pos += 1
- end
- if in_quotes
- raise SyntaxError.new <<-eos
-Syntax Error in tag 'include' (unterminated value) while parsing the following markup:
-
- #{markup}
-
-Valid syntax: include param="value"
-eos
+ @params[match[:param]] = value
end
end