Module:Sandbox/N3rsti/Names

local p = {}

local lang = { chinese_names = {'Wang', 'Li', 'Zhang', 'Liu', 'Chen', 'Yang', 'Huang', 'Zhao', 'Wu', 'Zhou', 'Wong', 'Zedong', 'Zu', 'Dong'}, chinese_endings = {'ang', 'zhi'}, spain_letters = {'í', 'á', 'é', 'ó'}, spanish_names = {'Diego', 'Esteban', 'Luis', 'Fernán', 'Rodríguez', 'Sofia', 'Santiago'}, dutch_endings = {'er', 'gh', 'ch'}, polish_endings = {'ski', 'cki', 'ska', 'cka'}, english_endings = {'ght', 'Jr.', 'Jr', 'Sr.', 'Sr', 'I', 'V', 'X'} }

-- Basic pattern function is used for names that wasn't detected by getnames as a name from specific country. It returns last word as a surname and other words as a name -- function basic_pattern(fullname) local name = string.match(fullname, "(.+) (%w+)") local surname = string.gsub(fullname, name .. " ", "") if #name_table > 3 then return one_name_pattern(fullname) end return "Given = " .. name .. " -- " .. "Family = " .. surname end

function one_name_pattern(fullname) local name = name_table[1] local surname = string.gsub(fullname, name .. " ", "") if string.match(fullname, " del ") then end return "Given = " .. name .. " -- " .. "Family = " .. surname end

function two_names_pattern(fullname) local name = name_table[1] .. " " .. name_table[2] local surname = string.gsub(fullname, name .. " ", "") return "Given = " .. name .. " -- " .. "Family = " .. surname end

function p.getnames(frame) local fullname = frame.args.name or "" if fullname == "" then return "No parameter supplied" end local name, out, surname = "" -- name_table table contains all words from fullname variable name_table = {} for word in string.gmatch(fullname, "[^%s]+") do		table.insert(name_table, word) end -- Loop through every word in fullname and check if it has popular endings for languages for _, word in pairs(name_table) do		if string.sub(word, -2) == "ez" then name_format = "es" end for _, v in pairs(lang.dutch_endings) do			if string.sub(word, -#v) == v then name_format = "nl" end end for _, polish_ending in pairs(lang.polish_endings) do			if string.sub(word, -#polish_ending) == polish_ending then name_format = "pl" end end for _, english_ending in pairs(lang.english_endings) do			if string.sub(word, -#english_ending) == english_ending then name_format = "en" end end for _, chinese_name in pairs(lang.chinese_names) do			if word == chinese_name then name_format = "zh" end end for _, ending in pairs(lang.chinese_endings) do			if string.sub(word, -3) == ending then name_format = "zh" end end -- If code detects chinese name, it returns this in chinese format, because chinese names are different than other names if name_format == "zh" then surname = string.match(fullname, "(.+) (%w+)") name = string.gsub(fullname, surname .. " ", "") if string.find(fullname,'%(') then				local courtesy_name = fullname:match("%((%a+)%)")				name = string.gsub(name, "%(" .. courtesy_name .. "%)", "")			end			return "Given = " .. name .. " -- " .. "Family = " .. surname		end	end

-- Loop through spain letters from array. for _, i in pairs(lang.spain_letters) do		if string.match(fullname, i) then name_format = "es" break end end for _, i in pairs(lang.spanish_names) do		if string.match(fullname, i) then name_format = "es" break end end if name_format == "es" then -- Check if fullname has 2 names if string.match(fullname, "de") then local index={} for k,v in pairs(name_table) do			  index[v]=k end -- To get name after "de" local sign_index = index["de"] + 1 local return_surname = fullname for i=1,sign_index do return_surname = string.gsub(return_surname, name_table[i] .. " ", "") end surname = return_surname name = string.gsub(fullname, surname, "") return "Given = " .. name .. " -- " .. "Family = " .. surname end for _, i in pairs(lang.spanish_names) do			if name_table[2] == i then return two_names_pattern(fullname) end end return one_name_pattern(fullname) elseif name_format == "pl" then -- Check if fullname is longer than 2. -- Most of the polish surnames are single, or they are splitted with hyphen, so if fullname is longer than 3 words, it will most likely have 2 given names if #name_table > 2 then return two_names_pattern(fullname) end return basic_pattern(fullname) elseif name_format == "en" then for _, word in pairs(name_table) do			for _, english_ending in pairs(lang.english_endings) do				if string.sub(word, -#english_ending) then return one_name_pattern(fullname) end end end return basic_pattern(fullname) end

for counter, word in pairs(name_table) do			if word == "van" or word == "de" then for i=1,counter - 1 do name = name .. name_table[i] end surname = string.gsub(fullname, name .. " ", "") return "Given = " .. name .. " -- " .. "Family = " .. surname end end -- If there is no format passed and code haven't detected where can be passed name from, it will return function basic_pattern return basic_pattern(fullname)

end

return p