<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ASandbox%2FAjuanca%2FNames</id>
	<title>Module:Sandbox/Ajuanca/Names - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ASandbox%2FAjuanca%2FNames"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/Ajuanca/Names&amp;action=history"/>
	<updated>2026-04-17T18:47:22Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://stockhub.co/index.php?title=Module:Sandbox/Ajuanca/Names&amp;diff=145094&amp;oldid=prev</id>
		<title>imported&gt;Ajuanca: Testing</title>
		<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/Ajuanca/Names&amp;diff=145094&amp;oldid=prev"/>
		<updated>2020-01-19T11:27:03Z</updated>

		<summary type="html">&lt;p&gt;Testing&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- Task 8 of GCI 2019&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Main function&lt;br /&gt;
function p.formatNames(frame)&lt;br /&gt;
	local inputName = tostring(frame.args.name)&lt;br /&gt;
	local inputLanguage = frame.args.language&lt;br /&gt;
	local fullPersonalName = p.divideName(inputName)&lt;br /&gt;
	local language = p.discoverLanguage(fullPersonalName, inputLanguage)&lt;br /&gt;
	-- Select corresponding getFamilyNames function depending &lt;br /&gt;
	-- on the language. Something like a switch.&lt;br /&gt;
	local name&lt;br /&gt;
	local str = &amp;quot;&amp;quot;&lt;br /&gt;
	if (language == &amp;quot;es&amp;quot;) then&lt;br /&gt;
		name = p.esName(fullPersonalName)&lt;br /&gt;
	elseif (language == &amp;quot;en&amp;quot;) then&lt;br /&gt;
		name = p.enName(fullPersonalName)&lt;br /&gt;
	elseif (language == &amp;quot;de&amp;quot;) then&lt;br /&gt;
		name = p.deName(fullPersonalName)&lt;br /&gt;
	elseif (language == &amp;quot;zh&amp;quot;) then&lt;br /&gt;
		name = p.zhName(fullPersonalName)&lt;br /&gt;
	elseif (language == &amp;quot;ru&amp;quot;) then&lt;br /&gt;
		name = p.ruName(fullPersonalName)&lt;br /&gt;
	else&lt;br /&gt;
		return language&lt;br /&gt;
	end&lt;br /&gt;
	-- Depending on number of surnames, choose one output.&lt;br /&gt;
	if(#name.givenNames &amp;gt; 1) then&lt;br /&gt;
		str = &amp;quot;The given name is &amp;lt;b&amp;gt;&amp;quot; &lt;br /&gt;
		for z, name in ipairs(name.givenNames) do&lt;br /&gt;
			str = str .. &amp;quot; &amp;quot; .. name&lt;br /&gt;
		end&lt;br /&gt;
		str = str .. &amp;quot;&amp;lt;/b&amp;gt;.&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
	else&lt;br /&gt;
		str = &amp;quot;The given name is &amp;lt;b&amp;gt;&amp;quot; .. name.givenNames[1] .. &amp;quot;&amp;lt;/b&amp;gt;.&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	if(#name.familyNames &amp;gt; 1) then&lt;br /&gt;
		if(language == &amp;quot;es&amp;quot;) then&lt;br /&gt;
			str = str .. &amp;quot;The first family name is &amp;lt;b&amp;gt;&amp;quot; .. name.familyNames[1] .. &amp;quot;&amp;lt;/b&amp;gt;.&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
			.. &amp;quot;The second family name is &amp;lt;b&amp;gt;&amp;quot; .. name.familyNames[2] .. &amp;quot;&amp;lt;/b&amp;gt;.&amp;quot;&lt;br /&gt;
		elseif(language == &amp;quot;ru&amp;quot;) then&lt;br /&gt;
			str = str .. &amp;quot;The family name is &amp;lt;b&amp;gt;&amp;quot; .. name.familyNames[1] .. &amp;quot;&amp;lt;/b&amp;gt;.&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
			.. &amp;quot;The patronymic name is &amp;lt;b&amp;gt;&amp;quot; .. name.familyNames[2] .. &amp;quot;&amp;lt;/b&amp;gt;.&amp;quot;&lt;br /&gt;
		elseif(language==&amp;quot;zh&amp;quot;) then&lt;br /&gt;
			str = str .. &amp;quot;The family name is &amp;lt;b&amp;gt;&amp;quot; ..name.familyNames[1] .. &amp;quot;&amp;lt;/b&amp;gt;.&amp;lt;br&amp;gt;&amp;quot; ..&lt;br /&gt;
			&amp;quot;The courtesy name is &amp;lt;b&amp;gt;&amp;quot; .. name.familyNames[2] ..&amp;quot;&amp;lt;/b&amp;gt;.&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		str = str .. &amp;quot;The family name is &amp;lt;b&amp;gt;&amp;quot; .. name.familyNames[1] .. &amp;quot;&amp;lt;/b&amp;gt;.&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	return str &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Finds language of name&lt;br /&gt;
-- Returns a String&lt;br /&gt;
function p.discoverLanguage(names, supposedLanguage)&lt;br /&gt;
	local lang = &amp;quot;#&amp;quot;&lt;br /&gt;
	if (supposedLanguage ~= nil) then&lt;br /&gt;
		if (string.len(supposedLanguage)  == 2) then&lt;br /&gt;
			-- Array of ISO tags is compared here (no need of process if this attribute isn&amp;#039;t given).&lt;br /&gt;
			-- Return #(message error) if ISO tag provided doesn&amp;#039;t exist or isn&amp;#039;t implemented.&lt;br /&gt;
			local compatibleCodes = {&amp;quot;en&amp;quot;, &amp;quot;es&amp;quot;, &amp;quot;zh&amp;quot;, &amp;quot;ru&amp;quot;, &amp;quot;de&amp;quot;}&lt;br /&gt;
			local isCompatible = false&lt;br /&gt;
			for n, iso in ipairs(compatibleCodes) do&lt;br /&gt;
				if (supposedLanguage == iso) then&lt;br /&gt;
					isCompatible = true&lt;br /&gt;
					break&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			if (isCompatible) then&lt;br /&gt;
				lang = supposedLanguage&lt;br /&gt;
			else&lt;br /&gt;
				lang = &amp;quot;#noCompatible&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			lang = &amp;quot;#incorrectFormat&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		function findLanguageMatch(name)&lt;br /&gt;
			for k, name in ipairs (names) do&lt;br /&gt;
				-- Search for indicators in each word.&lt;br /&gt;
				-- First step is compare possible know surnames that exit the normal form or cause conflicts with other&lt;br /&gt;
				-- indicators.&lt;br /&gt;
				local commonSurnames = {&lt;br /&gt;
					{ &amp;quot;es&amp;quot;, &lt;br /&gt;
						{ &amp;quot;Navarro&amp;quot;, &amp;quot;Gil&amp;quot;, &amp;quot;Serrano&amp;quot;, &amp;quot;Sanz&amp;quot;, &amp;quot;Ortega&amp;quot;, &amp;quot;Iglesias&amp;quot;, &amp;quot;Cruz&amp;quot;, &amp;quot;Aguilar&amp;quot;, &lt;br /&gt;
						&amp;quot;Rivera&amp;quot;, &amp;quot;Herrera&amp;quot;, &amp;quot;Castro&amp;quot;, &amp;quot;Luna&amp;quot;, &amp;quot;Garza&amp;quot;, &amp;quot;Soto&amp;quot;, &amp;quot;Diaz&amp;quot;&lt;br /&gt;
					}},&lt;br /&gt;
					{ &amp;quot;de&amp;quot;, &lt;br /&gt;
						{ &amp;quot;Mies&amp;quot;&lt;br /&gt;
					}},&lt;br /&gt;
					{ &amp;quot;ru&amp;quot;, &lt;br /&gt;
						{ &amp;quot;Poda&amp;quot;, &amp;quot;Petrenko&amp;quot;, &amp;quot;Roschin&amp;quot;, &amp;quot;Uspensky&amp;quot;, &amp;quot;Vladímir&amp;quot; &lt;br /&gt;
					}},&lt;br /&gt;
					-- No need to include Wang, Zhang or Chang (common termination -ang).&lt;br /&gt;
					{ &amp;quot;zh&amp;quot;, &lt;br /&gt;
						{ &amp;quot;Wáng&amp;quot;, &amp;quot;Wāng&amp;quot;, &amp;quot;Li&amp;quot;, &amp;quot;Lei&amp;quot;, &amp;quot;Lie&amp;quot;, &amp;quot;Lee&amp;quot;, &amp;quot;Cheung&amp;quot;, &amp;quot;Chen&amp;quot;, &amp;quot;Zhou&amp;quot;, &amp;quot;Zhao&amp;quot;&lt;br /&gt;
					}},&lt;br /&gt;
					{&amp;quot;en&amp;quot;,&lt;br /&gt;
						{&amp;quot;Barack&amp;quot;, &amp;quot;Darwin&amp;quot;&lt;br /&gt;
						}}&lt;br /&gt;
				}&lt;br /&gt;
				-- Search for a common surname that scapes from previous rules.&lt;br /&gt;
				for d, specificLanguageTable in ipairs(commonSurnames) do&lt;br /&gt;
					for x, surname in ipairs(specificLanguageTable[2]) do&lt;br /&gt;
						if(surname == name) then&lt;br /&gt;
							return specificLanguageTable[1]&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			&lt;br /&gt;
				-- Spanish (es) indicators search.&lt;br /&gt;
				local accentLetters = {&amp;quot;á&amp;quot;, &amp;quot;é&amp;quot;, &amp;quot;í&amp;quot;, &amp;quot;ó&amp;quot;, &amp;quot;ú&amp;quot;, &amp;quot;Á&amp;quot;, &amp;quot;É&amp;quot;, &amp;quot;Í&amp;quot;, &amp;quot;Ó&amp;quot;, &amp;quot;Ú&amp;quot;}&lt;br /&gt;
				local esCharacter = &amp;quot;ñ&amp;quot;&lt;br /&gt;
				-- preposition &amp;#039;de&amp;#039; appears also in de.&lt;br /&gt;
				local esConnectors = {&amp;quot;del&amp;quot;, &amp;quot;el&amp;quot;, &amp;quot;la&amp;quot;, &amp;quot;los&amp;quot;, &amp;quot;las&amp;quot;, &amp;quot;y&amp;quot;}&lt;br /&gt;
				local esTerminations = {&amp;quot;ez&amp;quot;, &amp;quot;es&amp;quot;, &amp;quot;is&amp;quot;, &amp;quot;iz&amp;quot;}&lt;br /&gt;
				-- Search for accents.&lt;br /&gt;
				for a, accent in ipairs(accentLetters) do&lt;br /&gt;
					if (mw.ustring.find(name, accent)~=nil) then&lt;br /&gt;
						return &amp;quot;es&amp;quot;&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				-- Search for espanish character. &lt;br /&gt;
				if(string.find(name, esCharacter)~= nil) then&lt;br /&gt;
					lang = &amp;quot;es&amp;quot;&lt;br /&gt;
				end&lt;br /&gt;
				-- Search for articles and connectors.&lt;br /&gt;
				for b, connector in ipairs(esConnectors) do&lt;br /&gt;
					if(name == connector) then&lt;br /&gt;
						return &amp;quot;es&amp;quot;&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				-- Search for terminations.&lt;br /&gt;
				for c, termination in ipairs(esTerminations) do&lt;br /&gt;
					local finalLetters = string.sub(name, -2, -1)&lt;br /&gt;
					if (finalLetters == termination) then&lt;br /&gt;
						return &amp;quot;es&amp;quot;&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				&lt;br /&gt;
				-- Deutsch (de) indicators search.&lt;br /&gt;
				local deCharacter = &amp;quot;β&amp;quot;&lt;br /&gt;
				local deConnectors = {&amp;quot;van&amp;quot;, &amp;quot;Van&amp;quot;, &amp;quot;Le&amp;quot;, &amp;quot;le&amp;quot;, &amp;quot;ten&amp;quot;}&lt;br /&gt;
				local deCommonSyllables = {&amp;quot;sch&amp;quot;, &amp;quot;Sch&amp;quot;, &amp;quot;ff&amp;quot;, &amp;quot;tt&amp;quot;, &amp;quot;dd&amp;quot;, &amp;quot;kk&amp;quot;}&lt;br /&gt;
				local deTerminations = {&amp;quot;er&amp;quot;, &amp;quot;ck&amp;quot;, &amp;quot;dt&amp;quot;, &amp;quot;tz&amp;quot;, &amp;quot;en&amp;quot;}&lt;br /&gt;
				-- Search for german character. &lt;br /&gt;
				if(string.find(name, deCharacter)~= nil) then&lt;br /&gt;
					return &amp;quot;de&amp;quot;&lt;br /&gt;
				end&lt;br /&gt;
				--Search for connectors.&lt;br /&gt;
				for e, connector in ipairs(deConnectors) do&lt;br /&gt;
					if(name == connector) then&lt;br /&gt;
						return &amp;quot;de&amp;quot;&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				-- Search for syllables.&lt;br /&gt;
				for f, syllable in ipairs(deCommonSyllables) do&lt;br /&gt;
					if(string.find(name, syllable)~= nil) then&lt;br /&gt;
						return &amp;quot;de&amp;quot;&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				-- Search for terminations.&lt;br /&gt;
				for g, termination in ipairs(deTerminations) do&lt;br /&gt;
					local finalLetters = string.sub(name, -2, -1)&lt;br /&gt;
					if (finalLetters == termination) then&lt;br /&gt;
						return &amp;quot;de&amp;quot;&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				&lt;br /&gt;
				-- Russian (ru) indicators search.&lt;br /&gt;
				local patronymicsDerivations = {&amp;quot;ovich&amp;quot;, &amp;quot;evich&amp;quot;}&lt;br /&gt;
				local derivatedSurnames = {&amp;quot;ov&amp;quot;, &amp;quot;ev&amp;quot;, &amp;quot;ova&amp;quot;, &amp;quot;eva&amp;quot;}&lt;br /&gt;
				-- Surnames that scape from the rest of indicators.&lt;br /&gt;
				-- Search for patronymics&lt;br /&gt;
				for s, patronymic in ipairs(patronymicsDerivations) do&lt;br /&gt;
					if((string.find(name, patronymic))~= nil)then&lt;br /&gt;
						return &amp;quot;ru&amp;quot;&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				-- Search for common derivations&lt;br /&gt;
					for f, derivation in ipairs(derivatedSurnames) do&lt;br /&gt;
					if((string.find(name, derivation))~= nil) then&lt;br /&gt;
						return &amp;quot;ru&amp;quot;&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			&lt;br /&gt;
				-- Chinese (zh) indicators search.&lt;br /&gt;
				local zhTerminations = {&amp;quot;ong&amp;quot;, &amp;quot;ang&amp;quot;}&lt;br /&gt;
				-- Check for common Zh terminations&lt;br /&gt;
				for j, termination in ipairs(zhTerminations) do&lt;br /&gt;
					local finalLetters = string.sub(name, -2, -1)&lt;br /&gt;
					if (finalLetters == termination) then&lt;br /&gt;
						return &amp;quot;zh&amp;quot;&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				-- Surnames beetween two and three characters, that aren&amp;#039;t connectors of other languages&lt;br /&gt;
				-- will probably be one of the Chinease &amp;#039;Hundred Family Surnames&amp;#039; surname.&lt;br /&gt;
				-- The only exception are abrevations.&lt;br /&gt;
				-- Now is common to find given names of just one character.&lt;br /&gt;
				if(string.len(name) &amp;lt;= 3) then&lt;br /&gt;
					if(string.sub(name, string.len(name)) == &amp;quot;.&amp;quot;) then&lt;br /&gt;
						return &amp;quot;en&amp;quot;&lt;br /&gt;
					else&lt;br /&gt;
						return &amp;quot;zh&amp;quot;&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		-- If there was no match, get name by default (en) structure. No need&lt;br /&gt;
		-- to search for english terminations.&lt;br /&gt;
		lang = findLanguageMatch(name) or &amp;quot;en&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	return lang&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Divides the input based on spaces. &lt;br /&gt;
-- Returns a table&lt;br /&gt;
function p.divideName(name)&lt;br /&gt;
	local nameTable = {}&lt;br /&gt;
	for m in string.gmatch(name, (&amp;quot;%S+&amp;quot;)) do &lt;br /&gt;
		table.insert(nameTable, m)&lt;br /&gt;
	end&lt;br /&gt;
	return nameTable&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Works with a spanish name, finding the given and families names.&lt;br /&gt;
-- Returns a table&lt;br /&gt;
function p.esName(fullNameTable)&lt;br /&gt;
	name = {&lt;br /&gt;
		givenNames = {},&lt;br /&gt;
		familyNames = {}&lt;br /&gt;
	}&lt;br /&gt;
	if(not(p.isOnlyName(fullNameTable))) then&lt;br /&gt;
		table.remove(fullNameTable)&lt;br /&gt;
	end&lt;br /&gt;
	table.insert(name.givenNames, fullNameTable[1])&lt;br /&gt;
	table.remove(fullNameTable, 1)&lt;br /&gt;
	function getPositionOfConecctors(fullNameTable)&lt;br /&gt;
		local connectors = {&amp;quot;de&amp;quot;, &amp;quot;del&amp;quot;, &amp;quot;y&amp;quot;}&lt;br /&gt;
		firstSurname = 0&lt;br /&gt;
		lastSurname = 0&lt;br /&gt;
		for d, actualName in ipairs(fullNameTable)do&lt;br /&gt;
			for x, connector in ipairs(connectors) do&lt;br /&gt;
				if(connector == actualName) then&lt;br /&gt;
					firstSurname = d&lt;br /&gt;
					for z, lastConnector in ipairs(connectors) do&lt;br /&gt;
						if((fullNameTable[#fullNameTable-1] == lastConnector) and (firstSurname ~= #fullNameTable-1)) then&lt;br /&gt;
							lastSurname = #fullNameTable-1&lt;br /&gt;
							return {firstSurname, lastSurname }&lt;br /&gt;
						end&lt;br /&gt;
						if(fullNameTable[#fullNameTable-2] == lastConnector and (firstSurname ~= #fullNameTable-2)) then&lt;br /&gt;
							lastSurname = #fullNameTable-2&lt;br /&gt;
							return {firstSurname, lastSurname}&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		return { firstSurname, lastSurname }&lt;br /&gt;
	end&lt;br /&gt;
	local positions = getPositionOfConecctors(fullNameTable)&lt;br /&gt;
	if(positions[1]==0) then&lt;br /&gt;
		if(#fullNameTable==1)then&lt;br /&gt;
			table.insert(name.familyNames, fullNameTable[1])&lt;br /&gt;
		elseif(#fullNameTable==2)then&lt;br /&gt;
			-- 1st maybe is a given name&lt;br /&gt;
			local isGiven = true&lt;br /&gt;
			local terminations = {&amp;quot;ez&amp;quot;, &amp;quot;es&amp;quot;, &amp;quot;is&amp;quot;, &amp;quot;iz&amp;quot;}&lt;br /&gt;
			for c, termination in ipairs(terminations) do&lt;br /&gt;
				local finalLetters = string.sub(fullNameTable[1], -2, -1)&lt;br /&gt;
				if (finalLetters == termination) then&lt;br /&gt;
					isGiven = false&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			if(isGiven)then&lt;br /&gt;
				table.insert(name.givenNames, fullNameTable[1])&lt;br /&gt;
			else&lt;br /&gt;
				table.insert(name.familyNames, fullNameTable[1])&lt;br /&gt;
			end&lt;br /&gt;
			table.insert(name.familyNames, fullNameTable[2])&lt;br /&gt;
		else&lt;br /&gt;
			table.insert(name.givenNames, fullNameTable[1])&lt;br /&gt;
			table.insert(name.familyNames, fullNameTable[2])&lt;br /&gt;
			table.insert(name.familyNames, fullNameTable[3])&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		if(positions[2]==0)then&lt;br /&gt;
			if(positions[1]==1) then&lt;br /&gt;
				-- Maybe a second surname is behind&lt;br /&gt;
				table.insert(name.familyNames, table.concat(fullNameTable, &amp;quot; &amp;quot;, positions[1]))&lt;br /&gt;
			elseif(positions[1]==2)then&lt;br /&gt;
				-- 1st maybe is a given name&lt;br /&gt;
				local isGiven = true&lt;br /&gt;
				local terminations = {&amp;quot;ez&amp;quot;, &amp;quot;es&amp;quot;, &amp;quot;is&amp;quot;, &amp;quot;iz&amp;quot;}&lt;br /&gt;
				for c, termination in ipairs(terminations) do&lt;br /&gt;
					local finalLetters = string.sub(fullNameTable[1], -2, -1)&lt;br /&gt;
					if (finalLetters == termination) then&lt;br /&gt;
						isGiven = false&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				if(isGiven)then&lt;br /&gt;
					table.insert(name.givenNames, fullNameTable[1])&lt;br /&gt;
				else&lt;br /&gt;
					table.insert(name.familyNames, fullNameTable[1])&lt;br /&gt;
				end&lt;br /&gt;
				table.insert(name.familyNames, table.concat(fullNameTable, &amp;quot; &amp;quot;, positions[1]))&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			if(positions[1]==2)then&lt;br /&gt;
				table.insert(name.givenNames, fullNameTable[1])&lt;br /&gt;
			end&lt;br /&gt;
			table.insert(name.familyNames, table.concat(fullNameTable, &amp;quot; &amp;quot;, positions[1], positions[2]-1))&lt;br /&gt;
			table.insert(name.familyNames, table.concat(fullNameTable, &amp;quot; &amp;quot;, positions[2]))&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return name&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Works with a english name, finding the given and families names.&lt;br /&gt;
-- Returns a table&lt;br /&gt;
function p.enName(fullNameTable)&lt;br /&gt;
	name = {&lt;br /&gt;
		givenNames = {},&lt;br /&gt;
		familyNames = {}&lt;br /&gt;
	}&lt;br /&gt;
	-- Take action if some kind of suffix is given.&lt;br /&gt;
	if(not(p.isOnlyName(fullNameTable))) then&lt;br /&gt;
		table.remove(fullNameTable)&lt;br /&gt;
	end&lt;br /&gt;
	for f, actualName in ipairs(fullNameTable) do&lt;br /&gt;
		-- Only last position is family name.&lt;br /&gt;
		if(f == #fullNameTable) then&lt;br /&gt;
			table.insert(name.familyNames, actualName)&lt;br /&gt;
		else&lt;br /&gt;
			table.insert(name.givenNames, actualName)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return name&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Works with a german name, finding the given and families names.&lt;br /&gt;
-- Returns a table&lt;br /&gt;
function p.deName(fullNameTable)&lt;br /&gt;
	name = {&lt;br /&gt;
		givenNames = {},&lt;br /&gt;
		familyNames = {}&lt;br /&gt;
	}&lt;br /&gt;
	local connectors = {&amp;quot;de&amp;quot;, &amp;quot;van&amp;quot;, &amp;quot;den&amp;quot;, &amp;quot;ten&amp;quot;, &amp;quot;Van&amp;quot;, &amp;quot;der&amp;quot;, &amp;quot;Le&amp;quot;, &amp;quot;le&amp;quot;}&lt;br /&gt;
	if(not(p.isOnlyName(fullNameTable))) then&lt;br /&gt;
		table.remove(fullNameTable)&lt;br /&gt;
	end&lt;br /&gt;
	for d, actualName in ipairs(fullNameTable)do&lt;br /&gt;
		if(d==#fullNameTable) then&lt;br /&gt;
			table.insert(name.familyNames, actualName)&lt;br /&gt;
		else&lt;br /&gt;
			for x, connector in ipairs(connectors) do&lt;br /&gt;
				if(connector == actualName) then&lt;br /&gt;
					table.insert(name.familyNames, table.concat(fullNameTable, &amp;quot; &amp;quot;, d))&lt;br /&gt;
					return name&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			table.insert(name.givenNames, actualName)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return name&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Works with a russian name, finding the given and families names.&lt;br /&gt;
-- Returns a table&lt;br /&gt;
function p.ruName(fullNameTable)&lt;br /&gt;
	name = {&lt;br /&gt;
		familyNames = {},&lt;br /&gt;
		givenNames = {}&lt;br /&gt;
	}&lt;br /&gt;
	if(not(p.isOnlyName(fullNameTable))) then&lt;br /&gt;
		table.remove(fullNameTable)&lt;br /&gt;
	end&lt;br /&gt;
	-- Russian names are formed by a given name, the surname and a patronymic&lt;br /&gt;
	-- name.&lt;br /&gt;
	table.insert(name.givenNames, fullNameTable[1])&lt;br /&gt;
	-- Not all people has patrynomic name.&lt;br /&gt;
	if(#fullNameTable &amp;gt; 2) then &lt;br /&gt;
		table.insert(name.familyNames, fullNameTable[3])&lt;br /&gt;
		table.insert(name.familyNames, fullNameTable[2])&lt;br /&gt;
	else&lt;br /&gt;
		table.insert(name.familyNames, fullNameTable[2])&lt;br /&gt;
	end&lt;br /&gt;
	return name&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Works with a chinease name, finding the given and families names.&lt;br /&gt;
-- Returns a table&lt;br /&gt;
function p.zhName(fullNameTable)&lt;br /&gt;
	name = {&lt;br /&gt;
		familyNames = {},&lt;br /&gt;
		givenNames = {}&lt;br /&gt;
	}&lt;br /&gt;
	if(not(p.isOnlyName(fullNameTable))) then&lt;br /&gt;
		table.remove(fullNameTable)&lt;br /&gt;
	end&lt;br /&gt;
	table.insert(name.familyNames, fullNameTable[1])&lt;br /&gt;
	table.remove(fullNameTable, 1)&lt;br /&gt;
	-- Appart from given name and family name, maybe a courtesy name is given.&lt;br /&gt;
	for x, eachName in ipairs(fullNameTable) do&lt;br /&gt;
		if(string.find(eachName, &amp;quot;%(&amp;quot;)~=nil) then&lt;br /&gt;
			local intStart = string.find(eachName, &amp;quot;%(&amp;quot;)+1&lt;br /&gt;
			local intEnd = string.find(eachName, &amp;quot;)&amp;quot;)-1&lt;br /&gt;
			table.insert(name.familyNames, string.sub(eachName, intStart, intEnd))&lt;br /&gt;
		else&lt;br /&gt;
			table.insert(name.givenNames, &amp;quot; &amp;quot; .. eachName)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return name&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Finds a no-name in the input&lt;br /&gt;
-- Returns boolean&lt;br /&gt;
function p.isOnlyName(tableName)&lt;br /&gt;
	local isJustName = false&lt;br /&gt;
	-- Searchs for Roman number in last name.&lt;br /&gt;
	local romanNumbers = {&amp;quot;I&amp;quot;, &amp;quot;V&amp;quot;, &amp;quot;X&amp;quot;}&lt;br /&gt;
	local hasRomanNumbers = false&lt;br /&gt;
	for letter in string.gmatch(tableName[#tableName], &amp;quot;(%w)&amp;quot;) do&lt;br /&gt;
		for n, romanNumber in ipairs(romanNumbers) do&lt;br /&gt;
			if (letter == romanNumber) then&lt;br /&gt;
				hasRomanNumbers = true&lt;br /&gt;
				break&lt;br /&gt;
			else&lt;br /&gt;
				hasRomanNumbers = false&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	-- Searchs for other suffixes in last name.&lt;br /&gt;
	local suffixes = {&amp;quot;Jr&amp;quot;, &amp;quot;Jr.&amp;quot;, &amp;quot;Sr&amp;quot;, &amp;quot;Sr.&amp;quot;}&lt;br /&gt;
	local hasSuffix = false&lt;br /&gt;
	for n, suffix in ipairs(suffixes) do&lt;br /&gt;
		if (tableName[#tableName] == suffix) then&lt;br /&gt;
			hasSuffix = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	-- Returns final boolean&lt;br /&gt;
	if (hasSuffix or hasRomanNumbers) then&lt;br /&gt;
		isJustName = false&lt;br /&gt;
	else&lt;br /&gt;
		isJustName = true&lt;br /&gt;
	end&lt;br /&gt;
	return isJustName&lt;br /&gt;
end&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;Ajuanca</name></author>
	</entry>
</feed>