phonetic 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/.rspec +2 -0
  4. data/Gemfile +3 -0
  5. data/LICENSE.txt +22 -0
  6. data/README.md +98 -0
  7. data/Rakefile +1 -0
  8. data/lib/phonetic.rb +10 -0
  9. data/lib/phonetic/algorithm.rb +24 -0
  10. data/lib/phonetic/caverphone.rb +68 -0
  11. data/lib/phonetic/caverphone2.rb +69 -0
  12. data/lib/phonetic/core_ext/string.rb +3 -0
  13. data/lib/phonetic/core_ext/string/caverphone.rb +11 -0
  14. data/lib/phonetic/core_ext/string/caverphone2.rb +11 -0
  15. data/lib/phonetic/core_ext/string/double_metaphone.rb +18 -0
  16. data/lib/phonetic/core_ext/string/metaphone.rb +12 -0
  17. data/lib/phonetic/core_ext/string/nysiis.rb +12 -0
  18. data/lib/phonetic/core_ext/string/refined_soundex.rb +12 -0
  19. data/lib/phonetic/core_ext/string/soundex.rb +12 -0
  20. data/lib/phonetic/double_metaphone.rb +640 -0
  21. data/lib/phonetic/metaphone.rb +161 -0
  22. data/lib/phonetic/metaphone2.rb +5 -0
  23. data/lib/phonetic/nysiis.rb +63 -0
  24. data/lib/phonetic/refined_soundex.rb +39 -0
  25. data/lib/phonetic/soundex.rb +39 -0
  26. data/lib/phonetic/version.rb +3 -0
  27. data/phonetic.gemspec +26 -0
  28. data/spec/phonetic/algorithm_spec.rb +15 -0
  29. data/spec/phonetic/caverphone2_spec.rb +66 -0
  30. data/spec/phonetic/caverphone_spec.rb +115 -0
  31. data/spec/phonetic/core_ext/string/caverphone2_spec.rb +9 -0
  32. data/spec/phonetic/core_ext/string/caverphone_spec.rb +9 -0
  33. data/spec/phonetic/core_ext/string/double_metaphone_spec.rb +15 -0
  34. data/spec/phonetic/core_ext/string/metaphone_spec.rb +11 -0
  35. data/spec/phonetic/core_ext/string/nysiis_spec.rb +12 -0
  36. data/spec/phonetic/core_ext/string/refined_soundex_spec.rb +10 -0
  37. data/spec/phonetic/core_ext/string/soundex_spec.rb +14 -0
  38. data/spec/phonetic/double_metaphone_spec.rb +16 -0
  39. data/spec/phonetic/metaphone2_spec.rb +9 -0
  40. data/spec/phonetic/metaphone_spec.rb +81 -0
  41. data/spec/phonetic/nysiis_spec.rb +20 -0
  42. data/spec/phonetic/refined_soundex_spec.rb +13 -0
  43. data/spec/phonetic/soundex_spec.rb +24 -0
  44. data/spec/spec_helper.rb +11 -0
  45. data/spec/support/double_metaphone_data.rb +142 -0
  46. data/spec/support/nysiis_data.rb +31 -0
  47. metadata +180 -0
@@ -0,0 +1,9 @@
1
+ require 'phonetic'
2
+
3
+ describe String do
4
+ describe '#caverphone2' do
5
+ it 'should return Caverphone 2 value of string' do
6
+ 'Deerdre'.caverphone2.should == 'TTA1111111'
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ require 'spec_helper'
2
+
3
+ describe String do
4
+ describe '#caverphone' do
5
+ it 'should return Caverphone value of string' do
6
+ 'Lashaunda'.caverphone.should == 'LSNT11'
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,15 @@
1
+ require 'phonetic'
2
+
3
+ describe String do
4
+ describe '#double_metaphone' do
5
+ it 'should return Double Metaphone code of string' do
6
+ 'Gelatin'.double_metaphone.should == ['KLTN', 'JLTN']
7
+ end
8
+ end
9
+
10
+ describe '#metaphone2' do
11
+ it 'should return Double Metaphone code of string' do
12
+ 'whirlpool'.metaphone2.should == ['ARLP', 'ARLP']
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,11 @@
1
+ require 'phonetic'
2
+
3
+ describe String do
4
+ describe '#metaphone' do
5
+ it 'should return Metaphone code of string' do
6
+ %w(Karen Carina Corin Crain Garneau Gorrono Krenn).each do |name|
7
+ name.metaphone.should == 'KRN'
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,12 @@
1
+ require 'spec_helper'
2
+ require 'support/nysiis_data'
3
+
4
+ describe String do
5
+ describe '#nysiis' do
6
+ it 'should return NYSIIS code of word' do
7
+ Phonetic::NYSIIS_TEST_TABLE.each do |word, result|
8
+ word.nysiis(trim: false).should == result
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,10 @@
1
+ require 'spec_helper'
2
+
3
+ describe String do
4
+ describe '#refined_soundex' do
5
+ it 'should return refined soundex code of word' do
6
+ 'Braz Caren Hayers'.refined_soundex.should == 'B1905 C30908 H093'
7
+ 'Lambard Noulton'.refined_soundex.should == 'L7081096 N807608'
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,14 @@
1
+ require 'spec_helper'
2
+
3
+ describe String do
4
+ describe '#soundex' do
5
+ it 'should return soundex code of word' do
6
+ 'Ackerman'.soundex.should == 'A265'
7
+ 'Fusedale'.soundex.should == 'F234'
8
+ 'Grahl'.soundex.should == 'G640'
9
+ 'Hatchard'.soundex.should == 'H326'
10
+ 'implementation'.soundex.should == 'I514'
11
+ 'Prewett'.soundex.should == 'P630'
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,16 @@
1
+ require 'spec_helper'
2
+ require 'support/double_metaphone_data'
3
+
4
+ describe Phonetic::DoubleMetaphone do
5
+ describe '.encode' do
6
+ it 'should return Double Metaphone codes of string' do
7
+ Phonetic::DOUBLE_METAPHONE_TEST_TABLE.each do |w, r|
8
+ Phonetic::DoubleMetaphone.encode(w).should == r
9
+ end
10
+ end
11
+
12
+ it 'should support max size of the code option' do
13
+ Phonetic::DoubleMetaphone.encode('accede', size: 3).should == ['AKS', 'AKS']
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,9 @@
1
+ require 'spec_helper'
2
+
3
+ describe Phonetic::Metaphone2 do
4
+ describe '.encode' do
5
+ it 'should return Double Metaphone codes of string' do
6
+ Phonetic::Metaphone2.encode('biaggi').should == ['PJ', 'PK']
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,81 @@
1
+ require 'spec_helper'
2
+
3
+ describe Phonetic::Metaphone do
4
+ describe '.encode' do
5
+ it 'should drop duplicate adjacent letters, except for C' do
6
+ Phonetic::Metaphone.encode('Accola Nikki Dillon').should == 'AKKL NK TLN'
7
+ end
8
+
9
+ it 'should drop the first letter if the word begins with KN, GN, PN, AE, WR' do
10
+ Phonetic::Metaphone.encode('Knapp Gnome Phantom Aeneid Wright').should == 'NP NM FNTM ENT RT'
11
+ end
12
+
13
+ it 'should drop B if after M at the end of the word' do
14
+ Phonetic::Metaphone.encode('Plumb Amber').should == 'PLM AMBR'
15
+ end
16
+
17
+ it 'should transform CIA to XIA' do
18
+ Phonetic::Metaphone.encode('Ciara Phylicia').should == 'XR FLX'
19
+ end
20
+
21
+ it 'should transform CH to X if it is not the part of -SCH-' do
22
+ Phonetic::Metaphone.encode('Dratch Heche Christina').should == 'TRX HX KRST'
23
+ end
24
+
25
+ it 'should transform -SCH- to -SKH-' do
26
+ Phonetic::Metaphone.encode('School Deschanel').should == 'SKL TSKN'
27
+ end
28
+
29
+ it 'should transform C to S if followed by I, E, or Y. And to K otherwise' do
30
+ Phonetic::Metaphone.encode('Felicity Joyce Nancy Carol C').should == 'FLST JS NNS KRL K'
31
+ end
32
+
33
+ it 'should transform D to J if followed by GE, GY, or GI. And to T otherwise' do
34
+ Phonetic::Metaphone.encode('Coolidge Lodgy Dixie Pidgin D').should == 'KLJ LJ TKS PJN T'
35
+ end
36
+
37
+ it 'should drop G if followed by H and H is not at the end or before a vowel' do
38
+ Phonetic::Metaphone.encode('Knight Clayburgh Haughton Monaghan').should == 'NT KLBR HTN MNKN'
39
+ end
40
+
41
+ it 'should transform G to J if before I, E, or Y, and to K other otherwise' do
42
+ Phonetic::Metaphone.encode('Gigi Gena Peggy Gyllenhaal Madigan G').should == 'JJ JN PK JLNH MTKN K'
43
+ end
44
+
45
+ it 'should drop G if followed by N or NED and is at the end' do
46
+ Phonetic::Metaphone.encode('GN GNE GNED Agnes Signed').should == 'N N NT ANS SNT'
47
+ end
48
+
49
+ it 'should drop H if after vowel and not before a vowel' do
50
+ Phonetic::Metaphone.encode('Sarah Shahi Moorehead Poehler').should == 'SR XH MRHT PLR'
51
+ end
52
+
53
+ it 'should transform CK to K, PH to F, Q to K, V to F, Z to S' do
54
+ Phonetic::Metaphone.encode('Acker Sophia Quinn Victoria Zelda Karen').should == 'AKR SF KN FKTR SLT KRN'
55
+ end
56
+
57
+ it 'should transform SH to XH, SIO to XIO, SIA to XIA' do
58
+ Phonetic::Metaphone.encode('Ashley Siobhan Siamese').should == 'AXL XBHN XMS'
59
+ end
60
+
61
+ it 'should transform TIA to XIA, TIO to XIO, TH to 0, TCH to CH' do
62
+ Phonetic::Metaphone.encode('Tia Portia Interaction Catherine Dratch Fletcher').should == 'X PRX INTR K0RN TRX FLXR'
63
+ end
64
+
65
+ it 'should transform WH to W at the beginning, drop W if not followed by a vowel' do
66
+ Phonetic::Metaphone.encode('Whoopi Goodwin Harlow Hawley').should == 'WP KTWN HRL HL'
67
+ end
68
+
69
+ it 'should transform X to S at the beginning and X to KS otherwise' do
70
+ Phonetic::Metaphone.encode('Xor Alexis X').should == 'SR ALKS S'
71
+ end
72
+
73
+ it 'should drop Y if not followed by a vowel' do
74
+ Phonetic::Metaphone.encode('Yasmine Blonsky Blyth').should == 'YSMN BLNS BL0'
75
+ end
76
+
77
+ it 'should drop all vowels unless it is the beginning' do
78
+ Phonetic::Metaphone.encode('Boardman Mary Ellen').should == 'BRTM MR ELN'
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+ require 'support/nysiis_data'
3
+
4
+ describe Phonetic::NYSIIS do
5
+ describe '.encode' do
6
+ it 'should return NYSIIS code of word' do
7
+ Phonetic::NYSIIS_TEST_TABLE.each do |word, result|
8
+ Phonetic::NYSIIS.encode(word, trim: false).should == result
9
+ end
10
+ end
11
+
12
+ it 'should return empty string for empty word' do
13
+ Phonetic::NYSIIS.encode('').should == ''
14
+ end
15
+
16
+ it 'should ignore non-english symbols in input' do
17
+ Phonetic::NYSIIS.encode('1234567890+-= Bess $').should == 'BAS'
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ describe Phonetic::RefinedSoundex do
4
+ describe '.encode' do
5
+ it 'should return refined soundex code of word' do
6
+ Phonetic::RefinedSoundex.encode('Braz').should == 'B1905'
7
+ Phonetic::RefinedSoundex.encode('Caren').should == 'C30908'
8
+ Phonetic::RefinedSoundex.encode('Hayers').should == 'H093'
9
+ Phonetic::RefinedSoundex.encode('Lambard').should == 'L7081096'
10
+ Phonetic::RefinedSoundex.encode('Noulton').should == 'N807608'
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+
3
+ describe Phonetic::Soundex do
4
+ describe '.encode' do
5
+ it 'should return soundex code of word' do
6
+ Phonetic::Soundex.encode('Ackerman').should == 'A265'
7
+ Phonetic::Soundex.encode('Fusedale').should == 'F234'
8
+ Phonetic::Soundex.encode('Grahl').should == 'G640'
9
+ Phonetic::Soundex.encode('Hatchard').should == 'H326'
10
+ Phonetic::Soundex.encode('implementation').should == 'I514'
11
+ Phonetic::Soundex.encode('Prewett').should == 'P630'
12
+ end
13
+
14
+ it 'should add zeros if result less then 4 symbols' do
15
+ Phonetic::Soundex.encode('ammonium').should == 'A500'
16
+ Phonetic::Soundex.encode('Rubin').should == 'R150'
17
+ Phonetic::Soundex.encode('H').should == 'H000'
18
+ end
19
+
20
+ it 'should return empty string for empty word' do
21
+ Phonetic::Soundex.encode('').should == ''
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,11 @@
1
+ require 'simplecov'
2
+ SimpleCov.start
3
+
4
+ require 'phonetic'
5
+
6
+ RSpec.configure do |config|
7
+ config.treat_symbols_as_metadata_keys_with_true_values = true
8
+ config.run_all_when_everything_filtered = true
9
+ config.filter_run :focus
10
+ config.order = 'random'
11
+ end
@@ -0,0 +1,142 @@
1
+ # encoding: utf-8
2
+
3
+ module Phonetic
4
+ DOUBLE_METAPHONE_TEST_TABLE = {
5
+ 'accede' => ['AKST', 'AKST'],
6
+ 'accident' => ['AKST', 'AKST'],
7
+ 'avvenente' => ['AFNN', 'AFNN'],
8
+ 'Acker' => ['AKR', 'AKR'],
9
+ 'Agnes' => ['AKNS', 'ANS'],
10
+ 'Akkad' => ['AKT', 'AKT'],
11
+ 'Alicia' => ['ALS', 'ALX'],
12
+ 'Allasio' => ['ALS', 'ALX'],
13
+ 'aqqa' => ['AK', 'AK'],
14
+ 'arch' => ['ARX', 'ARK'],
15
+ 'architect' => ['ARKT', 'ARKT'],
16
+ 'Arnoff' => ['ARNF', 'ARNF'],
17
+ 'Arnow' => ['ARN', 'ARNF'],
18
+ 'Assia' => ['AS', 'AS'],
19
+ 'artois' => ['ART', 'ARTS'],
20
+ 'bacchus' => ['PKS', 'PKS'],
21
+ 'bacci' => ['PX', 'PX'],
22
+ 'bajador' => ['PJTR', 'PHTR'],
23
+ 'Bajja' => ['PJ', 'PJ'],
24
+ 'Barzizza' => ['PRSS', 'PRST'],
25
+ 'bellocchio' => ['PLX', 'PLX'],
26
+ 'bertucci' => ['PRTX', 'PRTX'],
27
+ 'biaggi' => ['PJ', 'PK'],
28
+ 'breaux' => ['PR', 'PR'],
29
+ 'braço' => ['PRS', 'PRS'],
30
+ 'cabrillo' => ['KPRL', 'KPR'],
31
+ 'Cacgia' => ['KK', 'KK'],
32
+ 'caesar' => ['SSR', 'SSR'],
33
+ 'cagney' => ['KKN', 'KKN'],
34
+ 'campbell' => ['KMPL', 'KMPL'],
35
+ 'carlisle' => ['KRLL', 'KRLL'],
36
+ 'carlysle' => ['KRLL', 'KRLL'],
37
+ 'chemistry' => ['KMST', 'KMST'],
38
+ 'cherry' => ['XR', 'XR'],
39
+ 'chianti' => ['KNT', 'KNT'],
40
+ 'chorus' => ['KRS', 'KRS'],
41
+ 'Cielo' => ['SL', 'XL'],
42
+ 'Cioccolato' => ['SKLT', 'XKLT'],
43
+ 'cough' => ['KF', 'KF'],
44
+ 'czerny' => ['SRN', 'XRN'],
45
+ 'dumb' => ['TM', 'TM'],
46
+ 'edgar' => ['ATKR', 'ATKR'],
47
+ 'edge' => ['AJ', 'AJ'],
48
+ 'exam' => ['AKSM', 'AKSM'],
49
+ 'exceed' => ['AKST', 'AKST'],
50
+ 'filipowicz' => ['FLPT', 'FLPF'],
51
+ 'focaccia' => ['FKX', 'FKX'],
52
+ 'gallegos' => ['KLKS', 'KKS'],
53
+ 'Gebal' => ['KPL', 'JPL'],
54
+ 'Gelatin' => ['KLTN', 'JLTN'],
55
+ 'Gepard' => ['KPRT', 'JPRT'],
56
+ 'Gerald' => ['KRLT', 'JRLT'],
57
+ 'Gesture' => ['KSTR', 'JSTR'],
58
+ 'geyser' => ['KSR', 'JSR'],
59
+ 'ghiradelli' => ['JRTL', 'JRTL'],
60
+ 'ghislane' => ['JLN', 'JLN'],
61
+ 'ghost' => ['KST', 'KST'],
62
+ 'gibbon' => ['KPN', 'JPN'],
63
+ 'Gilbert' => ['KLPR', 'JLPR'],
64
+ 'ginger' => ['KNKR', 'JNJR'],
65
+ 'Giethoorn' => ['K0RN', 'JTRN'],
66
+ 'gough' => ['KF', 'KF'],
67
+ 'Grashof' => ['KRXF', 'KRXF'],
68
+ 'hochmeier' => ['HKMR', 'HKMR'],
69
+ 'hugh' => ['H', 'H'],
70
+ 'island' => ['ALNT', 'ALNT'],
71
+ 'isle' => ['AL', 'AL'],
72
+ 'Jankelowicz' => ['JNKL', 'ANKL'],
73
+ 'Jacqueline' => ['JKLN', 'AKLN'],
74
+ 'dejer' => ['TJR', 'TJR'],
75
+ 'jose' => ['HS', 'HS'],
76
+ 'joseph' => ['JSF', 'HSF'],
77
+ 'Jugnot' => ['JNT', 'AKNT'],
78
+ 'Katerine' => ['KTRN', 'KTRN'],
79
+ 'laugh' => ['LF', 'LF'],
80
+ 'Lawrence' => ['LRNS', 'LRNS'],
81
+ 'Loretta' => ['LRT', 'LRT'],
82
+ 'mac caffrey' => ['MKFR', 'MKFR'],
83
+ 'mac gregor' => ['MKRK', 'MKRK'],
84
+ 'Maggie' => ['MJ', 'MK'],
85
+ 'maña' => ['MN', 'MN'],
86
+ 'McClellan' => ['MKLL', 'MKLL'],
87
+ 'McHugh' => ['MK', 'MK'],
88
+ 'McLaughlin' => ['MKLF', 'MKLF'],
89
+ 'michael' => ['MKL', 'MXL'],
90
+ 'Monaghan' => ['MNKN','MNKN'],
91
+ 'Moosholzer' => ['MSLS', 'MSLS'],
92
+ 'Mosheim' => ['MSM', 'MSM'],
93
+ 'nation' => ['NXN', 'NXN'],
94
+ 'orchestra' => ['ARKS', 'ARKS'],
95
+ 'orchid' => ['ARKT', 'ARKT'],
96
+ 'quest' => ['KST', 'KST'],
97
+ 'pizza' => ['PS', 'PTS'],
98
+ 'Portia' => ['PRX', 'PRX'],
99
+ 'raspberry' => ['RSPR', 'RSPR'],
100
+ 'resnais' => ['RSN', 'RSNS'],
101
+ 'Rogge' => ['RK', 'RK'],
102
+ 'rogier' => ['RJ', 'RJR'],
103
+ 'rough' => ['RF', 'RF'],
104
+ 'raj' => ['RJ', 'R'],
105
+ 'san jacinto' => ['SNHS', 'SNHS'],
106
+ 'Scarlett' => ['SKRL', 'SKRL'],
107
+ 'schenker' => ['XNKR', 'SKNK'],
108
+ 'schermerhorn' => ['XRMR', 'SKRM'],
109
+ 'schmidt' => ['XMT', 'SMT'],
110
+ 'schneider' => ['XNTR', 'SNTR'],
111
+ 'school' => ['SKL', 'SKL'],
112
+ 'schooner' => ['SKNR', 'SKNR'],
113
+ 'Sciorra' => ['SR', 'SR'],
114
+ 'Sholman' => ['SLMN', 'SLMN'],
115
+ 'Shoeka' => ['SK', 'SK'],
116
+ 'smith' => ['SM0', 'XMT'],
117
+ 'snider' => ['SNTR', 'XNTR'],
118
+ 'succeed' => ['SKST', 'SKST'],
119
+ 'sugar' => ['XKR', 'SKR'],
120
+ 'szamos' => ['SMS', 'XMS'],
121
+ 'tagliaro' => ['TKLR', 'TLR'],
122
+ 'thames' => ['TMS', 'TMS'],
123
+ 'thomas' => ['TMS', 'TMS'],
124
+ 'thumb' => ['0M', 'TM'],
125
+ 'tichner' => ['TXNR', 'TKNR'],
126
+ 'tough' => ['TF', 'TF'],
127
+ 'Uomo' => ['AM', 'AM'],
128
+ 'van gelder' => ['FNKL', 'FNKL'],
129
+ 'Vasserman' => ['FSRM', 'FSRM'],
130
+ 'wachtler' => ['AKTL', 'FKTL'],
131
+ 'Wasserman' => ['ASRM', 'FSRM'],
132
+ 'weschsler' => ['AXSL', 'FXSL'],
133
+ 'Wesia' => ['AS', 'FS'],
134
+ 'Womo' => ['AM', 'FM'],
135
+ 'Winningham' => ['ANNK', 'FNNK'],
136
+ 'whirlpool' => ['ARLP', 'ARLP'],
137
+ 'wright' => ['RT', 'RT'],
138
+ 'Xavier' => ['SF', 'SFR'],
139
+ 'Yankelovich' => ['ANKL', 'ANKL'],
140
+ 'zhao' => ['J', 'J']
141
+ }
142
+ end
@@ -0,0 +1,31 @@
1
+ module Phonetic
2
+ NYSIIS_TEST_TABLE = {
3
+ 'Alexandra' => 'ALAXANDR',
4
+ 'Aumont' => 'AANAD',
5
+ 'Bonnie' => 'BANY',
6
+ 'Christensen' => 'CHRASTANSAN',
7
+ 'Cleveland' => 'CLAFALAD',
8
+ 'Claudia' => 'CLAD',
9
+ 'Dedee' => 'DADY',
10
+ 'DeLaurentiis' => 'DALARANT',
11
+ 'Echikunwoke' => 'ECACANWAC',
12
+ 'Fahey' => 'FAHY',
13
+ 'Jacqueline' => 'JACGALAN',
14
+ 'John' => 'J',
15
+ 'Hessel' => 'HASAL',
16
+ 'Hubert' => 'HABAD',
17
+ 'Howard' => 'HAD',
18
+ 'Knuth' => 'NNAT',
19
+ 'Kepler' => 'CAPLAR',
20
+ 'Marguerite' => 'MARGARAT',
21
+ 'Smith' => 'SNAT',
22
+ 'Schelte' => 'SSALT',
23
+ 'Macdonald' => 'MCDANALD',
24
+ 'Michael' => 'MACAL',
25
+ 'Phoenix' => 'FFANAX',
26
+ 'Pfeiffer' => 'FFAFAR',
27
+ 'Rebecca' => 'RABAC',
28
+ 'Rosalind' => 'RASALAD',
29
+ 'Schmidt' => 'SSNAD'
30
+ }
31
+ end