Implements {{Wikidata Infobox}}


local p = {}
local WikidataIB = require("Module:WikidataIB")

-- Code from 'Module:No globals'
local mt = getmetatable(_G) or {}
function mt.__index (t, k)
	if k ~= 'arg' then
		error('Tried to read nil global ' .. tostring(k), 2)
	end
	return nil
end
function mt.__newindex(t, k, v)
	if k ~= 'arg' then
		error('Tried to write global ' .. tostring(k), 2)
	end
	rawset(t, k, v)
end
setmetatable(_G, mt)
-- End of code from 'Module:No globals'

function p.ifThenShow(frame)
	if mw.text.trim(frame.args[1] or '') ~= '' then
		return (frame.args[3] or '') .. (frame.args[1] or '') .. (frame.args[4] or '')
	else
		return (frame.args[2] or '')
	end
end

--  Given an input area, return a map zoom level to use with mw:Extension:Kartographer in {{Wikidata Infobox}}. Defaults to mapzoom=15. 
function p.autoMapZoom(frame)
	local size = tonumber(frame.args[1]) or 0
	local LUT = { 5000000, 1000000, 100000, 50000, 10000, 2000, 150, 50, 19, 14, 5, 1, 0.5 } 
	for zoom, scale in ipairs(LUT) do
		if size > scale then
			return zoom+1
		end
	end
	return 15
end

function p.formatLine(frame)
	local part2 = mw.text.trim(frame.args[2] or '')
	local returnstr = ''
	if part2 ~= '' then
		returnstr = '<tr '
		if (frame.args.mobile or 'n') == 'y' then
			returnstr = returnstr .. 'class="wdinfo_nomobile"'
		end
		local newframe = {}
		newframe.args = {}
		newframe.args.qid = frame.args[1]
		returnstr = returnstr .. '><th class="wikidatainfobox-lcell">' .. mw.getContentLanguage():ucfirst(WikidataIB.getLabel(newframe))
		returnstr = returnstr .. '</th><td '
		if (frame.args.wrap or 'n') == 'y' then
			returnstr = returnstr .. 'style="white-space: nowrap"'
		end
		returnstr = returnstr .. '>' .. part2 .. '</td></tr>'
	end
	return returnstr
end

function p.hasValue (tab, val)
    for index, value in ipairs(tab) do
        if value == val then
            return true
        end
    end

    return false
end

-- baseLang is a utility function that returns the base language in use
-- so for example, both English (en) and British English (en-gb) return 'en'
-- from https://commons.wikimedia.org/wiki/Module:Wikidata2
function p.baseLang(frame)
	local txtlang = frame:callParserFunction( "int", "lang" ) or ""
	-- This deals with specific exceptions: be-tarask -> be_x_old
	if txtlang == "be-tarask" then
		return "be_x_old"
	end
	local pos = txtlang:find("-")
	local ret = ""
	if pos then
		ret = txtlang:sub(1, pos-1)
	else
		ret = txtlang
	end
	return ret
end

function p.langDirection(frame)
	local lang = mw.text.trim(frame.args[1] or '') 
	if (not mw.language.isSupportedLanguage(lang)) then 
		lang = frame:callParserFunction( "int", "lang" ) -- get user's chosen language
	end
	return mw.getLanguage(lang):getDir()
end

--[[
convertChar returns the non-diacritic version of the supplied character.
stripDiacrits replaces words with diacritical characters with their non-diacritic equivalent.
strip_diacrits is available for export to other modules.
stringIsLike tests two words, returning true if they only differ in diacritics, false otherwise.
stringIs_like is available for export to other modules.
--]]

local function characterMap()
	-- table with characters with diacrits and their equivalent basic latin characters
	local charMap_from, charMap_to
	charMap_from =  'ÁÀÂÄǍĂĀÃÅĄƏĆĊĈČÇĎĐḌÐÉÈĖÊËĚĔĒẼĘẸĠĜĞĢĤĦḤİÍÌÎÏǏĬĪĨĮỊĴĶĹĿĽĻŁḶḸṂŃŇÑŅṆŊÓÒÔÖǑŎŌÕǪỌŐØŔŘŖṚṜŚŜŠŞȘṢŤŢȚṬÚÙÛÜǓŬŪŨŮŲỤŰǗǛǙǕŴÝŶŸỸȲŹŻŽ'..
					'áàâäǎăāãåąəćċĉčçďđḍðéèėêëěĕēẽęẹġĝğģĥħḥıíìîïǐĭīĩįịĵķĺŀľļłḷḹṃńňñņṇŋóòôöǒŏōõǫọőøŕřŗṛṝśŝšşșṣťţțṭúùûüǔŭūũůųụűǘǜǚǖŵýŷÿỹȳźżž'
	charMap_to   =  'AAAAAAAAAAACCCCCDDDDEEEEEEEEEEEGGGGHHHIIIIIIIIIIIJKLLLLLLLMNNNNNNOOOOOOOOOOOORRRRRSSSSSSTTTTUUUUUUUUUUUUUUUUWYYYYYZZZ'..
					'aaaaaaaaaaacccccddddeeeeeeeeeeegggghhhiiiiiiiiiiijklllllllmnnnnnnoooooooooooorrrrrssssssttttuuuuuuuuuuuuuuuuwyyyyyzzz'
	local charMap = {}
	for i = 1,mw.ustring.len(charMap_from) do
		charMap[mw.ustring.sub(charMap_from, i, i)] = mw.ustring.sub(charMap_to, i, i)
	end
	charMap['ß'] = 'ss'
	return charMap
end

function p.convertChar(frame)
	local ch = frame.args.char or mw.text.trim(frame.args[1]) or ""
	local charMap = characterMap()
	return charMap[ch] or ch
end

function p.strip_diacrits(wrd)
	if wrd then 
		local charMap = characterMap()
		wrd = string.gsub(wrd, "[^\128-\191][\128-\191]*", charMap )
	end
	return wrd
end

function p.stripDiacrits(frame)
	return p.strip_diacrits(frame.args.word or mw.text.trim(frame.args[1]))
end

function p.stringIs_like(wrd1, wrd2)
	return p.strip_diacrits(wrd1) == p.strip_diacrits(wrd2)
end

function p.stringIsLike(frame)
	local wrd1 = frame.args.word1 or frame.args[1]
	local wrd2 = frame.args.word2 or frame.args[2]
	if p.strip_diacrits(wrd1) == p.strip_diacrits(wrd2) then
		return true
	else
		return nil
	end
end


return p
"https://ta.wikipedia.org/w/index.php?title=Module:Wikidata_Infobox&oldid=2858003" இலிருந்து மீள்விக்கப்பட்டது