Mô đun:IPAc-en

-- This module implements [[Template:IPAc-en]].

local data = mw.loadData('Module:IPAc-en/data')
local p = {}

-- Global container for tracking categories
local categoryHandler = require('Module:Category handler').main
local categories = {}

-- Trims whitespace from a string
local function trim(s)
	return s:match('^%s*(.-)%s*$')
end

-- This implements [[Template:Nowrap]].
local function makeNowrapSpan(s)
	local span = mw.html.create('span')
		:addClass('rt-commentedText') -- Works with [[MediaWiki:Gadget-ReferenceTooltips.js]]
		:addClass('nowrap')
		:wikitext(s)
	return tostring(span)
end

local function makePronunciationText(id)
	id = id and string.lower(trim(id))
	if id and id ~= '' and data.pronunciation[id] then
		return data.pronunciation[id].text
	end
end

-- This adds a tooltip icon to a label. It implements [[Template:H:title]].
local function makeTooltip(label, tooltip)
	local span = mw.html.create('span')
		:attr('title', tooltip)
		:wikitext(label)
	return tostring(span)
end

local function formatPhonemeGroup(phonemes)
	if #phonemes > 0 then
		local span = mw.html.create('span')
			:css('border-bottom', '1px dotted')
			:wikitext(table.concat(phonemes))
		return tostring(span)
	else
		return ''
	end
end

local function renderCategories()
	local ret = ''
	ret = categoryHandler{
		[1] = 'yes', -- Add categories in these namespaces
		main = 1,
		wikipedia = 1,
		file = 1,
		template = 1,
		help = 1,
		category = 1,
		portal = 1,
		book = 1,
		draft = 1,
		module = 1,
	}
	
	if ret == 'yes' then
		ret = {}
		for cat in pairs(categories) do
			table.insert(ret, string.format('[[Category:%s]]', cat))
		end
		table.sort(ret)
		ret = table.concat(ret)
	else
		ret = ''
	end
	return ret
end

function p._main(args)
	local ret = {}
	local i = 0 -- Keeps track of numbered args

	-- Pronunciation
	do
		local pron = {}
		while true do
			i = i + 1
			local pronItem = makePronunciationText(args[i])
			if pronItem then
				pron[#pron + 1] = pronItem
				pron[#pron + 1] = ' '
			else
				break
			end
		end
		if #pron > 0 then
			ret[#ret + 1] = string.format(
				'<small>%s</small>',
				table.concat(pron)
			)
		end
	end

	-- Phonemes
	do
		-- Loop through the numbered args, separating them into phoneme groups
		-- and separator strings (both called "words" for convenience). We only
		-- underline the phoneme groups, not the separators.
		local words = {}
		words[#words + 1] = '/' -- Opening slash
		i = i - 1 -- Set up i again as it was changed in the pronunciation loop
		local id
		repeat
			local phonemes = {}
			local isWordEnd = false
			while not isWordEnd do
				i = i + 1
				id = args[i]
				id = id and trim(id)
				if not id then
					isWordEnd = true
					words[#words + 1] = formatPhonemeGroup(phonemes)
				elseif id ~= '' then
					local t = data.phonemes[id]
					if not t then
						-- We were passed an invalid id.
						isWordEnd = true
						categories["Ill-formatted IPAc-en transclusions"] = true
						words[#words + 1] = formatPhonemeGroup(phonemes)
						words[#words + 1] = makeTooltip(
							string.format(
								"<strong class=\"error\">[invalid input: '%s']</strong>",
								id
								),
							'Unrecognized symbol'
						)
					elseif not t.label then
						-- The data module contains bad data, so throw an error.
						error(string.format(
							"no label was found for id '%s'",
							tostring(id)
						))
					elseif t.tooltip then
						-- We are dealing with a regular phoneme.
						phonemes[#phonemes + 1] = makeTooltip(
							t.label,
							t.tooltip
						)
					else
						-- We are dealing with a separator.
						isWordEnd = true
						words[#words + 1] = formatPhonemeGroup(phonemes)
						words[#words + 1] = t.label						
					end
				end
			end
		until not id
		words[#words + 1] = '/' -- Closing slash

		-- Wrap the words in a link to IPA help.
		local span = mw.html.create('span')
			-- Suppress Navigation popups and Page Previews (aka Hovercards)
			:addClass('IPA nopopups noexcerpt')
			:wikitext(string.format(
				'[[:en:Help:IPA/English|%s]]',
				table.concat(words)
			))
		
		ret[#ret + 1] = tostring(span)
	end
	
	-- Audio link
	do
		local file = args.audio and trim(args.audio)
		if file and file ~= '' then
			if args[1] and string.lower(trim(args[1])) == 'uk' then
				categories["Các trang chứa cách phát âm được ghi âm (tiếng Anh-Anh)"] = true
			elseif args[1] and string.lower(trim(args[1])) == 'us' then
				categories["Các trang chứa cách phát âm được ghi âm (tiếng Anh-Mỹ)"] = true
			else
				categories["Các trang chứa cách phát âm được ghi âm (tiếng Anh)"] = true
			end
			
			ret[#ret + 1] = mw.getCurrentFrame():expandTemplate{
				title = 'Bản mẫu:IPA audio link', args = { file } }
		end
	end
	
	-- Nowrap and categories
	ret = makeNowrapSpan(table.concat(ret)) .. renderCategories()

	-- Reset the categories table in case we are run again.
	categories = {}

	return ret
end

function p.main(frame)
	return p._main(frame:getParent().args)
end

return p
Chúng tôi bán
Bài viết liên quan
Profile và tội của mấy thầy trò Đường Tăng trong Black Myth: Wukong
Profile và tội của mấy thầy trò Đường Tăng trong Black Myth: Wukong
Trong Black Myth: Wukong thì Sa Tăng và Tam Tạng không xuất hiện trong game nhưng cũng hiện diện ở những đoạn animation
Giới thiệu Anime: Saiki Kusuo no Psi-nan
Giới thiệu Anime: Saiki Kusuo no Psi-nan
Khác với một học sinh cao trung bình thường, Saiki Kusuo có nhiều siêu năng lực khác nhau bao gồm thần giao cách cảm và cách không di vật
Chuỗi phim Halloween: 10 bộ phim tuyển tập kinh dị hay có thể bạn đã bỏ lỡ
Chuỗi phim Halloween: 10 bộ phim tuyển tập kinh dị hay có thể bạn đã bỏ lỡ
Hãy cùng khởi động cho mùa lễ hội Halloween với list phim kinh dị dạng tuyển tập. Mỗi bộ phim sẽ bao gồm những mẩu chuyện ngắn đầy rùng rợn
Nhân vật Arisu Sakayanagi - Youkoso Jitsuryoku Shijou Shugi no Kyoushitsu e
Nhân vật Arisu Sakayanagi - Youkoso Jitsuryoku Shijou Shugi no Kyoushitsu e
Arisu Sakayanagi (坂さか柳やなぎ 有あり栖す, Sakayanagi Arisu) là một trong những lớp trưởng của lớp 2-A.