diff --git a/lib/gitlab/string_regex_marker.rb b/lib/gitlab/string_regex_marker.rb new file mode 100644 index 0000000000000000000000000000000000000000..7ebf1c0428ca2786435c73e98b0489a56b7f71e3 --- /dev/null +++ b/lib/gitlab/string_regex_marker.rb @@ -0,0 +1,13 @@ +module Gitlab + class StringRegexMarker < StringRangeMarker + def mark(regex, group: 0, &block) + regex_match = raw_line.match(regex) + return rich_line unless regex_match + + begin_index, end_index = regex_match.offset(group) + name_range = begin_index..(end_index - 1) + + super([name_range], &block) + end + end +end diff --git a/spec/lib/gitlab/string_range_marker_spec.rb b/spec/lib/gitlab/string_range_marker_spec.rb index 45b4d4af20613b81b2e5389e4bf87383e01666b0..7c77772b3f6e80b54724f94a33a76db467310bb1 100644 --- a/spec/lib/gitlab/string_range_marker_spec.rb +++ b/spec/lib/gitlab/string_range_marker_spec.rb @@ -6,7 +6,7 @@ describe Gitlab::StringRangeMarker, lib: true do let(:raw) { "abc " } let(:rich) { %{abc <def>}.html_safe } let(:inline_diffs) { [2..5] } - let(:subject) do + subject do described_class.new(raw, rich).mark(inline_diffs) do |text, left:, right:| "LEFT#{text}RIGHT" end @@ -21,7 +21,7 @@ describe Gitlab::StringRangeMarker, lib: true do context "when the rich text is not html safe" do let(:raw) { "abc " } let(:inline_diffs) { [2..5] } - let(:subject) do + subject do described_class.new(raw).mark(inline_diffs) do |text, left:, right:| "LEFT#{text}RIGHT" end diff --git a/spec/lib/gitlab/string_regex_marker_spec.rb b/spec/lib/gitlab/string_regex_marker_spec.rb new file mode 100644 index 0000000000000000000000000000000000000000..2f5cf6c6e3b61645320ac9169c94483aab6545f3 --- /dev/null +++ b/spec/lib/gitlab/string_regex_marker_spec.rb @@ -0,0 +1,18 @@ +require 'spec_helper' + +describe Gitlab::StringRegexMarker, lib: true do + describe '#mark' do + let(:raw) { %{"name": "AFNetworking"} } + let(:rich) { %{"name": "AFNetworking"}.html_safe } + subject do + described_class.new(raw, rich).mark(/"[^"]+":\s*"(?[^"]+)"/, group: :name) do |text, left:, right:| + %{#{text}} + end + end + + it 'marks the inline diffs' do + expect(subject).to eq(%{"name": "AFNetworking"}) + expect(subject).to be_html_safe + end + end +end