forkforge 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,500 @@
1
+ # encoding: utf-8
2
+
3
+ Feature: UnicodeData.txt file is to be used locally until it’s absent
4
+ Scenario: Get all composed symbols
5
+ When we call all_character_decomposition_mapping on Forkforge::UnicodeData
6
+ Then the result count equals to 5721
7
+
8
+ ###############################################################################
9
+ @camel
10
+ Scenario: Camel to underscore function works
11
+ Given we have a string "CamelCasedString"
12
+ When we call "camel_to_underscore" method on Forkforge::Unicode
13
+ Then the result is "camel_cased_string"
14
+
15
+ @camel
16
+ Scenario: Underscore to camel function works
17
+ Given we have a string "underscore_old_school_string"
18
+ When we call "underscore_to_camel" method on Forkforge::Unicode
19
+ Then the result is "UnderscoreOldSchoolString"
20
+
21
+ ###############################################################################
22
+
23
+ @letter
24
+ Scenario: Get all specific letter: uppercase
25
+ When we call "uppercase" method on Forkforge::Letter
26
+ Then the result count equals to 1490
27
+ And the first item equals to "A"
28
+
29
+ @letter
30
+ Scenario: Get all specific letter: lowercase
31
+ When we call "lowercase" method on Forkforge::Letter
32
+ Then the result count equals to 1841
33
+ And the first item equals to "a"
34
+
35
+ @letter
36
+ Scenario: Get all specific letter: titlecase
37
+ When we call "titlecase" method on Forkforge::Letter
38
+ Then the result count equals to 31
39
+ And the first item equals to "Dž"
40
+
41
+ @letter
42
+ Scenario: Get all specific letter: modifier
43
+ When we call "modifier" method on Forkforge::Letter
44
+ Then the result count equals to 248
45
+ And the first item equals to "ʰ"
46
+
47
+ @letter
48
+ Scenario: Get all specific letter: others
49
+ When we call "other" method on Forkforge::Letter
50
+ Then the result count equals to 13350
51
+ And the first item equals to "ª"
52
+
53
+ @letter
54
+ Scenario: Get all codepoints for uppercased letters
55
+ When we call uppercase_code_point on Forkforge::Letter
56
+ Then we print first 10 results
57
+
58
+ ###############################################################################
59
+
60
+ @mark
61
+ Scenario: Get all specific marks: non-spacing
62
+ When we call "non_spacing" method on Forkforge::Mark
63
+ Then the result count equals to 1418
64
+ And the first item equals to "̀"
65
+
66
+ @mark
67
+ Scenario: Get all specific marks: spacing combining
68
+ When we call "spacing_combining" method on Forkforge::Mark
69
+ Then the result count equals to 399
70
+ And the first item equals to "ः"
71
+
72
+ @mark
73
+ Scenario: Get all specific marks: enclosing
74
+ When we call "enclosing" method on Forkforge::Mark
75
+ Then the result count equals to 13
76
+ And the first item equals to "҈"
77
+
78
+ ###############################################################################
79
+
80
+ @number
81
+ Scenario: Get all specific numbers: decimal digit
82
+ When we call "decimal_digit" method on Forkforge::Number
83
+ Then the result count equals to 540
84
+ And the first item equals to "0"
85
+
86
+ @number
87
+ Scenario: Get all specific numbers: letter
88
+ When we call "letter" method on Forkforge::Number
89
+ Then the result count equals to 236
90
+ And the first item equals to "ᛮ"
91
+
92
+ @number
93
+ Scenario: Get all specific numbers: other
94
+ When we call "other" method on Forkforge::Number
95
+ Then the result count equals to 570
96
+ And the first item equals to "²"
97
+
98
+ ###############################################################################
99
+
100
+ @punctuation
101
+ Scenario: Get all specific punctuation: connectors
102
+ When we call "connector" method on Forkforge::Punctuation
103
+ Then the result count equals to 10
104
+ And the first item equals to "_"
105
+
106
+ @punctuation
107
+ Scenario: Get all specific punctuation: dashes
108
+ When we call "dash" method on Forkforge::Punctuation
109
+ Then the result count equals to 24
110
+ And the first item equals to "-"
111
+
112
+ @punctuation
113
+ Scenario: Get all specific punctuation: opens
114
+ When we call "open" method on Forkforge::Punctuation
115
+ Then the result count equals to 75
116
+ And the first item equals to "("
117
+
118
+ @punctuation
119
+ Scenario: Get all specific punctuation: closes
120
+ When we call "close" method on Forkforge::Punctuation
121
+ Then the result count equals to 73
122
+ And the first item equals to ")"
123
+
124
+ @punctuation
125
+ Scenario: Get all specific punctuation: initial_quotes
126
+ When we call "initial_quote" method on Forkforge::Punctuation
127
+ Then the result count equals to 12
128
+ And the first item equals to "«"
129
+
130
+ @punctuation
131
+ Scenario: Get all specific punctuation: final_quotes
132
+ When we call "final_quote" method on Forkforge::Punctuation
133
+ Then the result count equals to 10
134
+ And the first item equals to "»"
135
+
136
+ @punctuation
137
+ Scenario: Get all specific punctuation: others
138
+ When we call "other" method on Forkforge::Punctuation
139
+ Then the result count equals to 484
140
+ And the first item equals to "!"
141
+
142
+ ###############################################################################
143
+
144
+ @symbol
145
+ Scenario: Get all specific symbols: math
146
+ When we call "math" method on Forkforge::Symbol
147
+ Then the result count equals to 948
148
+ And the first item equals to "+"
149
+
150
+ @symbol
151
+ Scenario: Get all specific symbols: currency
152
+ When we call "currency" method on Forkforge::Symbol
153
+ Then the result count equals to 52
154
+ And the first item equals to "$"
155
+
156
+ @symbol
157
+ Scenario: Get all specific symbols: modifier
158
+ When we call "modifier" method on Forkforge::Symbol
159
+ Then the result count equals to 116
160
+ And the first item equals to "^"
161
+
162
+ @symbol
163
+ Scenario: Get all specific symbols: other
164
+ When we call "other" method on Forkforge::Symbol
165
+ Then the result count equals to 5082
166
+ And the first item equals to "¦"
167
+
168
+ ###############################################################################
169
+
170
+ @separator
171
+ Scenario: Get all specific separators: space
172
+ When we call "space" method on Forkforge::Separator
173
+ Then the result count equals to 17
174
+ And the first item equals to " "
175
+
176
+ @separator
177
+ Scenario: Get all specific separators: line
178
+ When we call "line" method on Forkforge::Separator
179
+ Then the result count equals to 1
180
+ And we print results
181
+
182
+ @separator
183
+ Scenario: Get all specific separators: paragraph
184
+ When we call "paragraph" method on Forkforge::Separator
185
+ Then the result count equals to 1
186
+ And we print results
187
+
188
+ ###############################################################################
189
+
190
+ @other
191
+ Scenario: Get all specific others: control
192
+ When we call "control" method on Forkforge::Other
193
+ Then the result count equals to 65
194
+
195
+ @other
196
+ Scenario: Get all specific others: format
197
+ When we call "format" method on Forkforge::Other
198
+ Then the result count equals to 150
199
+ And the first item equals to "­"
200
+
201
+ @other
202
+ Scenario: Get all specific others: surrogate
203
+ When we call "surrogate" method on Forkforge::Other
204
+ Then the result count equals to 6
205
+ And we print results
206
+
207
+ @other
208
+ Scenario: Get all specific others: private use
209
+ When we call "private_use" method on Forkforge::Other
210
+ Then the result count equals to 6
211
+ And we print results
212
+
213
+ @other
214
+ Scenario: Get all specific others: not assigned
215
+ When we call "not_assigned" method on Forkforge::Other
216
+ Then the result count equals to 0
217
+
218
+ ###############################################################################
219
+
220
+ @punctuation @connector
221
+ Scenario: Get all connectors with their names
222
+ When we call "connector_character_name" method on Forkforge::Punctuation
223
+ Then the result count equals to 10
224
+ And the first item’s value equals to "LOW LINE"
225
+
226
+ @punctuation @connector
227
+ Scenario: Get all dashes with their names
228
+ When we call "dash_character_name" method on Forkforge::Punctuation
229
+ Then the result count equals to 24
230
+ And the first item’s value equals to "HYPHEN-MINUS"
231
+
232
+ ###############################################################################
233
+
234
+ @languages
235
+ Scenario: Upcase function works properly on cyrillics
236
+ Given we have a cyrillic string "МАМА мыла РАМУ"
237
+ When the string is upcased
238
+ Then the result is "МАМА МЫЛА РАМУ"
239
+
240
+ # titlecase titleize every funcking letter!!
241
+ @languages
242
+ Scenario: Titlecase function works properly on cyrillics
243
+ Given we have a cyrillic string "МАМА мыла РАМУ"
244
+ When the string is titlecased
245
+ Then the result is "МАМА МЫЛА РАМУ"
246
+
247
+ @languages
248
+ Scenario: Downcase function works properly on cyrillics
249
+ Given we have a cyrillic string "МАМА мыла РАМУ"
250
+ When the string is downcased
251
+ Then the result is "мама мыла раму"
252
+
253
+ @languages
254
+ Scenario: Upcase function works properly on combined
255
+ Given we have a cyrillic string "naïve Álto Pàlo"
256
+ When the string is upcased
257
+ Then the result is "NAÏVE ÁLTO PÀLO"
258
+
259
+ @languages
260
+ Scenario: Upcase function works properly with Turkic (CAPITAL I WITH DOT)
261
+ Given we have a string "naïve istanbul"
262
+ When the string is upcased with language set to "tr"
263
+ Then the result is "NAİ̈VE İSTANBUL"
264
+
265
+ @languages
266
+ Scenario: Upcase function works properly with generic (CAPITAL I WITHOUT DOT)
267
+ Given we have a string "naïve istanbul"
268
+ When the string is upcased with language set to ""
269
+ Then the result is "NAÏVE ISTANBUL"
270
+
271
+ @languages
272
+ Scenario: Downcase function works properly with generic (SMALL I WITH DOT)
273
+ Given we have a string "NAÏVE ISTANBUL"
274
+ When the string is downcased with language set to ""
275
+ Then the result is "naïve istanbul"
276
+
277
+ @languages
278
+ Scenario: Print out known conditions
279
+ When we ask to print known conditions
280
+ Then we print results
281
+
282
+ ###############################################################################
283
+
284
+ @lookup
285
+ Scenario: Lookup symbols by name
286
+ Given we have a pattern "RiNg AbOvE"
287
+ When lookup is done with this pattern
288
+ Then we print results
289
+
290
+ @lookup
291
+ Scenario: Lookup symbols by name
292
+ Given we have a pattern "RING ABOVE"
293
+ When lookup using all_character_name is done with this pattern
294
+ Then we print first 2 results
295
+
296
+ @lookup
297
+ Scenario: Lookup symbols with tagged character_name
298
+ Given we have a pattern looking like a tag
299
+ When lookup using all_character_name is done with this pattern
300
+ Then we print first 1 results
301
+
302
+ @lookup
303
+ Scenario: Lookup tag names using character_name
304
+ Given we have a pattern looking like a tag
305
+ When result is filtered to show tags
306
+ Then the result count equals to 25
307
+ And we print first 21 results
308
+
309
+ @lookup
310
+ Scenario: Lookup tags using character_name
311
+ Given we have a pattern looking like a tag
312
+ When result is filtered to show tagged characters
313
+ Then the result count equals to 25
314
+ And the result’s first element nested count is "65"
315
+
316
+ @lookup
317
+ Scenario: Lookup tags using meta method
318
+ Given we have a pattern looking like a tag
319
+ When result is set to response from "control" function call
320
+ Then the result count equals to 65
321
+ And we print first 1 results
322
+
323
+ @lookup
324
+ Scenario: Print info on symbol
325
+ Given we have a symbol "〷"
326
+ When we retrieve it’s info
327
+ Then we print results
328
+ And the result is "IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL"
329
+
330
+ @lookup
331
+ Scenario: Print info on symbol on it’s codebase
332
+ Given we have a symbol with codebase "0x3037"
333
+ When we retrieve it’s info
334
+ Then we print results
335
+ And the result is "IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL"
336
+
337
+ ###############################################################################
338
+
339
+ @tag
340
+ Scenario: Tag class accepts strings with tag delimiters properly
341
+ Given we have a string "<font>"
342
+ When we construct Tag object against it
343
+ Then both sym and tag have correct values
344
+
345
+ @tag
346
+ Scenario: Tag class accepts strings without tag delimiters properly
347
+ Given we have a string "font"
348
+ When we construct Tag object against it
349
+ Then both sym and tag have correct values
350
+
351
+ @tag
352
+ Scenario: Tag class rejects strings with improper tags
353
+ Given we have a string "ghgh"
354
+ When we construct Tag object against it
355
+ Then both sym and tag have nil values
356
+
357
+ @tag
358
+ Scenario: Decompose symbols
359
+ Given we have a string "Barçelona Niños"
360
+ When we decompose it
361
+ Then we print results
362
+ And the result is "Barçelona Niños"
363
+
364
+ @tag
365
+ Scenario: Decompose symbols with <font>
366
+ Given we have a string "ℂool"
367
+ When we decompose it
368
+ Then we print results
369
+ And the result is "Cool"
370
+
371
+ @tag
372
+ Scenario: Decompose symbols with <font>
373
+ Given we have a string "ℂool"
374
+ When we decompose it with circle tag only
375
+ Then we print results
376
+ And the result is "ℂool"
377
+
378
+ @tag
379
+ Scenario: Add custom decomposition symbols
380
+ Given we have a string "Мáма"
381
+ When we add custom decomposition rule
382
+ And we decompose it
383
+ Then we print results
384
+
385
+ ###############################################################################
386
+
387
+ @compose
388
+ Scenario: Composing digit with circle
389
+ Given we have a string "1"
390
+ When we compose input to "circle"
391
+ Then the result is "①"
392
+ And we print results
393
+
394
+ @compose
395
+ Scenario: Composing letter with font
396
+ Given we have a string "a"
397
+ When we compose input to "font"
398
+ Then the result is "𝐚,𝑎,𝒂,𝒶,𝓪,𝔞,𝕒,𝖆,𝖺,𝗮,𝘢,𝙖,𝚊"
399
+ And we print results
400
+
401
+ @compose
402
+ Scenario: Composing letter with wide
403
+ Given we have a string "a"
404
+ When we compose input to "wide"
405
+ Then the result is "a"
406
+ And we print results
407
+
408
+ @compose
409
+ Scenario: Composing letter with super
410
+ Given we have a string "a"
411
+ When we compose input to "super"
412
+ Then we print results
413
+ And the result is "ª,ᵃ"
414
+
415
+ @compose
416
+ Scenario: Composing letter with sub
417
+ Given we have a string "a"
418
+ When we compose input to "sub"
419
+ Then we print results
420
+ And the result is "ₐ"
421
+
422
+ @compose
423
+ Scenario: Composing letter with vertical
424
+ Given we have a string "?"
425
+ When we compose input to "vertical"
426
+ Then we print results
427
+ And the result is "︖"
428
+
429
+ @compose
430
+ Scenario: Composing letter with small
431
+ Given we have a string "?"
432
+ When we compose input to "small"
433
+ Then we print results
434
+ And the result is "﹖"
435
+
436
+ @compose
437
+ Scenario: Composing letter with compat
438
+ Given we have a string "µ"
439
+ When we compose input to "compat"
440
+ Then we print results
441
+ And the result is "µ"
442
+
443
+ ###############################################################################
444
+
445
+ @compose @complex
446
+ Scenario: Composing text with wide
447
+ Given we have a string "Hola, Barçelona!"
448
+ When we compose input to "wide"
449
+ Then we print results
450
+ And the result is "H,o,l,a,,, ,B,a,r,ç,e,l,o,n,a,!"
451
+
452
+ @compose @complex
453
+ Scenario: Composing text with wide (direct call)
454
+ Given we have a string "Hola, Barçelona!"
455
+ When we widify input
456
+ Then we print results
457
+ And the result is "Hola, Barçelona!"
458
+
459
+ @compose @complex
460
+ Scenario: Composing text with circle (direct call)
461
+ Given we have a string "Hola, Barçelona!"
462
+ When we circlefy input
463
+ Then we print results
464
+ And the result is "Ⓗⓞⓛⓐ, Ⓑⓐⓡⓒ̧ⓔⓛⓞⓝⓐ!"
465
+
466
+ ###############################################################################
467
+
468
+ @lookup @complex
469
+ Scenario: Code points method missing works on latin letters
470
+ When we call "math" method on Forkforge::CodePoints for "b"
471
+ Then we print results
472
+ And the result to string is "𝐛𝑏𝒃𝒷𝓫𝔟𝕓𝖇𝖻𝗯𝘣𝙗𝚋"
473
+
474
+ @lookup @complex
475
+ Scenario: Code points method missing works on strings
476
+ When we call "math" method on Forkforge::CodePoints for "abc"
477
+ Then we print results
478
+ And the result to string is "𝐚𝐛𝐜𝑎𝑏𝑐𝒂𝒃𝒄𝒶𝒷𝒸𝓪𝓫𝓬𝔞𝔟𝔠𝕒𝕓𝕔𝖆𝖇𝖈𝖺𝖻𝖼𝗮𝗯𝗰𝘢𝘣𝘤𝙖𝙗𝙘𝚊𝚋𝚌"
479
+
480
+ @lookup @complex
481
+ Scenario: Code points method missing chained works on strings
482
+ When we call "math_fraktur_bold" method on Forkforge::CodePoints for "abc"
483
+ Then we print results
484
+ And the result to string is "𝖆𝖇𝖈"
485
+
486
+ ###############################################################################
487
+
488
+ @monkey
489
+ Scenario: String monkeypatches (wide)
490
+ Given we have a string "CamelCasedString"
491
+ When the string is directly widefied
492
+ Then the result is "CamelCasedString"
493
+
494
+ @monkey
495
+ Scenario: String monkeypatches (upcase on cyrillics)
496
+ Given we have a string "МАМА мыла РАМУ"
497
+ When the string is directly upcased
498
+ Then the result is "МАМА МЫЛА РАМУ"
499
+
500
+ ###############################################################################
data/forkforge.gemspec ADDED
@@ -0,0 +1,33 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'forkforge/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "forkforge"
8
+ spec.version = Forkforge::VERSION
9
+ spec.authors = ["Alexei Matyushkin"]
10
+ spec.email = ["am@mudasobwa.ru"]
11
+ spec.summary = %q{Unicode handling library}
12
+ spec.description = %Q{
13
+ Pure ruby implementation of Unicode manipulations as by Consortium.
14
+ Includes: languages-specific uppercase/lowercase, composition, decomposition and more.
15
+ }
16
+ spec.homepage = "http://forkforge.com"
17
+ spec.license = "MIT"
18
+
19
+ spec.files = `git ls-files -z`.split("\x0")
20
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
21
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
22
+ spec.require_paths = ["lib"]
23
+
24
+ spec.add_development_dependency "bundler", "~> 1.5"
25
+ spec.add_development_dependency "rake", '~> 0'
26
+ spec.add_development_dependency "pry", '~> 0'
27
+ spec.add_development_dependency "pry-rescue", '~> 0'
28
+ spec.add_development_dependency "awesome_print", '~> 0'
29
+ spec.add_development_dependency "rspec", '~> 0'
30
+ spec.add_development_dependency 'yard', '~> 0'
31
+ spec.add_development_dependency 'cucumber', '~> 0'
32
+ spec.add_development_dependency 'yard-cucumber', '~> 0'
33
+ end
@@ -0,0 +1,165 @@
1
+ # encoding: utf-8
2
+
3
+ require 'forkforge/internal/code_point'
4
+ require 'forkforge/internal/unicode_data'
5
+
6
+ module Forkforge
7
+ module Category
8
+ # Letter::all_raw | Letter::uppercase_raw | Letter::uppercase 'Alexei' # ⇒ 'A'
9
+ # Letter::uppercase_code_point | Mark::non_spacing_bidirectional_category
10
+ def self.included base
11
+ base.const_get(:TYPES).each { |type|
12
+ base.class_eval %Q{
13
+ def #{type.last}_raw
14
+ @@#{type.last} ||= Forkforge::UnicodeData::all_general_category /#{type.first}/
15
+ end
16
+ def is_#{type.last} s
17
+ UnicodeData::infos(s).inject(true) { |memo, kv|
18
+ memo &&= kv[:general_category] == "#{type.first}"
19
+ }
20
+ end
21
+ def #{type.last} s = nil
22
+ @@#{type.last}_array ||= #{type.last}_raw.map { |k, v| Forkforge::UnicodeData::to_char k }
23
+ s.respond_to?(:scan) ? s.scan(Regexp.new(@@#{type.last}_array.join '|')) : @@#{type.last}_array
24
+ end
25
+ }
26
+ CodePoint::UNICODE_FIELDS.each { |method|
27
+ base.class_eval %Q{
28
+ def #{type.last}_#{method}
29
+ @@#{type.last}_#{method} ||= #{type.last}_raw.map { |k, v|
30
+ [ Forkforge::UnicodeData::to_char(k), Forkforge::UnicodeData::get_#{method}(k) ]
31
+ }.to_h
32
+ end
33
+ }
34
+ }
35
+ }
36
+ base.extend base
37
+ end
38
+ end
39
+
40
+ =begin
41
+ Lu Letter, Uppercase
42
+ Ll Letter, Lowercase
43
+ Lt Letter, Titlecase
44
+ Lm Letter, Modifier
45
+ Lo Letter, Other
46
+ LC Letter, Cased (combining)
47
+ =end
48
+ module Letter
49
+ TYPES = [
50
+ ['L.?', :all],
51
+ ['Lu', :uppercase],
52
+ ['Ll', :lowercase],
53
+ ['Lt', :titlecase],
54
+ ['Lm', :modifier],
55
+ ['Lo', :other],
56
+ ['L[Cult]', :cased]
57
+ ]
58
+ include Forkforge::Category
59
+ end
60
+
61
+ =begin
62
+ Mn Mark, Non-Spacing
63
+ Mc Mark, Spacing Combining
64
+ Me Mark, Enclosing
65
+ =end
66
+ module Mark
67
+ TYPES = [
68
+ ['M.?', :all],
69
+ ['Mn', :non_spacing],
70
+ ['Mc', :spacing_combining],
71
+ ['Me', :enclosing]
72
+ ]
73
+ include Forkforge::Category
74
+ end
75
+
76
+ =begin
77
+ Nd Number, Decimal Digit
78
+ Nl Number, Letter
79
+ No Number, Other
80
+ =end
81
+ module Number
82
+ TYPES = [
83
+ ['N.?', :all],
84
+ ['Nd', :decimal_digit],
85
+ ['Nl', :letter],
86
+ ['No', :other]
87
+ ]
88
+ include Forkforge::Category
89
+ end
90
+
91
+ =begin
92
+ Pc Punctuation, Connector
93
+ Pd Punctuation, Dash
94
+ Ps Punctuation, Open
95
+ Pe Punctuation, Close
96
+ Pi Punctuation, Initial quote (may behave like Ps or Pe depending on usage)
97
+ Pf Punctuation, Final quote (may behave like Ps or Pe depending on usage)
98
+ Po Punctuation, Other
99
+ =end
100
+ module Punctuation
101
+ TYPES = [
102
+ ['P.?', :all],
103
+ ['Pc', :connector],
104
+ ['Pd', :dash],
105
+ ['Ps', :open],
106
+ ['Pe', :close],
107
+ ['Pi', :initial_quote], # (may behave like Ps or Pe depending on usage)
108
+ ['Pf', :final_quote], # (may behave like Ps or Pe depending on usage)
109
+ ['Po', :other]
110
+ ]
111
+ include Forkforge::Category
112
+ end
113
+
114
+ =begin
115
+ Sm Symbol, Math
116
+ Sc Symbol, Currency
117
+ Sk Symbol, Modifier
118
+ So Symbol, Other
119
+ =end
120
+ module Symbol
121
+ TYPES = [
122
+ ['S.?', :all],
123
+ ['Sm', :math],
124
+ ['Sc', :currency],
125
+ ['Sk', :modifier],
126
+ ['So', :other]
127
+ ]
128
+ include Forkforge::Category
129
+ end
130
+
131
+ =begin
132
+ Zs Separator, Space
133
+ Zl Separator, Line
134
+ Zp Separator, Paragraph
135
+ =end
136
+ module Separator
137
+ TYPES = [
138
+ ['Z.?', :all],
139
+ ['Zs', :space],
140
+ ['Zl', :line],
141
+ ['Zp', :paragraph]
142
+ ]
143
+ include Forkforge::Category
144
+ end
145
+
146
+ =begin
147
+ Cc Other, Control
148
+ Cf Other, Format
149
+ Cs Other, Surrogate
150
+ Co Other, Private Use
151
+ Cn Other, Not Assigned (no characters in the file have this property)
152
+ =end
153
+ module Other
154
+ TYPES = [
155
+ ['C.?', :all],
156
+ ['Cc', :control],
157
+ ['Cf', :format],
158
+ ['Cs', :surrogate],
159
+ ['Co', :private_use],
160
+ ['Cn', :not_assigned] # no characters in the file have this property
161
+ ]
162
+ include Forkforge::Category
163
+ end
164
+
165
+ end