plain_text 0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +51 -0
- data/ChangeLog +5 -0
- data/Makefile +23 -0
- data/README.en.rdoc +172 -0
- data/Rakefile +9 -0
- data/bin/countchar +89 -0
- data/lib/plain_text/parse_rule.rb +474 -0
- data/lib/plain_text/part/boundary.rb +44 -0
- data/lib/plain_text/part/paragraph.rb +35 -0
- data/lib/plain_text/part.rb +973 -0
- data/lib/plain_text/split.rb +103 -0
- data/lib/plain_text/util.rb +104 -0
- data/lib/plain_text.rb +839 -0
- data/plain_text.gemspec +49 -0
- data/test/test_plain_text.rb +280 -0
- data/test/test_plain_text_parse_rule.rb +146 -0
- data/test/test_plain_text_part.rb +353 -0
- data/test/test_plain_text_split.rb +78 -0
- metadata +72 -0
@@ -0,0 +1,353 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
# Author: M. Sakano (Wise Babel Ltd)
|
4
|
+
|
5
|
+
require 'plain_text'
|
6
|
+
|
7
|
+
$stdout.sync=true
|
8
|
+
$stderr.sync=true
|
9
|
+
# print '$LOAD_PATH=';p $LOAD_PATH
|
10
|
+
|
11
|
+
#################################################
|
12
|
+
# Unit Test
|
13
|
+
#################################################
|
14
|
+
|
15
|
+
#if $0 == __FILE__
|
16
|
+
gem "minitest"
|
17
|
+
# require 'minitest/unit'
|
18
|
+
require 'minitest/autorun'
|
19
|
+
# MiniTest::Unit.autorun
|
20
|
+
|
21
|
+
class TestUnitPlainTextPart < MiniTest::Test
|
22
|
+
T = true
|
23
|
+
F = false
|
24
|
+
SCFNAME = File.basename(__FILE__)
|
25
|
+
Pt = PlainText::Part
|
26
|
+
|
27
|
+
def setup
|
28
|
+
end
|
29
|
+
|
30
|
+
def teardown
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_new01
|
34
|
+
a1 = ["a", "\n\n\n", "b", "\n\n\n", "c", "\n\n"]
|
35
|
+
ap1 = ["a", "b", "c"]
|
36
|
+
ab1 = [ "\n\n\n", "\n\n\n", "\n\n"]
|
37
|
+
a2 = ["a", "\n\n\n", "b", "\n\n\n", "c"]
|
38
|
+
ap2 = ap1
|
39
|
+
ab2 = [ "\n\n\n", "\n\n\n", ""]
|
40
|
+
|
41
|
+
pt1 = Pt.new(a1)
|
42
|
+
# p a1
|
43
|
+
# p a1.class
|
44
|
+
# p a1.object_id
|
45
|
+
# p pt1
|
46
|
+
# p pt1.class
|
47
|
+
# p pt1.object_id
|
48
|
+
# p pt1.to_a
|
49
|
+
# p pt1.to_a.object_id
|
50
|
+
# p pt1.to_a.class
|
51
|
+
assert_equal a1[0], pt1[0]
|
52
|
+
assert_equal a1[1], pt1[1]
|
53
|
+
assert_equal ap1, pt1.parts
|
54
|
+
assert_equal ab1, pt1.boundaries
|
55
|
+
assert_equal a1, pt1.to_a
|
56
|
+
assert_operator a1, '!=', pt1
|
57
|
+
assert_operator pt1, '!=', a1
|
58
|
+
|
59
|
+
pt2 = Pt.new(a2)
|
60
|
+
assert_equal a2[0], pt2[0]
|
61
|
+
assert_equal a2[2], pt2[2]
|
62
|
+
assert_equal ap2, pt2.parts
|
63
|
+
assert_equal ab2, pt2.boundaries
|
64
|
+
assert_equal a2+[""], pt2.to_a # An empty String is appended.
|
65
|
+
assert_operator a2, '!=', pt2
|
66
|
+
assert_operator pt2, '!=', a2
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_new02
|
70
|
+
a1 = ["a", "\n\n\n", "b", "\n\n\n", "c", "\n\n"]
|
71
|
+
ap1 = ["a", "b", "c"]
|
72
|
+
ab1 = [ "\n\n\n", "\n\n\n", "\n\n"]
|
73
|
+
a2 = ["a", "\n\n\n", "b", "\n\n\n", "c"]
|
74
|
+
ap2 = ap1
|
75
|
+
ab2 = [ "\n\n\n", "\n\n\n", ""]
|
76
|
+
|
77
|
+
pt11 = Pt.new(a1)
|
78
|
+
pt12 = Pt.new(ap1, ab1)
|
79
|
+
assert_equal pt11, pt12
|
80
|
+
pt21 = Pt.new(a2)
|
81
|
+
pt22 = Pt.new(ap2, ab2)
|
82
|
+
assert_equal pt21, pt22
|
83
|
+
end
|
84
|
+
|
85
|
+
def test_size2extract01
|
86
|
+
a1 = ["a", "\n\n\n", "b", "\n\n\n", "c", "\n\n"]
|
87
|
+
pt1 = Pt.new(a1)
|
88
|
+
assert_equal 1, pt1.send(:size2extract, 0, 1, ignore_error: false, skip_renormalize: false)
|
89
|
+
assert_equal 0, pt1.send(:size2extract, 9, 1, ignore_error: false, skip_renormalize: false)
|
90
|
+
assert_equal 1, pt1.send(:size2extract, -1, 1, ignore_error: false, skip_renormalize: false)
|
91
|
+
assert_equal 1, pt1.send(:size2extract, -1, 5, ignore_error: false, skip_renormalize: false)
|
92
|
+
assert_equal 1, pt1.send(:size2extract, 5, 9, ignore_error: false, skip_renormalize: false)
|
93
|
+
assert_equal 1, pt1.send(:size2extract, -1, 9, ignore_error: false, skip_renormalize: false)
|
94
|
+
assert_equal 0, pt1.send(:size2extract, 8, 9, ignore_error: false, skip_renormalize: false)
|
95
|
+
assert_equal 2, pt1.send(:size2extract, (0..1), ignore_error: false, skip_renormalize: false)
|
96
|
+
assert_equal 2, pt1.send(:size2extract, (0...2), ignore_error: false, skip_renormalize: false)
|
97
|
+
assert_equal 6, pt1.send(:size2extract, (0..-1), ignore_error: false, skip_renormalize: false)
|
98
|
+
assert_equal 0, pt1.send(:size2extract, (0..-1), ignore_error: false, skip_renormalize: true)
|
99
|
+
assert_equal 4, pt1.send(:size2extract, (0...-2), ignore_error: false, skip_renormalize: false)
|
100
|
+
assert_equal 0, pt1.send(:size2extract, (2..1), ignore_error: false, skip_renormalize: false)
|
101
|
+
assert_equal 1, pt1.send(:size2extract, (5..9), ignore_error: false, skip_renormalize: false)
|
102
|
+
assert_equal 1, pt1.send(:size2extract, (5...9), ignore_error: false, skip_renormalize: false)
|
103
|
+
assert_equal 0, pt1.send(:size2extract, (8..9), ignore_error: false, skip_renormalize: false)
|
104
|
+
assert_nil pt1.send(:size2extract, (-9..-1), ignore_error: true, skip_renormalize: false)
|
105
|
+
assert_raises(IndexError){ pt1.send(:size2extract, (-9..-1), ignore_error: false, skip_renormalize: false) }
|
106
|
+
assert_raises(IndexError){ pt1.send(:size2extract, (1..-9), ignore_error: false, skip_renormalize: false) }
|
107
|
+
assert_raises(IndexError){ pt1.send(:size2extract, (-9..-9), ignore_error: false, skip_renormalize: false) }
|
108
|
+
end
|
109
|
+
|
110
|
+
|
111
|
+
def test_equal01
|
112
|
+
a1 = ["a", "\n\n\n", "b", "\n\n\n", "c", "\n\n"]
|
113
|
+
pt1 = Pt.new(a1)
|
114
|
+
a2 = ["a", "\n\n\n", "b", "\n\n\n", "c"]
|
115
|
+
pt2 = Pt.new(a2)
|
116
|
+
|
117
|
+
assert_operator pt1, '==', Pt.new(a1)
|
118
|
+
assert_operator a1, '==', pt1.to_a
|
119
|
+
assert_operator a1, '!=', pt1
|
120
|
+
assert_operator pt1, '!=', a1
|
121
|
+
assert_operator a1, '!=', ?a
|
122
|
+
assert_operator ?a, '!=', a1
|
123
|
+
assert_operator pt1, '!=', pt2
|
124
|
+
assert_operator pt2, '!=', pt1
|
125
|
+
assert_operator pt1, '!=', ?a
|
126
|
+
assert_operator ?a, '!=', pt1
|
127
|
+
end
|
128
|
+
|
129
|
+
def test_nomethoderror01
|
130
|
+
a1 = ["a", "\n\n\n", "b", "\n\n\n", "c", "\n\n"]
|
131
|
+
pt1 = Pt.new(a1)
|
132
|
+
assert_raises(NoMethodError){ pt1 << 'abc' }
|
133
|
+
assert_raises(NoMethodError){ pt1.delete_at(2) }
|
134
|
+
end
|
135
|
+
|
136
|
+
def test_plus01
|
137
|
+
a1 = ["a", "\n\n\n", "b", "\n\n\n", "c", "\n\n"]
|
138
|
+
pt1 = Pt.new(a1)
|
139
|
+
a3 = ["a", "\n\n\n", "b", "\n\n\n", "c", "\n\n", "d", ""]
|
140
|
+
pt3 = pt1 + ["d"] # PlainText::Part + Array => PlainText::Part
|
141
|
+
|
142
|
+
assert_raises(TypeError){ pt1 + "s" }
|
143
|
+
assert_equal a1+["d", ""], pt3.to_a
|
144
|
+
assert_equal pt1.class, pt3.class
|
145
|
+
assert_equal Pt.new(a3), pt3 # Boundary("") is appended.
|
146
|
+
assert_equal Pt::Boundary, pt3.to_a[-1].class
|
147
|
+
assert_equal pt3, pt1 + ["d", ""]
|
148
|
+
|
149
|
+
assert_equal a3.class, ([]+pt3).class # The latter, too, is an Array (NOT PlainText::Part)
|
150
|
+
assert_equal a3, []+pt3
|
151
|
+
|
152
|
+
assert_equal pt3.class, (pt1 + Pt.new(["d", ""])).class # PtP + PtP => PtP
|
153
|
+
assert_equal pt3, pt1 + Pt.new(["d", ""])
|
154
|
+
end
|
155
|
+
|
156
|
+
# Tests of [prm], [prm1, prm2], [prm1..prm2] and "equal" operator
|
157
|
+
def test_bracket01
|
158
|
+
a1 = ["a", "\n\n\n", "b", "\n\n\n", "c", "\n\n"]
|
159
|
+
pt1 = Pt.new(a1)
|
160
|
+
|
161
|
+
assert_equal pt1.to_a[0], pt1[0]
|
162
|
+
assert_equal Pt::Paragraph, pt1[0].class
|
163
|
+
assert_equal a1[0], pt1[0]
|
164
|
+
assert_equal Pt::Paragraph.new(a1[0]), pt1[0]
|
165
|
+
|
166
|
+
# negative or too-big out-of-bound begin
|
167
|
+
assert_nil pt1[-99]
|
168
|
+
assert_nil pt1[98]
|
169
|
+
|
170
|
+
assert_equal pt1.class, pt1[0, 6].class
|
171
|
+
assert_equal a1, pt1[0, 6].to_a
|
172
|
+
assert_equal a1[0, 6], pt1[0, 6].to_a
|
173
|
+
assert_operator pt1[0, 6], :!=, a1
|
174
|
+
assert_operator a1, :!=, pt1[0, 6]
|
175
|
+
|
176
|
+
assert_equal a1[0, 2], pt1[0, 2].to_a
|
177
|
+
assert_equal a1, pt1[0, 98].to_a
|
178
|
+
assert_equal a1[0, 99], pt1[0, 98].to_a
|
179
|
+
|
180
|
+
assert_equal pt1.class, pt1[0..1].class
|
181
|
+
assert_equal a1[0..1], pt1[0..1].to_a
|
182
|
+
assert_equal a1[0, 2], pt1[0..1].to_a
|
183
|
+
assert_equal a1[0..5], pt1[0..5].to_a
|
184
|
+
assert_equal a1, pt1[0..5].to_a
|
185
|
+
assert_equal a1[0..99], pt1[0..99].to_a
|
186
|
+
assert_equal a1, pt1[0..99].to_a
|
187
|
+
assert_equal a1, pt1[0..-1].to_a
|
188
|
+
assert_equal a1[-6..-1],pt1[-6..-1].to_a
|
189
|
+
assert_equal a1, pt1[-6..-1].to_a
|
190
|
+
assert_equal a1[-6..3], pt1[-6..3].to_a
|
191
|
+
assert_equal a1[-6...4],pt1[-6...4].to_a
|
192
|
+
|
193
|
+
assert_equal pt1[0..-1], pt1[0..99]
|
194
|
+
assert_equal pt1[0, 6], pt1[0..-1]
|
195
|
+
assert_equal pt1, pt1[0..99]
|
196
|
+
|
197
|
+
pt2 = pt1[0, 4]
|
198
|
+
assert_equal pt1.class, pt2.class
|
199
|
+
assert_equal pt1.parts[0, 2], pt2.parts
|
200
|
+
assert_equal pt1.boundaries[0, 2], pt2.boundaries
|
201
|
+
|
202
|
+
# negative or too-big out-of-bound begin
|
203
|
+
assert_nil a1[-99..2]
|
204
|
+
assert_nil pt1[-99..2]
|
205
|
+
assert_nil pt1[-99..-1]
|
206
|
+
assert_nil pt1[98..99]
|
207
|
+
|
208
|
+
# other out-of-bounds: Empty
|
209
|
+
assert_equal Pt.new([]), pt1[2..1]
|
210
|
+
assert_equal a1[-2..2], pt1[-2..2].to_a
|
211
|
+
assert_equal a1[-2...3], pt1[-2...3].to_a
|
212
|
+
|
213
|
+
|
214
|
+
# Exception (Error)
|
215
|
+
assert_raises(TypeError){ pt1['abc'] }
|
216
|
+
assert_raises(TypeError){ a1[(?a)..(?c)] }
|
217
|
+
assert_raises(TypeError){ pt1[(?a)..(?c)] }
|
218
|
+
assert_raises(ArgumentError){ pt1[0, 1] }
|
219
|
+
assert_raises(ArgumentError){ pt1[1, 2] }
|
220
|
+
|
221
|
+
# Special cases, where the first index (or begin) is equal to size (as described in the reference)
|
222
|
+
# @see https://docs.ruby-lang.org/ja/latest/class/Array.html#I_--5B--5D
|
223
|
+
assert_nil pt1[pt1.size]
|
224
|
+
assert_nil pt1[pt1.size, -2]
|
225
|
+
assert_raises(TypeError){ pt1[pt1.size, ?a] }
|
226
|
+
assert_equal Pt.new([]), pt1[pt1.size, 2]
|
227
|
+
assert_equal Pt.new([]), pt1[pt1.size, 98]
|
228
|
+
assert_equal Pt.new([]), pt1[pt1.size..99]
|
229
|
+
assert_equal Pt.new([]), pt1[pt1.size..1]
|
230
|
+
end
|
231
|
+
|
232
|
+
# Tests of slice! to delete
|
233
|
+
def test_slice01
|
234
|
+
a1 = ["a", "\n\n\n", "b", "\n\n\n", "c", "\n\n"]
|
235
|
+
a11 = ["a", "\n\n\n", "b", "\n\n\n", "c", "\n\n"] # a1.clone
|
236
|
+
pt1 = Pt.new(a1.clone)
|
237
|
+
pt2 = Pt.new(a11.clone)
|
238
|
+
|
239
|
+
assert_equal pt1.to_a[0], pt1[0]
|
240
|
+
# negative or too-big out-of-bound begin
|
241
|
+
assert_nil a1.slice!( -98, 2)
|
242
|
+
assert_nil pt1.slice!(-98, 2)
|
243
|
+
assert_nil a1.slice!( 98, 2)
|
244
|
+
assert_nil pt1.slice!(98, 2)
|
245
|
+
assert_equal a11, a1
|
246
|
+
assert_equal pt2, pt1
|
247
|
+
|
248
|
+
assert_equal a11[4, 2], a1.slice!(4, 2)
|
249
|
+
ptp = pt1.slice!(4, 2)
|
250
|
+
assert_equal pt1.class, ptp.class # PlainText::Part
|
251
|
+
assert_equal a11[4, 2], ptp.to_a
|
252
|
+
assert_operator a11[4, 2], :!=, ptp # PlainText::Part != Array
|
253
|
+
assert_equal a11[0..3], a1
|
254
|
+
assert_equal a11[0..3], pt1.to_a
|
255
|
+
assert_equal pt2[0..3], pt1
|
256
|
+
|
257
|
+
# Negative size (Index, Size)
|
258
|
+
a1 = a11.clone
|
259
|
+
pt1 = Pt.new(a11.clone)
|
260
|
+
assert_nil a1.slice!(4, -1)
|
261
|
+
ptp = pt1.slice!(4, -1)
|
262
|
+
assert_nil ptp
|
263
|
+
assert_equal a11, a1
|
264
|
+
assert_equal a11, pt1.to_a
|
265
|
+
|
266
|
+
# Range exceeding (Index, Size)
|
267
|
+
a1 = a11.clone
|
268
|
+
pt1 = Pt.new(a11.clone)
|
269
|
+
assert_equal a11[4, 6], a1.slice!(4, 6)
|
270
|
+
ptp = pt1.slice!(4, 6)
|
271
|
+
assert_equal pt1.class, ptp.class # PlainText::Part
|
272
|
+
assert_equal a11[4, 2], ptp.to_a
|
273
|
+
assert_operator a11[4, 2], :!=, ptp # PlainText::Part != Array
|
274
|
+
assert_equal a11[0..3], a1
|
275
|
+
|
276
|
+
# Range exceeding (Range)
|
277
|
+
a1 = a11.clone
|
278
|
+
pt1 = Pt.new(a11.clone)
|
279
|
+
assert_equal a11[4..9], a1.slice!(4..9)
|
280
|
+
ptp = pt1.slice!(4..9)
|
281
|
+
assert_equal pt1.class, ptp.class # PlainText::Part
|
282
|
+
assert_equal a11[4..-1],ptp.to_a
|
283
|
+
assert_equal a11[4..9], ptp.to_a
|
284
|
+
assert_operator a11[4..9], :!=, ptp # PlainText::Part != Array
|
285
|
+
assert_equal a11[0..3], a1
|
286
|
+
assert_equal a11[0..3], pt1.to_a
|
287
|
+
|
288
|
+
# Null Range (Range)
|
289
|
+
a1 = a11.clone
|
290
|
+
pt1 = Pt.new(a11.clone)
|
291
|
+
assert_equal [], a1.slice!(4..0)
|
292
|
+
ptp = pt1.slice!(4..0)
|
293
|
+
# assert_equal pt1.class, ptp.class # PlainText::Part -- No! In Ruby's specification (2.5), ptp is Array, not its subClass.
|
294
|
+
assert_equal [], ptp.to_a
|
295
|
+
# assert_operator [], :!=, ptp # PlainText::Part != Array -- The same
|
296
|
+
assert_equal a11, a1
|
297
|
+
assert_equal a11, pt1.to_a
|
298
|
+
|
299
|
+
# Negative index (Index, size)
|
300
|
+
a1 = a11.clone
|
301
|
+
pt1 = Pt.new(a11.clone)
|
302
|
+
assert_equal a11[-6, 2], a1.slice!(-6, 2)
|
303
|
+
ptp = pt1.slice!(-6, 2)
|
304
|
+
assert_equal pt1.class, ptp.class # PlainText::Part
|
305
|
+
assert_equal a11[0..1], ptp.to_a
|
306
|
+
assert_operator a11[0..1], :!=, ptp # PlainText::Part != Array
|
307
|
+
assert_equal a11[2..-1], a1
|
308
|
+
assert_equal a11[2..-1], pt1.to_a
|
309
|
+
|
310
|
+
# Negative index (Range)
|
311
|
+
a1 = a11.clone
|
312
|
+
pt1 = Pt.new(a11.clone)
|
313
|
+
assert_equal a11[-6..-5], a1.slice!(-6..-5)
|
314
|
+
ptp = pt1.slice!(-6..-5)
|
315
|
+
assert_equal pt1.class, ptp.class # PlainText::Part
|
316
|
+
assert_equal a11[0..1], ptp.to_a
|
317
|
+
assert_operator a11[0..1], :!=, ptp # PlainText::Part != Array
|
318
|
+
assert_equal a11[2..-1], a1
|
319
|
+
assert_equal a11[2..-1], pt1.to_a
|
320
|
+
|
321
|
+
# Exception (Error)
|
322
|
+
a1 = a11.clone
|
323
|
+
pt1 = Pt.new(a11.clone)
|
324
|
+
assert_raises(TypeError){ pt1['abc'] }
|
325
|
+
assert_raises(TypeError){ a1[ (?a)..(?c)] }
|
326
|
+
assert_raises(TypeError){ pt1[(?a)..(?c)] }
|
327
|
+
assert_raises(ArgumentError){ pt1.slice!(0) } # Single element forbidden.
|
328
|
+
assert_raises(ArgumentError){ pt1.slice!(0, 3) } # Odd-number elements forbidden.
|
329
|
+
assert_raises(ArgumentError){ pt1.slice!(-1, 2) } # Odd-number elements forbidden.
|
330
|
+
assert_raises(ArgumentError){ pt1.slice!(1, 2) } # Odd starting index.
|
331
|
+
assert_raises(ArgumentError){ pt1.slice!(1..2) } # Odd starting index.
|
332
|
+
end
|
333
|
+
|
334
|
+
|
335
|
+
# Tests of Part.parse
|
336
|
+
def test_parse01
|
337
|
+
s1 = "a\n\n\nb\n\n\nc\n\n"
|
338
|
+
pt1 = Pt.parse s1
|
339
|
+
assert_equal 6, pt1.size
|
340
|
+
assert_equal 3, pt1.parts.size
|
341
|
+
assert_equal %w(a b c), pt1.parts
|
342
|
+
assert_equal Pt::Paragraph, pt1[0].class
|
343
|
+
assert_equal Pt::Boundary, pt1[1].class
|
344
|
+
assert_equal s1, pt1.join
|
345
|
+
end
|
346
|
+
|
347
|
+
#assert ( /_rails_db\.sql$/ =~ s1.outfile )
|
348
|
+
#assert_nil fkeys
|
349
|
+
#assert_match(/^\s*ADD CONSTRAINT/ , s1.instance_eval{ @strall })
|
350
|
+
end # class TestUnitPlainTextPart < MiniTest::Test
|
351
|
+
|
352
|
+
#end # if $0 == __FILE__
|
353
|
+
|
@@ -0,0 +1,78 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
# Author: M. Sakano (Wise Babel Ltd)
|
4
|
+
|
5
|
+
require 'plain_text'
|
6
|
+
|
7
|
+
$stdout.sync=true
|
8
|
+
$stderr.sync=true
|
9
|
+
# print '$LOAD_PATH=';p $LOAD_PATH
|
10
|
+
|
11
|
+
#################################################
|
12
|
+
# Unit Test
|
13
|
+
#################################################
|
14
|
+
|
15
|
+
#if $0 == __FILE__
|
16
|
+
gem "minitest"
|
17
|
+
# require 'minitest/unit'
|
18
|
+
require 'minitest/autorun'
|
19
|
+
# MiniTest::Unit.autorun
|
20
|
+
|
21
|
+
class TestUnitPlainTextSplit < MiniTest::Test
|
22
|
+
T = true
|
23
|
+
F = false
|
24
|
+
SCFNAME = File.basename(__FILE__)
|
25
|
+
PTS = PlainText::Split
|
26
|
+
|
27
|
+
class ChString < String
|
28
|
+
# Test sub-class.
|
29
|
+
end
|
30
|
+
|
31
|
+
def setup
|
32
|
+
end
|
33
|
+
|
34
|
+
def teardown
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_split_with_delimiter01
|
38
|
+
s1 = "XabXXc"
|
39
|
+
s2 = "XabXXcX"
|
40
|
+
assert_equal [], PTS.split_with_delimiter("", //)
|
41
|
+
assert_equal [], PTS.split_with_delimiter("", /g/)
|
42
|
+
assert_equal [], "".split_with_delimiter(/g/)
|
43
|
+
assert_equal s1, s1.split_with_delimiter(/X/).join
|
44
|
+
assert_equal s2, s2.split_with_delimiter(/X/).join
|
45
|
+
assert_equal s1, s1.split_with_delimiter(/_/).join
|
46
|
+
assert_equal s2, s2.split_with_delimiter(/_/).join
|
47
|
+
|
48
|
+
a11 = ["", ?X, "ab", ?X, "", ?X, ?c]
|
49
|
+
a12 = a11+[?X]
|
50
|
+
assert_equal a11, PTS.split_with_delimiter(s1, /X/)
|
51
|
+
assert_equal a11, s1.split_with_delimiter(/X/)
|
52
|
+
assert_equal a11, s1.split_with_delimiter('X')
|
53
|
+
assert_equal a12, s2.split_with_delimiter(/X/)
|
54
|
+
assert_equal a12, s2.split_with_delimiter('X')
|
55
|
+
|
56
|
+
a21 = ["", ?X, "ab", "XX", ?c]
|
57
|
+
a22 = a21+[?X]
|
58
|
+
assert_equal a21, s1.split_with_delimiter(/X+/)
|
59
|
+
assert_equal a21, s1.split_with_delimiter(/X+(Y?)/) # With grouping in the argument
|
60
|
+
assert_equal a21, s1.split_with_delimiter(/(X+)((Y?)(Z?))/) # Even number of groupings
|
61
|
+
assert_equal a22, s2.split_with_delimiter(/X+/)
|
62
|
+
assert_equal a22, s2.split_with_delimiter(/X+(Y?)/) # With grouping in the argument
|
63
|
+
assert_equal a22, s2.split_with_delimiter(/(X+)((Y?)(Z?))/) # Even number of groupings
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_split_with_delimiter02
|
67
|
+
# As in the embedded comment
|
68
|
+
s = "XYabXXcXY"
|
69
|
+
assert_equal ["", "ab", "c"], s.split(/X+Y?/)
|
70
|
+
assert_equal ["", "ab", "c", ""], s.split(/X+Y?/, -1)
|
71
|
+
assert_equal ["", "Y", "ab", "", "c", "Y"], s.split(/X+(Y?)/)
|
72
|
+
assert_equal ["", "Y", "ab", "", "c", "Y", ""], s.split(/X+(Y?)/, -1)
|
73
|
+
assert_equal ["", "XY", "Y", "ab", "XX", "", "c", "XY", "Y", ""], s.split(/(X+(Y?))/, -1)
|
74
|
+
assert_equal ["", "XY", "ab", "XX", "c", "XY"], s.split_with_delimiter(/X+(Y?)/)
|
75
|
+
end
|
76
|
+
|
77
|
+
end # class TestUnitPlainTextSplit < MiniTest::Test
|
78
|
+
|
metadata
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: plain_text
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '0.1'
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Masa Sakano
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2019-10-25 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: This module provides utility functions and methods to handle plain text,
|
14
|
+
classes Part/Paragraph/Boundary to represent the logical structure of a document
|
15
|
+
and ParseRule to describe the rules to parse plain text to produce a Part-type Ruby
|
16
|
+
instance.
|
17
|
+
email:
|
18
|
+
executables:
|
19
|
+
- countchar
|
20
|
+
extensions: []
|
21
|
+
extra_rdoc_files:
|
22
|
+
- README.en.rdoc
|
23
|
+
files:
|
24
|
+
- ".gitignore"
|
25
|
+
- ChangeLog
|
26
|
+
- Makefile
|
27
|
+
- README.en.rdoc
|
28
|
+
- Rakefile
|
29
|
+
- bin/countchar
|
30
|
+
- lib/plain_text.rb
|
31
|
+
- lib/plain_text/parse_rule.rb
|
32
|
+
- lib/plain_text/part.rb
|
33
|
+
- lib/plain_text/part/boundary.rb
|
34
|
+
- lib/plain_text/part/paragraph.rb
|
35
|
+
- lib/plain_text/split.rb
|
36
|
+
- lib/plain_text/util.rb
|
37
|
+
- plain_text.gemspec
|
38
|
+
- test/test_plain_text.rb
|
39
|
+
- test/test_plain_text_parse_rule.rb
|
40
|
+
- test/test_plain_text_part.rb
|
41
|
+
- test/test_plain_text_split.rb
|
42
|
+
homepage: https://www.wisebabel.com
|
43
|
+
licenses:
|
44
|
+
- MIT
|
45
|
+
metadata:
|
46
|
+
yard.run: yri
|
47
|
+
post_install_message:
|
48
|
+
rdoc_options:
|
49
|
+
- "--charset=UTF-8"
|
50
|
+
require_paths:
|
51
|
+
- lib
|
52
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
53
|
+
requirements:
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '2.0'
|
57
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
requirements: []
|
63
|
+
rubyforge_project:
|
64
|
+
rubygems_version: 2.7.3
|
65
|
+
signing_key:
|
66
|
+
specification_version: 4
|
67
|
+
summary: Module to handle Plain-Text
|
68
|
+
test_files:
|
69
|
+
- test/test_plain_text_parse_rule.rb
|
70
|
+
- test/test_plain_text_part.rb
|
71
|
+
- test/test_plain_text.rb
|
72
|
+
- test/test_plain_text_split.rb
|