curly_bracket_parser 0.1.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +1 -5
- data/lib/curly_bracket_parser.rb +144 -20
- data/lib/curly_bracket_parser/version.rb +1 -1
- data/lib/custom_errors/filter_already_registered_error.rb +2 -0
- data/lib/custom_errors/invalid_filter_error.rb +2 -0
- data/lib/custom_errors/invalid_variable_error.rb +2 -0
- data/lib/custom_errors/variable_already_registered_error.rb +2 -0
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3d129cee0f2fe16c754b7b4f10d31505d8279dc4399c03e94bab98f9c86b9c60
|
4
|
+
data.tar.gz: 4477f5908c20c4f3513705dd973f702a6addd118f8aab221cab9bc3c751167f4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 633664bae5c9062f5d71a0ec643db1c957b936e88a5fae88a7dda9cbb80d12d2682e37d4b8da33cd1c7a1fdd52e28a169a792bdb66ae004fb716fef4cb595c22
|
7
|
+
data.tar.gz: a6aebeae6ee35a392fe90b8d6d59838abb4bb49097ef2048c4e62fcddd95c61837cffc20c5367d8a3a77a4f2b3035ddbea12ae1b7ab7b249957200836ba876cf
|
data/README.md
CHANGED
@@ -1,15 +1,11 @@
|
|
1
1
|
# curly_bracket_parser
|
2
2
|
|
3
|
-
|
3
|
+
Ruby gem with simple parser to replace curly brackets `{{like_this}}` inside strings like URLs, texts or even files easily.
|
4
4
|
|
5
5
|
Additional support for build-in filters and custom filters make them more powerful. `{{example|my_filter}}`
|
6
6
|
|
7
7
|
Using [LuckyCase](https://github.com/magynhard/lucky_case), all its case formats are supported as filter.
|
8
8
|
|
9
|
-
```diff
|
10
|
-
- beta version
|
11
|
-
```
|
12
|
-
|
13
9
|
|
14
10
|
|
15
11
|
|
data/lib/curly_bracket_parser.rb
CHANGED
@@ -1,7 +1,11 @@
|
|
1
1
|
require 'lucky_case'
|
2
2
|
|
3
3
|
require 'curly_bracket_parser/version'
|
4
|
+
require_relative 'custom_errors/filter_already_registered_error'
|
5
|
+
require_relative 'custom_errors/invalid_filter_error'
|
6
|
+
require_relative 'custom_errors/invalid_variable_error'
|
4
7
|
require_relative 'custom_errors/unresolved_variables_error'
|
8
|
+
require_relative 'custom_errors/variable_already_registered_error'
|
5
9
|
|
6
10
|
#
|
7
11
|
# CurlyBracketParser
|
@@ -17,8 +21,8 @@ module CurlyBracketParser
|
|
17
21
|
VARIABLE_DECODER_REGEX = /{{([^{}\|]+)\|?([^{}\|]*)}}/
|
18
22
|
VARIABLE_REGEX = /{{[^{}]+}}/
|
19
23
|
|
20
|
-
|
21
|
-
|
24
|
+
VALID_DEFAULT_FILTERS = [
|
25
|
+
LuckyCase::CASES.keys.map(&:to_s)
|
22
26
|
].flatten
|
23
27
|
|
24
28
|
#----------------------------------------------------------------------------------------------------
|
@@ -31,13 +35,21 @@ module CurlyBracketParser
|
|
31
35
|
# @param [String] replace_pattern pattern used when param unresolved_vars is set to :replace. You can include the var name \\1 and filter \\1. Empty string to remove unresolved variables.
|
32
36
|
# @return [String, UnresolvedVariablesError] parsed string
|
33
37
|
def self.parse(string, variables, unresolved_vars: :raise, replace_pattern: "##\\1##")
|
38
|
+
variables ||= {}
|
34
39
|
result_string = string.clone
|
35
40
|
if CurlyBracketParser.any_variable_included? string
|
36
41
|
loop do
|
37
42
|
variables(string).each do |string_var|
|
38
43
|
name, filter = decode_variable(string_var)
|
39
44
|
if variables[name.to_sym]
|
40
|
-
value =
|
45
|
+
value = if filter
|
46
|
+
process_filter(filter, variables[name.to_sym])
|
47
|
+
else
|
48
|
+
variables[name.to_sym]
|
49
|
+
end
|
50
|
+
result_string.gsub!(string_var, value)
|
51
|
+
elsif registered_default_var?(name.to_s)
|
52
|
+
value = process_default_var(name)
|
41
53
|
result_string.gsub!(string_var, value)
|
42
54
|
end
|
43
55
|
end
|
@@ -89,42 +101,154 @@ module CurlyBracketParser
|
|
89
101
|
|
90
102
|
# Register your custom filter to the filter list
|
91
103
|
#
|
92
|
-
# @param [String] name of the filter, also used then in your strings, e.g. {{var_name|my_filter_name}}
|
104
|
+
# @param [String] filter name of the filter, also used then in your strings, e.g. {{var_name|my_filter_name}}
|
93
105
|
# @param [Lambda] function of the filter to run the variable against
|
94
106
|
# @return [Boolean] true if filter was added, false if it already exists
|
95
|
-
def self.register_filter(
|
96
|
-
|
107
|
+
def self.register_filter(filter, &block)
|
108
|
+
@@registered_filters ||= {}
|
109
|
+
filter = filter.to_s
|
110
|
+
if valid_filter?(filter)
|
111
|
+
raise FilterAlreadyRegisteredError, "The given filter name '#{filter}' is already registered"
|
112
|
+
else
|
113
|
+
@@registered_filters[filter] = block
|
114
|
+
end
|
97
115
|
end
|
98
116
|
|
99
117
|
#----------------------------------------------------------------------------------------------------
|
100
118
|
|
101
|
-
|
102
|
-
|
119
|
+
# @param [String] filter name of the filter, also used then in your strings, e.g. {{var_name|my_filter_name}}
|
120
|
+
# @param [String] value string to apply the specified filter on
|
121
|
+
# @return [String] converted string with applied filter
|
122
|
+
def self.process_filter(filter, value)
|
123
|
+
@@registered_filters ||= {}
|
124
|
+
filter = filter.to_s
|
125
|
+
if @@registered_filters[filter]
|
126
|
+
@@registered_filters[filter].call(value)
|
127
|
+
elsif VALID_DEFAULT_FILTERS.include?(filter) && LuckyCase.valid_case_type?(filter)
|
128
|
+
LuckyCase.convert_case(value, filter)
|
129
|
+
else
|
130
|
+
message = "Invalid filter '#{filter}'. Valid filters are: #{self.valid_filters.join(' ')}"
|
131
|
+
raise InvalidFilterError, message
|
132
|
+
end
|
103
133
|
end
|
104
134
|
|
105
135
|
#----------------------------------------------------------------------------------------------------
|
106
136
|
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
137
|
+
# Retrieve Array with valid filters
|
138
|
+
#
|
139
|
+
# @return [Array<String>] of valid filters
|
140
|
+
def self.valid_filters
|
141
|
+
all_filters = VALID_DEFAULT_FILTERS
|
142
|
+
@@registered_filters ||= {}
|
143
|
+
all_filters + @@registered_filters.keys.map(&:to_s)
|
144
|
+
end
|
145
|
+
|
146
|
+
#----------------------------------------------------------------------------------------------------
|
147
|
+
|
148
|
+
# Check if a given filter is valid
|
149
|
+
#
|
150
|
+
# @param [String] name
|
151
|
+
# @return [Boolean] true if filter exists, otherwise false
|
152
|
+
def self.valid_filter?(name)
|
153
|
+
self.valid_filters.include? name
|
118
154
|
end
|
119
155
|
|
120
156
|
#----------------------------------------------------------------------------------------------------
|
121
157
|
|
158
|
+
# Check if given variable has a defined filter
|
159
|
+
# @example
|
160
|
+
# {{variable|filter}} => has filter, true
|
161
|
+
# {{variable2}} => has no filter, false
|
162
|
+
#
|
163
|
+
# @param [String] variable
|
164
|
+
# @return [Boolean] true if has a defined filter, otherwise false
|
122
165
|
def self.has_filter?(variable)
|
123
166
|
decode_variable(variable)[:filter] != nil
|
124
167
|
end
|
125
168
|
|
126
169
|
#----------------------------------------------------------------------------------------------------
|
127
170
|
|
171
|
+
# Return the given default variable by processing its block/proc
|
172
|
+
#
|
173
|
+
# @param [String] name of the variable to return
|
174
|
+
# @return [String] value of the variable
|
175
|
+
def self.process_default_var(name)
|
176
|
+
@@registered_default_vars ||= {}
|
177
|
+
name = name.to_s
|
178
|
+
if @@registered_default_vars[name]
|
179
|
+
@@registered_default_vars[name].call()
|
180
|
+
else
|
181
|
+
message = "Invalid default variable '#{name}'. Valid registered default variables are: #{self.registered_default_vars.join(' ')}"
|
182
|
+
raise InvalidVariableError, message
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
#----------------------------------------------------------------------------------------------------
|
187
|
+
|
188
|
+
# Register a default variable to be replaced automatically by the given block value in future
|
189
|
+
# If the variable exists already, it will throw an VariableAlreadyRegisteredError
|
190
|
+
#
|
191
|
+
# @param [String] name of the default var
|
192
|
+
# @param [Proc] block
|
193
|
+
# @return [Proc] given block
|
194
|
+
def self.register_default_var(name, &block)
|
195
|
+
@@registered_default_vars ||= {}
|
196
|
+
name = name.to_s
|
197
|
+
if registered_default_var?(name)
|
198
|
+
raise VariableAlreadyRegisteredError, "The given variable name '#{name}' is already registered. If you want to override that variable explicitly, call #register_default_var! instead!"
|
199
|
+
else
|
200
|
+
@@registered_default_vars[name] = block
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
#----------------------------------------------------------------------------------------------------
|
205
|
+
|
206
|
+
# Register a default variable to be replaced automatically by the given block value in future
|
207
|
+
# If the variable exists already, it will be overwritten
|
208
|
+
#
|
209
|
+
# @param [String] name of the default var
|
210
|
+
# @param [Proc] block
|
211
|
+
# @return [Proc] given block
|
212
|
+
def self.register_default_var!(name, &block)
|
213
|
+
@@registered_default_vars ||= {}
|
214
|
+
name = name.to_s
|
215
|
+
@@registered_default_vars[name] = block
|
216
|
+
end
|
217
|
+
|
218
|
+
#----------------------------------------------------------------------------------------------------
|
219
|
+
|
220
|
+
# Unregister / remove an existing default variable
|
221
|
+
#
|
222
|
+
# @param [String] name of the variable
|
223
|
+
def self.unregister_default_var(name)
|
224
|
+
@@registered_default_vars ||= {}
|
225
|
+
name = name.to_s
|
226
|
+
@@registered_default_vars.delete(name)
|
227
|
+
nil
|
228
|
+
end
|
229
|
+
|
230
|
+
#----------------------------------------------------------------------------------------------------
|
231
|
+
|
232
|
+
# Return an array of registered default variables
|
233
|
+
#
|
234
|
+
# @return [Array<String>]
|
235
|
+
def self.registered_default_vars
|
236
|
+
@@registered_default_vars ||= {}
|
237
|
+
@@registered_default_vars.keys.map(&:to_s)
|
238
|
+
end
|
239
|
+
|
240
|
+
#----------------------------------------------------------------------------------------------------
|
241
|
+
|
242
|
+
# Check if the given variable is a registered default variable
|
243
|
+
#
|
244
|
+
# @param [String] name of the variable
|
245
|
+
# @return [Boolean] true if variable is registered, otherwise false
|
246
|
+
def self.registered_default_var?(name)
|
247
|
+
self.registered_default_vars.include? name
|
248
|
+
end
|
249
|
+
|
250
|
+
#----------------------------------------------------------------------------------------------------
|
251
|
+
|
128
252
|
# Return a hash containing separated name and filter of a variable
|
129
253
|
#
|
130
254
|
# @example
|
@@ -145,7 +269,7 @@ module CurlyBracketParser
|
|
145
269
|
def self.decoded_variables(string)
|
146
270
|
var_name = 0
|
147
271
|
var_filter = 1
|
148
|
-
string.scan(VARIABLE_DECODER_REGEX).map { |e| {"#{e[var_name].strip}": e[var_filter].strip != '' ? e[var_filter].strip : nil } }.flatten
|
272
|
+
string.scan(VARIABLE_DECODER_REGEX).map { |e| { "#{e[var_name].strip}": e[var_filter].strip != '' ? e[var_filter].strip : nil } }.flatten
|
149
273
|
end
|
150
274
|
|
151
275
|
#----------------------------------------------------------------------------------------------------
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: curly_bracket_parser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matthäus Beyrle
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-01-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: lucky_case
|
@@ -85,7 +85,11 @@ files:
|
|
85
85
|
- curly_bracket_parser.gemspec
|
86
86
|
- lib/curly_bracket_parser.rb
|
87
87
|
- lib/curly_bracket_parser/version.rb
|
88
|
+
- lib/custom_errors/filter_already_registered_error.rb
|
89
|
+
- lib/custom_errors/invalid_filter_error.rb
|
90
|
+
- lib/custom_errors/invalid_variable_error.rb
|
88
91
|
- lib/custom_errors/unresolved_variables_error.rb
|
92
|
+
- lib/custom_errors/variable_already_registered_error.rb
|
89
93
|
homepage: https://github.com/magynhard/curly_bracket_parser
|
90
94
|
licenses:
|
91
95
|
- MIT
|