mic_none

Module:Sandbox/Johnuniq/unit Source: en.wikipedia.org/wiki/Module:Sandbox/Johnuniq/unit

-- Test the helper function in Module:Convert to get unit information.
-- Usage: {{#invoke:sandbox/Johnuniq/unit|main}}
-- See [[Module talk:Sandbox/Johnuniq/unit]].

local function collection()
	-- Return a table to hold items.
	return {
		n = 0,
		add = function (self, item)
			self.n = self.n + 1
			self[self.n] = item
		end,
		join = function (self, sep)
			return table.concat(self, sep)
		end,
	}
end

local tests = {
	-- unitcode value flags (L=link, N=name, U=us, S=sort)
	'kg',
	'kg 12.3 L',
	'm',
	'm -1 S',
	'm 12 L S',
	'km L',
	'ft 99 L',
	'km3 L',
	'km3 12.3 N',
	'km3 12.3 L N',
	'km3 12.3 L N U',
	'km3 12.3 L N U S',
	'foo',
	'foo L S',
}

local function make_args(text)
	local flags = { L='link', N='name', U='us', S='sort' }
	local unitcode, options
	local show = collection()
	show:add('unit(')
	for item in text:gmatch('%S+') do
		if unitcode then
			local k, v
			k = flags[item]
			if k then
				if item == 'S' then
					v = 'on'
				else
					v = 'true'
				end
			else
				k = 'value'
				v = tonumber(item)
			end
			if options then
				show:add(', ')
			else
				options = {}
				show:add(', {')
			end
			options[k] = v
			show:add(k .. '=' .. v)
		else
			unitcode = item
			show:add("'" .. item .. "'")
		end
	end
	if options then
		show:add('}')
	end
	show:add(')')
	return unitcode, options, show:join()
end

local function main(frame)
	local get_unit = require('Module:Convert/sandbox')._unit
	local results = collection()
	for _, item in ipairs(tests) do
		local unitcode, options, show = make_args(item)
		local unit = get_unit(unitcode, options)
		results:add('')
		results:add('> ' .. show)
		results:add(string.format('%40s %9s %s',
			unit.text,
			unit.unknown and '(unknown)' or '',
			unit.sortspan or ''
		))
	end
	return '<pre>\n' .. mw.text.nowiki(results:join('\n')) .. '\n</pre>\n'
end

return { main = main }