Modul:IPA
Aspect

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