Module:Template:also

Definition from Wiktionary, the free dictionary
Jump to: navigation, search
The following documentation is located at Module:Template:also/documentation. [edit]
See also: subpages of this module.

This module implements the template {{also}}.


local export = {}
 
local yesno = require('Module:yesno')
 
-- Join with serial "and" and serial comma
local function serial_comma_join(seq)
	if #seq == 0 then
		return ""
	elseif #seq == 1 then
		return seq[1] -- nothing to join
	elseif #seq == 2 then
		return seq[1] .. " ''and'' " .. seq[2]
	else
		return table.concat(seq, ", ", 1, #seq - 1) .. "<span class='serial-comma'>,</span>" ..
			"''<span class='serial-and'> and</span>'' " ..
			seq[#seq]
	end
end
 
function export.main(frame)
	local args = frame:getParent().args
	local sc_default = args["sc"]
	local uni_default = yesno((args["uni"] == "auto") or args["uni"]) and "auto" or nil
 
	local items = {}
 
	for i, arg in ipairs(args) do
		local uni = args["uni" .. i] or uni_default
		local sc = args["sc" .. i] or sc_default
 
		if not yesno(uni, uni) then
			uni = nil
		end
 
		local s = ""
		local has_piped_link, _, link_text = arg:find("%[%[[^%[%]|]+|(.+)]]")
 
		if has_piped_link then
			s = ("'''%s'''"):format(arg)
			arg = mw.text.decode(link_text)
		else
			local has_link, _, link_text = arg:find("%[%[([^%[%]|]+)]]")
 
			if has_link then
				s = ("'''%s'''"):format(arg)
				arg = mw.text.decode(link_text)
			else
				s = ("'''[[%s]]'''"):format(arg)
			end
		end
 
		local codepoint = nil
 
		if uni then
			require("Module:debug").track("also/uni")
 
			if uni == 'auto' then
				codepoint = (mw.ustring.len(arg) == 1) and mw.ustring.codepoint(arg, 1, 1)
			else
				codepoint = tonumber(uni)
 
				if mw.ustring.len(arg) ~= 1 or codepoint ~= mw.ustring.codepoint(arg, 1, 1) then
					require("Module:debug").track("also/uni/noauto")
				else
					require("Module:debug").track("also/uni/auto")
				end
			end
		end
 
		if codepoint then
			local m_unidata = require('Module:Unicode data')
 
			s = s .. (" <small>[U+%04X %s]</small>"):format(
				codepoint,
				m_unidata.lookup_name(codepoint):gsub("<", "&lt;")
			)
		end
 
		if arg ~= mw.title.getCurrentTitle().fullText then
			table.insert(items, s)
		else
			require("Module:debug").track("also/pagename")
		end
	end
 
	if #items == 0 then
		table.insert(items, "{{{1}}}")
	end
 
	return ("<div class=\"disambig-see-also%s\">''See also:'' %s</div>"):format(
		(#items == 2) and "-2" or "",
		serial_comma_join(items)
	)
end
 
return export