Module:Sandbox/Nardog/4

local p = {}

local find = mw.ustring.find local gmatch = mw.ustring.gmatch local gsub = mw.ustring.gsub local sub = mw.ustring.sub local trim = mw.text.trim

local function multiFind(s, t)	local i, j = find(s, t[1]) for n = 2, #t do		local i2, j2 = find(s, t[n]) if i2 and (not i or i2 < i) then i, j = i2, j2		end end return i, j end

local function wrapSpaces(s) return gsub(s, '(%s+)', ' %1 ') end

local function escAndRep(s) local patterns = { '%[%]-%s[^%]|]-|', -- Piped links		']-%s[^>]->' -- HTML tags	}	s = gsub(s, '%[%[([^%]|]-%s[^%]|]-)%]%]', '[[%1|%1') -- Pipe unpiped links	local i, j = multiFind(s, patterns)	if i then -- Match found		local remaining, escaped = {}, {}		repeat			table.insert(remaining, sub(s, 1, i - 1)) -- What precedes the match			table.insert(escaped, sub(s, i, j)) -- The match			s = sub(s, j + 1) -- Truncate			i, j = multiFind(s, patterns)		until not i		table.insert(remaining, s) -- What follows the last match		s = {}		for k, v in ipairs(remaining) do			v = wrapSpaces(v)			table.insert(s, v)			table.insert(s, escaped[k])		end		s = table.concat(s)	else		s = wrapSpaces(s)	end	return s end

function p._main(s, wrap, tooltip, class) local span = mw.html.create('span') :attr('lang', 'und-Latn-fonipa') :addClass('IPA') :addClass(class) -- wrap=all: Do nothing -- wrap=none: Never break -- Otherwise: Break at spaces only if wrap ~= 'all' then span:addClass('nowrap') if wrap ~= 'none' then s = escAndRep(s) end end if tooltip ~= '' then -- tooltip is added unless blank span:attr('title', tooltip or			'Representation in the International Phonetic Alphabet (IPA)') end return tostring(span:wikitext(s)) end

function p.main(frame) -- local args = frame:getParent.args local args = frame.args[1] and frame.args or frame:getParent.args local s = args[1] and trim(args[1]) or '' return s ==  and  or p._main(s, args.wrap, args.tooltip, args.class) end

function p._lang(args) local ret = { p._main(args[1], args.wrap, args.tooltip, args.class) } local cats = {}

-- Label do local label = args.label local lang = args.lang and args.lang ~= '' and args.lang local defaultlabel = args.defaultlabel and args.defaultlabel ~= '' and args.defaultlabel or lang and lang .. ' pronunciation:' if not label then local labelcode = args.labelcode and args.labelcode:lower if labelcode then local function returnLabel if labelcode == '' then return '' end for k, v in pairs{ ['ipa'] = 'IPA:', ['pron'] = 'pronounced', ['also'] = 'also', ['local'] = 'locally', ['localpron'] = 'local pronunciation:' } do						if labelcode == k then return v						end end if labelcode == 'lang' then return lang and lang .. ':'					end if args.dialects and args.dialects ~= '' then for s in gmatch(args.dialects, '([^=]+=[^;]+);?') do							local t = mw.text.split(s, '[;=]') for i = 1, #t - 1 do								if labelcode == t[i] then return t[#t] .. ' pronunciation:' end if labelcode == 'lang' .. t[i] then return t[#t] .. ':'								end end end end -- For calls from modules return args.labels and args.labels[labelcode] end label = returnLabel end end label = label or defaultlabel if label and label ~= '' then if args.small ~= 'no' then -- Defaults to true label = ' ' .. label .. ' '			end table.insert(ret, 1, label .. ' ') end end -- Audio if args.audio and args.audio ~= '' then local audio = mw.getCurrentFrame:expandTemplate{ title = 'Template:Audio', args = { args.audio, 'listen', help = 'no' } }		table.insert(ret, ' (' .. audio .. ') ')		if args.audiocat ~= '' then -- audiocat is added unless blank table.insert(cats, args.audiocat				or 'Pages including recorded pronunciations') end end -- Categories if args.category and args.category ~= '' then table.insert(cats, args.category) end if cats[1] then local ns = mw.title.getCurrentTitle.namespace if ns % 2 == 0 and ns ~= 2 then -- Non-talk and non-user for _, v in ipairs(cats) do				table.insert(ret, '') end end end return table.concat(ret) end

function p.lang(frame) local args = frame.args local parentArgs = frame:getParent.args for k, v in pairs(parentArgs) do		if type(k) == 'string' then args[k] = v		end end args[1] = args[1] and trim(args[1]) or '' return args[1] ==  and  or p._lang(args) end

return p