Edge Rewrite
// HTMLRewriter · presentation

This page was redesigned at the edge.

Cloudflare fetched the original article and streamed it through HTMLRewriter to apply an entirely new visual system without rebuilding the source page.

Jump to content

Module:Sandbox/Johnuniq/unit

From Wikipedia, the free encyclopedia
-- 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 }