File Coverage

blib/lib/Lingua/NameUtils.pm
Criterion Covered Total %
statement 221 221 100.0
branch 114 114 100.0
condition 27 27 100.0
subroutine 19 19 100.0
pod 11 11 100.0
total 392 392 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             # 20230709 raf
9              
10             package Lingua::NameUtils;
11 2     2   67939 use 5.014;
  2         15  
12 2     2   10 use strict;
  2         14  
  2         39  
13 2     2   9 use warnings;
  2         3  
  2         43  
14 2     2   9 use utf8;
  2         4  
  2         8  
15              
16             our $VERSION = '1.003';
17              
18 2     2   75 use Exporter;
  2         4  
  2         2199  
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   7 my $hyphen = qr/\p{dash punctuation}/; # Hyphen-Minus, Hyphen, En Dash, Em Dash, et al.
  1         2  
  1         12  
40 15413     15413 1 72984 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 8968 100   8968 1 659117 my $name = (@_) ? shift : $_;
740 8968 100       16682 my $mode = (@_) ? shift : 'full';
741 8968         14327 my $given_names = shift;
742              
743             # Without a name, do nothing
744 8968 100       19252 return undef unless defined $name;
745              
746             # Uppercase at start of word (after space, apostrophe, or hyphen)
747 8962         17411 $name = lc(nametrim($name));
748 8962         84331 $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 8962         39398 $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 8962         29167 $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 8962         28247 $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 8962 100       21826 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 8045         59916 $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 8045         34657 $name =~ s/\b(dall|dell)($apostrophe)(\w)/\L$1\E$2\U$3/ig; # Italian: dall'Agnese
784 8045         41040 $name =~ s/((?:^|\s)${apostrophe})([st])(\w)/$1\L$2\U$3/ig; # Dutch: 'sGravesande
785 8045         39335 $name =~ s/\b($irish_o_re )(h)($irish_vowel_re)/$1\L$2\U$3/ig; # Irish: Ó hUiginn
786 8045         34730 $name =~ s/\b(el|al|ut|ha)(?=$hyphen)/\L$1/ig; # Arabic/Hebrew: el- al- ut- ha-
787 8045         32128 $name =~ s/\b(v)(?=$apostrophe)/\L$1/ig; # Hebrew: v'Rachel
788 8045 100 100     39191 $name =~ s/^(ben\s)/\L$1/i if $mode eq 'family' || index($name, ',') != -1; # Hebrew: ben if family
789 8045 100       45653 $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 8045 100 100     26671 if ($mode eq 'full' && %namecase_exceptions_full)
792             {
793 615         1313 my $kcfull = kc($name);
794 615 100       2190 $name = $namecase_exceptions_full{$kcfull} if exists $namecase_exceptions_full{$kcfull};
795             }
796              
797 8045 100 100     31962 if ($mode eq 'family' && defined $given_names && %fnamecase_exceptions_full)
      100        
798             {
799 108         306 my $kcfull = kc($name . ', ' . $given_names);
800 108 100       437 $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 8962 100       18929 if ($mode eq 'full')
808             {
809 6067         11673 my $has_comma = (index($name, ',') != -1);
810 6067 100       13524 $name =~ s/, van\b/, Van/ if $has_comma;
811 6067 100       12909 $name =~ s/^van\b/Van/ if !$has_comma;
812             }
813              
814             # With some exceptions (builtin ones and user-supplied ones)
815              
816 8962 100       17519 if ($need_case_update)
817             {
818 37 100       84 %namecase_exceptions = map { kc($_) => $_ } @namecase_exceptions unless %namecase_exceptions;
  872         1646  
819 37         2565 $namecase_exceptions_re = join '|', keys %namecase_exceptions;
820 37         541 $need_case_update = 0;
821             }
822              
823 8962         86358 $name =~ s/\b($namecase_exceptions_re)\b/$namecase_exceptions{kc($1)}/ieg;
  350         992  
824              
825 8962         76526 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 2604 my $given_names = (@_) ? shift : $_;
833              
834 919         1977 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 5752 my $family_name = (@_) ? shift : $_;
842 1892         2989 my $given_names = shift;
843              
844 1892         3842 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 41     41 1 4628 my $name = shift;
852 41 100       118 return 0 unless defined $name;
853              
854 37         81 $name = nametrim($name);
855 37 100       127 return 0 unless length $name;
856              
857 35         100 my $has_comma = (index($name, ',') != -1);
858 35         74 my $kcname = kc($name);
859              
860 35 100       91 if ($has_comma) # Individual exception
861             {
862 26         110 my ($f, $g) = split /, /, $name;
863 26         78 my $kcnatural = kc("$g $f");
864              
865 26         113 $namecase_exceptions_full{$kcname} = $name;
866 26         84 $namecase_exceptions_full{$kcnatural} = $name;
867              
868 26         60 $fnamecase_exceptions_full{$kcname} = $f;
869             }
870             else # Family-wide exception
871             {
872 9 100       44 %namecase_exceptions = map { kc($_) => $_ } @namecase_exceptions unless %namecase_exceptions;
  436         702  
873 9         58 $namecase_exceptions{$kcname} = $name;
874             }
875              
876 35         63 $need_case_update = 1;
877 35         134 return 1;
878             }
879              
880             # Split exceptions hash. Keys are foldcase full names in
881             # ambiguous form ("Given Family"). Values are unambiguous.
882              
883             my %namesplit_exceptions;
884              
885             # Return the supplied full name as "family_name, given_names", guessing if
886             # necessary, which part of the supplied full name is the family name, and
887             # which part is the given name or names. It's reasonably good at identifying
888             # family names containing grammatical constructions (i.e.,
889             # aristocratic/patronymic) in various languages, but if that doesn't work,
890             # trickier names that can't be programmatically determined can be added to
891             # the namesplit_exceptions hash to specify the correct name splitting for
892             # specific individual names. Many names require this. The letter case of the
893             # result is also corrected via namecase().
894              
895             my $ja_loaded = 0;
896              
897             sub namesplit
898             {
899 4039 100   4039 1 133729 my $name = (@_) ? shift : $_;
900              
901             # Without a name, do nothing
902              
903 4039 100       8883 return undef unless defined $name;
904 4037 100       9455 return '' unless length $name;
905              
906             # Prepare the name for matching (any normalization must have already been done)
907              
908 4031         8513 $name = nametrim($name);
909 4031         11578 my $kcname = kc($name);
910              
911             # Lookup exceptions first
912              
913 4031 100       12581 $name = $namesplit_exceptions{$kcname} if exists $namesplit_exceptions{$kcname};
914              
915             # Accept existing commas
916              
917 4031 100       11629 return namecase($name) if index($name, ',') != -1;
918              
919             # Load hash of family name starter words
920              
921 2140 100       4935 %split_starter = map { kc($_) => 1 } @split_starter unless %split_starter;
  136         13298  
922 2140 100       5156 $split_starter_re = qr/(?:@{[join '|', keys %split_starter]})/i unless $split_starter_re;
  2         3464  
923              
924             # Load family name hashes/regexes for Chinese, Korean, Vietnamese
925              
926 2140 100       4356 if (!scalar %family_names_ck)
927             {
928             %family_names_ck =
929 1302         2491 map { $_ => 1 }
930             @family_names_chinese,
931 2         14 grep { /\p{Hangul}/ } @family_names_korean;
  1454         2666  
932 2         86 $family_names_ck_re = qr/(?:@{[join '|', keys %family_names_ck]})/;
  2         5058  
933             }
934              
935 2140 100       4352 if (!scalar %family_names_ck_roman)
936             {
937             %family_names_ck_roman =
938 6070         9771 map { (kc($_) =~ s/'/$apostrophe/r) => 1 }
939 2         107 grep { !/^$split_starter_re$/ }
  6170         21404  
940             @family_names_chinese_roman,
941             @family_names_korean_roman;
942 2         364 $family_names_ck_roman_re = qr/(?:@{[join '|', keys %family_names_ck_roman]})/i;
  2         11861  
943             }
944              
945 2140 100       4378 if (!scalar %family_names_v_roman)
946             {
947 2         11 %family_names_v_roman = map { kc($_) => 1 } @family_names_vietnamese;
  444         694  
948 2         35 $family_names_v_roman_re = qr/(?:@{[join '|', keys %family_names_v_roman]})/i;
  2         1604  
949             }
950              
951             # Identify Vietnamese names (before Dutch names)
952              
953 2140         19930 my ($f, $g) = $name =~ /^($family_names_v_roman_re) (.+)$/;
954 2140 100       5583 return namecase("$f, $g") if defined $g;
955              
956 2084         14386 ($g, $f) = $name =~ /^(.+) ($family_names_v_roman_re)$/;
957 2084 100       4762 return namecase("$f, $g") if defined $g;
958              
959             # Identify plausible multi-word family names (in Latin scripts)
960              
961 2068         6643 my @words = split / /, $name;
962 2068 100 100     6595 return namecase($name) if @words < 2 && $name !~ /^[\p{Han}\p{Hangul}\p{Hiragana}\p{Katakana}]+$/;
963              
964 1972         5833 for my $i (1..$#words)
965             {
966 2226         5332 my $kcstarter = kc($words[$i]);
967 2226 100       6751 next unless exists $split_starter{$kcstarter};
968 1390 100 100     4405 next if $kcstarter eq 'ben' && $name !~ / v$apostrophe| ha$hyphen(?:Kohein|Levi|Rav)\b/i; # Hebrew
969 1366 100 100     3620 next if $kcstarter eq 'bean' && $name !~ /\bbean $irish_post_bean_re\b/i; # Irish
970 1354 100       3021 next if $i == $#words;
971              
972 1342 100 100     3441 --$i if $i > 1 && $kcstarter =~ /^[yi]$/i; # Spanish/Catalan
973 1342         7167 return namecase(join(' ', @words[$i..$#words]) . ', ' . join(' ', @words[0..$i - 1]))
974             }
975              
976             # Identify Chinese, Korean, and Vietnamese family names (and some misidentified Japanese names) :-(
977             # Note: When romanized, these family names can appear first or last
978              
979 630         8451 ($f, $g) = $name =~ /^($family_names_ck_re)(.+)$/;
980 630 100       1925 return "$f, $g" if defined $g;
981              
982             # Note: Family names can appear first or last. Luckily, for Chinese,
983             # the two given name characters are usually romanized as a single word,
984             # so there's less chance of misinterpreting a given name as a family
985             # name. Unfortunately, Korean names are romanized as separate names,
986             # all of which might look like a family name, so it's likely that the
987             # name that appears first will be recognized as a family name, even
988             # if the real family name is at the end (in English-speaking places).
989             # This can only be fixed with split exceptions (or by encouraging
990             # Koreans to not put their family name last).
991              
992 586         21454 ($f, $g) = $name =~ /^($family_names_ck_roman_re) (.+)$/;
993 586 100       1928 return namecase("$f, $g") if defined $g;
994              
995 542         15902 ($g, $f) = $name =~ /^(.+) ($family_names_ck_roman_re)$/;
996 542 100       1508 return namecase("$f, $g") if defined $g;
997              
998             # Identify Japanese names
999              
1000 514 100       1540 if ($name =~ /^[\p{Han}\p{Hiragana}\p{Katakana}]+$/)
1001             {
1002 40 100       103 if (!$ja_loaded)
1003             {
1004 1         840 require Lingua::JA::Name::Splitter;
1005 1         35959 $ja_loaded = 1;
1006             }
1007              
1008 40     2   294 local $SIG{__WARN__} = sub {}; # Suppress warnings
1009 40         151 ($f, $g) = Lingua::JA::Name::Splitter::split_kanji_name($name);
1010 40         5478 return join(', ', grep { length } $f, $g);
  80         672  
1011             }
1012              
1013             # Assume a single-word family name
1014             # Note: Non-hyphenated multi-name family names must be handled via split exceptions
1015              
1016 474         2648 return namecase($words[-1] . ', ' . join(' ', @words[0..$#words - 1]));
1017             }
1018              
1019             # Add a split exception
1020              
1021             sub namesplit_exception
1022             {
1023 47     47 1 9864 my $name = shift;
1024 47 100       142 return 0 unless defined $name;
1025              
1026 43         102 $name = nametrim($name);
1027 43 100       153 return 0 unless length $name;
1028              
1029 41         135 my $has_comma = (index($name, ',') != -1);
1030 41 100       102 return 0 unless $has_comma;
1031              
1032 39         215 my ($f, $g) = split /, ?/, $name;
1033              
1034 39 100       189 if ("$f$g" =~ /^[\p{Han}\p{Hangul}\p{Hiragana}\p{Katakana}]+$/)
1035             {
1036 7         20 my $natural = "$f$g";
1037              
1038 7         26 $namesplit_exceptions{$name} = $name;
1039 7         18 $namesplit_exceptions{$natural} = $name;
1040             }
1041             else
1042             {
1043 32         72 my $kcname = kc($name);
1044 32         102 my $kcnatural = kc("$g $f");
1045              
1046 32         110 $namesplit_exceptions{$kcname} = $name;
1047 32         105 $namesplit_exceptions{$kcnatural} = $name;
1048             }
1049              
1050 39         97 return 1;
1051             }
1052              
1053             # Like namesplit() but returns the name as a list containing
1054             # two items: the family name followed by the given names.
1055              
1056             sub nameparts
1057             {
1058 1848 100   1848 1 1287867 my $name = (@_) ? shift : $_;
1059              
1060 1848 100 100     9479 return () unless defined $name and length $name;
1061              
1062 1840         4016 return split /, ?/, namesplit($name), 2;
1063             }
1064              
1065             # Format a full name in Eastern or Western name order as appropriate
1066              
1067             sub namejoin
1068             {
1069 23     23 1 12779 my ($f, $g) = @_;
1070              
1071 23 100       86 return $f if !defined $g;
1072 19 100       61 return $g if !defined $f;
1073              
1074 17 100       147 return "$f$g" if "$f$g" =~ /^[\p{Han}\p{Hangul}\p{Hiragana}\p{Katakana}]+$/;
1075 17         38 return "$g $f";
1076             }
1077              
1078             # Trim the supplied name
1079              
1080             sub nametrim
1081             {
1082 13097 100   13097 1 38533 my $name = (@_) ? shift : $_;
1083              
1084 13097 100       27047 return undef unless defined $name;
1085              
1086 13095         178027 return $name
1087             =~ s/^\s+//r # Remove leading spaces
1088             =~ s/\s+$//r # Remove trailing spaces
1089             =~ s/\s+/ /gr # Squash multiple spaces
1090             =~ s/($hyphen) /$1/gr # Remove space after hyphen
1091             =~ s/ (,|$hyphen)/$1/gr # Remove space before comma and hyphen
1092             =~ s/,(?! )/, /gr; # Add space after - if missing
1093             }
1094              
1095             # Normalise internal hash keys and data with the supplied normalization function
1096              
1097             sub normalize
1098             {
1099 11     11 1 3934 my $func = shift;
1100              
1101 11         97 $apostrophe = $func->($apostrophe);
1102 11         83 $hyphen = $func->($hyphen);
1103 11         603 %namecase_exceptions = map { $func->($_) => $func->($namecase_exceptions{$_}) } keys %namecase_exceptions;
  3942         22067  
1104 11         536 %namecase_exceptions_full = map { $func->($_) => $func->($namecase_exceptions_full{$_}) } keys %namecase_exceptions_full;
  146         1108  
1105 11         63 %fnamecase_exceptions_full = map { $func->($_) => $func->($fnamecase_exceptions_full{$_}) } keys %fnamecase_exceptions_full;
  73         471  
1106 11 100       2706 $namecase_exceptions_re = $func->($namecase_exceptions_re) if defined $namecase_exceptions_re;
1107 11         91 %namesplit_exceptions = map { $func->($_) => $func->($namesplit_exceptions{$_}) } keys %namesplit_exceptions;
  254         1778  
1108 11         69 @split_starter = map { $func->($_) } @split_starter;
  748         1980  
1109 11 100       263 $split_starter_re = $func->($split_starter_re) if defined $split_starter_re;
1110 11         222 %split_starter = map { $func->($_) => 1 } keys %split_starter;
  603         1737  
1111 11         89 @irish_o = map { $func->($_) } @irish_o;
  22         85  
1112 11         54 $irish_o_re = '(?:' . join('|', @irish_o) . ')';
1113 11         28 @irish_vowel = map { $func->($_) } @irish_vowel;
  110         279  
1114 11         55 $irish_vowel_re = '(?:' . join('|', @irish_vowel) . ')';
1115 11         41 @irish_post_bean = map { $func->($_) } @irish_post_bean;
  33         108  
1116 11         50 $irish_post_bean_re = '(?:' . join('|', @irish_post_bean) . ')';
1117              
1118 11         667 %family_names_ck = map { $func->($_) => 1 } keys %family_names_ck;
  5787         14384  
1119 11         627 $family_names_ck_re = qr/(?:@{[join '|', keys %family_names_ck]})/;
  11         19542  
1120 11         3708 %family_names_ck_roman = map { $func->($_) => 1 } keys %family_names_ck_roman;
  18288         58339  
1121 11         2168 $family_names_ck_roman_re = qr/(?:@{[join '|', keys %family_names_ck_roman]})/i;
  11         49197  
1122 11         1316 %family_names_v_roman = map { $func->($_) => 1 } keys %family_names_v_roman;
  1971         6057  
1123 11         285 $family_names_v_roman_re = qr/(?:@{[join '|', keys %family_names_v_roman]})/i;
  11         9986  
1124              
1125 11         218 @family_names_chinese = map { $func->($_) } @family_names_chinese;
  4895         11154  
1126 11         170 @family_names_chinese_roman = map { $func->($_) } @family_names_chinese_roman;
  23320         59815  
1127 11         180 @family_names_korean = map { $func->($_) } @family_names_korean;
  7997         18007  
1128 11         104 @family_names_korean_roman = map { $func->($_) } @family_names_korean_roman;
  10615         26392  
1129 11         83 @family_names_vietnamese = map { $func->($_) } @family_names_vietnamese;
  2442         6581  
1130             }
1131              
1132             # Reset internal data (for test coverage purposes)
1133              
1134             sub _reset_data
1135             {
1136 1     1   728 %namecase_exceptions = (); # This is the only one that matters (initialized in two places)
1137 1         20 %namecase_exceptions_full = ();
1138 1         8 %fnamecase_exceptions_full = ();
1139 1         3 $need_case_update = 1;
1140 1         3 $namecase_exceptions_re = undef;
1141 1         20 %split_starter = ();
1142 1         4 $split_starter_re = undef;
1143 1         146 %family_names_ck = ();
1144 1         4 $family_names_ck_re = undef;
1145 1         469 %family_names_ck_roman = ();
1146 1         5 $family_names_ck_roman_re = undef;
1147 1         49 %family_names_v_roman = ();
1148 1         4 $family_names_v_roman_re = undef;
1149             }
1150              
1151             1;