Module:IPA symbol/sandbox

local data = mw.loadData('Module:IPA symbol/sandbox/data').datalocal p = {}local gsub = mw.ustring.gsublocal len = mw.ustring.lenlocal sub = mw.ustring.sublocal function reverseLook(t, s)local retfor i = 1, len(s) - 1 do-- Look for 2-char matches firstret = t[sub(s, i, i + 1)] or t[sub(s, i, i)]if ret thenreturn retendendret = t[sub(s, -1)] -- Last characterif ret thenreturn retendendlocal function returnData(s, dataType)for _, v in ipairs(data.univPatterns) dos = gsub(s, v.pat, v.rep)endlocal key = sfor _, v in ipairs(data.keyPatterns) dokey = gsub(key, v.pat, v.rep)endlocal ret = data.sounds[key] or data.diacritics[key]or reverseLook(data.diacritics, s)if ret and dataType thenif ret[dataType] thenret = ret[dataType]elseerror(string.format('Invalid data type "%s"', dataType))endendreturn retendlocal function returnErrorCat()return require('Module:Category handler').main{'[[Category:International Phonetic Alphabet pages needing attention]]',other = ''}endlocal function returnError(s)return string.format('<span class="error">Error using {{[[Template:IPA symbol|IPA symbol]]}}: "%s" not found in list</span>%s',s, returnErrorCat())endfunction p._main(s, errorText, output)return returnData(s, output or 'article') or errorText or returnError(s)endfunction p.main(frame)local args = {}for k, v in pairs(frame.args) doargs[k] = v ~= '' and vendif not args.symbol thenreturn '' -- Exit earlyendif args.errortext == 'blank' thenargs.errortext = ''endreturn p._main(args.symbol, args.errortext, args.output)endfunction p._link(s, displayText, prefix, suffix, audio, addSpan, errorText)local t = returnData(s)if t thens = string.format('%s[[:%s|%s]]%s',prefix or '', t.article, displayText or s, suffix or '')if addSpan ~= 'no' thenlocal span = mw.html.create('span'):addClass('IPA'):attr('lang', 'und-fonipa')if prefix or suffix thenspan:addClass('nowrap'):attr('title','Representation in the International Phonetic Alphabet (IPA)')ends = tostring(span:wikitext(s))endif audio thenaudio = require('Module:Yesno')(audio, audio)audio = audio == true and t.audio or audioif audio ~= '' thenaudio = mw.getCurrentFrame():expandTemplate{title = 'Template:Audio',args = { audio, 'listen', help = 'no' }}audio = ' <span class="nowrap" style="font-size:85%">(' .. audio.. ')</span>'endelseaudio = ''endreturn s .. audio elsereturn errorText or returnError(s)endendfunction p.link(frame)local args = {}for k, v in pairs(frame.args) doargs[k] = v ~= '' and vendif not args.symbol thenreturn '' -- Exit earlyendif args.errortext == 'blank' thenargs.errortext = ''endreturn p._link(args.symbol, args.text, args.prefix, args.suffix, args.audio,args.span, args.errortext)endreturn p