Jump to content

Module:UnitPlural: Difference between revisions

From Wikipedia, the free encyclopedia
Content deleted Content added
local u1,2
rm debugging
Line 60: Line 60:
if plural[langcode] then
if plural[langcode] then
if plural[langcode][unit] then
if plural[langcode][unit] then
-- irregular plural from lookup
ret = plural[langcode][unit]
ret = plural[langcode][unit]
else
else
Line 67: Line 68:
-- recurse to give plural of bit before " per "
-- recurse to give plural of bit before " per "
ret = pl(u1) .. " per " .. u2
ret = pl(u1) .. " per " .. u2
-- ret = "Debug:" .. " 2=" .. (u2 or "zilch") .. " 1=" .. pl(u1, langcode) .. " per=" .. per
else
else
-- standard plural
-- standard plural
Line 74: Line 74:
end
end
else
else
ret = "Debug: unknown language " .. unit
-- unknown language, so return unchanged
ret = unit
end
end
return ret
return ret
Line 91: Line 92:
args = frame:getParent().args
args = frame:getParent().args
end
end
-- if nothing supplied, return nothing (or an error message if debugging)
if not args.unit then return "Debug: Nothing supplied" end
if not args.unit then return "" end


return pl(args.unit, args.lang)
return pl(args.unit, args.lang)

Revision as of 20:18, 10 October 2018

-- Module to create plurals for units (initially)
-- Might be split into code and data

--[[
Plurals by language
--]]
local plural = {
	-- English
	en = {
		-- standard suffix, and "per":
		"s",
		["per"] = "per",
		-- irregular plurals:
		["inch"] = "inches",
		["foot"] = "feet",
		["square foot"] = "square feet",
		["cubic foot"] = "cubic feet",
		["pound-force"] = "pounds-force",
		["kilogram-force"] = "kilograms-force",
		["horsepower"] = "horsepower",
		["gauss"] = "gauss",
		["solar mass"] = "solar masses",
		["hertz"] = "hertz",
		["degree Fahrenheit"] = "degrees Fahrenheit",
		["degree Celsius"] = "degrees Celsius",
		["standard gravity"] = "standard gravities",
	},
}

--[[
findLang takes a "langcode" parameter if if supplied and valid.
Otherwise it tries to create it from the user's set language ({{int:lang}})
Failing that, it uses the wiki's content language.
It returns a language object.
--]]
local function findLang(langcode)
	local langobj
	langcode = mw.text.trim(langcode or "")
	if mw.language.isKnownLanguageTag(langcode) then
		langobj = mw.language.new(langcode)
	else
		langcode = mw.getCurrentFrame():preprocess( '{{int:lang}}' )
		if mw.language.isKnownLanguageTag(langcode) then
			langobj = mw.language.new(langcode)
		else
			langobj = mw.language.getContentLanguage()
		end
	end
	return langobj
end

--[[
pl takes a unit name and an optional language code
It returns the plural of that unit in the given language, if it can.
--]]
local function pl(unit, langcode)
	langcode = findLang(langcode).code
	unit = tostring(unit) or ""
	local ret = ""
	if plural[langcode] then
		if plural[langcode][unit] then
			-- irregular plural from lookup
			ret = plural[langcode][unit]
		else
			local per = plural[langcode].per
			local u1, u2 = unit:match("(.+) " .. per .. " (.+)")
			if u1 then
				-- recurse to give plural of bit before " per "
				ret = pl(u1) .. " per " .. u2
			else
				-- standard plural
				ret = unit .. plural[langcode][1]
			end
		end
	else
		-- unknown language, so return unchanged
		ret = unit
	end
	return ret
end

local p = {}

--[[
p.main takes a unit name and an optional language code from the frame or its parent.
It returns the plural of that unit in the given language, if it can.
--]]
function p.main(frame)
	if frame.args.unit then
		args = frame.args
	else
		args = frame:getParent().args
	end
	-- if nothing supplied, return nothing (or an error message if debugging)
	if not args.unit then return "" end

	return pl(args.unit, args.lang)
end

return p