Modul:Wikidata.Ca/Units

Daripada Wikipedia, ensiklopedia bebas.

Pendokumenan untuk modul ini boleh diciptakan di Modul:Wikidata.Ca/Units/doc

-- syntax:
--	Qxxx = { -- label from Wikidata, as a reference
--		label = "label fixed",
--		plural = "plural fixed",
--		ucode = "unit code to add or to fix",
--		},

local wikidata_units = {
    Q531 = { -- tahun cahaya
		plural = "tahun cahaya",
		},
	Q573 = { -- hari
		ucode = "hari",
		},
--	Q4917 = { -- dolar Amerika Syarikat
--		plural = "AS$",
--		ucode = "$", -- berulang
--		},
	Q5151 = { -- bulan
		plural = "bulan",
		},
	Q11229 = { -- peratus
		plural = "peratus",
		ucode = "%", -- berulang
		},
	Q11573 = { -- meter
		ucode = "m", -- berulang
		},
	Q25267 = { -- darjah Celsius
		plural = "darjah Celsius",
		ucode = "°C",
		},
	Q42289 = { -- darjah Fahrenheit
		plural = "darjah Fahrenheit",
		ucode = "°F",
		},
    Q55627 = { -- tahun hayat penyelarasan hilang upaya
		plural = "tahun hayat penyelarasan hilang upaya",
		ucode = "DALY",
		},
	Q83327 = { -- elektronvolt
		plural = "elektronvolt",
		},
	Q155009 = { -- Reichsmark
		ucode = "ℛℳ",
		},
	Q206037 = { -- putaran seminit
		label = "putaran",
		ucode = "rpm", -- WD: rev/min
		},
    Q209426 = { -- minit arka
		label = "minit",
		},
	Q483261 = { -- unit jisim atom bersatu
		ucode = "Da", -- WD: u
		},
	Q524410 = { -- bilion tahun
		plural = "bilion tahun",
		},
	Q550207 = { -- dolar Geary–Khamis
		plural = "dolar Geary–Khamis",
		ucode = "$",
		},
	Q712226 = { -- kilometer persegi
		ucode = "km²", -- berulang
		},
	Q743895 = { -- degupan seminit
		plural = "degupan seminit",
		ucode = "bpm",
		},
	Q829073 = { -- saat arka
		label = "saat",
		ucode = "″", -- WD amb cometes rectes
		},
	Q1463969 = { -- watt semeter kelvin
		ucode = "W/(m·K)", -- WD: W m⁻¹ K⁻¹
		},
	Q2080811 = { -- pecahan persegi padu
		label = "peratus padu",
		plural = "peratus padu",
		ucode = "%", -- WD: vol%
		},
	Q3085309 = { -- joule per kilogram kelvin
		ucode = "J/Kg·K", -- WD: J kg⁻¹ K⁻¹
		},
	Q6859652 = { -- milimeter raksa
		ucode = "mm Hg", -- WD: mmHg
		},
	Q20966435 = { -- ampere setiap volt meter
		plural = "ampere per volt meter",
		ucode = "A/Vm",
		},
	Q20966455 = { -- joule setiap mol kelvin
		ucode = "J/mol·K", -- WD: J K⁻¹ mol⁻¹
		},
	Q21127659 = { -- gram setiap 100 gram pelarut
		ucode = "g/100 g pelarut",
		},
	Q23977060 = { -- desibel berbanding 1 pikowatt
		ucode = "dB re 1pW", 
		},
	Q24564698 = { -- tahun (umur)
		plural = "tahun",
		},
	Q28739766 = { -- meter Coulomb
		ucode = "C·m", -- WD: C m
		},
	}

local function getUnit(amount, label, unitID, code, symbol)
	if label == nil then return unitID end
	local id_data = wikidata_units[unitID] or {}
	local unit_text = ''
	if code then
		unit_text = id_data.ucode or symbol or id_data.label or label
	elseif amount == "1" then
		unit_text = id_data.label or label or unitID
	--else
	--	unit_text = id_data.plural or require("Module:ca-flexió").plural(id_data.label or label)
	end
	return unit_text
end

local convert_default = {
	Q218593 = "Q174789", -- in > mm
	Q3710 = "Q174728", -- ft > cm
	Q482798 = "Q11573", -- yd > m
	Q253276 = "Q828224", -- mi > km
	Q232291 = "Q712226", -- mi² > km²
	Q128822 = "Q180154", -- nus > km/h
}

-- fraction values are saved in Wikidata as decimal numbers, e.g. P6757
-- this helper function restores the fracion notation with 1 as numerator
local function fraction1(decimal)
	decimal = tonumber(decimal)
	if decimal >= 1 then
		return decimal
	end
	
	local precision = 1E-15
	local z = decimal
	local predenum = 0
	local sc, num
	local denum = 1
	
	repeat
		z = 1 / (z - math.floor(z))
		sc = denum
		denum = denum * math.floor(z) + predenum
		predenum = sc
		num = math.ceil(decimal * denum)
	until ((math.abs(decimal - (num / denum)) < precision) or (z == math.floor(z)) or num == 1)
	
	return num .. '/' .. denum
end

return {
	getUnit = getUnit,
	convert_default = convert_default,
	fraction1 = fraction1
}