TextualRegexp 1.8.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,5 @@
1
+ == 1.0.0 / 2007-09-06
2
+
3
+ * 1 major enhancement
4
+ * Birthday!
5
+
@@ -0,0 +1,7 @@
1
+ History.txt
2
+ Manifest.txt
3
+ README.txt
4
+ Rakefile
5
+ bin/texrex
6
+ lib/texrex.rb
7
+ test/test_texrex.rb
@@ -0,0 +1,83 @@
1
+ TextualRegexp
2
+ by Ari Brown and Robert Kremme
3
+ http://texrex.rubyforge.com
4
+
5
+ == DESCRIPTION:
6
+
7
+ And english-language wrapper for Regular Expressions - all of a sudden, they seem fun (hopefully)!
8
+
9
+ == FEATURES/PROBLEMS:
10
+
11
+ Incompatible with 1.9, as far as we know. Technically, it supports everything current RegExp does.
12
+
13
+ == SYNOPSIS:
14
+
15
+ Password = TextualRegexp.new do
16
+ anchor :beginning
17
+
18
+ group :capture do
19
+ any :letter
20
+ repeat(4..13) do
21
+ any :char
22
+ end
23
+ any :digit
24
+ end
25
+ end
26
+
27
+ or
28
+
29
+ US_Phone = TextualRegexp.new do
30
+ group :capture do
31
+ maybe { literal "1"
32
+ literal "-"
33
+ }
34
+ any :of {
35
+ group { maybe { literal "(" }
36
+ repeat(3) { any :digit }
37
+ maybe { literal ")" }
38
+ }
39
+ group { repeat(3) { any :digit } }
40
+ }
41
+ literal "-"
42
+ repeat(3) { any :digit }
43
+ literal "-"
44
+ repeat(4) { any :digit }
45
+ end
46
+ end
47
+
48
+ You can even add them together:
49
+ a = Password + US_Phone
50
+ it returns a new TextualRegexp object.
51
+
52
+ == REQUIREMENTS:
53
+
54
+ Ruby 1.8
55
+
56
+ == INSTALL:
57
+
58
+ sudo gem install texrex
59
+
60
+ == LICENSE:
61
+
62
+ (The MIT License)
63
+
64
+ Copyright (c) 2007
65
+
66
+ Permission is hereby granted, free of charge, to any person obtaining
67
+ a copy of this software and associated documentation files (the
68
+ 'Software'), to deal in the Software without restriction, including
69
+ without limitation the rights to use, copy, modify, merge, publish,
70
+ distribute, sublicense, and/or sell copies of the Software, and to
71
+ permit persons to whom the Software is furnished to do so, subject to
72
+ the following conditions:
73
+
74
+ The above copyright notice and this permission notice shall be
75
+ included in all copies or substantial portions of the Software.
76
+
77
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
78
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
79
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
80
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
81
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
82
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
83
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,17 @@
1
+ # -*- ruby -*-
2
+
3
+ require 'rubygems'
4
+ require 'hoe'
5
+ require './lib/texrex.rb'
6
+
7
+ Hoe.new('TextualRegexp', TextualRegexp::VERSION) do |p|
8
+ p.rubyforge_name = 'texrex'
9
+ p.author = 'Ari Brown and Robert Kremme'
10
+ p.email = 'ari [at] aribrown.com'
11
+ p.summary = 'An english wrapper for Regular Expressions'
12
+ p.description = p.paragraphs_of('README.txt', 2..5).join("\n\n")
13
+ p.url = p.paragraphs_of('README.txt', 0).first.split(/\n/)[1..-1]
14
+ p.changes = p.paragraphs_of('History.txt', 0..1).join("\n\n")
15
+ end
16
+
17
+ # vim: syntax=Ruby
File without changes
@@ -0,0 +1,319 @@
1
+ #!ruby
2
+
3
+ # Written by Robert Klemme and (a little) Ari Brown
4
+
5
+ class TextualRegexp
6
+
7
+ attr_reader :block
8
+
9
+ def initialize(flags = 0, &b)
10
+ @buffer = ""
11
+ @flags = flags
12
+ @groups = 0
13
+
14
+ if b
15
+ @block = b
16
+ instance_eval(&b)
17
+ finish
18
+ end
19
+ end
20
+
21
+ # construction
22
+
23
+ =begin
24
+ Include another TextualRegexp's code
25
+ =end
26
+ def include(something)
27
+ instance_eval(something.block)
28
+ end
29
+
30
+ =begin RDoc
31
+ TextualRegexp.new + Regexp.new
32
+ TextualRegexp.new + TextualRegexp.new
33
+ =end
34
+ def +(other)
35
+ if other.is_a?(Regexp)
36
+ g = self.rx
37
+ h = Regexp.new(g.source + other.source)
38
+ elsif other.is_a?(TextualRegexp)
39
+ self + other.rx
40
+ else
41
+ raise "Invalid Usage"
42
+ end
43
+ end
44
+
45
+ =begin RDoc
46
+ Matches a literal string.
47
+ =end
48
+ def text(s)
49
+ update do
50
+ @buffer << Regexp.escape(s)
51
+ end
52
+ end
53
+
54
+ def regexp(s)
55
+ update do
56
+ @buffer << s
57
+ end
58
+ end
59
+
60
+ alias literal text
61
+
62
+ def case_insensitive(&b)
63
+ update do
64
+ @buffer << "(?i:"
65
+ instance_eval(&b)
66
+ @buffer << ")"
67
+ end
68
+ end
69
+
70
+ def case_sensitive(&b)
71
+ update do
72
+ @buffer << "(?-i:"
73
+ instance_eval(&b)
74
+ @buffer << ")"
75
+ end
76
+ end
77
+
78
+ =begin RDoc
79
+ Sets a group that gets captured
80
+ =end
81
+ def group(mode=:non_capturing, &b)
82
+ update do
83
+ @buffer << "("
84
+ if mode == :capturing || mode == :capture
85
+ @groups += 1
86
+ else
87
+ @buffer << "?:"
88
+ end
89
+ instance_eval(&b)
90
+ @buffer << ")"
91
+ end
92
+ end
93
+
94
+ =begin RDoc
95
+ If a string is given, it's the equivalent of [sample].
96
+ If an array is given, it will match any one of the fields in the array.
97
+ If sample is nil, EXPLANATION
98
+ =end
99
+ def any(sample=nil, mode=:are, &b)
100
+ update do
101
+ sample = ("\w\\" + Regexp.escape("'_/;:-!@*()")) if sample == :char
102
+ sample = "0-9" if sample == :digit
103
+ sample = "a-zA-Z" if sample == :letter
104
+ case sample
105
+ when String
106
+ @buffer << "["
107
+ @buffer << "^" if mode == :not
108
+ @buffer << sample << "]"
109
+ when Array
110
+ @buffer << "(?:"
111
+ @buffer << "^" if mode == :not
112
+ @buffer << sample.join("|") << ")"
113
+ when nil, :of
114
+ @buffer << "(?:"
115
+ @buffer << "^" if mode == :not
116
+ @buffer << TxCollector.new(b).raw_rx << ")"
117
+ else
118
+ raise "Wrong usage"
119
+ end
120
+ end
121
+ end
122
+
123
+ =begin RDoc
124
+ If mode is set to :non_greedy (default), the block will match at least once. BETTER EXPLANATION NEEDED
125
+ =end
126
+ def at_least_once(mode = :non_greedy, &b)
127
+ update do
128
+ instance_eval(&b)
129
+ @buffer << "+"
130
+ @buffer << "?" unless mode == :greedy
131
+ end
132
+ end
133
+
134
+ =begin RDoc
135
+ If mode is set to :non_greedy (default), the block will match at least zero times. BETTER EXPLANATION NEEDED
136
+ =end
137
+ def at_least_zero(mode = :non_greedy, &b)
138
+ update do
139
+ instance_eval(&b)
140
+ @buffer << "*"
141
+ @buffer << "?" unless mode == :greedy
142
+ end
143
+ end
144
+
145
+ =begin RDoc
146
+ The block will match either once or not at all (equivalent of '?')
147
+ =end
148
+ def maybe(&b)
149
+ update do
150
+ instance_eval(&b)
151
+ @buffer << "?"
152
+ end
153
+ end
154
+
155
+ =begin RDoc
156
+ Repeats the block either spec times, or, if given a range (1..4), at least 1 and at most 4
157
+ =end
158
+ def repeat(spec, &b)
159
+ update do
160
+ case spec
161
+ when 0
162
+ # ignore
163
+ when 1
164
+ # just once
165
+ instance_eval(&b)
166
+ when Integer
167
+ raise "Illegal negative" if spec < 0
168
+ instance_eval(&b)
169
+ @buffer << "{" << spec.to_s << "}"
170
+ when Range
171
+ instance_eval(&b)
172
+ @buffer << "{" << spec.first.to_s << ","
173
+ @buffer << (spec.exclude_end? ? spec.last.pred : spec.last).to_s
174
+ @buffer << "}"
175
+ else
176
+ raise "Wrong usage"
177
+ end
178
+ end
179
+ end
180
+
181
+ =begin RDoc
182
+ Sets an anchor to :beginning (\\A), :end (\\z), :word (\\b), or :eol and :end_of_line ($)
183
+ =end
184
+ def anchor(where)
185
+ update do
186
+ @buffer << case where
187
+ when :beginning
188
+ "\\A"
189
+ when :end
190
+ "\\z"
191
+ when :word
192
+ "\\b"
193
+ when :eol, :end_of_line
194
+ "$"
195
+ else
196
+ raise "Illegal anchor #{where}"
197
+ end
198
+ end
199
+ end
200
+
201
+ def finish
202
+ @buffer.freeze
203
+ @rx = Regexp.new(@buffer, @flags)
204
+ freeze
205
+ end
206
+
207
+ # usage
208
+
209
+ =begin RDoc
210
+ Returns the equivalent RegExp object
211
+ =end
212
+ def rx; @rx end
213
+
214
+ def groups; @groups end
215
+
216
+ =begin RDoc
217
+ Returns the raw RegExp code as a string
218
+ =end
219
+ def raw_rx
220
+ @buffer
221
+ end
222
+
223
+ def to_s
224
+ rx.to_s
225
+ end
226
+
227
+ =begin RDoc
228
+ Scans self to s, and returns the matches made
229
+ =end
230
+ def scan(s, &b)
231
+ s.scan(rx, &b)
232
+ end
233
+
234
+ def split(s, &b)
235
+ s.split(rx, &b)
236
+ end
237
+
238
+ =begin RDoc
239
+ Matches self to s, returns the match if true, and false if false
240
+ =end
241
+ def =~(s)
242
+ case s
243
+ when TextualRegexp
244
+ s.rx.match(self)
245
+ else
246
+ self.rx.match(s)
247
+ end
248
+ end
249
+
250
+ =begin RDoc
251
+ Matches self to s, returns true and false
252
+ =end
253
+ def ===(s)
254
+ return true if self =~ s
255
+ return false
256
+ end
257
+
258
+ =begin RDoc
259
+ Captures all of the captured matches, which are accesible by their names
260
+ =end
261
+
262
+ private
263
+ def update
264
+ raise "Immutable" if frozen?
265
+ yield
266
+ self
267
+ end
268
+
269
+ def collect_rx(b)
270
+ TxCollector.new(b).raw_rx
271
+ end
272
+
273
+ class TxCollector
274
+ def initialize(b)
275
+ @rx = []
276
+ instance_eval(&b)
277
+ end
278
+
279
+ def method_missing(*a,&b)
280
+ trx = TextualRegexp.new
281
+ trx.send(*a,&b)
282
+ @rx << trx
283
+ self
284
+ end
285
+
286
+ def raw_rx
287
+ @rx.map {|rx| rx.raw_rx}.join("|")
288
+ end
289
+ end
290
+ end
291
+
292
+ # simple test
293
+ =begin
294
+ mail_addr = TextualRegexp.new do
295
+ anchor :beginning
296
+
297
+ group :capture do
298
+ at_least_once { any "a-z" + "0-9" + "_" }
299
+ end
300
+
301
+ literal "@"
302
+
303
+ group :capture do
304
+ repeat 1..4 do
305
+ at_least_once { any "a-z" + "0-9" + "_" }
306
+ literal "."
307
+ end
308
+ any %w{com edu org}
309
+ end
310
+ end
311
+
312
+ puts mail_addr, mail_addr.rx, mail_addr.raw_rx
313
+ puts
314
+ puts mail_addr, mail_addr.raw_rx, mail_addr.rx.class
315
+
316
+ mail_addr.scan "foobar@google.com" do |m|
317
+ p m
318
+ end
319
+ =end
File without changes
metadata ADDED
@@ -0,0 +1,63 @@
1
+ --- !ruby/object:Gem::Specification
2
+ rubygems_version: 0.9.4
3
+ specification_version: 1
4
+ name: TextualRegexp
5
+ version: !ruby/object:Gem::Version
6
+ version: 1.8.6
7
+ date: 2007-09-06 00:00:00 -04:00
8
+ summary: An english wrapper for Regular Expressions
9
+ require_paths:
10
+ - lib
11
+ email: ari [at] aribrown.com
12
+ homepage: " by Ari Brown and Robert Kremme"
13
+ rubyforge_project: texrex
14
+ description: "== FEATURES/PROBLEMS: Incompatible with 1.9, as far as we know. Technically, it supports everything current RegExp does. == SYNOPSIS: Password = TextualRegexp.new do anchor :beginning group :capture do any :letter repeat(4..13) do any :char end any :digit end end"
15
+ autorequire:
16
+ default_executable:
17
+ bindir: bin
18
+ has_rdoc: true
19
+ required_ruby_version: !ruby/object:Gem::Version::Requirement
20
+ requirements:
21
+ - - ">"
22
+ - !ruby/object:Gem::Version
23
+ version: 0.0.0
24
+ version:
25
+ platform: ruby
26
+ signing_key:
27
+ cert_chain:
28
+ post_install_message:
29
+ authors:
30
+ - Ari Brown and Robert Kremme
31
+ files:
32
+ - History.txt
33
+ - Manifest.txt
34
+ - README.txt
35
+ - Rakefile
36
+ - bin/texrex
37
+ - lib/texrex.rb
38
+ - test/test_texrex.rb
39
+ test_files:
40
+ - test/test_texrex.rb
41
+ rdoc_options:
42
+ - --main
43
+ - README.txt
44
+ extra_rdoc_files:
45
+ - History.txt
46
+ - Manifest.txt
47
+ - README.txt
48
+ executables:
49
+ - texrex
50
+ extensions: []
51
+
52
+ requirements: []
53
+
54
+ dependencies:
55
+ - !ruby/object:Gem::Dependency
56
+ name: hoe
57
+ version_requirement:
58
+ version_requirements: !ruby/object:Gem::Version::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: 1.3.0
63
+ version: