curly_bracket_parser 1.0.4 → 1.1.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dbc6e9152c4a5928dd20a24cc8cb59ace5b9c5b5b66204b118061b28cff3f33b
4
- data.tar.gz: 851fa1b633944e37968d31755b786939bea79afa624b4e2135167bb3e832555c
3
+ metadata.gz: 40d43493980369bc381be05ab5ba6b68051555646e5d04c6baaaf0fb90e947a1
4
+ data.tar.gz: f51aaa5658b30890774a4aa8027e702ada49cabdf575192cdfb4913b9bd1c63e
5
5
  SHA512:
6
- metadata.gz: 162491b1ca8833964b29e38482806b479f6f1ab5d9f0505368ce83b219e9fe3953d2a03aac4d592ade1ad5182365ca344c471f5847cb9abd36a849dd0c8925f5
7
- data.tar.gz: 697839790e56524019c7e35a2ebb58f441f27f74458cfbf2d6f4bf1e91d038e777368b9a637f20c2d48d7fe022baa3d8188ac439d400bf524989cb28731812a3
6
+ metadata.gz: 9ca8945a471c2404407c0c19fbbdcc7b19f5a65631f0c8b55d617c24713193c93ebd2a07b57b81e0ae517cd5e4a5ea3483c4006ab0dc64b157f8a88144c5595a
7
+ data.tar.gz: 14251164b9fcce7ce7f0721c5275655135387a7fd8688ad2f1651cc9b3e52a4f98d8ed411591d505fbefa63f64018bd58daf0dbedb99945522d6b8b94701dbb5
data/README.md CHANGED
@@ -50,15 +50,25 @@ You can either parse variables inside strings or even directly in files.
50
50
 
51
51
  ```ruby
52
52
  url = "https://my-domain.com/items/{{item_id}}"
53
- final_url = CurlyBracketParser.parse url, item_id: 123
53
+ final_url = CurlyBracketParser.parse url, { item_id: 123 }
54
54
  # => "https://my-domain.com/items/123"
55
55
  ```
56
56
 
57
+ Nested variables are supported as well:
58
+ ```ruby
59
+ tmpl = "This is my template with {{my_nested_variable}}";
60
+ my_nested_variable = "my {{nested}} variable";
61
+ parsed_tmpl = CurlyBracketParser.parse tmpl, { my_nested_variable: my_nested_variable, nested: 'pizza'}
62
+ # => "This is my template with my pizza variable"
63
+ ```
64
+
65
+
66
+
57
67
  ### Filters
58
68
 
59
69
  ```ruby
60
70
  url = "https://my-domain.com/catalog/{{item_name|snake_case}}"
61
- final_url = CurlyBracketParser.parse url, item_name: 'MegaSuperItem'
71
+ final_url = CurlyBracketParser.parse url, { item_name: 'MegaSuperItem' }
62
72
  # => "https://my-domain.com/catalog/mega_super_item"
63
73
  ```
64
74
 
@@ -72,10 +82,26 @@ For a list of built-in filters visit [LuckyCase](https://github.com/magynhard/lu
72
82
  end
73
83
 
74
84
  text = "Paul went out and screamed: A{{scream|7times}}h"
75
- final_text = CurlyBracketParser.parse text, scream: 'a'
85
+ final_text = CurlyBracketParser.parse text, { scream: 'a' }
76
86
  # => "Paul went out and screamed: Aaaaaaaah"
77
87
  ```
78
88
 
89
+
90
+ ### Value variables
91
+
92
+ For special cases you can directly define or set variables inside the template - usually it does only make sense, if you combine them with custom filters.
93
+
94
+ You can either use quotes to define a string or numbers (integer or floating point) directly.
95
+
96
+ Empty values are possible as well. They are equal to a empty string.
97
+
98
+ ```ruby
99
+ tmpl = %Q(This is a {{'string'|pascal_case}} and today is {{"today"|date_filter}}. Peter is {{'1990-10-05'|iso_date_age}} years old. His girlfriends name is {{girl|pascal_case}} and she is {{16|double_number}} years old. This article has been written at {{|date_now_formatted}}`)
100
+ parsed = CurlyBracketParser.parse tmpl, { girl: "anna" }
101
+ # => "This is a String and today is 2022-06-27. Peter is 32 years old. His girlfriends name is Anna and she is 32 years old. This article has been written at 6/28/2022, 12:46:40 PM."
102
+ ```
103
+
104
+
79
105
  ### Files
80
106
 
81
107
  <ins>test.html</ins>
@@ -84,7 +110,7 @@ For a list of built-in filters visit [LuckyCase](https://github.com/magynhard/lu
84
110
  ```
85
111
 
86
112
  ```ruby
87
- parsed_file = CurlyBracketParser.parse_file './test.html', title: 'WelcomeAtHome'
113
+ parsed_file = CurlyBracketParser.parse_file './test.html', { title: 'WelcomeAtHome' }
88
114
  # => "<h1>Welcome at home</h1>"
89
115
  ```
90
116
 
@@ -104,7 +130,7 @@ Because of providing blocks, your variables can dynamically depend on other stat
104
130
  text = "You are running version {{version}}"
105
131
  CurlyBracketParser.parse text
106
132
  # => "You are running version 1.0.2"
107
- CurlyBracketParser.parse text, version: '0.7.0'
133
+ CurlyBracketParser.parse text, { version: '0.7.0' }
108
134
  # => "You are running version 0.7.0"
109
135
  ```
110
136
 
@@ -1,3 +1,3 @@
1
1
  module CurlyBracketParser
2
- VERSION = '1.0.4'.freeze
2
+ VERSION = '1.1.6'.freeze
3
3
  end
@@ -18,8 +18,8 @@ require_relative 'custom_errors/variable_already_registered_error'
18
18
  module CurlyBracketParser
19
19
 
20
20
  # {{variable_name|optional_filter}}
21
- VARIABLE_DECODER_REGEX = /{{([^{}\|]+)\|?([^{}\|]*)}}/
22
- VARIABLE_REGEX = /{{[^{}]+}}/
21
+ VARIABLE_DECODER_REGEX = /{{([^{}\|]*)\|?([^{}\|]*)}}/
22
+ VARIABLE_REGEX = /{{[^{}]*}}/
23
23
 
24
24
  VALID_DEFAULT_FILTERS = [
25
25
  LuckyCase::CASES.keys.map(&:to_s)
@@ -31,11 +31,15 @@ module CurlyBracketParser
31
31
  #
32
32
  # @param [String] string to parse
33
33
  # @param [Hash<Symbol => String>] variables <key: 'value'>
34
- # @param [Symbol] unresolved_vars :raise, :keep, :replace => define how to act when unresolved variables within the string are found.
35
- # @param [String] replace_pattern pattern used when param unresolved_vars is set to :replace. You can include the var name \\1 and filter \\2. Empty string to remove unresolved variables.
34
+ # @param [Hash] options
35
+ # @param [Symbol] options.unresolved_vars :raise, :keep, :replace => define how to act when unresolved variables within the string are found.
36
+ # @param [String] options.replace_pattern pattern used when param unresolved_vars is set to :replace. You can include the var name \\1 and filter \\2. Empty string to remove unresolved variables.
36
37
  # @return [String, UnresolvedVariablesError] parsed string
37
- def self.parse(string, variables, unresolved_vars: :raise, replace_pattern: "##\\1##")
38
+ def self.parse(string, variables = {}, options = { unresolved_vars: :raise, replace_pattern: "##\\1##" })
38
39
  variables ||= {}
40
+ options ||= {}
41
+ options[:unresolved_vars] = :raise unless options[:unresolved_vars]
42
+ options[:replace_pattern] = "##\\1##" unless options[:replace_pattern]
39
43
  result_string = string.clone
40
44
  # symbolize keys
41
45
  variables = variables.map { |key, value| [key.to_sym, value] }.to_h
@@ -43,18 +47,24 @@ module CurlyBracketParser
43
47
  loop do
44
48
  variables(result_string).each do |string_var|
45
49
  dec = decode_variable(string_var)
46
- name = dec[:name]
50
+ name = !dec[:name] || dec[:name] == '' ? "''" : dec[:name]
47
51
  filter = dec[:filter]
48
- if variables[name.to_sym]
49
- value = if filter
50
- process_filter(filter, variables[name.to_sym])
51
- else
52
- variables[name.to_sym]
53
- end
54
- result_string.gsub!(string_var, value)
52
+ value = nil
53
+ is_single_quoted = name.start_with?("'") && name.end_with?("'")
54
+ is_double_quoted = name.start_with?('"') && name.end_with?('"')
55
+ # When the name itself is quoted as string or is a number, we use it as a value itself
56
+ if is_single_quoted || is_double_quoted
57
+ value = name[1...-1]
58
+ elsif CurlyBracketParser.number_string? name
59
+ value = eval(name)
60
+ elsif variables[name.to_sym]
61
+ value = variables[name.to_sym]
55
62
  elsif registered_default_var?(name.to_s)
56
63
  value = process_default_var(name)
57
- result_string.gsub!(string_var, value)
64
+ end
65
+ if value
66
+ value = process_filter(filter, value) if filter
67
+ result_string.gsub!(string_var, value.to_s)
58
68
  end
59
69
  end
60
70
  # break if no more given variable is available
@@ -62,13 +72,13 @@ module CurlyBracketParser
62
72
  break
63
73
  end
64
74
  end
65
- case unresolved_vars
75
+ case options[:unresolved_vars]
66
76
  when :raise
67
77
  if any_variable_included? result_string
68
78
  raise UnresolvedVariablesError, "There are unresolved variables in the given string: #{variables(result_string)}"
69
79
  end
70
80
  when :replace
71
- result_string.gsub!(VARIABLE_DECODER_REGEX, replace_pattern)
81
+ result_string.gsub!(VARIABLE_DECODER_REGEX, options[:replace_pattern])
72
82
  end
73
83
  end
74
84
  result_string
@@ -314,4 +324,32 @@ module CurlyBracketParser
314
324
 
315
325
  #----------------------------------------------------------------------------------------------------
316
326
 
327
+ #
328
+ # Check if given variable is a valid number inside a string that evaluates to a number in Ruby.
329
+ #
330
+ # @example
331
+ # # valid number strings
332
+ # '200'
333
+ # '25.75'
334
+ # '500_000'
335
+ # '0x1fF'
336
+ #
337
+ # @param [String] name
338
+ # @return [Boolean]
339
+ def self.number_string?(name)
340
+ number_regex = /(^[0-9]+[0-9_]*([.][0-9_]*[0-9]+)?$|^0[xX][0-9A-Fa-f]+$)/
341
+ if (name =~ number_regex) != nil
342
+ begin
343
+ eval name
344
+ true
345
+ rescue StandardError, SyntaxError => e
346
+ false
347
+ end
348
+ else
349
+ false
350
+ end
351
+ end
352
+
353
+ #----------------------------------------------------------------------------------------------------
354
+
317
355
  end
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: 1.0.4
4
+ version: 1.1.6
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: 2022-06-22 00:00:00.000000000 Z
11
+ date: 2022-07-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: lucky_case