Jump to content

Module:Sandbox/Jackmcbarn: Difference between revisions

From Wikipedia, the free encyclopedia
Content deleted Content added
Jackmcbarn (talk | contribs)
rm tables
Jackmcbarn (talk | contribs)
simplify
Line 1: Line 1:
local translationwrapper = {}

local function translatenext(invariant)
local function translatenext(invariant)
local k, v = next(invariant.args.src, invariant.k)
local k, v = next(invariant.src, invariant.k)
invariant.k = k
invariant.k = k
if k == nil then
if k == nil then
Line 9: Line 7:
return k, v
return k, v
end
end
local from = invariant.args.from[k]
local from = invariant.from[k]
if from ~= nil then
if from ~= nil then
return from, v
return from, v
elseif invariant.args.to[k] == nil then
elseif invariant.to[k] == nil then
return k, v
return k, v
else
else
Line 19: Line 17:
end
end
end
end
local function translate(src, to, from)
function translationwrapper.create(args)
-- args.to contains English keys and translated values
-- to contains English keys and translated values
-- if the value is a table, any of that table's values are valid translations
-- if the value is a table, any of that table's values are valid translations
-- args.from contains translated keys and English values
-- from contains translated keys and English values
-- optional if args.to doesn't rely on __index
-- optional if to doesn't rely on __index
-- args.src is the table being wrapped
-- src is the table being wrapped
if not args.from then
if not from then
args.from = {}
from = {}
for k,v in pairs(args.to) do
for k,v in pairs(to) do
args.from[v] = k
from[v] = k
end
end
end
end
Line 35: Line 33:
function mt.__index(t, k)
function mt.__index(t, k)
if type(k) == 'string' then
if type(k) == 'string' then
local retval = args.src[args.to[k]]
local retval = src[to[k]]
if retval ~= nil or args.from[k] ~= nil then
if retval ~= nil or from[k] ~= nil then
return retval
return retval
end
end
end
end
return args.src[k]
return src[k]
end
end
function mt.__newindex(t, k, v)
function mt.__newindex(t, k, v)
if type(k) ~= 'string' then
if type(k) ~= 'string' then
args.src[k] = v
src[k] = v
return
return
end
end
local to = args.to[k]
local to = to[k]
local falseCognate = args.from[k] ~= nil
local falseCognate = from[k] ~= nil
if to ~= nil then
if to ~= nil then
if v == nil and not falseCognate then
if v == nil and not falseCognate then
args.src[k] = nil
src[k] = nil
end
end
args.src[to] = v
src[to] = v
elseif not falseCognate then
elseif not falseCognate then
args.src[k] = v
src[k] = v
else
else
error('Attempt to write key "' .. k .. '" which has no translation and is a false cognate', 2)
error('Attempt to write key "' .. k .. '" which has no translation and is a false cognate', 2)
Line 61: Line 59:
end
end
function mt.__pairs(t)
function mt.__pairs(t)
return translatenext, {args = args}
return translatenext, {src = src, to = to, from = from}
end
end
function mt.__ipairs(t)
function mt.__ipairs(t)
return ipairs(args.src)
return ipairs(src)
end
end
return setmetatable({}, mt)
return setmetatable({}, mt)
Line 83: Line 81:
three = 'drei'
three = 'drei'
}
}
local wrapper = translationwrapper.create{src = args, to = to}
local wrapper = translate(args, to)
return wrapper
return wrapper
end
end

Revision as of 03:49, 21 July 2015

local function translatenext(invariant)
	local k, v = next(invariant.src, invariant.k)
	invariant.k = k
	if k == nil then
		return nil
	elseif type(k) ~= 'string' then
		return k, v
	end
	local from = invariant.from[k]
	if from ~= nil then
		return from, v
	elseif invariant.to[k] == nil then
		return k, v
	else
		-- skip this key. tail call
		return translatenext(invariant)
	end
end
local function translate(src, to, from)
	-- to contains English keys and translated values
	-- if the value is a table, any of that table's values are valid translations
	-- from contains translated keys and English values
	-- optional if to doesn't rely on __index
	-- src is the table being wrapped
	if not from then
		from = {}
		for k,v in pairs(to) do
			from[v] = k
		end
	end

	local mt = {}
	function mt.__index(t, k)
		if type(k) == 'string' then
			local retval = src[to[k]]
			if retval ~= nil or from[k] ~= nil then
				return retval
			end
		end
		return src[k]
	end
	function mt.__newindex(t, k, v)
		if type(k) ~= 'string' then
			src[k] = v
			return
		end
		local to = to[k]
		local falseCognate = from[k] ~= nil
		if to ~= nil then
			if v == nil and not falseCognate then
				src[k] = nil
			end
			src[to] = v
		elseif not falseCognate then
			src[k] = v
		else
			error('Attempt to write key "' .. k .. '" which has no translation and is a false cognate', 2)
		end
	end
	function mt.__pairs(t)
		return translatenext, {src = src, to = to, from = from}
	end
	function mt.__ipairs(t)
		return ipairs(src)
	end
	return setmetatable({}, mt)
end

local p = {}

function p.main(frame)
	local args = {
		eins = '#ff0000',
		zwei = '#ff7f00',
		drei = '#FFFF00',
		three = 'yellow'
	}
	local to = {
		one = 'eins',
		two = 'zwei',
		three = 'drei'
	}
	local wrapper = translate(args, to)
	return wrapper
end

return p