Sari la conținut

Modul:InLang

De la Wikipedia, enciclopedia liberă

Documentația poate fi citită și modificată la Modul:InLang/doc

Modul realizat pentru a înlocui funcționalitatea formatului {{Limba}}. Folosește Modul:Lang pentru afișarea efectivă a textului.

Testele unitare sunt la Discuție Modul:InLang/testcases.


local getArgs = require('Modul:Arguments').getArgs
local illWd = require('Modul:Ill-wd')
local StringUtils = require('Modul:StringUtils')
local wikidata = require('Modul:Wikidata')
local lang = require('Modul:Lang')
local p = {}

p.getLangLink = function(q)
	return illWd.fromArgs(q, StringUtils._removeStart({StringUtils._removeStart({wikidata.findLabel(q), 'Limba '}), 'limba '}), nil)
end

local function getAlphabetCode(alphabetQID)
	return wikidata.findOneValueNoRef('P506', alphabetQID)
end

local function getLanguageDir(alphabetQID)
	local languageDirectionalities = wikidata.getBestEntityIdsList(alphabetQID, 'P1406')
	local languageDir
	if languageDirectionalities and languageDirectionalities[1] then
		languageDir = (languageDirectionalities[1] == 7333457) and 'rtl' or nil
	end
	return languageDir
end

p.fromArgs = function(langId, langText, alternateSpellings, defaultAlphabet, italics)
	local languageLink
	if mw.ustring.match(langId, 'Q?%d+') then
		languageLink = p.getLangLink(langId)
		local langISOcode = wikidata.findOneValueNoRef('P218', langId) or wikidata.findOneValueNoRef('P219', langId) or wikidata.findOneValueNoRef('P305', langId)
		local languageDir = nil
		local defaultAlphabetCode
		if not defaultAlphabet then
			languageAlphabets = wikidata.getBestEntityIdsList(langId, 'P282')
			if languageAlphabets and languageAlphabets[1] then
				defaultAlphabet = languageAlphabets[1]
			end
		elseif mw.ustring.match(defaultAlphabet, 'Q%d+') then -- must be on an 'else' here because we need an explicit alphabet code only if more are possible (so only if a default is specified)
			defaultAlphabetCode = getAlphabetCode(defaultAlphabet)
		end
		if defaultAlphabet then
			languageDir = getLanguageDir(defaultAlphabet)
		end
		local out = languageLink .. ' '
		if langText then
			if langISOcode then
				local htmlText = lang.fromArgs(defaultAlphabetCode and (langISOcode .. '-' .. defaultAlphabetCode) or langISOcode, languageDir, langText, italics)
				out = out .. htmlText
			else
				out = out .. '\'\'' .. langText .. '\'\''
			end
		end
		if alternateSpellings then
			local spellingsTexts = {}
			for _,eachSpelling in ipairs(alternateSpellings) do
				local crtAlphabet = eachSpelling.alphabet
				local crtAlphabetDir = nil
				local crtSpellingText = ''
				local crtAlphabetCode = 'Latn'

				if mw.ustring.match(crtAlphabet, 'Q%d+') then
					crtAlphabetDir = getLanguageDir(crtAlphabet)
					crtAlphabetCode = getAlphabetCode(crtAlphabet)
					crtSpellingText = 'cu ' .. wikidata.findLinkToItem(crtAlphabet)
				else
					crtSpellingText = crtAlphabet
				end

				if langISOcode then
					local htmlText = lang.fromArgs(crtAlphabetCode and (langISOcode .. '-' .. crtAlphabetCode) or langISOcode, crtAlphabetDir, eachSpelling.spelling, italics)
					crtSpellingText = crtSpellingText .. ': ' .. htmlText
				else
					crtSpellingText = crtSpellingText .. ': \'\'' .. eachSpelling.spelling .. '\'\''
				end
				table.insert(spellingsTexts, crtSpellingText)
			end
			if #spellingsTexts > 0 then
				out = out .. ', ' .. table.concat(spellingsTexts, ', ')
			end
			return out
		end
	else 
		languageLink = '[[Limba ' .. langId .. '|' .. langId .. ']]'
		return languageLink .. ' ' .. (langText and ((italics and '\'\'' or '') .. langText .. (italics and '\'\'' or '')) or '') .. (langTranslit and (', ' .. latinVariantName .. ' ' .. '\'\'' .. langTranslit .. '\'\'') or '')
	end
end

p.fromArray = function(args)
	local languageId = args[1]
	local languageText = args[2]
	local languageTranslit = args[3]
	local latinVariantName = args[4] or 'transliterat'
	local defaultAlphabet = args['default_alphabet']
	local alternateSpellings = {}
	if languageTranslit then
		table.insert(alternateSpellings, {spelling = languageTranslit, alphabet = latinVariantName})
	end
	local crtArgIndex = 5
	while args[crtArgIndex + 1] do
		if args[crtArgIndex] then
			table.insert(alternateSpellings, {spelling = args[crtArgIndex], alphabet = args[crtArgIndex + 1]})
		end
		crtArgIndex = crtArgIndex + 2
	end
	local italics = (args['italics'] ~= 'no')
	return p.fromArgs(languageId, languageText, alternateSpellings, defaultAlphabet, italics)
end

p.fromFrame = function(frame)
	argsOptions = {frameOnly = false, parentOnly = false}
	if frame.args['args'] then
		argsOptions.frameOnly = (frame.args['args'] == 'frameOnly')
		argsOptions.parentOnly = (frame.args['args'] == 'parentOnly')
	end
	local args = getArgs(frame, argsOptions)
	return p.fromArray(args)
end

return p