diff --git a/CHANGES.md b/CHANGES.md index 666f55db9a..9de7ea22ff 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,6 +2,7 @@ | DateOfChange | Changes | |----------------|--------------------------------------------------------------------------------------------------------------| +| Feb 19, 2023 | Add a new Liquid filter named `regex_extract`. [3220](https://github.com/huginn/huginn/pull/3220) | | Feb 18, 2023 | Fix permissions on /app in the Docker images. [3218](https://github.com/huginn/huginn/pull/3218) | | Feb 06, 2023 | BoxcarAgent is removed; the service is long gone. | | Dec 15, 2022 | DataOutputAgent Add dc namespace option. [3189](https://github.com/huginn/huginn/pull/3189) | diff --git a/app/concerns/liquid_interpolatable.rb b/app/concerns/liquid_interpolatable.rb index dd62251f06..2de414f420 100644 --- a/app/concerns/liquid_interpolatable.rb +++ b/app/concerns/liquid_interpolatable.rb @@ -231,6 +231,12 @@ def to_xpath(string) end end + def regex_extract(input, regex, index = 0) + input.to_s[Regexp.new(regex), index] + rescue Index + nil + end + def regex_replace(input, regex, replacement = nil) input.to_s.gsub(Regexp.new(regex), unescape_replacement(replacement.to_s)) end diff --git a/spec/concerns/liquid_interpolatable_spec.rb b/spec/concerns/liquid_interpolatable_spec.rb index 624625048b..127a43f0ed 100644 --- a/spec/concerns/liquid_interpolatable_spec.rb +++ b/spec/concerns/liquid_interpolatable_spec.rb @@ -228,6 +228,22 @@ def @filter.to_xpath_roundtrip(string) end end + describe 'regex_extract' do + let(:agent) { Agents::InterpolatableAgent.new(name: "test") } + + it 'should extract the matched part' do + agent.interpolation_context['something'] = "foo BAR BAZ" + agent.options['test'] = "{{ something | regex_extract: '[A-Z]+' }} / {{ something | regex_extract: '[A-Z]([A-Z]+)', 1 }} / {{ something | regex_extract: '(?.)AZ', 'x' }}" + expect(agent.interpolated['test']).to eq("BAR / AR / B") + end + + it 'should return nil if not matched' do + agent.interpolation_context['something'] = "foo BAR BAZ" + agent.options['test'] = "{% assign var = something | regex_extract: '[A-Z][a-z]+' %}{% if var == nil %}nil{% else %}non-nil{% endif %}" + expect(agent.interpolated['test']).to eq("nil") + end + end + describe 'regex_replace' do let(:agent) { Agents::InterpolatableAgent.new(name: "test") }