Modul:InfoboxSettlement

De la Wikivoyage

Documentația acestui modul poate fi creată la Modul:InfoboxSettlement/doc

local p = {}

local args = {}
local root
local wikidata = require('Module:Wikidata')
local collapsibleList = require('Module:Collapsible_list')
local getArgs = require('Module:Arguments').getArgs
local existCache = {}
local lang = mw.getContentLanguage()

local function ifexist(pageName)
	if existCache[pageName] == nil then
		local page = mw.title.new(pageName)
		if page then
			existCache[pageName] = page.exists
		else
			existCache[pageName] = false
		end
	end
	return existCache[pageName]
end

local function returnIfPageExists(pageName)
	if pageName == nil then return nil end
	if ifexist(pageName) then
		return pageName
	end
	return nil
end

local function isNilOrEmpty(argument)
	return argument == nil or mw.text.trim(argument) == ''
end

local function convertSqMiToKm2(argument)
	local sqmi = argument
	if type(argument) == 'string' then sqmi = tonumber(argument) end
	return 2.58998811 * sqmi
end

local function convertFtToM(argument)
	local ft = argument
	if type(argument) == 'string' then sqmi = tonumber(argument) end
	return .3048 * ft
end

local function round(num, idp)
	local mult = 10^(idp or 0)
	return math.floor(num * mult + 0.5) / mult
end

local function removeDiacritics(argument)
	local ret = tostring(argument)
	ret = mw.ustring.gsub(ret, 'ă', 'a')
	ret = mw.ustring.gsub(ret, 'â', 'a')
	ret = mw.ustring.gsub(ret, 'î', 'i')
	ret = mw.ustring.gsub(ret, 'ș', 's')
	ret = mw.ustring.gsub(ret, 'ț', 't')
	ret = mw.ustring.gsub(ret, 'ș', 's')
	ret = mw.ustring.gsub(ret, 'ț', 't')
	return ret
end
local function _generate()
	root = mw.html.create('table')
	root:addClass('infocaseta')
		:attr('cellspacing', '0')
		:css('font-size', '88%')
		:css('padding', '0')
		:css('line-height', '1.5em')
		
	local headerTd = root:tag('tr'):tag('td')
			:attr('colspan', '2')
			:addClass('antet harta')
			:wikitext(args['nume'])
	if args['nume_nativ'] then
		headerTd:tag('br')
		headerTd:tag('span')
				:addClass('porecla')
				:wikitext(args['nume_nativ'])
	end
	if args['alt_nume'] then
		headerTd:tag('br')
		headerTd:tag('span')
				:addClass('porecla')
				:wikitext(args['alt_nume'])
	end
	if args['nume'] and args['tip_asezare'] then
		root:tag('tr')
			:addClass('mergedtoprow')
			:tag('td')
				:attr('colspan', '2')
				:css('text-align', 'center')
				:css('background', '#dddddd')
				:wikitext("—  '''" .. args['tip_asezare'] .. "'''  —")
	end
	
	if args['nume'] and args['nume_oficial'] and args['nume'] ~= args['nume_oficial'] then
		root:tag('tr')
			:addClass('mergedtoprow')
			:tag('td')
				:attr('colspan', '2')
				:css('text-align', 'center')
				:wikitext("'''" .. args['nume_oficial'] .. "'''")
	end
	
	local nume_limba = args['nume_limba']
	for langIndex = 1,table.maxn(nume_limba) do
		if nume_limba[langIndex] and nume_limba[langIndex]['nume_limba'] and nume_limba[langIndex]['nume_limba'] ~= "" then
			root:tag('tr')
				:addClass('mergedtoprow')
				:tag('td')
					:attr('colspan', '2')
					:css('text-align', 'center')
					:wikitext("'''" .. nume_limba[langIndex]['nume_limba'] .. " '''")
			local nume_limba_tip = nume_limba[langIndex]['tip']
			local nume_limba_info = nume_limba[langIndex]['info']
			if nume_limba_tip and nume_limba_info then
				for tipIndex = 1,table.maxn(nume_limba_tip) do
					if nume_limba_tip[tipIndex] then
						local langTr = root:tag('tr')
						if tipIndex == table.maxn(nume_limba_tip) then langTr:addClass('mergedbottomrow') else langTr:addClass('mergedrow') end
						langTr:tag('th')
							:wikitext(" - " .. nume_limba_tip[tipIndex])
						langTr:tag('td')
							:wikitext(nume_limba_info[tipIndex] or "")
					end
				end
			end
		end
	end

	if args['imagine'] and args['imagine'] ~= "" then
		root:tag('tr')
			:tag('td')
				:attr('colspan', '2')
				:css('text-align', 'center')
				:css('padding', '0.7em 0.8em 0.7em 0.8em')
				:wikitext('[[Fișier:' .. args['imagine'] .. '|' .. args['imagine_dimensiune'] .. '|none|' .. args['imagine_descriere'] .. ']]' .. args['imagine_descriere'])
	end

	if args['image_seal'] or args['drapel'] or args['stemă'] or args['emblemă_imagine'] then
		local symbolsTable = root:tag('tr')
			:addClass('mergedtoprow')
			:tag('td')
				:addClass('maptable')
				:attr('colspan', '2')
				:attr('align', 'center')
				:css('padding', '0.4em 0 0.4em 0')
				:tag('table')
					:css('width', '100%')
					:css('background', 'none')
					:attr('align', 'center')
		local numberOfSymbols = 0
		
		local sealText, drapelText, stemaText, emblemaText = "","","",""
		if not isNilOrEmpty(args['image_seal']) then
			sealText = sealText .. "[[Fișier:" .. args['image_seal'] .. '|' .. args['seal_size'] .. '|'
			sealText = sealText .. "Sigiliul autorităților din " .. args['nume'] .. ']]'
			sealText = sealText .. "<br/><small>"
			if args['seal_link'] and args['seal_link'] ~= "" then sealText = sealText .. '[[' .. args['seal_link'] .. '|Sigiliu]]' else sealText = sealText .. "'''Sigiliu'''" end
			sealText = sealText .. "</small>"
		end
		if not isNilOrEmpty(args['emblemă_imagine']) then
			emblemaText = emblemaText .. "[[Fișier:" .. args['emblemă_imagine'] .. '|' .. args['emblemă_dimensiune'] .. '|Logo oficial]]'
			emblemaText = emblemaText .. "<br/><small>"
			if not isNilOrEmpty(args['emblemă_link']) then emblemaText = emblemaText .. '[[' .. args['emblemă_link'] .. '|' .. args['emblemă_tip'] ..']]' else emblemaText = emblemaText .. args['emblemă_tip'] end
			emblemaText = emblemaText .. "</small>"
		end
		if not isNilOrEmpty(args['stemă']) then
			stemaText = stemaText .. "[[Fișier:" .. args['stemă'] .. '|' .. args['stemă_dimensiune'] .. '|Stemă]]'
			stemaText = stemaText .. "<br/><small>"
			if not isNilOrEmpty(args['link_stemă']) then stemaText = stemaText .. '[[' .. args['link_stemă'] .. '|Stemă]]' else stemaText = stemaText .. "'''Stemă'''" end
			stemaText = stemaText .. "</small>"
		end
		if not isNilOrEmpty(args['drapel']) then
			drapelText = drapelText .. "[[Fișier:" .. args['drapel'] .. '|' .. args['drapel_dimensiune'] .. '|border|Drapel]]'
			drapelText = drapelText .. "<br/><small>"
			if not isNilOrEmpty(args['link_drapel']) then drapelText = drapelText .. '[[' .. args['link_drapel'] .. '|Drapel]]' else drapelText = drapelText .. "'''Drapel'''" end
			drapelText = drapelText .. "</small>"
		end
		
		for symbolIndex, symbolKey in pairs({ 'image_seal', 'drapel', 'stemă', 'emblemă_imagine' }) do
			if not isNilOrEmpty(args[symbolKey]) then numberOfSymbols = numberOfSymbols + 1 end
		end
		if numberOfSymbols == 2 then
			local twoSymbolsTr = symbolsTable:tag('tr')
			local firstSymbolsTd = twoSymbolsTr:tag('td')
					:css('vertical-align', 'middle')
					:attr('align', 'center')
			if not isNilOrEmpty(args['drapel']) then
				firstSymbolsTd:wikitext(drapelText)
			elseif not isNilOrEmpty(args['image_seal']) then
				firstSymbolsTd:wikitext(sealText)
			elseif not isNilOrEmpty(args['stemă']) then
				firstSymbolsTd:wikitext(stemaText)
			elseif not isNilOrEmpty(args['emblemă_imagine']) then
				firstSymbolsTd:wikitext(emblemaText)
			end
			local secondSymbolsTd = twoSymbolsTr:tag('td')
					:css('vertical-align', 'middle')
					:attr('align', 'center')
			if not isNilOrEmpty(args['emblemă_imagine']) then
				secondSymbolsTd:wikitext(emblemaText)
			elseif not isNilOrEmpty(args['stemă']) then
				secondSymbolsTd:wikitext(stemaText)
			elseif not isNilOrEmpty(args['image_seal']) then
				secondSymbolsTd:wikitext(sealText)
			elseif not isNilOrEmpty(args['drapel']) then
				secondSymbolsTd:wikitext(drapelText)
			end
		else
			if not isNilOrEmpty(args['drapel']) or not isNilOrEmpty(args['image_seal']) then
				local flagAndSealRow = symbolsTable:tag('tr')
				if not isNilOrEmpty(args['drapel']) then
					local drapelTd = flagAndSealRow:tag('td'):css('vertical-align', 'middle'):attr('align', 'center')
					if isNilOrEmpty(args['image_seal']) then drapelTd:attr('colspan', '2') else drapelTd:attr('width', '50%') end
					drapelTd:wikitext(drapelText)
				end
				if not isNilOrEmpty(args['image_seal']) then
					local sealTd = flagAndSealRow:tag('td'):css('vertical-align', 'middle'):attr('align', 'center')
					if isNilOrEmpty(args['drapel']) then sealTd:attr('colspan', '2') else sealTd:attr('width', '50%') end
					sealTd:wikitext(sealText)
				end
			end
			if not isNilOrEmpty(args['stemă']) or not isNilOrEmpty(args['emblemă_imagine']) then
				local armsAndLogoRow = symbolsTable:tag('tr')
				if not isNilOrEmpty(args['stemă']) then
					local armsTd = armsAndLogoRow:tag('td'):css('vertical-align', 'middle'):attr('align', 'center')
					if isNilOrEmpty(args['emblemă_imagine']) then armsTd:attr('colspan', '2') else armsTd:attr('width', '50%') end
					armsTd:wikitext(stemaText)
				end
				if not isNilOrEmpty(args['emblemă_imagine']) then
					local logoTd = armsAndLogoRow:tag('td'):css('vertical-align', 'middle'):attr('align', 'center')
					if isNilOrEmpty(args['stemă']) then logoTd:attr('colspan', '2') else logoTd:attr('width', '50%') end
					logoTd:wikitext(emblemaText)
				end
			end
		end
	end
	
	if args['poreclă'] ~= "" then
		root:tag('tr'):addClass('mergedrow')
			:tag('td'):attr('colspan', '2')
				:attr('align', 'center')
				:wikitext('[[Poreclă]]: ' .. tostring(mw.html.create('span'):addClass('porecla'):wikitext(args['poreclă'])))
	end
	if args['motto'] ~= "" then
		root:tag('tr'):addClass('mergedrow')
			:tag('td'):attr('colspan', '2')
				:attr('align', 'center')
				:wikitext('[[Motto]]: ' .. args['motto'])
	end
	local hartaPunct = args['hartă_punct']
	if hartaPunct then
		local hartaPunctText = mw.getCurrentFrame():expandTemplate{ 
			title = 'superimpose', 
			args = { 
				base = hartaPunct.imagine,
				base_width = hartaPunct.dimensiune,
				base_caption = args['nume'],
				float = 'Red pog.svg',
				float_width = '9px',
				float_caption = hartaPunct.descriere,
				x = hartaPunct.x,
				y = hartaPunct.y
			}
		} .. (hartaPunct.descriere ~= nil and tostring(mw.html.create('small').wikitext(hartaPunct.descriere)) or '')
		root:tag('tr'):addClass('mergedrow'):attr('align', 'center')
			:tag('td'):attr('colspan', '2')
				:css('text-align', 'center')
				:css('padding', '0.7em 0.8em 0.7em 0.8em')
				:wikitext(hartaPunctText)
	end
	local pushpins = args['pushpin']
	for mapIndex = 1,table.maxn(args['pushpin']) do
		if pushpins[mapIndex] 
			and not isNilOrEmpty(pushpins[mapIndex]['map']) 
			and not isNilOrEmpty(args['longd'])
			and not isNilOrEmpty(args['latd'])
			and ifexist('Format:Harta de localizare ' .. pushpins[mapIndex]['map']) then
				local mapArgs = { pushpins[mapIndex]['map'], float = 'none', background = args['background'], border = 'none', position = pushpins[mapIndex]['label_position'], width = pushpins[mapIndex]['size']}
				if pushpins[mapIndex]['label_position'] ~= none then mapArgs.label = args['nume'] end
				if isNilOrEmpty(args['longm']) and isNilOrEmpty(args['longEV']) then 
					mapArgs.long = args['longd']
				else
					mapArgs.lon_deg = args['longd']
					mapArgs.lon_min = args['longm']
					mapArgs.lon_sec = args['longs']
					mapArgs.lon_dir = args['longEV']
				end
				if isNilOrEmpty(args['latm']) and isNilOrEmpty(args['latNS']) then
					mapArgs.lat = args['latd']
				else
					mapArgs.lat_deg = args['latd']
					mapArgs.lat_min = args['latm']
					mapArgs.lat_sec = args['lats']
					mapArgs.lat_dir = args['latNS']
				end
				local altMap = mw.getCurrentFrame():expandTemplate{title = 'Harta de localizare ' .. pushpins[mapIndex]['map'], args = { 'alt_image' } }
				if not isNilOrEmpty(altMap) then mapArgs.AlternativeMap = altMap end
				local mapText = mw.getCurrentFrame():expandTemplate{title = 'Harta de localizare ', args = mapArgs }
				root:tag('tr'):addClass('mergedrow')
					:tag('td'):attr('colspan', '2'):attr('align', 'center')
					:wikitext(mapText .. pushpins[mapIndex]['caption'])
		end
	end
	if not isNilOrEmpty(args['latd']) or not isNilOrEmpty(args['coordonate']) then
		local coordsTh = root:tag('tr'):addClass('mergedbottomrow')
								:tag('th'):attr('colspan', '2')
									:css('text-align', 'center')
									:css('font-size', 'small')
									:css('padding-bottom', '0.7em')
		if not isNilOrEmpty(args['latd']) then
			local coordsText = 'Coordonate'
			if not isNilOrEmpty(args['tip_coordonate']) then
				coordsText = coordsText .. '&nbsp;(' .. args['tip_coordonate'] .. ')'
			end
			coordsText = coordsText .. ':' .. mw.getCurrentFrame():expandTemplate{ title = 'Geobox coor', args = { args['latd'], args['latm'], args['lats'], args['latNS'], args['longd'], args['longm'], args['longs'], args['longEV'], args['coordinates_type'], title='1', format='dms' } }
			coordsTh:wikitext(coordsText)
		elseif not isNilOrEmpty(args['coordonate']) then
			coordsTh:wikitext(args['coordonate'])
		end
	end
	if #(args['subdiviziuni']) > 0 then
		root:tag('tr'):tag('td'):attr('colspan', '2'):tag('hr')
		for subdivIndex = 1, table.maxn(args['subdiviziuni']) do
			if args['subdiviziuni'][subdivIndex] ~= nil and not isNilOrEmpty(args['subdiviziuni'][subdivIndex]['tip']) then
				local subdivTh = root:tag('tr'):addClass('merged' .. (subdivIndex == 1 and 'top' or '') .. 'row'):tag('th'):wikitext(args['subdiviziuni'][subdivIndex]['tip']):done()
					:tag('th'):addClass('adr')
				if subdivIndex == 1 then subdivTh:tag('span'):addClass('country-name'):wikitext(args['subdiviziuni'][subdivIndex]['nume'])
				elseif subdivIndex == 2 then subdivTh:tag('span'):addClass('region'):wikitext(args['subdiviziuni'][subdivIndex]['nume'])
				else subdivTh:wikitext(args['subdiviziuni'][subdivIndex]['nume']) end
			end
		end
	end
	if #(args['clasificari']) > 0 then
		root:tag('tr'):tag('td'):attr('colspan', '2'):tag('hr')
		for clasifIndex = 1, table.maxn(args['clasificari']) do
			if args['clasificari'][clasifIndex] ~= nil and not isNilOrEmpty(args['clasificari'][clasifIndex]['tip']) then
				root:tag('tr'):addClass('merged' .. (clasifIndex == 1 and 'top' or '') .. 'row'):tag('th'):wikitext(args['clasificari'][clasifIndex]['tip']):done()
					:tag('td'):wikitext(args['clasificari'][clasifIndex]['cod'])
			end
		end
	end
	for atestIndex = 1, table.maxn(args['atestari']) do
		if args['atestari'][atestIndex] ~= nil and not isNilOrEmpty(args['atestari'][atestIndex]['an']) and not isNilOrEmpty(args['atestari'][atestIndex]['titlu']) then
			root:tag('tr'):addClass('mergedrow')
				:tag('th'):wikitext(args['atestari'][atestIndex]['titlu']):done()
				:tag('td'):wikitext(args['atestari'][atestIndex]['an'])
		end
	end
	if not isNilOrEmpty(args['fondator']) then
		root:tag('tr'):addClass('mergedrow')
			:tag('th'):wikitext('Fondator'):done()
			:tag('td'):wikitext(args['fondator'])
	end
	if not isNilOrEmpty(args['numit_dupa']) then
		root:tag('tr'):addClass('mergedrow')
			:tag('th'):wikitext('Numit după'):done()
			:tag('td'):wikitext(args['numit_dupa'])
	end
	local ip = args['p']
	if table.maxn(ip) == 0 and isNilOrEmpty(args['componenta']) then
		ip = wikidata.getValueList(nil, 'P1383') or {}
	end
	if not isNilOrEmpty(args['resedinta']) or table.maxn(ip) > 0 or not isNilOrEmpty(args['componenta']) then
		root:tag('tr'):tag('td'):attr('colspan', '2'):tag('hr')
		local nextRowClass = 'mergedtoprow'
		if not isNilOrEmpty(args['resedinta']) then
			root:tag('tr'):addClass(nextRowClass)
				:tag('th'):wikitext(args['tip_resedinta']):done()
				:tag('td'):wikitext(args['resedinta'])
			nextRowClass = 'mergedrow'
		end
		if table.maxn(ip) > 0 or not isNilOrEmpty(args['componenta']) then
			local tipComp = isNilOrEmpty(args['tip_componenta']) and 'Componență' or args['tip_componenta']
			local pTableRow = root:tag('tr'):addClass(nextRowClass)
				:tag('th'):wikitext(tipComp):done():tag('td')
			if args['stil_componenta'] == 'para' then
				pTableRow:wikitext(args['componenta'])
				if table.maxn(ip) > 0 and not isNilOrEmpty(args['componenta']) then pTableRow:wikitext('&#58;&nbsp;') end
				pTableRow:wikitext(table.concat(ip, ', '))
			elseif table.maxn(ip) > 0 then
				local displayStyle = ''
				if args['stil_componenta'] == 'coll' or (args['stil_componenta'] ~= 'list' and table.maxn(ip) > 6) then displayStyle = 'none' else displayStyle = 'on' end
				pTableRow:wikitext(collapsibleList.display(nil, 'border:none;padding:0;', nil, args['componenta'], 'list_style=text-align:left;display:' .. displayStyle, ip))
			else
				pTableRow:wikitext(args['componenta'])
			end
		end
	end
	local lideri = args['lideri']
	if not isNilOrEmpty(args['tip_guvernare']) or table.maxn(lideri) > 0 then
		root:tag('tr'):tag('td'):attr('colspan', '2'):tag('hr')
		local governmentHeadTd = root:tag('tr'):addClass('mergedtoprow'):tag('td'):attr('colspan', '2'):wikitext("'''Guvernare''' ")
		if not isNilOrEmpty(args['guvernare_note_subsol']) then
			governmentHeadTd:wikitext(args['guvernare_note_subsol'])
		end
		if not isNilOrEmpty(args['tip_guvernare']) then
			root:tag('tr'):addClass('mergedrow')
				:tag('th'):wikitext('&nbsp;-&nbsp;Tip'):done()
				:tag('td'):wikitext(args['tip_guvernare'])
		end
		for liderIndex = 1,table.maxn(lideri) do
			if lideri[liderIndex] ~= nil then
				local leaderTd = root:tag('tr'):addClass('mergedrow')
					:tag('th'):wikitext('&nbsp;-&nbsp;', mw.text.trim(lideri[liderIndex]['titlu'] or '')):done()
					:tag('td')
				if not isNilOrEmpty(lideri[liderIndex]['nume']) then
					if not isNilOrEmpty(lideri[liderIndex]['link']) then
						leaderTd:wikitext('[[', lideri[liderIndex]['link'], '|', lideri[liderIndex]['nume'], ']]')
					else 
						leaderTd:wikitext(lideri[liderIndex]['nume'])
					end
				end
				local leaderDataInBrackets = {}
				if not isNilOrEmpty(lideri[liderIndex]['partid']) then
					local tara = args['subdiviziuni'][1] and args['subdiviziuni'][1]['nume'] or ''
					table.insert(leaderDataInBrackets, mw.getCurrentFrame():expandTemplate{title='Polparty', args={tara, lideri[liderIndex]['partid'] } })
				end
				if not isNilOrEmpty(lideri[liderIndex]['ales']) then
					table.insert(leaderDataInBrackets, lideri[liderIndex]['ales'])
				end
				if #leaderDataInBrackets > 0 then leaderTd:wikitext(' (', table.concat(leaderDataInBrackets, ', '), ')') end
			end
		end
	end
	
	local suprIndex, suprV = next(args['suprafata'], nil)
	if suprIndex or not isNilOrEmpty(args['altitudine']) then
		root:tag('tr'):tag('td'):attr('colspan', '2'):tag('hr')
		if suprIndex then
			root:tag('tr'):addClass('mergedtoprow')
				:tag('td'):attr('colspan', '2'):wikitext("'''[[Suprafață]]'''", args['note_subsol_suprafata'])
			if args['suprafata']['totala'] then
				local suprafTotalTh = root:tag('tr'):addClass('mergedrow'):tag('th'):wikitext(' &nbsp;-&nbsp;')
				if not isNilOrEmpty(args['tip_total']) then suprafTotalTh:wikitext(args['tip_total'])
				elseif args['suprafata']['metropolitana'] or args['suprafata']['urbana'] then
					if isNilOrEmpty(args['tip_asezare']) then suprafTotalTh:wikitext(args['tip_asezare']) else suprafTotalTh:wikitext('Oraș') end
				else suprafTotalTh:wikitext('Total') end
				suprafTotalTh:done():tag('td'):wikitext(args['suprafata']['totala']['km2'], '&nbsp;[[km²]]')
			end
			if args['suprafata']['pamant'] then
				root:tag('tr'):addClass('mergedrow')
					:tag('th'):wikitext('&nbsp;-&nbsp;Pământ'):done()
					:tag('td'):wikitext(args['suprafata']['pamant']['km2'], '&nbsp;[[km²]]')
			end
			if args['suprafata']['apa'] then
				local waterAreaTd = root:tag('tr'):addClass('mergedrow')
					:tag('th'):wikitext('&nbsp;-&nbsp;Apă'):done()
					:tag('td'):wikitext(args['suprafata']['apa']['km2'], '&nbsp;[[km²]]')
				if args['suprafata']['apa']['procent'] then
					waterAreaTd:wikitext(' &nbsp;', args['suprafata']['apa']['procent'], '%')
				end
			end
			if args['suprafata']['urbana'] then
				root:tag('tr'):addClass('mergedrow')
					:tag('th'):wikitext('&nbsp;-&nbsp;[[Arie urbană|Urbană]]'):done()
					:tag('td'):wikitext(args['suprafata']['urbana']['km2'], '&nbsp;[[km²]]')
			end
			if args['suprafata']['metropolitana'] then
				root:tag('tr'):addClass('mergedrow')
					:tag('th'):wikitext('&nbsp;-&nbsp;[[Zonă metropolitană|Metropolitană]]'):done()
					:tag('td'):wikitext(args['suprafata']['metropolitana']['km2'], '&nbsp;[[km²]]')
			end
			for blankIndex = 1, table.maxn(args['suprafata']['blank'] or {}) do
				local crtBlank = args['suprafata']['blank'][blankIndex]
				if crtBlank and crtBlank['title'] and crtBlank['km2'] then
					root:tag('tr'):addClass('mergedrow')
						:tag('th'):wikitext('&nbsp;-&nbsp;', crtBlank['title']):done()
						:tag('td'):wikitext(crtBlank['km2'], '&nbsp;[[km²]]')
				end
			end
		end
		if not isNilOrEmpty(args['altitudine']) then
			root:tag('tr'):addClass('mergedtoprow')
				:tag('td'):wikitext("'''[[Altitudine]]'''", args['note_subsol_altitudine']):done()
				:tag('td'):wikitext(args['altitudine'], '&nbsp;[[Nivelul mării|m.d.m.]]')
		end
		if not isNilOrEmpty(args['altitudine_max_m']) then
			root:tag('tr'):addClass('mergedtoprow')
				:tag('td'):wikitext("[[Altitudine]]&nbsp;maximă"):done()
				:tag('td'):wikitext(args['altitudine_max_m'], '&nbsp;[[Nivelul mării|m.d.m.]]')
		end
		if not isNilOrEmpty(args['altitudine_min_m']) then
			root:tag('tr'):addClass('mergedbottomrow')
				:tag('td'):wikitext("Altitudine&nbsp;minimă"):done()
				:tag('td'):wikitext(args['altitudine_min_m'], '&nbsp;[[Nivelul mării|m.d.m.]]')
		end
	end
	if not isNilOrEmpty(args['populatie']) or not isNilOrEmpty(args['populatie_urbana']) or not isNilOrEmpty(args['populatie_metropolitana']) or next(args['population_blank'], nil) then
		root:tag('tr'):tag('td'):attr('colspan', '2'):tag('hr')
		local popTitleTd = root:tag('tr'):addClass('mergedtoprow'):tag('td')
		if args['tip_total'] ~= '&nbsp;' then popTitleTd:attr('colspan', '2') end
		popTitleTd:wikitext("'''Populație''' ")
		if args['recensamant'] then popTitleTd:wikitext('(', args['recensamant'], ')') end
		popTitleTd:wikitext(args['note_subsol_populatie'])
		local popTextTd
		if args['tip_total'] ~= '&nbsp;' then
			local totalheader = root:tag('tr'):addClass('mergedrow')
				:tag('th'):wikitext('&nbsp;-&nbsp;')
			if not isNilOrEmpty(args['tip_total']) then totalheader:wikitext(args['tip_total'])
			elseif not isNilOrEmpty(args['populatie_metropolitana']) or not isNilOrEmpty(args['populatie_urbana']) then
				if not isNilOrEmpty(args['tip_asezare']) then totalheader:wikitext(args['tip_asezare'])
					else totalheader:wikitext('Oraș')
				end
			else totalheader:wikitext('Total')
			end
			popTextTd = totalheader:done():tag('td')
		else 
			popTextTd = popTitleTd:done():tag('td')
		end
		popTextTd:wikitext(mw.getCurrentFrame():callParserFunction{name='formatnum', args = { args['populatie'] } }, ' locuitori')
		if not isNilOrEmpty(args['densitate']) then
			root:tag('tr'):addClass('mergedrow')
				:tag('th'):wikitext('&nbsp;-&nbsp;[[Densitatea populației|Densitate]]'):done()
				:tag('td'):wikitext(mw.getCurrentFrame():expandTemplate{title = 'dim', args={args['densitate'], 'loc./km²'} })
		end
		if args['populatie_urbana'] then 
			root:tag('tr'):addClass('mergedrow')
				:tag('th'):wikitext('&nbsp;- [[Zonă urbană|Urbană]]'):done()
				:tag('td'):wikitext(mw.getCurrentFrame():callParserFunction{name='formatnum', args = { args['populatie_urbana'] } })
		end
		if args['densitate_pop_urbana'] then 
			root:tag('tr'):addClass('mergedrow')
				:tag('th'):wikitext('&nbsp;- Densitate urbană'):done()
				:tag('td'):wikitext(mw.getCurrentFrame():callParserFunction{name='formatnum', args = { args['densitate_pop_urbana'] } })
		end
		if args['populatie_metropolitana'] then 
			root:tag('tr'):addClass('mergedrow')
				:tag('th'):wikitext('&nbsp;- [[Zonă metropolitană|Metropolitană]]'):done()
				:tag('td'):wikitext(mw.getCurrentFrame():callParserFunction{name='formatnum', args = { args['populatie_metropolitana']} })
		end
		if args['densitate_pop_metro'] then 
			root:tag('tr'):addClass('mergedrow')
				:tag('th'):wikitext('&nbsp;- Densitate metropolitană'):done()
				:tag('td'):wikitext(mw.getCurrentFrame():callParserFunction{name='formatnum', args = { args['densitate_pop_metro'] } })
		end
		for popIdx=1,table.maxn(args['population_blank']) do
			if args['population_blank'][popIdx] then
				if args['population_blank'][popIdx]['value'] then
					root:tag('tr'):addClass('mergedrow')
						:tag('th'):wikitext('&nbsp;- ', args['population_blank'][popIdx]['title']):done()
						:tag('td'):wikitext(mw.getCurrentFrame():callParserFunction{name='formatnum', args = { args['population_blank'][popIdx]['value']} })
				end
				if args['population_blank'][popIdx]['densitate'] then
					root:tag('tr'):addClass('mergedrow')
						:tag('th'):wikitext('&nbsp;- ', 'Densitate ', args['population_blank'][popIdx]['title']):done()
						:tag('td'):wikitext(mw.getCurrentFrame():callParserFunction{name='formatnum', args = { args['population_blank'][popIdx]['densitate']} })
				end
			end
		end
		if args['populatie_note'] then
			root:tag('tr'):addClass('mergedbottomrow')
				:tag('td'):wikitext('&nbsp;'):done()
				:tag('td'):tag('small'):wikitext(args['populatie_note'])
		end
	end
	
	if not isNilOrEmpty(args['fus_orar']) or not isNilOrEmpty(args['cod_postal']) or not isNilOrEmpty(args['prefix_tel']) or not isNilOrEmpty(args['cod']) then
		root:tag('tr'):tag('td'):attr('colspan', '2'):tag('hr')
		if not isNilOrEmpty(args['fus_orar']) then
			root:tag('tr'):addClass('mergedtoprow')
				:tag('th'):wikitext('[[Fus orar]]'):done()
				:tag('td'):wikitext(args['fus_orar'], (not isNilOrEmpty(args['utc_offset']) and ('&nbsp;(' .. args['utc_offset'] .. ')') or ''))
			if not isNilOrEmpty(args['fus_orar_DST']) then
				root:tag('tr'):addClass('mergedtoprow')
					:tag('th'):css('white-space', 'nowrap'):wikitext('&nbsp;-&nbsp;Ora de vară&nbsp;([[Ora de vară|DST]])'):done()
					:tag('td'):wikitext(args['fus_orar_DST'], (not isNilOrEmpty(args['utc_offset_DST']) and ('&nbsp;(' .. args['utc_offset_DST'] .. ')') or ''))
			end
		end
		if not isNilOrEmpty(args['cod_postal']) then
			root:tag('tr'):addClass('mergedtoprow')
				:tag('th'):wikitext(args['tip_cod_postal']):done()
				:tag('td'):addClass('adr'):tag('span'):addClass('postal-code'):wikitext(args['cod_postal'])
		end
		local postCodeTrClass = 'mergedrow'
		for postCodeIdx=1,table.maxn(args['postal_codes']) do
			if args['postal_codes'][postCodeIdx] and args['postal_codes'][postCodeIdx]['code_type'] and args['postal_codes'][postCodeIdx]['code'] then
				if postCodeIdx == table.maxn(args['postal_codes']) then postCodeTrClass = 'mergedbottomrow' end
				root:tag('tr'):addClass(postCodeTrClass)
					:tag('th'):wikitext(args['postal_codes'][postCodeIdx]['code_type']):done()
					:tag('td'):addClass('adr'):tag('span'):addClass('postal-code'):wikitext(args['postal_codes'][postCodeIdx]['code_type'])
			end
		end
		if not isNilOrEmpty(args['prefix_tel']) then
			root:tag('tr'):addClass('mergedbottomrow')
				:tag('th'):wikitext('Prefix telefonic'):done()
				:tag('td'):wikitext(args['prefix_tel'])
		end
		if not isNilOrEmpty(args['cod']) then
			root:tag('tr'):addClass('mergedtoprow')
				:tag('th'):wikitext(args['tip_cod']):done()
				:tag('td'):addClass('adr'):tag('span'):addClass('postal-code'):wikitext(args['cod'])
		end
	end
	if next(args['infratiri'], nil) then
		root:tag('tr'):tag('td'):attr('colspan', '2'):tag('hr')
		local first = true
		for infrIdx = 1, table.maxn(args['infratiri']) do
			if args['infratiri'][infrIdx] then
				if first then 
					root:tag('tr'):addClass('mergedtoprow')
						:tag('td'):attr('colspan', '2'):wikitext("'''Localități înfrățite'''")
					first = false
				end
				root:tag('tr'):addClass('mergedrow')
					:tag('td'):wikitext('&nbsp;-&nbsp;', args['infratiri'][infrIdx]['oras']):done()
					:tag('td'):wikitext(args['infratiri'][infrIdx]['tara'] or '')
			end
		end
	end
	local trClass = 'mergedtoprow'
	for campGolIdx = 1, table.maxn(args['campuri_goale']) do
		if args['campuri_goale'][campGolIdx] and args['campuri_goale'][campGolIdx]['gol_nume'] then
			root:tag('tr'):addClass(trClass)
				:tag('th'):wikitext(args['campuri_goale'][campGolIdx]['gol_nume']):done()
				:tag('td'):wikitext(args['campuri_goale'][campGolIdx]['gol_info'])
			trClass = 'mergedrow'
		end
	end
	if args['note'] then
		root:tag('tr'):addClass('mergedtoprow')
			:tag('td'):attr('colspan', '2'):attr('align', 'left')
				:tag('small'):wikitext(args['note'])
	end
	if not isNilOrEmpty(args['website']) then
		root:tag('tr'):tag('td'):attr('colspan', '2'):tag('hr')
		root:tag('tr'):tag('td'):attr('colspan', '2'):addClass('mergedtoprow'):css('text-align', 'center'):wikitext("'''Site web:''' ", args['website'])
	end
	if args['harti'][1] then
		root:tag('tr'):tag('td'):attr('colspan', '2'):tag('hr')
		for mapIdx = 1, table.maxn(args['harti']) do
			if args['harti'][mapIdx] then
				root:tag('tr'):addClass('mergedrow')
					:tag('td'):attr('colspan', '2'):css('text-align', 'center'):css('padding', '0.7em 0.8em 0.7em 0.8em'):css('align', 'center'):css('margin', '0 auto')
						:wikitext('[[Fișier:' .. args['harti'][mapIdx]['harta'] .. '|' .. args['harti'][mapIdx]['size'] .. '|none|' .. (args['harti'][mapIdx]['descriere'] or ('Hartă de poziționare pentru ' .. args['nume'])) .. ']]', args['harti'][mapIdx]['descriere'])
			end
		end
	end
	root:wikitext(mw.getCurrentFrame():expandTemplate{title='infodoc', args = {colspan='2', culoare='dddddd', link = args['infodoc']}})

	return tostring(root)
end

p.infobox = function(frame)
	origArgs = getArgs(frame, { wrappers = { 'Format:Infocaseta Așezare' } })
	
	args['nume'] = origArgs['nume'] or origArgs['nume_oficial'] or wikidata.findLabel(nil, nil) or mw.title.getCurrentTitle().text
	args['nume_oficial'] = origArgs['nume_oficial']

	args['nume_nativ'] = origArgs['nume_nativ']
	args['alt_nume'] = origArgs['alt_nume']
	args['tip_asezare'] = origArgs['tip_asezare'] or origArgs['tip_așezare']
	args['tip_asezare_genitiv'] = origArgs['tip_asezare_genitiv'] or origArgs['tip_așezare_genitiv'] or 'localității'

	args['nume_limba'] = {}
	args['pushpin'] = {}
	args['subdiviziuni'] = {}
	args['clasificari'] = {}
	args['atestari'] = {}
	args['p'] = {}
	args['lideri'] = {}
	args['suprafata'] = {}
	args['population_blank'] = {}
	args['postal_codes'] = {}
	args['infratiri'] = {}
	args['campuri_goale'] = {}
	args['harti'] = {}

	local nlStart, nlEnd
	for argN, argV in pairs(origArgs) do
		if argV ~= nil and mw.text.trim(argV) == '' then origArgs[argN] = nil end
		argV = mw.text.trim(argV)
		origArgs[argN] = mw.text.trim(argV)
		nlStart, nlEnd = mw.ustring.find(argN, 'nume_limba')
		if nlStart == 1 then
			local nlIndex = tonumber(mw.ustring.sub(argN, 1 + nlEnd, mw.ustring.len(argN)))
			if nlIndex ~= nil then
				if args['nume_limba'][nlIndex] == nil then
					args['nume_limba'][nlIndex] = {}
				end
				args['nume_limba'][nlIndex]['nume_limba'] = mw.text.trim(argV)
			end
		end
		nlStart, nlEnd = mw.ustring.find(argN, 'pushpin_map')
		if nlStart == 1 then
			local varNameWithIndex = mw.ustring.sub(argN, 1 + nlEnd, mw.ustring.len(argN))
			local indexLocation = mw.ustring.find(varNameWithIndex, "%d+") or (1 + #varNameWithIndex)
			local variableName = mw.ustring.sub(varNameWithIndex, 1, indexLocation - 1)
			local variableIndexStr = mw.ustring.sub(varNameWithIndex, indexLocation, #varNameWithIndex) or ""
			local variableIndex
			if variableIndexStr == "" then variableIndex = 1 else variableIndex = 1 + tonumber(variableIndexStr) end
			if args['pushpin'][variableIndex] == nil then args['pushpin'][variableIndex] = {} end
			args['pushpin'][variableIndex]['map'] = mw.text.trim(argV)
			args['pushpin'][variableIndex]['size'] = mw.text.trim(origArgs['pushpin_dimensiune_harta' .. variableIndexStr] or origArgs['pushpin_dimensiune_hartă' .. variableIndexStr] or '290')
			args['pushpin'][variableIndex]['caption'] = mw.text.trim(origArgs['pushpin_descriere_harta' .. variableIndexStr] or origArgs['pushpin_descriere_hartă' .. variableIndexStr] or 'Poziția geografică')
			args['pushpin'][variableIndex]['label_position'] = mw.text.trim(origArgs['pushpin_label_position' .. variableIndexStr] or 'right')
		end
		nlStart, nlEnd = mw.ustring.find(argN, 'tip_subdiviziune')
		if nlStart == 1 then
			local varNameWithIndex = mw.ustring.sub(argN, 1 + nlEnd, mw.ustring.len(argN))
			local indexLocation = mw.ustring.find(varNameWithIndex, "%d+") or (1 + #varNameWithIndex)
			local variableName = mw.ustring.sub(varNameWithIndex, 1, indexLocation - 1)
			local variableIndexStr = mw.ustring.sub(varNameWithIndex, indexLocation, #varNameWithIndex) or ""
			local variableIndex
			if variableIndexStr == "" then variableIndex = 1 else variableIndex = 1 + tonumber(variableIndexStr) end
			if args['subdiviziuni'][variableIndex] == nil then args['subdiviziuni'][variableIndex] = {} end
			args['subdiviziuni'][variableIndex]['tip'] = mw.text.trim(argV)
			args['subdiviziuni'][variableIndex]['nume'] = mw.text.trim(origArgs['nume_subdiviziune' .. variableIndexStr] or '')
		end
		nlStart, nlEnd = mw.ustring.find(argN, 'tip_cod_clasificare')
		if nlStart == 1 then
			local varNameWithIndex = mw.ustring.sub(argN, 1 + nlEnd, mw.ustring.len(argN))
			local indexLocation = mw.ustring.find(varNameWithIndex, "%d+") or (1 + #varNameWithIndex)
			local variableName = mw.ustring.sub(varNameWithIndex, 1, indexLocation - 1)
			local variableIndexStr = mw.ustring.sub(varNameWithIndex, indexLocation, #varNameWithIndex) or ""
			local variableIndex
			if varNameWithIndex == "" then variableIndex = 1
			elseif varNameWithIndex == "_superioară" then variableIndex = 2 else variableIndex = 2 + tonumber(variableIndexStr) end
			if args['clasificari'][variableIndex] == nil then args['clasificari'][variableIndex] = {} end
			args['clasificari'][variableIndex]['tip'] = mw.text.trim(argV)
			args['clasificari'][variableIndex]['cod'] = mw.text.trim(origArgs['cod_clasificare' .. variableIndexStr] or '')
		end
		nlStart, nlEnd = mw.ustring.find(argN, 'atestare')
		if nlStart == 1 then
			local varNameWithIndex = mw.ustring.sub(argN, 1 + nlEnd, mw.ustring.len(argN))
			local indexLocation = mw.ustring.find(varNameWithIndex, "%d+") or (1 + #varNameWithIndex)
			local variableName = mw.ustring.sub(varNameWithIndex, 1, indexLocation - 1)
			local variableIndexStr = mw.ustring.sub(varNameWithIndex, indexLocation, #varNameWithIndex) or ""
			local variableIndex
			if variableIndexStr == "" then variableIndex = 1 else variableIndex = 1 + tonumber(variableIndexStr) end
			if args['atestari'][variableIndex] == nil then args['atestari'][variableIndex] = {} end
			args['atestari'][variableIndex]['an'] = mw.text.trim(argV)
			args['atestari'][variableIndex]['titlu'] = mw.text.trim(origArgs['titlu_atestare' .. variableIndexStr] or 'Atestare')
		end
		nlStart, nlEnd = mw.ustring.find(argN, 'p')
		if nlStart == 1 then
			local pIndex = mw.ustring.find(argN, "%d+$")
			if pIndex == 2 then
				local variableIndexStr = mw.ustring.sub(argN, 2, #argN)
				local variableIndex = tonumber(variableIndexStr)
				if mw.text.trim(argV) ~= '' then
					args['p'][variableIndex] = mw.text.trim(argV)
				end
			end
		end
		nlStart, nlEnd = mw.ustring.find(argN, 'lider_')
		if nlStart == 1 then
			local varNameWithIndex = mw.ustring.sub(argN, 1 + nlEnd, mw.ustring.len(argN))
			local indexLocation = mw.ustring.find(varNameWithIndex, "%d+") or (1 + #varNameWithIndex)
			local variableName = mw.ustring.sub(varNameWithIndex, 1, indexLocation - 1)
			local variableIndexStr = mw.ustring.sub(varNameWithIndex, indexLocation, #varNameWithIndex) or ""
			local variableIndex
			if variableIndexStr == "" then variableIndex = 1 else variableIndex = 1 + tonumber(variableIndexStr) end
			if args['lideri'][variableIndex] == nil then args['lideri'][variableIndex] = {} end
			args['lideri'][variableIndex][variableName] = mw.text.trim(argV)
		end
		nlStart, nlEnd = mw.ustring.find(argN, 'area_blank')
		if nlStart == 1 then
			if args['suprafata']['blank'] == nil then args['suprafata']['blank'] = {} end
			local varNameWithIndex = mw.ustring.sub(argN, 1 + nlEnd, mw.ustring.len(argN))
			local varNameLocation = mw.ustring.find(varNameWithIndex, "[^%d]") or (1 + #varNameWithIndex)
			local variableIndexStr = mw.ustring.sub(varNameWithIndex, 1, varNameLocation - 1)
			local variableName = mw.ustring.sub(varNameWithIndex, mw.ustring.find(varNameWithIndex, '%a[%w_]+') or (1 + #varNameWithIndex), #varNameWithIndex)
			local variableIndex = tonumber(variableIndexStr)
			if args['suprafata']['blank'][variableIndex] == nil then args['suprafata']['blank'][variableIndex] = {} end
			args['suprafata']['blank'][variableIndex][variableName] = mw.text.trim(argV)
		end
		nlStart, nlEnd = mw.ustring.find(argN, 'population_blank')
		if nlStart == 1 then
			local varNameWithIndex = mw.ustring.sub(argN, 1 + nlEnd, mw.ustring.len(argN))
			local varNameLocation = mw.ustring.find(varNameWithIndex, "[^%d]") or (1 + #varNameWithIndex)
			local variableIndexStr = mw.ustring.sub(varNameWithIndex, 1, varNameLocation - 1)
			local variableName = mw.ustring.sub(varNameWithIndex, mw.ustring.find(varNameWithIndex, "%a[%w_]+") or (1 + #varNameWithIndex), #varNameWithIndex)
			local variableIndex = tonumber(variableIndexStr)
			if args['population_blank'][variableIndex] == nil then args['population_blank'][variableIndex] = {} end
			if isNilOrEmpty(variableName) then
				args['population_blank'][variableIndex]['value'] = mw.text.trim(argV)
			else
				args['population_blank'][variableIndex][variableName] = mw.text.trim(argV)
			end
		end
		nlStart, nlEnd = mw.ustring.find(argN, 'densitate_populație_blank')
		if nlStart == 1 then
			local varNameWithIndex = mw.ustring.sub(argN, 1 + nlEnd, mw.ustring.len(argN))
			local varNameLocation = mw.ustring.find(varNameWithIndex, "[^%d]") or (1 + #varNameWithIndex)
			local variableIndexStr = mw.ustring.sub(varNameWithIndex, 1, varNameLocation - 1)
			local variablePostIndexStr = mw.ustring.find(varNameWithIndex, "%a[%w_]+") or (1 + #varNameWithIndex)
			local variableName = mw.ustring.sub(varNameWithIndex, variablePostIndexStr, #varNameWithIndex)
			local variableIndex = tonumber(variableIndexStr)
			if args['population_blank'][variableIndex] == nil then args['population_blank'][variableIndex] = {} end
			if isNilOrEmpty(variableName) or variableName == 'km2' then
				args['population_blank'][variableIndex]['densitate'] = mw.text.trim(argV)
			else
				if variableName == 'sqmi' or variableName == 'sq_mi' then args['population_blank'][variableIndex]['densitate'] = tostring(round(tonumber(argV) / 2.58998811)) end
			end
		end
		nlStart, nlEnd = mw.ustring.find(argN, 'postal')
		if nlStart == 1 then
			local varNameWithIndex = mw.ustring.sub(argN, 1 + nlEnd, mw.ustring.len(argN))
			local varNameLocation = mw.ustring.find(varNameWithIndex, "[^%d]") or (1 + #varNameWithIndex)
			local variableIndexStr = mw.ustring.sub(varNameWithIndex, 1, varNameLocation - 1)
			local variableName = mw.ustring.sub(varNameWithIndex, mw.ustring.find(varNameWithIndex, "%a[%w_]+") or (1 + #varNameWithIndex), #varNameWithIndex)
			if not isNilOrEmpty(variableIndexStr) then
				local variableIndex = tonumber(variableIndexStr)
				if args['postal_codes'][variableIndex] == nil then args['postal_codes'][variableIndex] = {} end
				args['postal_codes'][variableName] = mw.text.trim(argV)
			end
		end
		nlStart, nlEnd = mw.ustring.find(argN, 'infratit')
		if nlStart == 1 then
			local varNameWithIndex = mw.ustring.sub(argN, 1 + nlEnd, mw.ustring.len(argN))
			local varNameLocation = mw.ustring.find(varNameWithIndex, "[^%d]") or (1 + #varNameWithIndex)
			local variableIndexStr = mw.ustring.sub(varNameWithIndex, 1, varNameLocation - 1)
			local varNamePostIndex = mw.ustring.find(varNameWithIndex, "%a[%w_]+") or (1 + #varNameWithIndex)
			local variableName = mw.ustring.sub(varNameWithIndex, varNamePostIndex, #varNameWithIndex)
			local variableIndex = tonumber(variableIndexStr)

			if args['infratiri'][variableIndex] == nil then args['infratiri'][variableIndex] = {} end
			if isNilOrEmpty(variableName) then
				args['infratiri'][variableIndex]['oras'] = mw.text.trim(argV)
			else
				args['infratiri'][variableIndex][variableName] = mw.text.trim(argV)
			end
		end
		nlStart, nlEnd = mw.ustring.find(argN, 'camp')
		if nlStart == 1 then
			local varNameWithIndex = mw.ustring.sub(argN, 1 + nlEnd, mw.ustring.len(argN))
			local varNameLocation = mw.ustring.find(varNameWithIndex, "[^%d]") or (1 + #varNameWithIndex)
			local variableIndexStr = mw.ustring.sub(varNameWithIndex, 1, varNameLocation - 1)
			if isNilOrEmpty(variableIndexStr) then variableIndexStr = 1 end
			local variableName = mw.ustring.sub(varNameWithIndex, mw.ustring.find(varNameWithIndex, '%a[%w_]+') or (1 + #varNameWithIndex), #varNameWithIndex)
			local variableIndex = 1 + tonumber(variableIndexStr)
			if args['campuri_goale'][variableIndex] == nil then args['campuri_goale'][variableIndex] = {} end
			args['campuri_goale'][variableIndex][variableName] = mw.text.trim(argV)
		end
		nlStart, nlEnd = mw.ustring.find(argN, 'hartă%d*')
		if nlStart == 1 then
			local variableIndex, variableIndexStr
			if argN == 'hartă' then
				variableIndex = 1
				variableIndexStr = ''
			else
				local indexLocation = mw.ustring.find(argN, "%d+")
				variableIndexStr = mw.ustring.sub(argN, indexLocation, mw.ustring.len(argN))
				if tonumber(variableIndexStr) ~= nil then
					variableIndex = 1 + tonumber(variableIndexStr)
				else
					variableIndex = -1
				end	
			end
			if variableIndex > 0 then
				if args['harti'][variableIndex] == nil then args['harti'][variableIndex] = {} end
				args['harti'][variableIndex]['harta'] = argV
				args['harti'][variableIndex]['descriere'] = origArgs['descriere_hartă' .. variableIndexStr]
				args['harti'][variableIndex]['size'] = origArgs['dimensiune_hartă' .. variableIndexStr] or '290x290px'
			end
		end
	end
	
	if not isNilOrEmpty(origArgs['an']) then
		if args['atestari'][1] == nil then args['atestari'][1] = {} end
		args['atestari'][1]['an'] = origArgs['an']
		args['atestari'][1]['titlu'] = origArgs['titlu_atestare'] or 'Atestare'
	end
	if args['lideri'][1] == nil or isNilOrEmpty(args['lideri'][1]['nume']) then
		local wikidataMayorName = wikidata.findOneValue('P6')
		if not isNilOrEmpty(wikidataMayorName) then
			if args['lideri'][1] == nil then args['lideri'][1] = {} end
			args['lideri'][1]['nume'] = wikidataMayorName
			args['lideri'][1]['ales'] = wikidata.findLatestQualifierDateValueForOneProperty('P6', 'P580')
		end
	end
	if args['lideri'][1] ~= nil and isNilOrEmpty(args['lideri'][1]['titlu']) then 
		local wikidataMayorTitle = wikidata.findOneValue('P1313')
		if not isNilOrEmpty(wikidataMayorTitle) then
			args['lideri'][1]['titlu'] = wikidataMayorTitle
		else
			args['lideri'][1]['titlu'] = 'Primar' 
		end
	end
	for i = 1,table.maxn(args['nume_limba']) do
		if args['nume_limba'][i] then
			for argN, argV in pairs(origArgs) do
				nlStart, nlEnd = mw.ustring.find(argN, 'nume_limba' .. tostring(i) .. "_")
				if nlStart == 1 then
					local varNameWithIndex = mw.ustring.sub(argN, 1 + nlEnd, mw.ustring.len(argN))
					local indexLocation = mw.ustring.find(varNameWithIndex, "%d+") or (1 + #varNameWithIndex)
					local variableName = mw.ustring.sub(varNameWithIndex, 1, indexLocation - 1)
					local variableIndexStr = mw.ustring.sub(varNameWithIndex, indexLocation, #varNameWithIndex)
					local variableIndex
					if variableIndexStr == nil or variableIndexStr == "" then variableIndex = 1 else variableIndex = 1 + tonumber(variableIndexStr) end
					if args['nume_limba'][i][variableName] == nil then args['nume_limba'][i][variableName] = {} end
					args['nume_limba'][i][variableName][variableIndex] = mw.text.trim(argV)
				end
			end
		end
	end
	if table.maxn(args['infratiri']) == 0 then
		local infratiri = wikidata.getEntityIdsList(nil, 'P190')
		if infratiri then
			for infrIdx = 1,#infratiri do
				args['infratiri'][infrIdx] = {}
				args['infratiri'][infrIdx]['oras'] = wikidata.findLinkToItem(infratiri[infrIdx])
				local cityEntity = mw.wikibase.getEntity('Q' .. infratiri[infrIdx])
				if cityEntity then
					local countryLink = wikidata.findOneValueNoRef('P17', cityEntity)
					if not isNilOrEmpty(countryLink) then
						args['infratiri'][infrIdx]['tara'] = countryLink
					end
				end
			end
		end
	end
	if table.maxn(args['pushpin']) == 0 then
		local entity = mw.wikibase.getEntityObject()
		
		if entity and entity.claims and entity.claims['P17'] then
			local defaultPushpin = {}
			defaultPushpin.map = entity:formatPropertyValues('P17', mw.wikibase.entity.claimRanks).value
			defaultPushpin.size = 290
			defaultPushpin.caption = 'Poziția geografică'
			defaultPushpin.label_position = args['pushpin_label_position'] or 'left'
			table.insert(args['pushpin'], defaultPushpin)
		end
	end
	args['imagine'] = origArgs['imagine'] or wikidata.findOneValueNoRef('P18', nil)
	args['imagine_descriere'] = origArgs['imagine_descriere'] or (args['nume'])
	if not isNilOrEmpty(origArgs['imagine_dimensiune']) then
		args['imagine_dimensiune'] = origArgs['imagine_dimensiune']
	else
		args['imagine_dimensiune'] = "290x290px"
	end

	args['drapel'] = origArgs['drapel'] or origArgs['steag'] or origArgs['steag_imagine'] or wikidata.findOneValueNoRef('P41', nil)
	args['image_seal'] = origArgs['image_seal'] or wikidata.findOneValueNoRef('P158', nil)
	args['emblemă_imagine'] = origArgs['emblemă_imagine'] or origArgs['emblema_imagine']
	args['stemă'] = origArgs['stemă'] or origArgs['stema'] or wikidata.findOneValueNoRef('P94', nil)
	args['drapel_dimensiune'] = origArgs['drapel_dimensiune'] or origArgs['steag_dimensiune'] or '100px'
	args['link_drapel'] = origArgs['link_drapel'] or origArgs['steag_link'] or returnIfPageExists('Drapelul orașului ' .. mw.title.getCurrentTitle().text) or wikidata.findOneValueNoRef('P162', nil)
	args['seal_size'] = origArgs['seal_size'] or '100px'
	args['seal_link'] = origArgs['seal_link'] or returnIfPageExists('Sigiliul orașului ' .. mw.title.getCurrentTitle().text) or ((not isNilOrEmpty(args['nume_oficial']) and returnIfPageExists('Sigiliul orașului ' .. args['nume_oficial']) or ''))
	args['link_stemă'] = origArgs['link_stemă'] or origArgs['stemă_link'] or returnIfPageExists('Stema ' .. mw.title.getCurrentTitle().text) or ((not isNilOrEmpty(args['nume_oficial']) and returnIfPageExists('Stema ' .. args['nume_oficial']) or ''))
	args['stemă_dimensiune'] = origArgs['stemă_dimensiune'] or '100px'
	args['emblemă_link'] = origArgs['emblemă_link'] or origArgs['emblema_link'] or returnIfPageExists('Logo-ul ' .. mw.title.getCurrentTitle().text) or ((not isNilOrEmpty(args['nume_oficial']) and returnIfPageExists('Logo-ul ' .. args['nume_oficial']) or ''))
	args['emblemă_dimensiune'] = origArgs['emblemă_dimensiune'] or origArgs['emblema_dimensiune'] or '100px'
	args['emblemă_tip'] = origArgs['emblemă_tip'] or origArgs['emblema_tip'] or 'Logo'
	
	args['poreclă'] = origArgs['porecla'] or origArgs['poreclă'] or ""
	args['motto'] = origArgs['motto'] or ""
	if not isNilOrEmpty(origArgs['hartă_punct_imagine']) then
		args['hartă_punct'] = {}
		args['hartă_punct'].imagine = origArgs['hartă_punct_imagine']
		args['hartă_punct'].dimensiune = origArgs['hartă_punct_dimensiune'] or '180px'
		args['hartă_punct'].descriere = origArgs['hartă_punct_descriere'] or ''
		args['hartă_punct'].x = origArgs['dot_x'] or ''
		args['hartă_punct'].y = origArgs['dot_y'] or ''
	end
	args['latd'] = origArgs['latd'] or origArgs['lat_d'] or ''
	args['latm'] = origArgs['latm'] or origArgs['lat_m'] or ''
	args['lats'] = origArgs['lats'] or origArgs['lat_s'] or ''
	args['latNS'] = origArgs['lat_NS'] or origArgs['latNS']
	args['longd'] = origArgs['longd'] or origArgs['long_d'] or ''
	args['longm'] = origArgs['longm'] or origArgs['long_m'] or ''
	args['longs'] = origArgs['longs'] or origArgs['long_s'] or ''
	args['longEV'] = origArgs['longEV'] or origArgs['long_EV'] or origArgs['longEW'] or origArgs['long_EW']
	if isNilOrEmpty(args['latd']) then
		local wikidataCoords = wikidata.findDataValueObjects(nil, 'P625')
		if wikidataCoords[1] then
			args['latd'] = tostring(math.abs(wikidataCoords[1].latitude))
			if wikidataCoords[1].latitude < 0 then args['latNS'] = 'S' end
			args['longd'] = tostring(math.abs(wikidataCoords[1].longitude))
			if wikidataCoords[1].longitude < 0 then args['longEV'] = 'V' end
		end
	end
	args['background'] = origArgs['background'] or ''
	args['tip_coordonate'] = origArgs['tip_coordonate'] or ''
	args['coordinates_type'] = origArgs['coordinates_type'] or 'type:city'
	args['coordonate'] = origArgs['coordonate'] or ''
	args['fondator'] = origArgs['fondator'] or ''
	args['numit_dupa'] = origArgs['numit_dupa'] or origArgs['numit_după'] or ''
	
	args['resedinta'] = origArgs['reședință'] or origArgs['resedinta'] or origArgs['reședința'] or ''
	args['tip_resedinta'] = origArgs['tip_resedinta'] or origArgs['tip_reședință'] or 'Reședință'
	args['componenta'] = origArgs['componenta'] or ''
	args['tip_componenta'] = mw.text.trim(origArgs['componenta_tip'] or origArgs['tip_componenta'] or origArgs['tip_componență'] or origArgs['componență_tip'] or 'Componență')
	args['stil_componenta'] = mw.text.trim(origArgs['componenta_stil'] or '')
	
	args['tip_guvernare'] = mw.text.trim(origArgs['guvernare_tip'] or origArgs['tip_guvernare'] or '')
	args['guvernare_note_subsol'] = mw.text.trim(origArgs['guvernare_note_subsol'] or '')
	
	local tipuriSuprafata = { 'totală', 'metropolitană', 'urbană', 'apă', 'pământ' }
	local unitatiSuprafata = { 'km2', 'dunam', 'sqmi', 'ha', 'procent' }
	for tipK, tipV in pairs(tipuriSuprafata) do
		for unitK, unitV in pairs(unitatiSuprafata) do
			local argument = 'suprafață_' .. tipV .. '_' .. unitV
			if not isNilOrEmpty(origArgs[argument] or origArgs[removeDiacritics(argument)]) then
				if args['suprafata'][removeDiacritics(tipV)] == nil then args['suprafata'][removeDiacritics(tipV)] = {} end
				local crtArg = origArgs[argument] or origArgs[removeDiacritics(argument)]
				args['suprafata'][removeDiacritics(tipV)][unitV] = crtArg
				if args['suprafata'][removeDiacritics(tipV)]['km2'] == nil then
					if unitV == 'dunam' then args['suprafata'][removeDiacritics(tipV)]['km2'] = tostring(round(.001 * tonumber(crtArg), 2))
					elseif unitV == 'sqmi' then args['suprafata'][removeDiacritics(tipV)]['km2'] = tostring(round(convertSqMiToKm2(tonumber(crtArg)), 2))
					elseif unitV == 'ha' then args['suprafata'][removeDiacritics(tipV)]['km2'] = tostring(round(.01 * tonumber(crtArg), 2)) end
				end
			end
		end
	end
	args['note_subsol_suprafata'] = mw.text.trim(origArgs['note_subsol_suprafata'] or origArgs['suprafata_note_subsol'] or '')
	args['tip_total'] = mw.text.trim(origArgs['tip_total'] or '')
	args['note_subsol_altitudine'] = mw.text.trim(origArgs['note_subsol_altitudine'] or origArgs['altitudine_note_subsol'] or'')
	local unitatiAltitudine = { 'm', 'ft' }
	local tipuriAltitudine = { '', 'max', 'min' }
	for tipK, tipV in pairs(tipuriAltitudine) do
		for unitK, unitV in pairs(unitatiAltitudine) do
			local crtArg = 'altitudine' .. (tipV ~= '' and '_' or '') .. tipV .. '_' .. unitV
			local translatedArg = 'altitudine' .. (tipV ~= '' and '_' or '') .. tipV .. (tipV ~= '' and ('_' .. unitV) or '')
			local translatedArgM = 'altitudine' .. (tipV ~= '' and '_' or '') .. tipV .. (tipV ~= '' and '_m' or '')
			if not isNilOrEmpty(origArgs[crtArg]) or not isNilOrEmpty(origArgs[translatedArg]) then
				args[translatedArg] = mw.text.trim(origArgs[crtArg] or origArgs[translatedArg])
				if unitV == 'ft' and args[translatedArgM] == nil then args[translatedArgM] = tostring(round(convertFtToM(tonumber(mw.text.trim(args[translatedArg]))), 0)) end
			end
		end
	end
	
	args['populatie'] = origArgs['populatie'] or origArgs['populație'] or wikidata.findOneValueNoRef('P1082', nil)
	args['populatie_urbana'] = origArgs['populatie_urbana'] or origArgs['populație_urbană'] or origArgs['populație_urbana']
	args['densitate_pop_urbana'] = origArgs['densitate_populație_urbana_km2']
	args['populatie_metropolitana'] = origArgs['populatie_metropolitana'] or origArgs['populație_metropolitană'] or origArgs['populație_metropolitana']
	args['densitate_pop_metro'] = origArgs['densitate_populație_metro_km2']
	args['recensamant'] = origArgs['recensamant'] or origArgs['recensământ']
	args['note_subsol_populatie'] = origArgs['note_subsol_populatie'] or origArgs['populatie_note_subsol'] or origArgs['populație_note_subsol'] or ''
	args['densitate'] = origArgs['densitate']
	args['populatie_note'] = origArgs['populatie_note'] or origArgs['populație_note']
	
	args['fus_orar'] = origArgs['fus_orar'] or origArgs['timezone'] or wikidata.findOneValue('P421', nil)
	args['utc_offset'] = origArgs['utc_offset']
	args['fus_orar_DST'] = origArgs['fus_orar_DST'] or origArgs['timezone_DST']
	args['utc_offset_DST'] = origArgs['utc_offset_DST']
	args['cod_postal'] = origArgs['codpoștal'] or origArgs['codpostal'] or origArgs['cod_poștal'] or origArgs['cod_postal'] or origArgs['postal_code'] or wikidata.findOneValue('P281', nil)
	args['tip_cod_postal'] = mw.text.trim(origArgs['tip_cod_postal'] or '[[Cod poștal]]')
	args['prefix_tel'] = origArgs['prefix_telefonic'] or origArgs['area_code'] or wikidata.findOneValue('P473', nil)
	args['cod'] = origArgs['cod']
	args['tip_cod'] = mw.text.trim(origArgs['tip_cod'] or '[[Cod]]')
	
	args['note'] = origArgs['note']
	
	args['webaddr'] = origArgs['sit-adresă'] or origArgs['web']
	args['webname'] = origArgs['sit-nume']
	if args['webaddr'] and args['webnume'] then
		args['website'] = '[' .. args['webaddr'] .. ' ' .. args['webnume'] .. ']'
	elseif args['webaddr'] then
		args['website'] = args['webaddr']
	else
		args['website'] = origArgs['website'] or wikidata.findOneValueNoRef('P856', nil)
	end
	args['infodoc'] = origArgs['infodoc'] or 'Infocaseta Așezare'

	if args['harti'][1] == nil then
		local wikidataMap = wikidata.findOneValueNoRef('P242', nil)
		if not isNilOrEmpty(wikidataMap) then
			args['harti'][1] = {}
			args['harti'][1]['harta'] = wikidataMap
		end
	end
	if args['harti'][1] ~= nil and isNilOrEmpty(args['harti'][1]['descriere']) then
		args['harti'][1]['descriere'] = 'Poziția ' .. args['tip_asezare_genitiv'] .. ' ' .. args['nume']
	end
	if args['harti'][1] ~= nil and isNilOrEmpty(args['harti'][1]['size']) then
		args['harti'][1]['size'] = '290x290px'
	end
	if args['subdiviziuni'][1] == nil or isNilOrEmpty(args['subdiviziuni'][1]['nume']) then
		local wikidataCountry = wikidata.findOneValueNoRef('P17', nil)
		if not isNilOrEmpty(wikidataCountry) then
			if args['subdiviziuni'][1] == nil then args['subdiviziuni'][1] = {} end
			args['subdiviziuni'][1]['nume'] = wikidataCountry
			args['subdiviziuni'][1]['tip'] = '[[Țările lumii|Țară]]'
		end
	end
	if args['subdiviziuni'][2] == nil or isNilOrEmpty(args['subdiviziuni'][2]['nume']) then
		local subdivs = wikidata.getEntityIdsList(nil, 'P131')
		if subdivs and #subdivs > 0 then
			for subdivIdx = 1,#subdivs do
				if args['subdiviziuni'][1 + subdivIdx] == nil then args['subdiviziuni'][1 + subdivIdx] = {} end
				args['subdiviziuni'][1 + subdivIdx]['nume'] = wikidata.findLinkToItem(subdivs[subdivIdx])
				args['subdiviziuni'][1 + subdivIdx]['tip'] = wikidata.findOneValueNoRef('P31', mw.wikibase.getEntity('Q' .. subdivs[subdivIdx])) or '&nbsp;'
			end
		end
	end
	
	return _generate()
end
return p