Module:Sandbox/Jackmcbarn: Difference between revisions
Appearance
Content deleted Content added
Jackmcbarn (talk | contribs) basic tests |
Jackmcbarn (talk | contribs) rm tables |
||
Line 28: | Line 28: | ||
args.from = {} |
args.from = {} |
||
for k,v in pairs(args.to) do |
for k,v in pairs(args.to) do |
||
args.from[v] = k |
|||
for _,v2 in ipairs(v) do |
|||
args.from[v2] = k |
|||
end |
|||
else |
|||
args.from[v] = k |
|||
end |
|||
end |
end |
||
end |
end |
||
Line 41: | Line 35: | ||
function mt.__index(t, k) |
function mt.__index(t, k) |
||
if type(k) == 'string' then |
if type(k) == 'string' then |
||
local |
local retval = args.src[args.to[k]] |
||
if type(to) == 'table' then |
|||
for _,v in ipairs(to) do |
|||
local retval = args.src[v] |
|||
if retval ~= nil then |
|||
return retval |
|||
end |
|||
end |
|||
end |
|||
local retval = args.src[to] |
|||
if retval ~= nil or args.from[k] ~= nil then |
if retval ~= nil or args.from[k] ~= nil then |
||
return retval |
return retval |
||
Line 64: | Line 49: | ||
local to = args.to[k] |
local to = args.to[k] |
||
local falseCognate = args.from[k] ~= nil |
local falseCognate = args.from[k] ~= nil |
||
if |
if to ~= nil then |
||
if v == nil and not falseCognate then |
|||
args.src[k] = nil |
|||
end |
|||
for k2,v2 in ipairs(to) do |
|||
if k2 == 1 then |
|||
args.src[v2] = v |
|||
elseif v == nil then |
|||
args.src[v2] = nil |
|||
end |
|||
end |
|||
elseif to ~= nil then |
|||
if v == nil and not falseCognate then |
if v == nil and not falseCognate then |
||
args.src[k] = nil |
args.src[k] = nil |
||
Line 99: | Line 73: | ||
function p.main(frame) |
function p.main(frame) |
||
local args = { |
local args = { |
||
uno = '#FF0000', |
|||
eins = '#ff0000', |
eins = '#ff0000', |
||
dos = '#FF8000', |
|||
zwei = '#ff7f00', |
zwei = '#ff7f00', |
||
tres = '#ffff00', |
|||
drei = '#FFFF00', |
drei = '#FFFF00', |
||
three = 'yellow' |
three = 'yellow' |
||
} |
} |
||
local to = { |
local to = { |
||
one = ' |
one = 'eins', |
||
two = |
two = 'zwei', |
||
three = 'drei' |
three = 'drei' |
||
} |
} |
Revision as of 03:42, 21 July 2015
table
local translationwrapper = {}
local function translatenext(invariant)
local k, v = next(invariant.args.src, invariant.k)
invariant.k = k
if k == nil then
return nil
elseif type(k) ~= 'string' then
return k, v
end
local from = invariant.args.from[k]
if from ~= nil then
return from, v
elseif invariant.args.to[k] == nil then
return k, v
else
-- skip this key. tail call
return translatenext(invariant)
end
end
function translationwrapper.create(args)
-- args.to contains English keys and translated values
-- if the value is a table, any of that table's values are valid translations
-- args.from contains translated keys and English values
-- optional if args.to doesn't rely on __index
-- args.src is the table being wrapped
if not args.from then
args.from = {}
for k,v in pairs(args.to) do
args.from[v] = k
end
end
local mt = {}
function mt.__index(t, k)
if type(k) == 'string' then
local retval = args.src[args.to[k]]
if retval ~= nil or args.from[k] ~= nil then
return retval
end
end
return args.src[k]
end
function mt.__newindex(t, k, v)
if type(k) ~= 'string' then
args.src[k] = v
return
end
local to = args.to[k]
local falseCognate = args.from[k] ~= nil
if to ~= nil then
if v == nil and not falseCognate then
args.src[k] = nil
end
args.src[to] = v
elseif not falseCognate then
args.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, {args = args}
end
function mt.__ipairs(t)
return ipairs(args.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 = translationwrapper.create{src = args, to = to}
return wrapper
end
return p