Skip to content

Commit d54a617

Browse files
committed
close #4
1 parent 65eb742 commit d54a617

4 files changed

Lines changed: 63 additions & 15 deletions

File tree

lib/string/pattern/add_to_ruby.rb

Lines changed: 42 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -90,11 +90,14 @@ def to_sp
9090
pats = ""
9191
patg = [] # for (aa|bb|cc) group
9292
set = false
93+
set_negate = false
94+
options = []
9395
capture = false
9496

9597
range = ""
9698
fixed_text = false
97-
last_char = (regexp.to_s.gsub("?-mix:", "").length) - 2
99+
options = regexp.to_s.scan(/\A\(\?([mix]*)\-[mix]*:/).join.split('')
100+
last_char = (regexp.to_s.gsub(/\A\(\?[mix]*\-[mix]*:/, "").length) - 2
98101
Regexp::Scanner.scan regexp do |type, token, text, ts, te|
99102
if type == :escape
100103
if token == :dot
@@ -126,9 +129,9 @@ def to_sp
126129
pata[-1] += pats.chop
127130
else
128131
if pats.size == 2
129-
pata << pats.chop #jal
132+
pata << pats.chop
130133
else
131-
pata << "1:[#{pats}" #jal
134+
pata << "1:[#{pats}"
132135
end
133136
if last_char == te and type == :literal and token == :literal
134137
pata << text
@@ -147,7 +150,6 @@ def to_sp
147150
pats = ""
148151
end
149152
fixed_text = false
150-
151153
case token
152154
when :open
153155
set = true
@@ -158,7 +160,13 @@ def to_sp
158160
if pats[-1] == "["
159161
pats.chop!
160162
else
161-
pats += "]"
163+
if set_negate
164+
pats+="%]*"
165+
set_negate = false
166+
else
167+
pats += "]"
168+
end
169+
162170
end
163171
elsif type == :group
164172
capture = false
@@ -169,6 +177,11 @@ def to_sp
169177
pats = ""
170178
end
171179
end
180+
when :negate
181+
if set and pats[-1] == '['
182+
pats+="%"
183+
set_negate = true
184+
end
172185
when :capture
173186
capture = true if type == :group
174187
when :alternation
@@ -182,6 +195,7 @@ def to_sp
182195
end
183196
end
184197
when :range
198+
pats.chop! if options.include?('i')
185199
range = pats[-1]
186200
pats.chop!
187201
when :digit
@@ -212,21 +226,37 @@ def to_sp
212226
pats = text[-1]
213227
else
214228
pats += text
229+
pats += text.upcase if options.include?('i')
215230
end
216231
else
217232
range = range + "-" + text
218233
if range == "a-z"
219-
pats = "x" + pats
234+
if options.include?('i')
235+
pats = "L" + pats
236+
else
237+
pats = "x" + pats
238+
end
220239
elsif range == "A-Z"
221-
pats = "X" + pats
240+
if options.include?('i')
241+
pats = "L" + pats
242+
else
243+
pats = "X" + pats
244+
end
222245
elsif range == "0-9"
223246
pats = "n" + pats
224247
else
225-
pats += if set
226-
(range[0]..range[2]).to_a.join
227-
else
228-
"[" + (range[0]..range[2]).to_a.join + "]"
229-
end
248+
if set
249+
pats += (range[0]..range[2]).to_a.join
250+
if options.include?('i')
251+
pats += (range[0]..range[2]).to_a.join.upcase
252+
end
253+
else
254+
trange = (range[0]..range[2]).to_a.join
255+
if options.include?('i')
256+
trange += trange.upcase
257+
end
258+
pats += "[" + trange + "]"
259+
end
230260
end
231261
range = ""
232262
end

spec/string/pattern/add_to_ruby_spec.rb

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,25 @@
6565
it "responds to to_sp" do
6666
expect(/\d{2}/.to_sp).to eq "2:n"
6767
end
68+
it "/[^abc]+/i.to_sp" do
69+
expect(/[^abc]+/i.to_sp).to eq "1-10:[%aAbBcC%]*"
70+
end
71+
it "/[abc]+/i.to_sp" do
72+
expect(/[abc]+/i.to_sp).to eq "1-10:[aAbBcC]"
73+
end
74+
it "/[a-z]+/i.to_sp" do
75+
expect(/[a-z]+/i.to_sp).to eq "1-10:L"
76+
end
77+
it "/[a-z]+/.to_sp" do
78+
expect(/[a-z]+/.to_sp).to eq "1-10:x"
79+
end
80+
it "/[m-z]+/i.to_sp" do
81+
expect(/[m-z]+/i.to_sp).to eq '1-10:[mnopqrstuvwxyzMNOPQRSTUVWXYZ]'
82+
end
83+
it '/[m-z]+\d+\w+[ab]+/i.to_sp' do
84+
expect(/[m-z]+\d+\w+[ab]+/i.to_sp).to eq ["1-10:[mnopqrstuvwxyzMNOPQRSTUVWXYZ]", "1-10:n", "1-10:Ln_", "1-10:[aAbB]"]
85+
end
86+
6887
end
6988

7089
describe "from Kernel" do

spec/string/pattern/generate_spec.rb

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -371,8 +371,7 @@
371371
regexp = /[abc]/
372372
expect(regexp.gen.match?(regexp)).to eq true
373373
end
374-
#todo: this is failing, it is generating a string of a b or c
375-
xit 'accepts [^abc]' do
374+
it 'accepts [^abc]' do
376375
regexp = /[^abc]/
377376
expect(regexp.gen.match?(regexp)).to eq true
378377
end

string_pattern.gemspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,6 @@ Gem::Specification.new do |s|
1616
s.extra_rdoc_files = ["LICENSE","README.md"]
1717
s.homepage = 'https://github.com/MarioRuiz/string_pattern'
1818
s.license = 'MIT'
19-
s.add_runtime_dependency 'regexp_parser', '~> 2.5', '>= 2.5.0' #jal
19+
s.add_runtime_dependency 'regexp_parser', '~> 2.5', '>= 2.5.0'
2020
end
2121

0 commit comments

Comments
 (0)