File Coverage

blib/lib/Lingua/NameUtils.pm
Criterion Covered Total %
statement 201 201 100.0
branch 110 110 100.0
condition 27 27 100.0
subroutine 17 17 100.0
pod 11 11 100.0
total 366 366 100.0


line stmt bran cond sub pod time code
1             # Lingua::NameUtils - Identify given/family names and capitalize correctly
2             #
3             # Copyright (C) 2023 raf
4             #
5             # This is free software; you can redistribute it and/or modify it under
6             # the same terms as the Perl 5 programming language system itself.
7             #
8             # 20230706 raf
9              
10             package Lingua::NameUtils;
11 2     2   64247 use 5.014;
  2         23  
12 2     2   10 use strict;
  2         4  
  2         40  
13 2     2   10 use warnings;
  2         4  
  2         47  
14 2     2   10 use utf8;
  2         3  
  2         14  
15              
16             our $VERSION = '1.002';
17              
18 2     2   79 use Exporter;
  2         4  
  2         2154  
19             our @ISA = ('Exporter');
20              
21             our @EXPORT = ();
22             our @EXPORT_OK =
23             qw(
24             namecase gnamecase fnamecase namecase_exception
25             namesplit nameparts namesplit_exception namejoin
26             nametrim normalize
27             );
28             our %EXPORT_TAGS =
29             (
30             all => [@EXPORT_OK],
31             case => [qw(namecase gnamecase fnamecase namecase_exception normalize)],
32             split => [qw(namesplit nameparts namesplit_exception namejoin normalize)]
33             );
34              
35             # Like fc() but "folds" apostrophe-like and hyphen-like characters as well
36              
37             my $myfc = (defined eval { &CORE::fc('') }) ? \&CORE::fc : sub { lc shift }; # Downgrade to lc on perl 5.14
38             my $apostrophe = qr/['’ʼʻ]/; # Apostrophe, Right single quotation mark, Modifier letter apostrophe, Modifier letter turned comma
39 1     1   6 my $hyphen = qr/\p{dash punctuation}/; # Hyphen-Minus, Hyphen, En Dash, Em Dash, et al.
  1         2  
  1         13  
40 14964     14964 1 72514 sub kc { return $myfc->(shift) =~ s/$apostrophe/'/gr =~ s/$hyphen/-/gr }
41              
42             # Builtin namecase exceptions (Mostly gathered by Michael R. Davis (MRDVT))
43              
44             my @namecase_exceptions =
45             (qw(
46             MacAlister MacAlpin MacAlpine MacArthur MacAuley MacBain MacBean
47             MacCallum MacColl MacDomhnaill MacDonald MacDonell MacDonnell MacDougall
48             MacDowall MacDuff MacEvan MacEwen MacFarlane MacFie MacGill MacGillivray
49             MacGregor MacInnes MacIntosh MacIntyre MacIver MacKay MacKenzie
50             MacKinlay MacKinnon MacKintosh MacLachlan MacLaine MacLaren MacLaurin
51             MacLea MacLean MacLeay MacLellan MacLennan MacLeod MacMillan MacNab MacNaughton
52             MacNeacail MacNeil MacNeill MacNicol MacO'Shannaig MacPhee MacPherson
53             MacQuarrie MacQueen MacRae MacTavish MacThomas
54              
55             MacAuliffe MacCarty MacClaine MacCauley MacClelland MacCleery MacCloud
56             MacCord MacCleverty MacCredie MacCue MacCurrach MacEachern MacGilvray
57             MacCray MacDuffie MacFadyen MacFarland MacKinley MacKinney MacLaughlin
58             MacIvor MacKechnie MacLucas MacManus MacMartin MacNeary MacNevin
59             MacMahon MacNaught MacNeal MacShane MacWhirter MacAtee MacCarthy
60             MacWilliams MaDej MaGaw
61              
62             AbuArab
63              
64             DaSilva DeAnda DeAngelo DeBardelaben DeBary DeBaugh DeBeck DeBergh
65             DeBerry DeBlanc DeBoe DeBoer DeBonis DeBord DeBose DeBostock DeBourge
66             DeBroux DeBruhl DeBruler DeButts DeCaires DeCamp DeCarolis DeCastro
67             DeCay DeConinck DeCook DeCoppens DeCorte DeCost DeCosta DeCoste DeCoster
68             DeCouto DeFamio DeFazio DeFee DeFluri DeFord DeForest DeFraia DeFrancis
69             DeFrange DeFree DeFrees DeGarmo DeGear DeGeare DeGnath DeGraff
70             DeGraffenreid DeGrange DeGraw DeGrenier DeGroft DeGroot DeGuaincour
71             DeHaan DeHaas DeHart DeHass DeHate DeHaven DeHeer DeHerrera DeJarnette
72             DeJean DeLaet DelAmarre DeLancey DeLara DeLarm DelAshmutt DeLaughter
73             DeLay DeLespine DelGado DelGaudio DeLong DeLony DeLorenzo DeLozier
74             DelPrincipe DelRosso DeLuca DeLude DeLuke DeMaio DeMarchi DeMarco
75             DeMarcus DeMarmein DeMars DeMartinis DeMay DeMello DeMonge DeMont
76             DeMontigny DeMoss DeNunzio DeNure DePalma DePaola DePasquale DePauli
77             DePerno DePhillips DePoty DePriest DeRatt DeRemer DeRosa DeRosier
78             DeRossett DeSaegher DeSalme DeShane DeShano DeSilva DeSimencourt
79             DeSimone DesJardins DeSoto DeSpain DesPlanques DeSplinter DeStefano
80             DesVoigne DeTurck DeVall DeVane DeVaughan DeVaughn DeVaul DeVault
81             DeVenney DeVilbiss DeVille DeVillier DeVinney DeVito DeVore DeVorss
82             DeVoto DeVries DeWald DeWall DeWalt DeWilfond DeWinne DeWitt DeWolf
83             DeYarmett DeYoung DiBenedetto DiBona DiCaprio DiCicco DiClaudio
84             DiClemento DiFrisco DiGiacomo DiGiglio DiGraziano DiGregorio DiLiberto
85             DiMarco DiMarzo DiPaolo DiPietrantonio DiStefano DoBoto DonSang DuBois
86             DuBose DuBourg DuCoin DuPre DuPuy DeVaux DeVoir
87              
88             EnEarl
89              
90             Fitzell
91              
92             LaBarge LaBarr LaBelle LaBonte LaBounty LaBrue LaCaille LaCasse
93             LaChapelle LaClair LaCombe LaCount LaCour LaCourse LaCroix LaFarge
94             LaFeuillande LaFlamme LaFollette LaFontaine LaForge LaForme LaForte
95             LaFosse LaFountain LaFoy LaFrance LaFuze LaGaisse LaGreca LaGuardia
96             LaHaise LaLande LaLanne LaLiberte LaLonde LaLone LaMaitre LaMatry LaMay
97             LaMere LaMont LaMotte LaMunyon LaPierre LaPlante LaPointe LaPorte
98             LaPrade LaPrairie LaQue LaRoche LaRochelle LaRose LaRue LaSalle LaSance
99             LaSart LaTray LaVallee LaVeau LaVenia LaVigna LeBerth LeBlond LeBoeuf
100             LeBreton LeCaire LeCapitain LeCesne LeClair LeClaire LeClerc LeCompte
101             LeConte LeCour LeCrone LeDow LeDuc LeFevre LeFlore LeFors LeFridge
102             LeGrand LeGras LeGrove LeJeune LeMaster LeMesurier LeMieux LeMoine
103             LePage LeQuire LeRoy LeStage LeSuer LeVally LeVert LiConti LoManto
104             LoMastro LoRusso
105              
106             SanFillipo SanGalli SantaLucia
107              
108             TePas
109              
110             VanArsdale VanBuren VanCamp VanCleave VanDalsem VanderLey VanderNeut
111             VanderTol VanderWegen VanDerWeyer VanderWilligen VanDevelde VandeWege
112             VanDolah VanDusen VanDyke VanHee VanHoak VanHook VanHoose VanHouten
113             VanHouwe VanHoven VanKampen VanKleck VanKleeck VanKuiken VanLanduyt
114             VanLeer VanLiere VanLuven VanMeter VanOlinda VanOrmer VanPelt VanSchaick
115             VanSciver VanScoy VanScoyk VanSickle VanTassel VanTuyl VanValkenburg
116             VanVolkenburgh VanWinkle VanWysenberghe VanZandt VenDerWeyer VonCannon
117             ));
118              
119             my %namecase_exceptions;
120              
121             # Capitalization exceptions for full names used by namecase().
122             # Include both forms: "given_names family_name" and "family_name, given_names".
123              
124             my %namecase_exceptions_full;
125              
126             # Capitalization exceptions for full names used by fnamecase().
127             # This must have the same keys as namecase_exceptions_full.
128              
129             my %fnamecase_exceptions_full;
130              
131             # Non-individual case exception replacements need a long regex that needs to
132             # be constructed, and can change. But probably not often. And sometimes a
133             # lot at once. Regex construction is cached lazily when needed for use.
134              
135             my $need_case_update = 1;
136             my $namecase_exceptions_re;
137              
138             # Name affixes that start a multi-word family name
139              
140             my %split_starter;
141             my $split_starter_re;
142             my @split_starter =
143             (qw(
144             de de’ de' del dels dela della delle dal dalla degli di da du do dos das
145             le la li lo y i
146             van von zu der ter den af av til
147             el al ibn bin ben bat bint binti binte mibeit mimishpachat
148             of o ó ni ní mac nic ua bean ui uí mhic ap ab ferch verch
149             san santa santos st st. ste ste.
150             ka te
151             ));
152              
153             # Data for regexes that are affected by normalization
154              
155             my @irish_o = qw(O Ó);
156             my @irish_vowel = qw(a e i o u á é í ó ú);
157             my @irish_post_bean = qw(Uí Ui Mhic);
158              
159             my $irish_o_re = "(?:@{[join '|', @irish_o]})";
160             my $irish_vowel_re = "(?:@{[join '|', @irish_vowel]})";
161             my $irish_post_bean_re = "(?:@{[join '|', @irish_post_bean]})";
162              
163             # Family names that appear first (Chinese, Korean, Vietnamese).
164             # When romanized, these family names can appear first or last.
165             # This is only possible when there are only hundreds of names.
166             # For Japanese, a statistical method is used.
167              
168             my %family_names_ck;
169             my $family_names_ck_re;
170             my %family_names_ck_roman;
171             my $family_names_ck_roman_re;
172             my %family_names_v_roman;
173             my $family_names_v_roman_re;
174              
175             my @family_names_chinese =
176             (qw(
177             王 李 張 张 劉 刘 陳 陈 楊 杨 黃 黄 趙 赵 吳 吴 周 徐 孫 孙 馬 马 朱 胡 郭 何 林 高
178             羅 罗 鄭 郑 梁 謝 谢 宋 唐 許 许 鄧 邓 韓 韩 馮 冯 曹 彭 曾 蕭 萧 田 董 潘 袁 蔡 蔣 蒋
179             余 于 杜 葉 程 魏 蘇 呂 丁 任 盧 卢 苏 吕 姚 沈 鍾 钟 姜 崔 譚 谭 陸 陆 范 汪 廖 石
180             金 韋 韦 賈 贾 夏 傅 方 鄒 邹 熊 白 孟 秦 邱 侯 江 尹 薛 閻 阎 段 雷 龍 龙 黎 史 陶
181             賀 贺 毛 郝 顧 顾 龔 龚 邵 萬 万 覃 武 錢 钱 戴 嚴 严 歐 欧 莫 孔 向 常 湯 汤 康 易
182             喬 乔 賴 赖 文 施 洪 辛 柯 莊 庄
183              
184             温 牛 樊 葛 邢 安 齐 伍 庞 颜 倪 聂 章 鲁 岳 翟 殷 詹 申 耿 关 兰 焦 俞 左 柳 甘 祝 包 宁 尚 符
185             舒 阮 纪 梅 童 凌 毕 单 季 裴 霍 涂 成 苗 谷 盛 曲 翁 冉 骆 蓝 路 游 靳 欧阳 管 柴 蒙 鲍 华 喻
186             祁 蒲 房 滕 屈 饶 解 牟 艾 尤 阳 时 穆 农 司 卓 古 吉 缪 简 车 项 连 芦 麦 褚 娄 窦 戚 岑 景 党
187             宫 费 卜 冷 晏 席 卫 米 柏 宗 瞿 桂 全 佟 应 臧 闵 苟 邬 边 卞 姬 师 和 仇 栾 隋 商 刁 沙 荣 巫
188             寇 桑 郎 甄 丛 仲 虞 敖 巩 明 佘 池 查 麻 苑 迟 邝 官 封 谈 匡 鞠 惠 荆 乐 冀 郁 胥 南 班 储 原
189             栗 燕 楚 鄢 劳 谌 奚 皮 粟 冼 蔺 楼 盘 满 闻 位 厉 伊 仝 区 郜 海 阚 花 权 强 帅 屠 豆 朴 盖 练
190             廉 禹 井 祖 漆 巴 丰 支 卿 国 狄 平 计 索 宣 晋 相 初 门 雲 容 敬 来 扈 晁 芮 都 普 阙 浦 戈 伏
191             鹿 薄 邸 雍 辜 羊 阿 乌 母 裘 亓 修 邰 赫 杭 况 那 宿 鲜 印 逯 隆 茹 诸 战 慕 危 玉 银 亢 嵇 公
192             哈 湛 宾 戎 勾 茅 利 於 呼 居 揭 干 但 尉 冶 斯 元 束 檀 衣 信 展 阴 昝 智 幸 奉 植 衡 富 尧 闭 由
193              
194             習 习 隰 郤 郗
195             ));
196              
197             my @family_names_chinese_roman =
198             (qw(
199             Wáng Wang Wong Vang Ông Bong Heng Vòng Uōng Waon Whang Vương Ong Ō
200             Lǐ Li Lei Lee Ly Lí Lî Lý Ri Yi Rhee Dy Dee Sy
201             Zhāng Chang Zoeng Cheung Cheong Chong Tiuⁿ Tioⁿ Teo Teoh Tio Chông Tong Thong Tsan Tzan Zan Trương Jang Chō Tiu Tiong Sutiono Tjong
202             Liú Liu Lau Lao Lou Lưu Lâu Low Liù Liew Lew Lieu Lio Yu Yoo Ryū
203             Chén Ch'en Can Chan Chun Chean Chin Tân Tan Tang Ting Chhìn Thín Thin Zen Tchen Trần Jin Tantoco Tanteksi
204             Yáng Yang Joeng Yeung Yeong Ieong Young Iûⁿ Iôⁿ Yeoh Yeo Yo Nyo Yòng Yong Iōng Yan Ian Dương Yu Yung Yana Yongco Yuchengco Yō
205             Huáng Huang Wong Wang Vong N̂g Ûiⁿ Ng Ung Ooi Uy Wee Vòng Bong Uōng Fong Waon Whang Hoàng Huỳnh Hwang Kō
206             Zhào Chao Ziu Chiu Chu Chio Jiu Tiō Tiǒ Teo Teoh Chhau Chau Thèu Cheu Chew Zau Zo Triệu Jo Tio Chō
207             Wú Wu Ng Ung Eng Gô͘ Ngô͘ Goh Ǹg Woo Ngô Oh Go Kure Ngo Gozon Gozum Cinco Gochian Gokongwei Gosiengfiao
208             Zhōu Chou Zau Chow Chau Jao Chao Chiu Chew Jew Chiû Chiew Tiu Cheu Tseu Tzo Chu Châu Ju Shū Joe
209             Xú Hsü Ceoi Tsui Choi Chui Tsua Chhî Sîr Chee Cher Cheu Swee Ji Jee Chhì Chi Chhié Zhi Zee Zi Từ Seo Sho Dharmadjie Christiadjie
210             Sūn Sun Syun Suen Sng Suiⁿ Soon Sûn Sen Tôn Son Suan
211             Mǎ Ma Maa Mah Mar Má Bé Bey Beh Baey Mâ Mo Mu Mã Mapua Ba
212             Zhū Chu Zyu Chue Choo Chû Tu Tsy Tsyu Tzu Châu Ju Shu Gee
213             Hú Hu Wu Woo Vu Ô͘ Oh Ow Aw Fù Foo Ū Hồ Ho Ko
214             Guō Kuo Gwok Kwok Kuok Koeh Keh Kerh Kueh Koay Quay Kwek Quek Kwik Kok Koh Goh Koq Quách Gwak Kaku Que Cue Quezon Quison Ker Kho Kue
215             Hé Hê Ho Hoe Hô Hor Hou Hò Hó Wu Woo Hà Ha Ka
216             Lín Lin Lam Lum Lîm Lim Lìm Līm Ling Lâm Im Rim Rin Hayashi
217             Gāo Kao Gou Ko Kou Go Ko͘ Kor Kô Kau Koo Gau Cao Kō Caw Co Gao
218             Luó Lo Law Loh Lowe Lor Lô Lò Lō Lu Loo La Na Ra
219             Zhèng Cheng Zeng Cheang Chiang Tēⁿ Tīⁿ Tìⁿ Tēeⁿ Tay Teh Chhang Chang Thàng Zen Zung Trịnh Jeong Tei Ty Tee
220             Liáng Liang Loeng Leung Leong Lang Leng Niû Niô͘ Neo Liòng Liōng Lian Lương Yang Ryang Liong Niu Ryō
221             Xiè Hsieh Ze Tse Che Chiā Siā Sià Chia Cheah Seah Tshia Chhià Zhia Zia Tạ Sa Sha Tsia Sia Saa Sese Shie
222             Sòng Sung Sàng Song Soong Sūng Son Tống Sō Songco
223             Táng T'ang Tong Tn̂g Tông Tng Tang Thòng Thong Thóng Daon Daan Đường Dang Teng Tō
224             Xǔ Hsü Heoi Hui Hoi Khó͘ Koh Khoh Ko Hí Hee Hé Siu Syu Shiu Hái Hứa Heo Kyo Kho Co Kaw Cojuangco
225             Dèng Teng Dang Tang Theng Tēng Tèng Then Ten Thèn Den Đặng Deung Tō Deang Tengco Tangco
226             Hán Han Hon Hân Hang Hòn Hón Ghoe Reu Hàn Kan
227             Féng Feng Fung Fong Pâng Pang Fùng Phùng Foong Fūng Von Vong Pung Hō Pangco
228             Cáo Ts'ao Cou Cho Tso Chaw Chô Chô͘ Chow Tshò Tshàu Chhóu Zau Zo Tào Jo Sō
229             Péng P'eng Pang Banh Phêⁿ Phîⁿ Phêeⁿ Peh Phe Phàng Phang Pháng Ban Bành Paeng Hō Beng Pangco Pay
230             Zēng Tseng Zang Tsang Chang Dong Chan Tsên Chen Tsen Tzen Tsung Tăng Jeung Sō Tjan Tzeng
231             Xiāo Hsiao Siu Shiu Sio Siau Seow Siow Siâu Siew Siaw Sieu Shio Tiêu So Siao Syaw Shau Shao Shaw Shō
232             Tián T'ien Tin Chan Tiân Chang Thièn Thien Then Thién Di Dee Điền Jeon Tian Tien Ten
233             Dǒng Tung Dung Tong Táng Tóng Túng Tûng Ton Toong Đổng Dong Tō
234             Pān P'an Pun Poon Phoaⁿ Phua Phân Pan Phan Phon Phoe Poe Ban Han Pua
235             Yuán Yüan Jyun Yuen Wan Oân Wang Yèn Yen Iōn Yoe Yoo Yeu Viên Won En Yan
236             Cài Ts'ai Coi Choi Choy Tsoi Toy Chhoà Chua Chhai Chai Chhói Tsa Thái Sái Chae Sai Chuah Cua Choa Tsai Tsay
237             Jiǎng Chiang Zoeng Tseung Cheung Chiúⁿ Chióⁿ Cheoh Chioh Tsiòng Cheong Chiông Cian Jian Tưởng Jang Shō Chio Chiu Chung
238             Yú Yü Jyu Yu Yue U Yee Î Û Îr Ee Eu Yì Uī Dư Yeo Yo Ie Iman Oe
239             Sū Su Sou So So͘ Soh Sû Soo Tô Solon
240             Lǚ Lü Leoi Lui Loi Lū Lī Lǐr Lee Leu Ler Loo Lî Liê Li Lữ Lã Yeo Ryeo Ryo Lu Luy
241             Dīng Ting Ding Teng Tén Ten Tiang Tin Đinh Jeong Tei
242             Rén Jen Jam Yam Iam Yum Jîm Lîm Līm Jim Ngim Yim Nìm Nin Nying Nhiệm Nhậm Im Jin
243             Lú Lu Lou Lo Lô͘ Loh Lù Loo Lū Lư Lô No Ro
244             Yáo Yao Jiu Yiu Yeow Io Iu Iâu Yeo Yào Yow Iēu Yau Diêu Yo Yō
245             Shěn Shen Sam Shum Sum Sham Sím Sim Shím Sen Sung Thẩm Trầm Shim Shin
246             Zhōng Chung Zung Chong Chiong Cheng Chûng Tsung Tung Tson Tzon Jong Shō
247             Jiāng Chiang Goeng Keung Geung Keong Khiang Khiong Khiuⁿ Kiang Kiông Kiong Cian Jian Khương Kang Kyō
248             Cuī Ts'ui Ceoi Chui Choi Chhui Chwee Tshûi Chooi Chhoi Tsoe Tseu Thôi Sai Tseui
249             Tán T'an Taam Tam Tom Ham Hom Thâm Tham Thàm Thóm De Dae Đàm Dam Tan
250             Lù Lu Luk Lok Lio̍k Loke Lek Liu̍k Liuk Loh Loq Lục Yuk Ryuk Riku Diokno
251             Fàn Fan Faan Hoān Hoǎn Hwan Huang Hoan Fam Ve Vae Phạm Beom Han Juan
252             Wāng Wang Wong Ong Óng Vong Uong Waon Whang Uông Ō Ang
253             Liào Liao Liu Lew Leow Liew Lio Liāu Liàu Liau Liow Lièu Liêu Liệu Ryo Ryō
254             Shí Shih Sek Shek Seac Seak Chio̍h Chioh Cheoh Sha̍k Sak Shak Zah Zaq Thạch Seok Seki
255             Jīn Chin Gam Kam Gum Kim Kîm Cin Jin Kin
256             Wéi Wei Wai Vai Ûi Úi Wee Vúi Vì Wooi Uī We Vi Wi I Uy
257             Jiǎ Chia Gaa Ka Ga Ká Kée Kia Kâ Cia Jia Giả Go
258             Xià Hsia Haa Ha Hē Hā Hà Hēe Hah Hay Gho Ya Wo Hạ Ka
259             Fù Fu Foo Pò͘ Poh Phó Bu Po
260             Fāng Fang Fong Hong Png Puiⁿ Pung Fông Faon Faan Phương Bang Hō
261             Zōu Tsou Zau Chau Chow Jao Cho͘ Cho Che Chou Choh Tsêu Chew Chiew Chiu Tseu Tzeu Châu Chu Shū
262             Xióng Hsiung Hung Hong Hîm Him Yùng Yoong Hiūng Yon Hùng Ung Yū
263             Bái Pai Baak Pak Bahk Pe̍h Pe̍k Peh Pha̍k Phak Bah Baq Bạch Baek Haku Bo
264             Mèng Meng Maang Mang Bēng Bèng Men Màng Man Mạnh Maeng Mō
265             Qín Ch'in Ceon Chun Tseun Tseon Chon Chîn Ching Tshìn Chin Chhín Zhin Zin Tần Jin Shin
266             Qiū Ch'iu Jau Yau Iao Iau Khu Khoo Kho Khiû Hiû Hew Khew Khiu Chieu Khâu Gu Kyū Hiew Chiew Coo Chiou
267             Hóu Hou Hau Hao Hô͘ Hâu Kâu Hoh Hèu Hew Héu Gheu Roe Hầu Hu Kō Caw Ho
268             Jiāng Chiang Gong Kong Kang Kông Kaon Giang Gang Kō Kiang
269             Yǐn Yin Wan Ún Ín Un Eun Eung Yún Yoon Doãn Yun In Unson
270             Xuē Hsüeh Sit Sih Siet Set Siot Shih Siq Tiết Seol Setsu
271             Yán Yen Jim Yim Im Giâm Ngiam Ngiàm Yam Iēm Ni Gni Nyi Diêm Yeom En
272             Duàn Tuan Dyun Tuen Tun Toān Toàn Tng Teung Thon Ton Thòn Doe Deu Đoàn Dan
273             Léi Lei Leoi Lui Loi Lûi Lùi Looi Lōi Le Lae Lôi Roe Noe Rai Luy Hoisan
274             Lóng Lung Loong Long Lêng Liông Leng Liong Liùng Liūng Lon Yong Ryong Ryō Leong Wee
275             Lí Li Lai Lê Loy Loi Lì Lài Lee Lī Yeo Ryeo Rei
276             Shǐ Shih Si Sze Sú Sái Sír Ser Seu Sṳ́ Soo Sî Sy Sử Sa Shi
277             Táo T'ao Tou To Tao Tow Tô Tô͘ Thô Thàu Thò Thóu Dau Do Đào Tō
278             Hè Hê Ho Hō Hò Hor Fo Wu Woo Hạ Ha Ka
279             Máo Mao Mou Mo Mô͘ Mor Mô Mâu Mōu Mau Bō
280             Hǎo Hao Kok Hok Hak Khok Heh Heq Hác Kaku
281             Gù Ku Gu Goo Khoo Kò͘ Koh Koo Kū Cố Go Ko Coo
282             Gōng Kung Gung Kwong Kéng Kiong Kiûng Kong Kiung Cion Jiong Jun Cung Gong Kyō
283             Shào Shao Siu Shiu Shaw Sio Siō Siāu Siàu Seow Sioh Shau Sau Sèu Zau Zo Thiệu So Shō Siao Syaw
284             Wàn Wan Maan Man Meng Bān Bàn Buang Van Màn Vae Mae Ve Me Vạn Ban
285             Tán Qín T'an Taam Tam Thâm Thàm Thóm Dae De Dam Tan
286             Wǔ Wu Mou Mo Bú Boo Vú Moo Woo Mú Ghu Vũ Võ Mu Bu
287             Qián Ch'ien Cin Chin Chee Chîⁿ Tshièn Chen Chhién Zhi Zee Tiền Jeon Sen Chi
288             Dài Tai Daai Tè Tèr Thài Ta Da Đái Đới Dae Te
289             Yán Yen Jim Yim Im Giâm Ngiam Ngiàm Yam Ngiēm Ni Gni Nyi Nghiêm Eom Gen Gan
290             Ōu Ou Au Eu Ō
291             Mò Mo Mok Bo̍h Bo̍k Mo̍k Moh Moq Mạc Baku
292             Kǒng K'ung Hung Khóng Kong Khong Khúng Koong Khoong Khon Kung Khổng Kyō Consunji
293             Xiàng Hsiang Hoeng Heung Hiòng Hiàng Hiang Hióng Shian Hian Hưởng Hyang 향 Kyō
294             Cháng Ch'ang Soeng Sheung Siông Siâng Sioh Seoh Sòng Song Sōng Zan Thường Sang Shō Thōng
295             Tāng T'ang Tong Thng Tng Teung Thông Thong Thaon Thaan Thang Tō Tang
296             Kāng Kang Hong Khng Khang Không Khong Kong Khaon Khaan Gang Kō
297             Yì Yi Yik E̍k Ia̍k Ek Yit Iak I Yih Yiq Dịch Yee Eki
298             Qiáo Ch'iao Kiu Kiâu Keow Kiao Khiàu Kiew Khiew Khiéu Jiau Djio Jioh Kiều Kyo Kyō
299             Kē kʻo O Ngo Koa Kho Ko Ker Quah Kwa Khô Ko´ Khu Koo Kha Ga Ka Cua Kua Co Coson
300             Lài Lai Laai Lay Lōa Lòa Nai La Le Lae Lại Roe 뢰 Noe Rai
301             Wén Wen Man Bûn Boon Vùn Voon Mūn Ven Vung Văn Moon Bun
302             Shī Shih Si Xi Soa Sy Sua Sṳ̂ Sii´ Thí Shi I See Sze
303             Hóng Hung Huhng Âng Hông Ang Hong Fùng Fung Ghon Won Ung Hồng Hòng Kō
304             Xīn Hsin San Sen Sîn Sin Xin´ Sîng Shin Tân Sing Singson
305             Zhuāng Chuang Zong Tsong Chong Jong Chng Cheng Chông Zong´ Tsaon Tsaan Tzaon Trang Đồ Dưa Chan Chang Jang Shō Sō Ching Chung
306              
307             An Ang Ao Au Au_Yeung Ba Bai Ban Bao Bau Bi Bo Bu Cai Cao Cha Chai Cham Chan Chang Chao Chau Che
308             Cheah Chee Chen Cheng Cheong Chern Cheung Chew Chi Chia Chiang Chiao Chien Chim Chin Ching Chiong
309             Chiou Chiu Cho Choi Chong Choo Chou Chow Choy Chu Chua Chuang Chui Chun Chung Cong Cui Dai Dang
310             Dea Deng Ding Do Dong Doo Du Duan Dung Eng Fan Fang Fei Feng Fok Fong Foo Fu Fung Gan Gang Gao
311             Gau Ge Geng Go Goh Gong Gu Guan Guo Ha Hai Han Hang Hao Hau He Ho Hoh Hom Hon Hong Hoo Hou Hsi
312             Hsia Hsiao Hsieh Hsiung Hsu Hsueh Hu Hua Huang Hui Huie Hum Hung Huo Hwang Hy Ing Ip Jan Jang
313             Jen Jeng Jeung Jew Jia Jian Jiang Jiao Jim Jin Jing Jo Joe Jong Joo Jou Jow Ju Jue Jung Kam Kan
314             Kang Kao Kau Ke Keng Kho Khoo Kiang King Ko Koh Kong Koo Kook Kou Ku Kuan Kuang Kuk Kung Kuo Kwan
315             Kwock Kwok Kwon Kwong Lai Lam Lan Lang Lao Lau Lee Lei Leng Leong Leung Lew Li Lian Liang Liao Liaw
316             Lien Liew Lim Lin Ling Liou Liu Lo Loh Lok Long Loo Lu Lua Lui Luk Lum Lung Luo Ma Mah Mai Mak Man
317             Mao Mar Mau Mei Meng Miao Min Ming Miu Mo Mok Mon Mou Moy Mu Mui Na Ng Ngai Ngan Ngo Ni Nie Ning Niu
318             On Ong Ou Ou_Yang Ow Owyang Pan Pang Pao Pau Pei Peng Pi Ping Po Pon Pong Poon Pu Pun Qi Qian Qiao
319             Qin Qiu Qu Quan Que Rao Ren Rong Ruan San Sang Seto Sha Sham Shan Shang Shao Shaw Shek Shen Sheng
320             Sheu Shi Shiau Shieh Shih Shing Shiu Shu Shum Shy Shyu Si Sieh Sin Sing Sit Situ Siu So Soh Song
321             Soo Soo_Hoo Soon Soong Su Suen Sui Sum Sun Sung Sze Szeto Tai Tam Tan Tang Tao Tay Te Teh Teng Teo
322             Tian Tien Tin Ting Tiu To Toh Tong Tsai Tsang Tsao Tsay Tse Tseng Tso Tsoi Tsou Tsu Tsui Tu Tuan
323             Tung Tzeng U Un Ung Wah Wai Wan Wang Wee Wei Wen Weng Wing Wong Woo Woon Wu Xi Xia Xiang Xiao Xie
324             Xin Xing Xiong Xu Xue Yam Yan Yang Yao Yap Yau Yaw Ye Yee Yeh Yen Yep Yeung Yi Yim Yin Ying Yip Yiu
325             Yong Yoon You Young Yu Yuan Yue Yuen Yun Yung Zang Zeng Zha Zhan Zhang Zhao Zhen Zheng Zhong Zhou Zhu
326             Zhuang Zhuo Zong Zou
327             ));
328              
329             my @family_names_korean =
330             (qw(
331             가 價 賈
332             간 簡 間
333             갈 葛
334             감 甘
335             강 姜 康 強 剛 江 㝩
336             견 堅 甄
337             경 京 慶 景 耿
338             계 季 桂
339             고 顧 高
340             곡 曲 谷
341             공 公 孔
342             곽 廓 槨 郭
343             관 管 關
344             교 喬 橋
345             구 丘 仇 具 邱
346             국 國 菊 鞠 鞫 麴
347             궁 宮 弓
348             궉 鴌
349             권 權 勸 㩲 券
350             근 斤
351             금 琴 禁 芩 金
352             기 奇 寄 箕 紀
353             길 吉
354             김 金
355             나 라 羅 蘿 邏 那
356             난 란 欒
357             남 南 男
358             남궁 南宫 南宮
359             낭 랑 浪
360             내 乃 奈
361             노 로 努 卢 盧 蘆 虜 路 魯
362             뇌 뢰 雷
363             다 多
364             단 單 段 端
365             담 譚
366             당 唐
367             대 代 大 戴
368             도 到 度 桃 覩 道 都 陶
369             독고 獨孤
370             돈 頓
371             동 東 童 董 蕫 薫
372             동방 東方
373             두 杜
374             등 滕 鄧
375             등정 藤井
376             라 羅 蘿 邏
377             란 欒
378             랑 浪
379             려 呂
380             로 盧 路 魯
381             뢰 雷
382             류유 㧕 劉 柳
383             리 李
384             림 林
385             마 馬 麻
386            
387             망절 網切
388             매 梅
389             맹 孟
390             명 明
391             모 慕 毛 牟
392             목 睦 穆
393             묘 苗
394             무 武
395             무본 武本
396             묵 墨
397             문 文 門
398             미 米
399             민 悶 敏 旻 民 珉 閔
400             박 博 朴
401             반 潘 班
402             방 房 方 旁 芳 邦 防 龐
403             배 培 背 裵 輩 配
404             백 伯 柏 白 百
405             번 樊
406             범 範 范
407             변 卞 變 邊
408             보 保 寶 甫
409             복 卜
410             복호 卜扈
411             봉 奉 鳳
412             부 付 傅 夫 富
413             비 丕
414             빈 彬 濱 貧 賓 賔
415             빙 氷
416             부여 夫餘
417             사 史 司 沙 舍 謝
418             사공 司公 司空
419             산 山
420             삼 杉 森
421             상 商 尙 尚 常
422             서 俆 徐 書 緖 西
423             서문 西問 西門
424             석 席 昔 石 釋
425             선 善 宣 鮮
426             선우 蘚于 鮮于 鮮宇 鮮牛
427             설 偰 卨 楔 薛 辥 雪
428             섭 葉
429             성 城 宬 成 星 盛
430             소 卲 小 所 昭 簫 肖 蕭 蘇 邵
431             손 孫 損 蓀 遜
432             송 宋 松 送
433             수 水 洙 隋
434             순 淳 筍 舜 荀 順 旬
435             승 承 昇
436             시 施 時 柴
437             신 伸 信 愼 新 申 莘 辛
438             심 心 沁 沈 深
439             아 阿
440             안 安 案 顔
441             애 艾
442             야 夜
443             양 량 揚 梁 楊 樑 樣 洋 粱 陽
444             어 漁 魚
445             어금 魚金
446             엄 㘙 儼 嚴
447             여 려 余 呂 黎 予
448             연 련 延 涎 燕 連
449             염 렴 廉 簾 閻
450             엽 葉
451             영 影 榮
452             예 倪 禮 芮 藝
453             오 五 伍 吳 吾 晤
454             옥 玉
455             온 溫
456             옹 邕 雍
457             완 阮
458             왕 汪王
459             요 姚
460             용 룡 龍
461             우 于 偶 宇 寓 尤 愚 牛 禹 遇
462             운 芸 雲
463             원 元 原 圓 苑 袁 阮 院
464             위 偉 衛 韋 魏
465             유 류 兪 劉 庾 有 杻 枊 柳 楡 由 裕
466             육 륙 陸
467             윤 尹 允 潤
468             은 殷 恩 隱 銀 誾
469             음 陰
470             이 리 李 㛅 伊 利 怡 異
471             인 印
472             임 림 任 壬 恁 林
473             자 慈
474             장 張 場 壯 將 庄 漿 章 臧 莊 葬 蔣 藏 裝 長
475             전 全 戰 田 錢
476             점 佔
477             정 鄭 丁 定 情 政 桯 正 程
478             제 諸 齊
479             제갈 諸葛 諸曷 諸渴
480             조 趙 刁 曺 朝 調 造 曹
481             종 宗 鍾
482             좌 佐 左
483             주 主 周 朱 株 珠
484             증 增 曾
485             지 地 智 池 遲
486             진 䄅 晋 珍 眞 秦 蔯 進 陣 陳
487             차 車 次
488             창 倉 昌
489             채 菜 蔡 采
490             천 千 天 川
491             초 初 楚
492             최 催 寉 崔 最
493             추 秋 鄒
494             탁 卓
495             탄 彈
496             태 太 泰
497             판 判
498             팽 彭
499             편 片
500             평 平
501             포 包
502             표 俵 表
503             풍 馮
504             피 皮
505             필 弼 畢
506             하 何 夏 河
507             학 郝
508             한 恨 汗 漢 韓
509             함 咸
510             해 海 解
511             허 許
512             현 玄 賢
513             형 刑 形 邢
514             호 扈 湖 胡 虎 鎬
515             홍 㤨 䜤 哄 弘 洪 烘 紅
516             화 化
517             황 晃 潢 煌 皇 簧 荒 黃
518             황목 荒木
519             황보 皇甫 黃甫
520             후 侯 候 后
521            
522            
523             ));
524              
525             my @family_names_korean_roman =
526             (qw(
527             Ga Ka Kar Gar Kah Gah Ca Cah Car
528             Gan Kan Gahn Kahn
529             Gal Kal Karl Garl Gahl Kahl Cahl Carl Cal
530             Gam Kam Kahm Gahm Cam
531             Gang Kang Kahng Khang
532             Gyeon Kyŏn Kyun Kyeon Kyoun Kyon
533             Gyeong Kyŏng Kyung Kyoung Kyeong Kyong
534             Gye Kye Kyeh Kay Kie Kae Gae
535             Go Ko Koh Goh Kho Gho Kor Co
536             Gok Kok Kog Gog Cock Gogh Cough
537             Gong Kong Kohng Koung Goung Khong Cong
538             Gwak Kwak Kwag Kwack Gwag Koak Kuark Quack Quark
539             Gwan Kwan Quan Kuan Guan
540             Gyo Kyo Kyoh Gyoh
541             Gu Ku Koo Goo Kou Kuh Khoo Khu
542             Guk Kuk Kook Gook Kug Gug Cook
543             Gung Kung Koong Kwoong
544             Gwok Kwŏk Kwog Gwog Quock
545             Gwon Kwŏn Kwon Kweon Kwun
546             Geun Kŭn Keun Kuen Guen
547             Geum Kŭm Keum Kum Gum Guem Kuem
548             Gi Ki Kee Key Gee Ky Khee Kie
549             Gil Kil Gill Khil Keel Kihl Kiehl Kill
550             Gim Kim Ghim Kym Keem Gym
551             Na Ra Nah La Rha Rah Law
552             Nan Ran Nahn Rahn Nhan Rhan Lan Lahn
553             Nam Nahm Nham Narm
554             Namgung Namkung Namgoong Namkoong Namkuhng Namguhng
555             Nang Rang Nahng Lang
556             Nae Nai Nay Nea
557             No Ro Noh Roh Nau Rau
558             Noe Roe Roi Noi
559             Da Ta
560             Dan Tan Dahn Than
561             Dam Tam Tham Dham Dahm Tahm
562             Dang Tang Dhang Thang
563             Dae Tae Dai Dea Day Tai Tay Tea
564             Do To Dho Doh Toe Doe Toh
565             Dokgo Tokko Dokko Toko Doko Dockko Dogko Togko Tokgo
566             Don Ton Dohn Tohn
567             Dong Tong Dhong Thong
568             Dongbang Tongbang Tongpang Dongpang
569             Du Tu Doo Do Dou Tou To Too
570             Deung
571             Deungjeong
572             Ra Rah
573             Ran Rahn
574             Rang
575             Ryeo Ryuh
576             Roh
577             Roe Roi
578             Ryu Ryou Rou Ryoo Yu Yoo You Yuh
579             Ree
580             Rim Leem
581             Ma Mah Mar
582             Man Mann Mahn
583             Mangjeol Mangjŏl Mangjul Mangjuhl Mangjoul
584             Mae May Mea Mai
585             Maeng Maing Meang
586             Myeong Myŏng Myung Myoung Myong
587             Mo Moh Moe
588             Mok Mock Mog Mork
589             Myo Myoh Mio
590             Mu Moo
591             Mubon
592             Muk Mook
593             Mun Moon Muhn
594             Mi Mee Mih Meeh Me
595             Min Minn Mihn Mean
596             Bak Pak Park Back Bahk Pahk
597             Ban Pan Bahn Pahn Bhan Van
598             Bang Pang Bhang Bahng Pahng Phang
599             Bae Pae Bai Bea Pai Bay Pay
600             Baek Paek Baik Back Paik Pack Beak
601             Beon Bun Burn
602             Beom Pŏm Bum Bom Peom Pum Puhm Buhm
603             Byeon Pyŏn Byun Byon Pyun Byoun Pyon Pyoun Pyeon
604             Bo Po Boh Poh
605             Bok Pok Pock Bog Pog Bock
606             Bokho Pokho Pockhoh Boghoh Poghoh Bockhoh
607             Bong Pong Bhong Bohng Pohng Vong
608             Bu Pu Boo Bou Poo Booh Buh Pou Pooh
609             Bi Pi Bee Pee Bih Bhi Pih Phi
610             Bin Pin Been Pihn Phin Bean Bihn Pean
611             Bing Ping
612             Buyeo Puyŏ
613             Sa Sah Sar
614             Sagong Sakong Sagoung Sakoung
615             San Sahn Sarn
616             Sam Sahm Sarm
617             Sang Sahng
618             Seo Sŏ Suh Surh Su Sur So Seoh
619             Seomun Sŏmun Suhmun Suhmoon Seomoon Somoon
620             Seok Sŏk Suk Sok Suck Sek Such
621             Seon Sŏn Sun Son Suhn Sen
622             Seonu Sŏnu Sunwoo Seonwoo Sonu Sunoo Sunwou Seonwu Sonwu
623             Seol Sŏl Sul Seul Sol Sull
624             Seob Sub Subb Sup Seop
625             Seong Sŏng Sung Soung Song Shèng
626             So Soh Sou Sow
627             Son Sohn Soun
628             Song Soung
629             Su Soo Sooh
630             Sun Soon
631             Seung Sŭng Sung
632             Si Shi Shie Shee Sie Sea See
633             Sin Shin Shinn Sheen Seen Sinn Cynn
634             Sim Shim Seem Sheem Sihm
635             A Ah Ar
636             An Ahn Arn Aan
637             Ae Ay Ai Ea
638             Ya Yah Yar
639             Yang Ryang Lyang
640             Eo Ŏ Uh Urh Eoh
641             Eogeum Ŏgŭm Eokeum Okeum Okum Ukeum Ugeum Ukum Uhgeum Uhkuem
642             Eom Ŏm Um Uhm Oum Ohm
643             Yeo Ryeo Yŏ Ryŏ Yu Yo Yeu Yuh Yoh
644             Yeon Ryeon Yŏn Ryŏn Youn Yun Yon Yeun Yeoun Yuhn
645             Yeom Ryeom Yŏm Ryŏm Yum Youm Yeum Yom Yeoum
646             Yeop Yŏp Yeob Youb Yub Yup Yob
647             Yeong Yŏng Young Yung
648             Ye Yeh
649             O Oh Oe Au Ou Awh
650             Ok Ock Ohk Oak Og Ohg Oag Ogh
651             On Ohn Ohnn
652             Ong Ohng Oung
653             Wan Warn
654             Wang
655             Yo You
656             Yong Ryong Lyong
657             U Woo Wu Ou Wo Uh
658             Un Woon Wun Whun Wuhn
659             Won Wŏn Weon Woen Wone Wun One Worn Warn
660             Wi Wee We Wie
661             Yu Ryu Yoo You
662             Yuk Ryuk Yook Youk Yug Yuck
663             Yun Yoon Youn Yune Yeun
664             Eun Ŭn Ehn Enn Unn En Un
665             Eum Ŭm Um Em Yeum Uem
666             I Ri Yi Lee Rhee Ree Reeh Ee Rie Rhie
667             In Ihn Yin Inn Lin Ean
668             Im Rim Lim Yim Leem Rhim Eam
669             Ja Cha Jar
670             Jang Chang Jahng Jhang Zang
671             Jeon Chŏn Jun Chun Chon Cheon
672             Jeom Chŏm Jum
673             Jeong Chŏng Chung Jung Joung Chong Cheong Choung
674             Je Che Jae Jea Jei Jhe
675             Jegal Chegal Jaegal Jekal Jeagal Jikal Chekal
676             Jo Cho Joe Joh Jou
677             Jong Chong
678             Jwa Chwa Joa Choa
679             Ju Chu Joo Choo Chow Jou Zoo Jew Zu
680             Jeung Chŭng Jung Cheung Chung
681             Ji Chi Jee Gi Chee Gee Jhi
682             Jin Chin Jeen Gin
683             Cha Ch'a Char Chah
684             Chang Ch'ang Chahng
685             Chae Ch'ae Chai Che Chea Chay
686             Cheon Ch'ŏn Chun Chon Choun
687             Cho Ch'o Chu Chou Choh
688             Choe Ch'oe Choi Che Choy Chwe Chey
689             Chu Ch'u Choo Chou Chyu
690             Tak T'ak Tark Tag Tack Tahk
691             Tan T'an Tahn Tann
692             Tae T'ae Tai Tay Tea Thae
693             Pan P'an Pahn Phan Parn Pann
694             Paeng P'aeng Pang Paing Peng Peang
695             Pyeon P'yŏn Pyun Pyon Pyoun Pyen
696             Pyeong P'yŏng Pyung Pyong Pyoung Pyeng
697             Po P'o Pho Poh Paul For Four
698             Pyo P'yo Phyo Pio Peo Pyoh Pyou
699             Pung P'ung Poong Puhng Poohng
700             Pi P'i Pee Phee Phi Phy Pih Fee
701             Pil P'il Phil Peel Fill Feel
702             Ha Hah Har
703             Hak Hag Hahk Hahg Hack
704             Han Hahn Hann Hanh
705             Ham Hahm Hamm Haam Harm
706             Hae Hay Hai Hea
707             Heo Hŏ Hur Huh Her Hu Ho Hoh Heoh
708             Hyeon Hyŏn Hyun Hyon Hyoun
709             Hyeong Hyŏng Hyung Hyoung Hyong Hyeung
710             Ho Hoh
711             Hong Houng Hoong Hung
712             Hwa Howa Hoa Wha Hua
713             Hwang Whang Whong
714             Hwangmok Whangmock Wangmok
715             Hwangbo Hwangpo Whangpoh
716             Hu Hoo Hooh Huh
717             ));
718              
719             my @family_names_vietnamese =
720             (qw(
721             Nguyễn Nguyen Trần Tran Lê Le Phạm Hoàng Hoang Huỳnh Huynh Vũ Võ Vu Vo Phan Trương Truong
722             Bùi Bui Đặng Dang Đỗ Do Ngô Ngo Hồ Dương Duong Đinh Dinh Ái An Ân Bạch Bành Bao Biên Biện
723             Cam Cảnh Cảnh Cao Cái Cát Chân Châu Chiêm Chu Chung Chử Cổ Cù Cung Cung Củng Cừu Dịch Diệp
724             Doãn Dũ Dung Dư Dữu Đái Đàm Đào Đậu Điền Đoàn Đồ Đồng Đổng Đường Giả Giải Gia_Cát Giản Giang
725             Giáp Hà Hạ Hậ Hác Hàn Hầu Hình Hoa Hoắc Hoạn Hồng Hứa Hướng Hy Kha Khâu Khổng Khuất Kiều Kim
726             Kỳ Kỷ La Lạc Lại Lam Lăng Lãnh Lâm Lận Lệ Liên Liêu Liễu Long Lôi Lục Lư Lữ Lương Lưu Mã Mạc
727             Mạch Mai Mạnh Mao Mẫn Miêu Minh Mông Ngân Nghê Nghiêm Ngư Ngưu Nhạc Nhan Nhâm Nhiếp Nhiều
728             Nhung Ninh Nông Ôn Ổn Ông Phí Phó Phong Phòng Phù Phùng Phương Quách Quan Quản Quang Quảng
729             Quế Quyền Sài Sầm Sử Tạ Tào Tăng Tân Tần Tất Tề Thạch Thai Thái Thang Thành Thảo Thân Thi Thích
730             Thiện Thiệu Thôi Thủy Thư Thường Tiền Tiết Tiêu Tiêu Tô Tôn Tôn_Thất Tông Tống Trác Trạch Trại
731             Trang Trầm Trâu Trì Triệu Trịnh Từ Tư_Mã Tưởng Úc Ứng Vạn Văn Vân Vi Vĩnh Vũ_Văn Vương Vưu Xà
732             Xầm Xế Yên Yến
733             ));
734              
735             # Return the supplied full/given/family name with the case fixed
736              
737             sub namecase
738             {
739 8962 100   8962 1 661786 my $name = (@_) ? shift : $_;
740 8962 100       17983 my $mode = (@_) ? shift : 'full';
741 8962         13596 my $given_names = shift;
742              
743             # Without a name, do nothing
744 8962 100       18451 return undef unless defined $name;
745              
746             # Uppercase at start of word (after space, apostrophe, or hyphen)
747 8956         16730 $name = lc(nametrim($name));
748 8956         82937 $name =~ s/\b(\w)/\U$1/g;
749              
750             # Lowercase after apostrophes that follow more than one letter (e.g. Oso'ese but not O'Brien)
751 8956         40211 $name =~ s/(?<=\w{2}|$apostrophe\w)($apostrophe\w)/\L$1/g;
752             # Lowercase after apostrophes that follow one letter that isn't O, V or D
753             # (e.g. T'ang, but not O'Brien or d'Iapico or v'Rachel)
754 8956         28022 $name =~ s/(?<=\b[^ODV])($apostrophe\w)/\L$1/g;
755              
756             # Uppercase after "Mc" and "Fitz" ("Mac" is done selectively with built-in exceptions)
757 8956         27221 $name =~ s/\b(Mc|Fitz)(\w)/$1\U$2/g;
758              
759             # Lowercase some grammatical/aristocratic/patronymic prefixes.
760             # Note: This should only be done for family names because
761             # "Van" is also a Vietnamese given name which is fixed below.
762              
763             # Family name prefixes
764              
765 8956 100       21178 if ($mode ne 'given')
766             {
767             # French/Italian/Spanish/Portuguese: d', dall', dell', de', de, de la,
768             # del, dela, dels, della, delle, dal, dalla, degli,
769             # di, du, da, do, dos, das
770             # Spanish/Catalan/Portuguese: y, i, e (conjunctions)
771             # German/Dutch: von, zu, von und zu, van, der, ter, den, van de,
772             # van der, van den, van het, tot, 'sSomething, 'tSomething
773             # Danish/Swedish/Norwegian: af, av, til
774             # Welsh: ap, ab, ferch, verch
775             # Arabic/Hebrew/Malaysian: ibn, bin, bint, binti, binte, ben[1], bat,
776             # mibeit, mimishpachat, el-, al-, ut-, ha-, v'
777             # Zulu: ka
778             # English/Scottish: of
779             # Irish: Prefix case normal except: Ó hUiginn, Ó hAodha
780             # Note1: "ben" is only detected when unambiguous
781              
782 8039         59832 $name =~ s/\b(d$apostrophe|(?:de(?: la|$apostrophe)?|del|dela|dels|della|delle|dal|dalla|degli|di|du|da|do|dos|das|y|i|e|von und zu|von|zu|van het|van|der|ter|den|tot|af|av|til|ap|ab|ferch|verch|ibn|bin|bint|binti|binte|bat|mibeit|mimishpachat|ka|of)\s)/\L$1/ig;
783 8039         34369 $name =~ s/\b(dall|dell)($apostrophe)(\w)/\L$1\E$2\U$3/ig; # Italian: dall'Agnese
784 8039         41927 $name =~ s/((?:^|\s)${apostrophe})([st])(\w)/$1\L$2\U$3/ig; # Dutch: 'sGravesande
785 8039         38844 $name =~ s/\b($irish_o_re )(h)($irish_vowel_re)/$1\L$2\U$3/ig; # Irish: Ó hUiginn
786 8039         34664 $name =~ s/\b(el|al|ut|ha)(?=$hyphen)/\L$1/ig; # Arabic/Hebrew: el- al- ut- ha-
787 8039         31626 $name =~ s/\b(v)(?=$apostrophe)/\L$1/ig; # Hebrew: v'Rachel
788 8039 100 100     38400 $name =~ s/^(ben\s)/\L$1/i if $mode eq 'family' || index($name, ',') != -1; # Hebrew: ben if family
789 8039 100       45904 $name =~ s/(?<=\s)\b(ben)\b(?=\s)/\L$1/i if $name =~ / v$apostrophe| ha$hyphen(?:Kohein|Levi|Rav)\b/; # Hebrew: ben if v' or ha-
790              
791 8039 100 100     27207 if ($mode eq 'full' && %namecase_exceptions_full)
792             {
793 615         1385 my $kcfull = kc($name);
794 615 100       2267 $name = $namecase_exceptions_full{$kcfull} if exists $namecase_exceptions_full{$kcfull};
795             }
796              
797 8039 100 100     34477 if ($mode eq 'family' && defined $given_names && %fnamecase_exceptions_full)
      100        
798             {
799 108         287 my $kcfull = kc($name . ', ' . $given_names);
800 108 100       504 $name = $fnamecase_exceptions_full{$kcfull} if exists $fnamecase_exceptions_full{$kcfull};
801             }
802             }
803              
804             # If this is a full name, the given name is either after a comma
805             # or at the start. Fix "van" there.
806              
807 8956 100       17234 if ($mode eq 'full')
808             {
809 6061         11840 my $has_comma = (index($name, ',') != -1);
810 6061 100       13630 $name =~ s/, van\b/, Van/ if $has_comma;
811 6061 100       13180 $name =~ s/^van\b/Van/ if !$has_comma;
812             }
813              
814             # With some exceptions (builtin ones and user-supplied ones)
815              
816 8956 100       16855 if ($need_case_update)
817             {
818 36 100       108 %namecase_exceptions = map { kc($_) => $_ } @namecase_exceptions unless %namecase_exceptions;
  872         1530  
819 36         3000 $namecase_exceptions_re = join '|', keys %namecase_exceptions;
820 36         555 $need_case_update = 0;
821             }
822              
823 8956         82675 $name =~ s/\b($namecase_exceptions_re)\b/$namecase_exceptions{kc($1)}/ieg;
  344         955  
824              
825 8956         81480 return $name;
826             }
827              
828             # Return the supplied given name(s) with the case fixed
829              
830             sub gnamecase
831             {
832 919 100   919 1 2775 my $given_names = (@_) ? shift : $_;
833              
834 919         2001 return namecase($given_names, 'given')
835             }
836              
837             # Return the supplied family name with the case fixed
838              
839             sub fnamecase
840             {
841 1892 100   1892 1 5900 my $family_name = (@_) ? shift : $_;
842 1892         3237 my $given_names = shift;
843              
844 1892         3881 return namecase($family_name, 'family', $given_names);
845             }
846              
847             # Add a case exception (family-wide or individual)
848              
849             sub namecase_exception
850             {
851 40     40 1 4610 my $name = shift;
852 40 100       153 return 0 unless defined $name;
853              
854 36         100 $name = nametrim($name);
855 36 100       161 return 0 unless length $name;
856              
857 34         115 my $has_comma = (index($name, ',') != -1);
858 34         95 my $kcname = kc($name);
859              
860 34 100       131 if ($has_comma) # Individual exception
861             {
862 26         160 my ($f, $g) = split /, /, $name;
863 26         105 my $kcnatural = kc("$g $f");
864              
865 26         106 $namecase_exceptions_full{$kcname} = $name;
866 26         86 $namecase_exceptions_full{$kcnatural} = $name;
867              
868 26         76 $fnamecase_exceptions_full{$kcname} = $f;
869             }
870             else # Family-wide exception
871             {
872 8         29 $namecase_exceptions{$kcname} = $name;
873             }
874              
875 34         67 $need_case_update = 1;
876 34         140 return 1;
877             }
878              
879             # Split exceptions hash. Keys are foldcase full names in
880             # ambiguous form ("Given Family"). Values are unambiguous.
881              
882             my %namesplit_exceptions;
883              
884             # Return the supplied full name as "family_name, given_names", guessing if
885             # necessary, which part of the supplied full name is the family name, and
886             # which part is the given name or names. It's reasonably good at identifying
887             # family names containing grammatical constructions (i.e.,
888             # aristocratic/patronymic) in various languages, but if that doesn't work,
889             # trickier names that can't be programmatically determined can be added to
890             # the namesplit_exceptions hash to specify the correct name splitting for
891             # specific individual names. Many names require this. The letter case of the
892             # result is also corrected via namecase().
893              
894             my $ja_loaded = 0;
895              
896             sub namesplit
897             {
898 4033 100   4033 1 131808 my $name = (@_) ? shift : $_;
899              
900             # Without a name, do nothing
901              
902 4033 100       9571 return undef unless defined $name;
903 4031 100       9423 return '' unless length $name;
904              
905             # Prepare the name for matching (any normalization must have already been done)
906              
907 4025         8014 $name = nametrim($name);
908 4025         12166 my $kcname = kc($name);
909              
910             # Lookup exceptions first
911              
912 4025 100       12612 $name = $namesplit_exceptions{$kcname} if exists $namesplit_exceptions{$kcname};
913              
914             # Accept existing commas
915              
916 4025 100       12932 return namecase($name) if index($name, ',') != -1;
917              
918             # Load hash of family name starter words
919              
920 2134 100       4859 %split_starter = map { kc($_) => 1 } @split_starter unless %split_starter;
  136         16565  
921 2134 100       4876 $split_starter_re = qr/(?:@{[join '|', keys %split_starter]})/i unless $split_starter_re;
  2         3497  
922              
923             # Load family name hashes/regexes for Chinese, Korean, Vietnamese
924              
925 2134 100       4338 if (!scalar %family_names_ck)
926             {
927             %family_names_ck =
928 1302         2508 map { $_ => 1 }
929             @family_names_chinese,
930 2         16 grep { /\p{Hangul}/ } @family_names_korean;
  1454         2750  
931 2         70 $family_names_ck_re = qr/(?:@{[join '|', keys %family_names_ck]})/;
  2         4957  
932             }
933              
934 2134 100       4729 if (!scalar %family_names_ck_roman)
935             {
936             %family_names_ck_roman =
937 6070         9683 map { (kc($_) =~ s/'/$apostrophe/r) => 1 }
938 2         116 grep { !/^$split_starter_re$/ }
  6170         21040  
939             @family_names_chinese_roman,
940             @family_names_korean_roman;
941 2         364 $family_names_ck_roman_re = qr/(?:@{[join '|', keys %family_names_ck_roman]})/i;
  2         11150  
942             }
943              
944 2134 100       4496 if (!scalar %family_names_v_roman)
945             {
946 2         11 %family_names_v_roman = map { kc($_) => 1 } @family_names_vietnamese;
  444         683  
947 2         33 $family_names_v_roman_re = qr/(?:@{[join '|', keys %family_names_v_roman]})/i;
  2         1575  
948             }
949              
950             # Identify Vietnamese names (before Dutch names)
951              
952 2134         20741 my ($f, $g) = $name =~ /^($family_names_v_roman_re) (.+)$/;
953 2134 100       5558 return namecase("$f, $g") if defined $g;
954              
955 2078         14206 ($g, $f) = $name =~ /^(.+) ($family_names_v_roman_re)$/;
956 2078 100       4766 return namecase("$f, $g") if defined $g;
957              
958             # Identify plausible multi-word family names (in Latin scripts)
959              
960 2062         6842 my @words = split / /, $name;
961 2062 100 100     6525 return namecase($name) if @words < 2 && $name !~ /^[\p{Han}\p{Hangul}\p{Hiragana}\p{Katakana}]+$/;
962              
963 1966         6397 for my $i (1..$#words)
964             {
965 2226         5253 my $kcstarter = kc($words[$i]);
966 2226 100       6702 next unless exists $split_starter{$kcstarter};
967 1390 100 100     4363 next if $kcstarter eq 'ben' && $name !~ / v$apostrophe| ha$hyphen(?:Kohein|Levi|Rav)\b/i; # Hebrew
968 1366 100 100     3726 next if $kcstarter eq 'bean' && $name !~ /\bbean $irish_post_bean_re\b/i; # Irish
969 1354 100       2895 next if $i == $#words;
970              
971 1342 100 100     3496 --$i if $i > 1 && $kcstarter =~ /^[yi]$/i; # Spanish/Catalan
972 1342         7404 return namecase(join(' ', @words[$i..$#words]) . ', ' . join(' ', @words[0..$i - 1]))
973             }
974              
975             # Identify Chinese, Korean, and Vietnamese family names (and some misidentified Japanese names) :-(
976             # Note: When romanized, these family names can appear first or last
977              
978 624         8496 ($f, $g) = $name =~ /^($family_names_ck_re)(.+)$/;
979 624 100       1933 return "$f, $g" if defined $g;
980              
981             # Note: Family names can appear first or last. Luckily, for Chinese,
982             # the two given name characters are usually romanized as a single word,
983             # so there's less chance of misinterpreting a given name as a family
984             # name. Unfortunately, Korean names are romanized as separate names,
985             # all of which might look like a family name, so it's likely that the
986             # name that appears first will be recognized as a family name, even
987             # if the real family name is at the end (in English-speaking places).
988             # This can only be fixed with split exceptions (or by encouraging
989             # Koreans to not put their family name last).
990              
991 580         21865 ($f, $g) = $name =~ /^($family_names_ck_roman_re) (.+)$/;
992 580 100       2028 return namecase("$f, $g") if defined $g;
993              
994 536         16373 ($g, $f) = $name =~ /^(.+) ($family_names_ck_roman_re)$/;
995 536 100       1572 return namecase("$f, $g") if defined $g;
996              
997             # Identify Japanese names
998              
999 508 100       1670 if ($name =~ /^[\p{Han}\p{Hiragana}\p{Katakana}]+$/)
1000             {
1001 34 100       98 if (!$ja_loaded)
1002             {
1003 1         704 require Lingua::JA::Name::Splitter;
1004 1         34790 $ja_loaded = 1;
1005             }
1006              
1007 34         116 ($f, $g) = Lingua::JA::Name::Splitter::split_kanji_name($name);
1008 34         5646 return "$f, $g";
1009             }
1010              
1011             # Assume a single-word family name
1012             # Note: Non-hyphenated multi-name family names must be handled via split exceptions
1013              
1014 474         2631 return namecase($words[-1] . ', ' . join(' ', @words[0..$#words - 1]));
1015             }
1016              
1017             # Add a split exception
1018              
1019             sub namesplit_exception
1020             {
1021 47     47 1 10068 my $name = shift;
1022 47 100       153 return 0 unless defined $name;
1023              
1024 43         99 $name = nametrim($name);
1025 43 100       156 return 0 unless length $name;
1026              
1027 41         125 my $has_comma = (index($name, ',') != -1);
1028 41 100       112 return 0 unless $has_comma;
1029              
1030 39         205 my ($f, $g) = split /, ?/, $name;
1031              
1032 39 100       203 if ("$f$g" =~ /^[\p{Han}\p{Hangul}\p{Hiragana}\p{Katakana}]+$/)
1033             {
1034 7         18 my $natural = "$f$g";
1035              
1036 7         25 $namesplit_exceptions{$name} = $name;
1037 7         20 $namesplit_exceptions{$natural} = $name;
1038             }
1039             else
1040             {
1041 32         87 my $kcname = kc($name);
1042 32         126 my $kcnatural = kc("$g $f");
1043              
1044 32         112 $namesplit_exceptions{$kcname} = $name;
1045 32         103 $namesplit_exceptions{$kcnatural} = $name;
1046             }
1047              
1048 39         99 return 1;
1049             }
1050              
1051             # Like namesplit() but returns the name as a list containing
1052             # two items: the family name followed by the given names.
1053              
1054             sub nameparts
1055             {
1056 1845 100   1845 1 1302742 my $name = (@_) ? shift : $_;
1057              
1058 1845 100 100     9768 return () unless defined $name and length $name;
1059              
1060 1837         4535 return split /, ?/, namesplit($name), 2;
1061             }
1062              
1063             # Format a full name in Eastern or Western name order as appropriate
1064              
1065             sub namejoin
1066             {
1067 23     23 1 12361 my ($f, $g) = @_;
1068              
1069 23 100       66 return $f if !defined $g;
1070 19 100       46 return $g if !defined $f;
1071              
1072 17 100       136 return "$f$g" if "$f$g" =~ /^[\p{Han}\p{Hangul}\p{Hiragana}\p{Katakana}]+$/;
1073 17         35 return "$g $f";
1074             }
1075              
1076             # Trim the supplied name
1077              
1078             sub nametrim
1079             {
1080 13080 100   13080 1 36137 my $name = (@_) ? shift : $_;
1081              
1082 13080 100       26505 return undef unless defined $name;
1083              
1084 13078         180698 return $name
1085             =~ s/^\s+//r # Remove leading spaces
1086             =~ s/\s+$//r # Remove trailing spaces
1087             =~ s/\s+/ /gr # Squash multiple spaces
1088             =~ s/($hyphen) /$1/gr # Remove space after hyphen
1089             =~ s/ (,|$hyphen)/$1/gr # Remove space before comma and hyphen
1090             =~ s/,(?! )/, /gr; # Add space after - if missing
1091             }
1092              
1093             # Normalise internal hash keys and data with the supplied normalization function
1094              
1095             sub normalize
1096             {
1097 11     11 1 4013 my $func = shift;
1098              
1099 11         125 $apostrophe = $func->($apostrophe);
1100 11         98 $hyphen = $func->($hyphen);
1101 11         902 %namecase_exceptions = map { $func->($_) => $func->($namecase_exceptions{$_}) } keys %namecase_exceptions;
  3942         22720  
1102 11         545 %namecase_exceptions_full = map { $func->($_) => $func->($namecase_exceptions_full{$_}) } keys %namecase_exceptions_full;
  146         1086  
1103 11         74 %fnamecase_exceptions_full = map { $func->($_) => $func->($fnamecase_exceptions_full{$_}) } keys %fnamecase_exceptions_full;
  73         514  
1104 11 100       2698 $namecase_exceptions_re = $func->($namecase_exceptions_re) if defined $namecase_exceptions_re;
1105 11         126 %namesplit_exceptions = map { $func->($_) => $func->($namesplit_exceptions{$_}) } keys %namesplit_exceptions;
  254         1879  
1106 11         207 %split_starter = map { $func->($_) => 1 } keys %split_starter;
  603         1848  
1107 11         139 @irish_o = map { $func->($_) } @irish_o;
  22         108  
1108 11         74 $irish_o_re = '(?:' . join('|', @irish_o) . ')';
1109 11         34 @irish_vowel = map { $func->($_) } @irish_vowel;
  110         294  
1110 11         59 $irish_vowel_re = '(?:' . join('|', @irish_vowel) . ')';
1111 11         37 @irish_post_bean = map { $func->($_) } @irish_post_bean;
  33         122  
1112 11         56 $irish_post_bean_re = '(?:' . join('|', @irish_post_bean) . ')';
1113              
1114 11         1244 %family_names_ck = map { $func->($_) => 1 } keys %family_names_ck;
  5787         15141  
1115 11         761 $family_names_ck_re = qr/(?:@{[join '|', keys %family_names_ck]})/;
  11         20732  
1116 11         4679 %family_names_ck_roman = map { $func->($_) => 1 } keys %family_names_ck_roman;
  18288         60391  
1117 11         2588 $family_names_ck_roman_re = qr/(?:@{[join '|', keys %family_names_ck_roman]})/i;
  11         50393  
1118 11         1491 %family_names_v_roman = map { $func->($_) => 1 } keys %family_names_v_roman;
  1971         6229  
1119 11         351 $family_names_v_roman_re = qr/(?:@{[join '|', keys %family_names_v_roman]})/i;
  11         9606  
1120              
1121 11         199 @family_names_chinese = map { $func->($_) } @family_names_chinese;
  4895         11117  
1122 11         206 @family_names_chinese_roman = map { $func->($_) } @family_names_chinese_roman;
  23320         60461  
1123 11         166 @family_names_korean = map { $func->($_) } @family_names_korean;
  7997         18498  
1124 11         91 @family_names_korean_roman = map { $func->($_) } @family_names_korean_roman;
  10615         26545  
1125 11         95 @family_names_vietnamese = map { $func->($_) } @family_names_vietnamese;
  2442         6800  
1126             }
1127              
1128             1;