Sari la conținut

Modul:IPA

De la Wikipedia, enciclopedia liberă
require('strict')
local langData = nil
local helpData = nil
local mInLang = nil
local yesNo = require('Modul:Yesno')
local TableTools = require('Modul:TableTools')

local nbsp = mw.text.decode(' ')
local p = {}

local function lazyLoadData(var, dataset)
	return var or mw.loadData(dataset)
end

local function lazyLoadModule(mdl, moduleName)
	return mdl or require(moduleName)
end

local function ipaSpan(text, extraClasses, wrapSetting, langCode)
	local bracketedText = text
	if not TableTools.contains({ '[', '/', '⟦', '⫽', '|', '‖', '\\', '~', '∅' }, mw.ustring.sub(text, 1, 1)) then
		bracketedText = '[' .. text .. ']'
	end
	local wrappingText = bracketedText
	if wrapSetting ~= 'none' and wrapSetting ~= 'all' then
		wrappingText = mw.ustring.gsub(bracketedText, '(%s+)', function(whitespace) return tostring(mw.html.create('span'):addClass('wrap'):wikitext(whitespace)) end)
	end
	local retSpan = mw.html.create('span')
		:addClass('AFI')
		:attr('title', 'Notație în Alfabetul Fonetic Internațional')
		:attr('lang', (langCode or 'und') .. '-Latn-fonipa')
		:wikitext(wrappingText)
	
	if extraClasses then
		retSpan:addClass(extraClasses)
	end
	if wrapSetting ~= 'all' then
		retSpan:addClass('nowrap')
	end
	return tostring(retSpan)
end

local function getLanguageName(langCode, link)
	langData = lazyLoadData(langData, 'Modul:InLang/data')
	if langCode and langData.languageCodes[langCode] then
		mInLang = lazyLoadModule(mInLang, 'Modul:InLang')
		return link and mInLang.getLangLink(langData.languageCodes[langCode]) or mInLang.getLangLabel(langData.languageCodes[langCode]) 
	end
	return ''
end

local function transformLabel(lbl, lang, link)
	if lbl == '' or lbl == '-' then
		return nil
	elseif lbl == 'lang' and lang then
		local langName = getLanguageName(lang, link)
		return langName .. ':' .. nbsp
	elseif lbl and (mw.ustring.lower(lbl) == 'afi' or mw.ustring.lower(lbl) == 'ipa') then
		return 'AFI:' .. nbsp
	elseif lbl == 'pron' then
		return 'pronunțat' .. nbsp
	elseif lbl == 'also' then
		return 'sau' .. nbsp
	elseif lbl == 'alsolang' and lang then
		return 'sau în ' .. getLanguageName(lang, link) .. ':' .. nbsp
	elseif lbl == 'langalso' and lang then
		return 'în ' .. getLanguageName(lang, link) .. ' și' .. nbsp
	elseif lbl == 'local' then
		return 'local' .. nbsp
	elseif lbl == 'localpron' then
		return 'pronunție locală:' .. nbsp
	elseif lbl then
		return lbl .. nbsp
	elseif lang then
		local langName = getLanguageName(lang, link)
		return langName and ('pronunție în ' .. langName .. nbsp) or nil
	end
end

local function fromArgs(argData)
	local out = ''
	if argData.pre then
		if argData.small then
			out = out .. tostring(mw.html.create('small'):wikitext(argData.pre))
		else
			out = out .. argData.pre
		end
	end
	helpData = lazyLoadData(helpData, 'Modul:IPA/data')
	local ipaText = ipaSpan(argData.text, argData['class'], argData['wrap'], argData.langCode)
	if helpData.helpPages[argData.langCode] then
		out = out .. mw.ustring.format('[[%s|%s]]', helpData.helpPages[argData.langCode], ipaText)
	else
		out = out .. ipaText
	end
	if argData.audio then
		out = out .. ' ' .. mw.getCurrentFrame():expandTemplate({
			title = 'Audio',
			args = { argData.audio, '' }
		})
	end
	return out
end
p.fromArgs = fromArgs

p.fromArray = function(args)
	local argData = {}
	for k, v in pairs(args) do
		if k ~= 3 and k ~= 'label' and v == '' then args[k] = nil end -- remove every blank argument except the label
	end
	local argsSize = TableTools.size(args)
	if argsSize == 1 or (argsSize == 2 and args[3] == '') then
		argData.text = args[1]
		argData.pre = ''
	elseif argsSize > 1 then
		if (args[2] == 'pron' or args[2] == 'AFI') then -- legacy mode
			if args[3] == '' then args[3] = nil end -- not a label in this case
			argData.text = args[1]
			argData.pre = args[2] == 'pron' and 'pronunțat' .. nbsp
						or args[2] == 'AFI' and 'AFI:' .. nbsp
						or nil
			argData.audio = args[3]
			argData.small = true
		else
			argData.langCode = args[1] and mw.ustring.gsub(args[1], '%-.*', '') or nil
			argData.text = args[2]
			argData.pre = transformLabel(args.label or args[3], args[1], yesNo(args.link, false))
			argData.audio = args.audio or args[4]
			argData.small = yesNo(args.small or '', true)
			argData['wrap'] = args['wrap']
			argData['class'] = args['class']
		end
	end
	return fromArgs(argData)
end

p.fromFrame = function(frame)
	local args = require('Modul:Arguments').getArgs(frame, { removeBlanks = false })
	return p.fromArray(args)
end
return p