liquid-tag-parser 1.3.0 → 1.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/liquid/tag/parser.rb +66 -32
- data/lib/liquid/tag/parser/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ed525307344e34bf3973bfdec1cafa204c415444
|
4
|
+
data.tar.gz: 738a4cfc00bddcd073551a21e2328f7930451ef5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 863073381e60b53b0390d588b65799bb38250411e5ce26dfb4a5aa89a4123705fe6feaacf611f6fe1ba33085cca1d65b8ba9a85d145dec039183f467d3bab5c6
|
7
|
+
data.tar.gz: 8e8e8004f69e6f085714ae6634bd5e41e2b323ff8d26120b24ffa0bd8c91ba0ca3a0b711411cdf474a6c0c75fa10415faf1424a294060b70217c5d1acf7a866e
|
data/lib/liquid/tag/parser.rb
CHANGED
@@ -26,13 +26,17 @@ module Liquid
|
|
26
26
|
rb_delegate :args_with_indifferent_access, to: :@args, \
|
27
27
|
alias_of: :with_indifferent_access
|
28
28
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
29
|
+
FLOAT = /^\d+\.\d+$/
|
30
|
+
BOOLEAN = /^(?<!\\)(\!|@)/
|
31
|
+
NEGATIVE_BOOLEAN = /^(?<!\\)\!/
|
32
|
+
BOOLEAN_QUOTE_REPLACEMENT = "\\1\\\\\\2"
|
33
|
+
SHELLSPLIT = /\G\s*(?>([^\s\\\'\"]+)|'([^\']*)'|"((?:[^\"\\]|\\.)*)"|(\\.?)|(\S))(\s|\z)?/m
|
34
|
+
BOOLEAN_QUOTE = /^('|")((?<!\\)@|(?<!\\)\!)/
|
35
|
+
POSITIVE_BOOLEAN = /^(?<!\\)\@/
|
36
|
+
ESCAPED_BOOLEAN = /\\(@|\!)/
|
37
|
+
KEY = /\b(?<!\\):/
|
38
|
+
INT = /^\d+$/
|
34
39
|
|
35
|
-
# --
|
36
40
|
def initialize(raw, defaults: {}, sep: "=")
|
37
41
|
@sep = sep
|
38
42
|
@rsep = Regexp.escape(sep)
|
@@ -46,12 +50,13 @@ module Liquid
|
|
46
50
|
parse
|
47
51
|
end
|
48
52
|
|
49
|
-
# --
|
50
53
|
def to_html(skip: [], hash: false)
|
51
54
|
out = @args.each_with_object(hash ? {} : []) do |(k, v), o|
|
52
|
-
next if k == :argv1
|
53
|
-
|
54
|
-
|
55
|
+
next if k == :argv1
|
56
|
+
next if v.is_a?(Array)
|
57
|
+
next if skip.include?(k)
|
58
|
+
next if v.is_a?(Hash)
|
59
|
+
next if v == false
|
55
60
|
|
56
61
|
o[k] = v if hash
|
57
62
|
unless hash
|
@@ -62,28 +67,32 @@ module Liquid
|
|
62
67
|
hash ? out : out.join(" ")
|
63
68
|
end
|
64
69
|
|
65
|
-
# --
|
66
70
|
private
|
67
|
-
def
|
68
|
-
|
69
|
-
|
70
|
-
&& args.first !~ @sep_regexp
|
71
|
+
def argv1(args)
|
72
|
+
val = args[0]
|
73
|
+
hash = {}
|
71
74
|
|
75
|
+
# !"@true" && !"key1:key2=val" but "argv1 @true key1:key2=val"
|
76
|
+
if val !~ BOOLEAN && val !~ KEY && val !~ @sep_regexp
|
72
77
|
hash = {
|
73
|
-
:
|
78
|
+
argv1: args.delete_at(0)
|
74
79
|
}
|
75
80
|
end
|
76
81
|
|
82
|
+
return args, hash
|
83
|
+
end
|
84
|
+
|
85
|
+
private
|
86
|
+
def parse
|
87
|
+
args, hash = argv1(from_shellwords)
|
77
88
|
@args = @defaults.deep_merge(args.each_with_object(hash) do |k, h, out = h|
|
78
89
|
keys, _, val = k.rpartition(@sep_regexp)
|
79
90
|
|
80
|
-
val = val.gsub(@escaped_sep_regexp, @sep)
|
81
|
-
if keys.empty? && val =~
|
82
|
-
|
83
|
-
|
84
|
-
end
|
91
|
+
val = val.gsub(@escaped_sep_regexp, @sep) # Unescape \\=
|
92
|
+
keys = val.gsub(BOOLEAN, "") if keys.empty? && val =~ BOOLEAN # @true
|
93
|
+
keys, val = val, nil if keys.empty? # key val
|
94
|
+
keys = keys.split(KEY).map(&:to_sym)
|
85
95
|
|
86
|
-
keys = keys.split(KEY_REGEXP).map(&:to_sym)
|
87
96
|
if keys.size > 1
|
88
97
|
h = h[keys[0]] ||= {}
|
89
98
|
keys[1...-1].each do |sk|
|
@@ -91,29 +100,54 @@ module Liquid
|
|
91
100
|
end
|
92
101
|
end
|
93
102
|
|
94
|
-
val =
|
95
|
-
val = val.to_f if val =~
|
96
|
-
val = false
|
97
|
-
val =
|
98
|
-
val =
|
99
|
-
val = true
|
103
|
+
val = val.to_i if val =~ INT # key=1
|
104
|
+
val = val.to_f if val =~ FLOAT # key=0.1
|
105
|
+
val = false if val == "false" # key=false
|
106
|
+
val = false if val =~ NEGATIVE_BOOLEAN # !false
|
107
|
+
val = true if val =~ POSITIVE_BOOLEAN # @true
|
108
|
+
val = true if val == "true" # key=true
|
109
|
+
|
110
|
+
if val.is_a?(String)
|
111
|
+
then val = val.gsub(ESCAPED_BOOLEAN, "\\1")
|
112
|
+
end
|
100
113
|
|
101
114
|
key = keys.last.to_sym
|
102
115
|
h[key] << val if h[key].is_a?(Array)
|
103
|
-
h[key] = [h[key]] << val if h[key]
|
116
|
+
h[key] = [h[key]].flatten << val if h[key] && !h[key].is_a?(Array)
|
104
117
|
h[key] = val unless h[key]
|
105
118
|
|
106
119
|
out
|
107
120
|
end)
|
108
121
|
end
|
109
122
|
|
110
|
-
# --
|
111
123
|
private
|
112
124
|
def from_shellwords
|
113
|
-
|
114
|
-
v.gsub(@sep_regexp, @escaped_sep)
|
125
|
+
shellsplit(@raw.gsub(/('|")([^\1]+)\1/) do |v|
|
126
|
+
v.gsub(BOOLEAN_QUOTE, BOOLEAN_QUOTE_REPLACEMENT).gsub(@sep_regexp, @escaped_sep)
|
115
127
|
end)
|
116
128
|
end
|
129
|
+
|
130
|
+
# Because Shellwords.shellwords on < 2.4 has problems
|
131
|
+
# with quotes and \\, we ported this back, this pretty
|
132
|
+
# much the same thing except we replace some of the
|
133
|
+
# questionable code like `String.new`
|
134
|
+
private
|
135
|
+
def shellsplit(line)
|
136
|
+
out, field = [], ""
|
137
|
+
|
138
|
+
line.scan(SHELLSPLIT) do |w, s, d, e, g, se|
|
139
|
+
raise ArgumentError, "Unmatched double quote: #{line.inspect}" if g
|
140
|
+
field = field + (w || s || (d && d.gsub(/\\([$`"\\\n])/, '\\1')) \
|
141
|
+
|| e.gsub(/\\(.)/, '\\1'))
|
142
|
+
|
143
|
+
if se
|
144
|
+
out << field
|
145
|
+
field = ""
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
out
|
150
|
+
end
|
117
151
|
end
|
118
152
|
end
|
119
153
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: liquid-tag-parser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jordon Bedwell
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-10-
|
11
|
+
date: 2017-10-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -102,7 +102,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
102
102
|
version: '0'
|
103
103
|
requirements: []
|
104
104
|
rubyforge_project:
|
105
|
-
rubygems_version: 2.6.
|
105
|
+
rubygems_version: 2.6.14
|
106
106
|
signing_key:
|
107
107
|
specification_version: 4
|
108
108
|
summary: Parse liquid tags like a professional
|