Documentation for this module may be created at ሞድዩል:Convert/doc

local p  = {}
local ti = mw.language.new('ti')

local tableElement = require('Module:Tables').element
local toLink       = require('Module:Wikidata/Formats').toLink
local round        = require('Module:Math')._round

-- Constants
local units = {
	['Q794261'] = {
		['label']    = 'ኩቢክ ሜተር ኣብ ካልኢት',
		['abbreviation'] = 'ኩቢክ ሜተር ኣብ ካልኢት',
		['unit change'] = {
		},
		['unit SI'] = true,
	},	
	['Q25343'] = {
		['label']    = 'ትርብዒት ሜተር',
		['abbreviation'] = 'ትርብዒት ሜተር',
		['unit change'] = {
			{'Q712226', 1000000, '>'}, -- ትርብዒት ኪ.ሜ.
			{'Q35852', 10000, '>'} -- ሄክታር
		},
		['unit SI'] = true,
	},	
	['Q712226'] = {
		['label']    = 'ትርብዒት ኪሎሜተር',
		['abbreviation'] = 'ትርብዒት ኪ.ሜ.',
		['conversionSI'] = { 1000000, 'Q25343'}, -- 1 ትርብዒት ኪ.ሜ. = 1000 000 ትርብዒት ሜተር
		['unit SI'] = true,
	},
	['Q35852']  = {
		['label']    = 'ሄክታር',
		['abbreviation'] = 'ሄክታር',
		['conversionSI'] = {10000, 'Q25343'}, -- 1 ሄክታር = 10.000 ትርብዒት ሜተር
		['unit SI'] = true,
	},
	['Q81292'] = {
		['label'] = 'ኤክር',
		['link']    = 'ኤክር',
		['plural']    = 'ኤክራት',
		['conversionSI'] = { 4046.8564224, 'Q25343'} -- 1 ኤክር = 4046,8564224 ትርብዒት ሜተር
	},
	['Q232291'] = {
		['label']    = 'ትርብዒት ማይል',
		['abbreviation'] = 'ትርብዒት ማይል',		
		['conversionSI'] = {2589988.110336, 'Q25343'} -- 1 ትርብዒት ማይል = 2 589 988,110336 ትርብዒት ሜተር
	},
	['Q216795'] = {
		['label']    = 'ዱናም',
		['conversionSI'] = {1000, 'Q25343'}
	},
	['Q23931109'] = {
		['label']    = 'ሜትሪክ ዱናም',
		['conversionSI'] = {1000, 'Q25343'}
	},
    -- Length units
	['Q11573'] = {
		['label']    = 'ሜተር',
		['abbreviation'] = 'ሜተር',
		['unit change'] = {
			{'Q828224', 1000, '>'}, -- ኪሎሜተር
		},
		['unit SI'] = true,
	},
	['Q1811'] = {
		['label']    = 'ስነ ኮኾባዊ ኣሃዱ',
		['abbreviation'] = 'ስነ ኮኾባዊ ኣሃዱ',
		['conversionSI'] = { 149597870691, 'Q11573'}, -- 1 ስነ ኮኾባዊ ኣሃዱ = 149 597 870 691 ሜተር
		['unit SI'] = true,
	},
	['Q12129'] = {
		['label']    = 'ፓርሰክ',
		['abbreviation'] = 'ፓርሰክ',
		['conversionSI'] = {30856775814913672.7891393795779647161073192116040917980140401922770232921869992968698321353388065559933270120238005882778325, 'Q11573'},
		['unit SI'] = true,
	},
	['Q531'] = {
		['label']    = 'ዓመት ብርሃን',
		--['abbreviation'] = 'mi',
		['plural']    = 'ዓመታት ብርሃን',		
		['conversionSI']  = {9460730472580800 , 'Q11573'}, -- 1 ዓመት ብርሃን = 9460730472580800  ሜተር
		['unit SI'] = true,
	},

	['Q93318'] = {
		['label']    = 'ማይል ባሕሪ',
		--['abbreviation'] = 'mi',
		['conversionSI']  = {1852 , 'Q11573'}, -- 1 ማይል ባሕሪ = 1852  ሜተር
		--['unit SI'] = true,
	},

	['Q253276'] = {
		['label']    = 'ማይል',
		['abbreviation'] = 'ማይል',
		['conversionSI']  = {1609.344, 'Q11573'} -- 1 ማይል = 1609,344 ሜተር
	},
	['Q828224'] = {
		['label']    = 'ኪሎሜተር',
		['abbreviation'] = 'ኪ.ሜ.',
		['conversionSI'] = { 1000, 'Q11573'}, -- 1 ኪሎሜተር = 1000 ሜተር	
		['unit SI'] = true,
	},
	['Q3710'] = {
		['label']    = 'ጫማ',
		--['abbreviation'] = 'ft',
		['conversionSI']  = {0.3048006, 'Q11573'}, -- 1 ጫማ = 0,3048006 ሜተር
		['link']    = 'ጫማ (ኣሃዱ)',
	},
	['Q218593'] = {
		['label']    = 'ኢንች',
		--['abbreviation'] = 'in',
		['conversionSI']  = {0.0254, 'Q11573'} -- 1 ኢንች = 0,0254 ሜተር
	},
	['Q174728'] = {
		['label']    = 'ሰንቲሜተር',
		['abbreviation'] = 'ሰንቲሜተር',
		['conversionSI']  = {0.01, 'Q11573'}, -- 1 ሰንቲሜተር = 0.01 ሜተር
		['unit SI'] = true,
	},
	['Q174789'] = {
		['label']    = 'ሚሊሜተር',
		['abbreviation'] = 'ሚሊሜተር',
		['conversionSI']  = {0.001, 'Q11573'}, -- 1 ሚሊሜተር = 0.001 ሜተር
		['unit SI'] = true,		
	},
	['Q175821'] = {
		['label']    = 'ማይክሮሜተር',
		['abbreviation'] = 'ማይክሮሜተር',
		['conversionSI']  = {0.000001, 'Q11573'}, -- 1 ማይክሮሜተር = 0.000001 ሜተር
		['unit SI'] = true,		
	},
	['Q178674'] = {
		['label']    = 'ናኖሜተር',
		['abbreviation'] = 'ናኖሜተር',
		['conversionSI']  = {0.000000001, 'Q11573'}, -- 1 ናኖሜተር = 0,000000001 ሜተር
		['unit SI'] = true,		
	},
    -- Mass units
	['Q11570'] = {
		['label']    = 'ኪሎግራም',
		['abbreviation'] = 'ኪሎግራም',
		--['unit change'] = {
		--	{'Q828224', 1000, '>'}, -- ኪሎግራም
		--},
		['unit SI'] = true,
	},
}

local function formatMagnitude(amount, unit, options)
	if not unitConversion and unit['unit change'] then
		for k, v in pairs( unit['unit change'] ) do
			if amount >= v[2] then
				return formatMagnitude(amount / v[2], units[v[1]], options)
			end
		end
	end
	
	--if true then return require('Module:Tables').tostring(options) end
	
	local precision = options['precision'] or 2
	
	unit.link = unit.link or unit.label

	--if true then return require('Module:Tables').tostring(options) end
	
	-- Round to two decimal places, format and add the linked unit if applicable
	if unit.abbreviation then
		return ti:formatNum(round(amount, precision)) .. ' ' .. toLink(unit.link, unit.abbreviation, nil, options)		
	elseif amount == 1 or not unit.plural then
		return ti:formatNum(round(amount, precision)) .. ' ' .. toLink(unit.link, unit.label, nil, options)
	else
		return ti:formatNum(round(amount, precision)) .. ' ' .. toLink(unit.link, unit.plural, nil, options)
	end
end

function p.showValue(value, originalUnit, options)
	if not value then
		return
	end
	
	if not originalUnit then
		return value
	end
	
	options = options or {}
	
	--if true then return value end
	
	local originalUnitData = units[originalUnit]
	
	if not originalUnitData then
		originalUnitData = {}
		local entity = mw.wikibase.getEntityObject(originalUnit)
		--if true then return require('Module:Tables').tostring(entity) end
		originalUnitData.label = tableElement(entity, 'labels', 'ti', 'value')
		originalUnitData.link   = tableElement(entity, 'sitelinks', 'tiwiki', 'title')
		originalUnitData.conversionSI = {
			   [1]=tonumber((tableElement(entity,'claims','P2370',1,'mainsnak','datavalue','value','amount'):gsub('+','') or ''))
			 , [2]=tableElement(entity,'claims','P2370',1,'mainsnak','datavalue','value','unit'):gsub('^.-/(Q%d+)$', '%1')
		}
		
		--if true then return require('Module:Tables').tostring(originalUnitData) end
	end
	
	--if true then return require('Module:Tables').tostring(options) end
	
	local conversionSI = originalUnitData.conversionSI
	
	if options.unitConversion and options.unitConversion ~= '' then
	elseif not conversionSI then
		return formatMagnitude(tonumber(value), originalUnitData, options)
	elseif conversionSI and originalUnitData['unit SI'] then
		return formatMagnitude(tonumber(value) * conversionSI[1], units[conversionSI[2]], options)
	else
		return formatMagnitude(tonumber(value), originalUnitData, options) .. 
		' (' .. formatMagnitude(tonumber(value) * conversionSI[1], units[conversionSI[2]], options) .. ')'		
	end
	
end
	
function p.show(frame)
	local args = frame.args
	
	return p.showValue(args[1], args[2], {unitConversion=args[3], ['precision']=args[4], disp=args.disp,link=args.link})
end

return p